@sapui5/sap.fe.base 1.129.1 → 1.130.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/package.json +1 -1
- package/src/sap/fe/base/.library +1 -1
- package/src/sap/fe/base/BindingToolkit.js +16 -2
- package/src/sap/fe/base/BindingToolkit.ts +23 -0
- package/src/sap/fe/base/ClassSupport.js +71 -71
- package/src/sap/fe/base/ClassSupport.ts +72 -64
- package/src/sap/fe/base/EventDelegateHook.js +68 -0
- package/src/sap/fe/base/EventDelegateHook.ts +45 -0
- package/src/sap/fe/base/jsx-runtime/jsx-control.js +19 -4
- package/src/sap/fe/base/jsx-runtime/jsx-control.ts +22 -5
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.js +7 -2
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.ts +6 -1
- package/src/sap/fe/base/library.js +1 -1
|
@@ -6,7 +6,6 @@ import { hookable } from "sap/fe/base/HookSupport";
|
|
|
6
6
|
import type { Ref } from "sap/fe/base/jsx-runtime/jsx";
|
|
7
7
|
import type UI5Event from "sap/ui/base/Event";
|
|
8
8
|
import type ManagedObject from "sap/ui/base/ManagedObject";
|
|
9
|
-
import type { AggregationBindingInfo } from "sap/ui/base/ManagedObject";
|
|
10
9
|
import Metadata from "sap/ui/base/Metadata";
|
|
11
10
|
import BaseObject from "sap/ui/base/Object";
|
|
12
11
|
import type Control from "sap/ui/core/Control";
|
|
@@ -37,6 +36,7 @@ type UI5PropertyMetadata = {
|
|
|
37
36
|
expectedAnnotations?: string[];
|
|
38
37
|
expectedTypes?: string[];
|
|
39
38
|
allowedValues?: string[];
|
|
39
|
+
visibility?: string;
|
|
40
40
|
};
|
|
41
41
|
export type UI5AggregationMetadata = {
|
|
42
42
|
type: string;
|
|
@@ -216,30 +216,19 @@ const ensureGetAPI = function (target: UI5APIControl): void {
|
|
|
216
216
|
}
|
|
217
217
|
};
|
|
218
218
|
|
|
219
|
+
type ExtendWithObject<T, K> = T extends object ? K & { [TKey in keyof T]?: BindingInfoHolder<T[TKey]> } : K;
|
|
220
|
+
|
|
219
221
|
export type StateOf<T> = {
|
|
220
|
-
[K in keyof T]: T[K] extends Array<infer U>
|
|
222
|
+
[K in keyof T]: T[K] extends Array<infer U> | ReadonlyArray<infer U> ? ExtendWithObject<U, ReadonlyArray<U>> : T[K];
|
|
221
223
|
};
|
|
222
|
-
export type BindingInfoHolder = {
|
|
224
|
+
export type BindingInfoHolder<T> = T & {
|
|
223
225
|
__bindingInfo: {
|
|
224
226
|
path: string;
|
|
225
227
|
model: string;
|
|
228
|
+
type: T;
|
|
226
229
|
};
|
|
227
230
|
};
|
|
228
231
|
|
|
229
|
-
/**
|
|
230
|
-
* Creates the binding info for an array property coming from the state.
|
|
231
|
-
* @param stateProperty
|
|
232
|
-
* @returns The aggregation binding info
|
|
233
|
-
*/
|
|
234
|
-
export function bindStateArray(stateProperty: readonly object[]): AggregationBindingInfo | undefined {
|
|
235
|
-
if ((stateProperty as unknown as BindingInfoHolder).__bindingInfo !== undefined) {
|
|
236
|
-
return {
|
|
237
|
-
path: (stateProperty as unknown as BindingInfoHolder).__bindingInfo.path,
|
|
238
|
-
model: (stateProperty as unknown as BindingInfoHolder).__bindingInfo.model
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
232
|
/**
|
|
244
233
|
* Allows to define a property that will hold the control state.
|
|
245
234
|
*
|
|
@@ -553,23 +542,77 @@ export function defineReference(): PropertyDecorator {
|
|
|
553
542
|
} as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
|
|
554
543
|
}
|
|
555
544
|
|
|
545
|
+
function _getHandlerForStateProperty(jsonModel: JSONModel, prop: string): unknown {
|
|
546
|
+
const pathInModel = `/${prop.toString()}`;
|
|
547
|
+
const oObj = deepClone(jsonModel.getObject(pathInModel));
|
|
548
|
+
let oTarget;
|
|
549
|
+
if (typeof oObj === "string") {
|
|
550
|
+
oTarget = { value: oObj };
|
|
551
|
+
oTarget.toString = function (): string {
|
|
552
|
+
return this.value;
|
|
553
|
+
};
|
|
554
|
+
} else if (typeof oObj === "number") {
|
|
555
|
+
oTarget = { value: oObj };
|
|
556
|
+
oTarget.toString = function (): string {
|
|
557
|
+
return this.value.toString();
|
|
558
|
+
};
|
|
559
|
+
} else if (typeof oObj === "boolean") {
|
|
560
|
+
oTarget = new Boolean(oObj);
|
|
561
|
+
} else if (Array.isArray(oObj)) {
|
|
562
|
+
oTarget = new Proxy(oObj, {
|
|
563
|
+
get(target: unknown[], p: string | symbol, receiver: unknown[]): unknown {
|
|
564
|
+
const ref = Reflect.get(target, p, receiver);
|
|
565
|
+
if (typeof ref === "function") {
|
|
566
|
+
return ref.bind(target);
|
|
567
|
+
} else if (ref === undefined && isNaN(Number(p.toString()))) {
|
|
568
|
+
return {
|
|
569
|
+
__bindingInfo: {
|
|
570
|
+
model: "$componentState",
|
|
571
|
+
path: p
|
|
572
|
+
}
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
return ref;
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
} else {
|
|
579
|
+
oTarget = { ...oObj };
|
|
580
|
+
}
|
|
581
|
+
oTarget.__bindingInfo = {
|
|
582
|
+
model: "$componentState",
|
|
583
|
+
path: pathInModel
|
|
584
|
+
};
|
|
585
|
+
return oTarget;
|
|
586
|
+
}
|
|
587
|
+
|
|
556
588
|
function _createStateProperty(
|
|
557
589
|
obj: UI5ControlDefinition,
|
|
558
|
-
targetControl: Control & {
|
|
590
|
+
targetControl: Control & {
|
|
591
|
+
_updateState: Function;
|
|
592
|
+
_updateStateDebounced: Function;
|
|
593
|
+
_updateStateTimer: unknown;
|
|
594
|
+
_changedProps?: string[];
|
|
595
|
+
}
|
|
559
596
|
): void {
|
|
560
597
|
if (obj.metadata?.stateProperty) {
|
|
561
598
|
const stateModel = new JSONModel({});
|
|
562
599
|
targetControl.setModel(stateModel, "$componentState");
|
|
563
600
|
let updatingState = false;
|
|
564
|
-
|
|
601
|
+
// This method can be used to force the state to be applied and wait for it to be applied in tests
|
|
602
|
+
targetControl._updateState = async function (): Promise<void> {
|
|
565
603
|
delete this._updateStateTimer;
|
|
566
604
|
if (!updatingState) {
|
|
567
605
|
updatingState = true;
|
|
568
|
-
(this as { onStateChange?: Function }).onStateChange?.();
|
|
606
|
+
await (this as { onStateChange?: Function }).onStateChange?.(this._changedProps);
|
|
607
|
+
this._changedProps = [];
|
|
569
608
|
updatingState = false;
|
|
570
609
|
}
|
|
571
610
|
};
|
|
572
|
-
targetControl._updateStateDebounced = function (): void {
|
|
611
|
+
targetControl._updateStateDebounced = function (changedProp: string): void {
|
|
612
|
+
this._changedProps ??= [];
|
|
613
|
+
if (!this._changedProps.includes(changedProp)) {
|
|
614
|
+
this._changedProps.push(changedProp);
|
|
615
|
+
}
|
|
573
616
|
if (!this._updateStateTimer && !updatingState) {
|
|
574
617
|
this._updateStateTimer = setTimeout(() => {
|
|
575
618
|
this._updateState();
|
|
@@ -580,51 +623,12 @@ function _createStateProperty(
|
|
|
580
623
|
configurable: true,
|
|
581
624
|
get: () => {
|
|
582
625
|
return new Proxy(stateModel, {
|
|
583
|
-
get:
|
|
584
|
-
|
|
585
|
-
const oObj = deepClone(jsonModel.getObject(pathInModel));
|
|
586
|
-
let oTarget;
|
|
587
|
-
if (typeof oObj === "string") {
|
|
588
|
-
oTarget = { value: oObj };
|
|
589
|
-
oTarget.toString = function (): string {
|
|
590
|
-
return this.value;
|
|
591
|
-
};
|
|
592
|
-
} else if (typeof oObj === "number") {
|
|
593
|
-
oTarget = { value: oObj };
|
|
594
|
-
oTarget.toString = function (): string {
|
|
595
|
-
return this.value.toString();
|
|
596
|
-
};
|
|
597
|
-
} else if (typeof oObj === "boolean") {
|
|
598
|
-
oTarget = new Boolean(oObj);
|
|
599
|
-
} else if (Array.isArray(oObj)) {
|
|
600
|
-
oTarget = new Proxy(oObj.concat(), {
|
|
601
|
-
get(target: unknown[], p: string | symbol, receiver: unknown[]): unknown {
|
|
602
|
-
const ref = Reflect.get(target, p, receiver);
|
|
603
|
-
if (typeof ref === "function") {
|
|
604
|
-
return ref.bind(target);
|
|
605
|
-
} else if (ref === undefined && isNaN(Number(p.toString()))) {
|
|
606
|
-
return {
|
|
607
|
-
__bindingInfo: {
|
|
608
|
-
model: "$componentState",
|
|
609
|
-
path: p
|
|
610
|
-
}
|
|
611
|
-
};
|
|
612
|
-
}
|
|
613
|
-
return ref;
|
|
614
|
-
}
|
|
615
|
-
});
|
|
616
|
-
} else {
|
|
617
|
-
oTarget = { ...oObj };
|
|
618
|
-
}
|
|
619
|
-
oTarget.__bindingInfo = {
|
|
620
|
-
model: "$componentState",
|
|
621
|
-
path: pathInModel
|
|
622
|
-
};
|
|
623
|
-
return oTarget;
|
|
626
|
+
get: (target: JSONModel, prop: string): unknown => {
|
|
627
|
+
return _getHandlerForStateProperty(target, prop);
|
|
624
628
|
},
|
|
625
629
|
set: (setStateModel: JSONModel, prop, value): boolean => {
|
|
626
630
|
const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
|
|
627
|
-
targetControl._updateStateDebounced();
|
|
631
|
+
targetControl._updateStateDebounced(prop.toString());
|
|
628
632
|
return setResult;
|
|
629
633
|
}
|
|
630
634
|
});
|
|
@@ -635,7 +639,7 @@ function _createStateProperty(
|
|
|
635
639
|
}
|
|
636
640
|
});
|
|
637
641
|
if (obj.metadata.statePropertyDefaultValue) {
|
|
638
|
-
targetControl[obj.metadata.stateProperty as keyof Control] = obj.metadata.statePropertyDefaultValue as never;
|
|
642
|
+
targetControl[obj.metadata.stateProperty as keyof Control] = { ...obj.metadata.statePropertyDefaultValue } as never;
|
|
639
643
|
}
|
|
640
644
|
}
|
|
641
645
|
}
|
|
@@ -690,6 +694,7 @@ function registerUI5Metadata(clazz: UI5ControlAndMore, name: string, inObj: UI5C
|
|
|
690
694
|
}
|
|
691
695
|
const output = clazz.extend(name, obj) as typeof Control & Function;
|
|
692
696
|
const fnInit = output.prototype.init;
|
|
697
|
+
const fnAfterInit = output.prototype.afterInit;
|
|
693
698
|
output.prototype.init = function (...args: unknown[]): void {
|
|
694
699
|
if (fnInit) {
|
|
695
700
|
fnInit.apply(this, args);
|
|
@@ -831,6 +836,9 @@ function registerUI5Metadata(clazz: UI5ControlAndMore, name: string, inObj: UI5C
|
|
|
831
836
|
}
|
|
832
837
|
}
|
|
833
838
|
_createStateProperty(obj, this);
|
|
839
|
+
if (fnAfterInit) {
|
|
840
|
+
fnAfterInit.apply(this, args);
|
|
841
|
+
}
|
|
834
842
|
};
|
|
835
843
|
|
|
836
844
|
clazz.override = function (oExtension: unknown): Function {
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/core/Element"], function (ClassSupport, Element) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2;
|
|
9
|
+
var _exports = {};
|
|
10
|
+
var property = ClassSupport.property;
|
|
11
|
+
var event = ClassSupport.event;
|
|
12
|
+
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
13
|
+
function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
|
|
14
|
+
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
|
15
|
+
function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
|
|
16
|
+
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
|
|
17
|
+
function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
|
|
18
|
+
function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
|
|
19
|
+
/**
|
|
20
|
+
* Create an event delegate hook on the parent of this control to deal with event propagation.
|
|
21
|
+
*
|
|
22
|
+
* This is a specific solution for the Avatar control case where the press cannot be interrupted and which then ends up interacting with control behind it.
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
let EventDelegateHook = (_dec = defineUI5Class("sap.fe.base.EventDelegateHook"), _dec2 = property({
|
|
26
|
+
type: "boolean"
|
|
27
|
+
}), _dec3 = event(), _dec(_class = (_class2 = /*#__PURE__*/function (_Element) {
|
|
28
|
+
_inheritsLoose(EventDelegateHook, _Element);
|
|
29
|
+
function EventDelegateHook(idOrSettings, settings) {
|
|
30
|
+
var _this;
|
|
31
|
+
_this = _Element.call(this, idOrSettings, settings) || this;
|
|
32
|
+
_initializerDefineProperty(_this, "stopTapPropagation", _descriptor, _assertThisInitialized(_this));
|
|
33
|
+
_initializerDefineProperty(_this, "tap", _descriptor2, _assertThisInitialized(_this));
|
|
34
|
+
return _this;
|
|
35
|
+
}
|
|
36
|
+
_exports = EventDelegateHook;
|
|
37
|
+
var _proto = EventDelegateHook.prototype;
|
|
38
|
+
_proto.setParent = function setParent(parentObject) {
|
|
39
|
+
if (this.getParent()) {
|
|
40
|
+
this.getParent().removeEventDelegate(this);
|
|
41
|
+
}
|
|
42
|
+
parentObject.addEventDelegate(this);
|
|
43
|
+
_Element.prototype.setParent.call(this, parentObject);
|
|
44
|
+
};
|
|
45
|
+
_proto.ontap = function ontap(tapEvent) {
|
|
46
|
+
if (this.stopTapPropagation) {
|
|
47
|
+
tapEvent.stopPropagation();
|
|
48
|
+
}
|
|
49
|
+
this.fireEvent("tap");
|
|
50
|
+
};
|
|
51
|
+
return EventDelegateHook;
|
|
52
|
+
}(Element), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "stopTapPropagation", [_dec2], {
|
|
53
|
+
configurable: true,
|
|
54
|
+
enumerable: true,
|
|
55
|
+
writable: true,
|
|
56
|
+
initializer: function () {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "tap", [_dec3], {
|
|
60
|
+
configurable: true,
|
|
61
|
+
enumerable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
initializer: null
|
|
64
|
+
})), _class2)) || _class);
|
|
65
|
+
_exports = EventDelegateHook;
|
|
66
|
+
return _exports;
|
|
67
|
+
}, false);
|
|
68
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudERlbGVnYXRlSG9vayIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwicHJvcGVydHkiLCJ0eXBlIiwiX2RlYzMiLCJldmVudCIsIl9jbGFzcyIsIl9jbGFzczIiLCJfRWxlbWVudCIsIl9pbmhlcml0c0xvb3NlIiwiaWRPclNldHRpbmdzIiwic2V0dGluZ3MiLCJfdGhpcyIsImNhbGwiLCJfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSIsIl9kZXNjcmlwdG9yIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIl9kZXNjcmlwdG9yMiIsIl9leHBvcnRzIiwiX3Byb3RvIiwicHJvdG90eXBlIiwic2V0UGFyZW50IiwicGFyZW50T2JqZWN0IiwiZ2V0UGFyZW50IiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJvbnRhcCIsInRhcEV2ZW50Iiwic3RvcFRhcFByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiZmlyZUV2ZW50IiwiRWxlbWVudCIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRXZlbnREZWxlZ2F0ZUhvb2sudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXZlbnQsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyAkRWxlbWVudFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSB7IEV2ZW50SGFuZGxlciB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYW4gZXZlbnQgZGVsZWdhdGUgaG9vayBvbiB0aGUgcGFyZW50IG9mIHRoaXMgY29udHJvbCB0byBkZWFsIHdpdGggZXZlbnQgcHJvcGFnYXRpb24uXG4gKlxuICogVGhpcyBpcyBhIHNwZWNpZmljIHNvbHV0aW9uIGZvciB0aGUgQXZhdGFyIGNvbnRyb2wgY2FzZSB3aGVyZSB0aGUgcHJlc3MgY2Fubm90IGJlIGludGVycnVwdGVkIGFuZCB3aGljaCB0aGVuIGVuZHMgdXAgaW50ZXJhY3Rpbmcgd2l0aCBjb250cm9sIGJlaGluZCBpdC5cbiAqXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLkV2ZW50RGVsZWdhdGVIb29rXCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudERlbGVnYXRlSG9vayBleHRlbmRzIEVsZW1lbnQge1xuXHRAcHJvcGVydHkoeyB0eXBlOiBcImJvb2xlYW5cIiB9KVxuXHRzdG9wVGFwUHJvcGFnYXRpb24gPSBmYWxzZTtcblxuXHRAZXZlbnQoKVxuXHR0YXA/OiBFdmVudEhhbmRsZXI7XG5cblx0Y29uc3RydWN0b3IoaWRPclNldHRpbmdzPzogRXZlbnREZWxlZ2F0ZVNldHRpbmdzKTtcblxuXHRjb25zdHJ1Y3RvcihpZE9yU2V0dGluZ3M6IHN0cmluZywgc2V0dGluZ3M/OiBFdmVudERlbGVnYXRlU2V0dGluZ3MpO1xuXG5cdGNvbnN0cnVjdG9yKGlkT3JTZXR0aW5ncz86IHN0cmluZyB8IFByb3BlcnRpZXNPZjxFdmVudERlbGVnYXRlSG9vaz4sIHNldHRpbmdzPzogRXZlbnREZWxlZ2F0ZVNldHRpbmdzKSB7XG5cdFx0c3VwZXIoaWRPclNldHRpbmdzIGFzIHN0cmluZywgc2V0dGluZ3MpO1xuXHR9XG5cblx0c2V0UGFyZW50KHBhcmVudE9iamVjdDogRWxlbWVudCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmdldFBhcmVudCgpKSB7XG5cdFx0XHQodGhpcy5nZXRQYXJlbnQoKSBhcyBFbGVtZW50KS5yZW1vdmVFdmVudERlbGVnYXRlKHRoaXMpO1xuXHRcdH1cblx0XHRwYXJlbnRPYmplY3QuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzKTtcblx0XHRzdXBlci5zZXRQYXJlbnQocGFyZW50T2JqZWN0KTtcblx0fVxuXG5cdG9udGFwKHRhcEV2ZW50OiBKUXVlcnkuRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5zdG9wVGFwUHJvcGFnYXRpb24pIHtcblx0XHRcdHRhcEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0XHR0aGlzLmZpcmVFdmVudChcInRhcFwiKTtcblx0fVxufVxuXG50eXBlIEV2ZW50RGVsZWdhdGVTZXR0aW5ncyA9ICRFbGVtZW50U2V0dGluZ3MgJiBQcm9wZXJ0aWVzT2Y8RXZlbnREZWxlZ2F0ZUhvb2s+O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQSxJQU9xQkEsaUJBQWlCLElBQUFDLElBQUEsR0FEckNDLGNBQWMsQ0FBQywrQkFBK0IsQ0FBQyxFQUFBQyxLQUFBLEdBRTlDQyxRQUFRLENBQUM7SUFBRUMsSUFBSSxFQUFFO0VBQVUsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHN0JDLEtBQUssQ0FBQyxDQUFDLEVBQUFOLElBQUEsQ0FBQU8sTUFBQSxJQUFBQyxPQUFBLDBCQUFBQyxRQUFBO0lBQUFDLGNBQUEsQ0FBQVgsaUJBQUEsRUFBQVUsUUFBQTtJQU9SLFNBQUFWLGtCQUFZWSxZQUF1RCxFQUFFQyxRQUFnQyxFQUFFO01BQUEsSUFBQUMsS0FBQTtNQUN0R0EsS0FBQSxHQUFBSixRQUFBLENBQUFLLElBQUEsT0FBTUgsWUFBWSxFQUFZQyxRQUFRLENBQUM7TUFBQ0csMEJBQUEsQ0FBQUYsS0FBQSx3QkFBQUcsV0FBQSxFQUFBQyxzQkFBQSxDQUFBSixLQUFBO01BQUFFLDBCQUFBLENBQUFGLEtBQUEsU0FBQUssWUFBQSxFQUFBRCxzQkFBQSxDQUFBSixLQUFBO01BQUEsT0FBQUEsS0FBQTtJQUN6QztJQUFDTSxRQUFBLEdBQUFwQixpQkFBQTtJQUFBLElBQUFxQixNQUFBLEdBQUFyQixpQkFBQSxDQUFBc0IsU0FBQTtJQUFBRCxNQUFBLENBRURFLFNBQVMsR0FBVCxTQUFBQSxVQUFVQyxZQUFxQixFQUFRO01BQ3RDLElBQUksSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLElBQUksQ0FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBYUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO01BQ3hEO01BQ0FGLFlBQVksQ0FBQ0csZ0JBQWdCLENBQUMsSUFBSSxDQUFDO01BQ25DakIsUUFBQSxDQUFBWSxTQUFBLENBQU1DLFNBQVMsQ0FBQVIsSUFBQSxPQUFDUyxZQUFZO0lBQzdCLENBQUM7SUFBQUgsTUFBQSxDQUVETyxLQUFLLEdBQUwsU0FBQUEsTUFBTUMsUUFBc0IsRUFBUTtNQUNuQyxJQUFJLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7UUFDNUJELFFBQVEsQ0FBQ0UsZUFBZSxDQUFDLENBQUM7TUFDM0I7TUFDQSxJQUFJLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUFBLE9BQUFoQyxpQkFBQTtFQUFBLEVBNUI2Q2lDLE9BQU8sSUFBQWhCLFdBQUEsR0FBQWlCLHlCQUFBLENBQUF6QixPQUFBLENBQUFhLFNBQUEseUJBQUFuQixLQUFBO0lBQUFnQyxZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBLFdBQUFBLENBQUE7TUFBQSxPQUVoQyxLQUFLO0lBQUE7RUFBQSxJQUFBbkIsWUFBQSxHQUFBZSx5QkFBQSxDQUFBekIsT0FBQSxDQUFBYSxTQUFBLFVBQUFoQixLQUFBO0lBQUE2QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsS0FBQTdCLE9BQUEsTUFBQUQsTUFBQTtFQUFBWSxRQUFBLEdBQUFwQixpQkFBQTtFQUFBLE9BQUFvQixRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { PropertiesOf } from "sap/fe/base/ClassSupport";
|
|
2
|
+
import { defineUI5Class, event, property } from "sap/fe/base/ClassSupport";
|
|
3
|
+
import type { $ElementSettings } from "sap/ui/core/Element";
|
|
4
|
+
import Element from "sap/ui/core/Element";
|
|
5
|
+
import type { EventHandler } from "types/extension_types";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Create an event delegate hook on the parent of this control to deal with event propagation.
|
|
9
|
+
*
|
|
10
|
+
* This is a specific solution for the Avatar control case where the press cannot be interrupted and which then ends up interacting with control behind it.
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
@defineUI5Class("sap.fe.base.EventDelegateHook")
|
|
14
|
+
export default class EventDelegateHook extends Element {
|
|
15
|
+
@property({ type: "boolean" })
|
|
16
|
+
stopTapPropagation = false;
|
|
17
|
+
|
|
18
|
+
@event()
|
|
19
|
+
tap?: EventHandler;
|
|
20
|
+
|
|
21
|
+
constructor(idOrSettings?: EventDelegateSettings);
|
|
22
|
+
|
|
23
|
+
constructor(idOrSettings: string, settings?: EventDelegateSettings);
|
|
24
|
+
|
|
25
|
+
constructor(idOrSettings?: string | PropertiesOf<EventDelegateHook>, settings?: EventDelegateSettings) {
|
|
26
|
+
super(idOrSettings as string, settings);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
setParent(parentObject: Element): void {
|
|
30
|
+
if (this.getParent()) {
|
|
31
|
+
(this.getParent() as Element).removeEventDelegate(this);
|
|
32
|
+
}
|
|
33
|
+
parentObject.addEventDelegate(this);
|
|
34
|
+
super.setParent(parentObject);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
ontap(tapEvent: JQuery.Event): void {
|
|
38
|
+
if (this.stopTapPropagation) {
|
|
39
|
+
tapEvent.stopPropagation();
|
|
40
|
+
}
|
|
41
|
+
this.fireEvent("tap");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type EventDelegateSettings = $ElementSettings & PropertiesOf<EventDelegateHook>;
|
|
@@ -6,6 +6,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var bindingParser = ManagedObject.bindingParser;
|
|
9
|
+
var isPathInModelExpression = BindingToolkit.isPathInModelExpression;
|
|
9
10
|
var isConstant = BindingToolkit.isConstant;
|
|
10
11
|
var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
|
|
11
12
|
var compileExpression = BindingToolkit.compileExpression;
|
|
@@ -80,12 +81,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
80
81
|
function processProperties(metadata, settings) {
|
|
81
82
|
let settingsKey;
|
|
82
83
|
const lateProperties = {};
|
|
84
|
+
const allEvents = metadata.getAllEvents();
|
|
85
|
+
const allProperties = metadata.getAllProperties();
|
|
83
86
|
for (settingsKey in settings) {
|
|
84
87
|
const value = settings[settingsKey];
|
|
85
88
|
if (isBindingToolkitExpression(value)) {
|
|
86
89
|
const bindingToolkitExpression = value;
|
|
87
90
|
if (isConstant(bindingToolkitExpression)) {
|
|
88
91
|
settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
|
|
92
|
+
} else if (!Object.hasOwnProperty.call(allProperties, settingsKey)) {
|
|
93
|
+
// Aggregation case - we need to compile the expression but as an object
|
|
94
|
+
if (isPathInModelExpression(bindingToolkitExpression)) {
|
|
95
|
+
settings[settingsKey] = {
|
|
96
|
+
path: bindingToolkitExpression.path,
|
|
97
|
+
model: bindingToolkitExpression.modelName
|
|
98
|
+
};
|
|
99
|
+
}
|
|
89
100
|
} else {
|
|
90
101
|
settings[settingsKey] = compileExpression(bindingToolkitExpression);
|
|
91
102
|
}
|
|
@@ -93,13 +104,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
93
104
|
lateProperties[settingsKey] = value;
|
|
94
105
|
delete settings[settingsKey];
|
|
95
106
|
} else if (typeof value === "string" && !value.startsWith("{")) {
|
|
96
|
-
var
|
|
97
|
-
const propertyType = (
|
|
107
|
+
var _allProperties$settin, _allProperties$settin2, _allProperties$settin3;
|
|
108
|
+
const propertyType = (_allProperties$settin = allProperties[settingsKey]) === null || _allProperties$settin === void 0 ? void 0 : (_allProperties$settin2 = (_allProperties$settin3 = _allProperties$settin).getType) === null || _allProperties$settin2 === void 0 ? void 0 : _allProperties$settin2.call(_allProperties$settin3);
|
|
98
109
|
if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
|
|
99
110
|
settings[settingsKey] = propertyType.parseValue(value);
|
|
100
111
|
}
|
|
101
112
|
} else if (typeof value === "object" && value.__bindingInfo) {
|
|
102
113
|
settings[settingsKey] = value.__bindingInfo;
|
|
114
|
+
} else if (value === undefined) {
|
|
115
|
+
if (Object.hasOwnProperty.call(allEvents, settingsKey)) {
|
|
116
|
+
delete settings[settingsKey];
|
|
117
|
+
}
|
|
103
118
|
}
|
|
104
119
|
}
|
|
105
120
|
return lateProperties;
|
|
@@ -137,6 +152,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
137
152
|
if (key !== undefined) {
|
|
138
153
|
settings["key"] = key;
|
|
139
154
|
}
|
|
155
|
+
const lateProperties = processProperties(metadata, settings);
|
|
140
156
|
processCommand(metadata, settings);
|
|
141
157
|
processAggregations(metadata, settings);
|
|
142
158
|
const classDef = settings.class;
|
|
@@ -149,7 +165,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
149
165
|
delete settings.binding;
|
|
150
166
|
delete settings[FL_DELEGATE];
|
|
151
167
|
delete settings[DT_DESIGNTIME];
|
|
152
|
-
const lateProperties = processProperties(metadata, settings);
|
|
153
168
|
const targetControlInstance = new ControlType(settings);
|
|
154
169
|
if (classDef) {
|
|
155
170
|
targetControlInstance.addStyleClass(classDef);
|
|
@@ -209,4 +224,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
|
|
|
209
224
|
};
|
|
210
225
|
return jsxControl;
|
|
211
226
|
}, false);
|
|
212
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsIl9pc0EiLCJfcmVmIiwiaXNBIiwiY2FsbCIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhdGgiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzUHJvcGVydGllcyIsInNldHRpbmdzIiwic2V0dGluZ3NLZXkiLCJsYXRlUHJvcGVydGllcyIsInZhbHVlIiwiaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJpc0NvbnN0YW50IiwiY29tcGlsZUNvbnN0YW50IiwiY29tcGlsZUV4cHJlc3Npb24iLCJ0aGVuIiwic3RhcnRzV2l0aCIsIl9tZXRhZGF0YSRnZXRBbGxQcm9wZSIsIl9tZXRhZGF0YSRnZXRBbGxQcm9wZTIiLCJfbWV0YWRhdGEkZ2V0QWxsUHJvcGUzIiwicHJvcGVydHlUeXBlIiwiZ2V0QWxsUHJvcGVydGllcyIsImdldFR5cGUiLCJEYXRhVHlwZSIsImluY2x1ZGVzIiwiZ2V0TmFtZSIsInBhcnNlVmFsdWUiLCJfX2JpbmRpbmdJbmZvIiwicHJvY2Vzc0NvbW1hbmQiLCJjb21tYW5kUHJvcGVydHkiLCJjb21tYW5kIiwiZXZlbnROYW1lIiwic3BsaXQiLCJldmVudCIsImdldEFsbEV2ZW50cyIsIm5hbWUiLCJFdmVudEhhbmRsZXJSZXNvbHZlciIsInJlc29sdmVFdmVudEhhbmRsZXIiLCJqc3hDb250cm9sIiwiQ29udHJvbFR5cGUiLCJrZXkiLCJqc3hDb250ZXh0IiwidGFyZ2V0Q29udHJvbCIsImlzRnJhZ21lbnQiLCJpc1J1bnRpbWUiLCJfcnVudGltZUJ1aWxkaW5nQmxvY2siLCJydW50aW1lQnVpbGRpbmdCbG9jayIsImdldENvbnRlbnQiLCJ2aWV3IiwiYXBwQ29tcG9uZW50IiwiY2xhc3NEZWYiLCJjbGFzcyIsInJlZkRlZiIsInJlZiIsImJpbmRpbmdEZWYiLCJiaW5kaW5nIiwiZmxEZWxlZ2F0ZSIsImR0RGVzaWdudGltZSIsInRhcmdldENvbnRyb2xJbnN0YW5jZSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRDdXJyZW50IiwiY3VzdG9tU2V0dGluZ3MiLCJkYXRhIiwiZGVsZWdhdGUiLCJkZXNpZ250aW1lIiwibGVuZ3RoIiwiYmluZGluZ0luZm8iLCJiaW5kaW5nUGFyc2VyIiwiYmluZEVsZW1lbnQiLCJtb2RlbCIsImJpbmRpbmdEZWZLZXkiLCJsYXRlUHJvcGVydGllc0tleSIsInNldFByb3BlcnR5IiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsImNvbnRyb2xUeXBlRm4iLCJUZXh0IiwidGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LWNvbnRyb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUNvbnN0YW50LCBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGlzQ29uc3RhbnQgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ0luZm9Ib2xkZXIsIE5vbkFic3RyYWN0Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2xQcm9wZXJ0aWVzLCBKU1hDb250ZXh0LCBOb25Db250cm9sUHJvcGVydGllcywgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZVwiO1xuaW1wb3J0IHR5cGUgUnVudGltZUJ1aWxkaW5nQmxvY2sgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvUnVudGltZUJ1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgRGF0YVR5cGUgZnJvbSBcInNhcC91aS9iYXNlL0RhdGFUeXBlXCI7XG5pbXBvcnQgeyBiaW5kaW5nUGFyc2VyIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3RNZXRhZGF0YSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdE1ldGFkYXRhXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEVsZW1lbnQsIGRlZmF1bHQgYXMgVUk1RWxlbWVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRXZlbnRIYW5kbGVyUmVzb2x2ZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9FdmVudEhhbmRsZXJSZXNvbHZlclwiO1xuXG5jb25zdCBGTF9ERUxFR0FURSA9IFwiZmw6ZGVsZWdhdGVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkPzogc3RyaW5nIHwgVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXVxuKTogdm9pZCB7XG5cdGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmIChpc0NoaWxkQW5FbGVtZW50KGNoaWxkKSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuXHRcdGNoaWxkLmZvckVhY2goKHN1YkNoaWxkKSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGFnZ3JlZ2F0aW9uTmFtZSwgc3ViQ2hpbGQpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gY2hpbGQ7XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goKGNoaWxkS2V5KSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGNoaWxkS2V5LCBjaGlsZFtjaGlsZEtleV0pO1xuXHRcdH0pO1xuXHR9XG59O1xuY29uc3QgaXNDaGlsZEFuRWxlbWVudCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHVua25vd24pOiBjaGlsZHJlbiBpcyBFbGVtZW50IHtcblx0cmV0dXJuIChjaGlsZHJlbiBhcyBFbGVtZW50KT8uaXNBPy4oXCJzYXAudWkuY29yZS5FbGVtZW50XCIpO1xufTtcbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB7XG5cdHJldHVybiAhIShjaGlsZHJlbiBhcyB0eXBlb2YgQ29udHJvbCk/LmdldE1ldGFkYXRhO1xufTtcblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgPSBtZXRhZGF0YS5nZXREZWZhdWx0QWdncmVnYXRpb25OYW1lKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPiA9IHt9O1xuXHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdKTtcblx0ZGVsZXRlIG1TZXR0aW5ncy5jaGlsZHJlbjtcblx0Ly8gZmluZCBvdXQgd2hpY2ggYWdncmVnYXRpb24gYXJlIGJvdW5kIChib3RoIGluIGNoaWxkcmVuIGFuZCBkaXJlY3RseSB1bmRlciBpdClcblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdHBhdGg6IG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgZmFjdG9yeTogRnVuY3Rpb24gfSkuZmFjdG9yeSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbk5hbWVcblx0XHRcdFx0XHRdIGFzIHVua25vd24gYXMgRnVuY3Rpb247XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgdGVtcGxhdGU6IHN0cmluZyB8IFVJNUVsZW1lbnQgfSkudGVtcGxhdGUgPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV1bMF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBwcm9wZXJ0aWVzLlxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhIGJpbmRpbmdUb29sa2l0IGV4cHJlc3Npb24gd2UgbmVlZCB0byBjb21waWxlIGl0LlxuICogRWxzZSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IGFzIHN0cmluZyAoY29tcGlsZWQgYmluZGluZyBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nIGJ5IGRlZmF1bHQgZXZlbiBpZiBpdCdzIGEgYm9vbGVhbiwgaW50LCBldGMuKSBhbmQgaXQgZG9lc24ndCBtYXRjaCB3aXRoIGV4cGVjdGVkXG4gKiBmb3JtYXQgdGhlIHZhbHVlIGlzIHBhcnNlZCB0byBwcm92aWRlIGV4cGVjdGVkIGZvcm1hdC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKiBAcmV0dXJucyBBIG1hcCBvZiBsYXRlIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIGF3YWl0ZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgY3JlYXRlZFxuICovXG5mdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllcyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiB7XG5cdGxldCBzZXR0aW5nc0tleToga2V5b2YgdHlwZW9mIHNldHRpbmdzO1xuXHRjb25zdCBsYXRlUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4gPSB7fTtcblx0Zm9yIChzZXR0aW5nc0tleSBpbiBzZXR0aW5ncykge1xuXHRcdGNvbnN0IHZhbHVlID0gc2V0dGluZ3Nbc2V0dGluZ3NLZXldO1xuXHRcdGlmIChpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdGNvbnN0IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+ID0gdmFsdWU7XG5cdFx0XHRpZiAoaXNDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IGNvbXBpbGVDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGZhbHNlLCB0cnVlLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IGNvbXBpbGVFeHByZXNzaW9uKGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKHZhbHVlIGFzIFByb21pc2U8dW5rbm93bj4pLnRoZW4pIHtcblx0XHRcdGxhdGVQcm9wZXJ0aWVzW3NldHRpbmdzS2V5XSA9IHZhbHVlIGFzIFByb21pc2U8dW5rbm93bj47XG5cdFx0XHRkZWxldGUgc2V0dGluZ3Nbc2V0dGluZ3NLZXldO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUeXBlID0gKG1ldGFkYXRhLmdldEFsbFByb3BlcnRpZXMoKVtzZXR0aW5nc0tleV0gYXMgeyBnZXRUeXBlPzogRnVuY3Rpb24gfSk/LmdldFR5cGU/LigpO1xuXHRcdFx0aWYgKHByb3BlcnR5VHlwZSAmJiBwcm9wZXJ0eVR5cGUgaW5zdGFuY2VvZiBEYXRhVHlwZSAmJiBbXCJib29sZWFuXCIsIFwiaW50XCIsIFwiZmxvYXRcIl0uaW5jbHVkZXMocHJvcGVydHlUeXBlLmdldE5hbWUoKSkpIHtcblx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gcHJvcGVydHlUeXBlLnBhcnNlVmFsdWUodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICh2YWx1ZSBhcyBCaW5kaW5nSW5mb0hvbGRlcikuX19iaW5kaW5nSW5mbykge1xuXHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gKHZhbHVlIGFzIEJpbmRpbmdJbmZvSG9sZGVyKS5fX2JpbmRpbmdJbmZvO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbGF0ZVByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kLlxuICpcbiAqIFJlc29sdmVzIHRoZSBjb21tYW5kIHNldCBvbiB0aGUgY29udHJvbCB2aWEgdGhlIGludHJpbnNpYyBjbGFzcyBhdHRyaWJ1dGUgXCJqc3g6Y29tbWFuZFwiLlxuICogSWYgbm8gY29tbWFuZCBoYXMgYmVlbiBzZXQgb3IgdGhlIHRhcmdldGVkIGV2ZW50IGRvZXNuJ3QgZXhpc3QsIG5vIGNvbmZpZ3VyYXRpb24gaXMgc2V0LlxuICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3MgU2V0dGluZ3Mgb2YgdGhlIGNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbW1hbmQobWV0YWRhdGE6IE1hbmFnZWRPYmplY3RNZXRhZGF0YSwgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IGNvbW1hbmRQcm9wZXJ0eSA9IHNldHRpbmdzW1wianN4OmNvbW1hbmRcIl07XG5cdGlmIChjb21tYW5kUHJvcGVydHkpIHtcblx0XHRjb25zdCBbY29tbWFuZCwgZXZlbnROYW1lXSA9IChjb21tYW5kUHJvcGVydHkgYXMgc3RyaW5nKS5zcGxpdChcInxcIik7XG5cdFx0Y29uc3QgZXZlbnQgPSBtZXRhZGF0YS5nZXRBbGxFdmVudHMoKVtldmVudE5hbWVdO1xuXHRcdGlmIChldmVudCAmJiBjb21tYW5kLnN0YXJ0c1dpdGgoXCJjbWQ6XCIpKSB7XG5cdFx0XHRzZXR0aW5nc1tldmVudC5uYW1lXSA9IEV2ZW50SGFuZGxlclJlc29sdmVyLnJlc29sdmVFdmVudEhhbmRsZXIoY29tbWFuZCk7XG5cdFx0fVxuXHR9XG5cdGRlbGV0ZSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xufVxuXG5jb25zdCBqc3hDb250cm9sID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBFbGVtZW50Pihcblx0Q29udHJvbFR5cGU6IE5vbkFic3RyYWN0Q2xhc3M8Q29udHJvbD4gfCBGdW5jdGlvbixcblx0c2V0dGluZ3M6IE5vbkNvbnRyb2xQcm9wZXJ0aWVzPFQ+ICYge1xuXHRcdGtleTogc3RyaW5nO1xuXHRcdGNoaWxkcmVuPzogRWxlbWVudCB8IENvbnRyb2xQcm9wZXJ0aWVzPFQ+O1xuXHRcdHJlZj86IFJlZjxUPjtcblx0XHRiaW5kaW5nPzogc3RyaW5nO1xuXHRcdGNsYXNzPzogc3RyaW5nO1xuXHRcdFtGTF9ERUxFR0FURV0/OiBzdHJpbmc7XG5cdFx0W0RUX0RFU0lHTlRJTUVdPzogc3RyaW5nO1xuXHR9LFxuXHRrZXk6IHN0cmluZyxcblx0anN4Q29udGV4dDogSlNYQ29udGV4dFxuKTogQ29udHJvbCB8IENvbnRyb2xbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCB0YXJnZXRDb250cm9sOiBDb250cm9sIHwgQ29udHJvbFtdIHwgdW5kZWZpbmVkO1xuXG5cdGlmICgoQ29udHJvbFR5cGUgYXMgeyBpc0ZyYWdtZW50PzogYm9vbGVhbiB9KT8uaXNGcmFnbWVudCkge1xuXHRcdHRhcmdldENvbnRyb2wgPSBzZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sIHwgQ29udHJvbFtdO1xuXHR9IGVsc2UgaWYgKChDb250cm9sVHlwZSBhcyB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKT8uaXNSdW50aW1lKSB7XG5cdFx0Y29uc3QgcnVudGltZUJ1aWxkaW5nQmxvY2sgPSBuZXcgKENvbnRyb2xUeXBlIGFzIHR5cGVvZiBSdW50aW1lQnVpbGRpbmdCbG9jaykoc2V0dGluZ3MgYXMgdW5rbm93biBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0XHR0YXJnZXRDb250cm9sID0gcnVudGltZUJ1aWxkaW5nQmxvY2suZ2V0Q29udGVudD8uKGpzeENvbnRleHQudmlldyEsIGpzeENvbnRleHQuYXBwQ29tcG9uZW50ISk7XG5cdH0gZWxzZSBpZiAoaXNBQ29udHJvbChDb250cm9sVHlwZSkpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IENvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCk7XG5cdFx0aWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZXR0aW5nc1tcImtleVwiXSA9IGtleTtcblx0XHR9XG5cdFx0cHJvY2Vzc0NvbW1hbmQobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0Y29uc3QgY2xhc3NEZWYgPSBzZXR0aW5ncy5jbGFzcztcblx0XHRjb25zdCByZWZEZWYgPSBzZXR0aW5ncy5yZWY7XG5cdFx0Y29uc3QgYmluZGluZ0RlZiA9IHNldHRpbmdzLmJpbmRpbmc7XG5cdFx0Y29uc3QgZmxEZWxlZ2F0ZSA9IHNldHRpbmdzW0ZMX0RFTEVHQVRFXTtcblx0XHRjb25zdCBkdERlc2lnbnRpbWUgPSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRkZWxldGUgc2V0dGluZ3MucmVmO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5jbGFzcztcblx0XHRkZWxldGUgc2V0dGluZ3MuYmluZGluZztcblx0XHRkZWxldGUgc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRjb25zdCBsYXRlUHJvcGVydGllcyA9IHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbEluc3RhbmNlID0gbmV3IENvbnRyb2xUeXBlKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHRcdGlmIChjbGFzc0RlZikge1xuXHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmFkZFN0eWxlQ2xhc3MoY2xhc3NEZWYpO1xuXHRcdH1cblx0XHRpZiAocmVmRGVmKSB7XG5cdFx0XHRyZWZEZWYuc2V0Q3VycmVudCh0YXJnZXRDb250cm9sSW5zdGFuY2UgYXMgdW5rbm93biBhcyBUKTtcblx0XHR9XG5cdFx0Y29uc3QgY3VzdG9tU2V0dGluZ3MgPSB0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIikgPz8ge307XG5cdFx0aWYgKGZsRGVsZWdhdGUpIHtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdID8/PSB7fTtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdLmRlbGVnYXRlID0gZmxEZWxlZ2F0ZTtcblx0XHR9XG5cdFx0aWYgKGR0RGVzaWdudGltZSkge1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0gPz89IHt9O1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0uZGVzaWdudGltZSA9IGR0RGVzaWdudGltZTtcblx0XHR9XG5cdFx0aWYgKE9iamVjdC5rZXlzKGN1c3RvbVNldHRpbmdzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIiwgY3VzdG9tU2V0dGluZ3MpO1xuXHRcdH1cblxuXHRcdGlmIChiaW5kaW5nRGVmKSB7XG5cdFx0XHRpZiAodHlwZW9mIGJpbmRpbmdEZWYgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ0luZm8gPSBiaW5kaW5nUGFyc2VyKGJpbmRpbmdEZWYpO1xuXHRcdFx0XHRpZiAoYmluZGluZ0luZm8pIHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0luZm8ubW9kZWwgPz8gdW5kZWZpbmVkLCBwYXRoOiBiaW5kaW5nSW5mby5wYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5iaW5kRWxlbWVudChiaW5kaW5nRGVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGNvbnNpZGVyIGl0J3MgYW4gb2JqZWN0XG5cdFx0XHRcdE9iamVjdC5rZXlzKGJpbmRpbmdEZWYpLmZvckVhY2goKGJpbmRpbmdEZWZLZXkpID0+IHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0RlZktleSwgcGF0aDogYmluZGluZ0RlZltiaW5kaW5nRGVmS2V5XSB9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgbGF0ZVByb3BlcnRpZXNLZXkgaW4gbGF0ZVByb3BlcnRpZXMpIHtcblx0XHRcdGxhdGVQcm9wZXJ0aWVzW2xhdGVQcm9wZXJ0aWVzS2V5XVxuXHRcdFx0XHQudGhlbigodmFsdWUpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbEluc3RhbmNlLnNldFByb3BlcnR5KGxhdGVQcm9wZXJ0aWVzS2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYENvdWxkbid0IHNldCBwcm9wZXJ0eSAke2xhdGVQcm9wZXJ0aWVzS2V5fSBvbiAke0NvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfWAsIGVycm9yLCBcImpzeENvbnRyb2xcIik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHR0YXJnZXRDb250cm9sID0gdGFyZ2V0Q29udHJvbEluc3RhbmNlO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBDb250cm9sVHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0Y29uc3QgY29udHJvbFR5cGVGbiA9IENvbnRyb2xUeXBlO1xuXHRcdHRhcmdldENvbnRyb2wgPSBjb250cm9sVHlwZUZuKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldENvbnRyb2wgPSBuZXcgVGV4dCh7IHRleHQ6IFwiTWlzc2luZyBjb21wb25lbnQgXCIgKyAoQ29udHJvbFR5cGUgYXMgc3RyaW5nKSB9KTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXRDb250cm9sO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganN4Q29udHJvbDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0VBZ0JBLE1BQU1BLFdBQVcsR0FBRyxhQUFhO0VBQ2pDLE1BQU1DLGFBQWEsR0FBRyxlQUFlO0VBQ3JDLE1BQU1DLG1CQUFtQixHQUFHLFNBQUFBLENBQzNCQyxtQkFBNEQsRUFDNURDLGVBQXVCLEVBQ3ZCQyxLQUEwQyxFQUNuQztJQUNQLElBQUlBLEtBQUssS0FBSyxJQUFJLElBQUlBLEtBQUssS0FBS0MsU0FBUyxJQUFJLE9BQU9ELEtBQUssS0FBSyxRQUFRLEVBQUU7TUFDdkU7SUFDRDtJQUNBLElBQUksQ0FBQ0YsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxFQUFFO01BQzFDRCxtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLEdBQUcsRUFBRTtJQUMxQztJQUNBLElBQUlHLGdCQUFnQixDQUFDRixLQUFLLENBQUMsRUFBRTtNQUM1QkYsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxDQUFDSSxJQUFJLENBQUNILEtBQUssQ0FBQztJQUNqRCxDQUFDLE1BQU0sSUFBSUksS0FBSyxDQUFDQyxPQUFPLENBQUNMLEtBQUssQ0FBQyxFQUFFO01BQ2hDQSxLQUFLLENBQUNNLE9BQU8sQ0FBRUMsUUFBUSxJQUFLO1FBQzNCVixtQkFBbUIsQ0FBQ0MsbUJBQW1CLEVBQUVDLGVBQWUsRUFBRVEsUUFBUSxDQUFDO01BQ3BFLENB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
|
|
227
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsIl9pc0EiLCJfcmVmIiwiaXNBIiwiY2FsbCIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhdGgiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzUHJvcGVydGllcyIsInNldHRpbmdzIiwic2V0dGluZ3NLZXkiLCJsYXRlUHJvcGVydGllcyIsImFsbEV2ZW50cyIsImdldEFsbEV2ZW50cyIsImFsbFByb3BlcnRpZXMiLCJnZXRBbGxQcm9wZXJ0aWVzIiwidmFsdWUiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImlzQ29uc3RhbnQiLCJjb21waWxlQ29uc3RhbnQiLCJpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbiIsIm1vZGVsIiwibW9kZWxOYW1lIiwiY29tcGlsZUV4cHJlc3Npb24iLCJ0aGVuIiwic3RhcnRzV2l0aCIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbiIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbjIiLCJfYWxsUHJvcGVydGllcyRzZXR0aW4zIiwicHJvcGVydHlUeXBlIiwiZ2V0VHlwZSIsIkRhdGFUeXBlIiwiaW5jbHVkZXMiLCJnZXROYW1lIiwicGFyc2VWYWx1ZSIsIl9fYmluZGluZ0luZm8iLCJwcm9jZXNzQ29tbWFuZCIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50IiwibmFtZSIsIkV2ZW50SGFuZGxlclJlc29sdmVyIiwicmVzb2x2ZUV2ZW50SGFuZGxlciIsImpzeENvbnRyb2wiLCJDb250cm9sVHlwZSIsImtleSIsImpzeENvbnRleHQiLCJ0YXJnZXRDb250cm9sIiwiaXNGcmFnbWVudCIsImlzUnVudGltZSIsIl9ydW50aW1lQnVpbGRpbmdCbG9jayIsInJ1bnRpbWVCdWlsZGluZ0Jsb2NrIiwiZ2V0Q29udGVudCIsInZpZXciLCJhcHBDb21wb25lbnQiLCJjbGFzc0RlZiIsImNsYXNzIiwicmVmRGVmIiwicmVmIiwiYmluZGluZ0RlZiIsImJpbmRpbmciLCJmbERlbGVnYXRlIiwiZHREZXNpZ250aW1lIiwidGFyZ2V0Q29udHJvbEluc3RhbmNlIiwiYWRkU3R5bGVDbGFzcyIsInNldEN1cnJlbnQiLCJjdXN0b21TZXR0aW5ncyIsImRhdGEiLCJkZWxlZ2F0ZSIsImRlc2lnbnRpbWUiLCJsZW5ndGgiLCJiaW5kaW5nSW5mbyIsImJpbmRpbmdQYXJzZXIiLCJiaW5kRWxlbWVudCIsImJpbmRpbmdEZWZLZXkiLCJsYXRlUHJvcGVydGllc0tleSIsInNldFByb3BlcnR5IiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsImNvbnRyb2xUeXBlRm4iLCJUZXh0IiwidGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LWNvbnRyb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0Y29tcGlsZUNvbnN0YW50LFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0aXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdGlzQ29uc3RhbnQsXG5cdGlzUGF0aEluTW9kZWxFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nSW5mb0hvbGRlciwgTm9uQWJzdHJhY3RDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbFByb3BlcnRpZXMsIEpTWENvbnRleHQsIE5vbkNvbnRyb2xQcm9wZXJ0aWVzLCBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlXCI7XG5pbXBvcnQgdHlwZSBSdW50aW1lQnVpbGRpbmdCbG9jayBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9SdW50aW1lQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBEYXRhVHlwZSBmcm9tIFwic2FwL3VpL2Jhc2UvRGF0YVR5cGVcIjtcbmltcG9ydCB7IGJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgRWxlbWVudCwgZGVmYXVsdCBhcyBVSTVFbGVtZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFdmVudEhhbmRsZXJSZXNvbHZlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0V2ZW50SGFuZGxlclJlc29sdmVyXCI7XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgRFRfREVTSUdOVElNRSA9IFwiZHQ6ZGVzaWdudGltZVwiO1xuY29uc3QgYWRkQ2hpbGRBZ2dyZWdhdGlvbiA9IGZ1bmN0aW9uIChcblx0YWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKHN0cmluZyB8IFVJNUVsZW1lbnQpW10+LFxuXHRhZ2dyZWdhdGlvbk5hbWU6IHN0cmluZyxcblx0Y2hpbGQ/OiBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdXG4pOiB2b2lkIHtcblx0aWYgKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmICghYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gW107XG5cdH1cblx0aWYgKGlzQ2hpbGRBbkVsZW1lbnQoY2hpbGQpKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdLnB1c2goY2hpbGQpO1xuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG5cdFx0Y2hpbGQuZm9yRWFjaCgoc3ViQ2hpbGQpID0+IHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgYWdncmVnYXRpb25OYW1lLCBzdWJDaGlsZCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gPSBjaGlsZDtcblx0fSBlbHNlIHtcblx0XHRPYmplY3Qua2V5cyhjaGlsZCkuZm9yRWFjaCgoY2hpbGRLZXkpID0+IHtcblx0XHRcdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgY2hpbGRLZXksIGNoaWxkW2NoaWxkS2V5XSk7XG5cdFx0fSk7XG5cdH1cbn07XG5jb25zdCBpc0NoaWxkQW5FbGVtZW50ID0gZnVuY3Rpb24gKGNoaWxkcmVuPzogdW5rbm93bik6IGNoaWxkcmVuIGlzIEVsZW1lbnQge1xuXHRyZXR1cm4gKGNoaWxkcmVuIGFzIEVsZW1lbnQpPy5pc0E/LihcInNhcC51aS5jb3JlLkVsZW1lbnRcIik7XG59O1xuY29uc3QgaXNBQ29udHJvbCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHR5cGVvZiBDb250cm9sIHwgRnVuY3Rpb24pOiBjaGlsZHJlbiBpcyBOb25BYnN0cmFjdENsYXNzPENvbnRyb2w+IHtcblx0cmV0dXJuICEhKGNoaWxkcmVuIGFzIHR5cGVvZiBDb250cm9sKT8uZ2V0TWV0YWRhdGE7XG59O1xuXG5mdW5jdGlvbiBwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcblx0Y29uc3QgbWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSBtZXRhZGF0YS5nZXRBbGxBZ2dyZWdhdGlvbnMoKTtcblx0Y29uc3QgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUoKTtcblx0Y29uc3QgYWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKHN0cmluZyB8IFVJNUVsZW1lbnQpW10+ID0ge307XG5cdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSwgbVNldHRpbmdzLmNoaWxkcmVuIGFzIHN0cmluZyB8IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10pO1xuXHRkZWxldGUgbVNldHRpbmdzLmNoaWxkcmVuO1xuXHQvLyBmaW5kIG91dCB3aGljaCBhZ2dyZWdhdGlvbiBhcmUgYm91bmQgKGJvdGggaW4gY2hpbGRyZW4gYW5kIGRpcmVjdGx5IHVuZGVyIGl0KVxuXHRPYmplY3Qua2V5cyhtZXRhZGF0YUFnZ3JlZ2F0aW9ucykuZm9yRWFjaCgoYWdncmVnYXRpb25OYW1lKSA9PiB7XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAobVNldHRpbmdzLmhhc093blByb3BlcnR5KGFnZ3JlZ2F0aW9uTmFtZSkpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyBmYWN0b3J5OiBGdW5jdGlvbiB9KS5mYWN0b3J5ID0gYWdncmVnYXRpb25DaGlsZHJlbltcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uTmFtZVxuXHRcdFx0XHRcdF0gYXMgdW5rbm93biBhcyBGdW5jdGlvbjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyB0ZW1wbGF0ZTogc3RyaW5nIHwgVUk1RWxlbWVudCB9KS50ZW1wbGF0ZSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXVswXTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIHByb3BlcnRpZXMuXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IGlzIGEgYmluZGluZ1Rvb2xraXQgZXhwcmVzc2lvbiB3ZSBuZWVkIHRvIGNvbXBpbGUgaXQuXG4gKiBFbHNlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgYXMgc3RyaW5nIChjb21waWxlZCBiaW5kaW5nIGV4cHJlc3Npb24gcmV0dXJucyBzdHJpbmcgYnkgZGVmYXVsdCBldmVuIGlmIGl0J3MgYSBib29sZWFuLCBpbnQsIGV0Yy4pIGFuZCBpdCBkb2Vzbid0IG1hdGNoIHdpdGggZXhwZWN0ZWRcbiAqIGZvcm1hdCB0aGUgdmFsdWUgaXMgcGFyc2VkIHRvIHByb3ZpZGUgZXhwZWN0ZWQgZm9ybWF0LlxuICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3MgU2V0dGluZ3Mgb2YgdGhlIGNvbnRyb2xcbiAqIEByZXR1cm5zIEEgbWFwIG9mIGxhdGUgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgYXdhaXRlZCBhZnRlciB0aGUgY29udHJvbCBpcyBjcmVhdGVkXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+IHtcblx0bGV0IHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3M7XG5cdGNvbnN0IGxhdGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiA9IHt9O1xuXHRjb25zdCBhbGxFdmVudHMgPSBtZXRhZGF0YS5nZXRBbGxFdmVudHMoKTtcblx0Y29uc3QgYWxsUHJvcGVydGllcyA9IG1ldGFkYXRhLmdldEFsbFByb3BlcnRpZXMoKTtcblx0Zm9yIChzZXR0aW5nc0tleSBpbiBzZXR0aW5ncykge1xuXHRcdGNvbnN0IHZhbHVlID0gc2V0dGluZ3Nbc2V0dGluZ3NLZXldO1xuXHRcdGlmIChpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdGNvbnN0IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+ID0gdmFsdWU7XG5cdFx0XHRpZiAoaXNDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IGNvbXBpbGVDb25zdGFudChiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGZhbHNlLCB0cnVlLCB0cnVlKTtcblx0XHRcdH0gZWxzZSBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbFByb3BlcnRpZXMsIHNldHRpbmdzS2V5KSkge1xuXHRcdFx0XHQvLyBBZ2dyZWdhdGlvbiBjYXNlIC0gd2UgbmVlZCB0byBjb21waWxlIHRoZSBleHByZXNzaW9uIGJ1dCBhcyBhbiBvYmplY3Rcblx0XHRcdFx0aWYgKGlzUGF0aEluTW9kZWxFeHByZXNzaW9uKGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbikpIHtcblx0XHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSB7IHBhdGg6IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbi5wYXRoLCBtb2RlbDogYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLm1vZGVsTmFtZSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICh2YWx1ZSBhcyBQcm9taXNlPHVua25vd24+KS50aGVuKSB7XG5cdFx0XHRsYXRlUHJvcGVydGllc1tzZXR0aW5nc0tleV0gPSB2YWx1ZSBhcyBQcm9taXNlPHVua25vd24+O1xuXHRcdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZSA9IChhbGxQcm9wZXJ0aWVzW3NldHRpbmdzS2V5XSBhcyB7IGdldFR5cGU/OiBGdW5jdGlvbiB9KT8uZ2V0VHlwZT8uKCk7XG5cdFx0XHRpZiAocHJvcGVydHlUeXBlICYmIHByb3BlcnR5VHlwZSBpbnN0YW5jZW9mIERhdGFUeXBlICYmIFtcImJvb2xlYW5cIiwgXCJpbnRcIiwgXCJmbG9hdFwiXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUuZ2V0TmFtZSgpKSkge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBwcm9wZXJ0eVR5cGUucGFyc2VWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKHZhbHVlIGFzIEJpbmRpbmdJbmZvSG9sZGVyPHVua25vd24+KS5fX2JpbmRpbmdJbmZvKSB7XG5cdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSAodmFsdWUgYXMgQmluZGluZ0luZm9Ib2xkZXI8dW5rbm93bj4pLl9fYmluZGluZ0luZm87XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYWxsRXZlbnRzLCBzZXR0aW5nc0tleSkpIHtcblx0XHRcdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGxhdGVQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY29tbWFuZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgY29tbWFuZCBzZXQgb24gdGhlIGNvbnRyb2wgdmlhIHRoZSBpbnRyaW5zaWMgY2xhc3MgYXR0cmlidXRlIFwianN4OmNvbW1hbmRcIi5cbiAqIElmIG5vIGNvbW1hbmQgaGFzIGJlZW4gc2V0IG9yIHRoZSB0YXJnZXRlZCBldmVudCBkb2Vzbid0IGV4aXN0LCBubyBjb25maWd1cmF0aW9uIGlzIHNldC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKClbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBFdmVudEhhbmRsZXJSZXNvbHZlci5yZXNvbHZlRXZlbnRIYW5kbGVyKGNvbW1hbmQpO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuY29uc3QganN4Q29udHJvbCA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgRWxlbWVudD4oXG5cdENvbnRyb2xUeXBlOiBOb25BYnN0cmFjdENsYXNzPENvbnRyb2w+IHwgRnVuY3Rpb24sXG5cdHNldHRpbmdzOiBOb25Db250cm9sUHJvcGVydGllczxUPiAmIHtcblx0XHRrZXk6IHN0cmluZztcblx0XHRjaGlsZHJlbj86IEVsZW1lbnQgfCBDb250cm9sUHJvcGVydGllczxUPjtcblx0XHRyZWY/OiBSZWY8VD47XG5cdFx0YmluZGluZz86IHN0cmluZztcblx0XHRjbGFzcz86IHN0cmluZztcblx0XHRbRkxfREVMRUdBVEVdPzogc3RyaW5nO1xuXHRcdFtEVF9ERVNJR05USU1FXT86IHN0cmluZztcblx0fSxcblx0a2V5OiBzdHJpbmcsXG5cdGpzeENvbnRleHQ6IEpTWENvbnRleHRcbik6IENvbnRyb2wgfCBDb250cm9sW10gfCB1bmRlZmluZWQge1xuXHRsZXQgdGFyZ2V0Q29udHJvbDogQ29udHJvbCB8IENvbnRyb2xbXSB8IHVuZGVmaW5lZDtcblxuXHRpZiAoKENvbnRyb2xUeXBlIGFzIHsgaXNGcmFnbWVudD86IGJvb2xlYW4gfSk/LmlzRnJhZ21lbnQpIHtcblx0XHR0YXJnZXRDb250cm9sID0gc2V0dGluZ3MuY2hpbGRyZW4gYXMgQ29udHJvbCB8IENvbnRyb2xbXTtcblx0fSBlbHNlIGlmICgoQ29udHJvbFR5cGUgYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk/LmlzUnVudGltZSkge1xuXHRcdGNvbnN0IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrID0gbmV3IChDb250cm9sVHlwZSBhcyB0eXBlb2YgUnVudGltZUJ1aWxkaW5nQmxvY2spKHNldHRpbmdzIGFzIHVua25vd24gYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrLmdldENvbnRlbnQ/Lihqc3hDb250ZXh0LnZpZXchLCBqc3hDb250ZXh0LmFwcENvbXBvbmVudCEpO1xuXHR9IGVsc2UgaWYgKGlzQUNvbnRyb2woQ29udHJvbFR5cGUpKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpO1xuXHRcdGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdFx0fVxuXHRcdGNvbnN0IGxhdGVQcm9wZXJ0aWVzID0gcHJvY2Vzc1Byb3BlcnRpZXMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQ29tbWFuZChtZXRhZGF0YSwgc2V0dGluZ3MpO1xuXHRcdHByb2Nlc3NBZ2dyZWdhdGlvbnMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRjb25zdCBjbGFzc0RlZiA9IHNldHRpbmdzLmNsYXNzO1xuXHRcdGNvbnN0IHJlZkRlZiA9IHNldHRpbmdzLnJlZjtcblx0XHRjb25zdCBiaW5kaW5nRGVmID0gc2V0dGluZ3MuYmluZGluZztcblx0XHRjb25zdCBmbERlbGVnYXRlID0gc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGNvbnN0IGR0RGVzaWdudGltZSA9IHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5yZWY7XG5cdFx0ZGVsZXRlIHNldHRpbmdzLmNsYXNzO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5iaW5kaW5nO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tGTF9ERUxFR0FURV07XG5cdFx0ZGVsZXRlIHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGNvbnN0IHRhcmdldENvbnRyb2xJbnN0YW5jZSA9IG5ldyBDb250cm9sVHlwZShzZXR0aW5ncyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0XHRpZiAoY2xhc3NEZWYpIHtcblx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5hZGRTdHlsZUNsYXNzKGNsYXNzRGVmKTtcblx0XHR9XG5cdFx0aWYgKHJlZkRlZikge1xuXHRcdFx0cmVmRGVmLnNldEN1cnJlbnQodGFyZ2V0Q29udHJvbEluc3RhbmNlIGFzIHVua25vd24gYXMgVCk7XG5cdFx0fVxuXHRcdGNvbnN0IGN1c3RvbVNldHRpbmdzID0gdGFyZ2V0Q29udHJvbEluc3RhbmNlLmRhdGEoXCJzYXAtdWktY3VzdG9tLXNldHRpbmdzXCIpID8/IHt9O1xuXHRcdGlmIChmbERlbGVnYXRlKSB7XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5mbFwiXSA/Pz0ge307XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5mbFwiXS5kZWxlZ2F0ZSA9IGZsRGVsZWdhdGU7XG5cdFx0fVxuXHRcdGlmIChkdERlc2lnbnRpbWUpIHtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmR0XCJdID8/PSB7fTtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmR0XCJdLmRlc2lnbnRpbWUgPSBkdERlc2lnbnRpbWU7XG5cdFx0fVxuXHRcdGlmIChPYmplY3Qua2V5cyhjdXN0b21TZXR0aW5ncykubGVuZ3RoID4gMCkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmRhdGEoXCJzYXAtdWktY3VzdG9tLXNldHRpbmdzXCIsIGN1c3RvbVNldHRpbmdzKTtcblx0XHR9XG5cblx0XHRpZiAoYmluZGluZ0RlZikge1xuXHRcdFx0aWYgKHR5cGVvZiBiaW5kaW5nRGVmID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdJbmZvID0gYmluZGluZ1BhcnNlcihiaW5kaW5nRGVmKTtcblx0XHRcdFx0aWYgKGJpbmRpbmdJbmZvKSB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KHsgbW9kZWw6IGJpbmRpbmdJbmZvLm1vZGVsID8/IHVuZGVmaW5lZCwgcGF0aDogYmluZGluZ0luZm8ucGF0aCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoYmluZGluZ0RlZik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSBjb25zaWRlciBpdCdzIGFuIG9iamVjdFxuXHRcdFx0XHRPYmplY3Qua2V5cyhiaW5kaW5nRGVmKS5mb3JFYWNoKChiaW5kaW5nRGVmS2V5KSA9PiB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KHsgbW9kZWw6IGJpbmRpbmdEZWZLZXksIHBhdGg6IGJpbmRpbmdEZWZbYmluZGluZ0RlZktleV0gfSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGxhdGVQcm9wZXJ0aWVzS2V5IGluIGxhdGVQcm9wZXJ0aWVzKSB7XG5cdFx0XHRsYXRlUHJvcGVydGllc1tsYXRlUHJvcGVydGllc0tleV1cblx0XHRcdFx0LnRoZW4oKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRhcmdldENvbnRyb2xJbnN0YW5jZS5zZXRQcm9wZXJ0eShsYXRlUHJvcGVydGllc0tleSwgdmFsdWUpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDb3VsZG4ndCBzZXQgcHJvcGVydHkgJHtsYXRlUHJvcGVydGllc0tleX0gb24gJHtDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX1gLCBlcnJvciwgXCJqc3hDb250cm9sXCIpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHRhcmdldENvbnRyb2xJbnN0YW5jZTtcblx0fSBlbHNlIGlmICh0eXBlb2YgQ29udHJvbFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdGNvbnN0IGNvbnRyb2xUeXBlRm4gPSBDb250cm9sVHlwZTtcblx0XHR0YXJnZXRDb250cm9sID0gY29udHJvbFR5cGVGbihzZXR0aW5ncyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRDb250cm9sID0gbmV3IFRleHQoeyB0ZXh0OiBcIk1pc3NpbmcgY29tcG9uZW50IFwiICsgKENvbnRyb2xUeXBlIGFzIHN0cmluZykgfSk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGpzeENvbnRyb2w7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7RUFzQkEsTUFBTUEsV0FBVyxHQUFHLGFBQWE7RUFDakMsTUFBTUMsYUFBYSxHQUFHLGVBQWU7RUFDckMsTUFBTUMsbUJBQW1CLEdBQUcsU0FBQUEsQ0FDM0JDLG1CQUE0RCxFQUM1REMsZUFBdUIsRUFDdkJDLEtBQTBDLEVBQ25DO0lBQ1AsSUFBSUEsS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLQyxTQUFTLElBQUksT0FBT0QsS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUN2RTtJQUNEO0lBQ0EsSUFBSSxDQUFDRixtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLEVBQUU7TUFDMUNELG1CQUFtQixDQUFDQyxlQUFlLENBQUMsR0FBRyxFQUFFO0lBQzFDO0lBQ0EsSUFBSUcsZ0JBQWdCLENBQUNGLEtBQUssQ0FBQyxFQUFFO01BQzVCRixtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLENBQUNJLElBQUksQ0FBQ0gsS0FBSyxDQUFDO0lBQ2pELENBQUMsTUFBTSxJQUFJSSxLQUFLLENBQUNDLE9BQU8sQ0FBQ0wsS0FBSyxDQUFDLEVBQUU7TUFDaENBLEtBQUssQ0FBQ00sT0FBTyxDQUFFQyxRQUFRLElBQUs7UUFDM0JWLG1CQUFtQixDQUFDQyxtQkFBbUIsRUFBRUMsZUFBZSxFQUFFUSxRQUFRLENBQUM7TUFDcEUsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxNQUFNLElBQUksT0FBT1AsS0FBSyxLQUFLLFVBQVUsRUFBRTtNQUN2Q0YsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxHQUFHQyxLQUFLO0lBQzdDLENBQUMsTUFBTTtNQUNOUSxNQUFNLENBQUNDLElBQUksQ0FBQ1QsS0FBSyxDQUFDLENBQUNNLE9BQU8sQ0FBRUksUUFBUSxJQUFLO1FBQ3hDYixtQkFBbUIsQ0FBQ0MsbUJBQW1CLEVBQUVZLFFBQVEsRUFBRVYsS0FBSyxDQUFDVSxRQUFRLENBQUMsQ0FBQztNQUNwRSxDQUFDLENBQUM7SUFDSDtFQUNELENBQUM7RUFDRCxNQUFNUixnQkFBZ0IsR0FBRyxTQUFBQSxDQUFVUyxRQUFrQixFQUF1QjtJQUFBLElBQUFDLElBQUEsRUFBQUMsSUFBQTtJQUMzRSxPQUFRRixRQUFRLGFBQVJBLFFBQVEsd0JBQUFDLElBQUEsR0FBVCxDQUFBQyxJQUFBLEdBQUNGLFFBQVEsRUFBY0csR0FBRyxjQUFBRixJQUFBLHVCQUExQkEsSUFBQSxDQUFBRyxJQUFBLENBQUFGLElBQUEsRUFBNkIscUJBQXFCLENBQUM7RUFDM0QsQ0FBQztFQUNELE1BQU1HLFVBQVUsR0FBRyxTQUFBQSxDQUFVTCxRQUFvQyxFQUF5QztJQUN6RyxPQUFPLENBQUMsRUFBRUEsUUFBUSxhQUFSQSxRQUFRLGVBQVJBLFFBQVEsQ0FBcUJNLFdBQVc7RUFDbkQsQ0FBQztFQUVELFNBQVNDLG1CQUFtQkEsQ0FBQ0MsUUFBK0IsRUFBRUMsU0FBa0MsRUFBUTtJQUN2RyxNQUFNQyxvQkFBb0IsR0FBR0YsUUFBUSxDQUFDRyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzFELE1BQU1DLHNCQUFzQixHQUFHSixRQUFRLENBQUNLLHlCQUF5QixDQUFDLENBQUM7SUFDbkUsTUFBTTFCLG1CQUE0RCxHQUFHLENBQUMsQ0FBQztJQUN2RUQsbUJBQW1CLENBQUNDLG1CQUFtQixFQUFFeUIsc0JBQXNCLEVBQUVILFNBQVMsQ0FBQ1QsUUFBOEMsQ0FBQztJQUMxSCxPQUFPUyxTQUFTLENBQUNULFFBQVE7SUFDekI7SUFDQUgsTUFBTSxDQUFDQyxJQUFJLENBQUNZLG9CQUFvQixDQUFDLENBQUNmLE9BQU8sQ0FBRVAsZUFBZSxJQUFLO01BQzlELElBQUlELG1CQUFtQixDQUFDQyxlQUFlLENBQUMsS0FBS0UsU0FBUyxFQUFFO1FBQ3ZELElBQUltQixTQUFTLENBQUNLLGNBQWMsQ0FBQzFCLGVBQWUsQ0FBQyxFQUFFO1VBQzlDLElBQUksT0FBT3FCLFNBQVMsQ0FBQ3JCLGVBQWUsQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUNuRHFCLFNBQVMsQ0FBQ3JCLGVBQWUsQ0FBQyxHQUFHO2NBQzVCMkIsSUFBSSxFQUFFTixTQUFTLENBQUNyQixlQUFlO1lBQ2hDLENBQUM7VUFDRjtVQUNBLElBQUksT0FBT0QsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUM5RHFCLFNBQVMsQ0FBQ3JCLGVBQWUsQ0FBQyxDQUEyQjRCLE9BQU8sR0FBRzdCLG1CQUFtQixDQUNsRkMsZUFBZSxDQUNRO1VBQ3pCLENBQUMsTUFBTTtZQUNMcUIsU0FBUyxDQUFDckIsZUFBZSxDQUFDLENBQXVDNkIsUUFBUSxHQUFHOUIsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUNySDtRQUNELENBQUMsTUFBTTtVQUNOcUIsU0FBUyxDQUFDckIsZUFBZSxDQUFDLEdBQUdELG1CQUFtQixDQUFDQyxlQUFlLENBQUM7UUFDbEU7TUFDRDtJQUNELENBQUMsQ0FBQztFQUNIOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUzhCLGlCQUFpQkEsQ0FBQ1YsUUFBK0IsRUFBRVcsUUFBaUMsRUFBb0M7SUFDaEksSUFBSUMsV0FBa0M7SUFDdEMsTUFBTUMsY0FBZ0QsR0FBRyxDQUFDLENBQUM7SUFDM0QsTUFBTUMsU0FBUyxHQUFHZCxRQUFRLENBQUNlLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLE1BQU1DLGFBQWEsR0FBR2hCLFFBQVEsQ0FBQ2lCLGdCQUFnQixDQUFDLENBQUM7SUFDakQsS0FBS0wsV0FBVyxJQUFJRCxRQUFRLEVBQUU7TUFDN0IsTUFBTU8sS0FBSyxHQUFHUCxRQUFRLENBQUNDLFdBQVcsQ0FBQztNQUNuQyxJQUFJTywwQkFBMEIsQ0FBQ0QsS0FBSyxDQUFDLEVBQUU7UUFDdEMsTUFBTUUsd0JBQTJELEdBQUdGLEtBQUs7UUFDekUsSUFBSUcsVUFBVSxDQUFDRCx3QkFBd0IsQ0FBQyxFQUFFO1VBQ3pDVCxRQUFRLENBQUNDLFdBQVcsQ0FBQyxHQUFHVSxlQUFlLENBQUNGLHdCQUF3QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ3JGLENBQUMsTUFBTSxJQUFJLENBQUMvQixNQUFNLENBQUNpQixjQUFjLENBQUNWLElBQUksQ0FBQ29CLGFBQWEsRUFBRUosV0FBVyxDQUFDLEVBQUU7VUFDbkU7VUFDQSxJQUFJVyx1QkFBdUIsQ0FBQ0gsd0JBQXdCLENBQUMsRUFBRTtZQUN0RFQsUUFBUSxDQUFDQyxXQUFXLENBQUMsR0FBRztjQUFFTCxJQUFJLEVBQUVhLHdCQUF3QixDQUFDYixJQUFJO2NBQUVpQixLQUFLLEVBQUVKLHdCQUF3QixDQUFDSztZQUFVLENBQUM7VUFDM0c7UUFDRCxDQUFDLE1BQU07VUFDTmQsUUFBUSxDQUFDQyxXQUFXLENBQUMsR0FBR2MsaUJBQWlCLENBQUNOLHdCQUF3QixDQUFDO1FBQ3BFO01BQ0QsQ0FBQyxNQUFNLElBQUlGLEtBQUssS0FBSyxJQUFJLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBS0EsS0FBSyxDQUFzQlMsSUFBSSxFQUFFO1FBQzNGZCxjQUFjLENBQUNELFdBQVcsQ0FBQyxHQUFHTSxLQUF5QjtRQUN2RCxPQUFPUCxRQUFRLENBQUNDLFdBQVcsQ0FBQztNQUM3QixDQUFDLE1BQU0sSUFBSSxPQUFPTSxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUNBLEtBQUssQ0FBQ1UsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQUEsSUFBQUMscUJBQUEsRUFBQUMsc0JBQUEsRUFBQUMsc0JBQUE7UUFDL0QsTUFBTUMsWUFBWSxJQUFBSCxxQkFBQSxHQUFJYixhQUFhLENBQUNKLFdBQVcsQ0FBQyxjQUFBaUIscUJBQUEsd0JBQUFDLHNCQUFBLEdBQTNCLENBQUFDLHNCQUFBLEdBQUFGLHFCQUFBLEVBQXdESSxPQUFPLGNBQUFILHNCQUFBLHVCQUEvREEsc0JBQUEsQ0FBQWxDLElBQUEsQ0FBQW1DLHNCQUFrRSxDQUFDO1FBQ3hGLElBQUlDLFlBQVksSUFBSUEsWUFBWSxZQUFZRSxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDQyxRQUFRLENBQUNILFlBQVksQ0FBQ0ksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQ3JIekIsUUFBUSxDQUFDQyxXQUFXLENBQUMsR0FBR29CLFlBQVksQ0FBQ0ssVUFBVSxDQUFDbkIsS0FBSyxDQUFDO1FBQ3ZEO01BQ0QsQ0FBQyxNQUFNLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFBS0EsS0FBSyxDQUFnQ29CLGFBQWEsRUFBRTtRQUM1RjNCLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDLEdBQUlNLEtBQUssQ0FBZ0NvQixhQUFhO01BQzVFLENBQUMsTUFBTSxJQUFJcEIsS0FBSyxLQUFLcEMsU0FBUyxFQUFFO1FBQy9CLElBQUlPLE1BQU0sQ0FBQ2lCLGNBQWMsQ0FBQ1YsSUFBSSxDQUFDa0IsU0FBUyxFQUFFRixXQUFXLENBQUMsRUFBRTtVQUN2RCxPQUFPRCxRQUFRLENBQUNDLFdBQVcsQ0FBQztRQUM3QjtNQUNEO0lBQ0Q7SUFDQSxPQUFPQyxjQUFjO0VBQ3RCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTMEIsY0FBY0EsQ0FBQ3ZDLFFBQStCLEVBQUVXLFFBQWlDLEVBQVE7SUFDakcsTUFBTTZCLGVBQWUsR0FBRzdCLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDL0MsSUFBSTZCLGVBQWUsRUFBRTtNQUNwQixNQUFNLENBQUNDLE9BQU8sRUFBRUMsU0FBUyxDQUFDLEdBQUlGLGVBQWUsQ0FBWUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUNuRSxNQUFNQyxLQUFLLEdBQUc1QyxRQUFRLENBQUNlLFlBQVksQ0FBQyxDQUFDLENBQUMyQixTQUFTLENBQUM7TUFDaEQsSUFBSUUsS0FBSyxJQUFJSCxPQUFPLENBQUNiLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN4Q2pCLFFBQVEsQ0FBQ2lDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLEdBQUdDLG9CQUFvQixDQUFDQyxtQkFBbUIsQ0FBQ04sT0FBTyxDQUFDO01BQ3pFO0lBQ0Q7SUFDQSxPQUFPOUIsUUFBUSxDQUFDLGFBQWEsQ0FBQztFQUMvQjtFQUVBLE1BQU1xQyxVQUFVLEdBQUcsU0FBQUEsQ0FDbEJDLFdBQWlELEVBQ2pEdEMsUUFRQyxFQUNEdUMsR0FBVyxFQUNYQyxVQUFzQixFQUNZO0lBQ2xDLElBQUlDLGFBQThDO0lBRWxELElBQUtILFdBQVcsYUFBWEEsV0FBVyxlQUFYQSxXQUFXLENBQStCSSxVQUFVLEVBQUU7TUFDMURELGFBQWEsR0FBR3pDLFFBQVEsQ0FBQ25CLFFBQStCO0lBQ3pELENBQUMsTUFBTSxJQUFLeUQsV0FBVyxhQUFYQSxXQUFXLGVBQVhBLFdBQVcsQ0FBeUNLLFNBQVMsRUFBRTtNQUFBLElBQUFDLHFCQUFBO01BQzFFLE1BQU1DLG9CQUFvQixHQUFHLElBQUtQLFdBQVcsQ0FBaUN0QyxRQUF1QyxDQUFDO01BQ3RIeUMsYUFBYSxJQUFBRyxxQkFBQSxHQUFHQyxvQkFBb0IsQ0FBQ0MsVUFBVSxjQUFBRixxQkFBQSx1QkFBL0JBLHFCQUFBLENBQUEzRCxJQUFBLENBQUE0RCxvQkFBb0IsRUFBY0wsVUFBVSxDQUFDTyxJQUFJLEVBQUdQLFVBQVUsQ0FBQ1EsWUFBYSxDQUFDO0lBQzlGLENBQUMsTUFBTSxJQUFJOUQsVUFBVSxDQUFDb0QsV0FBVyxDQUFDLEVBQUU7TUFDbkMsTUFBTWpELFFBQVEsR0FBR2lELFdBQVcsQ0FBQ25ELFdBQVcsQ0FBQyxDQUFDO01BQzFDLElBQUlvRCxHQUFHLEtBQUtwRSxTQUFTLEVBQUU7UUFDdEI2QixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUd1QyxHQUFHO01BQ3RCO01BQ0EsTUFBTXJDLGNBQWMsR0FBR0gsaUJBQWlCLENBQUNWLFFBQVEsRUFBRVcsUUFBUSxDQUFDO01BQzVENEIsY0FBYyxDQUFDdkMsUUFBUSxFQUFFVyxRQUFRLENBQUM7TUFDbENaLG1CQUFtQixDQUFDQyxRQUFRLEVBQUVXLFFBQVEsQ0FBQztNQUN2QyxNQUFNaUQsUUFBUSxHQUFHakQsUUFBUSxDQUFDa0QsS0FBSztNQUMvQixNQUFNQyxNQUFNLEdBQUduRCxRQUFRLENBQUNvRCxHQUFHO01BQzNCLE1BQU1DLFVBQVUsR0FBR3JELFFBQVEsQ0FBQ3NELE9BQU87TUFDbkMsTUFBTUMsVUFBVSxHQUFHdkQsUUFBUSxDQUFDbkMsV0FBVyxDQUFDO01BQ3hDLE1BQU0yRixZQUFZLEdBQUd4RCxRQUFRLENBQUNsQyxhQUFhLENBQUM7TUFDNUMsT0FBT2tDLFFBQVEsQ0FBQ29ELEdBQUc7TUFDbkIsT0FBT3BELFFBQVEsQ0FBQ2tELEtBQUs7TUFDckIsT0FBT2xELFFBQVEsQ0FBQ3NELE9BQU87TUFDdkIsT0FBT3RELFFBQVEsQ0FBQ25DLFdBQVcsQ0FBQztNQUM1QixPQUFPbUMsUUFBUSxDQUFDbEMsYUFBYSxDQUFDO01BQzlCLE1BQU0yRixxQkFBcUIsR0FBRyxJQUFJbkIsV0FBVyxDQUFDdEMsUUFBNEIsQ0FBQztNQUMzRSxJQUFJaUQsUUFBUSxFQUFFO1FBQ2JRLHFCQUFxQixDQUFDQyxhQUFhLENBQUNULFFBQVEsQ0FBQztNQUM5QztNQUNBLElBQUlFLE1BQU0sRUFBRTtRQUNYQSxNQUFNLENBQUNRLFVBQVUsQ0FBQ0YscUJBQXFDLENBQUM7TUFDekQ7TUFDQSxNQUFNRyxjQUFjLEdBQUdILHFCQUFxQixDQUFDSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDakYsSUFBSU4sVUFBVSxFQUFFO1FBQ2ZLLGNBQWMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbENBLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQ0UsUUFBUSxHQUFHUCxVQUFVO01BQ2xEO01BQ0EsSUFBSUMsWUFBWSxFQUFFO1FBQ2pCSSxjQUFjLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDQSxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUNHLFVBQVUsR0FBR1AsWUFBWTtNQUN0RDtNQUNBLElBQUk5RSxNQUFNLENBQUNDLElBQUksQ0FBQ2lGLGNBQWMsQ0FBQyxDQUFDSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzNDUCxxQkFBcUIsQ0FBQ0ksSUFBSSxDQUFDLHdCQUF3QixFQUFFRCxjQUFjLENBQUM7TUFDckU7TUFFQSxJQUFJUCxVQUFVLEVBQUU7UUFDZixJQUFJLE9BQU9BLFVBQVUsS0FBSyxRQUFRLEVBQUU7VUFDbkMsTUFBTVksV0FBVyxHQUFHQyxhQUFhLENBQUNiLFVBQVUsQ0FBQztVQUM3QyxJQUFJWSxXQUFXLEVBQUU7WUFDaEJSLHFCQUFxQixDQUFDVSxXQUFXLENBQUM7Y0FBRXRELEtBQUssRUFBRW9ELFdBQVcsQ0FBQ3BELEtBQUssSUFBSTFDLFNBQVM7Y0FBRXlCLElBQUksRUFBRXFFLFdBQVcsQ0FBQ3JFO1lBQUssQ0FBQyxDQUFDO1VBQ3JHO1VBQ0E2RCxxQkFBcUIsQ0FBQ1UsV0FBVyxDQUFDZCxVQUFVLENBQUM7UUFDOUMsQ0FBQyxNQUFNO1VBQ047VUFDQTNFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMEUsVUFBVSxDQUFDLENBQUM3RSxPQUFPLENBQUU0RixhQUFhLElBQUs7WUFDbERYLHFCQUFxQixDQUFDVSxXQUFXLENBQUM7Y0FBRXRELEtBQUssRUFBRXVELGFBQWE7Y0FBRXhFLElBQUksRUFBRXlELFVBQVUsQ0FBQ2UsYUFBYTtZQUFFLENBQUMsQ0FBQztVQUM3RixDQUFDLENBQUM7UUFDSDtNQUNEO01BQ0EsS0FBSyxNQUFNQyxpQkFBaUIsSUFBSW5FLGNBQWMsRUFBRTtRQUMvQ0EsY0FBYyxDQUFDbUUsaUJBQWlCLENBQUMsQ0FDL0JyRCxJQUFJLENBQUVULEtBQUssSUFBSztVQUNoQixPQUFPa0QscUJBQXFCLENBQUNhLFdBQVcsQ0FBQ0QsaUJBQWlCLEVBQUU5RCxLQUFLLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQ0RnRSxLQUFLLENBQUVDLEtBQUssSUFBSztVQUNqQkMsR0FBRyxDQUFDRCxLQUFLLENBQUMseUJBQXlCSCxpQkFBaUIsT0FBTy9CLFdBQVcsQ0FBQ25ELFdBQVcsQ0FBQyxDQUFDLENBQUNzQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUrQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQ3ZILENBQUMsQ0FBQztNQUNKO01BQ0EvQixhQUFhLEdBQUdnQixxQkFBcUI7SUFDdEMsQ0FBQyxNQUFNLElBQUksT0FBT25CLFdBQVcsS0FBSyxVQUFVLEVBQUU7TUFDN0MsTUFBTW9DLGFBQWEsR0FBR3BDLFdBQVc7TUFDakNHLGFBQWEsR0FBR2lDLGFBQWEsQ0FBQzFFLFFBQTRCLENBQUM7SUFDNUQsQ0FBQyxNQUFNO01BQ055QyxhQUFhLEdBQUcsSUFBSWtDLElBQUksQ0FBQztRQUFFQyxJQUFJLEVBQUUsb0JBQW9CLEdBQUl0QztNQUF1QixDQUFDLENBQUM7SUFDbkY7SUFFQSxPQUFPRyxhQUFhO0VBQ3JCLENBQUM7RUFBQyxPQUVhSixVQUFVO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import Log from "sap/base/Log";
|
|
2
2
|
import type { BindingToolkitExpression } from "sap/fe/base/BindingToolkit";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
compileConstant,
|
|
5
|
+
compileExpression,
|
|
6
|
+
isBindingToolkitExpression,
|
|
7
|
+
isConstant,
|
|
8
|
+
isPathInModelExpression
|
|
9
|
+
} from "sap/fe/base/BindingToolkit";
|
|
4
10
|
import type { BindingInfoHolder, NonAbstractClass } from "sap/fe/base/ClassSupport";
|
|
5
11
|
import type { ControlProperties, JSXContext, NonControlProperties, Ref } from "sap/fe/base/jsx-runtime/jsx";
|
|
6
12
|
import type BuildingBlockTemplatingBase from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase";
|
|
@@ -90,12 +96,19 @@ function processAggregations(metadata: ManagedObjectMetadata, mSettings: Record<
|
|
|
90
96
|
function processProperties(metadata: ManagedObjectMetadata, settings: Record<string, unknown>): Record<string, Promise<unknown>> {
|
|
91
97
|
let settingsKey: keyof typeof settings;
|
|
92
98
|
const lateProperties: Record<string, Promise<unknown>> = {};
|
|
99
|
+
const allEvents = metadata.getAllEvents();
|
|
100
|
+
const allProperties = metadata.getAllProperties();
|
|
93
101
|
for (settingsKey in settings) {
|
|
94
102
|
const value = settings[settingsKey];
|
|
95
103
|
if (isBindingToolkitExpression(value)) {
|
|
96
104
|
const bindingToolkitExpression: BindingToolkitExpression<unknown> = value;
|
|
97
105
|
if (isConstant(bindingToolkitExpression)) {
|
|
98
106
|
settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
|
|
107
|
+
} else if (!Object.hasOwnProperty.call(allProperties, settingsKey)) {
|
|
108
|
+
// Aggregation case - we need to compile the expression but as an object
|
|
109
|
+
if (isPathInModelExpression(bindingToolkitExpression)) {
|
|
110
|
+
settings[settingsKey] = { path: bindingToolkitExpression.path, model: bindingToolkitExpression.modelName };
|
|
111
|
+
}
|
|
99
112
|
} else {
|
|
100
113
|
settings[settingsKey] = compileExpression(bindingToolkitExpression);
|
|
101
114
|
}
|
|
@@ -103,12 +116,16 @@ function processProperties(metadata: ManagedObjectMetadata, settings: Record<str
|
|
|
103
116
|
lateProperties[settingsKey] = value as Promise<unknown>;
|
|
104
117
|
delete settings[settingsKey];
|
|
105
118
|
} else if (typeof value === "string" && !value.startsWith("{")) {
|
|
106
|
-
const propertyType = (
|
|
119
|
+
const propertyType = (allProperties[settingsKey] as { getType?: Function })?.getType?.();
|
|
107
120
|
if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
|
|
108
121
|
settings[settingsKey] = propertyType.parseValue(value);
|
|
109
122
|
}
|
|
110
|
-
} else if (typeof value === "object" && (value as BindingInfoHolder).__bindingInfo) {
|
|
111
|
-
settings[settingsKey] = (value as BindingInfoHolder).__bindingInfo;
|
|
123
|
+
} else if (typeof value === "object" && (value as BindingInfoHolder<unknown>).__bindingInfo) {
|
|
124
|
+
settings[settingsKey] = (value as BindingInfoHolder<unknown>).__bindingInfo;
|
|
125
|
+
} else if (value === undefined) {
|
|
126
|
+
if (Object.hasOwnProperty.call(allEvents, settingsKey)) {
|
|
127
|
+
delete settings[settingsKey];
|
|
128
|
+
}
|
|
112
129
|
}
|
|
113
130
|
}
|
|
114
131
|
return lateProperties;
|
|
@@ -160,6 +177,7 @@ const jsxControl = function <T extends Element>(
|
|
|
160
177
|
if (key !== undefined) {
|
|
161
178
|
settings["key"] = key;
|
|
162
179
|
}
|
|
180
|
+
const lateProperties = processProperties(metadata, settings);
|
|
163
181
|
processCommand(metadata, settings);
|
|
164
182
|
processAggregations(metadata, settings);
|
|
165
183
|
const classDef = settings.class;
|
|
@@ -172,7 +190,6 @@ const jsxControl = function <T extends Element>(
|
|
|
172
190
|
delete settings.binding;
|
|
173
191
|
delete settings[FL_DELEGATE];
|
|
174
192
|
delete settings[DT_DESIGNTIME];
|
|
175
|
-
const lateProperties = processProperties(metadata, settings);
|
|
176
193
|
const targetControlInstance = new ControlType(settings as $ControlSettings);
|
|
177
194
|
if (classDef) {
|
|
178
195
|
targetControlInstance.addStyleClass(classDef);
|
|
@@ -14,10 +14,15 @@ sap.ui.define([], function () {
|
|
|
14
14
|
renderManager.openStart(type);
|
|
15
15
|
}
|
|
16
16
|
for (const mSetting in mSettings) {
|
|
17
|
-
if (mSetting !== "children" && mSetting !== "ref") {
|
|
17
|
+
if (mSetting !== "children" && mSetting !== "ref" && mSetting !== "class") {
|
|
18
18
|
renderManager.attr(mSetting, mSettings[mSetting]);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
+
if (mSettings.class) {
|
|
22
|
+
mSettings.class.split(" ").forEach(className => {
|
|
23
|
+
renderManager.class(className);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
21
26
|
renderManager.openEnd();
|
|
22
27
|
}
|
|
23
28
|
const children = mSettings.children;
|
|
@@ -45,4 +50,4 @@ sap.ui.define([], function () {
|
|
|
45
50
|
};
|
|
46
51
|
return jsxRenderManager;
|
|
47
52
|
}, false);
|
|
48
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqc3hSZW5kZXJNYW5hZ2VyIiwidHlwZSIsIm1TZXR0aW5ncyIsImtleSIsInJlbmRlck1hbmFnZXIiLCJyZWYiLCJvcGVuU3RhcnQiLCJtU2V0dGluZyIsImF0dHIiLCJjbGFzcyIsInNwbGl0IiwiZm9yRWFjaCIsImNsYXNzTmFtZSIsIm9wZW5FbmQiLCJjaGlsZHJlbiIsIkFycmF5IiwiaXNBcnJheSIsImNoaWxkIiwidGV4dCIsInRvU3RyaW5nIiwidW5kZWZpbmVkIiwicmVuZGVyQ29udHJvbCIsImNsb3NlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJqc3gtcmVuZGVyTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBSZW5kZXJNYW5hZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9SZW5kZXJNYW5hZ2VyXCI7XG5cbmNvbnN0IGpzeFJlbmRlck1hbmFnZXIgPSBmdW5jdGlvbiAoXG5cdHR5cGU6IHN0cmluZyB8IEZ1bmN0aW9uLFxuXHRtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdGtleTogc3RyaW5nLFxuXHRyZW5kZXJNYW5hZ2VyOiBSZW5kZXJNYW5hZ2VyXG4pOiBGdW5jdGlvbiB7XG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRpZiAobVNldHRpbmdzLnJlZikge1xuXHRcdFx0XHRyZW5kZXJNYW5hZ2VyLm9wZW5TdGFydCh0eXBlLCBtU2V0dGluZ3MucmVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbmRlck1hbmFnZXIub3BlblN0YXJ0KHR5cGUpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBtU2V0dGluZyBpbiBtU2V0dGluZ3MpIHtcblx0XHRcdFx0aWYgKG1TZXR0aW5nICE9PSBcImNoaWxkcmVuXCIgJiYgbVNldHRpbmcgIT09IFwicmVmXCIgJiYgbVNldHRpbmcgIT09IFwiY2xhc3NcIikge1xuXHRcdFx0XHRcdHJlbmRlck1hbmFnZXIuYXR0cihtU2V0dGluZywgbVNldHRpbmdzW21TZXR0aW5nXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChtU2V0dGluZ3MuY2xhc3MpIHtcblx0XHRcdFx0bVNldHRpbmdzLmNsYXNzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLmNsYXNzKGNsYXNzTmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0cmVuZGVyTWFuYWdlci5vcGVuRW5kKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkcmVuID0gbVNldHRpbmdzLmNoaWxkcmVuIGFzIChzdHJpbmcgfCBGdW5jdGlvbiB8IENvbnRyb2wpIHwgKHN0cmluZyB8IEZ1bmN0aW9uIHwgQ29udHJvbClbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRcdGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGNoaWxkID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLnRleHQoY2hpbGQudG9TdHJpbmcoKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRjaGlsZCgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNoaWxkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZW5kZXJNYW5hZ2VyLnJlbmRlckNvbnRyb2woY2hpbGQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY2hpbGRyZW4gPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNoaWxkcmVuID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0cmVuZGVyTWFuYWdlci50ZXh0KGNoaWxkcmVuLnRvU3RyaW5nKCkpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdGNoaWxkcmVuKCk7XG5cdFx0fSBlbHNlIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZW5kZXJNYW5hZ2VyLnJlbmRlckNvbnRyb2woY2hpbGRyZW4pO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cmVuZGVyTWFuYWdlci5jbG9zZSh0eXBlKTtcblx0XHR9XG5cdH07XG59O1xuZXhwb3J0IGRlZmF1bHQganN4UmVuZGVyTWFuYWdlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztFQUdBLE1BQU1BLGdCQUFnQixHQUFHLFNBQUFBLENBQ3hCQyxJQUF1QixFQUN2QkMsU0FBaUMsRUFDakNDLEdBQVcsRUFDWEMsYUFBNEIsRUFDakI7SUFDWCxPQUFPLE1BQU07TUFDWixJQUFJLE9BQU9ILElBQUksS0FBSyxRQUFRLEVBQUU7UUFDN0IsSUFBSUMsU0FBUyxDQUFDRyxHQUFHLEVBQUU7VUFDbEJELGFBQWEsQ0FBQ0UsU0FBUyxDQUFDTCxJQUFJLEVBQUVDLFNBQVMsQ0FBQ0csR0FBRyxDQUFDO1FBQzdDLENBQUMsTUFBTTtVQUNORCxhQUFhLENBQUNFLFNBQVMsQ0FBQ0wsSUFBSSxDQUFDO1FBQzlCO1FBQ0EsS0FBSyxNQUFNTSxRQUFRLElBQUlMLFNBQVMsRUFBRTtVQUNqQyxJQUFJSyxRQUFRLEtBQUssVUFBVSxJQUFJQSxRQUFRLEtBQUssS0FBSyxJQUFJQSxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQzFFSCxhQUFhLENBQUNJLElBQUksQ0FBQ0QsUUFBUSxFQUFFTCxTQUFTLENBQUNLLFFBQVEsQ0FBQyxDQUFDO1VBQ2xEO1FBQ0Q7UUFDQSxJQUFJTCxTQUFTLENBQUNPLEtBQUssRUFBRTtVQUNwQlAsU0FBUyxDQUFDTyxLQUFLLENBQUNDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsT0FBTyxDQUFFQyxTQUFTLElBQUs7WUFDakRSLGFBQWEsQ0FBQ0ssS0FBSyxDQUFDRyxTQUFTLENBQUM7VUFDL0IsQ0FBQyxDQUFDO1FBQ0g7UUFDQVIsYUFBYSxDQUFDUyxPQUFPLENBQUMsQ0FBQztNQUN4QjtNQUNBLE1BQU1DLFFBQVEsR0FBR1osU0FBUyxDQUFDWSxRQUEyRTtNQUN0RyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsUUFBUSxDQUFDLEVBQUU7UUFDNUJBLFFBQVEsQ0FBQ0gsT0FBTyxDQUFFTSxLQUFLLElBQUs7VUFDM0IsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksT0FBT0EsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN6RmIsYUFBYSxDQUFDYyxJQUFJLENBQUNELEtBQUssQ0FBQ0UsUUFBUSxDQUFDLENBQUMsQ0FBQztVQUNyQyxDQUFDLE1BQU0sSUFBSSxPQUFPRixLQUFLLEtBQUssVUFBVSxFQUFFO1lBQ3ZDQSxLQUFLLENBQUMsQ0FBQztVQUNSLENBQUMsTUFBTSxJQUFJQSxLQUFLLEtBQUtHLFNBQVMsRUFBRTtZQUMvQmhCLGFBQWEsQ0FBQ2lCLGFBQWEsQ0FBQ0osS0FBSyxDQUFDO1VBQ25DO1FBQ0QsQ0FBQyxDQUFDO01BQ0gsQ0FBQyxNQUFNLElBQUksT0FBT0gsUUFBUSxLQUFLLFFBQVEsSUFBSSxPQUFPQSxRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU9BLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDekdWLGFBQWEsQ0FBQ2MsSUFBSSxDQUFDSixRQUFRLENBQUNLLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDeEMsQ0FBQyxNQUFNLElBQUksT0FBT0wsUUFBUSxLQUFLLFVBQVUsRUFBRTtRQUMxQ0EsUUFBUSxDQUFDLENBQUM7TUFDWCxDQUFDLE1BQU0sSUFBSUEsUUFBUSxLQUFLTSxTQUFTLEVBQUU7UUFDbENoQixhQUFhLENBQUNpQixhQUFhLENBQUNQLFFBQVEsQ0FBQztNQUN0QztNQUVBLElBQUksT0FBT2IsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM3QkcsYUFBYSxDQUFDa0IsS0FBSyxDQUFDckIsSUFBSSxDQUFDO01BQzFCO0lBQ0QsQ0FBQztFQUNGLENBQUM7RUFBQyxPQUNhRCxnQkFBZ0I7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|