@surfside/ads-core 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -15
- package/lib/cjs/Api.js +195 -0
- package/lib/cjs/Api.js.map +1 -0
- package/lib/cjs/helpers/Generator.js +50 -0
- package/lib/cjs/helpers/Generator.js.map +1 -0
- package/lib/cjs/helpers/Handlebars.js +270 -0
- package/lib/cjs/helpers/Handlebars.js.map +1 -0
- package/lib/cjs/helpers/NativeRequestBuilder.js +174 -0
- package/lib/cjs/helpers/NativeRequestBuilder.js.map +1 -0
- package/lib/cjs/helpers/RequestBuilder.js +160 -0
- package/lib/cjs/helpers/RequestBuilder.js.map +1 -0
- package/lib/cjs/helpers/TryGet.js +14 -0
- package/lib/cjs/helpers/TryGet.js.map +1 -0
- package/lib/cjs/helpers/Window.js +24 -0
- package/lib/cjs/helpers/Window.js.map +1 -0
- package/lib/cjs/helpers/index.js +24 -0
- package/lib/cjs/helpers/index.js.map +1 -0
- package/lib/cjs/helpers/response/Banner.js +4 -0
- package/lib/cjs/helpers/response/Banner.js.map +1 -0
- package/lib/cjs/helpers/response/BuiltResponse.js +27 -0
- package/lib/cjs/helpers/response/BuiltResponse.js.map +1 -0
- package/lib/cjs/helpers/response/Carousel.js +282 -0
- package/lib/cjs/helpers/response/Carousel.js.map +1 -0
- package/lib/cjs/helpers/response/Clickthrough.js +24 -0
- package/lib/cjs/helpers/response/Clickthrough.js.map +1 -0
- package/lib/cjs/helpers/response/ProductCard.js +198 -0
- package/lib/cjs/helpers/response/ProductCard.js.map +1 -0
- package/lib/cjs/helpers/response/Video.js +4 -0
- package/lib/cjs/helpers/response/Video.js.map +1 -0
- package/lib/cjs/helpers/response/index.js +23 -0
- package/lib/cjs/helpers/response/index.js.map +1 -0
- package/lib/cjs/index.js +21 -3488
- package/lib/cjs/index.js.map +1 -54
- package/lib/cjs/models/dynamic/DynamicZone.js +12 -0
- package/lib/cjs/models/dynamic/DynamicZone.js.map +1 -0
- package/lib/cjs/models/dynamic/index.js +18 -0
- package/lib/cjs/models/dynamic/index.js.map +1 -0
- package/lib/cjs/models/index.js +22 -0
- package/lib/cjs/models/index.js.map +1 -0
- package/lib/cjs/models/retail/Configuration.js +10 -0
- package/lib/cjs/models/retail/Configuration.js.map +1 -0
- package/lib/cjs/models/retail/Product.js +4 -0
- package/lib/cjs/models/retail/Product.js.map +1 -0
- package/lib/cjs/models/retail/Recommended.js +3 -0
- package/lib/cjs/models/retail/Recommended.js.map +1 -0
- package/lib/cjs/models/retail/index.js +20 -0
- package/lib/cjs/models/retail/index.js.map +1 -0
- package/lib/cjs/models/rtb/BidRequest.js +20 -0
- package/lib/cjs/models/rtb/BidRequest.js.map +1 -0
- package/lib/cjs/models/rtb/BidResponse.js +3 -0
- package/lib/cjs/models/rtb/BidResponse.js.map +1 -0
- package/lib/cjs/models/rtb/NativeRequest.js +122 -0
- package/lib/cjs/models/rtb/NativeRequest.js.map +1 -0
- package/lib/cjs/models/rtb/NativeResponse.js +26 -0
- package/lib/cjs/models/rtb/NativeResponse.js.map +1 -0
- package/lib/cjs/models/rtb/index.js +21 -0
- package/lib/cjs/models/rtb/index.js.map +1 -0
- package/lib/cjs/models/tracking/Geo.js +3 -0
- package/lib/cjs/models/tracking/Geo.js.map +1 -0
- package/lib/cjs/models/tracking/index.js +18 -0
- package/lib/cjs/models/tracking/index.js.map +1 -0
- package/lib/cjs/models/vast/Vast.js +4 -0
- package/lib/cjs/models/vast/Vast.js.map +1 -0
- package/lib/cjs/models/vast/index.js +18 -0
- package/lib/cjs/models/vast/index.js.map +1 -0
- package/lib/cjs/services/Bidder.js +128 -0
- package/lib/cjs/services/Bidder.js.map +1 -0
- package/lib/cjs/services/Configuration.js +93 -0
- package/lib/cjs/services/Configuration.js.map +1 -0
- package/lib/cjs/services/Device.js +236 -0
- package/lib/cjs/services/Device.js.map +1 -0
- package/lib/cjs/services/Dynamic.js +129 -0
- package/lib/cjs/services/Dynamic.js.map +1 -0
- package/lib/cjs/services/Geo.js +35 -0
- package/lib/cjs/services/Geo.js.map +1 -0
- package/lib/cjs/services/Logger.js +57 -0
- package/lib/cjs/services/Logger.js.map +1 -0
- package/lib/cjs/services/Memoization.js +17 -0
- package/lib/cjs/services/Memoization.js.map +1 -0
- package/lib/cjs/services/Product.js +127 -0
- package/lib/cjs/services/Product.js.map +1 -0
- package/lib/cjs/services/Recommender.js +83 -0
- package/lib/cjs/services/Recommender.js.map +1 -0
- package/lib/cjs/services/Result.js +220 -0
- package/lib/cjs/services/Result.js.map +1 -0
- package/lib/cjs/services/Template.js +43 -0
- package/lib/cjs/services/Template.js.map +1 -0
- package/lib/cjs/services/index.js +28 -0
- package/lib/cjs/services/index.js.map +1 -0
- package/lib/cjs/services/mock/Bidder.js +3 -0
- package/lib/cjs/services/mock/Bidder.js.map +1 -0
- package/lib/cjs/services/mock/index.js +18 -0
- package/lib/cjs/services/mock/index.js.map +1 -0
- package/lib/esm/Api.js +183 -0
- package/lib/esm/Api.js.map +1 -0
- package/lib/esm/helpers/Generator.js +42 -0
- package/lib/esm/helpers/Generator.js.map +1 -0
- package/lib/esm/helpers/Handlebars.js +251 -0
- package/lib/esm/helpers/Handlebars.js.map +1 -0
- package/lib/esm/helpers/NativeRequestBuilder.js +169 -0
- package/lib/esm/helpers/NativeRequestBuilder.js.map +1 -0
- package/lib/esm/helpers/RequestBuilder.js +157 -0
- package/lib/esm/helpers/RequestBuilder.js.map +1 -0
- package/lib/esm/helpers/TryGet.js +10 -0
- package/lib/esm/helpers/TryGet.js.map +1 -0
- package/lib/esm/helpers/Window.js +20 -0
- package/lib/esm/helpers/Window.js.map +1 -0
- package/lib/esm/helpers/index.js +8 -0
- package/lib/esm/helpers/index.js.map +1 -0
- package/lib/esm/helpers/response/Banner.js +3 -0
- package/lib/esm/helpers/response/Banner.js.map +1 -0
- package/lib/esm/helpers/response/BuiltResponse.js +22 -0
- package/lib/esm/helpers/response/BuiltResponse.js.map +1 -0
- package/lib/esm/helpers/response/Carousel.js +273 -0
- package/lib/esm/helpers/response/Carousel.js.map +1 -0
- package/lib/esm/helpers/response/Clickthrough.js +20 -0
- package/lib/esm/helpers/response/Clickthrough.js.map +1 -0
- package/lib/esm/helpers/response/ProductCard.js +189 -0
- package/lib/esm/helpers/response/ProductCard.js.map +1 -0
- package/lib/esm/helpers/response/Video.js +3 -0
- package/lib/esm/helpers/response/Video.js.map +1 -0
- package/lib/esm/helpers/response/index.js +7 -0
- package/lib/esm/helpers/response/index.js.map +1 -0
- package/lib/esm/index.js +5 -3460
- package/lib/esm/index.js.map +1 -54
- package/lib/esm/models/dynamic/DynamicZone.js +11 -0
- package/lib/esm/models/dynamic/DynamicZone.js.map +1 -0
- package/lib/esm/models/dynamic/index.js +2 -0
- package/lib/esm/models/dynamic/index.js.map +1 -0
- package/lib/esm/models/index.js +6 -0
- package/lib/esm/models/index.js.map +1 -0
- package/lib/esm/models/retail/Configuration.js +9 -0
- package/lib/esm/models/retail/Configuration.js.map +1 -0
- package/lib/esm/models/retail/Product.js +3 -0
- package/lib/esm/models/retail/Product.js.map +1 -0
- package/lib/esm/models/retail/Recommended.js +2 -0
- package/lib/esm/models/retail/Recommended.js.map +1 -0
- package/lib/esm/models/retail/index.js +4 -0
- package/lib/esm/models/retail/index.js.map +1 -0
- package/lib/esm/models/rtb/BidRequest.js +17 -0
- package/lib/esm/models/rtb/BidRequest.js.map +1 -0
- package/lib/esm/models/rtb/BidResponse.js +2 -0
- package/lib/esm/models/rtb/BidResponse.js.map +1 -0
- package/lib/esm/models/rtb/NativeRequest.js +119 -0
- package/lib/esm/models/rtb/NativeRequest.js.map +1 -0
- package/lib/esm/models/rtb/NativeResponse.js +23 -0
- package/lib/esm/models/rtb/NativeResponse.js.map +1 -0
- package/lib/esm/models/rtb/index.js +5 -0
- package/lib/esm/models/rtb/index.js.map +1 -0
- package/lib/esm/models/tracking/Geo.js +2 -0
- package/lib/esm/models/tracking/Geo.js.map +1 -0
- package/lib/esm/models/tracking/index.js +2 -0
- package/lib/esm/models/tracking/index.js.map +1 -0
- package/lib/esm/models/vast/Vast.js +3 -0
- package/lib/esm/models/vast/Vast.js.map +1 -0
- package/lib/esm/models/vast/index.js +2 -0
- package/lib/esm/models/vast/index.js.map +1 -0
- package/lib/esm/services/Bidder.js +119 -0
- package/lib/esm/services/Bidder.js.map +1 -0
- package/lib/esm/services/Configuration.js +56 -0
- package/lib/esm/services/Configuration.js.map +1 -0
- package/lib/esm/services/Device.js +232 -0
- package/lib/esm/services/Device.js.map +1 -0
- package/lib/esm/services/Dynamic.js +120 -0
- package/lib/esm/services/Dynamic.js.map +1 -0
- package/lib/esm/services/Geo.js +30 -0
- package/lib/esm/services/Geo.js.map +1 -0
- package/lib/esm/services/Logger.js +52 -0
- package/lib/esm/services/Logger.js.map +1 -0
- package/lib/esm/services/Memoization.js +13 -0
- package/lib/esm/services/Memoization.js.map +1 -0
- package/lib/esm/services/Product.js +120 -0
- package/lib/esm/services/Product.js.map +1 -0
- package/lib/esm/services/Recommender.js +78 -0
- package/lib/esm/services/Recommender.js.map +1 -0
- package/lib/esm/services/Result.js +199 -0
- package/lib/esm/services/Result.js.map +1 -0
- package/lib/esm/services/Template.js +38 -0
- package/lib/esm/services/Template.js.map +1 -0
- package/lib/esm/services/index.js +12 -0
- package/lib/esm/services/index.js.map +1 -0
- package/lib/esm/services/mock/Bidder.js +2 -0
- package/lib/esm/services/mock/Bidder.js.map +1 -0
- package/lib/esm/services/mock/index.js +2 -0
- package/lib/esm/services/mock/index.js.map +1 -0
- package/lib/types/Api.d.ts +5 -5
- package/lib/types/helpers/Handlebars.d.ts +3 -3
- package/lib/types/helpers/NativeRequestBuilder.d.ts +1 -1
- package/lib/types/helpers/RequestBuilder.d.ts +1 -1
- package/lib/types/helpers/TryGet.d.ts +1 -1
- package/lib/types/helpers/Window.d.ts +2 -2
- package/lib/types/helpers/response/Banner.d.ts +1 -1
- package/lib/types/helpers/response/BuiltResponse.d.ts +1 -1
- package/lib/types/helpers/response/Carousel.d.ts +1 -1
- package/lib/types/helpers/response/Clickthrough.d.ts +1 -1
- package/lib/types/helpers/response/ProductCard.d.ts +3 -3
- package/lib/types/helpers/response/Video.d.ts +2 -2
- package/lib/types/services/Bidder.d.ts +3 -3
- package/lib/types/services/Configuration.d.ts +1 -1
- package/lib/types/services/Dynamic.d.ts +6 -6
- package/lib/types/services/Geo.d.ts +1 -1
- package/lib/types/services/Product.d.ts +1 -1
- package/lib/types/services/Template.d.ts +3 -3
- package/package.json +41 -33
- package/lib/index.js +0 -1
- package/lib/index.js.map +0 -1
- package/lib/types/constant-values/index.d.ts +0 -46
- package/lib/types/errors/index.d.ts +0 -3
- package/lib/types/helpers/generators/CollectN.d.ts +0 -2
- package/lib/types/helpers/generators/index.d.ts +0 -1
- package/lib/types/helpers/handlebars/index.d.ts +0 -119
- package/lib/types/helpers/requests/RequestBuilder.d.ts +0 -124
- package/lib/types/helpers/requests/SimpleBannerRequest.d.ts +0 -26
- package/lib/types/helpers/requests/index.d.ts +0 -2
- package/lib/types/helpers/responses/BuildBannerResponse.d.ts +0 -10
- package/lib/types/helpers/responses/BuildNativeResponse.d.ts +0 -21
- package/lib/types/helpers/responses/BuildVideoResponse.d.ts +0 -0
- package/lib/types/helpers/responses/ClickthroughHelpers.d.ts +0 -2
- package/lib/types/helpers/responses/VastHelpers.d.ts +0 -4
- package/lib/types/helpers/responses/index.d.ts +0 -4
- package/lib/types/middleware/DeviceMiddleware.d.ts +0 -3
- package/lib/types/middleware/GeoMiddleware.d.ts +0 -3
- package/lib/types/middleware/IdentityMiddleware.d.ts +0 -4
- package/lib/types/middleware/index.d.ts +0 -3
- package/lib/types/models/retail/IProductInformation.d.ts +0 -37
- package/lib/types/models/retail/IPublisherConfiguration.d.ts +0 -64
- package/lib/types/models/retail/IRecommenderResponse.d.ts +0 -10
- package/lib/types/models/rtb/IBidRequest.d.ts +0 -399
- package/lib/types/models/rtb/IBidResponse.d.ts +0 -47
- package/lib/types/models/rtb/native/Constants.d.ts +0 -60
- package/lib/types/models/rtb/native/INativeRequest.d.ts +0 -54
- package/lib/types/models/rtb/native/INativeResponse.d.ts +0 -60
- package/lib/types/models/rtb/native/NativeConstants.d.ts +0 -120
- package/lib/types/models/rtb/native/NativeRequestBuilder.d.ts +0 -158
- package/lib/types/models/rtb/native/index.d.ts +0 -4
- package/lib/types/models/tracking/IEvents.d.ts +0 -82
- package/lib/types/models/tracking/IGeoContext.d.ts +0 -14
- package/lib/types/models/tracking/IUserID.d.ts +0 -1
- package/lib/types/services/OverrideService.d.ts +0 -10
- package/lib/types/services/logger/ILoggerService.d.ts +0 -39
- package/lib/types/services/logger/LocalLoggerService.d.ts +0 -19
- package/lib/types/services/logger/index.d.ts +0 -2
- package/lib/types/services/product-feed/IProductFeedService.d.ts +0 -5
- package/lib/types/services/product-feed/SurfsideProductFeedService.d.ts +0 -11
- package/lib/types/services/product-feed/index.d.ts +0 -2
- package/lib/types/services/recommender/IRecommenderService.d.ts +0 -47
- package/lib/types/services/recommender/SurfsideRecommenderService.d.ts +0 -31
- package/lib/types/services/recommender/index.d.ts +0 -2
- package/lib/types/services/rtb/bidder/IBidderService.d.ts +0 -12
- package/lib/types/services/rtb/bidder/SurfsideBidderService.d.ts +0 -28
- package/lib/types/services/rtb/bidder/index.d.ts +0 -2
- package/lib/types/services/rtb/configuration/IConfigurationService.d.ts +0 -14
- package/lib/types/services/rtb/configuration/SurfsideConfigurationService.d.ts +0 -29
- package/lib/types/services/rtb/configuration/index.d.ts +0 -2
- package/lib/types/services/rtb/index.d.ts +0 -2
- package/lib/types/services/tracking/device/DeviceOverrideService.d.ts +0 -8
- package/lib/types/services/tracking/device/IDeviceService.d.ts +0 -4
- package/lib/types/services/tracking/device/SurfsideDeviceService.d.ts +0 -16
- package/lib/types/services/tracking/device/index.d.ts +0 -3
- package/lib/types/services/tracking/events/IEventService.d.ts +0 -5
- package/lib/types/services/tracking/events/SurfsideEventService.d.ts +0 -42
- package/lib/types/services/tracking/events/index.d.ts +0 -2
- package/lib/types/services/tracking/geo/GeoOverrideService.d.ts +0 -8
- package/lib/types/services/tracking/geo/IGeoService.d.ts +0 -12
- package/lib/types/services/tracking/geo/SurfsideGeoService.d.ts +0 -7
- package/lib/types/services/tracking/geo/index.d.ts +0 -3
- package/lib/types/services/tracking/index.d.ts +0 -4
- package/lib/types/services/tracking/user/IUserIDService.d.ts +0 -4
- package/lib/types/services/tracking/user/SurfsideUserIDService.d.ts +0 -7
- package/lib/types/services/tracking/user/UserOverrideService.d.ts +0 -8
- package/lib/types/services/tracking/user/index.d.ts +0 -3
- package/lib/types/utils/Protocol.d.ts +0 -1
- package/lib/types/utils/Rendering.d.ts +0 -44
- package/lib/types/utils/index.d.ts +0 -2
package/lib/esm/index.js
CHANGED
|
@@ -1,3460 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
7
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
8
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
9
|
-
for (let key of __getOwnPropNames(mod))
|
|
10
|
-
if (!__hasOwnProp.call(to, key))
|
|
11
|
-
__defProp(to, key, {
|
|
12
|
-
get: () => mod[key],
|
|
13
|
-
enumerable: true
|
|
14
|
-
});
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
18
|
-
|
|
19
|
-
// node_modules/handlebars/dist/cjs/handlebars/utils.js
|
|
20
|
-
var require_utils = __commonJS((exports) => {
|
|
21
|
-
exports.__esModule = true;
|
|
22
|
-
exports.extend = extend;
|
|
23
|
-
exports.indexOf = indexOf;
|
|
24
|
-
exports.escapeExpression = escapeExpression;
|
|
25
|
-
exports.isEmpty = isEmpty;
|
|
26
|
-
exports.createFrame = createFrame;
|
|
27
|
-
exports.blockParams = blockParams;
|
|
28
|
-
exports.appendContextPath = appendContextPath;
|
|
29
|
-
var escape = {
|
|
30
|
-
"&": "&",
|
|
31
|
-
"<": "<",
|
|
32
|
-
">": ">",
|
|
33
|
-
'"': """,
|
|
34
|
-
"'": "'",
|
|
35
|
-
"`": "`",
|
|
36
|
-
"=": "="
|
|
37
|
-
};
|
|
38
|
-
var badChars = /[&<>"'`=]/g;
|
|
39
|
-
var possible = /[&<>"'`=]/;
|
|
40
|
-
function escapeChar(chr) {
|
|
41
|
-
return escape[chr];
|
|
42
|
-
}
|
|
43
|
-
function extend(obj) {
|
|
44
|
-
for (var i = 1;i < arguments.length; i++) {
|
|
45
|
-
for (var key in arguments[i]) {
|
|
46
|
-
if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
|
|
47
|
-
obj[key] = arguments[i][key];
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return obj;
|
|
52
|
-
}
|
|
53
|
-
var toString = Object.prototype.toString;
|
|
54
|
-
exports.toString = toString;
|
|
55
|
-
var isFunction = function isFunction(value) {
|
|
56
|
-
return typeof value === "function";
|
|
57
|
-
};
|
|
58
|
-
if (isFunction(/x/)) {
|
|
59
|
-
exports.isFunction = isFunction = function(value) {
|
|
60
|
-
return typeof value === "function" && toString.call(value) === "[object Function]";
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
exports.isFunction = isFunction;
|
|
64
|
-
var isArray = Array.isArray || function(value) {
|
|
65
|
-
return value && typeof value === "object" ? toString.call(value) === "[object Array]" : false;
|
|
66
|
-
};
|
|
67
|
-
exports.isArray = isArray;
|
|
68
|
-
function indexOf(array2, value) {
|
|
69
|
-
for (var i = 0, len = array2.length;i < len; i++) {
|
|
70
|
-
if (array2[i] === value) {
|
|
71
|
-
return i;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return -1;
|
|
75
|
-
}
|
|
76
|
-
function escapeExpression(string) {
|
|
77
|
-
if (typeof string !== "string") {
|
|
78
|
-
if (string && string.toHTML) {
|
|
79
|
-
return string.toHTML();
|
|
80
|
-
} else if (string == null) {
|
|
81
|
-
return "";
|
|
82
|
-
} else if (!string) {
|
|
83
|
-
return string + "";
|
|
84
|
-
}
|
|
85
|
-
string = "" + string;
|
|
86
|
-
}
|
|
87
|
-
if (!possible.test(string)) {
|
|
88
|
-
return string;
|
|
89
|
-
}
|
|
90
|
-
return string.replace(badChars, escapeChar);
|
|
91
|
-
}
|
|
92
|
-
function isEmpty(value) {
|
|
93
|
-
if (!value && value !== 0) {
|
|
94
|
-
return true;
|
|
95
|
-
} else if (isArray(value) && value.length === 0) {
|
|
96
|
-
return true;
|
|
97
|
-
} else {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
function createFrame(object) {
|
|
102
|
-
var frame = extend({}, object);
|
|
103
|
-
frame._parent = object;
|
|
104
|
-
return frame;
|
|
105
|
-
}
|
|
106
|
-
function blockParams(params, ids) {
|
|
107
|
-
params.path = ids;
|
|
108
|
-
return params;
|
|
109
|
-
}
|
|
110
|
-
function appendContextPath(contextPath, id) {
|
|
111
|
-
return (contextPath ? contextPath + "." : "") + id;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
// node_modules/handlebars/dist/cjs/handlebars/exception.js
|
|
116
|
-
var require_exception = __commonJS((exports, module) => {
|
|
117
|
-
exports.__esModule = true;
|
|
118
|
-
var errorProps = ["description", "fileName", "lineNumber", "endLineNumber", "message", "name", "number", "stack"];
|
|
119
|
-
function Exception(message, node) {
|
|
120
|
-
var loc = node && node.loc, line = undefined, endLineNumber = undefined, column = undefined, endColumn = undefined;
|
|
121
|
-
if (loc) {
|
|
122
|
-
line = loc.start.line;
|
|
123
|
-
endLineNumber = loc.end.line;
|
|
124
|
-
column = loc.start.column;
|
|
125
|
-
endColumn = loc.end.column;
|
|
126
|
-
message += " - " + line + ":" + column;
|
|
127
|
-
}
|
|
128
|
-
var tmp = Error.prototype.constructor.call(this, message);
|
|
129
|
-
for (var idx = 0;idx < errorProps.length; idx++) {
|
|
130
|
-
this[errorProps[idx]] = tmp[errorProps[idx]];
|
|
131
|
-
}
|
|
132
|
-
if (Error.captureStackTrace) {
|
|
133
|
-
Error.captureStackTrace(this, Exception);
|
|
134
|
-
}
|
|
135
|
-
try {
|
|
136
|
-
if (loc) {
|
|
137
|
-
this.lineNumber = line;
|
|
138
|
-
this.endLineNumber = endLineNumber;
|
|
139
|
-
if (Object.defineProperty) {
|
|
140
|
-
Object.defineProperty(this, "column", {
|
|
141
|
-
value: column,
|
|
142
|
-
enumerable: true
|
|
143
|
-
});
|
|
144
|
-
Object.defineProperty(this, "endColumn", {
|
|
145
|
-
value: endColumn,
|
|
146
|
-
enumerable: true
|
|
147
|
-
});
|
|
148
|
-
} else {
|
|
149
|
-
this.column = column;
|
|
150
|
-
this.endColumn = endColumn;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
} catch (nop) {}
|
|
154
|
-
}
|
|
155
|
-
Exception.prototype = new Error;
|
|
156
|
-
exports.default = Exception;
|
|
157
|
-
module.exports = exports["default"];
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js
|
|
161
|
-
var require_block_helper_missing = __commonJS((exports, module) => {
|
|
162
|
-
exports.__esModule = true;
|
|
163
|
-
var _utils = require_utils();
|
|
164
|
-
exports.default = function(instance) {
|
|
165
|
-
instance.registerHelper("blockHelperMissing", function(context2, options) {
|
|
166
|
-
var { inverse, fn } = options;
|
|
167
|
-
if (context2 === true) {
|
|
168
|
-
return fn(this);
|
|
169
|
-
} else if (context2 === false || context2 == null) {
|
|
170
|
-
return inverse(this);
|
|
171
|
-
} else if (_utils.isArray(context2)) {
|
|
172
|
-
if (context2.length > 0) {
|
|
173
|
-
if (options.ids) {
|
|
174
|
-
options.ids = [options.name];
|
|
175
|
-
}
|
|
176
|
-
return instance.helpers.each(context2, options);
|
|
177
|
-
} else {
|
|
178
|
-
return inverse(this);
|
|
179
|
-
}
|
|
180
|
-
} else {
|
|
181
|
-
if (options.data && options.ids) {
|
|
182
|
-
var data = _utils.createFrame(options.data);
|
|
183
|
-
data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);
|
|
184
|
-
options = { data };
|
|
185
|
-
}
|
|
186
|
-
return fn(context2, options);
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
};
|
|
190
|
-
module.exports = exports["default"];
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers/each.js
|
|
194
|
-
var require_each = __commonJS((exports, module) => {
|
|
195
|
-
exports.__esModule = true;
|
|
196
|
-
function _interopRequireDefault(obj) {
|
|
197
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
198
|
-
}
|
|
199
|
-
var _utils = require_utils();
|
|
200
|
-
var _exception = require_exception();
|
|
201
|
-
var _exception2 = _interopRequireDefault(_exception);
|
|
202
|
-
exports.default = function(instance) {
|
|
203
|
-
instance.registerHelper("each", function(context2, options) {
|
|
204
|
-
if (!options) {
|
|
205
|
-
throw new _exception2["default"]("Must pass iterator to #each");
|
|
206
|
-
}
|
|
207
|
-
var { fn, inverse } = options, i = 0, ret = "", data = undefined, contextPath = undefined;
|
|
208
|
-
if (options.data && options.ids) {
|
|
209
|
-
contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + ".";
|
|
210
|
-
}
|
|
211
|
-
if (_utils.isFunction(context2)) {
|
|
212
|
-
context2 = context2.call(this);
|
|
213
|
-
}
|
|
214
|
-
if (options.data) {
|
|
215
|
-
data = _utils.createFrame(options.data);
|
|
216
|
-
}
|
|
217
|
-
function execIteration(field, index, last) {
|
|
218
|
-
if (data) {
|
|
219
|
-
data.key = field;
|
|
220
|
-
data.index = index;
|
|
221
|
-
data.first = index === 0;
|
|
222
|
-
data.last = !!last;
|
|
223
|
-
if (contextPath) {
|
|
224
|
-
data.contextPath = contextPath + field;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
ret = ret + fn(context2[field], {
|
|
228
|
-
data,
|
|
229
|
-
blockParams: _utils.blockParams([context2[field], field], [contextPath + field, null])
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
if (context2 && typeof context2 === "object") {
|
|
233
|
-
if (_utils.isArray(context2)) {
|
|
234
|
-
for (var j = context2.length;i < j; i++) {
|
|
235
|
-
if (i in context2) {
|
|
236
|
-
execIteration(i, i, i === context2.length - 1);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
} else if (typeof Symbol === "function" && context2[Symbol.iterator]) {
|
|
240
|
-
var newContext = [];
|
|
241
|
-
var iterator = context2[Symbol.iterator]();
|
|
242
|
-
for (var it = iterator.next();!it.done; it = iterator.next()) {
|
|
243
|
-
newContext.push(it.value);
|
|
244
|
-
}
|
|
245
|
-
context2 = newContext;
|
|
246
|
-
for (var j = context2.length;i < j; i++) {
|
|
247
|
-
execIteration(i, i, i === context2.length - 1);
|
|
248
|
-
}
|
|
249
|
-
} else {
|
|
250
|
-
(function() {
|
|
251
|
-
var priorKey = undefined;
|
|
252
|
-
Object.keys(context2).forEach(function(key) {
|
|
253
|
-
if (priorKey !== undefined) {
|
|
254
|
-
execIteration(priorKey, i - 1);
|
|
255
|
-
}
|
|
256
|
-
priorKey = key;
|
|
257
|
-
i++;
|
|
258
|
-
});
|
|
259
|
-
if (priorKey !== undefined) {
|
|
260
|
-
execIteration(priorKey, i - 1, true);
|
|
261
|
-
}
|
|
262
|
-
})();
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
if (i === 0) {
|
|
266
|
-
ret = inverse(this);
|
|
267
|
-
}
|
|
268
|
-
return ret;
|
|
269
|
-
});
|
|
270
|
-
};
|
|
271
|
-
module.exports = exports["default"];
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js
|
|
275
|
-
var require_helper_missing = __commonJS((exports, module) => {
|
|
276
|
-
exports.__esModule = true;
|
|
277
|
-
function _interopRequireDefault(obj) {
|
|
278
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
279
|
-
}
|
|
280
|
-
var _exception = require_exception();
|
|
281
|
-
var _exception2 = _interopRequireDefault(_exception);
|
|
282
|
-
exports.default = function(instance) {
|
|
283
|
-
instance.registerHelper("helperMissing", function() {
|
|
284
|
-
if (arguments.length === 1) {
|
|
285
|
-
return;
|
|
286
|
-
} else {
|
|
287
|
-
throw new _exception2["default"]('Missing helper: "' + arguments[arguments.length - 1].name + '"');
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
};
|
|
291
|
-
module.exports = exports["default"];
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers/if.js
|
|
295
|
-
var require_if = __commonJS((exports, module) => {
|
|
296
|
-
exports.__esModule = true;
|
|
297
|
-
function _interopRequireDefault(obj) {
|
|
298
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
299
|
-
}
|
|
300
|
-
var _utils = require_utils();
|
|
301
|
-
var _exception = require_exception();
|
|
302
|
-
var _exception2 = _interopRequireDefault(_exception);
|
|
303
|
-
exports.default = function(instance) {
|
|
304
|
-
instance.registerHelper("if", function(conditional, options) {
|
|
305
|
-
if (arguments.length != 2) {
|
|
306
|
-
throw new _exception2["default"]("#if requires exactly one argument");
|
|
307
|
-
}
|
|
308
|
-
if (_utils.isFunction(conditional)) {
|
|
309
|
-
conditional = conditional.call(this);
|
|
310
|
-
}
|
|
311
|
-
if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {
|
|
312
|
-
return options.inverse(this);
|
|
313
|
-
} else {
|
|
314
|
-
return options.fn(this);
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
instance.registerHelper("unless", function(conditional, options) {
|
|
318
|
-
if (arguments.length != 2) {
|
|
319
|
-
throw new _exception2["default"]("#unless requires exactly one argument");
|
|
320
|
-
}
|
|
321
|
-
return instance.helpers["if"].call(this, conditional, {
|
|
322
|
-
fn: options.inverse,
|
|
323
|
-
inverse: options.fn,
|
|
324
|
-
hash: options.hash
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
};
|
|
328
|
-
module.exports = exports["default"];
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers/log.js
|
|
332
|
-
var require_log = __commonJS((exports, module) => {
|
|
333
|
-
exports.__esModule = true;
|
|
334
|
-
exports.default = function(instance) {
|
|
335
|
-
instance.registerHelper("log", function() {
|
|
336
|
-
var args = [undefined], options = arguments[arguments.length - 1];
|
|
337
|
-
for (var i = 0;i < arguments.length - 1; i++) {
|
|
338
|
-
args.push(arguments[i]);
|
|
339
|
-
}
|
|
340
|
-
var level = 1;
|
|
341
|
-
if (options.hash.level != null) {
|
|
342
|
-
level = options.hash.level;
|
|
343
|
-
} else if (options.data && options.data.level != null) {
|
|
344
|
-
level = options.data.level;
|
|
345
|
-
}
|
|
346
|
-
args[0] = level;
|
|
347
|
-
instance.log.apply(instance, args);
|
|
348
|
-
});
|
|
349
|
-
};
|
|
350
|
-
module.exports = exports["default"];
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js
|
|
354
|
-
var require_lookup = __commonJS((exports, module) => {
|
|
355
|
-
exports.__esModule = true;
|
|
356
|
-
exports.default = function(instance) {
|
|
357
|
-
instance.registerHelper("lookup", function(obj, field, options) {
|
|
358
|
-
if (!obj) {
|
|
359
|
-
return obj;
|
|
360
|
-
}
|
|
361
|
-
return options.lookupProperty(obj, field);
|
|
362
|
-
});
|
|
363
|
-
};
|
|
364
|
-
module.exports = exports["default"];
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers/with.js
|
|
368
|
-
var require_with = __commonJS((exports, module) => {
|
|
369
|
-
exports.__esModule = true;
|
|
370
|
-
function _interopRequireDefault(obj) {
|
|
371
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
372
|
-
}
|
|
373
|
-
var _utils = require_utils();
|
|
374
|
-
var _exception = require_exception();
|
|
375
|
-
var _exception2 = _interopRequireDefault(_exception);
|
|
376
|
-
exports.default = function(instance) {
|
|
377
|
-
instance.registerHelper("with", function(context2, options) {
|
|
378
|
-
if (arguments.length != 2) {
|
|
379
|
-
throw new _exception2["default"]("#with requires exactly one argument");
|
|
380
|
-
}
|
|
381
|
-
if (_utils.isFunction(context2)) {
|
|
382
|
-
context2 = context2.call(this);
|
|
383
|
-
}
|
|
384
|
-
var fn = options.fn;
|
|
385
|
-
if (!_utils.isEmpty(context2)) {
|
|
386
|
-
var data = options.data;
|
|
387
|
-
if (options.data && options.ids) {
|
|
388
|
-
data = _utils.createFrame(options.data);
|
|
389
|
-
data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);
|
|
390
|
-
}
|
|
391
|
-
return fn(context2, {
|
|
392
|
-
data,
|
|
393
|
-
blockParams: _utils.blockParams([context2], [data && data.contextPath])
|
|
394
|
-
});
|
|
395
|
-
} else {
|
|
396
|
-
return options.inverse(this);
|
|
397
|
-
}
|
|
398
|
-
});
|
|
399
|
-
};
|
|
400
|
-
module.exports = exports["default"];
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
// node_modules/handlebars/dist/cjs/handlebars/helpers.js
|
|
404
|
-
var require_helpers = __commonJS((exports) => {
|
|
405
|
-
exports.__esModule = true;
|
|
406
|
-
exports.registerDefaultHelpers = registerDefaultHelpers;
|
|
407
|
-
exports.moveHelperToHooks = moveHelperToHooks;
|
|
408
|
-
function _interopRequireDefault(obj) {
|
|
409
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
410
|
-
}
|
|
411
|
-
var _helpersBlockHelperMissing = require_block_helper_missing();
|
|
412
|
-
var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);
|
|
413
|
-
var _helpersEach = require_each();
|
|
414
|
-
var _helpersEach2 = _interopRequireDefault(_helpersEach);
|
|
415
|
-
var _helpersHelperMissing = require_helper_missing();
|
|
416
|
-
var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);
|
|
417
|
-
var _helpersIf = require_if();
|
|
418
|
-
var _helpersIf2 = _interopRequireDefault(_helpersIf);
|
|
419
|
-
var _helpersLog = require_log();
|
|
420
|
-
var _helpersLog2 = _interopRequireDefault(_helpersLog);
|
|
421
|
-
var _helpersLookup = require_lookup();
|
|
422
|
-
var _helpersLookup2 = _interopRequireDefault(_helpersLookup);
|
|
423
|
-
var _helpersWith = require_with();
|
|
424
|
-
var _helpersWith2 = _interopRequireDefault(_helpersWith);
|
|
425
|
-
function registerDefaultHelpers(instance) {
|
|
426
|
-
_helpersBlockHelperMissing2["default"](instance);
|
|
427
|
-
_helpersEach2["default"](instance);
|
|
428
|
-
_helpersHelperMissing2["default"](instance);
|
|
429
|
-
_helpersIf2["default"](instance);
|
|
430
|
-
_helpersLog2["default"](instance);
|
|
431
|
-
_helpersLookup2["default"](instance);
|
|
432
|
-
_helpersWith2["default"](instance);
|
|
433
|
-
}
|
|
434
|
-
function moveHelperToHooks(instance, helperName, keepHelper) {
|
|
435
|
-
if (instance.helpers[helperName]) {
|
|
436
|
-
instance.hooks[helperName] = instance.helpers[helperName];
|
|
437
|
-
if (!keepHelper) {
|
|
438
|
-
delete instance.helpers[helperName];
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
// node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js
|
|
445
|
-
var require_inline = __commonJS((exports, module) => {
|
|
446
|
-
exports.__esModule = true;
|
|
447
|
-
var _utils = require_utils();
|
|
448
|
-
exports.default = function(instance) {
|
|
449
|
-
instance.registerDecorator("inline", function(fn, props, container, options) {
|
|
450
|
-
var ret = fn;
|
|
451
|
-
if (!props.partials) {
|
|
452
|
-
props.partials = {};
|
|
453
|
-
ret = function(context2, options2) {
|
|
454
|
-
var original = container.partials;
|
|
455
|
-
container.partials = _utils.extend({}, original, props.partials);
|
|
456
|
-
var ret2 = fn(context2, options2);
|
|
457
|
-
container.partials = original;
|
|
458
|
-
return ret2;
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
props.partials[options.args[0]] = options.fn;
|
|
462
|
-
return ret;
|
|
463
|
-
});
|
|
464
|
-
};
|
|
465
|
-
module.exports = exports["default"];
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
// node_modules/handlebars/dist/cjs/handlebars/decorators.js
|
|
469
|
-
var require_decorators = __commonJS((exports) => {
|
|
470
|
-
exports.__esModule = true;
|
|
471
|
-
exports.registerDefaultDecorators = registerDefaultDecorators;
|
|
472
|
-
function _interopRequireDefault(obj) {
|
|
473
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
474
|
-
}
|
|
475
|
-
var _decoratorsInline = require_inline();
|
|
476
|
-
var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);
|
|
477
|
-
function registerDefaultDecorators(instance) {
|
|
478
|
-
_decoratorsInline2["default"](instance);
|
|
479
|
-
}
|
|
480
|
-
});
|
|
481
|
-
|
|
482
|
-
// node_modules/handlebars/dist/cjs/handlebars/logger.js
|
|
483
|
-
var require_logger = __commonJS((exports, module) => {
|
|
484
|
-
exports.__esModule = true;
|
|
485
|
-
var _utils = require_utils();
|
|
486
|
-
var logger = {
|
|
487
|
-
methodMap: ["debug", "info", "warn", "error"],
|
|
488
|
-
level: "info",
|
|
489
|
-
lookupLevel: function lookupLevel(level) {
|
|
490
|
-
if (typeof level === "string") {
|
|
491
|
-
var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());
|
|
492
|
-
if (levelMap >= 0) {
|
|
493
|
-
level = levelMap;
|
|
494
|
-
} else {
|
|
495
|
-
level = parseInt(level, 10);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
return level;
|
|
499
|
-
},
|
|
500
|
-
log: function log(level) {
|
|
501
|
-
level = logger.lookupLevel(level);
|
|
502
|
-
if (typeof console !== "undefined" && logger.lookupLevel(logger.level) <= level) {
|
|
503
|
-
var method = logger.methodMap[level];
|
|
504
|
-
if (!console[method]) {
|
|
505
|
-
method = "log";
|
|
506
|
-
}
|
|
507
|
-
for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1;_key < _len; _key++) {
|
|
508
|
-
message[_key - 1] = arguments[_key];
|
|
509
|
-
}
|
|
510
|
-
console[method].apply(console, message);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
};
|
|
514
|
-
exports.default = logger;
|
|
515
|
-
module.exports = exports["default"];
|
|
516
|
-
});
|
|
517
|
-
|
|
518
|
-
// node_modules/handlebars/dist/cjs/handlebars/internal/create-new-lookup-object.js
|
|
519
|
-
var require_create_new_lookup_object = __commonJS((exports) => {
|
|
520
|
-
exports.__esModule = true;
|
|
521
|
-
exports.createNewLookupObject = createNewLookupObject;
|
|
522
|
-
var _utils = require_utils();
|
|
523
|
-
function createNewLookupObject() {
|
|
524
|
-
for (var _len = arguments.length, sources = Array(_len), _key = 0;_key < _len; _key++) {
|
|
525
|
-
sources[_key] = arguments[_key];
|
|
526
|
-
}
|
|
527
|
-
return _utils.extend.apply(undefined, [Object.create(null)].concat(sources));
|
|
528
|
-
}
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
// node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js
|
|
532
|
-
var require_proto_access = __commonJS((exports) => {
|
|
533
|
-
exports.__esModule = true;
|
|
534
|
-
exports.createProtoAccessControl = createProtoAccessControl;
|
|
535
|
-
exports.resultIsAllowed = resultIsAllowed;
|
|
536
|
-
exports.resetLoggedProperties = resetLoggedProperties;
|
|
537
|
-
function _interopRequireDefault(obj) {
|
|
538
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
539
|
-
}
|
|
540
|
-
var _createNewLookupObject = require_create_new_lookup_object();
|
|
541
|
-
var _logger = require_logger();
|
|
542
|
-
var _logger2 = _interopRequireDefault(_logger);
|
|
543
|
-
var loggedProperties = Object.create(null);
|
|
544
|
-
function createProtoAccessControl(runtimeOptions) {
|
|
545
|
-
var defaultMethodWhiteList = Object.create(null);
|
|
546
|
-
defaultMethodWhiteList["constructor"] = false;
|
|
547
|
-
defaultMethodWhiteList["__defineGetter__"] = false;
|
|
548
|
-
defaultMethodWhiteList["__defineSetter__"] = false;
|
|
549
|
-
defaultMethodWhiteList["__lookupGetter__"] = false;
|
|
550
|
-
var defaultPropertyWhiteList = Object.create(null);
|
|
551
|
-
defaultPropertyWhiteList["__proto__"] = false;
|
|
552
|
-
return {
|
|
553
|
-
properties: {
|
|
554
|
-
whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties),
|
|
555
|
-
defaultValue: runtimeOptions.allowProtoPropertiesByDefault
|
|
556
|
-
},
|
|
557
|
-
methods: {
|
|
558
|
-
whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods),
|
|
559
|
-
defaultValue: runtimeOptions.allowProtoMethodsByDefault
|
|
560
|
-
}
|
|
561
|
-
};
|
|
562
|
-
}
|
|
563
|
-
function resultIsAllowed(result, protoAccessControl, propertyName) {
|
|
564
|
-
if (typeof result === "function") {
|
|
565
|
-
return checkWhiteList(protoAccessControl.methods, propertyName);
|
|
566
|
-
} else {
|
|
567
|
-
return checkWhiteList(protoAccessControl.properties, propertyName);
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
function checkWhiteList(protoAccessControlForType, propertyName) {
|
|
571
|
-
if (protoAccessControlForType.whitelist[propertyName] !== undefined) {
|
|
572
|
-
return protoAccessControlForType.whitelist[propertyName] === true;
|
|
573
|
-
}
|
|
574
|
-
if (protoAccessControlForType.defaultValue !== undefined) {
|
|
575
|
-
return protoAccessControlForType.defaultValue;
|
|
576
|
-
}
|
|
577
|
-
logUnexpecedPropertyAccessOnce(propertyName);
|
|
578
|
-
return false;
|
|
579
|
-
}
|
|
580
|
-
function logUnexpecedPropertyAccessOnce(propertyName) {
|
|
581
|
-
if (loggedProperties[propertyName] !== true) {
|
|
582
|
-
loggedProperties[propertyName] = true;
|
|
583
|
-
_logger2["default"].log("error", 'Handlebars: Access has been denied to resolve the property "' + propertyName + `" because it is not an "own property" of its parent.
|
|
584
|
-
` + `You can add a runtime option to disable the check or this warning:
|
|
585
|
-
` + "See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details");
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
function resetLoggedProperties() {
|
|
589
|
-
Object.keys(loggedProperties).forEach(function(propertyName) {
|
|
590
|
-
delete loggedProperties[propertyName];
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
});
|
|
594
|
-
|
|
595
|
-
// node_modules/handlebars/dist/cjs/handlebars/base.js
|
|
596
|
-
var require_base = __commonJS((exports) => {
|
|
597
|
-
exports.__esModule = true;
|
|
598
|
-
exports.HandlebarsEnvironment = HandlebarsEnvironment;
|
|
599
|
-
function _interopRequireDefault(obj) {
|
|
600
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
601
|
-
}
|
|
602
|
-
var _utils = require_utils();
|
|
603
|
-
var _exception = require_exception();
|
|
604
|
-
var _exception2 = _interopRequireDefault(_exception);
|
|
605
|
-
var _helpers = require_helpers();
|
|
606
|
-
var _decorators = require_decorators();
|
|
607
|
-
var _logger = require_logger();
|
|
608
|
-
var _logger2 = _interopRequireDefault(_logger);
|
|
609
|
-
var _internalProtoAccess = require_proto_access();
|
|
610
|
-
var VERSION = "4.7.8";
|
|
611
|
-
exports.VERSION = VERSION;
|
|
612
|
-
var COMPILER_REVISION = 8;
|
|
613
|
-
exports.COMPILER_REVISION = COMPILER_REVISION;
|
|
614
|
-
var LAST_COMPATIBLE_COMPILER_REVISION = 7;
|
|
615
|
-
exports.LAST_COMPATIBLE_COMPILER_REVISION = LAST_COMPATIBLE_COMPILER_REVISION;
|
|
616
|
-
var REVISION_CHANGES = {
|
|
617
|
-
1: "<= 1.0.rc.2",
|
|
618
|
-
2: "== 1.0.0-rc.3",
|
|
619
|
-
3: "== 1.0.0-rc.4",
|
|
620
|
-
4: "== 1.x.x",
|
|
621
|
-
5: "== 2.0.0-alpha.x",
|
|
622
|
-
6: ">= 2.0.0-beta.1",
|
|
623
|
-
7: ">= 4.0.0 <4.3.0",
|
|
624
|
-
8: ">= 4.3.0"
|
|
625
|
-
};
|
|
626
|
-
exports.REVISION_CHANGES = REVISION_CHANGES;
|
|
627
|
-
var objectType = "[object Object]";
|
|
628
|
-
function HandlebarsEnvironment(helpers, partials, decorators) {
|
|
629
|
-
this.helpers = helpers || {};
|
|
630
|
-
this.partials = partials || {};
|
|
631
|
-
this.decorators = decorators || {};
|
|
632
|
-
_helpers.registerDefaultHelpers(this);
|
|
633
|
-
_decorators.registerDefaultDecorators(this);
|
|
634
|
-
}
|
|
635
|
-
HandlebarsEnvironment.prototype = {
|
|
636
|
-
constructor: HandlebarsEnvironment,
|
|
637
|
-
logger: _logger2["default"],
|
|
638
|
-
log: _logger2["default"].log,
|
|
639
|
-
registerHelper: function registerHelper(name, fn) {
|
|
640
|
-
if (_utils.toString.call(name) === objectType) {
|
|
641
|
-
if (fn) {
|
|
642
|
-
throw new _exception2["default"]("Arg not supported with multiple helpers");
|
|
643
|
-
}
|
|
644
|
-
_utils.extend(this.helpers, name);
|
|
645
|
-
} else {
|
|
646
|
-
this.helpers[name] = fn;
|
|
647
|
-
}
|
|
648
|
-
},
|
|
649
|
-
unregisterHelper: function unregisterHelper(name) {
|
|
650
|
-
delete this.helpers[name];
|
|
651
|
-
},
|
|
652
|
-
registerPartial: function registerPartial(name, partial) {
|
|
653
|
-
if (_utils.toString.call(name) === objectType) {
|
|
654
|
-
_utils.extend(this.partials, name);
|
|
655
|
-
} else {
|
|
656
|
-
if (typeof partial === "undefined") {
|
|
657
|
-
throw new _exception2["default"]('Attempting to register a partial called "' + name + '" as undefined');
|
|
658
|
-
}
|
|
659
|
-
this.partials[name] = partial;
|
|
660
|
-
}
|
|
661
|
-
},
|
|
662
|
-
unregisterPartial: function unregisterPartial(name) {
|
|
663
|
-
delete this.partials[name];
|
|
664
|
-
},
|
|
665
|
-
registerDecorator: function registerDecorator(name, fn) {
|
|
666
|
-
if (_utils.toString.call(name) === objectType) {
|
|
667
|
-
if (fn) {
|
|
668
|
-
throw new _exception2["default"]("Arg not supported with multiple decorators");
|
|
669
|
-
}
|
|
670
|
-
_utils.extend(this.decorators, name);
|
|
671
|
-
} else {
|
|
672
|
-
this.decorators[name] = fn;
|
|
673
|
-
}
|
|
674
|
-
},
|
|
675
|
-
unregisterDecorator: function unregisterDecorator(name) {
|
|
676
|
-
delete this.decorators[name];
|
|
677
|
-
},
|
|
678
|
-
resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() {
|
|
679
|
-
_internalProtoAccess.resetLoggedProperties();
|
|
680
|
-
}
|
|
681
|
-
};
|
|
682
|
-
var log2 = _logger2["default"].log;
|
|
683
|
-
exports.log = log2;
|
|
684
|
-
exports.createFrame = _utils.createFrame;
|
|
685
|
-
exports.logger = _logger2["default"];
|
|
686
|
-
});
|
|
687
|
-
|
|
688
|
-
// node_modules/handlebars/dist/cjs/handlebars/safe-string.js
|
|
689
|
-
var require_safe_string = __commonJS((exports, module) => {
|
|
690
|
-
exports.__esModule = true;
|
|
691
|
-
function SafeString(string) {
|
|
692
|
-
this.string = string;
|
|
693
|
-
}
|
|
694
|
-
SafeString.prototype.toString = SafeString.prototype.toHTML = function() {
|
|
695
|
-
return "" + this.string;
|
|
696
|
-
};
|
|
697
|
-
exports.default = SafeString;
|
|
698
|
-
module.exports = exports["default"];
|
|
699
|
-
});
|
|
700
|
-
|
|
701
|
-
// node_modules/handlebars/dist/cjs/handlebars/internal/wrapHelper.js
|
|
702
|
-
var require_wrapHelper = __commonJS((exports) => {
|
|
703
|
-
exports.__esModule = true;
|
|
704
|
-
exports.wrapHelper = wrapHelper;
|
|
705
|
-
function wrapHelper(helper, transformOptionsFn) {
|
|
706
|
-
if (typeof helper !== "function") {
|
|
707
|
-
return helper;
|
|
708
|
-
}
|
|
709
|
-
var wrapper = function wrapper() {
|
|
710
|
-
var options = arguments[arguments.length - 1];
|
|
711
|
-
arguments[arguments.length - 1] = transformOptionsFn(options);
|
|
712
|
-
return helper.apply(this, arguments);
|
|
713
|
-
};
|
|
714
|
-
return wrapper;
|
|
715
|
-
}
|
|
716
|
-
});
|
|
717
|
-
|
|
718
|
-
// node_modules/handlebars/dist/cjs/handlebars/runtime.js
|
|
719
|
-
var require_runtime = __commonJS((exports) => {
|
|
720
|
-
exports.__esModule = true;
|
|
721
|
-
exports.checkRevision = checkRevision;
|
|
722
|
-
exports.template = template;
|
|
723
|
-
exports.wrapProgram = wrapProgram;
|
|
724
|
-
exports.resolvePartial = resolvePartial;
|
|
725
|
-
exports.invokePartial = invokePartial;
|
|
726
|
-
exports.noop = noop;
|
|
727
|
-
function _interopRequireDefault(obj) {
|
|
728
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
729
|
-
}
|
|
730
|
-
function _interopRequireWildcard(obj) {
|
|
731
|
-
if (obj && obj.__esModule) {
|
|
732
|
-
return obj;
|
|
733
|
-
} else {
|
|
734
|
-
var newObj = {};
|
|
735
|
-
if (obj != null) {
|
|
736
|
-
for (var key in obj) {
|
|
737
|
-
if (Object.prototype.hasOwnProperty.call(obj, key))
|
|
738
|
-
newObj[key] = obj[key];
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
newObj["default"] = obj;
|
|
742
|
-
return newObj;
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
var _utils = require_utils();
|
|
746
|
-
var Utils = _interopRequireWildcard(_utils);
|
|
747
|
-
var _exception = require_exception();
|
|
748
|
-
var _exception2 = _interopRequireDefault(_exception);
|
|
749
|
-
var _base = require_base();
|
|
750
|
-
var _helpers = require_helpers();
|
|
751
|
-
var _internalWrapHelper = require_wrapHelper();
|
|
752
|
-
var _internalProtoAccess = require_proto_access();
|
|
753
|
-
function checkRevision(compilerInfo) {
|
|
754
|
-
var compilerRevision = compilerInfo && compilerInfo[0] || 1, currentRevision = _base.COMPILER_REVISION;
|
|
755
|
-
if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) {
|
|
756
|
-
return;
|
|
757
|
-
}
|
|
758
|
-
if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) {
|
|
759
|
-
var runtimeVersions = _base.REVISION_CHANGES[currentRevision], compilerVersions = _base.REVISION_CHANGES[compilerRevision];
|
|
760
|
-
throw new _exception2["default"]("Template was precompiled with an older version of Handlebars than the current runtime. " + "Please update your precompiler to a newer version (" + runtimeVersions + ") or downgrade your runtime to an older version (" + compilerVersions + ").");
|
|
761
|
-
} else {
|
|
762
|
-
throw new _exception2["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. " + "Please update your runtime to a newer version (" + compilerInfo[1] + ").");
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
function template(templateSpec, env) {
|
|
766
|
-
if (!env) {
|
|
767
|
-
throw new _exception2["default"]("No environment passed to template");
|
|
768
|
-
}
|
|
769
|
-
if (!templateSpec || !templateSpec.main) {
|
|
770
|
-
throw new _exception2["default"]("Unknown template object: " + typeof templateSpec);
|
|
771
|
-
}
|
|
772
|
-
templateSpec.main.decorator = templateSpec.main_d;
|
|
773
|
-
env.VM.checkRevision(templateSpec.compiler);
|
|
774
|
-
var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7;
|
|
775
|
-
function invokePartialWrapper(partial, context2, options) {
|
|
776
|
-
if (options.hash) {
|
|
777
|
-
context2 = Utils.extend({}, context2, options.hash);
|
|
778
|
-
if (options.ids) {
|
|
779
|
-
options.ids[0] = true;
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
partial = env.VM.resolvePartial.call(this, partial, context2, options);
|
|
783
|
-
var extendedOptions = Utils.extend({}, options, {
|
|
784
|
-
hooks: this.hooks,
|
|
785
|
-
protoAccessControl: this.protoAccessControl
|
|
786
|
-
});
|
|
787
|
-
var result = env.VM.invokePartial.call(this, partial, context2, extendedOptions);
|
|
788
|
-
if (result == null && env.compile) {
|
|
789
|
-
options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);
|
|
790
|
-
result = options.partials[options.name](context2, extendedOptions);
|
|
791
|
-
}
|
|
792
|
-
if (result != null) {
|
|
793
|
-
if (options.indent) {
|
|
794
|
-
var lines = result.split(`
|
|
795
|
-
`);
|
|
796
|
-
for (var i = 0, l = lines.length;i < l; i++) {
|
|
797
|
-
if (!lines[i] && i + 1 === l) {
|
|
798
|
-
break;
|
|
799
|
-
}
|
|
800
|
-
lines[i] = options.indent + lines[i];
|
|
801
|
-
}
|
|
802
|
-
result = lines.join(`
|
|
803
|
-
`);
|
|
804
|
-
}
|
|
805
|
-
return result;
|
|
806
|
-
} else {
|
|
807
|
-
throw new _exception2["default"]("The partial " + options.name + " could not be compiled when running in runtime-only mode");
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
var container = {
|
|
811
|
-
strict: function strict(obj, name, loc) {
|
|
812
|
-
if (!obj || !(name in obj)) {
|
|
813
|
-
throw new _exception2["default"]('"' + name + '" not defined in ' + obj, {
|
|
814
|
-
loc
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
return container.lookupProperty(obj, name);
|
|
818
|
-
},
|
|
819
|
-
lookupProperty: function lookupProperty(parent, propertyName) {
|
|
820
|
-
var result = parent[propertyName];
|
|
821
|
-
if (result == null) {
|
|
822
|
-
return result;
|
|
823
|
-
}
|
|
824
|
-
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
|
825
|
-
return result;
|
|
826
|
-
}
|
|
827
|
-
if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) {
|
|
828
|
-
return result;
|
|
829
|
-
}
|
|
830
|
-
return;
|
|
831
|
-
},
|
|
832
|
-
lookup: function lookup(depths, name) {
|
|
833
|
-
var len = depths.length;
|
|
834
|
-
for (var i = 0;i < len; i++) {
|
|
835
|
-
var result = depths[i] && container.lookupProperty(depths[i], name);
|
|
836
|
-
if (result != null) {
|
|
837
|
-
return depths[i][name];
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
},
|
|
841
|
-
lambda: function lambda(current, context2) {
|
|
842
|
-
return typeof current === "function" ? current.call(context2) : current;
|
|
843
|
-
},
|
|
844
|
-
escapeExpression: Utils.escapeExpression,
|
|
845
|
-
invokePartial: invokePartialWrapper,
|
|
846
|
-
fn: function fn(i) {
|
|
847
|
-
var ret2 = templateSpec[i];
|
|
848
|
-
ret2.decorator = templateSpec[i + "_d"];
|
|
849
|
-
return ret2;
|
|
850
|
-
},
|
|
851
|
-
programs: [],
|
|
852
|
-
program: function program(i, data, declaredBlockParams, blockParams, depths) {
|
|
853
|
-
var programWrapper = this.programs[i], fn = this.fn(i);
|
|
854
|
-
if (data || depths || blockParams || declaredBlockParams) {
|
|
855
|
-
programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);
|
|
856
|
-
} else if (!programWrapper) {
|
|
857
|
-
programWrapper = this.programs[i] = wrapProgram(this, i, fn);
|
|
858
|
-
}
|
|
859
|
-
return programWrapper;
|
|
860
|
-
},
|
|
861
|
-
data: function data(value, depth) {
|
|
862
|
-
while (value && depth--) {
|
|
863
|
-
value = value._parent;
|
|
864
|
-
}
|
|
865
|
-
return value;
|
|
866
|
-
},
|
|
867
|
-
mergeIfNeeded: function mergeIfNeeded(param, common) {
|
|
868
|
-
var obj = param || common;
|
|
869
|
-
if (param && common && param !== common) {
|
|
870
|
-
obj = Utils.extend({}, common, param);
|
|
871
|
-
}
|
|
872
|
-
return obj;
|
|
873
|
-
},
|
|
874
|
-
nullContext: Object.seal({}),
|
|
875
|
-
noop: env.VM.noop,
|
|
876
|
-
compilerInfo: templateSpec.compiler
|
|
877
|
-
};
|
|
878
|
-
function ret(context2) {
|
|
879
|
-
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
|
|
880
|
-
var data = options.data;
|
|
881
|
-
ret._setup(options);
|
|
882
|
-
if (!options.partial && templateSpec.useData) {
|
|
883
|
-
data = initData(context2, data);
|
|
884
|
-
}
|
|
885
|
-
var depths = undefined, blockParams = templateSpec.useBlockParams ? [] : undefined;
|
|
886
|
-
if (templateSpec.useDepths) {
|
|
887
|
-
if (options.depths) {
|
|
888
|
-
depths = context2 != options.depths[0] ? [context2].concat(options.depths) : options.depths;
|
|
889
|
-
} else {
|
|
890
|
-
depths = [context2];
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
function main(context3) {
|
|
894
|
-
return "" + templateSpec.main(container, context3, container.helpers, container.partials, data, blockParams, depths);
|
|
895
|
-
}
|
|
896
|
-
main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);
|
|
897
|
-
return main(context2, options);
|
|
898
|
-
}
|
|
899
|
-
ret.isTop = true;
|
|
900
|
-
ret._setup = function(options) {
|
|
901
|
-
if (!options.partial) {
|
|
902
|
-
var mergedHelpers = Utils.extend({}, env.helpers, options.helpers);
|
|
903
|
-
wrapHelpersToPassLookupProperty(mergedHelpers, container);
|
|
904
|
-
container.helpers = mergedHelpers;
|
|
905
|
-
if (templateSpec.usePartial) {
|
|
906
|
-
container.partials = container.mergeIfNeeded(options.partials, env.partials);
|
|
907
|
-
}
|
|
908
|
-
if (templateSpec.usePartial || templateSpec.useDecorators) {
|
|
909
|
-
container.decorators = Utils.extend({}, env.decorators, options.decorators);
|
|
910
|
-
}
|
|
911
|
-
container.hooks = {};
|
|
912
|
-
container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options);
|
|
913
|
-
var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7;
|
|
914
|
-
_helpers.moveHelperToHooks(container, "helperMissing", keepHelperInHelpers);
|
|
915
|
-
_helpers.moveHelperToHooks(container, "blockHelperMissing", keepHelperInHelpers);
|
|
916
|
-
} else {
|
|
917
|
-
container.protoAccessControl = options.protoAccessControl;
|
|
918
|
-
container.helpers = options.helpers;
|
|
919
|
-
container.partials = options.partials;
|
|
920
|
-
container.decorators = options.decorators;
|
|
921
|
-
container.hooks = options.hooks;
|
|
922
|
-
}
|
|
923
|
-
};
|
|
924
|
-
ret._child = function(i, data, blockParams, depths) {
|
|
925
|
-
if (templateSpec.useBlockParams && !blockParams) {
|
|
926
|
-
throw new _exception2["default"]("must pass block params");
|
|
927
|
-
}
|
|
928
|
-
if (templateSpec.useDepths && !depths) {
|
|
929
|
-
throw new _exception2["default"]("must pass parent depths");
|
|
930
|
-
}
|
|
931
|
-
return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);
|
|
932
|
-
};
|
|
933
|
-
return ret;
|
|
934
|
-
}
|
|
935
|
-
function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {
|
|
936
|
-
function prog(context2) {
|
|
937
|
-
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
|
|
938
|
-
var currentDepths = depths;
|
|
939
|
-
if (depths && context2 != depths[0] && !(context2 === container.nullContext && depths[0] === null)) {
|
|
940
|
-
currentDepths = [context2].concat(depths);
|
|
941
|
-
}
|
|
942
|
-
return fn(container, context2, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);
|
|
943
|
-
}
|
|
944
|
-
prog = executeDecorators(fn, prog, container, depths, data, blockParams);
|
|
945
|
-
prog.program = i;
|
|
946
|
-
prog.depth = depths ? depths.length : 0;
|
|
947
|
-
prog.blockParams = declaredBlockParams || 0;
|
|
948
|
-
return prog;
|
|
949
|
-
}
|
|
950
|
-
function resolvePartial(partial, context2, options) {
|
|
951
|
-
if (!partial) {
|
|
952
|
-
if (options.name === "@partial-block") {
|
|
953
|
-
partial = options.data["partial-block"];
|
|
954
|
-
} else {
|
|
955
|
-
partial = options.partials[options.name];
|
|
956
|
-
}
|
|
957
|
-
} else if (!partial.call && !options.name) {
|
|
958
|
-
options.name = partial;
|
|
959
|
-
partial = options.partials[partial];
|
|
960
|
-
}
|
|
961
|
-
return partial;
|
|
962
|
-
}
|
|
963
|
-
function invokePartial(partial, context2, options) {
|
|
964
|
-
var currentPartialBlock = options.data && options.data["partial-block"];
|
|
965
|
-
options.partial = true;
|
|
966
|
-
if (options.ids) {
|
|
967
|
-
options.data.contextPath = options.ids[0] || options.data.contextPath;
|
|
968
|
-
}
|
|
969
|
-
var partialBlock = undefined;
|
|
970
|
-
if (options.fn && options.fn !== noop) {
|
|
971
|
-
(function() {
|
|
972
|
-
options.data = _base.createFrame(options.data);
|
|
973
|
-
var fn = options.fn;
|
|
974
|
-
partialBlock = options.data["partial-block"] = function partialBlockWrapper(context3) {
|
|
975
|
-
var options2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
|
|
976
|
-
options2.data = _base.createFrame(options2.data);
|
|
977
|
-
options2.data["partial-block"] = currentPartialBlock;
|
|
978
|
-
return fn(context3, options2);
|
|
979
|
-
};
|
|
980
|
-
if (fn.partials) {
|
|
981
|
-
options.partials = Utils.extend({}, options.partials, fn.partials);
|
|
982
|
-
}
|
|
983
|
-
})();
|
|
984
|
-
}
|
|
985
|
-
if (partial === undefined && partialBlock) {
|
|
986
|
-
partial = partialBlock;
|
|
987
|
-
}
|
|
988
|
-
if (partial === undefined) {
|
|
989
|
-
throw new _exception2["default"]("The partial " + options.name + " could not be found");
|
|
990
|
-
} else if (partial instanceof Function) {
|
|
991
|
-
return partial(context2, options);
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
function noop() {
|
|
995
|
-
return "";
|
|
996
|
-
}
|
|
997
|
-
function initData(context2, data) {
|
|
998
|
-
if (!data || !("root" in data)) {
|
|
999
|
-
data = data ? _base.createFrame(data) : {};
|
|
1000
|
-
data.root = context2;
|
|
1001
|
-
}
|
|
1002
|
-
return data;
|
|
1003
|
-
}
|
|
1004
|
-
function executeDecorators(fn, prog, container, depths, data, blockParams) {
|
|
1005
|
-
if (fn.decorator) {
|
|
1006
|
-
var props = {};
|
|
1007
|
-
prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);
|
|
1008
|
-
Utils.extend(prog, props);
|
|
1009
|
-
}
|
|
1010
|
-
return prog;
|
|
1011
|
-
}
|
|
1012
|
-
function wrapHelpersToPassLookupProperty(mergedHelpers, container) {
|
|
1013
|
-
Object.keys(mergedHelpers).forEach(function(helperName) {
|
|
1014
|
-
var helper = mergedHelpers[helperName];
|
|
1015
|
-
mergedHelpers[helperName] = passLookupPropertyOption(helper, container);
|
|
1016
|
-
});
|
|
1017
|
-
}
|
|
1018
|
-
function passLookupPropertyOption(helper, container) {
|
|
1019
|
-
var lookupProperty = container.lookupProperty;
|
|
1020
|
-
return _internalWrapHelper.wrapHelper(helper, function(options) {
|
|
1021
|
-
return Utils.extend({ lookupProperty }, options);
|
|
1022
|
-
});
|
|
1023
|
-
}
|
|
1024
|
-
});
|
|
1025
|
-
|
|
1026
|
-
// node_modules/handlebars/dist/cjs/handlebars/no-conflict.js
|
|
1027
|
-
var require_no_conflict = __commonJS((exports, module) => {
|
|
1028
|
-
exports.__esModule = true;
|
|
1029
|
-
exports.default = function(Handlebars) {
|
|
1030
|
-
(function() {
|
|
1031
|
-
if (typeof globalThis === "object")
|
|
1032
|
-
return;
|
|
1033
|
-
Object.prototype.__defineGetter__("__magic__", function() {
|
|
1034
|
-
return this;
|
|
1035
|
-
});
|
|
1036
|
-
__magic__.globalThis = __magic__;
|
|
1037
|
-
delete Object.prototype.__magic__;
|
|
1038
|
-
})();
|
|
1039
|
-
var $Handlebars = globalThis.Handlebars;
|
|
1040
|
-
Handlebars.noConflict = function() {
|
|
1041
|
-
if (globalThis.Handlebars === Handlebars) {
|
|
1042
|
-
globalThis.Handlebars = $Handlebars;
|
|
1043
|
-
}
|
|
1044
|
-
return Handlebars;
|
|
1045
|
-
};
|
|
1046
|
-
};
|
|
1047
|
-
module.exports = exports["default"];
|
|
1048
|
-
});
|
|
1049
|
-
|
|
1050
|
-
// node_modules/handlebars/dist/cjs/handlebars.runtime.js
|
|
1051
|
-
var require_handlebars_runtime = __commonJS((exports, module) => {
|
|
1052
|
-
exports.__esModule = true;
|
|
1053
|
-
function _interopRequireDefault(obj) {
|
|
1054
|
-
return obj && obj.__esModule ? obj : { default: obj };
|
|
1055
|
-
}
|
|
1056
|
-
function _interopRequireWildcard(obj) {
|
|
1057
|
-
if (obj && obj.__esModule) {
|
|
1058
|
-
return obj;
|
|
1059
|
-
} else {
|
|
1060
|
-
var newObj = {};
|
|
1061
|
-
if (obj != null) {
|
|
1062
|
-
for (var key in obj) {
|
|
1063
|
-
if (Object.prototype.hasOwnProperty.call(obj, key))
|
|
1064
|
-
newObj[key] = obj[key];
|
|
1065
|
-
}
|
|
1066
|
-
}
|
|
1067
|
-
newObj["default"] = obj;
|
|
1068
|
-
return newObj;
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
var _handlebarsBase = require_base();
|
|
1072
|
-
var base = _interopRequireWildcard(_handlebarsBase);
|
|
1073
|
-
var _handlebarsSafeString = require_safe_string();
|
|
1074
|
-
var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);
|
|
1075
|
-
var _handlebarsException = require_exception();
|
|
1076
|
-
var _handlebarsException2 = _interopRequireDefault(_handlebarsException);
|
|
1077
|
-
var _handlebarsUtils = require_utils();
|
|
1078
|
-
var Utils = _interopRequireWildcard(_handlebarsUtils);
|
|
1079
|
-
var _handlebarsRuntime = require_runtime();
|
|
1080
|
-
var runtime = _interopRequireWildcard(_handlebarsRuntime);
|
|
1081
|
-
var _handlebarsNoConflict = require_no_conflict();
|
|
1082
|
-
var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
|
|
1083
|
-
function create() {
|
|
1084
|
-
var hb = new base.HandlebarsEnvironment;
|
|
1085
|
-
Utils.extend(hb, base);
|
|
1086
|
-
hb.SafeString = _handlebarsSafeString2["default"];
|
|
1087
|
-
hb.Exception = _handlebarsException2["default"];
|
|
1088
|
-
hb.Utils = Utils;
|
|
1089
|
-
hb.escapeExpression = Utils.escapeExpression;
|
|
1090
|
-
hb.VM = runtime;
|
|
1091
|
-
hb.template = function(spec) {
|
|
1092
|
-
return runtime.template(spec, hb);
|
|
1093
|
-
};
|
|
1094
|
-
return hb;
|
|
1095
|
-
}
|
|
1096
|
-
var inst = create();
|
|
1097
|
-
inst.create = create;
|
|
1098
|
-
_handlebarsNoConflict2["default"](inst);
|
|
1099
|
-
inst["default"] = inst;
|
|
1100
|
-
exports.default = inst;
|
|
1101
|
-
module.exports = exports["default"];
|
|
1102
|
-
});
|
|
1103
|
-
|
|
1104
|
-
// node_modules/handlebars/runtime.js
|
|
1105
|
-
var require_runtime2 = __commonJS((exports, module) => {
|
|
1106
|
-
module.exports = require_handlebars_runtime()["default"];
|
|
1107
|
-
});
|
|
1108
|
-
// src/models/rtb/BidRequest.ts
|
|
1109
|
-
var AgentTypes = {
|
|
1110
|
-
Session: 1,
|
|
1111
|
-
Device: 2,
|
|
1112
|
-
User: 3
|
|
1113
|
-
};
|
|
1114
|
-
var AdCom10DeviceTypes = {
|
|
1115
|
-
Mobile: 1,
|
|
1116
|
-
PC: 2,
|
|
1117
|
-
CTV: 3,
|
|
1118
|
-
Phone: 4,
|
|
1119
|
-
Tablet: 5,
|
|
1120
|
-
Connected: 6,
|
|
1121
|
-
SetTop: 7,
|
|
1122
|
-
OOH: 8
|
|
1123
|
-
};
|
|
1124
|
-
// src/models/rtb/NativeRequest.ts
|
|
1125
|
-
var NativePosition = {
|
|
1126
|
-
Unknown: 0,
|
|
1127
|
-
AboveTheFold: 1,
|
|
1128
|
-
BelowTheFold: 3,
|
|
1129
|
-
Header: 4,
|
|
1130
|
-
Footer: 5,
|
|
1131
|
-
Sidebar: 6,
|
|
1132
|
-
FullScreen: 7
|
|
1133
|
-
};
|
|
1134
|
-
var NativeImageTypes = {
|
|
1135
|
-
Icon: 1,
|
|
1136
|
-
Main: 3
|
|
1137
|
-
};
|
|
1138
|
-
var NativeDataTypes = {
|
|
1139
|
-
Sponsored: 1,
|
|
1140
|
-
Desc: 2,
|
|
1141
|
-
Rating: 3,
|
|
1142
|
-
Likes: 4,
|
|
1143
|
-
Downloads: 5,
|
|
1144
|
-
Price: 6,
|
|
1145
|
-
SalePrice: 7,
|
|
1146
|
-
Phone: 8,
|
|
1147
|
-
Address: 9,
|
|
1148
|
-
Desc2: 10,
|
|
1149
|
-
DisplayURL: 11,
|
|
1150
|
-
CTAText: 12,
|
|
1151
|
-
SurfStrain: 500,
|
|
1152
|
-
SurfTHC: 501,
|
|
1153
|
-
SurfCBD: 502,
|
|
1154
|
-
SurfCategory: 503,
|
|
1155
|
-
SurfMetaProduct: 599
|
|
1156
|
-
};
|
|
1157
|
-
var NativeAssetId = {
|
|
1158
|
-
Title: 0,
|
|
1159
|
-
Image: 1,
|
|
1160
|
-
Sponsored: 2,
|
|
1161
|
-
Desc: 3,
|
|
1162
|
-
Rating: 4,
|
|
1163
|
-
Price: 5,
|
|
1164
|
-
SalePrice: 6,
|
|
1165
|
-
DisplayURL: 7,
|
|
1166
|
-
CTAText: 8,
|
|
1167
|
-
Video: 9,
|
|
1168
|
-
SurfStrain: 500,
|
|
1169
|
-
SurfTHC: 501,
|
|
1170
|
-
SurfCBD: 502,
|
|
1171
|
-
SurfCategory: 503,
|
|
1172
|
-
SurfMetaBrand: 598,
|
|
1173
|
-
SurfMetaProduct: 599
|
|
1174
|
-
};
|
|
1175
|
-
var EventTypes = {
|
|
1176
|
-
Imp: 1,
|
|
1177
|
-
ViewableMRC50: 2,
|
|
1178
|
-
ViewableMRC100: 3,
|
|
1179
|
-
ViewableVIDEO50: 4
|
|
1180
|
-
};
|
|
1181
|
-
var ContextTypes = {
|
|
1182
|
-
Content: 1,
|
|
1183
|
-
Social: 2,
|
|
1184
|
-
Product: 3
|
|
1185
|
-
};
|
|
1186
|
-
var ContextSubTypes = {
|
|
1187
|
-
General: 10,
|
|
1188
|
-
Article: 11,
|
|
1189
|
-
Video: 12,
|
|
1190
|
-
Audio: 13,
|
|
1191
|
-
Image: 14,
|
|
1192
|
-
UserGenerated: 15,
|
|
1193
|
-
GeneralSocial: 20,
|
|
1194
|
-
Email: 21,
|
|
1195
|
-
Chat: 22,
|
|
1196
|
-
Product: 30,
|
|
1197
|
-
Application: 31,
|
|
1198
|
-
ProductReviews: 32
|
|
1199
|
-
};
|
|
1200
|
-
var PlacementTypes = {
|
|
1201
|
-
InFeed: 1,
|
|
1202
|
-
Atomic: 2,
|
|
1203
|
-
OutsideCore: 3,
|
|
1204
|
-
Recommendation: 4
|
|
1205
|
-
};
|
|
1206
|
-
var VideoMimes = {
|
|
1207
|
-
MP4: "video/mp4",
|
|
1208
|
-
WEBM: "video/webm"
|
|
1209
|
-
};
|
|
1210
|
-
var EventTrackingMethods = {
|
|
1211
|
-
Img: 1,
|
|
1212
|
-
JS: 2
|
|
1213
|
-
};
|
|
1214
|
-
// src/models/rtb/NativeResponse.ts
|
|
1215
|
-
var findDataAssetByType = (assets, id) => assets?.find((asset) => asset.id === id)?.data?.value;
|
|
1216
|
-
function NativeResponseToProductInformation(native) {
|
|
1217
|
-
const brand = findDataAssetByType(native.native.assets, NativeAssetId.Sponsored);
|
|
1218
|
-
return {
|
|
1219
|
-
image: native.native.assets?.find((asset) => asset.img?.type === NativeImageTypes.Main)?.img?.url,
|
|
1220
|
-
name: native.native.assets?.find((asset) => asset.title !== undefined)?.title?.text,
|
|
1221
|
-
price: findDataAssetByType(native.native.assets, NativeAssetId.Price),
|
|
1222
|
-
salePrice: findDataAssetByType(native.native.assets, NativeAssetId.SalePrice),
|
|
1223
|
-
thc: findDataAssetByType(native.native.assets, NativeAssetId.SurfTHC),
|
|
1224
|
-
cbd: findDataAssetByType(native.native.assets, NativeAssetId.SurfCBD),
|
|
1225
|
-
strain: findDataAssetByType(native.native.assets, NativeAssetId.SurfStrain),
|
|
1226
|
-
brand_name: brand,
|
|
1227
|
-
brandName: brand,
|
|
1228
|
-
productType: findDataAssetByType(native.native.assets, NativeAssetId.SurfCategory),
|
|
1229
|
-
details: findDataAssetByType(native.native.assets, NativeAssetId.Desc),
|
|
1230
|
-
cta: findDataAssetByType(native.native.assets, NativeAssetId.CTAText),
|
|
1231
|
-
clickthroughUrl: native.native.link?.url ?? null,
|
|
1232
|
-
pixelUrl: native.native.eventtrackers?.find((event) => event.event === EventTypes.Imp)?.url
|
|
1233
|
-
};
|
|
1234
|
-
}
|
|
1235
|
-
// src/services/Logger.ts
|
|
1236
|
-
var SURF_PREFIX = "%c[SURF]";
|
|
1237
|
-
var SEPARATOR = " ›";
|
|
1238
|
-
var UNDEF = "[ undefined ]";
|
|
1239
|
-
var LogColors = {
|
|
1240
|
-
Lavender: "#c0abff",
|
|
1241
|
-
UltraRed: "#f97585",
|
|
1242
|
-
SoftGold: "#f4bd5d",
|
|
1243
|
-
MagicMint: "#baf7db"
|
|
1244
|
-
};
|
|
1245
|
-
var log = (log2, args, color) => {
|
|
1246
|
-
args.unshift(`border-radius: 3px; margin-left: 10px; background: ${color}; font-size: 12px; font-weight: bold;`);
|
|
1247
|
-
args.unshift(SURF_PREFIX);
|
|
1248
|
-
log2.apply(console, args);
|
|
1249
|
-
};
|
|
1250
|
-
var info = (...args) => log(console.log, ["(Info)", ...args], LogColors.Lavender);
|
|
1251
|
-
var warn = (...args) => log(console.warn, ["(Warning)", ...args], LogColors.SoftGold);
|
|
1252
|
-
var debug = (...args) => log(console.debug, ["(Debug)", ...args], LogColors.MagicMint);
|
|
1253
|
-
var error = (...args) => log(console.error, ["(Error)", ...args], LogColors.UltraRed);
|
|
1254
|
-
var context = (logger, ...prefix) => {
|
|
1255
|
-
const newPrefix = joinCtx(prefix) + SEPARATOR;
|
|
1256
|
-
const newLogger = {
|
|
1257
|
-
info: logger.info.bind(undefined, newPrefix),
|
|
1258
|
-
warn: logger.warn.bind(undefined, newPrefix),
|
|
1259
|
-
debug: logger.debug.bind(undefined, newPrefix),
|
|
1260
|
-
error: logger.error.bind(undefined, newPrefix),
|
|
1261
|
-
table: console.table,
|
|
1262
|
-
with: logger.with
|
|
1263
|
-
};
|
|
1264
|
-
newLogger.with = context.bind(undefined, newLogger);
|
|
1265
|
-
return newLogger;
|
|
1266
|
-
};
|
|
1267
|
-
var InitLogger = () => {
|
|
1268
|
-
const logger = {
|
|
1269
|
-
info,
|
|
1270
|
-
warn,
|
|
1271
|
-
debug,
|
|
1272
|
-
error,
|
|
1273
|
-
table: console.table
|
|
1274
|
-
};
|
|
1275
|
-
logger.with = context.bind(undefined, logger);
|
|
1276
|
-
return logger;
|
|
1277
|
-
};
|
|
1278
|
-
var joinCtx = (ctx) => ctx.map((e) => e === undefined ? UNDEF : e).join(SEPARATOR);
|
|
1279
|
-
var Ctx = (logger) => logger === undefined ? undefined : logger?.with === undefined ? { ...logger, with: () => Ctx(logger) } : logger;
|
|
1280
|
-
|
|
1281
|
-
// src/services/Result.ts
|
|
1282
|
-
var Ok = (t) => ({
|
|
1283
|
-
ok: true,
|
|
1284
|
-
value: t
|
|
1285
|
-
});
|
|
1286
|
-
var Err = (e) => ({
|
|
1287
|
-
ok: false,
|
|
1288
|
-
error: e
|
|
1289
|
-
});
|
|
1290
|
-
var TryDo = (fn) => {
|
|
1291
|
-
try {
|
|
1292
|
-
return Ok(fn());
|
|
1293
|
-
} catch (err) {
|
|
1294
|
-
return Err(err);
|
|
1295
|
-
}
|
|
1296
|
-
};
|
|
1297
|
-
var TryDoFlat = (fn) => {
|
|
1298
|
-
try {
|
|
1299
|
-
return fn();
|
|
1300
|
-
} catch (err) {
|
|
1301
|
-
return Err(err);
|
|
1302
|
-
}
|
|
1303
|
-
};
|
|
1304
|
-
var TryDoAsync = async (fn) => {
|
|
1305
|
-
try {
|
|
1306
|
-
return Ok(await fn());
|
|
1307
|
-
} catch (err) {
|
|
1308
|
-
return Err(err);
|
|
1309
|
-
}
|
|
1310
|
-
};
|
|
1311
|
-
var GetValue = (result) => result?.ok ? result.value : undefined;
|
|
1312
|
-
var ValueOr = (result, or) => result?.ok ? result.value : or;
|
|
1313
|
-
var GetValueOrThrow = (result) => {
|
|
1314
|
-
if (result.ok) {
|
|
1315
|
-
return result.value;
|
|
1316
|
-
}
|
|
1317
|
-
throw result.error;
|
|
1318
|
-
};
|
|
1319
|
-
var WrapValue = (value) => {
|
|
1320
|
-
if (value === undefined || value === null) {
|
|
1321
|
-
return Err(new NoValueError(value));
|
|
1322
|
-
}
|
|
1323
|
-
return Ok(value);
|
|
1324
|
-
};
|
|
1325
|
-
var AssertValue = GetValueOrThrow;
|
|
1326
|
-
var AllOrNone = (results) => {
|
|
1327
|
-
const failed = results.filter((res) => !res.ok).map((res) => res.error);
|
|
1328
|
-
if (failed.length > 0) {
|
|
1329
|
-
return Err(new MultipleErrorsError(failed));
|
|
1330
|
-
}
|
|
1331
|
-
const success = results.filter((res) => res.ok).map((res) => res.value);
|
|
1332
|
-
return Ok(success);
|
|
1333
|
-
};
|
|
1334
|
-
var Some = (results) => {
|
|
1335
|
-
const success = results.filter((res) => res.ok).map((res) => res.value);
|
|
1336
|
-
return Ok(success);
|
|
1337
|
-
};
|
|
1338
|
-
var Filter = (...results) => {
|
|
1339
|
-
const success = Some(results).value.map((val) => Ok(val));
|
|
1340
|
-
const failed = results.filter((res) => !res.ok);
|
|
1341
|
-
return [success, failed];
|
|
1342
|
-
};
|
|
1343
|
-
var AnyFailed = (...results) => {
|
|
1344
|
-
const errors = results.filter((res) => !res.ok).map((res) => res.error);
|
|
1345
|
-
if (errors.length) {
|
|
1346
|
-
return [true, errors];
|
|
1347
|
-
}
|
|
1348
|
-
return [false];
|
|
1349
|
-
};
|
|
1350
|
-
|
|
1351
|
-
class MultipleErrorsError extends Error {
|
|
1352
|
-
errors;
|
|
1353
|
-
constructor(errors) {
|
|
1354
|
-
super(`Got multiple errors:
|
|
1355
|
-
` + errors.map((err) => "\t" + err.message.substring(0, 32).padEnd(35, ".")).join(`
|
|
1356
|
-
`));
|
|
1357
|
-
this.errors = errors;
|
|
1358
|
-
}
|
|
1359
|
-
}
|
|
1360
|
-
var Pipe = (result) => ({
|
|
1361
|
-
then: pipeThen(result),
|
|
1362
|
-
result: pipeResult(result),
|
|
1363
|
-
value: pipeValue(result),
|
|
1364
|
-
valueOr: pipeValueOr(result),
|
|
1365
|
-
valueOrThrow: pipeValueOrThrow(result)
|
|
1366
|
-
});
|
|
1367
|
-
var pipeThen = (result) => (fn) => {
|
|
1368
|
-
if (!result.ok) {
|
|
1369
|
-
return Pipe(result);
|
|
1370
|
-
}
|
|
1371
|
-
return Pipe(Ok(fn(result.value)));
|
|
1372
|
-
};
|
|
1373
|
-
var pipeResult = (result) => () => result;
|
|
1374
|
-
var pipeValue = (result) => () => GetValue(result);
|
|
1375
|
-
var pipeValueOr = (result) => (or) => GetValue(result) ?? or;
|
|
1376
|
-
var pipeValueOrThrow = (result) => () => {
|
|
1377
|
-
if (result.ok) {
|
|
1378
|
-
return result.value;
|
|
1379
|
-
}
|
|
1380
|
-
throw result.error;
|
|
1381
|
-
};
|
|
1382
|
-
var AsyncPipe = (result) => ({
|
|
1383
|
-
then: asyncPipeThen(result),
|
|
1384
|
-
result: asyncPipeResult(result),
|
|
1385
|
-
value: asyncPipeValue(result),
|
|
1386
|
-
valueOr: asyncPipeValueOr(result),
|
|
1387
|
-
valueOrThrow: asyncPipeValueOrThrow(result)
|
|
1388
|
-
});
|
|
1389
|
-
var asyncPipeThen = (result) => (fn) => {
|
|
1390
|
-
const asyncResult = result;
|
|
1391
|
-
const wrappedPromiseResult = asyncResult.then((unwrappedResult) => {
|
|
1392
|
-
if (unwrappedResult.ok) {
|
|
1393
|
-
try {
|
|
1394
|
-
const fnRes = fn(unwrappedResult.value);
|
|
1395
|
-
return Promise.resolve(fnRes).catch(Err);
|
|
1396
|
-
} catch (err) {
|
|
1397
|
-
return Err(err);
|
|
1398
|
-
}
|
|
1399
|
-
} else {
|
|
1400
|
-
return unwrappedResult;
|
|
1401
|
-
}
|
|
1402
|
-
});
|
|
1403
|
-
return AsyncPipe(wrappedPromiseResult);
|
|
1404
|
-
};
|
|
1405
|
-
var asyncPipeResult = (result) => () => result;
|
|
1406
|
-
var asyncPipeValue = (result) => async () => {
|
|
1407
|
-
try {
|
|
1408
|
-
const res = await result;
|
|
1409
|
-
if (res.ok) {
|
|
1410
|
-
return res.value;
|
|
1411
|
-
}
|
|
1412
|
-
return;
|
|
1413
|
-
} catch {
|
|
1414
|
-
return;
|
|
1415
|
-
}
|
|
1416
|
-
};
|
|
1417
|
-
var asyncPipeValueOr = (result) => async (or) => {
|
|
1418
|
-
try {
|
|
1419
|
-
const res = await result;
|
|
1420
|
-
if (res.ok) {
|
|
1421
|
-
return res.value;
|
|
1422
|
-
}
|
|
1423
|
-
return or;
|
|
1424
|
-
} catch {
|
|
1425
|
-
return or;
|
|
1426
|
-
}
|
|
1427
|
-
};
|
|
1428
|
-
var asyncPipeValueOrThrow = (result) => async () => {
|
|
1429
|
-
const res = await result;
|
|
1430
|
-
if (res.ok) {
|
|
1431
|
-
return res.value;
|
|
1432
|
-
}
|
|
1433
|
-
throw res.error;
|
|
1434
|
-
};
|
|
1435
|
-
var ResultStream = (results) => ({
|
|
1436
|
-
map: streamMap(results),
|
|
1437
|
-
filter: streamFilter(results),
|
|
1438
|
-
results: streamResults(results),
|
|
1439
|
-
value: streamValue(results),
|
|
1440
|
-
valueOr: streamValueOr(results),
|
|
1441
|
-
valueOrThrow: streamValueOrThrow(results)
|
|
1442
|
-
});
|
|
1443
|
-
var streamMap = (results) => (fn) => {
|
|
1444
|
-
if (!results.ok) {
|
|
1445
|
-
return ResultStream(results);
|
|
1446
|
-
}
|
|
1447
|
-
return ResultStream(Ok(results.value.map(fn)));
|
|
1448
|
-
};
|
|
1449
|
-
var streamFilter = (results) => (fn) => {
|
|
1450
|
-
if (!results.ok) {
|
|
1451
|
-
return ResultStream(results);
|
|
1452
|
-
}
|
|
1453
|
-
return ResultStream(Ok(results.value.filter(fn)));
|
|
1454
|
-
};
|
|
1455
|
-
var streamResults = (results) => () => results;
|
|
1456
|
-
var streamValue = (results) => () => results.ok ? results.value : undefined;
|
|
1457
|
-
var streamValueOr = (results) => (or) => results.ok ? results.value : or;
|
|
1458
|
-
var streamValueOrThrow = (results) => () => {
|
|
1459
|
-
if (results.ok) {
|
|
1460
|
-
return results.value;
|
|
1461
|
-
} else {
|
|
1462
|
-
throw results.error;
|
|
1463
|
-
}
|
|
1464
|
-
};
|
|
1465
|
-
|
|
1466
|
-
class NoValueError extends Error {
|
|
1467
|
-
value;
|
|
1468
|
-
constructor(value) {
|
|
1469
|
-
super("Value was undefined or null");
|
|
1470
|
-
this.value = value;
|
|
1471
|
-
}
|
|
1472
|
-
}
|
|
1473
|
-
|
|
1474
|
-
// src/services/Geo.ts
|
|
1475
|
-
var SURF_GEO_SERVICE_URL = "https://g.surfside.io/enrich";
|
|
1476
|
-
var LOCATION_TYPE_IP = 2;
|
|
1477
|
-
var IP_SERVICES_MAXMIND = 3;
|
|
1478
|
-
var GetGeo = async (logger, apiToken, ip) => {
|
|
1479
|
-
const log2 = Ctx(logger)?.with("GeoService");
|
|
1480
|
-
log2?.info("Getting Geo info");
|
|
1481
|
-
try {
|
|
1482
|
-
const response = await fetch(SURF_GEO_SERVICE_URL);
|
|
1483
|
-
log2?.debug("Geo Response", response);
|
|
1484
|
-
return Ok(await response.json());
|
|
1485
|
-
} catch (err) {
|
|
1486
|
-
return Err(err);
|
|
1487
|
-
}
|
|
1488
|
-
};
|
|
1489
|
-
var GeoContextToORTB = (logger, geoContext) => ({
|
|
1490
|
-
lat: geoContext.coords.latitude,
|
|
1491
|
-
lon: geoContext.coords.longitude,
|
|
1492
|
-
city: geoContext.city,
|
|
1493
|
-
region: geoContext.region,
|
|
1494
|
-
country: geoContext.country,
|
|
1495
|
-
zip: geoContext.zip,
|
|
1496
|
-
type: LOCATION_TYPE_IP,
|
|
1497
|
-
accuracy: geoContext.coords.accuracy,
|
|
1498
|
-
utcoffset: geoContext.utcoffset,
|
|
1499
|
-
ipservice: IP_SERVICES_MAXMIND
|
|
1500
|
-
});
|
|
1501
|
-
// src/services/Device.ts
|
|
1502
|
-
var GetDevice = (logger, screen, navigator2, mobile) => {
|
|
1503
|
-
const log2 = Ctx(logger)?.with("DeviceService");
|
|
1504
|
-
log2?.info("Getting device info");
|
|
1505
|
-
const deviceInfo = getDeviceInfo(log2, navigator2.userAgent);
|
|
1506
|
-
const sua = {
|
|
1507
|
-
model: deviceInfo?.model,
|
|
1508
|
-
mobile: mobile ? 1 : 0,
|
|
1509
|
-
browsers: deviceInfo?.browser !== undefined ? [deviceInfo.browser] : undefined,
|
|
1510
|
-
platform: deviceInfo?.os !== undefined ? {
|
|
1511
|
-
brand: deviceInfo?.os,
|
|
1512
|
-
version: deviceInfo?.osv?.split(".")
|
|
1513
|
-
} : undefined,
|
|
1514
|
-
architecture: getCPUArchitecture(log2, navigator2.userAgent, mobile),
|
|
1515
|
-
source: 3
|
|
1516
|
-
};
|
|
1517
|
-
return Ok({
|
|
1518
|
-
make: deviceInfo?.make,
|
|
1519
|
-
model: deviceInfo?.model,
|
|
1520
|
-
w: screen.width,
|
|
1521
|
-
h: screen.height,
|
|
1522
|
-
language: navigator2.language,
|
|
1523
|
-
ua: navigator2.userAgent,
|
|
1524
|
-
devicetype: getDeviceType(log2, screen, mobile),
|
|
1525
|
-
os: deviceInfo?.os,
|
|
1526
|
-
osv: deviceInfo?.osv,
|
|
1527
|
-
sua
|
|
1528
|
-
});
|
|
1529
|
-
};
|
|
1530
|
-
var getDeviceInfo = (logger, userAgent) => {
|
|
1531
|
-
const log2 = Ctx(logger)?.with("tryGetDeviceInfo");
|
|
1532
|
-
log2?.debug("getting device info");
|
|
1533
|
-
const userAgentLower = userAgent.toLowerCase();
|
|
1534
|
-
const browser = getBrowserInfo(log2, navigator.userAgent);
|
|
1535
|
-
if (userAgentLower.includes("android")) {
|
|
1536
|
-
return {
|
|
1537
|
-
...getAndroidDeviceInfo(log2, userAgent),
|
|
1538
|
-
browser
|
|
1539
|
-
};
|
|
1540
|
-
} else if (userAgentLower.includes("iphone") || userAgentLower.includes("ipad")) {
|
|
1541
|
-
return {
|
|
1542
|
-
...getiPhoneDeviceInfo(log2, userAgent),
|
|
1543
|
-
browser
|
|
1544
|
-
};
|
|
1545
|
-
} else if (userAgentLower.includes("windows nt")) {
|
|
1546
|
-
return {
|
|
1547
|
-
make: "Microsoft",
|
|
1548
|
-
model: "Windows",
|
|
1549
|
-
os: "Windows",
|
|
1550
|
-
osv: /Windows NT (?<osv>[0-9.]+)/ig.exec(userAgent)?.groups?.osv,
|
|
1551
|
-
browser
|
|
1552
|
-
};
|
|
1553
|
-
} else if (userAgentLower.includes("macintosh")) {
|
|
1554
|
-
return {
|
|
1555
|
-
make: "Apple",
|
|
1556
|
-
model: "Macintosh",
|
|
1557
|
-
os: "MacOS",
|
|
1558
|
-
osv: /Mac OS X (?<osv>[0-9_]+)/ig.exec(userAgent)?.groups?.osv?.replaceAll("_", "."),
|
|
1559
|
-
browser
|
|
1560
|
-
};
|
|
1561
|
-
}
|
|
1562
|
-
return { browser };
|
|
1563
|
-
};
|
|
1564
|
-
var getAndroidDeviceInfo = (logger, userAgent) => {
|
|
1565
|
-
const log2 = Ctx(logger)?.with("getAndroidDeviceInfo");
|
|
1566
|
-
log2?.debug("getting android info");
|
|
1567
|
-
const match = /^[^\s]+\s\((?<Linux>.*);\s*(?<osv>[^)]+);\s*(?<Model>[^)]+)\)/ig.exec(userAgent);
|
|
1568
|
-
const osv = match?.groups?.osv;
|
|
1569
|
-
const model = match?.groups?.Model;
|
|
1570
|
-
const partialDevice = {
|
|
1571
|
-
os: "Android",
|
|
1572
|
-
osv,
|
|
1573
|
-
model
|
|
1574
|
-
};
|
|
1575
|
-
if (model !== undefined) {
|
|
1576
|
-
if (model.includes("Pixel")) {
|
|
1577
|
-
return {
|
|
1578
|
-
...partialDevice,
|
|
1579
|
-
make: "Google"
|
|
1580
|
-
};
|
|
1581
|
-
} else if (model.includes("SM-")) {
|
|
1582
|
-
return {
|
|
1583
|
-
...partialDevice,
|
|
1584
|
-
make: "Samsung"
|
|
1585
|
-
};
|
|
1586
|
-
} else if (model.startsWith("LG-")) {
|
|
1587
|
-
return {
|
|
1588
|
-
...partialDevice,
|
|
1589
|
-
make: "LG"
|
|
1590
|
-
};
|
|
1591
|
-
} else if (model.startsWith("moto")) {
|
|
1592
|
-
return {
|
|
1593
|
-
...partialDevice,
|
|
1594
|
-
make: "Motorola"
|
|
1595
|
-
};
|
|
1596
|
-
} else if (model.startsWith("Redmi")) {
|
|
1597
|
-
return {
|
|
1598
|
-
...partialDevice,
|
|
1599
|
-
make: "Xiaomi"
|
|
1600
|
-
};
|
|
1601
|
-
} else {
|
|
1602
|
-
return {
|
|
1603
|
-
...partialDevice,
|
|
1604
|
-
make: "Android"
|
|
1605
|
-
};
|
|
1606
|
-
}
|
|
1607
|
-
}
|
|
1608
|
-
return {
|
|
1609
|
-
os: "Android",
|
|
1610
|
-
osv
|
|
1611
|
-
};
|
|
1612
|
-
};
|
|
1613
|
-
var getiPhoneDeviceInfo = (logger, userAgent) => {
|
|
1614
|
-
const log2 = Ctx(logger)?.with("getIphoneDeviceInfo");
|
|
1615
|
-
log2?.debug("getting iPhone info");
|
|
1616
|
-
const match = /^[^\s]+\s*\((?<Device>[^;]+);\s(?<Model>[^;)]+[;)])\s(?<ModelExt>[^;)]+[;)])?/ig.exec(userAgent);
|
|
1617
|
-
const make = "Apple";
|
|
1618
|
-
const device = match?.groups?.Device;
|
|
1619
|
-
const model = device?.toLowerCase().includes("ipad") ? "iPad" : "iPhone";
|
|
1620
|
-
const modelGroup = match?.groups?.Model;
|
|
1621
|
-
const os = "iOS";
|
|
1622
|
-
const osvSearch = modelGroup === "U" ? match?.groups?.ModelExt : modelGroup;
|
|
1623
|
-
const osv = osvSearch !== undefined ? /OS (?<ver>[0-9_]+)/ig.exec(osvSearch)?.groups?.ModelExt : undefined;
|
|
1624
|
-
return {
|
|
1625
|
-
make,
|
|
1626
|
-
model,
|
|
1627
|
-
os,
|
|
1628
|
-
osv
|
|
1629
|
-
};
|
|
1630
|
-
};
|
|
1631
|
-
var getBrowserInfo = (logger, userAgent) => {
|
|
1632
|
-
const log2 = Ctx(logger)?.with("getBrowserInfo");
|
|
1633
|
-
log2?.debug("getting browser info");
|
|
1634
|
-
try {
|
|
1635
|
-
if (userAgent.includes("Firefox/")) {
|
|
1636
|
-
return {
|
|
1637
|
-
version: userAgent.split("Firefox/")[1]?.split("."),
|
|
1638
|
-
brand: "Firefox"
|
|
1639
|
-
};
|
|
1640
|
-
} else if (userAgent.includes("Chrome/")) {
|
|
1641
|
-
return {
|
|
1642
|
-
version: userAgent.split("Chrome/")[1]?.split(" ")[0]?.split("."),
|
|
1643
|
-
brand: "Chrome"
|
|
1644
|
-
};
|
|
1645
|
-
} else if (userAgent.includes("CriOS")) {
|
|
1646
|
-
return {
|
|
1647
|
-
version: userAgent.split("CriOS/")[1]?.split(" ")[0]?.split("."),
|
|
1648
|
-
brand: "Chrome"
|
|
1649
|
-
};
|
|
1650
|
-
} else if (userAgent.includes("Safari/") && !userAgent.includes("Chrome")) {
|
|
1651
|
-
return {
|
|
1652
|
-
version: userAgent.split("Version/")[1]?.split(" ")[0]?.split("."),
|
|
1653
|
-
brand: "Safari"
|
|
1654
|
-
};
|
|
1655
|
-
} else if (userAgent.includes("Edg/")) {
|
|
1656
|
-
return {
|
|
1657
|
-
version: userAgent.split("Edg/")[1]?.split("."),
|
|
1658
|
-
brand: "Edge"
|
|
1659
|
-
};
|
|
1660
|
-
}
|
|
1661
|
-
} catch (error2) {
|
|
1662
|
-
log2?.error(error2);
|
|
1663
|
-
}
|
|
1664
|
-
};
|
|
1665
|
-
var getCPUArchitecture = (logger, userAgent, mobile) => {
|
|
1666
|
-
const log2 = Ctx(logger)?.with("getCPUArchitecture");
|
|
1667
|
-
log2?.debug("Getting CPU arch");
|
|
1668
|
-
if (/Win64|x64|x86_64|WOW64/.test(userAgent)) {
|
|
1669
|
-
return "x64";
|
|
1670
|
-
}
|
|
1671
|
-
if (/Win32|x86/.test(userAgent)) {
|
|
1672
|
-
return "x86";
|
|
1673
|
-
}
|
|
1674
|
-
if (/aarch64|arm64/.test(userAgent)) {
|
|
1675
|
-
return "ARM64";
|
|
1676
|
-
}
|
|
1677
|
-
if (/armv\d+/.test(userAgent)) {
|
|
1678
|
-
return "ARM";
|
|
1679
|
-
}
|
|
1680
|
-
if (mobile) {
|
|
1681
|
-
return "ARM";
|
|
1682
|
-
}
|
|
1683
|
-
log2?.warn("Failed to get cpu architecture");
|
|
1684
|
-
return;
|
|
1685
|
-
};
|
|
1686
|
-
var getDeviceType = (logger, screen, mobile) => {
|
|
1687
|
-
const log2 = Ctx(logger)?.with("getDeviceType");
|
|
1688
|
-
log2?.debug("getting device type");
|
|
1689
|
-
const MINIMUM_SHORT_TABLET = 600;
|
|
1690
|
-
const MAXIMUM_LONG_TABLET = 960;
|
|
1691
|
-
const hasTouch = mobile;
|
|
1692
|
-
if (!hasTouch) {
|
|
1693
|
-
return AdCom10DeviceTypes.PC;
|
|
1694
|
-
}
|
|
1695
|
-
const width = screen.width;
|
|
1696
|
-
const height = screen.height;
|
|
1697
|
-
const [shorterSide, longerSide] = [width, height].sort((a, b) => a - b);
|
|
1698
|
-
if (hasTouch && shorterSide >= MINIMUM_SHORT_TABLET && longerSide >= MAXIMUM_LONG_TABLET) {
|
|
1699
|
-
return AdCom10DeviceTypes.Tablet;
|
|
1700
|
-
}
|
|
1701
|
-
return AdCom10DeviceTypes.Mobile;
|
|
1702
|
-
};
|
|
1703
|
-
// src/services/Configuration.ts
|
|
1704
|
-
var GetConfiguration = async (logger, url, handlebars, helpers, accountId, siteId) => {
|
|
1705
|
-
const log2 = Ctx(logger)?.with("ConfigurationService").with(url).with(accountId).with(siteId);
|
|
1706
|
-
log2?.info("Getting configuration");
|
|
1707
|
-
try {
|
|
1708
|
-
const response = await fetch(`${url}/${accountId}/${siteId}/config.json`);
|
|
1709
|
-
if (!response.ok) {
|
|
1710
|
-
log2?.error("Failed to get configuration", url, accountId, siteId);
|
|
1711
|
-
return Err(new Error("Failed to get configuration"));
|
|
1712
|
-
}
|
|
1713
|
-
const config = await response.json();
|
|
1714
|
-
if (config.settings === undefined || config.templates === undefined) {
|
|
1715
|
-
log2?.error("configuration was an invalid format");
|
|
1716
|
-
return Err(new Error("configuration was an invalid format"));
|
|
1717
|
-
}
|
|
1718
|
-
log2?.debug("configuration: ", config);
|
|
1719
|
-
return await mapConfig(log2, handlebars, helpers, config);
|
|
1720
|
-
} catch (err) {
|
|
1721
|
-
return Err(err);
|
|
1722
|
-
}
|
|
1723
|
-
};
|
|
1724
|
-
var mapConfig = async (logger, handlebars, helpers, config) => {
|
|
1725
|
-
const log2 = Ctx(logger)?.with("mapConfig");
|
|
1726
|
-
log2?.debug("mapping configuration");
|
|
1727
|
-
const productCardTemplate = handlebars.template((await importModule(log2, `export default ${config.templates?.productCardTemplate ?? ""}`)).default);
|
|
1728
|
-
const clickthroughTemplate = handlebars.template((await importModule(log2, `export default ${config.templates?.clickThroughUrlTemplate ?? ""}`)).default);
|
|
1729
|
-
return Ok({
|
|
1730
|
-
settings: config.settings,
|
|
1731
|
-
templates: {
|
|
1732
|
-
clickThroughUrlTemplate: (context2) => clickthroughTemplate(context2, { helpers }),
|
|
1733
|
-
productCardTemplate: (context2) => productCardTemplate(context2, { helpers }),
|
|
1734
|
-
javascriptCallbacks: await importModule(log2, config.templates?.javascriptCallbacks ?? ""),
|
|
1735
|
-
productCardStylesheet: config.templates?.productCardStylesheet,
|
|
1736
|
-
carouselStylesheet: config.templates?.carouselStylesheet
|
|
1737
|
-
},
|
|
1738
|
-
dynamicZones: config.dynamicZones
|
|
1739
|
-
});
|
|
1740
|
-
};
|
|
1741
|
-
var importModule = async (logger, script) => {
|
|
1742
|
-
const log2 = Ctx(logger)?.with("importModule");
|
|
1743
|
-
log2?.debug("importing", script);
|
|
1744
|
-
const blob = new Blob([script], { type: "text/javascript" });
|
|
1745
|
-
const moduleUrl = URL.createObjectURL(blob);
|
|
1746
|
-
log2?.debug("moduleUrl", moduleUrl);
|
|
1747
|
-
const module = await import(moduleUrl);
|
|
1748
|
-
log2?.debug("module:", module);
|
|
1749
|
-
return module;
|
|
1750
|
-
};
|
|
1751
|
-
// src/services/Bidder.ts
|
|
1752
|
-
var AUCTION_PRICE_MACRO = /(?:\$|%24)?(?:\{|%7b)auction_price(?:\}|%7d)/ig;
|
|
1753
|
-
var RequestBids = async (logger, url, accountId, siteId, locationId, channelId, bidRequest) => {
|
|
1754
|
-
const log2 = Ctx(logger)?.with("RequestBids").with(accountId).with(siteId).with(locationId).with(channelId);
|
|
1755
|
-
log2?.info("Requesting bids");
|
|
1756
|
-
log2?.debug(bidRequest);
|
|
1757
|
-
try {
|
|
1758
|
-
const response = await fetch(url, {
|
|
1759
|
-
method: "POST",
|
|
1760
|
-
body: JSON.stringify(bidRequest)
|
|
1761
|
-
});
|
|
1762
|
-
log2?.debug("Got response", response);
|
|
1763
|
-
if (response.status !== 200) {
|
|
1764
|
-
switch (response.status) {
|
|
1765
|
-
case 204:
|
|
1766
|
-
log2?.warn("No bids", bidRequest, response);
|
|
1767
|
-
return Err(new NoBidsError(bidRequest, response));
|
|
1768
|
-
case 500:
|
|
1769
|
-
log2?.error("Bidder failed serverside. Report this error.", bidRequest, response);
|
|
1770
|
-
return Err(new InternalServerError(bidRequest, response));
|
|
1771
|
-
case 503:
|
|
1772
|
-
log2?.error("Bidder starting up. Try again in a few minutes", bidRequest, response);
|
|
1773
|
-
return Err(new BidderStartingUpError(bidRequest, response));
|
|
1774
|
-
default:
|
|
1775
|
-
log2?.error("Unknown bidder error", bidRequest, response);
|
|
1776
|
-
return Err(new UnknownBidderError(bidRequest, response));
|
|
1777
|
-
}
|
|
1778
|
-
}
|
|
1779
|
-
log2?.debug("Successfully got bids", bidRequest);
|
|
1780
|
-
const bidResponse = await response.json();
|
|
1781
|
-
if (bidResponse.seatbid === undefined || bidResponse.seatbid.length === 0) {
|
|
1782
|
-
log2?.error("Bidder didn't return any seatbids");
|
|
1783
|
-
return Err(new MalformedBidResponseError(bidRequest, response, bidResponse));
|
|
1784
|
-
}
|
|
1785
|
-
for (let i = 0;i < bidResponse.seatbid.length; i++) {
|
|
1786
|
-
const seatbid = bidResponse.seatbid[i];
|
|
1787
|
-
if (seatbid === undefined) {
|
|
1788
|
-
log2?.warn(`Seatbid #${i} was undefined`, bidRequest, response, bidResponse);
|
|
1789
|
-
continue;
|
|
1790
|
-
}
|
|
1791
|
-
for (let j = 0;j < seatbid.bid.length; j++) {
|
|
1792
|
-
const bid = seatbid.bid[j];
|
|
1793
|
-
if (bid === undefined) {
|
|
1794
|
-
log2?.warn(`Bid #${j} in seatbid #${i} was undefined`);
|
|
1795
|
-
continue;
|
|
1796
|
-
}
|
|
1797
|
-
try {
|
|
1798
|
-
bid.adm = decodeURIComponent(bid?.adm ?? "").replaceAll(/\\"/ig, '"');
|
|
1799
|
-
} catch {
|
|
1800
|
-
log2?.debug("Adm is not encoded. This is not an issue. Moving on.");
|
|
1801
|
-
}
|
|
1802
|
-
bid.nurl = bid.nurl?.replace(AUCTION_PRICE_MACRO, bid.price.toString());
|
|
1803
|
-
bid.adm = bid.adm?.replaceAll(AUCTION_PRICE_MACRO, bid.price.toString());
|
|
1804
|
-
}
|
|
1805
|
-
}
|
|
1806
|
-
log2?.debug("Returning bid responses");
|
|
1807
|
-
return Ok(bidResponse);
|
|
1808
|
-
} catch (err) {
|
|
1809
|
-
return Err(err);
|
|
1810
|
-
}
|
|
1811
|
-
};
|
|
1812
|
-
|
|
1813
|
-
class NoBidsError extends Error {
|
|
1814
|
-
request;
|
|
1815
|
-
response;
|
|
1816
|
-
constructor(request, response) {
|
|
1817
|
-
super("204 - No bids available for request");
|
|
1818
|
-
this.request = request;
|
|
1819
|
-
this.response = response;
|
|
1820
|
-
}
|
|
1821
|
-
}
|
|
1822
|
-
|
|
1823
|
-
class InternalServerError extends Error {
|
|
1824
|
-
request;
|
|
1825
|
-
response;
|
|
1826
|
-
constructor(request, response) {
|
|
1827
|
-
super("500 - Bidder had an unknown serverside error");
|
|
1828
|
-
this.request = request;
|
|
1829
|
-
this.response = response;
|
|
1830
|
-
}
|
|
1831
|
-
}
|
|
1832
|
-
|
|
1833
|
-
class BidderStartingUpError extends Error {
|
|
1834
|
-
request;
|
|
1835
|
-
response;
|
|
1836
|
-
constructor(request, response) {
|
|
1837
|
-
super("503 - Bidder is starting up");
|
|
1838
|
-
this.request = request;
|
|
1839
|
-
this.response = response;
|
|
1840
|
-
}
|
|
1841
|
-
}
|
|
1842
|
-
|
|
1843
|
-
class UnknownBidderError extends Error {
|
|
1844
|
-
request;
|
|
1845
|
-
response;
|
|
1846
|
-
constructor(request, response) {
|
|
1847
|
-
super("Unknown bidder error");
|
|
1848
|
-
this.request = request;
|
|
1849
|
-
this.response = response;
|
|
1850
|
-
}
|
|
1851
|
-
}
|
|
1852
|
-
|
|
1853
|
-
class MalformedBidResponseError extends Error {
|
|
1854
|
-
request;
|
|
1855
|
-
response;
|
|
1856
|
-
bidResponse;
|
|
1857
|
-
constructor(request, response, bidResponse) {
|
|
1858
|
-
super("Malformed bid response error");
|
|
1859
|
-
this.request = request;
|
|
1860
|
-
this.response = response;
|
|
1861
|
-
this.bidResponse = bidResponse;
|
|
1862
|
-
}
|
|
1863
|
-
}
|
|
1864
|
-
// src/services/Product.ts
|
|
1865
|
-
async function* GetSponsoredProduct(logger, url, accountId, locationId, nativeId) {
|
|
1866
|
-
const log2 = Ctx(logger)?.with("GetSponsoredProduct").with(accountId).with(locationId).with(nativeId);
|
|
1867
|
-
log2?.info("Getting sponsored product");
|
|
1868
|
-
try {
|
|
1869
|
-
const rawResponse = await fetch(`${url}/native/${accountId}/${locationId}/${nativeId}.json`);
|
|
1870
|
-
if (rawResponse.status !== 200) {
|
|
1871
|
-
log2?.error("product feed service returned with non-200 response", rawResponse.status);
|
|
1872
|
-
return;
|
|
1873
|
-
}
|
|
1874
|
-
const products = rawResponse;
|
|
1875
|
-
log2?.debug("response", products);
|
|
1876
|
-
if (Array.isArray(products)) {
|
|
1877
|
-
log2?.debug("Brand level creative");
|
|
1878
|
-
const productArr = products;
|
|
1879
|
-
for (const product of productArr) {
|
|
1880
|
-
yield mapResponseToProductInfo(log2, product);
|
|
1881
|
-
}
|
|
1882
|
-
} else {
|
|
1883
|
-
log2?.debug("Individual product creative");
|
|
1884
|
-
const product = products;
|
|
1885
|
-
return mapResponseToProductInfo(log2, product);
|
|
1886
|
-
}
|
|
1887
|
-
} catch (err) {
|
|
1888
|
-
log2?.error(err);
|
|
1889
|
-
}
|
|
1890
|
-
}
|
|
1891
|
-
var GetAllSponsoredProducts = async (logger, url, accountId, locationId, nativeId) => {
|
|
1892
|
-
const log2 = Ctx(logger)?.with("GetSponsoredProduct").with(accountId).with(locationId).with(nativeId);
|
|
1893
|
-
log2?.info("Getting sponsored product");
|
|
1894
|
-
try {
|
|
1895
|
-
const rawResponse = await fetch(`${url}/native/${accountId}/${locationId}/${nativeId}.json`);
|
|
1896
|
-
if (rawResponse.status !== 200) {
|
|
1897
|
-
log2?.error("product feed service returned with non-200 response", rawResponse.status);
|
|
1898
|
-
return Err(new NoNativeError(nativeId));
|
|
1899
|
-
}
|
|
1900
|
-
const products = await rawResponse.json();
|
|
1901
|
-
log2?.debug("response", products);
|
|
1902
|
-
if (Array.isArray(products)) {
|
|
1903
|
-
log2?.debug("Brand level creative");
|
|
1904
|
-
const productArr = products;
|
|
1905
|
-
const mapResponseToProductInfoLogged = mapResponseToProductInfo.bind(undefined, log2);
|
|
1906
|
-
return Ok(productArr.map(mapResponseToProductInfoLogged));
|
|
1907
|
-
} else {
|
|
1908
|
-
log2?.debug("Individual product creative");
|
|
1909
|
-
const product = products;
|
|
1910
|
-
return Ok([mapResponseToProductInfo(log2, product)]);
|
|
1911
|
-
}
|
|
1912
|
-
} catch (err) {
|
|
1913
|
-
log2?.error(err);
|
|
1914
|
-
return Err(err);
|
|
1915
|
-
}
|
|
1916
|
-
};
|
|
1917
|
-
var GetRecommendedProduct = async (logger, url, accountId, locationId, productId) => {
|
|
1918
|
-
const log2 = Ctx(logger)?.with("GetRecommendedProduct").with(accountId).with(locationId).with(productId);
|
|
1919
|
-
log2?.info("Getting recommended product");
|
|
1920
|
-
try {
|
|
1921
|
-
const rawResponse = await fetch(`${url}/product/${accountId}/${locationId}/${productId}.json`);
|
|
1922
|
-
if (rawResponse.status !== 200) {
|
|
1923
|
-
log2?.error("product feed service returned with non-200 response", rawResponse.status);
|
|
1924
|
-
return Err(new Error("product feed service returned with non-200 response"));
|
|
1925
|
-
}
|
|
1926
|
-
const rawProduct = await rawResponse.json();
|
|
1927
|
-
log2?.debug("response", rawProduct);
|
|
1928
|
-
const productInfo = mapResponseToProductInfo(log2, rawProduct);
|
|
1929
|
-
log2?.debug("mapped", productInfo);
|
|
1930
|
-
return Ok(productInfo);
|
|
1931
|
-
} catch (err) {
|
|
1932
|
-
log2?.error(err);
|
|
1933
|
-
return Err(err);
|
|
1934
|
-
}
|
|
1935
|
-
};
|
|
1936
|
-
var mapResponseToProductInfo = (logger, data) => {
|
|
1937
|
-
const log2 = Ctx(logger)?.with("mapResponseToProductInfo");
|
|
1938
|
-
log2?.debug("Mapping product");
|
|
1939
|
-
const getField = fieldOrUndef.bind(undefined, data);
|
|
1940
|
-
return {
|
|
1941
|
-
image: getField("image_link"),
|
|
1942
|
-
price: getField("price"),
|
|
1943
|
-
salePrice: getField("sale_price"),
|
|
1944
|
-
thc: getField("thc"),
|
|
1945
|
-
cbd: getField("cbd"),
|
|
1946
|
-
strain: getField("strain"),
|
|
1947
|
-
name: getField("name"),
|
|
1948
|
-
brand_name: getField("brand"),
|
|
1949
|
-
brandName: getField("brand"),
|
|
1950
|
-
productType: getField("productType"),
|
|
1951
|
-
details: getField("details"),
|
|
1952
|
-
cta: getField("cta"),
|
|
1953
|
-
clickthroughUrl: getField("clickthroughUrl"),
|
|
1954
|
-
winUrl: getField("winUrl"),
|
|
1955
|
-
pixelUrl: getField("pixelUrl"),
|
|
1956
|
-
ext: data
|
|
1957
|
-
};
|
|
1958
|
-
};
|
|
1959
|
-
var fieldOrUndef = (data, field) => {
|
|
1960
|
-
if (field in data) {
|
|
1961
|
-
return String(data[field]);
|
|
1962
|
-
}
|
|
1963
|
-
return;
|
|
1964
|
-
};
|
|
1965
|
-
|
|
1966
|
-
class NoNativeError extends Error {
|
|
1967
|
-
nativeId;
|
|
1968
|
-
constructor(nativeId) {
|
|
1969
|
-
super("Native ID did not exist in product feed: " + nativeId);
|
|
1970
|
-
this.nativeId = nativeId;
|
|
1971
|
-
}
|
|
1972
|
-
}
|
|
1973
|
-
// src/services/Recommender.ts
|
|
1974
|
-
async function* GenerateTopProducts(logger, productFeed, url, accountId, siteId, locationId) {
|
|
1975
|
-
const log2 = Ctx(logger)?.with("GenerateTopProducts").with(accountId).with(siteId).with(locationId);
|
|
1976
|
-
log2?.info("Generating top products");
|
|
1977
|
-
yield* generateProductRecommendation(logger, productFeed, url, accountId, siteId, locationId, undefined, "top-products");
|
|
1978
|
-
}
|
|
1979
|
-
async function* GenerateForYou(logger, productFeed, url, accountId, siteId, locationId, userId) {
|
|
1980
|
-
const log2 = Ctx(logger)?.with("GenerateForYou").with(accountId).with(siteId).with(locationId).with(userId);
|
|
1981
|
-
log2?.info("Generating for you");
|
|
1982
|
-
yield* generateProductRecommendation(logger, productFeed, url, accountId, siteId, locationId, userId, "for-you");
|
|
1983
|
-
}
|
|
1984
|
-
async function* GeneratePreviousPurchases(logger, productFeed, url, accountId, siteId, locationId, userId) {
|
|
1985
|
-
const log2 = Ctx(logger)?.with("GeneratePreviousPurchases").with(accountId).with(siteId).with(locationId).with(userId);
|
|
1986
|
-
log2?.info("Generating previous purchases");
|
|
1987
|
-
yield* generateProductRecommendation(log2, productFeed, url, accountId, siteId, locationId, userId, "buy-again");
|
|
1988
|
-
}
|
|
1989
|
-
async function* generateProductRecommendation(logger, productFeed, url, accountId, siteId, locationId, userId, type) {
|
|
1990
|
-
const log2 = Ctx(logger)?.with("generatreProductRecommendation");
|
|
1991
|
-
log2?.debug("Generating product recommendation");
|
|
1992
|
-
const recommendations = await fetchRecommendations(log2, url, accountId, siteId, locationId, userId, type);
|
|
1993
|
-
if (!recommendations.ok) {
|
|
1994
|
-
log2?.error(recommendations.error);
|
|
1995
|
-
return;
|
|
1996
|
-
}
|
|
1997
|
-
yield* generateProduct(log2, productFeed, accountId, locationId, recommendations.value);
|
|
1998
|
-
log2?.debug("out of recommendations");
|
|
1999
|
-
}
|
|
2000
|
-
var fetchRecommendations = async (logger, url, accountId, siteId, locationId, userId, type) => {
|
|
2001
|
-
const log2 = Ctx(logger)?.with("fetchRecommendations");
|
|
2002
|
-
log2?.debug("Fetching recommendations");
|
|
2003
|
-
const key = `accountId=${accountId}&siteId=${siteId}&locationId=${locationId}&userId=${userId ?? "null"}`;
|
|
2004
|
-
try {
|
|
2005
|
-
const results = await fetch(`${url}/r/${type}?${key}&limit=100`);
|
|
2006
|
-
if (!results.ok) {
|
|
2007
|
-
return Err(new Error("Failed to load recommendations. Service returned " + results.status));
|
|
2008
|
-
}
|
|
2009
|
-
const recommendations = await results.json();
|
|
2010
|
-
const error2 = recommendations.error;
|
|
2011
|
-
if (error2 !== undefined) {
|
|
2012
|
-
return Err(new Error(error2));
|
|
2013
|
-
}
|
|
2014
|
-
return Ok(recommendations);
|
|
2015
|
-
} catch (err) {
|
|
2016
|
-
return Err(err);
|
|
2017
|
-
}
|
|
2018
|
-
};
|
|
2019
|
-
async function* generateProduct(logger, productFeed, accountId, locationId, results) {
|
|
2020
|
-
const log2 = Ctx(logger)?.with("generateProduct");
|
|
2021
|
-
log2?.debug("generating product info");
|
|
2022
|
-
for (const item of results) {
|
|
2023
|
-
const itemId = item.item_id;
|
|
2024
|
-
try {
|
|
2025
|
-
log2?.debug("itemId", itemId);
|
|
2026
|
-
const product = await productFeed(itemId);
|
|
2027
|
-
log2?.debug("product", itemId, product);
|
|
2028
|
-
if (product.ok) {
|
|
2029
|
-
yield product.value;
|
|
2030
|
-
} else {
|
|
2031
|
-
log2?.warn("item was missing from product feed", itemId);
|
|
2032
|
-
}
|
|
2033
|
-
} catch (err) {
|
|
2034
|
-
log2?.warn("couldn't get product", err);
|
|
2035
|
-
}
|
|
2036
|
-
}
|
|
2037
|
-
log2?.info("no more products. Exiting");
|
|
2038
|
-
}
|
|
2039
|
-
// src/services/Template.ts
|
|
2040
|
-
var EvaluateHandlebarsProductCardTemplate = (logger, windowInfo, publisher, product, clickthrough) => {
|
|
2041
|
-
const log2 = Ctx(logger)?.with("EvaluateHandlebarsProductCardTemplate");
|
|
2042
|
-
log2?.info("Evaluating handlebars product card template", product);
|
|
2043
|
-
try {
|
|
2044
|
-
const renderedClickthrough = clickthrough ?? GetValueOrThrow(EvaluateHandlebarsClickthroughTemplate(log2, windowInfo, publisher, product));
|
|
2045
|
-
log2?.debug("Got clickthrough URL", renderedClickthrough);
|
|
2046
|
-
return Ok(publisher.templates.productCardTemplate({
|
|
2047
|
-
...product,
|
|
2048
|
-
product,
|
|
2049
|
-
window: windowInfo,
|
|
2050
|
-
publisher,
|
|
2051
|
-
catalog: product,
|
|
2052
|
-
clickthrough: renderedClickthrough
|
|
2053
|
-
}));
|
|
2054
|
-
} catch (error2) {
|
|
2055
|
-
return Err(error2);
|
|
2056
|
-
}
|
|
2057
|
-
};
|
|
2058
|
-
var EvaluateHandlebarsClickthroughTemplate = (logger, windowInfo, publisher, product) => {
|
|
2059
|
-
const log2 = Ctx(logger)?.with("EvaluateHandlebarsClickthroughTemplate");
|
|
2060
|
-
log2?.info("Evaluating handlebars clickthrough URL template", product);
|
|
2061
|
-
try {
|
|
2062
|
-
return Ok(publisher.templates.clickThroughUrlTemplate({
|
|
2063
|
-
product,
|
|
2064
|
-
catalog: product,
|
|
2065
|
-
window: windowInfo,
|
|
2066
|
-
publisher,
|
|
2067
|
-
...product
|
|
2068
|
-
}));
|
|
2069
|
-
} catch (error2) {
|
|
2070
|
-
return Err(error2);
|
|
2071
|
-
}
|
|
2072
|
-
};
|
|
2073
|
-
// src/services/Dynamic.ts
|
|
2074
|
-
var GetDynamicZone = async (logger, config, zoneId) => {
|
|
2075
|
-
const log2 = Ctx(logger)?.with("GetDynamicZone");
|
|
2076
|
-
log2?.info("Getting dynamic zone", zoneId);
|
|
2077
|
-
const dynamicZone = config?.dynamicZones?.[zoneId];
|
|
2078
|
-
if (dynamicZone === undefined) {
|
|
2079
|
-
return Err(new MissingDynamicZoneError(zoneId));
|
|
2080
|
-
}
|
|
2081
|
-
log2?.debug("Dynamic zone", dynamicZone);
|
|
2082
|
-
return Ok(dynamicZone);
|
|
2083
|
-
};
|
|
2084
|
-
var BuildDynamicZoneRequest = (logger, startRequest, nativeRequest, screenInfo, zoneId, dynamicZone) => {
|
|
2085
|
-
const log2 = Ctx(logger)?.with("BuildDynamicZoneRequest");
|
|
2086
|
-
log2?.info("Building dynamic zone request", dynamicZone);
|
|
2087
|
-
const screenSizeRes = selectDynamicScreenSize(log2, screenInfo, dynamicZone);
|
|
2088
|
-
if (!screenSizeRes.ok) {
|
|
2089
|
-
return screenSizeRes;
|
|
2090
|
-
}
|
|
2091
|
-
return buildDynamicBidRequestFromSelectedScreenSize(log2, startRequest, nativeRequest, zoneId, screenSizeRes.value);
|
|
2092
|
-
};
|
|
2093
|
-
var selectDynamicScreenSize = (logger, screenInfo, dynamicZone) => {
|
|
2094
|
-
const log2 = Ctx(logger)?.with("selectDynamicScreenSize");
|
|
2095
|
-
log2?.info("Getting screen size for dynamic zone", screenInfo);
|
|
2096
|
-
const screenSize = GetValue(TryDo(() => {
|
|
2097
|
-
if (screenInfo.width < 768) {
|
|
2098
|
-
return "mobile";
|
|
2099
|
-
} else if (screenInfo.width < 1024) {
|
|
2100
|
-
return "tablet";
|
|
2101
|
-
} else {
|
|
2102
|
-
return "desktop";
|
|
2103
|
-
}
|
|
2104
|
-
})) ?? "default";
|
|
2105
|
-
const selectedDynamic = dynamicZone.value.filter((screen) => screen.size === screenSize)?.[0] ?? dynamicZone.value.filter((screen) => screen.size === "default")?.[0];
|
|
2106
|
-
if (selectedDynamic === undefined) {
|
|
2107
|
-
return Err(new NoDynamicScreenSizeMatchError(dynamicZone, screenInfo, screenSize));
|
|
2108
|
-
}
|
|
2109
|
-
log2?.debug("selectedDynamic", selectedDynamic);
|
|
2110
|
-
return Ok(selectedDynamic);
|
|
2111
|
-
};
|
|
2112
|
-
|
|
2113
|
-
class NoDynamicScreenSizeMatchError extends Error {
|
|
2114
|
-
dynamicZone;
|
|
2115
|
-
screenInfo;
|
|
2116
|
-
selectedStringSize;
|
|
2117
|
-
constructor(dynamicZone, screenInfo, selectedStringSize) {
|
|
2118
|
-
super("No dynamic screen size matched the window width");
|
|
2119
|
-
this.dynamicZone = dynamicZone;
|
|
2120
|
-
this.screenInfo = screenInfo;
|
|
2121
|
-
this.selectedStringSize = selectedStringSize;
|
|
2122
|
-
}
|
|
2123
|
-
}
|
|
2124
|
-
var buildDynamicBidRequestFromSelectedScreenSize = (logger, startRequest, nativeRequest, zoneId, screenSize) => {
|
|
2125
|
-
const log2 = Ctx(logger)?.with("buildDynamicBidRequestFromSelectedScreenSize");
|
|
2126
|
-
log2?.info("Building dynamic bid request", zoneId, screenSize);
|
|
2127
|
-
const requestPayload = buildDynamicBidRequestRecursive(log2, nativeRequest, startRequest(zoneId), {}, screenSize.values);
|
|
2128
|
-
if (!requestPayload.ok) {
|
|
2129
|
-
return requestPayload;
|
|
2130
|
-
}
|
|
2131
|
-
log2?.debug("requestPayload", requestPayload);
|
|
2132
|
-
const [builder, requestIds] = requestPayload.value;
|
|
2133
|
-
return Ok({
|
|
2134
|
-
request: builder.build(),
|
|
2135
|
-
requestIds
|
|
2136
|
-
});
|
|
2137
|
-
};
|
|
2138
|
-
var buildDynamicBidRequestRecursive = (logger, nativeRequest, builder, requestIds, [head, ...tail]) => {
|
|
2139
|
-
const log2 = Ctx(logger);
|
|
2140
|
-
log2?.info("descending...");
|
|
2141
|
-
if (head === undefined) {
|
|
2142
|
-
log2?.info("Finished");
|
|
2143
|
-
return Ok([builder, requestIds]);
|
|
2144
|
-
}
|
|
2145
|
-
if (head.type === "Banner") {
|
|
2146
|
-
log2?.info("Adding banner to request");
|
|
2147
|
-
const banner = head;
|
|
2148
|
-
const id = crypto.randomUUID();
|
|
2149
|
-
return buildDynamicBidRequestRecursive(log2, nativeRequest, builder.withBanner(banner.width, banner.height, undefined, { id }), {
|
|
2150
|
-
...requestIds,
|
|
2151
|
-
[id]: head
|
|
2152
|
-
}, tail);
|
|
2153
|
-
} else if (head.type === "Video") {
|
|
2154
|
-
log2?.info("Adding video to request");
|
|
2155
|
-
const video = head;
|
|
2156
|
-
const id = crypto.randomUUID();
|
|
2157
|
-
return buildDynamicBidRequestRecursive(log2, nativeRequest, builder.withVideo(video.width, video.height, video.minDuration ?? 0, video.maxDuration, ["video/mp4", "video/webm"], undefined, { id }), {
|
|
2158
|
-
...requestIds,
|
|
2159
|
-
[id]: head
|
|
2160
|
-
}, tail);
|
|
2161
|
-
} else if (head.type === "Carousel" || head.type === "ProductCard") {
|
|
2162
|
-
log2?.info("Adding carousel to request");
|
|
2163
|
-
const id = crypto.randomUUID();
|
|
2164
|
-
return buildDynamicBidRequestRecursive(log2, nativeRequest, builder.withNative(nativeRequest().withMetaProduct().build(), undefined, { id }), {
|
|
2165
|
-
...requestIds,
|
|
2166
|
-
[id]: head
|
|
2167
|
-
}, tail);
|
|
2168
|
-
} else {
|
|
2169
|
-
log2?.warn("Invalid creative type. Skipping.", head);
|
|
2170
|
-
return buildDynamicBidRequestRecursive(log2, nativeRequest, builder, requestIds, tail);
|
|
2171
|
-
}
|
|
2172
|
-
};
|
|
2173
|
-
|
|
2174
|
-
class MissingDynamicZoneError extends Error {
|
|
2175
|
-
zoneId;
|
|
2176
|
-
constructor(zoneId) {
|
|
2177
|
-
super("Missing dynamic zone " + zoneId);
|
|
2178
|
-
this.zoneId = zoneId;
|
|
2179
|
-
}
|
|
2180
|
-
}
|
|
2181
|
-
// src/helpers/NativeRequestBuilder.ts
|
|
2182
|
-
var DEFAULT_LENGTH = 80;
|
|
2183
|
-
var VAST_3_0 = 3;
|
|
2184
|
-
var builderWithVer = (logger, state, ver) => {
|
|
2185
|
-
logger?.debug("Adding version to native request", ver);
|
|
2186
|
-
return botsBuildBots(logger, { ...state, ver });
|
|
2187
|
-
};
|
|
2188
|
-
var builderWithContext = (logger, state, context2) => {
|
|
2189
|
-
logger?.debug("Adding context to native request", context2);
|
|
2190
|
-
return botsBuildBots(logger, { ...state, context: context2 });
|
|
2191
|
-
};
|
|
2192
|
-
var builderWithContextSubType = (logger, state, contextSubType) => {
|
|
2193
|
-
logger?.debug("Adding context subtype to native request", contextSubType);
|
|
2194
|
-
return botsBuildBots(logger, { ...state, contextSubType });
|
|
2195
|
-
};
|
|
2196
|
-
var builderWithPlacementType = (logger, state, placementType) => {
|
|
2197
|
-
logger?.debug("Adding placement type to native request", placementType);
|
|
2198
|
-
return botsBuildBots(logger, { ...state, placementType });
|
|
2199
|
-
};
|
|
2200
|
-
var builderWithTitle = (logger, state, length = DEFAULT_LENGTH, required = true) => {
|
|
2201
|
-
logger?.debug("Adding title to native request", length, required);
|
|
2202
|
-
return botsBuildBots(logger, {
|
|
2203
|
-
...state,
|
|
2204
|
-
assets: [
|
|
2205
|
-
...state.assets,
|
|
2206
|
-
{
|
|
2207
|
-
id: NativeAssetId.Title,
|
|
2208
|
-
required: required ? 1 : 0,
|
|
2209
|
-
title: {
|
|
2210
|
-
len: length
|
|
2211
|
-
}
|
|
2212
|
-
}
|
|
2213
|
-
]
|
|
2214
|
-
});
|
|
2215
|
-
};
|
|
2216
|
-
var builderWithImage = (logger, state, width, height, minWidth, minHeight, required = true) => {
|
|
2217
|
-
logger?.debug("Adding image to native request", width, height, minWidth, minHeight, required);
|
|
2218
|
-
return botsBuildBots(logger, {
|
|
2219
|
-
...state,
|
|
2220
|
-
assets: [
|
|
2221
|
-
...state.assets,
|
|
2222
|
-
{
|
|
2223
|
-
id: NativeAssetId.Image,
|
|
2224
|
-
required: required ? 1 : 0,
|
|
2225
|
-
img: {
|
|
2226
|
-
w: width,
|
|
2227
|
-
h: height,
|
|
2228
|
-
wmin: minWidth,
|
|
2229
|
-
hmin: minHeight
|
|
2230
|
-
}
|
|
2231
|
-
}
|
|
2232
|
-
]
|
|
2233
|
-
});
|
|
2234
|
-
};
|
|
2235
|
-
var builderWithVideo = (logger, state, mimes, minDuration, maxDuration, required = true) => {
|
|
2236
|
-
logger?.debug("Adding video to native request", mimes, minDuration, maxDuration, required);
|
|
2237
|
-
return botsBuildBots(logger, {
|
|
2238
|
-
...state,
|
|
2239
|
-
assets: [
|
|
2240
|
-
...state.assets,
|
|
2241
|
-
{
|
|
2242
|
-
id: NativeAssetId.Video,
|
|
2243
|
-
required: required ? 1 : 0,
|
|
2244
|
-
video: {
|
|
2245
|
-
mimes,
|
|
2246
|
-
minduration: minDuration,
|
|
2247
|
-
maxduration: maxDuration,
|
|
2248
|
-
protocols: [VAST_3_0]
|
|
2249
|
-
}
|
|
2250
|
-
}
|
|
2251
|
-
]
|
|
2252
|
-
});
|
|
2253
|
-
};
|
|
2254
|
-
var builderWithData = (logger, state, type, id, length = DEFAULT_LENGTH, required = true) => {
|
|
2255
|
-
logger?.debug("Adding data to request", type, id, length, required);
|
|
2256
|
-
return botsBuildBots(logger, {
|
|
2257
|
-
...state,
|
|
2258
|
-
assets: [
|
|
2259
|
-
...state.assets,
|
|
2260
|
-
{
|
|
2261
|
-
id,
|
|
2262
|
-
required: required ? 1 : 0,
|
|
2263
|
-
data: {
|
|
2264
|
-
type,
|
|
2265
|
-
len: length
|
|
2266
|
-
}
|
|
2267
|
-
}
|
|
2268
|
-
]
|
|
2269
|
-
});
|
|
2270
|
-
};
|
|
2271
|
-
var passToData = (type, id) => (logger, state, length = DEFAULT_LENGTH, required = true) => builderWithData(logger, state, type, id, length, required);
|
|
2272
|
-
var builderWithSponsored = passToData(NativeDataTypes.Sponsored, NativeAssetId.Sponsored);
|
|
2273
|
-
var builderWithDescription = passToData(NativeDataTypes.Desc, NativeAssetId.Desc);
|
|
2274
|
-
var builderWithRating = passToData(NativeDataTypes.Rating, NativeAssetId.Rating);
|
|
2275
|
-
var builderWithPrice = passToData(NativeDataTypes.Price, NativeAssetId.Price);
|
|
2276
|
-
var builderWithSalePrice = passToData(NativeDataTypes.SalePrice, NativeAssetId.SalePrice);
|
|
2277
|
-
var builderWithDisplayURL = passToData(NativeDataTypes.DisplayURL, NativeAssetId.DisplayURL);
|
|
2278
|
-
var builderWithCTAText = passToData(NativeDataTypes.CTAText, NativeAssetId.CTAText);
|
|
2279
|
-
var builderWithCategory = passToData(NativeDataTypes.SurfCategory, NativeAssetId.SurfCategory);
|
|
2280
|
-
var builderWithTHC = passToData(NativeDataTypes.SurfTHC, NativeAssetId.SurfTHC);
|
|
2281
|
-
var builderWithCBD = passToData(NativeDataTypes.SurfCBD, NativeAssetId.SurfCBD);
|
|
2282
|
-
var builderWithStrain = passToData(NativeDataTypes.SurfStrain, NativeAssetId.SurfStrain);
|
|
2283
|
-
var builderWithMetaProduct = passToData(NativeDataTypes.SurfMetaProduct, NativeAssetId.SurfMetaBrand);
|
|
2284
|
-
var builderWithEventTracker = (logger, state, event, methods) => {
|
|
2285
|
-
logger?.debug("Adding event tracker to big request");
|
|
2286
|
-
return botsBuildBots(logger, {
|
|
2287
|
-
...state,
|
|
2288
|
-
eventTrackers: [
|
|
2289
|
-
...state.eventTrackers,
|
|
2290
|
-
{
|
|
2291
|
-
event,
|
|
2292
|
-
methods
|
|
2293
|
-
}
|
|
2294
|
-
]
|
|
2295
|
-
});
|
|
2296
|
-
};
|
|
2297
|
-
var builderBuild = (logger, state) => {
|
|
2298
|
-
logger?.debug("Building bid request", state);
|
|
2299
|
-
return {
|
|
2300
|
-
ver: state.ver,
|
|
2301
|
-
context: state.context,
|
|
2302
|
-
contextsubtype: state.contextSubType,
|
|
2303
|
-
assets: state.assets,
|
|
2304
|
-
eventtrackers: state.eventTrackers
|
|
2305
|
-
};
|
|
2306
|
-
};
|
|
2307
|
-
var botsBuildBots = (logger, state) => ({
|
|
2308
|
-
withVer: builderWithVer.bind(undefined, logger, state),
|
|
2309
|
-
withContext: builderWithContext.bind(undefined, logger, state),
|
|
2310
|
-
withContextSubType: builderWithContextSubType.bind(undefined, logger, state),
|
|
2311
|
-
withPlacementType: builderWithPlacementType.bind(undefined, logger, state),
|
|
2312
|
-
withTitle: builderWithTitle.bind(undefined, logger, state),
|
|
2313
|
-
withImage: builderWithImage.bind(undefined, logger, state),
|
|
2314
|
-
withVideo: builderWithVideo.bind(undefined, logger, state),
|
|
2315
|
-
withData: builderWithData.bind(undefined, logger, state),
|
|
2316
|
-
withSponsored: builderWithSponsored.bind(undefined, logger, state),
|
|
2317
|
-
withDescription: builderWithDescription.bind(undefined, logger, state),
|
|
2318
|
-
withRating: builderWithRating.bind(undefined, logger, state),
|
|
2319
|
-
withPrice: builderWithPrice.bind(undefined, logger, state),
|
|
2320
|
-
withSalePrice: builderWithSalePrice.bind(undefined, logger, state),
|
|
2321
|
-
withDisplayURL: builderWithDisplayURL.bind(undefined, logger, state),
|
|
2322
|
-
withCTAText: builderWithCTAText.bind(undefined, logger, state),
|
|
2323
|
-
withCategory: builderWithCategory.bind(undefined, logger, state),
|
|
2324
|
-
withTHC: builderWithTHC.bind(undefined, logger, state),
|
|
2325
|
-
withCBD: builderWithCBD.bind(undefined, logger, state),
|
|
2326
|
-
withStrain: builderWithStrain.bind(undefined, logger, state),
|
|
2327
|
-
withMetaProduct: builderWithMetaProduct.bind(undefined, logger, state),
|
|
2328
|
-
withEventTracker: builderWithEventTracker.bind(undefined, logger, state),
|
|
2329
|
-
build: builderBuild.bind(undefined, logger, state)
|
|
2330
|
-
});
|
|
2331
|
-
var StartNative = (logger) => {
|
|
2332
|
-
const log2 = Ctx(logger)?.with("StartNative");
|
|
2333
|
-
return botsBuildBots(log2, {
|
|
2334
|
-
assets: [],
|
|
2335
|
-
eventTrackers: []
|
|
2336
|
-
});
|
|
2337
|
-
};
|
|
2338
|
-
var DefaultNative = (logger) => {
|
|
2339
|
-
const log2 = Ctx(logger)?.with("DefaultNative");
|
|
2340
|
-
return StartNative(log2).withVer("1.2").withContext(ContextTypes.Product).withContextSubType(ContextSubTypes.Product).withPlacementType(PlacementTypes.InFeed).withEventTracker(EventTypes.Imp, [EventTrackingMethods.Img, EventTrackingMethods.Img]);
|
|
2341
|
-
};
|
|
2342
|
-
// src/helpers/RequestBuilder.ts
|
|
2343
|
-
var SURF_EID_SOURCE = "surf-domain-id";
|
|
2344
|
-
function StartRequest(logger, accountId, siteId, channelId, locationId, device, geo, userId, zoneId, id) {
|
|
2345
|
-
const log2 = Ctx(logger)?.with("StartRequest").with(accountId).with(siteId).with(channelId).with(locationId).with(id);
|
|
2346
|
-
log2?.info("Starting request");
|
|
2347
|
-
return botsBuildBots2(logger, {
|
|
2348
|
-
context: {
|
|
2349
|
-
accountId,
|
|
2350
|
-
siteId,
|
|
2351
|
-
channelId,
|
|
2352
|
-
locationId,
|
|
2353
|
-
zoneId,
|
|
2354
|
-
storeId: locationId,
|
|
2355
|
-
placementId: zoneId
|
|
2356
|
-
},
|
|
2357
|
-
geo,
|
|
2358
|
-
device,
|
|
2359
|
-
id,
|
|
2360
|
-
user: userId !== undefined ? {
|
|
2361
|
-
eids: [{
|
|
2362
|
-
source: SURF_EID_SOURCE,
|
|
2363
|
-
uids: [{
|
|
2364
|
-
id: userId,
|
|
2365
|
-
atype: AgentTypes.Session
|
|
2366
|
-
}]
|
|
2367
|
-
}]
|
|
2368
|
-
} : undefined,
|
|
2369
|
-
imp: []
|
|
2370
|
-
});
|
|
2371
|
-
}
|
|
2372
|
-
var builderWithUser = (logger, state, user) => {
|
|
2373
|
-
logger?.debug("Adding user to request", user);
|
|
2374
|
-
return botsBuildBots2(logger, {
|
|
2375
|
-
...state,
|
|
2376
|
-
user: {
|
|
2377
|
-
...user,
|
|
2378
|
-
eids: [
|
|
2379
|
-
...state.user?.eids !== undefined ? state.user.eids : [],
|
|
2380
|
-
...user.eids !== undefined ? user.eids : []
|
|
2381
|
-
]
|
|
2382
|
-
}
|
|
2383
|
-
});
|
|
2384
|
-
};
|
|
2385
|
-
var builderWithRegulations = (logger, state, regs) => {
|
|
2386
|
-
logger?.debug("Added regulations to request", regs);
|
|
2387
|
-
return botsBuildBots2(logger, { ...state, regs });
|
|
2388
|
-
};
|
|
2389
|
-
var builderWithApp = (logger, state, app) => {
|
|
2390
|
-
logger?.debug("Adding app to request");
|
|
2391
|
-
return botsBuildBots2(logger, { ...state, app });
|
|
2392
|
-
};
|
|
2393
|
-
var builderWithSite = (logger, state, site) => {
|
|
2394
|
-
logger?.debug("Adding site to request");
|
|
2395
|
-
return botsBuildBots2(logger, { ...state, site });
|
|
2396
|
-
};
|
|
2397
|
-
var builderWithBanner = (logger, state, w, h, options, impOptions) => {
|
|
2398
|
-
logger?.debug("Adding banner to request", w, h, options, impOptions);
|
|
2399
|
-
const id = generateId();
|
|
2400
|
-
return botsBuildImp(logger, state, {
|
|
2401
|
-
id,
|
|
2402
|
-
tagid: id,
|
|
2403
|
-
banner: {
|
|
2404
|
-
w,
|
|
2405
|
-
h,
|
|
2406
|
-
...options
|
|
2407
|
-
},
|
|
2408
|
-
...impOptions
|
|
2409
|
-
});
|
|
2410
|
-
};
|
|
2411
|
-
var builderWithVideo2 = (logger, state, w, h, minduration, maxduration, mimes, options, impOptions) => {
|
|
2412
|
-
logger?.debug("Adding video to request", w, h, minduration, maxduration, mimes, options, impOptions);
|
|
2413
|
-
return botsBuildImp(logger, state, {
|
|
2414
|
-
id: generateId(),
|
|
2415
|
-
video: {
|
|
2416
|
-
w,
|
|
2417
|
-
h,
|
|
2418
|
-
mimes: mimes ?? ["video/mp4", "video/webm"],
|
|
2419
|
-
minduration,
|
|
2420
|
-
maxduration,
|
|
2421
|
-
...options
|
|
2422
|
-
},
|
|
2423
|
-
...impOptions
|
|
2424
|
-
});
|
|
2425
|
-
};
|
|
2426
|
-
var builderWithKeywords = (logger, state, keywords) => {
|
|
2427
|
-
logger?.debug("Adding keyword to request", keywords);
|
|
2428
|
-
return botsBuildBots2(logger, {
|
|
2429
|
-
...state,
|
|
2430
|
-
context: {
|
|
2431
|
-
...state.context,
|
|
2432
|
-
keywords
|
|
2433
|
-
}
|
|
2434
|
-
});
|
|
2435
|
-
};
|
|
2436
|
-
var builderWithNative = (logger, state, request, options, impOptions) => {
|
|
2437
|
-
logger?.debug("Adding native to request", request, options, impOptions);
|
|
2438
|
-
return typeof request === "string" ? builderWithNativeStr(logger, state, request, options, impOptions) : builderWithNativeStr(logger, state, JSON.stringify(request), options, impOptions);
|
|
2439
|
-
};
|
|
2440
|
-
var builderWithNativeStr = (logger, state, request, options, impOptions) => botsBuildImp(logger, state, {
|
|
2441
|
-
id: generateId(),
|
|
2442
|
-
native: {
|
|
2443
|
-
ver: "1.2",
|
|
2444
|
-
request,
|
|
2445
|
-
...options
|
|
2446
|
-
},
|
|
2447
|
-
...impOptions
|
|
2448
|
-
});
|
|
2449
|
-
var builderBuild2 = (logger, state) => {
|
|
2450
|
-
logger?.debug("Building request", state);
|
|
2451
|
-
return {
|
|
2452
|
-
id: state.id ?? generateId(),
|
|
2453
|
-
imp: state.imp.map((imp) => ({
|
|
2454
|
-
...imp,
|
|
2455
|
-
ext: { ...imp.ext, ...state.context }
|
|
2456
|
-
})),
|
|
2457
|
-
device: {
|
|
2458
|
-
...state.device,
|
|
2459
|
-
geo: state.geo === undefined ? undefined : GeoContextToORTB(undefined, state.geo),
|
|
2460
|
-
ip: state.geo?.ip
|
|
2461
|
-
},
|
|
2462
|
-
user: state.user,
|
|
2463
|
-
app: state.app,
|
|
2464
|
-
site: state.site,
|
|
2465
|
-
ext: state.context
|
|
2466
|
-
};
|
|
2467
|
-
};
|
|
2468
|
-
var botsBuildBots2 = (logger, state) => ({
|
|
2469
|
-
withUser: builderWithUser.bind(undefined, logger, state),
|
|
2470
|
-
withRegulations: builderWithRegulations.bind(undefined, logger, state),
|
|
2471
|
-
withBanner: builderWithBanner.bind(undefined, logger, state),
|
|
2472
|
-
withVideo: builderWithVideo2.bind(undefined, logger, state),
|
|
2473
|
-
withNative: builderWithNative.bind(undefined, logger, state),
|
|
2474
|
-
withApp: builderWithApp.bind(undefined, logger, state),
|
|
2475
|
-
withSite: builderWithSite.bind(undefined, logger, state),
|
|
2476
|
-
withKeywords: builderWithKeywords.bind(undefined, logger, state),
|
|
2477
|
-
build: builderBuild2.bind(undefined, logger, state)
|
|
2478
|
-
});
|
|
2479
|
-
var botsBuildImp = (logger, state, imp) => botsBuildBots2(logger, { ...state, imp: [...state.imp, imp] });
|
|
2480
|
-
var generateId = () => crypto.randomUUID();
|
|
2481
|
-
// src/helpers/response/BuiltResponse.ts
|
|
2482
|
-
var CreativeType = {
|
|
2483
|
-
Banner: 0,
|
|
2484
|
-
Video: 1,
|
|
2485
|
-
ProductCard: 2,
|
|
2486
|
-
Carousel: 3
|
|
2487
|
-
};
|
|
2488
|
-
|
|
2489
|
-
class MissingAdmError extends Error {
|
|
2490
|
-
bid;
|
|
2491
|
-
constructor(bid) {
|
|
2492
|
-
super("Cannot build creative; missing adm field");
|
|
2493
|
-
this.bid = bid;
|
|
2494
|
-
}
|
|
2495
|
-
}
|
|
2496
|
-
|
|
2497
|
-
class MissingProductError extends Error {
|
|
2498
|
-
bid;
|
|
2499
|
-
constructor(bid) {
|
|
2500
|
-
super("Could not find product data for creative while building clickthrough URL. Some data fields are missing");
|
|
2501
|
-
this.bid = bid;
|
|
2502
|
-
}
|
|
2503
|
-
}
|
|
2504
|
-
// src/helpers/response/Clickthrough.ts
|
|
2505
|
-
var BuildClickthroughUrl = (logger, windowInfo, configuration, product) => {
|
|
2506
|
-
const log2 = Ctx(logger)?.with("BuildClickthroughUrl");
|
|
2507
|
-
log2?.info("Building clickthrough URL");
|
|
2508
|
-
log2?.debug(windowInfo, product, configuration);
|
|
2509
|
-
try {
|
|
2510
|
-
return Ok(configuration.templates.clickThroughUrlTemplate({
|
|
2511
|
-
product,
|
|
2512
|
-
catalog: product,
|
|
2513
|
-
window: windowInfo,
|
|
2514
|
-
publisher: configuration,
|
|
2515
|
-
...product
|
|
2516
|
-
}));
|
|
2517
|
-
} catch (e) {
|
|
2518
|
-
log2?.error("Failed to execute clickthrough URL template", product, configuration, windowInfo);
|
|
2519
|
-
return Err(e);
|
|
2520
|
-
}
|
|
2521
|
-
};
|
|
2522
|
-
// src/helpers/Generator.ts
|
|
2523
|
-
var ConsumeN = (generator, n) => {
|
|
2524
|
-
const consumed = [];
|
|
2525
|
-
for (let i = 0;i < n; i++) {
|
|
2526
|
-
const value = generator.next();
|
|
2527
|
-
if (value.done) {
|
|
2528
|
-
break;
|
|
2529
|
-
}
|
|
2530
|
-
consumed.push(value.value);
|
|
2531
|
-
}
|
|
2532
|
-
return consumed;
|
|
2533
|
-
};
|
|
2534
|
-
var ConsumeAll = (generator) => {
|
|
2535
|
-
const consumed = [];
|
|
2536
|
-
for (const value of generator) {
|
|
2537
|
-
consumed.push(value);
|
|
2538
|
-
}
|
|
2539
|
-
return consumed;
|
|
2540
|
-
};
|
|
2541
|
-
var ConsumeNAsync = async (generator, n) => {
|
|
2542
|
-
const consumed = [];
|
|
2543
|
-
while (consumed.length < n) {
|
|
2544
|
-
const result = await generator.next();
|
|
2545
|
-
if (result.done) {
|
|
2546
|
-
return [consumed, true];
|
|
2547
|
-
}
|
|
2548
|
-
consumed.push(result.value);
|
|
2549
|
-
}
|
|
2550
|
-
return [consumed, false];
|
|
2551
|
-
};
|
|
2552
|
-
var ConsumeAllAsync = async (generator) => {
|
|
2553
|
-
const consumed = [];
|
|
2554
|
-
for await (const value of generator) {
|
|
2555
|
-
consumed.push(value);
|
|
2556
|
-
}
|
|
2557
|
-
return consumed;
|
|
2558
|
-
};
|
|
2559
|
-
function* GenerateArray(data) {
|
|
2560
|
-
for (const t of data) {
|
|
2561
|
-
yield t;
|
|
2562
|
-
}
|
|
2563
|
-
}
|
|
2564
|
-
|
|
2565
|
-
// src/helpers/TryGet.ts
|
|
2566
|
-
var TryGet = (get) => {
|
|
2567
|
-
try {
|
|
2568
|
-
return Ok(get());
|
|
2569
|
-
} catch (error2) {
|
|
2570
|
-
return Err(error2);
|
|
2571
|
-
}
|
|
2572
|
-
};
|
|
2573
|
-
|
|
2574
|
-
// src/helpers/response/ProductCard.ts
|
|
2575
|
-
var BuildAllSponsoredProductCardResponses = async (logger, getAllSponsoredProducts, windowInfo, configuration, bids) => {
|
|
2576
|
-
const log2 = Ctx(logger)?.with("BuildProductCardResponse");
|
|
2577
|
-
log2?.info("Building product card responses");
|
|
2578
|
-
if (bids === undefined || bids === null) {
|
|
2579
|
-
return Err(new MissingBidsError);
|
|
2580
|
-
}
|
|
2581
|
-
const bidPromises = bids.map(buildAllProductCardResponsesFromBid.bind(undefined, log2, getAllSponsoredProducts, windowInfo, configuration));
|
|
2582
|
-
const productCardResponseResults = await Promise.allSettled(bidPromises);
|
|
2583
|
-
productCardResponseResults.filter((res) => res.status === "rejected").map((res) => res.reason).forEach((err) => log2?.warn(err));
|
|
2584
|
-
const fulfilled = productCardResponseResults.filter((res) => res.status === "fulfilled");
|
|
2585
|
-
fulfilled.filter((res) => !res.value.ok).map((res) => res.value).map((res) => res.error).forEach((err) => log2?.warn(err));
|
|
2586
|
-
return Ok(productCardResponseResults.filter((res) => res.status === "fulfilled").filter((res) => res.value.ok).map((res) => res.value).flatMap((res) => res.value));
|
|
2587
|
-
};
|
|
2588
|
-
async function* GenerateSponsoredProductCardResponse(logger, getAllSponsoredProducts, windowInfo, configuration, bids) {
|
|
2589
|
-
const log2 = Ctx(logger)?.with("GenerateProductCardResponse");
|
|
2590
|
-
log2?.info("Entering product card response generator", bids);
|
|
2591
|
-
for (const bid of bids) {
|
|
2592
|
-
log2?.info("Generating product card response", bid);
|
|
2593
|
-
const result = await buildAllProductCardResponsesFromBid(log2, getAllSponsoredProducts, windowInfo, configuration, bid);
|
|
2594
|
-
if (!result.ok) {
|
|
2595
|
-
log2?.warn(result.error);
|
|
2596
|
-
continue;
|
|
2597
|
-
}
|
|
2598
|
-
yield* GenerateArray(result.value);
|
|
2599
|
-
}
|
|
2600
|
-
}
|
|
2601
|
-
var getField = (native) => (id) => native.native.assets?.find((asset) => asset.id === id)?.data?.value;
|
|
2602
|
-
var getTrackers = (logger, bid, native) => {
|
|
2603
|
-
const log2 = Ctx(logger)?.with("getTrackers");
|
|
2604
|
-
log2?.info("Getting trackers");
|
|
2605
|
-
const win = bid.nurl;
|
|
2606
|
-
if (win === undefined) {
|
|
2607
|
-
return Err(new MissingWinUrlError(bid));
|
|
2608
|
-
}
|
|
2609
|
-
const imp = native.native.eventtrackers?.filter((tracker) => tracker.event === EventTypes.Imp && tracker.method === EventTrackingMethods.Img).map((tracker) => tracker.url).filter((url) => url !== undefined) ?? [];
|
|
2610
|
-
const others = native.native.eventtrackers?.filter((tracker) => tracker.url !== undefined).map((tracker) => ({
|
|
2611
|
-
type: tracker.method,
|
|
2612
|
-
url: tracker.url
|
|
2613
|
-
})) ?? [];
|
|
2614
|
-
return Ok({ win, imp, others });
|
|
2615
|
-
};
|
|
2616
|
-
var fetchProductsFromBid = async (logger, getAllSponsoredProducts, bid) => {
|
|
2617
|
-
try {
|
|
2618
|
-
const log2 = Ctx(logger)?.with("fetchProductsFromBid");
|
|
2619
|
-
log2?.info("Fetching products from IBid");
|
|
2620
|
-
const productCardResponses = [];
|
|
2621
|
-
if (bid.adm === undefined) {
|
|
2622
|
-
log2?.warn("Bid is missing ADM", bid);
|
|
2623
|
-
return Err(new MissingAdmError(bid));
|
|
2624
|
-
}
|
|
2625
|
-
const adm = bid.adm;
|
|
2626
|
-
const nativeRes = TryGet(() => JSON.parse(adm));
|
|
2627
|
-
if (!nativeRes.ok) {
|
|
2628
|
-
log2?.error("Bid adm failed to deserialize", bid, adm);
|
|
2629
|
-
return Err(new MalformedNativeResponseError(bid));
|
|
2630
|
-
}
|
|
2631
|
-
const native = nativeRes.value;
|
|
2632
|
-
const metaProductId = getField(native)(NativeAssetId.SurfMetaBrand);
|
|
2633
|
-
if (metaProductId === undefined) {
|
|
2634
|
-
return Err(new MissingProductIdError(bid, native));
|
|
2635
|
-
}
|
|
2636
|
-
const productRes = await getAllSponsoredProducts(metaProductId);
|
|
2637
|
-
if (!productRes.ok) {
|
|
2638
|
-
return productRes;
|
|
2639
|
-
}
|
|
2640
|
-
return Ok({
|
|
2641
|
-
products: productRes.value,
|
|
2642
|
-
native
|
|
2643
|
-
});
|
|
2644
|
-
} catch (err) {
|
|
2645
|
-
return Err(err);
|
|
2646
|
-
}
|
|
2647
|
-
};
|
|
2648
|
-
function* buildProductCardResponseFromProductInfo(logger, windowInfo, configuration, bid, native, products) {
|
|
2649
|
-
const log2 = Ctx(logger)?.with("buildProductCardResponseFromProductInfo");
|
|
2650
|
-
for (const product of products) {
|
|
2651
|
-
const clickthrough = BuildClickthroughUrl(log2, windowInfo, configuration, product);
|
|
2652
|
-
if (!clickthrough.ok) {
|
|
2653
|
-
return clickthrough;
|
|
2654
|
-
}
|
|
2655
|
-
const trackers = getTrackers(log2, bid, native);
|
|
2656
|
-
if (!trackers.ok) {
|
|
2657
|
-
return trackers;
|
|
2658
|
-
}
|
|
2659
|
-
const finalClickthrough = TryDo(() => {
|
|
2660
|
-
const bidderClickthrough = new URL(native.native.link.url);
|
|
2661
|
-
bidderClickthrough.searchParams.set("url", clickthrough.value);
|
|
2662
|
-
return bidderClickthrough.toString();
|
|
2663
|
-
});
|
|
2664
|
-
if (!finalClickthrough.ok) {
|
|
2665
|
-
return finalClickthrough;
|
|
2666
|
-
}
|
|
2667
|
-
yield {
|
|
2668
|
-
type: "product-card",
|
|
2669
|
-
native,
|
|
2670
|
-
product,
|
|
2671
|
-
bid,
|
|
2672
|
-
clickthrough: finalClickthrough.value,
|
|
2673
|
-
trackers: trackers.value,
|
|
2674
|
-
sponsored: true
|
|
2675
|
-
};
|
|
2676
|
-
}
|
|
2677
|
-
}
|
|
2678
|
-
var buildAllProductCardResponsesFromBid = async (logger, getAllSponsoredProducts, windowInfo, configuration, bid) => {
|
|
2679
|
-
const log2 = Ctx(logger)?.with("buildAllProductCardResponseBids");
|
|
2680
|
-
log2?.info("Building all product card responses");
|
|
2681
|
-
try {
|
|
2682
|
-
return Ok(await ConsumeAllAsync(generateProductCardResponseFromBid(log2, getAllSponsoredProducts, windowInfo, configuration, bid)));
|
|
2683
|
-
} catch (err) {
|
|
2684
|
-
return Err(err);
|
|
2685
|
-
}
|
|
2686
|
-
};
|
|
2687
|
-
async function* generateProductCardResponseFromBid(logger, getAllSponsoredProducts, windowInfo, configuration, bid) {
|
|
2688
|
-
const log2 = Ctx(logger)?.with("generateProductCardResponseFromBid");
|
|
2689
|
-
log2?.info("generating product card response from bid");
|
|
2690
|
-
try {
|
|
2691
|
-
const productResult = await fetchProductsFromBid(log2, getAllSponsoredProducts, bid);
|
|
2692
|
-
if (!productResult.ok) {
|
|
2693
|
-
log2?.info("No products!");
|
|
2694
|
-
return productResult;
|
|
2695
|
-
}
|
|
2696
|
-
const { products, native } = productResult.value;
|
|
2697
|
-
const builtProductCardResponses = [];
|
|
2698
|
-
yield* buildProductCardResponseFromProductInfo(log2, windowInfo, configuration, bid, native, products);
|
|
2699
|
-
} catch (err) {
|
|
2700
|
-
return;
|
|
2701
|
-
}
|
|
2702
|
-
}
|
|
2703
|
-
|
|
2704
|
-
class MissingBidsError extends Error {
|
|
2705
|
-
constructor() {
|
|
2706
|
-
super("Unable to build product cards - no bids were provided");
|
|
2707
|
-
}
|
|
2708
|
-
}
|
|
2709
|
-
|
|
2710
|
-
class MalformedNativeResponseError extends Error {
|
|
2711
|
-
bid;
|
|
2712
|
-
constructor(bid) {
|
|
2713
|
-
super("Unable to build product card - missing native response");
|
|
2714
|
-
this.bid = bid;
|
|
2715
|
-
}
|
|
2716
|
-
}
|
|
2717
|
-
|
|
2718
|
-
class MissingWinUrlError extends Error {
|
|
2719
|
-
bid;
|
|
2720
|
-
constructor(bid) {
|
|
2721
|
-
super("Unable to build product card - no win URL was provided");
|
|
2722
|
-
this.bid = bid;
|
|
2723
|
-
}
|
|
2724
|
-
}
|
|
2725
|
-
|
|
2726
|
-
class MissingProductIdError extends Error {
|
|
2727
|
-
bid;
|
|
2728
|
-
native;
|
|
2729
|
-
constructor(bid, native) {
|
|
2730
|
-
super("Unable to build product card - no product ID was provided");
|
|
2731
|
-
this.bid = bid;
|
|
2732
|
-
this.native = native;
|
|
2733
|
-
}
|
|
2734
|
-
}
|
|
2735
|
-
// src/helpers/response/Carousel.ts
|
|
2736
|
-
var BuildSponsoredCarousel = (logger, requestBids, generateProductCardResponse, request) => {
|
|
2737
|
-
const log2 = Ctx(logger)?.with("BuildSponsoredCarousel");
|
|
2738
|
-
log2?.info("Building sponsored carousel");
|
|
2739
|
-
return Ok({
|
|
2740
|
-
type: "carousel",
|
|
2741
|
-
getProduct: getNextSponsoredCarouselProduct.bind(undefined, log2, requestBids, generateProductCardResponse, request)
|
|
2742
|
-
});
|
|
2743
|
-
};
|
|
2744
|
-
var BuildSponsoredCarouselFromInitialBid = (logger, requestBids, generateProductCardResponse, request, initialBid) => {
|
|
2745
|
-
const log2 = Ctx(logger)?.with("BuildSponsoredCarouselFromInitialBid");
|
|
2746
|
-
log2?.info("Building sponsored carousel from initial bid");
|
|
2747
|
-
return Ok({
|
|
2748
|
-
type: "carousel",
|
|
2749
|
-
getProduct: getNextSponsoredCarouselProductFromInitialBid.bind(undefined, log2, requestBids, request, initialBid, generateProductCardResponse)
|
|
2750
|
-
});
|
|
2751
|
-
};
|
|
2752
|
-
var BuildRecommendedCarousel = (logger, evaluateClickthroughTemplate, topProductGenerator, forYouProductGenerator, pastPurchasesProductGenerator, userId, recommenderType) => {
|
|
2753
|
-
switch (recommenderType.type) {
|
|
2754
|
-
case "top-products": {
|
|
2755
|
-
return buildRecommendedCarouselInternal(logger, evaluateClickthroughTemplate, {
|
|
2756
|
-
recommenderType: "top-products",
|
|
2757
|
-
topProductGenerator
|
|
2758
|
-
});
|
|
2759
|
-
}
|
|
2760
|
-
case "for-you": {
|
|
2761
|
-
return buildRecommendedCarouselInternal(logger, evaluateClickthroughTemplate, {
|
|
2762
|
-
recommenderType: "for-you",
|
|
2763
|
-
forYouProductGenerator,
|
|
2764
|
-
topProductGenerator,
|
|
2765
|
-
userId
|
|
2766
|
-
});
|
|
2767
|
-
}
|
|
2768
|
-
case "past-purchases": {
|
|
2769
|
-
return buildRecommendedCarouselInternal(logger, evaluateClickthroughTemplate, {
|
|
2770
|
-
recommenderType: "past-purchases",
|
|
2771
|
-
pastPurchasesProductGenerator,
|
|
2772
|
-
topProductGenerator,
|
|
2773
|
-
userId
|
|
2774
|
-
});
|
|
2775
|
-
}
|
|
2776
|
-
}
|
|
2777
|
-
};
|
|
2778
|
-
var buildRecommendedCarouselInternal = (logger, evaluateClickthroughTemplate, recommenderType) => {
|
|
2779
|
-
const log2 = Ctx(logger)?.with("buildRecommendedCarouselInternal");
|
|
2780
|
-
log2?.info("Building Recommended Carousel");
|
|
2781
|
-
return Ok({
|
|
2782
|
-
type: "carousel",
|
|
2783
|
-
getProduct: getNextRecommendedCarouselProduct.bind(undefined, log2, evaluateClickthroughTemplate, recommenderType)
|
|
2784
|
-
});
|
|
2785
|
-
};
|
|
2786
|
-
var BuildHybridCarousel = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, topProductGenerator, forYouProductGenerator, pastPurchasesProductGenerator, userId, recommenderType, request) => {
|
|
2787
|
-
switch (recommenderType.type) {
|
|
2788
|
-
case "top-products": {
|
|
2789
|
-
return buildHybridCarouselInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, {
|
|
2790
|
-
recommenderType: "top-products",
|
|
2791
|
-
topProductGenerator
|
|
2792
|
-
});
|
|
2793
|
-
}
|
|
2794
|
-
case "for-you": {
|
|
2795
|
-
return buildHybridCarouselInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, {
|
|
2796
|
-
recommenderType: "for-you",
|
|
2797
|
-
forYouProductGenerator,
|
|
2798
|
-
topProductGenerator,
|
|
2799
|
-
userId
|
|
2800
|
-
});
|
|
2801
|
-
}
|
|
2802
|
-
case "past-purchases": {
|
|
2803
|
-
return buildHybridCarouselInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, {
|
|
2804
|
-
recommenderType: "past-purchases",
|
|
2805
|
-
pastPurchasesProductGenerator,
|
|
2806
|
-
topProductGenerator,
|
|
2807
|
-
userId
|
|
2808
|
-
});
|
|
2809
|
-
}
|
|
2810
|
-
}
|
|
2811
|
-
};
|
|
2812
|
-
var BuildHybridCarouselFromInitialBid = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, topProductGenerator, forYouProductGenerator, pastPurchasesProductGenerator, userId, recommenderType, request, initialBid) => {
|
|
2813
|
-
switch (recommenderType.type) {
|
|
2814
|
-
case "top-products": {
|
|
2815
|
-
return buildHybridCarouselFromInitialBidInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, {
|
|
2816
|
-
recommenderType: "top-products",
|
|
2817
|
-
topProductGenerator
|
|
2818
|
-
});
|
|
2819
|
-
}
|
|
2820
|
-
case "for-you": {
|
|
2821
|
-
return buildHybridCarouselFromInitialBidInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, {
|
|
2822
|
-
recommenderType: "for-you",
|
|
2823
|
-
forYouProductGenerator,
|
|
2824
|
-
topProductGenerator,
|
|
2825
|
-
userId
|
|
2826
|
-
});
|
|
2827
|
-
}
|
|
2828
|
-
case "past-purchases": {
|
|
2829
|
-
return buildHybridCarouselFromInitialBidInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, {
|
|
2830
|
-
recommenderType: "past-purchases",
|
|
2831
|
-
pastPurchasesProductGenerator,
|
|
2832
|
-
topProductGenerator,
|
|
2833
|
-
userId
|
|
2834
|
-
});
|
|
2835
|
-
}
|
|
2836
|
-
}
|
|
2837
|
-
};
|
|
2838
|
-
var buildHybridCarouselInternal = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, recommenderType) => {
|
|
2839
|
-
const log2 = Ctx(logger)?.with("BuildHybridCarousel");
|
|
2840
|
-
log2?.info("Building hybrid carousel", request, recommenderType);
|
|
2841
|
-
return Ok({
|
|
2842
|
-
type: "carousel",
|
|
2843
|
-
getProduct: getNextHybridCarouselProduct.bind(undefined, log2, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, recommenderType)
|
|
2844
|
-
});
|
|
2845
|
-
};
|
|
2846
|
-
var buildHybridCarouselFromInitialBidInternal = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, recommenderType) => {
|
|
2847
|
-
const log2 = Ctx(logger)?.with("BuildHybridCarouselFromInitialBid");
|
|
2848
|
-
log2?.info("Building hybrid carousel from bid", request, recommenderType, initialBid);
|
|
2849
|
-
return Ok({
|
|
2850
|
-
type: "carousel",
|
|
2851
|
-
getProduct: getNextHybridCarouselProductFromInitialBid.bind(undefined, log2, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, recommenderType)
|
|
2852
|
-
});
|
|
2853
|
-
};
|
|
2854
|
-
async function* getNextHybridCarouselProduct(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, recommenderType) {
|
|
2855
|
-
const log2 = Ctx(logger)?.with("getNextHybridCarouselProduct");
|
|
2856
|
-
log2?.info("Entering hybrid carousel product generator");
|
|
2857
|
-
yield* getNextSponsoredCarouselProduct(log2, requestBids, generateProductCardResponse, request);
|
|
2858
|
-
log2?.info("Done getting next sponsoredCarouselProduct");
|
|
2859
|
-
yield* getNextRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType);
|
|
2860
|
-
}
|
|
2861
|
-
async function* getNextHybridCarouselProductFromInitialBid(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, recommenderType) {
|
|
2862
|
-
const log2 = Ctx(logger)?.with("getNextHybridCarouselProduct");
|
|
2863
|
-
log2?.info("Entering hybrid carousel product generator");
|
|
2864
|
-
yield* getNextSponsoredCarouselProductFromInitialBid(log2, requestBids, request, initialBid, generateProductCardResponse);
|
|
2865
|
-
log2?.info("Done getting next sponsoredCarouselProduct");
|
|
2866
|
-
yield* getNextRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType);
|
|
2867
|
-
}
|
|
2868
|
-
async function* getNextSponsoredCarouselProduct(logger, requestBids, generateProductCardResponse, request) {
|
|
2869
|
-
const log2 = Ctx(logger)?.with("getNextSponsoredCarouselProduct");
|
|
2870
|
-
try {
|
|
2871
|
-
log2?.info("Entering sponsored carousel product generator");
|
|
2872
|
-
while (true) {
|
|
2873
|
-
log2?.info("Getting next sponsored carousel products", request);
|
|
2874
|
-
const response = await requestBids(request);
|
|
2875
|
-
if (!response.ok) {
|
|
2876
|
-
log2?.info("No response from bidder", response.error);
|
|
2877
|
-
return;
|
|
2878
|
-
}
|
|
2879
|
-
const bids = response.value.seatbid?.[0]?.bid;
|
|
2880
|
-
if (bids === undefined) {
|
|
2881
|
-
log2?.info("Got no bids in response!");
|
|
2882
|
-
return;
|
|
2883
|
-
}
|
|
2884
|
-
const generator = generateProductCardResponse(bids);
|
|
2885
|
-
for await (const product of generator) {
|
|
2886
|
-
log2?.debug("Getting next product from existing bidder response", product);
|
|
2887
|
-
yield product;
|
|
2888
|
-
}
|
|
2889
|
-
log2?.debug("Out of bids from previous response. Requesting new bid response");
|
|
2890
|
-
return;
|
|
2891
|
-
}
|
|
2892
|
-
} catch (err) {
|
|
2893
|
-
log2?.error("product carousel generator failed! Got", err);
|
|
2894
|
-
} finally {
|
|
2895
|
-
log2?.warn("Exiting carousel product generator");
|
|
2896
|
-
}
|
|
2897
|
-
}
|
|
2898
|
-
async function* getNextSponsoredCarouselProductFromInitialBid(logger, requestBids, request, initialBid, generateProductCardResponse) {
|
|
2899
|
-
const log2 = Ctx(logger)?.with("getNextSponsoredCarouselProductFromResponse");
|
|
2900
|
-
log2?.info("Generating sponsored product cards from initial bid response");
|
|
2901
|
-
log2?.debug(initialBid);
|
|
2902
|
-
yield* generateProductCardResponse([initialBid]);
|
|
2903
|
-
yield* getNextSponsoredCarouselProduct(logger, requestBids, generateProductCardResponse, request);
|
|
2904
|
-
}
|
|
2905
|
-
async function* getNextRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType) {
|
|
2906
|
-
const log2 = Ctx(logger)?.with("getNextRecommendedCarouselProduct");
|
|
2907
|
-
log2?.info("Entering recommended carousel product generator");
|
|
2908
|
-
log2?.info("Getting next recommended carousel product");
|
|
2909
|
-
switch (recommenderType.recommenderType) {
|
|
2910
|
-
case "top-products": {
|
|
2911
|
-
yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType);
|
|
2912
|
-
return;
|
|
2913
|
-
}
|
|
2914
|
-
case "for-you": {
|
|
2915
|
-
if (recommenderType.userId !== undefined) {
|
|
2916
|
-
yield* getNextForYouRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType, recommenderType.userId);
|
|
2917
|
-
}
|
|
2918
|
-
break;
|
|
2919
|
-
}
|
|
2920
|
-
case "past-purchases": {
|
|
2921
|
-
if (recommenderType.userId !== undefined) {
|
|
2922
|
-
yield* getNextPastPurchasesRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType, recommenderType.userId);
|
|
2923
|
-
}
|
|
2924
|
-
break;
|
|
2925
|
-
}
|
|
2926
|
-
}
|
|
2927
|
-
yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, {
|
|
2928
|
-
recommenderType: "top-products",
|
|
2929
|
-
topProductGenerator: recommenderType.topProductGenerator
|
|
2930
|
-
});
|
|
2931
|
-
}
|
|
2932
|
-
async function* getNextTopAllRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType) {
|
|
2933
|
-
const log2 = Ctx(logger)?.with("getNextTopAllRecommendedCarouselProduct");
|
|
2934
|
-
log2?.info("Getting next top all product");
|
|
2935
|
-
for await (const product of recommenderType.topProductGenerator()) {
|
|
2936
|
-
const built = recommendedProductToBuiltProduct(log2, evaluateClickthroughTemplate, product);
|
|
2937
|
-
if (!built.ok) {
|
|
2938
|
-
log2?.warn("Failed to build product response from recommended product. Skipping this one", product);
|
|
2939
|
-
continue;
|
|
2940
|
-
}
|
|
2941
|
-
yield built.value;
|
|
2942
|
-
}
|
|
2943
|
-
}
|
|
2944
|
-
async function* getNextForYouRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType, userId) {
|
|
2945
|
-
const log2 = Ctx(logger)?.with("getNextForYouRecommendedCarouselProduct");
|
|
2946
|
-
log2?.info('Getting next "for-you" recommended product');
|
|
2947
|
-
for await (const product of recommenderType.forYouProductGenerator(userId)) {
|
|
2948
|
-
const built = recommendedProductToBuiltProduct(log2, evaluateClickthroughTemplate, product);
|
|
2949
|
-
if (!built.ok) {
|
|
2950
|
-
log2?.warn("Failed to build product response from recommended product. Skipping this one", product);
|
|
2951
|
-
continue;
|
|
2952
|
-
}
|
|
2953
|
-
yield built.value;
|
|
2954
|
-
}
|
|
2955
|
-
yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, {
|
|
2956
|
-
recommenderType: "top-products",
|
|
2957
|
-
topProductGenerator: recommenderType.topProductGenerator
|
|
2958
|
-
});
|
|
2959
|
-
}
|
|
2960
|
-
async function* getNextPastPurchasesRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType, userId) {
|
|
2961
|
-
const log2 = Ctx(logger)?.with("getNextPastPurchasesRecommendedCarouselProduct");
|
|
2962
|
-
log2?.info('Getting next "buy-again" recommended product');
|
|
2963
|
-
for await (const product of recommenderType.pastPurchasesProductGenerator(userId)) {
|
|
2964
|
-
const built = recommendedProductToBuiltProduct(log2, evaluateClickthroughTemplate, product);
|
|
2965
|
-
if (!built.ok) {
|
|
2966
|
-
log2?.warn("Failed to build product response from recommended product. Skipping this one", product);
|
|
2967
|
-
continue;
|
|
2968
|
-
}
|
|
2969
|
-
yield built.value;
|
|
2970
|
-
}
|
|
2971
|
-
yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, {
|
|
2972
|
-
recommenderType: "top-products",
|
|
2973
|
-
topProductGenerator: recommenderType.topProductGenerator
|
|
2974
|
-
});
|
|
2975
|
-
}
|
|
2976
|
-
var recommendedProductToBuiltProduct = (logger, evaluateClickthroughTemplate, product) => {
|
|
2977
|
-
const log2 = Ctx(logger)?.with("recommendedProductToBuiltProduct");
|
|
2978
|
-
log2?.info("Converting recommended product to built product card response");
|
|
2979
|
-
const clickthrough = evaluateClickthroughTemplate(product);
|
|
2980
|
-
if (!clickthrough.ok) {
|
|
2981
|
-
return clickthrough;
|
|
2982
|
-
}
|
|
2983
|
-
return Ok({
|
|
2984
|
-
type: "product-card",
|
|
2985
|
-
clickthrough: clickthrough.value + "_recommended",
|
|
2986
|
-
product,
|
|
2987
|
-
sponsored: false
|
|
2988
|
-
});
|
|
2989
|
-
};
|
|
2990
|
-
|
|
2991
|
-
class InvalidRecommenderTypeError extends Error {
|
|
2992
|
-
type;
|
|
2993
|
-
constructor(type) {
|
|
2994
|
-
super('Could not generate carousel; invalid recommender type "' + type + '"');
|
|
2995
|
-
this.type = type;
|
|
2996
|
-
}
|
|
2997
|
-
}
|
|
2998
|
-
// src/helpers/Handlebars.ts
|
|
2999
|
-
var DEFAULT_MAX_SLUG = 5;
|
|
3000
|
-
function slug(name, options) {
|
|
3001
|
-
if (name === undefined || name === null || typeof name !== "string") {
|
|
3002
|
-
return "";
|
|
3003
|
-
}
|
|
3004
|
-
const hyphenate = options.hash.hyphenate !== undefined ? new RegExp(options.hash.hyphenate, "ig") : /[\s_\-,]/ig;
|
|
3005
|
-
const drop = options.hash.drop !== undefined ? new RegExp(options.hash.drop, "ig") : /[^A-Za-z0-9-]/ig;
|
|
3006
|
-
const dropBefore = options.hash.dropBefore !== undefined ? new RegExp(options.hash.dropBefore) : undefined;
|
|
3007
|
-
const maxSlug = options.hash.length ?? DEFAULT_MAX_SLUG;
|
|
3008
|
-
const separator = options.hash.separator ?? "-";
|
|
3009
|
-
if (dropBefore !== undefined) {
|
|
3010
|
-
name = name.replace(dropBefore, "");
|
|
3011
|
-
}
|
|
3012
|
-
return name.replace(hyphenate, separator).replace(drop, "").toLowerCase().split(separator).slice(0, maxSlug).join(separator);
|
|
3013
|
-
}
|
|
3014
|
-
function lower(name) {
|
|
3015
|
-
if (name === undefined || name === null || typeof name !== "string") {
|
|
3016
|
-
return "";
|
|
3017
|
-
}
|
|
3018
|
-
return name.toLowerCase();
|
|
3019
|
-
}
|
|
3020
|
-
function upper(name) {
|
|
3021
|
-
if (name === undefined || name === null || typeof name !== "string") {
|
|
3022
|
-
return "";
|
|
3023
|
-
}
|
|
3024
|
-
return name.toUpperCase();
|
|
3025
|
-
}
|
|
3026
|
-
function path(position) {
|
|
3027
|
-
if (position === 0 || position === undefined || position === null) {
|
|
3028
|
-
return "";
|
|
3029
|
-
}
|
|
3030
|
-
const paths = window.location.pathname.split("/");
|
|
3031
|
-
if (paths.length <= position) {
|
|
3032
|
-
return "";
|
|
3033
|
-
}
|
|
3034
|
-
return paths[position];
|
|
3035
|
-
}
|
|
3036
|
-
function sed(input, searchRegex, replacement) {
|
|
3037
|
-
return input.replace(new RegExp(searchRegex), (...args) => {
|
|
3038
|
-
const END = -2;
|
|
3039
|
-
const groups = args.slice(1, END);
|
|
3040
|
-
let result = replacement;
|
|
3041
|
-
result = result.replace(/\\(\d+)/g, (_, groupIndex) => groups[groupIndex - 1] ?? "");
|
|
3042
|
-
result = result.replace(/\\U(\d+)/g, (_, groupIndex) => (groups[groupIndex - 1] ?? "").toUpperCase());
|
|
3043
|
-
result = sedCommand(result, "U", groups, (str) => str?.toUpperCase());
|
|
3044
|
-
result = sedCommand(result, "L", groups, (str) => str?.toLowerCase());
|
|
3045
|
-
result = sedCommand(result, "I", groups, (str) => str?.[0]);
|
|
3046
|
-
return result ?? "";
|
|
3047
|
-
});
|
|
3048
|
-
}
|
|
3049
|
-
function replace(input, search, replacement, all = true) {
|
|
3050
|
-
if (input === null || input === undefined) {
|
|
3051
|
-
return "";
|
|
3052
|
-
}
|
|
3053
|
-
if (search === null || search === undefined || replacement === null || replacement === undefined) {
|
|
3054
|
-
return input;
|
|
3055
|
-
}
|
|
3056
|
-
if (all) {
|
|
3057
|
-
return input.replaceAll(search, replacement);
|
|
3058
|
-
}
|
|
3059
|
-
return input.replace(search, replacement);
|
|
3060
|
-
}
|
|
3061
|
-
function sedCommand(input, char, groups, transform) {
|
|
3062
|
-
if (input === undefined) {
|
|
3063
|
-
return;
|
|
3064
|
-
}
|
|
3065
|
-
return input.replace(new RegExp(`\\\\${char}(\\d+)`, "g"), (_, groupIndex) => transform(groups[groupIndex - 1] ?? "") ?? "");
|
|
3066
|
-
}
|
|
3067
|
-
function search(name) {
|
|
3068
|
-
if (name?.length === undefined || name.length === 0) {
|
|
3069
|
-
return "";
|
|
3070
|
-
}
|
|
3071
|
-
const search2 = window.location.search;
|
|
3072
|
-
if (search2.length === 0) {
|
|
3073
|
-
return "";
|
|
3074
|
-
}
|
|
3075
|
-
const params = new URLSearchParams(search2);
|
|
3076
|
-
return params.get(name) ?? "";
|
|
3077
|
-
}
|
|
3078
|
-
function coalesce() {
|
|
3079
|
-
for (let i = 0;i < arguments.length - 1; i++) {
|
|
3080
|
-
const arg = arguments[i];
|
|
3081
|
-
if (arg !== null && arg !== undefined && arg !== "" && arg !== false) {
|
|
3082
|
-
return arg;
|
|
3083
|
-
}
|
|
3084
|
-
}
|
|
3085
|
-
return "";
|
|
3086
|
-
}
|
|
3087
|
-
function join() {
|
|
3088
|
-
const args = [...arguments].slice(0, arguments.length - 1);
|
|
3089
|
-
const options = arguments[arguments.length - 1];
|
|
3090
|
-
const separator = options.hash.separator ?? "/";
|
|
3091
|
-
return args.filter((arg) => arg !== undefined && arg !== null && arg !== "").join(separator);
|
|
3092
|
-
}
|
|
3093
|
-
function uri(component) {
|
|
3094
|
-
if (component?.length === undefined || component.length === 0) {
|
|
3095
|
-
return "";
|
|
3096
|
-
}
|
|
3097
|
-
const encoded = encodeURIComponent(component);
|
|
3098
|
-
return encoded.replaceAll("'", "%27");
|
|
3099
|
-
}
|
|
3100
|
-
function eq(a, b) {
|
|
3101
|
-
return a === b;
|
|
3102
|
-
}
|
|
3103
|
-
function or(a, b) {
|
|
3104
|
-
return Boolean(a) || Boolean(b);
|
|
3105
|
-
}
|
|
3106
|
-
function and(a, b) {
|
|
3107
|
-
return Boolean(a) && Boolean(b);
|
|
3108
|
-
}
|
|
3109
|
-
function isIn(a, b) {
|
|
3110
|
-
if (b?.length === undefined || b.length === 0) {
|
|
3111
|
-
return false;
|
|
3112
|
-
}
|
|
3113
|
-
return b.includes(a);
|
|
3114
|
-
}
|
|
3115
|
-
function array() {
|
|
3116
|
-
return Array.from(arguments).slice(0, -1);
|
|
3117
|
-
}
|
|
3118
|
-
var GetHelpers = () => ({
|
|
3119
|
-
slug,
|
|
3120
|
-
lower,
|
|
3121
|
-
path,
|
|
3122
|
-
sed,
|
|
3123
|
-
replace,
|
|
3124
|
-
search,
|
|
3125
|
-
coalesce,
|
|
3126
|
-
join,
|
|
3127
|
-
get_first: coalesce,
|
|
3128
|
-
uri,
|
|
3129
|
-
or,
|
|
3130
|
-
and,
|
|
3131
|
-
isIn,
|
|
3132
|
-
array
|
|
3133
|
-
});
|
|
3134
|
-
// src/Api.ts
|
|
3135
|
-
var import_runtime = __toESM(require_runtime2(), 1);
|
|
3136
|
-
var PROD_BIDDER = "//rtb.surfside.io/rtb/bids/surfside";
|
|
3137
|
-
var PROD_CONFIGURATION_SERVICE = "//r.surfside.io";
|
|
3138
|
-
var PROD_SPONSORED_PRODUCT_FEED = "//creative.surfside.io";
|
|
3139
|
-
var PROD_RECOMMENDED_PRODUCT_FEED = "//creative.surfside.io";
|
|
3140
|
-
var PROD_RECOMMENDER_SERVICE = "//t.surfside.io";
|
|
3141
|
-
var PROD_DYNAMIC_ZONE_SERVICE = "//r.surfside.io/";
|
|
3142
|
-
var TLS = (url) => "http:" + url;
|
|
3143
|
-
async function InitSurfAdsCoreInternal(internalApiDto) {
|
|
3144
|
-
const {
|
|
3145
|
-
getDevice,
|
|
3146
|
-
mobile,
|
|
3147
|
-
navigator: navigator2,
|
|
3148
|
-
ip,
|
|
3149
|
-
getGeo,
|
|
3150
|
-
geoProviderToken,
|
|
3151
|
-
getConfiguration,
|
|
3152
|
-
accountId,
|
|
3153
|
-
siteId,
|
|
3154
|
-
logger,
|
|
3155
|
-
channelId,
|
|
3156
|
-
locationId,
|
|
3157
|
-
userId,
|
|
3158
|
-
handlebars,
|
|
3159
|
-
windowInfo,
|
|
3160
|
-
screenInfo,
|
|
3161
|
-
requestBids,
|
|
3162
|
-
getSponsoredProduct,
|
|
3163
|
-
getAllSponsoredProducts,
|
|
3164
|
-
getRecommendedProduct,
|
|
3165
|
-
generateTopProducts,
|
|
3166
|
-
generateForYou,
|
|
3167
|
-
generatePreviousPurchases,
|
|
3168
|
-
getDynamicZone,
|
|
3169
|
-
buildAllSponsoredProductCardResponses,
|
|
3170
|
-
generateSponsoredProductCardResponse,
|
|
3171
|
-
evaluateProductCardTemplate,
|
|
3172
|
-
evaluateClickthroughTemplate
|
|
3173
|
-
} = internalApiDto;
|
|
3174
|
-
const device = getDevice(screenInfo, navigator2, mobile);
|
|
3175
|
-
const geo = await getGeo(geoProviderToken, ip);
|
|
3176
|
-
const configuration = await getConfiguration();
|
|
3177
|
-
if (!configuration.ok) {
|
|
3178
|
-
return Err(new MissingConfigurationError(accountId, siteId));
|
|
3179
|
-
}
|
|
3180
|
-
const startRequestBound = StartRequest.bind(undefined, logger, accountId, siteId, channelId, locationId, GetValue(device), GetValue(geo), userId);
|
|
3181
|
-
const startRequest = (zoneId, id) => startRequestBound(zoneId, id).withApp({
|
|
3182
|
-
bundle: windowInfo.host,
|
|
3183
|
-
name: windowInfo.host,
|
|
3184
|
-
id: siteId,
|
|
3185
|
-
domain: windowInfo.host,
|
|
3186
|
-
publisher: {
|
|
3187
|
-
domain: windowInfo.host
|
|
3188
|
-
}
|
|
3189
|
-
}).withSite({
|
|
3190
|
-
name: windowInfo.host,
|
|
3191
|
-
id: siteId,
|
|
3192
|
-
kwarray: [],
|
|
3193
|
-
mobile: isMobile() ? 1 : 0,
|
|
3194
|
-
page: windowInfo.href,
|
|
3195
|
-
domain: windowInfo.host,
|
|
3196
|
-
publisher: {
|
|
3197
|
-
id: siteId,
|
|
3198
|
-
name: windowInfo.host,
|
|
3199
|
-
domain: windowInfo.host
|
|
3200
|
-
},
|
|
3201
|
-
ref: "",
|
|
3202
|
-
search: windowInfo.search
|
|
3203
|
-
});
|
|
3204
|
-
const startNative = StartNative.bind(undefined, logger);
|
|
3205
|
-
const defaultNative = DefaultNative.bind(undefined, logger);
|
|
3206
|
-
return Ok({
|
|
3207
|
-
logger,
|
|
3208
|
-
getDevice,
|
|
3209
|
-
device: GetValue(device),
|
|
3210
|
-
getGeo,
|
|
3211
|
-
geo: GetValue(geo),
|
|
3212
|
-
configuration: configuration.value,
|
|
3213
|
-
getConfiguration,
|
|
3214
|
-
handlebars,
|
|
3215
|
-
requestBids,
|
|
3216
|
-
startRequest,
|
|
3217
|
-
startNative,
|
|
3218
|
-
defaultNative,
|
|
3219
|
-
getSponsoredProduct,
|
|
3220
|
-
getAllSponsoredProducts,
|
|
3221
|
-
getRecommendedProduct,
|
|
3222
|
-
generateTopProducts,
|
|
3223
|
-
generateForYou,
|
|
3224
|
-
generatePreviousPurchases,
|
|
3225
|
-
buildAllSponsoredProductCardResponses,
|
|
3226
|
-
generateSponsoredProductCardResponse,
|
|
3227
|
-
evaluateProductCardTemplate,
|
|
3228
|
-
evaluateClickthroughTemplate,
|
|
3229
|
-
buildSponsoredCarousel: BuildSponsoredCarousel.bind(undefined, logger, requestBids, generateSponsoredProductCardResponse),
|
|
3230
|
-
buildSponsoredCarouselFromInitialBid: BuildSponsoredCarouselFromInitialBid.bind(undefined, logger, requestBids, generateSponsoredProductCardResponse),
|
|
3231
|
-
buildHybridCarouselFromInitialBid: BuildHybridCarouselFromInitialBid.bind(undefined, logger, evaluateClickthroughTemplate, requestBids, generateSponsoredProductCardResponse, generateTopProducts, generatePreviousPurchases, generateForYou, userId),
|
|
3232
|
-
buildRecommendedCarousel: BuildRecommendedCarousel.bind(undefined, logger, evaluateClickthroughTemplate, generateTopProducts, generatePreviousPurchases, generateForYou, userId),
|
|
3233
|
-
buildHybridCarousel: BuildHybridCarousel.bind(undefined, logger, evaluateClickthroughTemplate, requestBids, generateSponsoredProductCardResponse, generateTopProducts, generatePreviousPurchases, generateForYou, userId),
|
|
3234
|
-
getDynamicZone,
|
|
3235
|
-
buildDynamicZoneRequest: BuildDynamicZoneRequest.bind(undefined, logger, startRequest, defaultNative, screenInfo)
|
|
3236
|
-
});
|
|
3237
|
-
}
|
|
3238
|
-
var InitSurfAdsCoreServices = async (logger, bidderServiceUrl, configurationServiceUrl, productFeedUrl, recommendedProductFeedUrl, recommenderServiceUrl, dynamicZoneServiceUrl, windowInfo, screenInfo, navigator2, mobile, ip, geoProviderToken, accountId, siteId, channelId, locationId, userId) => {
|
|
3239
|
-
const handlebars = import_runtime.default.create();
|
|
3240
|
-
const helpers = GetHelpers();
|
|
3241
|
-
const recommendedProductFeed = GetRecommendedProduct.bind(undefined, logger, recommendedProductFeedUrl, accountId, locationId);
|
|
3242
|
-
const configurationService = GetConfiguration.bind(undefined, logger, configurationServiceUrl, handlebars, helpers, accountId, siteId);
|
|
3243
|
-
const configuration = await configurationService();
|
|
3244
|
-
if (!configuration.ok) {
|
|
3245
|
-
return configuration;
|
|
3246
|
-
}
|
|
3247
|
-
const getAllSponsoredProducts = GetAllSponsoredProducts.bind(undefined, logger, productFeedUrl, accountId, locationId);
|
|
3248
|
-
const generateProductCardResponse = GenerateSponsoredProductCardResponse.bind(undefined, logger, getAllSponsoredProducts, windowInfo, configuration.value);
|
|
3249
|
-
const evaluateClickthroughTemplate = EvaluateHandlebarsClickthroughTemplate.bind(undefined, logger, windowInfo, configuration.value);
|
|
3250
|
-
const evaluateProductCardTemplate = EvaluateHandlebarsProductCardTemplate.bind(undefined, logger, windowInfo, configuration.value);
|
|
3251
|
-
return await InitSurfAdsCoreInternal({
|
|
3252
|
-
logger,
|
|
3253
|
-
requestBids: RequestBids.bind(undefined, logger, bidderServiceUrl, accountId, siteId, locationId, channelId),
|
|
3254
|
-
getConfiguration: configurationService,
|
|
3255
|
-
getGeo: GetGeo.bind(undefined, logger),
|
|
3256
|
-
getDevice: GetDevice.bind(undefined, logger),
|
|
3257
|
-
getSponsoredProduct: GetSponsoredProduct.bind(undefined, logger, productFeedUrl, accountId, locationId),
|
|
3258
|
-
getAllSponsoredProducts,
|
|
3259
|
-
getRecommendedProduct: GetRecommendedProduct.bind(undefined, logger, recommendedProductFeedUrl, accountId, locationId),
|
|
3260
|
-
generateTopProducts: GenerateTopProducts.bind(undefined, logger, recommendedProductFeed, recommenderServiceUrl, accountId, siteId, locationId),
|
|
3261
|
-
generateForYou: GenerateForYou.bind(undefined, logger, recommendedProductFeed, recommenderServiceUrl, accountId, siteId, locationId, userId ?? "undefined"),
|
|
3262
|
-
generatePreviousPurchases: GeneratePreviousPurchases.bind(undefined, logger, recommendedProductFeed, recommenderServiceUrl, accountId, siteId, locationId, userId ?? "undefined"),
|
|
3263
|
-
buildAllSponsoredProductCardResponses: BuildAllSponsoredProductCardResponses.bind(undefined, logger, getAllSponsoredProducts, windowInfo, configuration.value),
|
|
3264
|
-
generateSponsoredProductCardResponse: generateProductCardResponse,
|
|
3265
|
-
evaluateProductCardTemplate,
|
|
3266
|
-
evaluateClickthroughTemplate,
|
|
3267
|
-
handlebars,
|
|
3268
|
-
windowInfo,
|
|
3269
|
-
screenInfo,
|
|
3270
|
-
navigator: navigator2,
|
|
3271
|
-
mobile,
|
|
3272
|
-
ip,
|
|
3273
|
-
geoProviderToken,
|
|
3274
|
-
accountId,
|
|
3275
|
-
siteId,
|
|
3276
|
-
channelId,
|
|
3277
|
-
locationId,
|
|
3278
|
-
userId,
|
|
3279
|
-
getDynamicZone: GetDynamicZone.bind(undefined, logger, configuration.value)
|
|
3280
|
-
});
|
|
3281
|
-
};
|
|
3282
|
-
var InitSurfAdsCoreSSR = async (windowInfo, screen, navigator2, mobile, ip, geoProviderToken, accountId, siteId, channelId, locationId, userId, logger) => InitSurfAdsCoreServices(logger, TLS(PROD_BIDDER), TLS(PROD_CONFIGURATION_SERVICE), TLS(PROD_SPONSORED_PRODUCT_FEED), TLS(PROD_RECOMMENDED_PRODUCT_FEED), TLS(PROD_RECOMMENDER_SERVICE), TLS(PROD_DYNAMIC_ZONE_SERVICE), windowInfo, screen, navigator2, mobile, ip, geoProviderToken, accountId, siteId, channelId, locationId, userId);
|
|
3283
|
-
var InitSurfAdsCore = async (channelId, accountId, siteId, locationId, userId, logger) => {
|
|
3284
|
-
const windowInfo = GetWindowInfo();
|
|
3285
|
-
if (!windowInfo.ok) {
|
|
3286
|
-
return windowInfo;
|
|
3287
|
-
}
|
|
3288
|
-
return InitSurfAdsCoreServices(logger, TLS(PROD_BIDDER), TLS(PROD_CONFIGURATION_SERVICE), TLS(PROD_SPONSORED_PRODUCT_FEED), TLS(PROD_RECOMMENDED_PRODUCT_FEED), TLS(PROD_RECOMMENDER_SERVICE), TLS(PROD_DYNAMIC_ZONE_SERVICE), windowInfo.value, window.screen, window.navigator, isMobile(), undefined, undefined, accountId, siteId, channelId, locationId, userId);
|
|
3289
|
-
};
|
|
3290
|
-
|
|
3291
|
-
class MissingConfigurationError extends Error {
|
|
3292
|
-
constructor(accountId, siteId) {
|
|
3293
|
-
super(`Missing configuration for
|
|
3294
|
-
` + ` accountId: ${accountId}
|
|
3295
|
-
` + ` siteId: ${siteId}
|
|
3296
|
-
` + "1. Check to make sure that these are the correct values for each field" + "2. Check your publisher configuration at " + `https://app.surfside.io/inventory/sites/publisher/${accountId}/${siteId}`);
|
|
3297
|
-
}
|
|
3298
|
-
}
|
|
3299
|
-
|
|
3300
|
-
class NotABrowserError extends Error {
|
|
3301
|
-
constructor() {
|
|
3302
|
-
super('You are not running Surfside Ads Core in a Web browser, so you cannot use "InitSurfAdsCore". ' + "Instead, use InitSurfAdsCoreSSR, and pass the user's screen, navigator, and IP address explicitly " + `so that Surfside Ads Core can initialize geo and device information services. e.g:
|
|
3303
|
-
` + ` InitSurfAdsCoreSSR(
|
|
3304
|
-
` + ` /* width and height of the user's screen: */
|
|
3305
|
-
` + ` { width: screenWidth, height: screenHeight },
|
|
3306
|
-
` + ` /* userAgent string and language of the user: */
|
|
3307
|
-
` + ` { userAgent: userAgent, language: userLanguage },
|
|
3308
|
-
` + ` /* whether the user is on mobile or not: */
|
|
3309
|
-
` + ` true,
|
|
3310
|
-
` + ` /* the requesting User's IP */
|
|
3311
|
-
` + ` request.ipAddress,
|
|
3312
|
-
` + ` /* Your API Token for the Surfside Geo Service: */
|
|
3313
|
-
` + ` geoProviderToken,
|
|
3314
|
-
` + ` accountId,
|
|
3315
|
-
` + ` siteId,
|
|
3316
|
-
` + ` channelId,
|
|
3317
|
-
` + ` locationId,
|
|
3318
|
-
` + ` userId,
|
|
3319
|
-
` + ` /* Optional logger: */
|
|
3320
|
-
` + ` logger
|
|
3321
|
-
` + " )");
|
|
3322
|
-
}
|
|
3323
|
-
}
|
|
3324
|
-
var isMobile = () => typeof window !== "undefined" ? window.ontouchstart !== undefined : false;
|
|
3325
|
-
|
|
3326
|
-
// src/helpers/Window.ts
|
|
3327
|
-
var GetWindowInfo = () => {
|
|
3328
|
-
if (typeof window === "undefined") {
|
|
3329
|
-
return Err(new NotABrowserError);
|
|
3330
|
-
}
|
|
3331
|
-
return Ok({
|
|
3332
|
-
href: window.location.href,
|
|
3333
|
-
origin: window.location.origin,
|
|
3334
|
-
port: window.location.port,
|
|
3335
|
-
path: "/" + window.location.pathname.split("/").filter((part) => part.length > 0).join("/"),
|
|
3336
|
-
host: window.location.host,
|
|
3337
|
-
host_name: window.location.hostname,
|
|
3338
|
-
search: window.location.search,
|
|
3339
|
-
hash: window.location.hash,
|
|
3340
|
-
protocol: window.location.protocol
|
|
3341
|
-
});
|
|
3342
|
-
};
|
|
3343
|
-
export {
|
|
3344
|
-
uri,
|
|
3345
|
-
upper,
|
|
3346
|
-
slug,
|
|
3347
|
-
sed,
|
|
3348
|
-
search,
|
|
3349
|
-
replace,
|
|
3350
|
-
path,
|
|
3351
|
-
or,
|
|
3352
|
-
lower,
|
|
3353
|
-
join,
|
|
3354
|
-
isIn,
|
|
3355
|
-
eq,
|
|
3356
|
-
coalesce,
|
|
3357
|
-
buildDynamicBidRequestRecursive,
|
|
3358
|
-
buildDynamicBidRequestFromSelectedScreenSize,
|
|
3359
|
-
array,
|
|
3360
|
-
and,
|
|
3361
|
-
WrapValue,
|
|
3362
|
-
VideoMimes,
|
|
3363
|
-
ValueOr,
|
|
3364
|
-
UnknownBidderError,
|
|
3365
|
-
TryGet,
|
|
3366
|
-
TryDoFlat,
|
|
3367
|
-
TryDoAsync,
|
|
3368
|
-
TryDo,
|
|
3369
|
-
StartRequest,
|
|
3370
|
-
StartNative,
|
|
3371
|
-
Some,
|
|
3372
|
-
ResultStream,
|
|
3373
|
-
RequestBids,
|
|
3374
|
-
PlacementTypes,
|
|
3375
|
-
Pipe,
|
|
3376
|
-
PROD_SPONSORED_PRODUCT_FEED,
|
|
3377
|
-
PROD_RECOMMENDER_SERVICE,
|
|
3378
|
-
PROD_RECOMMENDED_PRODUCT_FEED,
|
|
3379
|
-
PROD_DYNAMIC_ZONE_SERVICE,
|
|
3380
|
-
PROD_CONFIGURATION_SERVICE,
|
|
3381
|
-
PROD_BIDDER,
|
|
3382
|
-
Ok,
|
|
3383
|
-
NotABrowserError,
|
|
3384
|
-
NoValueError,
|
|
3385
|
-
NoNativeError,
|
|
3386
|
-
NoDynamicScreenSizeMatchError,
|
|
3387
|
-
NoBidsError,
|
|
3388
|
-
NativeResponseToProductInformation,
|
|
3389
|
-
NativePosition,
|
|
3390
|
-
NativeImageTypes,
|
|
3391
|
-
NativeDataTypes,
|
|
3392
|
-
NativeAssetId,
|
|
3393
|
-
MultipleErrorsError,
|
|
3394
|
-
MissingWinUrlError,
|
|
3395
|
-
MissingProductIdError,
|
|
3396
|
-
MissingProductError,
|
|
3397
|
-
MissingDynamicZoneError,
|
|
3398
|
-
MissingConfigurationError,
|
|
3399
|
-
MissingBidsError,
|
|
3400
|
-
MissingAdmError,
|
|
3401
|
-
MalformedNativeResponseError,
|
|
3402
|
-
MalformedBidResponseError,
|
|
3403
|
-
InvalidRecommenderTypeError,
|
|
3404
|
-
InternalServerError,
|
|
3405
|
-
InitSurfAdsCoreServices,
|
|
3406
|
-
InitSurfAdsCoreSSR,
|
|
3407
|
-
InitSurfAdsCoreInternal,
|
|
3408
|
-
InitSurfAdsCore,
|
|
3409
|
-
InitLogger,
|
|
3410
|
-
GetWindowInfo,
|
|
3411
|
-
GetValueOrThrow,
|
|
3412
|
-
GetValue,
|
|
3413
|
-
GetSponsoredProduct,
|
|
3414
|
-
GetRecommendedProduct,
|
|
3415
|
-
GetHelpers,
|
|
3416
|
-
GetGeo,
|
|
3417
|
-
GetDynamicZone,
|
|
3418
|
-
GetDevice,
|
|
3419
|
-
GetConfiguration,
|
|
3420
|
-
GetAllSponsoredProducts,
|
|
3421
|
-
GeoContextToORTB,
|
|
3422
|
-
GenerateTopProducts,
|
|
3423
|
-
GenerateSponsoredProductCardResponse,
|
|
3424
|
-
GeneratePreviousPurchases,
|
|
3425
|
-
GenerateForYou,
|
|
3426
|
-
GenerateArray,
|
|
3427
|
-
Filter,
|
|
3428
|
-
EventTypes,
|
|
3429
|
-
EventTrackingMethods,
|
|
3430
|
-
EvaluateHandlebarsProductCardTemplate,
|
|
3431
|
-
EvaluateHandlebarsClickthroughTemplate,
|
|
3432
|
-
Err,
|
|
3433
|
-
DefaultNative,
|
|
3434
|
-
Ctx,
|
|
3435
|
-
CreativeType,
|
|
3436
|
-
ContextTypes,
|
|
3437
|
-
ContextSubTypes,
|
|
3438
|
-
ConsumeNAsync,
|
|
3439
|
-
ConsumeN,
|
|
3440
|
-
ConsumeAllAsync,
|
|
3441
|
-
ConsumeAll,
|
|
3442
|
-
BuildSponsoredCarouselFromInitialBid,
|
|
3443
|
-
BuildSponsoredCarousel,
|
|
3444
|
-
BuildRecommendedCarousel,
|
|
3445
|
-
BuildHybridCarouselFromInitialBid,
|
|
3446
|
-
BuildHybridCarousel,
|
|
3447
|
-
BuildDynamicZoneRequest,
|
|
3448
|
-
BuildClickthroughUrl,
|
|
3449
|
-
BuildAllSponsoredProductCardResponses,
|
|
3450
|
-
BidderStartingUpError,
|
|
3451
|
-
AsyncPipe,
|
|
3452
|
-
AssertValue,
|
|
3453
|
-
AnyFailed,
|
|
3454
|
-
AllOrNone,
|
|
3455
|
-
AgentTypes,
|
|
3456
|
-
AdCom10DeviceTypes
|
|
3457
|
-
};
|
|
3458
|
-
|
|
3459
|
-
//# debugId=7E779A2D80BDE26564756E2164756E21
|
|
3460
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy91dGlscy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzL2VhY2guanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzL2hlbHBlci1taXNzaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaGVscGVycy9pZi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaGVscGVycy9sb29rdXAuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzL3dpdGguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvZGVjb3JhdG9ycy9pbmxpbmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9kZWNvcmF0b3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvbG9nZ2VyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaW50ZXJuYWwvY3JlYXRlLW5ldy1sb29rdXAtb2JqZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaW50ZXJuYWwvcHJvdG8tYWNjZXNzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvYmFzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaW50ZXJuYWwvd3JhcEhlbHBlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL3J1bnRpbWUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9uby1jb25mbGljdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzLnJ1bnRpbWUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvcnVudGltZS5qcyIsICIuLi8uLi9zcmMvbW9kZWxzL3J0Yi9CaWRSZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9tb2RlbHMvcnRiL05hdGl2ZVJlcXVlc3QudHMiLCAiLi4vLi4vc3JjL21vZGVscy9ydGIvTmF0aXZlUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL3NlcnZpY2VzL0xvZ2dlci50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvUmVzdWx0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2aWNlcy9HZW8udHMiLCAiLi4vLi4vc3JjL3NlcnZpY2VzL0RldmljZS50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvQ29uZmlndXJhdGlvbi50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvQmlkZGVyLnRzIiwgIi4uLy4uL3NyYy9zZXJ2aWNlcy9Qcm9kdWN0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2aWNlcy9SZWNvbW1lbmRlci50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvVGVtcGxhdGUudHMiLCAiLi4vLi4vc3JjL3NlcnZpY2VzL0R5bmFtaWMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTmF0aXZlUmVxdWVzdEJ1aWxkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvUmVxdWVzdEJ1aWxkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvcmVzcG9uc2UvQnVpbHRSZXNwb25zZS50cyIsICIuLi8uLi9zcmMvaGVscGVycy9yZXNwb25zZS9DbGlja3Rocm91Z2gudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvR2VuZXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL1RyeUdldC50cyIsICIuLi8uLi9zcmMvaGVscGVycy9yZXNwb25zZS9Qcm9kdWN0Q2FyZC50cyIsICIuLi8uLi9zcmMvaGVscGVycy9yZXNwb25zZS9DYXJvdXNlbC50cyIsICIuLi8uLi9zcmMvaGVscGVycy9IYW5kbGViYXJzLnRzIiwgIi4uLy4uL3NyYy9BcGkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvV2luZG93LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZXh0ZW5kID0gZXh0ZW5kO1xuZXhwb3J0cy5pbmRleE9mID0gaW5kZXhPZjtcbmV4cG9ydHMuZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4cHJlc3Npb247XG5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuZXhwb3J0cy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1lO1xuZXhwb3J0cy5ibG9ja1BhcmFtcyA9IGJsb2NrUGFyYW1zO1xuZXhwb3J0cy5hcHBlbmRDb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoO1xudmFyIGVzY2FwZSA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnLFxuICBcIidcIjogJyYjeDI3OycsXG4gICdgJzogJyYjeDYwOycsXG4gICc9JzogJyYjeDNEOydcbn07XG5cbnZhciBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgcG9zc2libGUgPSAvWyY8PlwiJ2A9XS87XG5cbmZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7XG4gIHJldHVybiBlc2NhcGVbY2hyXTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKG9iaiAvKiAsIC4uLnNvdXJjZSAqLykge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW2ldLCBrZXkpKSB7XG4gICAgICAgIG9ialtrZXldID0gYXJndW1lbnRzW2ldW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZXhwb3J0cy50b1N0cmluZyA9IHRvU3RyaW5nO1xuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59O1xuLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKGlzRnVuY3Rpb24oL3gvKSkge1xuICBleHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbi8qIGVzbGludC1lbmFibGUgZnVuYy1zdHlsZSAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuLy8gT2xkZXIgSUUgdmVyc2lvbnMgZG8gbm90IGRpcmVjdGx5IHN1cHBvcnQgaW5kZXhPZiBzbyB3ZSBtdXN0IGltcGxlbWVudCBvdXIgb3duLCBzYWRseS5cblxuZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGJhZENoYXJzLCBlc2NhcGVDaGFyKTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICB2YXIgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZnVuY3Rpb24gYmxvY2tQYXJhbXMocGFyYW1zLCBpZHMpIHtcbiAgcGFyYW1zLnBhdGggPSBpZHM7XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkge1xuICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDNWMGFXeHpMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN096czdPenM3UVVGQlFTeEpRVUZOTEUxQlFVMHNSMEZCUnp0QlFVTmlMRXRCUVVjc1JVRkJSU3hQUVVGUE8wRkJRMW9zUzBGQlJ5eEZRVUZGTEUxQlFVMDdRVUZEV0N4TFFVRkhMRVZCUVVVc1RVRkJUVHRCUVVOWUxFdEJRVWNzUlVGQlJTeFJRVUZSTzBGQlEySXNTMEZCUnl4RlFVRkZMRkZCUVZFN1FVRkRZaXhMUVVGSExFVkJRVVVzVVVGQlVUdEJRVU5pTEV0QlFVY3NSVUZCUlN4UlFVRlJPME5CUTJRc1EwRkJRenM3UVVGRlJpeEpRVUZOTEZGQlFWRXNSMEZCUnl4WlFVRlpPMGxCUXpOQ0xGRkJRVkVzUjBGQlJ5eFhRVUZYTEVOQlFVTTdPMEZCUlhwQ0xGTkJRVk1zVlVGQlZTeERRVUZETEVkQlFVY3NSVUZCUlR0QlFVTjJRaXhUUVVGUExFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0RFFVTndRanM3UVVGRlRTeFRRVUZUTEUxQlFVMHNRMEZCUXl4SFFVRkhMRzlDUVVGdlFqdEJRVU0xUXl4UFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NVMEZCVXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdEJRVU42UXl4VFFVRkxMRWxCUVVrc1IwRkJSeXhKUVVGSkxGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlR0QlFVTTFRaXhWUVVGSkxFMUJRVTBzUTBGQlF5eFRRVUZUTEVOQlFVTXNZMEZCWXl4RFFVRkRMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRVZCUVVVN1FVRkRNMFFzVjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UFFVTTVRanRMUVVOR08wZEJRMFk3TzBGQlJVUXNVMEZCVHl4SFFVRkhMRU5CUVVNN1EwRkRXanM3UVVGRlRTeEpRVUZKTEZGQlFWRXNSMEZCUnl4TlFVRk5MRU5CUVVNc1UwRkJVeXhEUVVGRExGRkJRVkVzUTBGQlF6czdPenM3TzBGQlMyaEVMRWxCUVVrc1ZVRkJWU3hIUVVGSExHOUNRVUZUTEV0QlFVc3NSVUZCUlR0QlFVTXZRaXhUUVVGUExFOUJRVThzUzBGQlN5eExRVUZMTEZWQlFWVXNRMEZCUXp0RFFVTndReXhEUVVGRE96czdRVUZIUml4SlFVRkpMRlZCUVZVc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJUdEJRVU51UWl4VlFVOVBMRlZCUVZVc1IwRlFha0lzVlVGQlZTeEhRVUZITEZWQlFWTXNTMEZCU3l4RlFVRkZPMEZCUXpOQ0xGZEJRMFVzVDBGQlR5eExRVUZMTEV0QlFVc3NWVUZCVlN4SlFVTXpRaXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRzFDUVVGdFFpeERRVU0xUXp0SFFVTklMRU5CUVVNN1EwRkRTRHRSUVVOUkxGVkJRVlVzUjBGQlZpeFZRVUZWT3pzN096dEJRVWxhTEVsQlFVMHNUMEZCVHl4SFFVTnNRaXhMUVVGTExFTkJRVU1zVDBGQlR5eEpRVU5pTEZWQlFWTXNTMEZCU3l4RlFVRkZPMEZCUTJRc1UwRkJUeXhMUVVGTExFbEJRVWtzVDBGQlR5eExRVUZMTEV0QlFVc3NVVUZCVVN4SFFVTnlReXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMR2RDUVVGblFpeEhRVU42UXl4TFFVRkxMRU5CUVVNN1EwRkRXQ3hEUVVGRE96czdPenRCUVVkSExGTkJRVk1zVDBGQlR5eERRVUZETEV0QlFVc3NSVUZCUlN4TFFVRkxMRVZCUVVVN1FVRkRjRU1zVDBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1IwRkJSeXhIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4SFFVRkhMRWRCUVVjc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdEJRVU5vUkN4UlFVRkpMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eExRVUZMTEVWQlFVVTdRVUZEZEVJc1lVRkJUeXhEUVVGRExFTkJRVU03UzBGRFZqdEhRVU5HTzBGQlEwUXNVMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJRenREUVVOWU96dEJRVVZOTEZOQlFWTXNaMEpCUVdkQ0xFTkJRVU1zVFVGQlRTeEZRVUZGTzBGQlEzWkRMRTFCUVVrc1QwRkJUeXhOUVVGTkxFdEJRVXNzVVVGQlVTeEZRVUZGT3p0QlFVVTVRaXhSUVVGSkxFMUJRVTBzU1VGQlNTeE5RVUZOTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUXpOQ0xHRkJRVThzVFVGQlRTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMHRCUTNoQ0xFMUJRVTBzU1VGQlNTeE5RVUZOTEVsQlFVa3NTVUZCU1N4RlFVRkZPMEZCUTNwQ0xHRkJRVThzUlVGQlJTeERRVUZETzB0QlExZ3NUVUZCVFN4SlFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRk8wRkJRMnhDTEdGQlFVOHNUVUZCVFN4SFFVRkhMRVZCUVVVc1EwRkJRenRMUVVOd1FqczdPenM3UVVGTFJDeFZRVUZOTEVkQlFVY3NSVUZCUlN4SFFVRkhMRTFCUVUwc1EwRkJRenRIUVVOMFFqczdRVUZGUkN4TlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlR0QlFVTXhRaXhYUVVGUExFMUJRVTBzUTBGQlF6dEhRVU5tTzBGQlEwUXNVMEZCVHl4TlFVRk5MRU5CUVVNc1QwRkJUeXhEUVVGRExGRkJRVkVzUlVGQlJTeFZRVUZWTEVOQlFVTXNRMEZCUXp0RFFVTTNRenM3UVVGRlRTeFRRVUZUTEU5QlFVOHNRMEZCUXl4TFFVRkxMRVZCUVVVN1FVRkROMElzVFVGQlNTeERRVUZETEV0QlFVc3NTVUZCU1N4TFFVRkxMRXRCUVVzc1EwRkJReXhGUVVGRk8wRkJRM3BDTEZkQlFVOHNTVUZCU1N4RFFVRkRPMGRCUTJJc1RVRkJUU3hKUVVGSkxFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4TFFVRkxMRU5CUVVNc1RVRkJUU3hMUVVGTExFTkJRVU1zUlVGQlJUdEJRVU12UXl4WFFVRlBMRWxCUVVrc1EwRkJRenRIUVVOaUxFMUJRVTA3UVVGRFRDeFhRVUZQTEV0QlFVc3NRMEZCUXp0SFFVTmtPME5CUTBZN08wRkJSVTBzVTBGQlV5eFhRVUZYTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTJ4RExFMUJRVWtzUzBGQlN5eEhRVUZITEUxQlFVMHNRMEZCUXl4RlFVRkZMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGREwwSXNUMEZCU3l4RFFVRkRMRTlCUVU4c1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGRrSXNVMEZCVHl4TFFVRkxMRU5CUVVNN1EwRkRaRHM3UVVGRlRTeFRRVUZUTEZkQlFWY3NRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhGUVVGRk8wRkJRM1pETEZGQlFVMHNRMEZCUXl4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRE8wRkJRMnhDTEZOQlFVOHNUVUZCVFN4RFFVRkRPME5CUTJZN08wRkJSVTBzVTBGQlV5eHBRa0ZCYVVJc1EwRkJReXhYUVVGWExFVkJRVVVzUlVGQlJTeEZRVUZGTzBGQlEycEVMRk5CUVU4c1EwRkJReXhYUVVGWExFZEJRVWNzVjBGQlZ5eEhRVUZITEVkQlFVY3NSMEZCUnl4RlFVRkZMRU5CUVVFc1IwRkJTU3hGUVVGRkxFTkJRVU03UTBGRGNFUWlMQ0ptYVd4bElqb2lkWFJwYkhNdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpqYjI1emRDQmxjMk5oY0dVZ1BTQjdYRzRnSUNjbUp6b2dKeVpoYlhBN0p5eGNiaUFnSnp3bk9pQW5KbXgwT3ljc1hHNGdJQ2MrSnpvZ0p5Wm5kRHNuTEZ4dUlDQW5YQ0luT2lBbkpuRjFiM1E3Snl4Y2JpQWdYQ0luWENJNklDY21JM2d5TnpzbkxGeHVJQ0FuWUNjNklDY21JM2cyTURzbkxGeHVJQ0FuUFNjNklDY21JM2d6UkRzblhHNTlPMXh1WEc1amIyNXpkQ0JpWVdSRGFHRnljeUE5SUM5YkpqdytYQ0luWUQxZEwyY3NYRzRnSUhCdmMzTnBZbXhsSUQwZ0wxc21QRDVjSWlkZ1BWMHZPMXh1WEc1bWRXNWpkR2x2YmlCbGMyTmhjR1ZEYUdGeUtHTm9jaWtnZTF4dUlDQnlaWFIxY200Z1pYTmpZWEJsVzJOb2NsMDdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCbGVIUmxibVFvYjJKcUlDOHFJQ3dnTGk0dWMyOTFjbU5sSUNvdktTQjdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXhPeUJwSUR3Z1lYSm5kVzFsYm5SekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhMlY1SUdsdUlHRnlaM1Z0Wlc1MGMxdHBYU2tnZTF4dUlDQWdJQ0FnYVdZZ0tFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWFHRnpUM2R1VUhKdmNHVnlkSGt1WTJGc2JDaGhjbWQxYldWdWRITmJhVjBzSUd0bGVTa3BJSHRjYmlBZ0lDQWdJQ0FnYjJKcVcydGxlVjBnUFNCaGNtZDFiV1Z1ZEhOYmFWMWJhMlY1WFR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnYjJKcU8xeHVmVnh1WEc1bGVIQnZjblFnYkdWMElIUnZVM1J5YVc1bklEMGdUMkpxWldOMExuQnliM1J2ZEhsd1pTNTBiMU4wY21sdVp6dGNibHh1THk4Z1UyOTFjbU5sWkNCbWNtOXRJR3h2WkdGemFGeHVMeThnYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDJKbGMzUnBaV3B6TDJ4dlpHRnphQzlpYkc5aUwyMWhjM1JsY2k5TVNVTkZUbE5GTG5SNGRGeHVMeW9nWlhOc2FXNTBMV1JwYzJGaWJHVWdablZ1WXkxemRIbHNaU0FxTDF4dWJHVjBJR2x6Um5WdVkzUnBiMjRnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RIbHdaVzltSUhaaGJIVmxJRDA5UFNBblpuVnVZM1JwYjI0bk8xeHVmVHRjYmk4dklHWmhiR3hpWVdOcklHWnZjaUJ2YkdSbGNpQjJaWEp6YVc5dWN5QnZaaUJEYUhKdmJXVWdZVzVrSUZOaFptRnlhVnh1THlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYm1sbUlDaHBjMFoxYm1OMGFXOXVLQzk0THlrcElIdGNiaUFnYVhOR2RXNWpkR2x2YmlBOUlHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJQ0FnY21WMGRYSnVJQ2hjYmlBZ0lDQWdJSFI1Y0dWdlppQjJZV3gxWlNBOVBUMGdKMloxYm1OMGFXOXVKeUFtSmx4dUlDQWdJQ0FnZEc5VGRISnBibWN1WTJGc2JDaDJZV3gxWlNrZ1BUMDlJQ2RiYjJKcVpXTjBJRVoxYm1OMGFXOXVYU2RjYmlBZ0lDQXBPMXh1SUNCOU8xeHVmVnh1Wlhod2IzSjBJSHNnYVhOR2RXNWpkR2x2YmlCOU8xeHVMeW9nWlhOc2FXNTBMV1Z1WVdKc1pTQm1kVzVqTFhOMGVXeGxJQ292WEc1Y2JpOHFJR2x6ZEdGdVluVnNJR2xuYm05eVpTQnVaWGgwSUNvdlhHNWxlSEJ2Y25RZ1kyOXVjM1FnYVhOQmNuSmhlU0E5WEc0Z0lFRnljbUY1TG1selFYSnlZWGtnZkh4Y2JpQWdablZ1WTNScGIyNG9kbUZzZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnZG1Gc2RXVWdKaVlnZEhsd1pXOW1JSFpoYkhWbElEMDlQU0FuYjJKcVpXTjBKMXh1SUNBZ0lDQWdQeUIwYjFOMGNtbHVaeTVqWVd4c0tIWmhiSFZsS1NBOVBUMGdKMXR2WW1wbFkzUWdRWEp5WVhsZEoxeHVJQ0FnSUNBZ09pQm1ZV3h6WlR0Y2JpQWdmVHRjYmx4dUx5OGdUMnhrWlhJZ1NVVWdkbVZ5YzJsdmJuTWdaRzhnYm05MElHUnBjbVZqZEd4NUlITjFjSEJ2Y25RZ2FXNWtaWGhQWmlCemJ5QjNaU0J0ZFhOMElHbHRjR3hsYldWdWRDQnZkWElnYjNkdUxDQnpZV1JzZVM1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCcGJtUmxlRTltS0dGeWNtRjVMQ0IyWVd4MVpTa2dlMXh1SUNCbWIzSWdLR3hsZENCcElEMGdNQ3dnYkdWdUlEMGdZWEp5WVhrdWJHVnVaM1JvT3lCcElEd2diR1Z1T3lCcEt5c3BJSHRjYmlBZ0lDQnBaaUFvWVhKeVlYbGJhVjBnUFQwOUlIWmhiSFZsS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYVR0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJQzB4TzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaWE5qWVhCbFJYaHdjbVZ6YzJsdmJpaHpkSEpwYm1jcElIdGNiaUFnYVdZZ0tIUjVjR1Z2WmlCemRISnBibWNnSVQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0x5OGdaRzl1SjNRZ1pYTmpZWEJsSUZOaFptVlRkSEpwYm1kekxDQnphVzVqWlNCMGFHVjVKM0psSUdGc2NtVmhaSGtnYzJGbVpWeHVJQ0FnSUdsbUlDaHpkSEpwYm1jZ0ppWWdjM1J5YVc1bkxuUnZTRlJOVENrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhOMGNtbHVaeTUwYjBoVVRVd29LVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSE4wY21sdVp5QTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z0p5YzdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2hjM1J5YVc1bktTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2MzUnlhVzVuSUNzZ0p5YzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdSbTl5WTJVZ1lTQnpkSEpwYm1jZ1kyOXVkbVZ5YzJsdmJpQmhjeUIwYUdseklIZHBiR3dnWW1VZ1pHOXVaU0JpZVNCMGFHVWdZWEJ3Wlc1a0lISmxaMkZ5Wkd4bGMzTWdZVzVrWEc0Z0lDQWdMeThnZEdobElISmxaMlY0SUhSbGMzUWdkMmxzYkNCa2J5QjBhR2x6SUhSeVlXNXpjR0Z5Wlc1MGJIa2dZbVZvYVc1a0lIUm9aU0J6WTJWdVpYTXNJR05oZFhOcGJtY2dhWE56ZFdWeklHbG1YRzRnSUNBZ0x5OGdZVzRnYjJKcVpXTjBKM01nZEc4Z2MzUnlhVzVuSUdoaGN5QmxjMk5oY0dWa0lHTm9ZWEpoWTNSbGNuTWdhVzRnYVhRdVhHNGdJQ0FnYzNSeWFXNW5JRDBnSnljZ0t5QnpkSEpwYm1jN1hHNGdJSDFjYmx4dUlDQnBaaUFvSVhCdmMzTnBZbXhsTG5SbGMzUW9jM1J5YVc1bktTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCemRISnBibWM3WEc0Z0lIMWNiaUFnY21WMGRYSnVJSE4wY21sdVp5NXlaWEJzWVdObEtHSmhaRU5vWVhKekxDQmxjMk5oY0dWRGFHRnlLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHbHpSVzF3ZEhrb2RtRnNkV1VwSUh0Y2JpQWdhV1lnS0NGMllXeDFaU0FtSmlCMllXeDFaU0FoUFQwZ01Da2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNCOUlHVnNjMlVnYVdZZ0tHbHpRWEp5WVhrb2RtRnNkV1VwSUNZbUlIWmhiSFZsTG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kzSmxZWFJsUm5KaGJXVW9iMkpxWldOMEtTQjdYRzRnSUd4bGRDQm1jbUZ0WlNBOUlHVjRkR1Z1WkNoN2ZTd2diMkpxWldOMEtUdGNiaUFnWm5KaGJXVXVYM0JoY21WdWRDQTlJRzlpYW1WamREdGNiaUFnY21WMGRYSnVJR1p5WVcxbE8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWW14dlkydFFZWEpoYlhNb2NHRnlZVzF6TENCcFpITXBJSHRjYmlBZ2NHRnlZVzF6TG5CaGRHZ2dQU0JwWkhNN1hHNGdJSEpsZEhWeWJpQndZWEpoYlhNN1hHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJoY0hCbGJtUkRiMjUwWlhoMFVHRjBhQ2hqYjI1MFpYaDBVR0YwYUN3Z2FXUXBJSHRjYmlBZ2NtVjBkWEp1SUNoamIyNTBaWGgwVUdGMGFDQS9JR052Ym5SbGVIUlFZWFJvSUNzZ0p5NG5JRG9nSnljcElDc2dhV1E3WEc1OVhHNGlYWDA9XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ2VuZExpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddO1xuXG5mdW5jdGlvbiBFeGNlcHRpb24obWVzc2FnZSwgbm9kZSkge1xuICB2YXIgbG9jID0gbm9kZSAmJiBub2RlLmxvYyxcbiAgICAgIGxpbmUgPSB1bmRlZmluZWQsXG4gICAgICBlbmRMaW5lTnVtYmVyID0gdW5kZWZpbmVkLFxuICAgICAgY29sdW1uID0gdW5kZWZpbmVkLFxuICAgICAgZW5kQ29sdW1uID0gdW5kZWZpbmVkO1xuXG4gIGlmIChsb2MpIHtcbiAgICBsaW5lID0gbG9jLnN0YXJ0LmxpbmU7XG4gICAgZW5kTGluZU51bWJlciA9IGxvYy5lbmQubGluZTtcbiAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uO1xuICAgIGVuZENvbHVtbiA9IGxvYy5lbmQuY29sdW1uO1xuXG4gICAgbWVzc2FnZSArPSAnIC0gJyArIGxpbmUgKyAnOicgKyBjb2x1bW47XG4gIH1cblxuICB2YXIgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG5cbiAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykge1xuICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXhjZXB0aW9uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvYykge1xuICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcbiAgICAgIHRoaXMuZW5kTGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7XG5cbiAgICAgIC8vIFdvcmsgYXJvdW5kIGlzc3VlIHVuZGVyIHNhZmFyaSB3aGVyZSB3ZSBjYW4ndCBkaXJlY3RseSBzZXQgdGhlIGNvbHVtbiB2YWx1ZVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2x1bW4nLCB7XG4gICAgICAgICAgdmFsdWU6IGNvbHVtbixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VuZENvbHVtbicsIHtcbiAgICAgICAgICB2YWx1ZTogZW5kQ29sdW1uLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgdGhpcy5lbmRDb2x1bW4gPSBlbmRDb2x1bW47XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChub3ApIHtcbiAgICAvKiBJZ25vcmUgaWYgdGhlIGJyb3dzZXIgaXMgdmVyeSBwYXJ0aWN1bGFyICovXG4gIH1cbn1cblxuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJWNFkyVndkR2x2Ymk1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdRVUZCUVN4SlFVRk5MRlZCUVZVc1IwRkJSeXhEUVVOcVFpeGhRVUZoTEVWQlEySXNWVUZCVlN4RlFVTldMRmxCUVZrc1JVRkRXaXhsUVVGbExFVkJRMllzVTBGQlV5eEZRVU5VTEUxQlFVMHNSVUZEVGl4UlFVRlJMRVZCUTFJc1QwRkJUeXhEUVVOU0xFTkJRVU03TzBGQlJVWXNVMEZCVXl4VFFVRlRMRU5CUVVNc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJUdEJRVU5vUXl4TlFVRkpMRWRCUVVjc1IwRkJSeXhKUVVGSkxFbEJRVWtzU1VGQlNTeERRVUZETEVkQlFVYzdUVUZEZUVJc1NVRkJTU3haUVVGQk8wMUJRMG9zWVVGQllTeFpRVUZCTzAxQlEySXNUVUZCVFN4WlFVRkJPMDFCUTA0c1UwRkJVeXhaUVVGQkxFTkJRVU03TzBGQlJWb3NUVUZCU1N4SFFVRkhMRVZCUVVVN1FVRkRVQ3hSUVVGSkxFZEJRVWNzUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRkRUlzYVVKQlFXRXNSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF6dEJRVU0zUWl4VlFVRk5MRWRCUVVjc1IwRkJSeXhEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZETVVJc1lVRkJVeXhIUVVGSExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRPenRCUVVVelFpeFhRVUZQTEVsQlFVa3NTMEZCU3l4SFFVRkhMRWxCUVVrc1IwRkJSeXhIUVVGSExFZEJRVWNzVFVGQlRTeERRVUZETzBkQlEzaERPenRCUVVWRUxFMUJRVWtzUjBGQlJ5eEhRVUZITEV0QlFVc3NRMEZCUXl4VFFVRlRMRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVWQlFVVXNUMEZCVHl4RFFVRkRMRU5CUVVNN096dEJRVWN4UkN4UFFVRkxMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJUdEJRVU5vUkN4UlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRlZCUVZVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzBkQlF6bERPenM3UVVGSFJDeE5RVUZKTEV0QlFVc3NRMEZCUXl4cFFrRkJhVUlzUlVGQlJUdEJRVU16UWl4VFFVRkxMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNTVUZCU1N4RlFVRkZMRk5CUVZNc1EwRkJReXhEUVVGRE8wZEJRekZET3p0QlFVVkVMRTFCUVVrN1FVRkRSaXhSUVVGSkxFZEJRVWNzUlVGQlJUdEJRVU5RTEZWQlFVa3NRMEZCUXl4VlFVRlZMRWRCUVVjc1NVRkJTU3hEUVVGRE8wRkJRM1pDTEZWQlFVa3NRMEZCUXl4aFFVRmhMRWRCUVVjc1lVRkJZU3hEUVVGRE96czdPMEZCU1c1RExGVkJRVWtzVFVGQlRTeERRVUZETEdOQlFXTXNSVUZCUlR0QlFVTjZRaXhqUVVGTkxFTkJRVU1zWTBGQll5eERRVUZETEVsQlFVa3NSVUZCUlN4UlFVRlJMRVZCUVVVN1FVRkRjRU1zWlVGQlN5eEZRVUZGTEUxQlFVMDdRVUZEWWl4dlFrRkJWU3hGUVVGRkxFbEJRVWs3VTBGRGFrSXNRMEZCUXl4RFFVRkRPMEZCUTBnc1kwRkJUU3hEUVVGRExHTkJRV01zUTBGQlF5eEpRVUZKTEVWQlFVVXNWMEZCVnl4RlFVRkZPMEZCUTNaRExHVkJRVXNzUlVGQlJTeFRRVUZUTzBGQlEyaENMRzlDUVVGVkxFVkJRVVVzU1VGQlNUdFRRVU5xUWl4RFFVRkRMRU5CUVVNN1QwRkRTaXhOUVVGTk8wRkJRMHdzV1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4TlFVRk5MRU5CUVVNN1FVRkRja0lzV1VGQlNTeERRVUZETEZOQlFWTXNSMEZCUnl4VFFVRlRMRU5CUVVNN1QwRkROVUk3UzBGRFJqdEhRVU5HTEVOQlFVTXNUMEZCVHl4SFFVRkhMRVZCUVVVN08wZEJSV0k3UTBGRFJqczdRVUZGUkN4VFFVRlRMRU5CUVVNc1UwRkJVeXhIUVVGSExFbEJRVWtzUzBGQlN5eEZRVUZGTEVOQlFVTTdPM0ZDUVVWdVFpeFRRVUZUSWl3aVptbHNaU0k2SW1WNFkyVndkR2x2Ymk1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbU52Ym5OMElHVnljbTl5VUhKdmNITWdQU0JiWEc0Z0lDZGtaWE5qY21sd2RHbHZiaWNzWEc0Z0lDZG1hV3hsVG1GdFpTY3NYRzRnSUNkc2FXNWxUblZ0WW1WeUp5eGNiaUFnSjJWdVpFeHBibVZPZFcxaVpYSW5MRnh1SUNBbmJXVnpjMkZuWlNjc1hHNGdJQ2R1WVcxbEp5eGNiaUFnSjI1MWJXSmxjaWNzWEc0Z0lDZHpkR0ZqYXlkY2JsMDdYRzVjYm1aMWJtTjBhVzl1SUVWNFkyVndkR2x2YmlodFpYTnpZV2RsTENCdWIyUmxLU0I3WEc0Z0lHeGxkQ0JzYjJNZ1BTQnViMlJsSUNZbUlHNXZaR1V1Ykc5akxGeHVJQ0FnSUd4cGJtVXNYRzRnSUNBZ1pXNWtUR2x1WlU1MWJXSmxjaXhjYmlBZ0lDQmpiMngxYlc0c1hHNGdJQ0FnWlc1a1EyOXNkVzF1TzF4dVhHNGdJR2xtSUNoc2IyTXBJSHRjYmlBZ0lDQnNhVzVsSUQwZ2JHOWpMbk4wWVhKMExteHBibVU3WEc0Z0lDQWdaVzVrVEdsdVpVNTFiV0psY2lBOUlHeHZZeTVsYm1RdWJHbHVaVHRjYmlBZ0lDQmpiMngxYlc0Z1BTQnNiMk11YzNSaGNuUXVZMjlzZFcxdU8xeHVJQ0FnSUdWdVpFTnZiSFZ0YmlBOUlHeHZZeTVsYm1RdVkyOXNkVzF1TzF4dVhHNGdJQ0FnYldWemMyRm5aU0FyUFNBbklDMGdKeUFySUd4cGJtVWdLeUFuT2ljZ0t5QmpiMngxYlc0N1hHNGdJSDFjYmx4dUlDQnNaWFFnZEcxd0lEMGdSWEp5YjNJdWNISnZkRzkwZVhCbExtTnZibk4wY25WamRHOXlMbU5oYkd3b2RHaHBjeXdnYldWemMyRm5aU2s3WEc1Y2JpQWdMeThnVlc1bWIzSjBkVzVoZEdWc2VTQmxjbkp2Y25NZ1lYSmxJRzV2ZENCbGJuVnRaWEpoWW14bElHbHVJRU5vY205dFpTQW9ZWFFnYkdWaGMzUXBMQ0J6YnlCZ1ptOXlJSEJ5YjNBZ2FXNGdkRzF3WUNCa2IyVnpiaWQwSUhkdmNtc3VYRzRnSUdadmNpQW9iR1YwSUdsa2VDQTlJREE3SUdsa2VDQThJR1Z5Y205eVVISnZjSE11YkdWdVozUm9PeUJwWkhnckt5a2dlMXh1SUNBZ0lIUm9hWE5iWlhKeWIzSlFjbTl3YzF0cFpIaGRYU0E5SUhSdGNGdGxjbkp2Y2xCeWIzQnpXMmxrZUYxZE8xeHVJQ0I5WEc1Y2JpQWdMeW9nYVhOMFlXNWlkV3dnYVdkdWIzSmxJR1ZzYzJVZ0tpOWNiaUFnYVdZZ0tFVnljbTl5TG1OaGNIUjFjbVZUZEdGamExUnlZV05sS1NCN1hHNGdJQ0FnUlhKeWIzSXVZMkZ3ZEhWeVpWTjBZV05yVkhKaFkyVW9kR2hwY3l3Z1JYaGpaWEIwYVc5dUtUdGNiaUFnZlZ4dVhHNGdJSFJ5ZVNCN1hHNGdJQ0FnYVdZZ0tHeHZZeWtnZTF4dUlDQWdJQ0FnZEdocGN5NXNhVzVsVG5WdFltVnlJRDBnYkdsdVpUdGNiaUFnSUNBZ0lIUm9hWE11Wlc1a1RHbHVaVTUxYldKbGNpQTlJR1Z1WkV4cGJtVk9kVzFpWlhJN1hHNWNiaUFnSUNBZ0lDOHZJRmR2Y21zZ1lYSnZkVzVrSUdsemMzVmxJSFZ1WkdWeUlITmhabUZ5YVNCM2FHVnlaU0IzWlNCallXNG5kQ0JrYVhKbFkzUnNlU0J6WlhRZ2RHaGxJR052YkhWdGJpQjJZV3gxWlZ4dUlDQWdJQ0FnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYmlBZ0lDQWdJR2xtSUNoUFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa3BJSHRjYmlBZ0lDQWdJQ0FnVDJKcVpXTjBMbVJsWm1sdVpWQnliM0JsY25SNUtIUm9hWE1zSUNkamIyeDFiVzRuTENCN1hHNGdJQ0FnSUNBZ0lDQWdkbUZzZFdVNklHTnZiSFZ0Yml4Y2JpQWdJQ0FnSUNBZ0lDQmxiblZ0WlhKaFlteGxPaUIwY25WbFhHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0JQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb2RHaHBjeXdnSjJWdVpFTnZiSFZ0Ymljc0lIdGNiaUFnSUNBZ0lDQWdJQ0IyWVd4MVpUb2daVzVrUTI5c2RXMXVMRnh1SUNBZ0lDQWdJQ0FnSUdWdWRXMWxjbUZpYkdVNklIUnlkV1ZjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbU52YkhWdGJpQTlJR052YkhWdGJqdGNiaUFnSUNBZ0lDQWdkR2hwY3k1bGJtUkRiMngxYlc0Z1BTQmxibVJEYjJ4MWJXNDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5SUdOaGRHTm9JQ2h1YjNBcElIdGNiaUFnSUNBdktpQkpaMjV2Y21VZ2FXWWdkR2hsSUdKeWIzZHpaWElnYVhNZ2RtVnllU0J3WVhKMGFXTjFiR0Z5SUNvdlhHNGdJSDFjYm4xY2JseHVSWGhqWlhCMGFXOXVMbkJ5YjNSdmRIbHdaU0E5SUc1bGR5QkZjbkp2Y2lncE8xeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQkZlR05sY0hScGIyNDdYRzRpWFgwPVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2Jsb2NrSGVscGVyTWlzc2luZycsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgdmFyIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzLmVhY2goY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICB2YXIgZGF0YSA9IF91dGlscy5jcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gX3V0aWxzLmFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHsgZGF0YTogZGF0YSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12WW14dlkyc3RhR1ZzY0dWeUxXMXBjM05wYm1jdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenR4UWtGQmQwUXNWVUZCVlRzN2NVSkJSVzVFTEZWQlFWTXNVVUZCVVN4RlFVRkZPMEZCUTJoRExGVkJRVkVzUTBGQlF5eGpRVUZqTEVOQlFVTXNiMEpCUVc5Q0xFVkJRVVVzVlVGQlV5eFBRVUZQTEVWQlFVVXNUMEZCVHl4RlFVRkZPMEZCUTNaRkxGRkJRVWtzVDBGQlR5eEhRVUZITEU5QlFVOHNRMEZCUXl4UFFVRlBPMUZCUXpOQ0xFVkJRVVVzUjBGQlJ5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPenRCUVVWc1FpeFJRVUZKTEU5QlFVOHNTMEZCU3l4SlFVRkpMRVZCUVVVN1FVRkRjRUlzWVVGQlR5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1MwRkRha0lzVFVGQlRTeEpRVUZKTEU5QlFVOHNTMEZCU3l4TFFVRkxMRWxCUVVrc1QwRkJUeXhKUVVGSkxFbEJRVWtzUlVGQlJUdEJRVU12UXl4aFFVRlBMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dExRVU4wUWl4TlFVRk5MRWxCUVVrc1pVRkJVU3hQUVVGUExFTkJRVU1zUlVGQlJUdEJRVU16UWl4VlFVRkpMRTlCUVU4c1EwRkJReXhOUVVGTkxFZEJRVWNzUTBGQlF5eEZRVUZGTzBGQlEzUkNMRmxCUVVrc1QwRkJUeXhEUVVGRExFZEJRVWNzUlVGQlJUdEJRVU5tTEdsQ1FVRlBMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMU5CUXpsQ096dEJRVVZFTEdWQlFVOHNVVUZCVVN4RFFVRkRMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPMDlCUTJoRUxFMUJRVTA3UVVGRFRDeGxRVUZQTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRQUVVOMFFqdExRVU5HTEUxQlFVMDdRVUZEVEN4VlFVRkpMRTlCUVU4c1EwRkJReXhKUVVGSkxFbEJRVWtzVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlR0QlFVTXZRaXhaUVVGSkxFbEJRVWtzUjBGQlJ5eHRRa0ZCV1N4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRGNrTXNXVUZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXg1UWtGRGFrSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFVkJRM2hDTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUTJJc1EwRkJRenRCUVVOR0xHVkJRVThzUjBGQlJ5eEZRVUZGTEVsQlFVa3NSVUZCUlN4SlFVRkpMRVZCUVVVc1EwRkJRenRQUVVNeFFqczdRVUZGUkN4aFFVRlBMRVZCUVVVc1EwRkJReXhQUVVGUExFVkJRVVVzVDBGQlR5eERRVUZETEVOQlFVTTdTMEZETjBJN1IwRkRSaXhEUVVGRExFTkJRVU03UTBGRFNpSXNJbVpwYkdVaU9pSmliRzlqYXkxb1pXeHdaWEl0YldsemMybHVaeTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN0lHRndjR1Z1WkVOdmJuUmxlSFJRWVhSb0xDQmpjbVZoZEdWR2NtRnRaU3dnYVhOQmNuSmhlU0I5SUdaeWIyMGdKeTR1TDNWMGFXeHpKenRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWm5WdVkzUnBiMjRvYVc1emRHRnVZMlVwSUh0Y2JpQWdhVzV6ZEdGdVkyVXVjbVZuYVhOMFpYSklaV3h3WlhJb0oySnNiMk5yU0dWc2NHVnlUV2x6YzJsdVp5Y3NJR1oxYm1OMGFXOXVLR052Ym5SbGVIUXNJRzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQnNaWFFnYVc1MlpYSnpaU0E5SUc5d2RHbHZibk11YVc1MlpYSnpaU3hjYmlBZ0lDQWdJR1p1SUQwZ2IzQjBhVzl1Y3k1bWJqdGNibHh1SUNBZ0lHbG1JQ2hqYjI1MFpYaDBJRDA5UFNCMGNuVmxLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabTRvZEdocGN5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiMjUwWlhoMElEMDlQU0JtWVd4elpTQjhmQ0JqYjI1MFpYaDBJRDA5SUc1MWJHd3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnBiblpsY25ObEtIUm9hWE1wTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYVhOQmNuSmhlU2hqYjI1MFpYaDBLU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHTnZiblJsZUhRdWJHVnVaM1JvSUQ0Z01Da2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2IzQjBhVzl1Y3k1cFpITXBJSHRjYmlBZ0lDQWdJQ0FnSUNCdmNIUnBiMjV6TG1sa2N5QTlJRnR2Y0hScGIyNXpMbTVoYldWZE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR2x1YzNSaGJtTmxMbWhsYkhCbGNuTXVaV0ZqYUNoamIyNTBaWGgwTENCdmNIUnBiMjV6S1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJwYm5abGNuTmxLSFJvYVhNcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JwWmlBb2IzQjBhVzl1Y3k1a1lYUmhJQ1ltSUc5d2RHbHZibk11YVdSektTQjdYRzRnSUNBZ0lDQWdJR3hsZENCa1lYUmhJRDBnWTNKbFlYUmxSbkpoYldVb2IzQjBhVzl1Y3k1a1lYUmhLVHRjYmlBZ0lDQWdJQ0FnWkdGMFlTNWpiMjUwWlhoMFVHRjBhQ0E5SUdGd2NHVnVaRU52Ym5SbGVIUlFZWFJvS0Z4dUlDQWdJQ0FnSUNBZ0lHOXdkR2x2Ym5NdVpHRjBZUzVqYjI1MFpYaDBVR0YwYUN4Y2JpQWdJQ0FnSUNBZ0lDQnZjSFJwYjI1ekxtNWhiV1ZjYmlBZ0lDQWdJQ0FnS1R0Y2JpQWdJQ0FnSUNBZ2IzQjBhVzl1Y3lBOUlIc2daR0YwWVRvZ1pHRjBZU0I5TzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCeVpYUjFjbTRnWm00b1kyOXVkR1Y0ZEN3Z2IzQjBhVzl1Y3lrN1hHNGdJQ0FnZlZ4dUlDQjlLVHRjYm4xY2JpSmRmUT09XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBfZXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vZXhjZXB0aW9uJyk7XG5cbnZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTXVzdCBwYXNzIGl0ZXJhdG9yIHRvICNlYWNoJyk7XG4gICAgfVxuXG4gICAgdmFyIGZuID0gb3B0aW9ucy5mbixcbiAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIHJldCA9ICcnLFxuICAgICAgICBkYXRhID0gdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gX3V0aWxzLmFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhlY0l0ZXJhdGlvbihmaWVsZCwgaW5kZXgsIGxhc3QpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEua2V5ID0gZmllbGQ7XG4gICAgICAgIGRhdGEuaW5kZXggPSBpbmRleDtcbiAgICAgICAgZGF0YS5maXJzdCA9IGluZGV4ID09PSAwO1xuICAgICAgICBkYXRhLmxhc3QgPSAhIWxhc3Q7XG5cbiAgICAgICAgaWYgKGNvbnRleHRQYXRoKSB7XG4gICAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoICsgZmllbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGNvbnRleHQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgaWYgKGkgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgZXhlY0l0ZXJhdGlvbihpLCBpLCBpID09PSBjb250ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGNvbnRleHRbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgICB2YXIgbmV3Q29udGV4dCA9IFtdO1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBjb250ZXh0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgZm9yICh2YXIgaXQgPSBpdGVyYXRvci5uZXh0KCk7ICFpdC5kb25lOyBpdCA9IGl0ZXJhdG9yLm5leHQoKSkge1xuICAgICAgICAgIG5ld0NvbnRleHQucHVzaChpdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dCA9IG5ld0NvbnRleHQ7XG4gICAgICAgIGZvciAodmFyIGogPSBjb250ZXh0Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgIGV4ZWNJdGVyYXRpb24oaSwgaSwgaSA9PT0gY29udGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBPYmplY3Qua2V5cyhjb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS5cbiAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5O1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICByZXQgPSBpbnZlcnNlKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmhsYkhCbGNuTXZaV0ZqYUM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3TzNGQ1FVMVBMRlZCUVZVN08zbENRVU5MTEdOQlFXTTdPenM3Y1VKQlJYSkNMRlZCUVZNc1VVRkJVU3hGUVVGRk8wRkJRMmhETEZWQlFWRXNRMEZCUXl4alFVRmpMRU5CUVVNc1RVRkJUU3hGUVVGRkxGVkJRVk1zVDBGQlR5eEZRVUZGTEU5QlFVOHNSVUZCUlR0QlFVTjZSQ3hSUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlExb3NXVUZCVFN3eVFrRkJZeXcyUWtGQk5rSXNRMEZCUXl4RFFVRkRPMHRCUTNCRU96dEJRVVZFTEZGQlFVa3NSVUZCUlN4SFFVRkhMRTlCUVU4c1EwRkJReXhGUVVGRk8xRkJRMnBDTEU5QlFVOHNSMEZCUnl4UFFVRlBMRU5CUVVNc1QwRkJUenRSUVVONlFpeERRVUZETEVkQlFVY3NRMEZCUXp0UlFVTk1MRWRCUVVjc1IwRkJSeXhGUVVGRk8xRkJRMUlzU1VGQlNTeFpRVUZCTzFGQlEwb3NWMEZCVnl4WlFVRkJMRU5CUVVNN08wRkJSV1FzVVVGQlNTeFBRVUZQTEVOQlFVTXNTVUZCU1N4SlFVRkpMRTlCUVU4c1EwRkJReXhIUVVGSExFVkJRVVU3UVVGREwwSXNhVUpCUVZjc1IwRkRWQ3g1UWtGQmEwSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFVkJRVVVzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF6dExRVU55UlRzN1FVRkZSQ3hSUVVGSkxHdENRVUZYTEU5QlFVOHNRMEZCUXl4RlFVRkZPMEZCUTNaQ0xHRkJRVThzUjBGQlJ5eFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wdEJRemxDT3p0QlFVVkVMRkZCUVVrc1QwRkJUeXhEUVVGRExFbEJRVWtzUlVGQlJUdEJRVU5vUWl4VlFVRkpMRWRCUVVjc2JVSkJRVmtzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMHRCUTJ4RE96dEJRVVZFTEdGQlFWTXNZVUZCWVN4RFFVRkRMRXRCUVVzc1JVRkJSU3hMUVVGTExFVkJRVVVzU1VGQlNTeEZRVUZGTzBGQlEzcERMRlZCUVVrc1NVRkJTU3hGUVVGRk8wRkJRMUlzV1VGQlNTeERRVUZETEVkQlFVY3NSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRha0lzV1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRia0lzV1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4TFFVRkxMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRM3BDTEZsQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF6czdRVUZGYmtJc1dVRkJTU3hYUVVGWExFVkJRVVU3UVVGRFppeGpRVUZKTEVOQlFVTXNWMEZCVnl4SFFVRkhMRmRCUVZjc1IwRkJSeXhMUVVGTExFTkJRVU03VTBGRGVFTTdUMEZEUmpzN1FVRkZSQ3hUUVVGSExFZEJRMFFzUjBGQlJ5eEhRVU5JTEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVU3UVVGRGFrSXNXVUZCU1N4RlFVRkZMRWxCUVVrN1FVRkRWaXh0UWtGQlZ5eEZRVUZGTEcxQ1FVTllMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RlFVTjJRaXhEUVVGRExGZEJRVmNzUjBGQlJ5eExRVUZMTEVWQlFVVXNTVUZCU1N4RFFVRkRMRU5CUXpWQ08wOUJRMFlzUTBGQlF5eERRVUZETzB0QlEwNDdPMEZCUlVRc1VVRkJTU3hQUVVGUExFbEJRVWtzVDBGQlR5eFBRVUZQTEV0QlFVc3NVVUZCVVN4RlFVRkZPMEZCUXpGRExGVkJRVWtzWlVGQlVTeFBRVUZQTEVOQlFVTXNSVUZCUlR0QlFVTndRaXhoUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0QlFVTjJReXhqUVVGSkxFTkJRVU1zU1VGQlNTeFBRVUZQTEVWQlFVVTdRVUZEYUVJc2VVSkJRV0VzUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1MwRkJTeXhQUVVGUExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMWRCUXk5RE8xTkJRMFk3VDBGRFJpeE5RVUZOTEVsQlFVa3NUMEZCVHl4TlFVRk5MRXRCUVVzc1ZVRkJWU3hKUVVGSkxFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RFFVRkRMRVZCUVVVN1FVRkRia1VzV1VGQlRTeFZRVUZWTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTNSQ0xGbEJRVTBzVVVGQlVTeEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExFVkJRVVVzUTBGQlF6dEJRVU0xUXl4aFFVRkxMRWxCUVVrc1JVRkJSU3hIUVVGSExGRkJRVkVzUTBGQlF5eEpRVUZKTEVWQlFVVXNSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFVkJRVVVzUlVGQlJTeEhRVUZITEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVVc1JVRkJSVHRCUVVNM1JDeHZRa0ZCVlN4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdVMEZETTBJN1FVRkRSQ3hsUVVGUExFZEJRVWNzVlVGQlZTeERRVUZETzBGQlEzSkNMR0ZCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEzWkRMSFZDUVVGaExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RFFVRkRMRXRCUVVzc1QwRkJUeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0VFFVTXZRenRQUVVOR0xFMUJRVTA3TzBGQlEwd3NZMEZCU1N4UlFVRlJMRmxCUVVFc1EwRkJRenM3UVVGRllpeG5Ra0ZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eFBRVUZQTEVOQlFVTXNWVUZCUVN4SFFVRkhMRVZCUVVrN096czdRVUZKYkVNc1owSkJRVWtzVVVGQlVTeExRVUZMTEZOQlFWTXNSVUZCUlR0QlFVTXhRaXd5UWtGQllTeERRVUZETEZGQlFWRXNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU03WVVGRGFFTTdRVUZEUkN4dlFrRkJVU3hIUVVGSExFZEJRVWNzUTBGQlF6dEJRVU5tTEdGQlFVTXNSVUZCUlN4RFFVRkRPMWRCUTB3c1EwRkJReXhEUVVGRE8wRkJRMGdzWTBGQlNTeFJRVUZSTEV0QlFVc3NVMEZCVXl4RlFVRkZPMEZCUXpGQ0xIbENRVUZoTEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdWMEZEZEVNN08wOUJRMFk3UzBGRFJqczdRVUZGUkN4UlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVU3UVVGRFdDeFRRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wdEJRM0pDT3p0QlFVVkVMRmRCUVU4c1IwRkJSeXhEUVVGRE8wZEJRMW9zUTBGQlF5eERRVUZETzBOQlEwb2lMQ0ptYVd4bElqb2laV0ZqYUM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdYRzRnSUdGd2NHVnVaRU52Ym5SbGVIUlFZWFJvTEZ4dUlDQmliRzlqYTFCaGNtRnRjeXhjYmlBZ1kzSmxZWFJsUm5KaGJXVXNYRzRnSUdselFYSnlZWGtzWEc0Z0lHbHpSblZ1WTNScGIyNWNibjBnWm5KdmJTQW5MaTR2ZFhScGJITW5PMXh1YVcxd2IzSjBJRVY0WTJWd2RHbHZiaUJtY205dElDY3VMaTlsZUdObGNIUnBiMjRuTzF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCbWRXNWpkR2x2YmlocGJuTjBZVzVqWlNrZ2UxeHVJQ0JwYm5OMFlXNWpaUzV5WldkcGMzUmxja2hsYkhCbGNpZ25aV0ZqYUNjc0lHWjFibU4wYVc5dUtHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcElIdGNiaUFnSUNCcFppQW9JVzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGZUdObGNIUnBiMjRvSjAxMWMzUWdjR0Z6Y3lCcGRHVnlZWFJ2Y2lCMGJ5QWpaV0ZqYUNjcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUd4bGRDQm1iaUE5SUc5d2RHbHZibk11Wm00c1hHNGdJQ0FnSUNCcGJuWmxjbk5sSUQwZ2IzQjBhVzl1Y3k1cGJuWmxjbk5sTEZ4dUlDQWdJQ0FnYVNBOUlEQXNYRzRnSUNBZ0lDQnlaWFFnUFNBbkp5eGNiaUFnSUNBZ0lHUmhkR0VzWEc0Z0lDQWdJQ0JqYjI1MFpYaDBVR0YwYUR0Y2JseHVJQ0FnSUdsbUlDaHZjSFJwYjI1ekxtUmhkR0VnSmlZZ2IzQjBhVzl1Y3k1cFpITXBJSHRjYmlBZ0lDQWdJR052Ym5SbGVIUlFZWFJvSUQxY2JpQWdJQ0FnSUNBZ1lYQndaVzVrUTI5dWRHVjRkRkJoZEdnb2IzQjBhVzl1Y3k1a1lYUmhMbU52Ym5SbGVIUlFZWFJvTENCdmNIUnBiMjV6TG1sa2Mxc3dYU2tnS3lBbkxpYzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLR2x6Um5WdVkzUnBiMjRvWTI5dWRHVjRkQ2twSUh0Y2JpQWdJQ0FnSUdOdmJuUmxlSFFnUFNCamIyNTBaWGgwTG1OaGJHd29kR2hwY3lrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdVpHRjBZU2tnZTF4dUlDQWdJQ0FnWkdGMFlTQTlJR055WldGMFpVWnlZVzFsS0c5d2RHbHZibk11WkdGMFlTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z1pYaGxZMGwwWlhKaGRHbHZiaWhtYVdWc1pDd2dhVzVrWlhnc0lHeGhjM1FwSUh0Y2JpQWdJQ0FnSUdsbUlDaGtZWFJoS1NCN1hHNGdJQ0FnSUNBZ0lHUmhkR0V1YTJWNUlEMGdabWxsYkdRN1hHNGdJQ0FnSUNBZ0lHUmhkR0V1YVc1a1pYZ2dQU0JwYm1SbGVEdGNiaUFnSUNBZ0lDQWdaR0YwWVM1bWFYSnpkQ0E5SUdsdVpHVjRJRDA5UFNBd08xeHVJQ0FnSUNBZ0lDQmtZWFJoTG14aGMzUWdQU0FoSVd4aGMzUTdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tHTnZiblJsZUhSUVlYUm9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ1pHRjBZUzVqYjI1MFpYaDBVR0YwYUNBOUlHTnZiblJsZUhSUVlYUm9JQ3NnWm1sbGJHUTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY21WMElEMWNiaUFnSUNBZ0lDQWdjbVYwSUN0Y2JpQWdJQ0FnSUNBZ1ptNG9ZMjl1ZEdWNGRGdG1hV1ZzWkYwc0lIdGNiaUFnSUNBZ0lDQWdJQ0JrWVhSaE9pQmtZWFJoTEZ4dUlDQWdJQ0FnSUNBZ0lHSnNiMk5yVUdGeVlXMXpPaUJpYkc5amExQmhjbUZ0Y3loY2JpQWdJQ0FnSUNBZ0lDQWdJRnRqYjI1MFpYaDBXMlpwWld4a1hTd2dabWxsYkdSZExGeHVJQ0FnSUNBZ0lDQWdJQ0FnVzJOdmJuUmxlSFJRWVhSb0lDc2dabWxsYkdRc0lHNTFiR3hkWEc0Z0lDQWdJQ0FnSUNBZ0tWeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvWTI5dWRHVjRkQ0FtSmlCMGVYQmxiMllnWTI5dWRHVjRkQ0E5UFQwZ0oyOWlhbVZqZENjcElIdGNiaUFnSUNBZ0lHbG1JQ2hwYzBGeWNtRjVLR052Ym5SbGVIUXBLU0I3WEc0Z0lDQWdJQ0FnSUdadmNpQW9iR1YwSUdvZ1BTQmpiMjUwWlhoMExteGxibWQwYURzZ2FTQThJR283SUdrckt5a2dlMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDaHBJR2x1SUdOdmJuUmxlSFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1Y0WldOSmRHVnlZWFJwYjI0b2FTd2dhU3dnYVNBOVBUMGdZMjl1ZEdWNGRDNXNaVzVuZEdnZ0xTQXhLVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlGTjViV0p2YkNBOVBUMGdKMloxYm1OMGFXOXVKeUFtSmlCamIyNTBaWGgwVzFONWJXSnZiQzVwZEdWeVlYUnZjbDBwSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYm1WM1EyOXVkR1Y0ZENBOUlGdGRPMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQnBkR1Z5WVhSdmNpQTlJR052Ym5SbGVIUmJVM2x0WW05c0xtbDBaWEpoZEc5eVhTZ3BPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tHeGxkQ0JwZENBOUlHbDBaWEpoZEc5eUxtNWxlSFFvS1RzZ0lXbDBMbVJ2Ym1VN0lHbDBJRDBnYVhSbGNtRjBiM0l1Ym1WNGRDZ3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JtVjNRMjl1ZEdWNGRDNXdkWE5vS0dsMExuWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQmpiMjUwWlhoMElEMGdibVYzUTI5dWRHVjRkRHRjYmlBZ0lDQWdJQ0FnWm05eUlDaHNaWFFnYWlBOUlHTnZiblJsZUhRdWJHVnVaM1JvT3lCcElEd2dhanNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJQ0FnWlhobFkwbDBaWEpoZEdsdmJpaHBMQ0JwTENCcElEMDlQU0JqYjI1MFpYaDBMbXhsYm1kMGFDQXRJREVwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCc1pYUWdjSEpwYjNKTFpYazdYRzVjYmlBZ0lDQWdJQ0FnVDJKcVpXTjBMbXRsZVhNb1kyOXVkR1Y0ZENrdVptOXlSV0ZqYUNoclpYa2dQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJRmRsSjNKbElISjFibTVwYm1jZ2RHaGxJR2wwWlhKaGRHbHZibk1nYjI1bElITjBaWEFnYjNWMElHOW1JSE41Ym1NZ2MyOGdkMlVnWTJGdUlHUmxkR1ZqZEZ4dUlDQWdJQ0FnSUNBZ0lDOHZJSFJvWlNCc1lYTjBJR2wwWlhKaGRHbHZiaUIzYVhSb2IzVjBJR2hoZG1VZ2RHOGdjMk5oYmlCMGFHVWdiMkpxWldOMElIUjNhV05sSUdGdVpDQmpjbVZoZEdWY2JpQWdJQ0FnSUNBZ0lDQXZMeUJoYmlCcGRHVnliV1ZrYVdGMFpTQnJaWGx6SUdGeWNtRjVMbHh1SUNBZ0lDQWdJQ0FnSUdsbUlDaHdjbWx2Y2t0bGVTQWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JsZUdWalNYUmxjbUYwYVc5dUtIQnlhVzl5UzJWNUxDQnBJQzBnTVNrN1hHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUhCeWFXOXlTMlY1SUQwZ2EyVjVPMXh1SUNBZ0lDQWdJQ0FnSUdrckt6dGNiaUFnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHdjbWx2Y2t0bGVTQWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdaWGhsWTBsMFpYSmhkR2x2Ymlod2NtbHZja3RsZVN3Z2FTQXRJREVzSUhSeWRXVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0drZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUhKbGRDQTlJR2x1ZG1WeWMyVW9kR2hwY3lrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJSEpsZER0Y2JpQWdmU2s3WEc1OVhHNGlYWDA9XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9leGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdoZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24gKCkgLyogW2FyZ3MsIF1vcHRpb25zICove1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBBIG1pc3NpbmcgZmllbGQgaW4gYSB7e2Zvb319IGNvbnN0cnVjdC5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNvbWVvbmUgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvIGNhbGwgc29tZXRoaW5nLCBibG93IHVwLlxuICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmhsYkhCbGNuTXZhR1ZzY0dWeUxXMXBjM05wYm1jdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3p0NVFrRkJjMElzWTBGQll6czdPenR4UWtGRmNrSXNWVUZCVXl4UlFVRlJMRVZCUVVVN1FVRkRhRU1zVlVGQlVTeERRVUZETEdOQlFXTXNRMEZCUXl4bFFVRmxMRVZCUVVVc2FVTkJRV2RETzBGQlEzWkZMRkZCUVVrc1UwRkJVeXhEUVVGRExFMUJRVTBzUzBGQlN5eERRVUZETEVWQlFVVTdPMEZCUlRGQ0xHRkJRVThzVTBGQlV5eERRVUZETzB0QlEyeENMRTFCUVUwN08wRkJSVXdzV1VGQlRTd3lRa0ZEU2l4dFFrRkJiVUlzUjBGQlJ5eFRRVUZUTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVTnFSU3hEUVVGRE8wdEJRMGc3UjBGRFJpeERRVUZETEVOQlFVTTdRMEZEU2lJc0ltWnBiR1VpT2lKb1pXeHdaWEl0YldsemMybHVaeTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRmVHTmxjSFJwYjI0Z1puSnZiU0FuTGk0dlpYaGpaWEIwYVc5dUp6dGNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdablZ1WTNScGIyNG9hVzV6ZEdGdVkyVXBJSHRjYmlBZ2FXNXpkR0Z1WTJVdWNtVm5hWE4wWlhKSVpXeHdaWElvSjJobGJIQmxjazFwYzNOcGJtY25MQ0JtZFc1amRHbHZiaWd2S2lCYllYSm5jeXdnWFc5d2RHbHZibk1nS2k4cElIdGNiaUFnSUNCcFppQW9ZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQTlQVDBnTVNrZ2UxeHVJQ0FnSUNBZ0x5OGdRU0J0YVhOemFXNW5JR1pwWld4a0lHbHVJR0VnZTN0bWIyOTlmU0JqYjI1emRISjFZM1F1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkVzVrWldacGJtVmtPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBdkx5QlRiMjFsYjI1bElHbHpJR0ZqZEhWaGJHeDVJSFJ5ZVdsdVp5QjBieUJqWVd4c0lITnZiV1YwYUdsdVp5d2dZbXh2ZHlCMWNDNWNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZlR05sY0hScGIyNG9YRzRnSUNBZ0lDQWdJQ2ROYVhOemFXNW5JR2hsYkhCbGNqb2dYQ0luSUNzZ1lYSm5kVzFsYm5SelcyRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ0xTQXhYUzV1WVcxbElDc2dKMXdpSjF4dUlDQWdJQ0FnS1R0Y2JpQWdJQ0I5WEc0Z0lIMHBPMXh1ZlZ4dUlsMTlcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxudmFyIF9leGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9uIChjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9IDIpIHtcbiAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCcjaWYgcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG4gICAgaWYgKF91dGlscy5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkge1xuICAgICAgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCFvcHRpb25zLmhhc2guaW5jbHVkZVplcm8gJiYgIWNvbmRpdGlvbmFsIHx8IF91dGlscy5pc0VtcHR5KGNvbmRpdGlvbmFsKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gICAgfVxuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT0gMikge1xuICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyN1bmxlc3MgcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge1xuICAgICAgZm46IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgIGludmVyc2U6IG9wdGlvbnMuZm4sXG4gICAgICBoYXNoOiBvcHRpb25zLmhhc2hcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyaGxiSEJsY25NdmFXWXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096dHhRa0ZCYjBNc1ZVRkJWVHM3ZVVKQlEzaENMR05CUVdNN096czdjVUpCUlhKQ0xGVkJRVk1zVVVGQlVTeEZRVUZGTzBGQlEyaERMRlZCUVZFc1EwRkJReXhqUVVGakxFTkJRVU1zU1VGQlNTeEZRVUZGTEZWQlFWTXNWMEZCVnl4RlFVRkZMRTlCUVU4c1JVRkJSVHRCUVVNelJDeFJRVUZKTEZOQlFWTXNRMEZCUXl4TlFVRk5MRWxCUVVrc1EwRkJReXhGUVVGRk8wRkJRM3BDTEZsQlFVMHNNa0pCUVdNc2JVTkJRVzFETEVOQlFVTXNRMEZCUXp0TFFVTXhSRHRCUVVORUxGRkJRVWtzYTBKQlFWY3NWMEZCVnl4RFFVRkRMRVZCUVVVN1FVRkRNMElzYVVKQlFWY3NSMEZCUnl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzB0QlEzUkRPenM3T3p0QlFVdEVMRkZCUVVrc1FVRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNWMEZCVnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhKUVVGTExHVkJRVkVzVjBGQlZ5eERRVUZETEVWQlFVVTdRVUZEZGtVc1lVRkJUeXhQUVVGUExFTkJRVU1zVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMHRCUXpsQ0xFMUJRVTA3UVVGRFRDeGhRVUZQTEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03UzBGRGVrSTdSMEZEUml4RFFVRkRMRU5CUVVNN08wRkJSVWdzVlVGQlVTeERRVUZETEdOQlFXTXNRMEZCUXl4UlFVRlJMRVZCUVVVc1ZVRkJVeXhYUVVGWExFVkJRVVVzVDBGQlR5eEZRVUZGTzBGQlF5OUVMRkZCUVVrc1UwRkJVeXhEUVVGRExFMUJRVTBzU1VGQlNTeERRVUZETEVWQlFVVTdRVUZEZWtJc1dVRkJUU3d5UWtGQll5eDFRMEZCZFVNc1EwRkJReXhEUVVGRE8wdEJRemxFTzBGQlEwUXNWMEZCVHl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1YwRkJWeXhGUVVGRk8wRkJRM0JFTEZGQlFVVXNSVUZCUlN4UFFVRlBMRU5CUVVNc1QwRkJUenRCUVVOdVFpeGhRVUZQTEVWQlFVVXNUMEZCVHl4RFFVRkRMRVZCUVVVN1FVRkRia0lzVlVGQlNTeEZRVUZGTEU5QlFVOHNRMEZCUXl4SlFVRkpPMHRCUTI1Q0xFTkJRVU1zUTBGQlF6dEhRVU5LTEVOQlFVTXNRMEZCUXp0RFFVTktJaXdpWm1sc1pTSTZJbWxtTG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIc2dhWE5GYlhCMGVTd2dhWE5HZFc1amRHbHZiaUI5SUdaeWIyMGdKeTR1TDNWMGFXeHpKenRjYm1sdGNHOXlkQ0JGZUdObGNIUnBiMjRnWm5KdmJTQW5MaTR2WlhoalpYQjBhVzl1Snp0Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1puVnVZM1JwYjI0b2FXNXpkR0Z1WTJVcElIdGNiaUFnYVc1emRHRnVZMlV1Y21WbmFYTjBaWEpJWld4d1pYSW9KMmxtSnl3Z1puVnVZM1JwYjI0b1kyOXVaR2wwYVc5dVlXd3NJRzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0FoUFNBeUtTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLQ2NqYVdZZ2NtVnhkV2x5WlhNZ1pYaGhZM1JzZVNCdmJtVWdZWEpuZFcxbGJuUW5LVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLR2x6Um5WdVkzUnBiMjRvWTI5dVpHbDBhVzl1WVd3cEtTQjdYRzRnSUNBZ0lDQmpiMjVrYVhScGIyNWhiQ0E5SUdOdmJtUnBkR2x2Ym1Gc0xtTmhiR3dvZEdocGN5azdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdSR1ZtWVhWc2RDQmlaV2hoZG1sdmNpQnBjeUIwYnlCeVpXNWtaWElnZEdobElIQnZjMmwwYVhabElIQmhkR2dnYVdZZ2RHaGxJSFpoYkhWbElHbHpJSFJ5ZFhSb2VTQmhibVFnYm05MElHVnRjSFI1TGx4dUlDQWdJQzh2SUZSb1pTQmdhVzVqYkhWa1pWcGxjbTlnSUc5d2RHbHZiaUJ0WVhrZ1ltVWdjMlYwSUhSdklIUnlaV0YwSUhSb1pTQmpiMjVrZEdsdmJtRnNJR0Z6SUhCMWNtVnNlU0J1YjNRZ1pXMXdkSGtnWW1GelpXUWdiMjRnZEdobFhHNGdJQ0FnTHk4Z1ltVm9ZWFpwYjNJZ2IyWWdhWE5GYlhCMGVTNGdSV1ptWldOMGFYWmxiSGtnZEdocGN5QmtaWFJsY20xcGJtVnpJR2xtSURBZ2FYTWdhR0Z1Wkd4bFpDQmllU0IwYUdVZ2NHOXphWFJwZG1VZ2NHRjBhQ0J2Y2lCdVpXZGhkR2wyWlM1Y2JpQWdJQ0JwWmlBb0tDRnZjSFJwYjI1ekxtaGhjMmd1YVc1amJIVmtaVnBsY204Z0ppWWdJV052Ym1ScGRHbHZibUZzS1NCOGZDQnBjMFZ0Y0hSNUtHTnZibVJwZEdsdmJtRnNLU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVhVzUyWlhKelpTaDBhR2x6S1R0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHOXdkR2x2Ym5NdVptNG9kR2hwY3lrN1hHNGdJQ0FnZlZ4dUlDQjlLVHRjYmx4dUlDQnBibk4wWVc1alpTNXlaV2RwYzNSbGNraGxiSEJsY2lnbmRXNXNaWE56Snl3Z1puVnVZM1JwYjI0b1kyOXVaR2wwYVc5dVlXd3NJRzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0FoUFNBeUtTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLQ2NqZFc1c1pYTnpJSEpsY1hWcGNtVnpJR1Y0WVdOMGJIa2diMjVsSUdGeVozVnRaVzUwSnlrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnBibk4wWVc1alpTNW9aV3h3WlhKeld5ZHBaaWRkTG1OaGJHd29kR2hwY3l3Z1kyOXVaR2wwYVc5dVlXd3NJSHRjYmlBZ0lDQWdJR1p1T2lCdmNIUnBiMjV6TG1sdWRtVnljMlVzWEc0Z0lDQWdJQ0JwYm5abGNuTmxPaUJ2Y0hScGIyNXpMbVp1TEZ4dUlDQWdJQ0FnYUdGemFEb2diM0IwYVc5dWN5NW9ZWE5vWEc0Z0lDQWdmU2s3WEc0Z0lIMHBPMXh1ZlZ4dUlsMTlcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uICgpIC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi97XG4gICAgdmFyIGFyZ3MgPSBbdW5kZWZpbmVkXSxcbiAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICB2YXIgbGV2ZWwgPSAxO1xuICAgIGlmIChvcHRpb25zLmhhc2gubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmhhc2gubGV2ZWw7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhLmxldmVsICE9IG51bGwpIHtcbiAgICAgIGxldmVsID0gb3B0aW9ucy5kYXRhLmxldmVsO1xuICAgIH1cbiAgICBhcmdzWzBdID0gbGV2ZWw7XG5cbiAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12Ykc5bkxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3Y1VKQlFXVXNWVUZCVXl4UlFVRlJMRVZCUVVVN1FVRkRhRU1zVlVGQlVTeERRVUZETEdOQlFXTXNRMEZCUXl4TFFVRkxMRVZCUVVVc2EwTkJRV2xETzBGQlF6bEVMRkZCUVVrc1NVRkJTU3hIUVVGSExFTkJRVU1zVTBGQlV5eERRVUZETzFGQlEzQkNMRTlCUVU4c1IwRkJSeXhUUVVGVExFTkJRVU1zVTBGQlV5eERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNMVF5eFRRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVTBGQlV5eERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3UVVGRE4wTXNWVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0TFFVTjZRanM3UVVGRlJDeFJRVUZKTEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRaQ3hSUVVGSkxFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SlFVRkpMRWxCUVVrc1JVRkJSVHRCUVVNNVFpeFhRVUZMTEVkQlFVY3NUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03UzBGRE5VSXNUVUZCVFN4SlFVRkpMRTlCUVU4c1EwRkJReXhKUVVGSkxFbEJRVWtzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRWxCUVVrc1NVRkJTU3hGUVVGRk8wRkJRM0pFTEZkQlFVc3NSMEZCUnl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dExRVU0xUWp0QlFVTkVMRkZCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTTdPMEZCUldoQ0xGbEJRVkVzUTBGQlF5eEhRVUZITEUxQlFVRXNRMEZCV2l4UlFVRlJMRVZCUVZFc1NVRkJTU3hEUVVGRExFTkJRVU03UjBGRGRrSXNRMEZCUXl4RFFVRkRPME5CUTBvaUxDSm1hV3hsSWpvaWJHOW5MbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdSbFptRjFiSFFnWm5WdVkzUnBiMjRvYVc1emRHRnVZMlVwSUh0Y2JpQWdhVzV6ZEdGdVkyVXVjbVZuYVhOMFpYSklaV3h3WlhJb0oyeHZaeWNzSUdaMWJtTjBhVzl1S0M4cUlHMWxjM05oWjJVc0lHOXdkR2x2Ym5NZ0tpOHBJSHRjYmlBZ0lDQnNaWFFnWVhKbmN5QTlJRnQxYm1SbFptbHVaV1JkTEZ4dUlDQWdJQ0FnYjNCMGFXOXVjeUE5SUdGeVozVnRaVzUwYzF0aGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUMwZ01WMDdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQmhjbWQxYldWdWRITXViR1Z1WjNSb0lDMGdNVHNnYVNzcktTQjdYRzRnSUNBZ0lDQmhjbWR6TG5CMWMyZ29ZWEpuZFcxbGJuUnpXMmxkS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JzWlhRZ2JHVjJaV3dnUFNBeE8xeHVJQ0FnSUdsbUlDaHZjSFJwYjI1ekxtaGhjMmd1YkdWMlpXd2dJVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdiR1YyWld3Z1BTQnZjSFJwYjI1ekxtaGhjMmd1YkdWMlpXdzdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHZjSFJwYjI1ekxtUmhkR0VnSmlZZ2IzQjBhVzl1Y3k1a1lYUmhMbXhsZG1Wc0lDRTlJRzUxYkd3cElIdGNiaUFnSUNBZ0lHeGxkbVZzSUQwZ2IzQjBhVzl1Y3k1a1lYUmhMbXhsZG1Wc08xeHVJQ0FnSUgxY2JpQWdJQ0JoY21keld6QmRJRDBnYkdWMlpXdzdYRzVjYmlBZ0lDQnBibk4wWVc1alpTNXNiMmNvTGk0dVlYSm5jeWs3WEc0Z0lIMHBPMXh1ZlZ4dUlsMTlcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgIC8vIE5vdGUgZm9yIDUuMDogQ2hhbmdlIHRvIFwib2JqID09IG51bGxcIiBpbiA1LjBcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmxvb2t1cFByb3BlcnR5KG9iaiwgZmllbGQpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12Ykc5dmEzVndMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN2NVSkJRV1VzVlVGQlV5eFJRVUZSTEVWQlFVVTdRVUZEYUVNc1ZVRkJVU3hEUVVGRExHTkJRV01zUTBGQlF5eFJRVUZSTEVWQlFVVXNWVUZCVXl4SFFVRkhMRVZCUVVVc1MwRkJTeXhGUVVGRkxFOUJRVThzUlVGQlJUdEJRVU01UkN4UlFVRkpMRU5CUVVNc1IwRkJSeXhGUVVGRk96dEJRVVZTTEdGQlFVOHNSMEZCUnl4RFFVRkRPMHRCUTFvN1FVRkRSQ3hYUVVGUExFOUJRVThzUTBGQlF5eGpRVUZqTEVOQlFVTXNSMEZCUnl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wZEJRek5ETEVOQlFVTXNRMEZCUXp0RFFVTktJaXdpWm1sc1pTSTZJbXh2YjJ0MWNDNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1WNGNHOXlkQ0JrWldaaGRXeDBJR1oxYm1OMGFXOXVLR2x1YzNSaGJtTmxLU0I3WEc0Z0lHbHVjM1JoYm1ObExuSmxaMmx6ZEdWeVNHVnNjR1Z5S0Nkc2IyOXJkWEFuTENCbWRXNWpkR2x2Ymlodlltb3NJR1pwWld4a0xDQnZjSFJwYjI1ektTQjdYRzRnSUNBZ2FXWWdLQ0Z2WW1vcElIdGNiaUFnSUNBZ0lDOHZJRTV2ZEdVZ1ptOXlJRFV1TURvZ1EyaGhibWRsSUhSdklGd2liMkpxSUQwOUlHNTFiR3hjSWlCcGJpQTFMakJjYmlBZ0lDQWdJSEpsZEhWeWJpQnZZbW83WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCdmNIUnBiMjV6TG14dmIydDFjRkJ5YjNCbGNuUjVLRzlpYWl3Z1ptbGxiR1FwTzF4dUlDQjlLVHRjYm4xY2JpSmRmUT09XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBfZXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vZXhjZXB0aW9uJyk7XG5cbnZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT0gMikge1xuICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyN3aXRoIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgZm4gPSBvcHRpb25zLmZuO1xuXG4gICAgaWYgKCFfdXRpbHMuaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBfdXRpbHMuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IF91dGlscy5hcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMuaWRzWzBdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12ZDJsMGFDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPenM3T3pzN08zRkNRVTFQTEZWQlFWVTdPM2xDUVVOTExHTkJRV003T3pzN2NVSkJSWEpDTEZWQlFWTXNVVUZCVVN4RlFVRkZPMEZCUTJoRExGVkJRVkVzUTBGQlF5eGpRVUZqTEVOQlFVTXNUVUZCVFN4RlFVRkZMRlZCUVZNc1QwRkJUeXhGUVVGRkxFOUJRVThzUlVGQlJUdEJRVU42UkN4UlFVRkpMRk5CUVZNc1EwRkJReXhOUVVGTkxFbEJRVWtzUTBGQlF5eEZRVUZGTzBGQlEzcENMRmxCUVUwc01rSkJRV01zY1VOQlFYRkRMRU5CUVVNc1EwRkJRenRMUVVNMVJEdEJRVU5FTEZGQlFVa3NhMEpCUVZjc1QwRkJUeXhEUVVGRExFVkJRVVU3UVVGRGRrSXNZVUZCVHl4SFFVRkhMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdTMEZET1VJN08wRkJSVVFzVVVGQlNTeEZRVUZGTEVkQlFVY3NUMEZCVHl4RFFVRkRMRVZCUVVVc1EwRkJRenM3UVVGRmNFSXNVVUZCU1N4RFFVRkRMR1ZCUVZFc1QwRkJUeXhEUVVGRExFVkJRVVU3UVVGRGNrSXNWVUZCU1N4SlFVRkpMRWRCUVVjc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF6dEJRVU40UWl4VlFVRkpMRTlCUVU4c1EwRkJReXhKUVVGSkxFbEJRVWtzVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlR0QlFVTXZRaXhaUVVGSkxFZEJRVWNzYlVKQlFWa3NUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRMnBETEZsQlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc2VVSkJRMnBDTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVONFFpeFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVObUxFTkJRVU03VDBGRFNEczdRVUZGUkN4aFFVRlBMRVZCUVVVc1EwRkJReXhQUVVGUExFVkJRVVU3UVVGRGFrSXNXVUZCU1N4RlFVRkZMRWxCUVVrN1FVRkRWaXh0UWtGQlZ5eEZRVUZGTEcxQ1FVRlpMRU5CUVVNc1QwRkJUeXhEUVVGRExFVkJRVVVzUTBGQlF5eEpRVUZKTEVsQlFVa3NTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhEUVVGRE8wOUJRMmhGTEVOQlFVTXNRMEZCUXp0TFFVTktMRTFCUVUwN1FVRkRUQ3hoUVVGUExFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1MwRkRPVUk3UjBGRFJpeERRVUZETEVOQlFVTTdRMEZEU2lJc0ltWnBiR1VpT2lKM2FYUm9MbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUh0Y2JpQWdZWEJ3Wlc1a1EyOXVkR1Y0ZEZCaGRHZ3NYRzRnSUdKc2IyTnJVR0Z5WVcxekxGeHVJQ0JqY21WaGRHVkdjbUZ0WlN4Y2JpQWdhWE5GYlhCMGVTeGNiaUFnYVhOR2RXNWpkR2x2Ymx4dWZTQm1jbTl0SUNjdUxpOTFkR2xzY3ljN1hHNXBiWEJ2Y25RZ1JYaGpaWEIwYVc5dUlHWnliMjBnSnk0dUwyVjRZMlZ3ZEdsdmJpYzdYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR1oxYm1OMGFXOXVLR2x1YzNSaGJtTmxLU0I3WEc0Z0lHbHVjM1JoYm1ObExuSmxaMmx6ZEdWeVNHVnNjR1Z5S0NkM2FYUm9KeXdnWm5WdVkzUnBiMjRvWTI5dWRHVjRkQ3dnYjNCMGFXOXVjeWtnZTF4dUlDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUNFOUlESXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGZUdObGNIUnBiMjRvSnlOM2FYUm9JSEpsY1hWcGNtVnpJR1Y0WVdOMGJIa2diMjVsSUdGeVozVnRaVzUwSnlrN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNocGMwWjFibU4wYVc5dUtHTnZiblJsZUhRcEtTQjdYRzRnSUNBZ0lDQmpiMjUwWlhoMElEMGdZMjl1ZEdWNGRDNWpZV3hzS0hSb2FYTXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHeGxkQ0JtYmlBOUlHOXdkR2x2Ym5NdVptNDdYRzVjYmlBZ0lDQnBaaUFvSVdselJXMXdkSGtvWTI5dWRHVjRkQ2twSUh0Y2JpQWdJQ0FnSUd4bGRDQmtZWFJoSUQwZ2IzQjBhVzl1Y3k1a1lYUmhPMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11WkdGMFlTQW1KaUJ2Y0hScGIyNXpMbWxrY3lrZ2UxeHVJQ0FnSUNBZ0lDQmtZWFJoSUQwZ1kzSmxZWFJsUm5KaGJXVW9iM0IwYVc5dWN5NWtZWFJoS1R0Y2JpQWdJQ0FnSUNBZ1pHRjBZUzVqYjI1MFpYaDBVR0YwYUNBOUlHRndjR1Z1WkVOdmJuUmxlSFJRWVhSb0tGeHVJQ0FnSUNBZ0lDQWdJRzl3ZEdsdmJuTXVaR0YwWVM1amIyNTBaWGgwVUdGMGFDeGNiaUFnSUNBZ0lDQWdJQ0J2Y0hScGIyNXpMbWxrYzFzd1hWeHVJQ0FnSUNBZ0lDQXBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabTRvWTI5dWRHVjRkQ3dnZTF4dUlDQWdJQ0FnSUNCa1lYUmhPaUJrWVhSaExGeHVJQ0FnSUNBZ0lDQmliRzlqYTFCaGNtRnRjem9nWW14dlkydFFZWEpoYlhNb1cyTnZiblJsZUhSZExDQmJaR0YwWVNBbUppQmtZWFJoTG1OdmJuUmxlSFJRWVhSb1hTbGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYjNCMGFXOXVjeTVwYm5abGNuTmxLSFJvYVhNcE8xeHVJQ0FnSUgxY2JpQWdmU2s3WEc1OVhHNGlYWDA9XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0SGVscGVycyA9IHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnM7XG5leHBvcnRzLm1vdmVIZWxwZXJUb0hvb2tzID0gbW92ZUhlbHBlclRvSG9va3M7XG4vLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IHJlcXVpcmUoJy4vaGVscGVycy9ibG9jay1oZWxwZXItbWlzc2luZycpO1xuXG52YXIgX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyk7XG5cbnZhciBfaGVscGVyc0VhY2ggPSByZXF1aXJlKCcuL2hlbHBlcnMvZWFjaCcpO1xuXG52YXIgX2hlbHBlcnNFYWNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNFYWNoKTtcblxudmFyIF9oZWxwZXJzSGVscGVyTWlzc2luZyA9IHJlcXVpcmUoJy4vaGVscGVycy9oZWxwZXItbWlzc2luZycpO1xuXG52YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTtcblxudmFyIF9oZWxwZXJzSWYgPSByZXF1aXJlKCcuL2hlbHBlcnMvaWYnKTtcblxudmFyIF9oZWxwZXJzSWYyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0lmKTtcblxudmFyIF9oZWxwZXJzTG9nID0gcmVxdWlyZSgnLi9oZWxwZXJzL2xvZycpO1xuXG52YXIgX2hlbHBlcnNMb2cyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0xvZyk7XG5cbnZhciBfaGVscGVyc0xvb2t1cCA9IHJlcXVpcmUoJy4vaGVscGVycy9sb29rdXAnKTtcblxudmFyIF9oZWxwZXJzTG9va3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb29rdXApO1xuXG52YXIgX2hlbHBlcnNXaXRoID0gcmVxdWlyZSgnLi9oZWxwZXJzL3dpdGgnKTtcblxudmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMoaW5zdGFuY2UpIHtcbiAgX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0VhY2gyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0hlbHBlck1pc3NpbmcyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0lmMlsnZGVmYXVsdCddKGluc3RhbmNlKTtcbiAgX2hlbHBlcnNMb2cyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0xvb2t1cDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7XG4gIF9oZWxwZXJzV2l0aDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIG1vdmVIZWxwZXJUb0hvb2tzKGluc3RhbmNlLCBoZWxwZXJOYW1lLCBrZWVwSGVscGVyKSB7XG4gIGlmIChpbnN0YW5jZS5oZWxwZXJzW2hlbHBlck5hbWVdKSB7XG4gICAgaW5zdGFuY2UuaG9va3NbaGVscGVyTmFtZV0gPSBpbnN0YW5jZS5oZWxwZXJzW2hlbHBlck5hbWVdO1xuICAgIGlmICgha2VlcEhlbHBlcikge1xuICAgICAgZGVsZXRlIGluc3RhbmNlLmhlbHBlcnNbaGVscGVyTmFtZV07XG4gICAgfVxuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyaGxiSEJsY25NdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08zbERRVUYxUXl4blEwRkJaME03T3pzN01rSkJRemxETEdkQ1FVRm5RanM3T3p0dlEwRkRVQ3d3UWtGQk1FSTdPenM3ZVVKQlEzSkRMR05CUVdNN096czdNRUpCUTJJc1pVRkJaVHM3T3pzMlFrRkRXaXhyUWtGQmEwSTdPenM3TWtKQlEzQkNMR2RDUVVGblFqczdPenRCUVVWc1F5eFRRVUZUTEhOQ1FVRnpRaXhEUVVGRExGRkJRVkVzUlVGQlJUdEJRVU12UXl4NVEwRkJNa0lzVVVGQlVTeERRVUZETEVOQlFVTTdRVUZEY2tNc01rSkJRV0VzVVVGQlVTeERRVUZETEVOQlFVTTdRVUZEZGtJc2IwTkJRWE5DTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTJoRExIbENRVUZYTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNKQ0xEQkNRVUZaTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNSQ0xEWkNRVUZsTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNwQ0xESkNRVUZoTEZGQlFWRXNRMEZCUXl4RFFVRkRPME5CUTNoQ096dEJRVVZOTEZOQlFWTXNhVUpCUVdsQ0xFTkJRVU1zVVVGQlVTeEZRVUZGTEZWQlFWVXNSVUZCUlN4VlFVRlZMRVZCUVVVN1FVRkRiRVVzVFVGQlNTeFJRVUZSTEVOQlFVTXNUMEZCVHl4RFFVRkRMRlZCUVZVc1EwRkJReXhGUVVGRk8wRkJRMmhETEZsQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1ZVRkJWU3hEUVVGRExFZEJRVWNzVVVGQlVTeERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRCUVVNeFJDeFJRVUZKTEVOQlFVTXNWVUZCVlN4RlFVRkZPMEZCUTJZc1lVRkJUeXhSUVVGUkxFTkJRVU1zVDBGQlR5eERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRPMHRCUTNKRE8wZEJRMFk3UTBGRFJpSXNJbVpwYkdVaU9pSm9aV3h3WlhKekxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSEpsWjJsemRHVnlRbXh2WTJ0SVpXeHdaWEpOYVhOemFXNW5JR1p5YjIwZ0p5NHZhR1ZzY0dWeWN5OWliRzlqYXkxb1pXeHdaWEl0YldsemMybHVaeWM3WEc1cGJYQnZjblFnY21WbmFYTjBaWEpGWVdOb0lHWnliMjBnSnk0dmFHVnNjR1Z5Y3k5bFlXTm9KenRjYm1sdGNHOXlkQ0J5WldkcGMzUmxja2hsYkhCbGNrMXBjM05wYm1jZ1puSnZiU0FuTGk5b1pXeHdaWEp6TDJobGJIQmxjaTF0YVhOemFXNW5KenRjYm1sdGNHOXlkQ0J5WldkcGMzUmxja2xtSUdaeWIyMGdKeTR2YUdWc2NHVnljeTlwWmljN1hHNXBiWEJ2Y25RZ2NtVm5hWE4wWlhKTWIyY2dabkp2YlNBbkxpOW9aV3h3WlhKekwyeHZaeWM3WEc1cGJYQnZjblFnY21WbmFYTjBaWEpNYjI5cmRYQWdabkp2YlNBbkxpOW9aV3h3WlhKekwyeHZiMnQxY0NjN1hHNXBiWEJ2Y25RZ2NtVm5hWE4wWlhKWGFYUm9JR1p5YjIwZ0p5NHZhR1ZzY0dWeWN5OTNhWFJvSnp0Y2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlISmxaMmx6ZEdWeVJHVm1ZWFZzZEVobGJIQmxjbk1vYVc1emRHRnVZMlVwSUh0Y2JpQWdjbVZuYVhOMFpYSkNiRzlqYTBobGJIQmxjazFwYzNOcGJtY29hVzV6ZEdGdVkyVXBPMXh1SUNCeVpXZHBjM1JsY2tWaFkyZ29hVzV6ZEdGdVkyVXBPMXh1SUNCeVpXZHBjM1JsY2tobGJIQmxjazFwYzNOcGJtY29hVzV6ZEdGdVkyVXBPMXh1SUNCeVpXZHBjM1JsY2tsbUtHbHVjM1JoYm1ObEtUdGNiaUFnY21WbmFYTjBaWEpNYjJjb2FXNXpkR0Z1WTJVcE8xeHVJQ0J5WldkcGMzUmxja3h2YjJ0MWNDaHBibk4wWVc1alpTazdYRzRnSUhKbFoybHpkR1Z5VjJsMGFDaHBibk4wWVc1alpTazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCdGIzWmxTR1ZzY0dWeVZHOUliMjlyY3locGJuTjBZVzVqWlN3Z2FHVnNjR1Z5VG1GdFpTd2dhMlZsY0VobGJIQmxjaWtnZTF4dUlDQnBaaUFvYVc1emRHRnVZMlV1YUdWc2NHVnljMXRvWld4d1pYSk9ZVzFsWFNrZ2UxeHVJQ0FnSUdsdWMzUmhibU5sTG1odmIydHpXMmhsYkhCbGNrNWhiV1ZkSUQwZ2FXNXpkR0Z1WTJVdWFHVnNjR1Z5YzF0b1pXeHdaWEpPWVcxbFhUdGNiaUFnSUNCcFppQW9JV3RsWlhCSVpXeHdaWElwSUh0Y2JpQWdJQ0FnSUdSbGJHVjBaU0JwYm5OMFlXNWpaUzVvWld4d1pYSnpXMmhsYkhCbGNrNWhiV1ZkTzF4dUlDQWdJSDFjYmlBZ2ZWeHVmVnh1SWwxOVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJEZWNvcmF0b3IoJ2lubGluZScsIGZ1bmN0aW9uIChmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIHZhciByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24gKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhcnRpYWxzIHN0YWNrIGZyYW1lIHByaW9yIHRvIGV4ZWMuXG4gICAgICAgIHZhciBvcmlnaW5hbCA9IGNvbnRhaW5lci5wYXJ0aWFscztcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gX3V0aWxzLmV4dGVuZCh7fSwgb3JpZ2luYWwsIHByb3BzLnBhcnRpYWxzKTtcbiAgICAgICAgdmFyIHJldCA9IGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcmlnaW5hbDtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJSbFkyOXlZWFJ2Y25NdmFXNXNhVzVsTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN096czdjVUpCUVhWQ0xGVkJRVlU3TzNGQ1FVVnNRaXhWUVVGVExGRkJRVkVzUlVGQlJUdEJRVU5vUXl4VlFVRlJMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNVVUZCVVN4RlFVRkZMRlZCUVZNc1JVRkJSU3hGUVVGRkxFdEJRVXNzUlVGQlJTeFRRVUZUTEVWQlFVVXNUMEZCVHl4RlFVRkZPMEZCUXpORkxGRkJRVWtzUjBGQlJ5eEhRVUZITEVWQlFVVXNRMEZCUXp0QlFVTmlMRkZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVVVGQlVTeEZRVUZGTzBGQlEyNUNMRmRCUVVzc1EwRkJReXhSUVVGUkxFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEzQkNMRk5CUVVjc1IwRkJSeXhWUVVGVExFOUJRVThzUlVGQlJTeFBRVUZQTEVWQlFVVTdPMEZCUlM5Q0xGbEJRVWtzVVVGQlVTeEhRVUZITEZOQlFWTXNRMEZCUXl4UlFVRlJMRU5CUVVNN1FVRkRiRU1zYVVKQlFWTXNRMEZCUXl4UlFVRlJMRWRCUVVjc1kwRkJUeXhGUVVGRkxFVkJRVVVzVVVGQlVTeEZRVUZGTEV0QlFVc3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRCUVVNeFJDeFpRVUZKTEVkQlFVY3NSMEZCUnl4RlFVRkZMRU5CUVVNc1QwRkJUeXhGUVVGRkxFOUJRVThzUTBGQlF5eERRVUZETzBGQlF5OUNMR2xDUVVGVExFTkJRVU1zVVVGQlVTeEhRVUZITEZGQlFWRXNRMEZCUXp0QlFVTTVRaXhsUVVGUExFZEJRVWNzUTBGQlF6dFBRVU5hTEVOQlFVTTdTMEZEU0RzN1FVRkZSQ3hUUVVGTExFTkJRVU1zVVVGQlVTeERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPenRCUVVVM1F5eFhRVUZQTEVkQlFVY3NRMEZCUXp0SFFVTmFMRU5CUVVNc1EwRkJRenREUVVOS0lpd2labWxzWlNJNkltbHViR2x1WlM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdJR1Y0ZEdWdVpDQjlJR1p5YjIwZ0p5NHVMM1YwYVd4ekp6dGNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdablZ1WTNScGIyNG9hVzV6ZEdGdVkyVXBJSHRjYmlBZ2FXNXpkR0Z1WTJVdWNtVm5hWE4wWlhKRVpXTnZjbUYwYjNJb0oybHViR2x1WlNjc0lHWjFibU4wYVc5dUtHWnVMQ0J3Y205d2N5d2dZMjl1ZEdGcGJtVnlMQ0J2Y0hScGIyNXpLU0I3WEc0Z0lDQWdiR1YwSUhKbGRDQTlJR1p1TzF4dUlDQWdJR2xtSUNnaGNISnZjSE11Y0dGeWRHbGhiSE1wSUh0Y2JpQWdJQ0FnSUhCeWIzQnpMbkJoY25ScFlXeHpJRDBnZTMwN1hHNGdJQ0FnSUNCeVpYUWdQU0JtZFc1amRHbHZiaWhqYjI1MFpYaDBMQ0J2Y0hScGIyNXpLU0I3WEc0Z0lDQWdJQ0FnSUM4dklFTnlaV0YwWlNCaElHNWxkeUJ3WVhKMGFXRnNjeUJ6ZEdGamF5Qm1jbUZ0WlNCd2NtbHZjaUIwYnlCbGVHVmpMbHh1SUNBZ0lDQWdJQ0JzWlhRZ2IzSnBaMmx1WVd3Z1BTQmpiMjUwWVdsdVpYSXVjR0Z5ZEdsaGJITTdYRzRnSUNBZ0lDQWdJR052Ym5SaGFXNWxjaTV3WVhKMGFXRnNjeUE5SUdWNGRHVnVaQ2g3ZlN3Z2IzSnBaMmx1WVd3c0lIQnliM0J6TG5CaGNuUnBZV3h6S1R0Y2JpQWdJQ0FnSUNBZ2JHVjBJSEpsZENBOUlHWnVLR052Ym5SbGVIUXNJRzl3ZEdsdmJuTXBPMXh1SUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1Y0dGeWRHbGhiSE1nUFNCdmNtbG5hVzVoYkR0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbGREdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NISnZjSE11Y0dGeWRHbGhiSE5iYjNCMGFXOXVjeTVoY21keld6QmRYU0E5SUc5d2RHbHZibk11Wm00N1hHNWNiaUFnSUNCeVpYUjFjbTRnY21WME8xeHVJQ0I5S1R0Y2JuMWNiaUpkZlE9PVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMgPSByZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzO1xuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2RlY29yYXRvcnNJbmxpbmUgPSByZXF1aXJlKCcuL2RlY29yYXRvcnMvaW5saW5lJyk7XG5cbnZhciBfZGVjb3JhdG9yc0lubGluZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWNvcmF0b3JzSW5saW5lKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICBfZGVjb3JhdG9yc0lubGluZTJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyUmxZMjl5WVhSdmNuTXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdaME5CUVRKQ0xIRkNRVUZ4UWpzN096dEJRVVY2UXl4VFFVRlRMSGxDUVVGNVFpeERRVUZETEZGQlFWRXNSVUZCUlR0QlFVTnNSQ3huUTBGQlpTeFJRVUZSTEVOQlFVTXNRMEZCUXp0RFFVTXhRaUlzSW1acGJHVWlPaUprWldOdmNtRjBiM0p6TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElISmxaMmx6ZEdWeVNXNXNhVzVsSUdaeWIyMGdKeTR2WkdWamIzSmhkRzl5Y3k5cGJteHBibVVuTzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2NtVm5hWE4wWlhKRVpXWmhkV3gwUkdWamIzSmhkRzl5Y3locGJuTjBZVzVqWlNrZ2UxeHVJQ0J5WldkcGMzUmxja2x1YkdsdVpTaHBibk4wWVc1alpTazdYRzU5WEc0aVhYMD1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgbG9nZ2VyID0ge1xuICBtZXRob2RNYXA6IFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ10sXG4gIGxldmVsOiAnaW5mbycsXG5cbiAgLy8gTWFwcyBhIGdpdmVuIGxldmVsIHZhbHVlIHRvIHRoZSBgbWV0aG9kTWFwYCBpbmRleGVzIGFib3ZlLlxuICBsb29rdXBMZXZlbDogZnVuY3Rpb24gbG9va3VwTGV2ZWwobGV2ZWwpIHtcbiAgICBpZiAodHlwZW9mIGxldmVsID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGxldmVsTWFwID0gX3V0aWxzLmluZGV4T2YobG9nZ2VyLm1ldGhvZE1hcCwgbGV2ZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICBpZiAobGV2ZWxNYXAgPj0gMCkge1xuICAgICAgICBsZXZlbCA9IGxldmVsTWFwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV2ZWwgPSBwYXJzZUludChsZXZlbCwgMTApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsZXZlbDtcbiAgfSxcblxuICAvLyBDYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudFxuICBsb2c6IGZ1bmN0aW9uIGxvZyhsZXZlbCkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIHZhciBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkge1xuICAgICAgICBtZXRob2QgPSAnbG9nJztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlW21ldGhvZF0uYXBwbHkoY29uc29sZSwgbWVzc2FnZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gbG9nZ2VyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyeHZaMmRsY2k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdPM0ZDUVVGM1FpeFRRVUZUT3p0QlFVVnFReXhKUVVGSkxFMUJRVTBzUjBGQlJ6dEJRVU5ZTEZkQlFWTXNSVUZCUlN4RFFVRkRMRTlCUVU4c1JVRkJSU3hOUVVGTkxFVkJRVVVzVFVGQlRTeEZRVUZGTEU5QlFVOHNRMEZCUXp0QlFVTTNReXhQUVVGTExFVkJRVVVzVFVGQlRUczdPMEZCUjJJc1lVRkJWeXhGUVVGRkxIRkNRVUZUTEV0QlFVc3NSVUZCUlR0QlFVTXpRaXhSUVVGSkxFOUJRVThzUzBGQlN5eExRVUZMTEZGQlFWRXNSVUZCUlR0QlFVTTNRaXhWUVVGSkxGRkJRVkVzUjBGQlJ5eGxRVUZSTEUxQlFVMHNRMEZCUXl4VFFVRlRMRVZCUVVVc1MwRkJTeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVOQlFVTTdRVUZET1VRc1ZVRkJTU3hSUVVGUkxFbEJRVWtzUTBGQlF5eEZRVUZGTzBGQlEycENMR0ZCUVVzc1IwRkJSeXhSUVVGUkxFTkJRVU03VDBGRGJFSXNUVUZCVFR0QlFVTk1MR0ZCUVVzc1IwRkJSeXhSUVVGUkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRPMDlCUXpkQ08wdEJRMFk3TzBGQlJVUXNWMEZCVHl4TFFVRkxMRU5CUVVNN1IwRkRaRHM3TzBGQlIwUXNTMEZCUnl4RlFVRkZMR0ZCUVZNc1MwRkJTeXhGUVVGak8wRkJReTlDTEZOQlFVc3NSMEZCUnl4TlFVRk5MRU5CUVVNc1YwRkJWeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZET3p0QlFVVnNReXhSUVVORkxFOUJRVThzVDBGQlR5eExRVUZMTEZkQlFWY3NTVUZET1VJc1RVRkJUU3hEUVVGRExGZEJRVmNzUTBGQlF5eE5RVUZOTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1MwRkJTeXhGUVVONlF6dEJRVU5CTEZWQlFVa3NUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdPMEZCUlhKRExGVkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVN1FVRkRjRUlzWTBGQlRTeEhRVUZITEV0QlFVc3NRMEZCUXp0UFFVTm9RanM3ZDBOQldHMUNMRTlCUVU4N1FVRkJVQ3hsUVVGUE96czdRVUZaTTBJc1lVRkJUeXhEUVVGRExFMUJRVTBzVDBGQlF5eERRVUZtTEU5QlFVOHNSVUZCV1N4UFFVRlBMRU5CUVVNc1EwRkJRenRMUVVNM1FqdEhRVU5HTzBOQlEwWXNRMEZCUXpzN2NVSkJSV0VzVFVGQlRTSXNJbVpwYkdVaU9pSnNiMmRuWlhJdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdleUJwYm1SbGVFOW1JSDBnWm5KdmJTQW5MaTkxZEdsc2N5YzdYRzVjYm14bGRDQnNiMmRuWlhJZ1BTQjdYRzRnSUcxbGRHaHZaRTFoY0RvZ1d5ZGtaV0oxWnljc0lDZHBibVp2Snl3Z0ozZGhjbTRuTENBblpYSnliM0luWFN4Y2JpQWdiR1YyWld3NklDZHBibVp2Snl4Y2JseHVJQ0F2THlCTllYQnpJR0VnWjJsMlpXNGdiR1YyWld3Z2RtRnNkV1VnZEc4Z2RHaGxJR0J0WlhSb2IyUk5ZWEJnSUdsdVpHVjRaWE1nWVdKdmRtVXVYRzRnSUd4dmIydDFjRXhsZG1Wc09pQm1kVzVqZEdsdmJpaHNaWFpsYkNrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2JHVjJaV3dnUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0lDQnNaWFFnYkdWMlpXeE5ZWEFnUFNCcGJtUmxlRTltS0d4dloyZGxjaTV0WlhSb2IyUk5ZWEFzSUd4bGRtVnNMblJ2VEc5M1pYSkRZWE5sS0NrcE8xeHVJQ0FnSUNBZ2FXWWdLR3hsZG1Wc1RXRndJRDQ5SURBcElIdGNiaUFnSUNBZ0lDQWdiR1YyWld3Z1BTQnNaWFpsYkUxaGNEdGNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lHeGxkbVZzSUQwZ2NHRnljMlZKYm5Rb2JHVjJaV3dzSURFd0tUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnYkdWMlpXdzdYRzRnSUgwc1hHNWNiaUFnTHk4Z1EyRnVJR0psSUc5MlpYSnlhV1JrWlc0Z2FXNGdkR2hsSUdodmMzUWdaVzUyYVhKdmJtMWxiblJjYmlBZ2JHOW5PaUJtZFc1amRHbHZiaWhzWlhabGJDd2dMaTR1YldWemMyRm5aU2tnZTF4dUlDQWdJR3hsZG1Wc0lEMGdiRzluWjJWeUxteHZiMnQxY0V4bGRtVnNLR3hsZG1Wc0tUdGNibHh1SUNBZ0lHbG1JQ2hjYmlBZ0lDQWdJSFI1Y0dWdlppQmpiMjV6YjJ4bElDRTlQU0FuZFc1a1pXWnBibVZrSnlBbUpseHVJQ0FnSUNBZ2JHOW5aMlZ5TG14dmIydDFjRXhsZG1Wc0tHeHZaMmRsY2k1c1pYWmxiQ2tnUEQwZ2JHVjJaV3hjYmlBZ0lDQXBJSHRjYmlBZ0lDQWdJR3hsZENCdFpYUm9iMlFnUFNCc2IyZG5aWEl1YldWMGFHOWtUV0Z3VzJ4bGRtVnNYVHRjYmlBZ0lDQWdJQzh2SUdWemJHbHVkQzFrYVhOaFlteGxMVzVsZUhRdGJHbHVaU0J1YnkxamIyNXpiMnhsWEc0Z0lDQWdJQ0JwWmlBb0lXTnZibk52YkdWYmJXVjBhRzlrWFNrZ2UxeHVJQ0FnSUNBZ0lDQnRaWFJvYjJRZ1BTQW5iRzluSnp0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdOdmJuTnZiR1ZiYldWMGFHOWtYU2d1TGk1dFpYTnpZV2RsS1RzZ0x5OGdaWE5zYVc1MExXUnBjMkZpYkdVdGJHbHVaU0J1YnkxamIyNXpiMnhsWEc0Z0lDQWdmVnh1SUNCOVhHNTlPMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JzYjJkblpYSTdYRzRpWFgwPVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmNyZWF0ZU5ld0xvb2t1cE9iamVjdCA9IGNyZWF0ZU5ld0xvb2t1cE9iamVjdDtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIFwibnVsbFwiLXByb3RvdHlwZSB0byBhdm9pZCB0cnV0aHkgcmVzdWx0cyBvbiBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqIFRoZSByZXN1bHRpbmcgb2JqZWN0IGNhbiBiZSB1c2VkIHdpdGggXCJvYmplY3RbcHJvcGVydHldXCIgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSBleGlzdHNcbiAqIEBwYXJhbSB7Li4ub2JqZWN0fSBzb3VyY2VzIGEgdmFyYXJncyBwYXJhbWV0ZXIgb2Ygc291cmNlIG9iamVjdHMgdGhhdCB3aWxsIGJlIG1lcmdlZFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVOZXdMb29rdXBPYmplY3QoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzb3VyY2VzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc291cmNlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBfdXRpbHMuZXh0ZW5kLmFwcGx5KHVuZGVmaW5lZCwgW09iamVjdC5jcmVhdGUobnVsbCldLmNvbmNhdChzb3VyY2VzKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmx1ZEdWeWJtRnNMMk55WldGMFpTMXVaWGN0Ykc5dmEzVndMVzlpYW1WamRDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPenM3T3p0eFFrRkJkVUlzVlVGQlZUczdPenM3T3pzN08wRkJVVEZDTEZOQlFWTXNjVUpCUVhGQ0xFZEJRV0U3YjBOQlFWUXNUMEZCVHp0QlFVRlFMRmRCUVU4N096dEJRVU01UXl4VFFVRlBMR2REUVVGUExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVVzc1QwRkJUeXhGUVVGRExFTkJRVU03UTBGRGFFUWlMQ0ptYVd4bElqb2lZM0psWVhSbExXNWxkeTFzYjI5cmRYQXRiMkpxWldOMExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHNnWlhoMFpXNWtJSDBnWm5KdmJTQW5MaTR2ZFhScGJITW5PMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaU0JoSUc1bGR5QnZZbXBsWTNRZ2QybDBhQ0JjSW01MWJHeGNJaTF3Y205MGIzUjVjR1VnZEc4Z1lYWnZhV1FnZEhKMWRHaDVJSEpsYzNWc2RITWdiMjRnY0hKdmRHOTBlWEJsSUhCeWIzQmxjblJwWlhNdVhHNGdLaUJVYUdVZ2NtVnpkV3gwYVc1bklHOWlhbVZqZENCallXNGdZbVVnZFhObFpDQjNhWFJvSUZ3aWIySnFaV04wVzNCeWIzQmxjblI1WFZ3aUlIUnZJR05vWldOcklHbG1JR0VnY0hKdmNHVnlkSGtnWlhocGMzUnpYRzRnS2lCQWNHRnlZVzBnZXk0dUxtOWlhbVZqZEgwZ2MyOTFjbU5sY3lCaElIWmhjbUZ5WjNNZ2NHRnlZVzFsZEdWeUlHOW1JSE52ZFhKalpTQnZZbXBsWTNSeklIUm9ZWFFnZDJsc2JDQmlaU0J0WlhKblpXUmNiaUFxSUVCeVpYUjFjbTV6SUh0dlltcGxZM1I5WEc0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmpjbVZoZEdWT1pYZE1iMjlyZFhCUFltcGxZM1FvTGk0dWMyOTFjbU5sY3lrZ2UxeHVJQ0J5WlhSMWNtNGdaWGgwWlc1a0tFOWlhbVZqZEM1amNtVmhkR1VvYm5Wc2JDa3NJQzR1TG5OdmRYSmpaWE1wTzF4dWZWeHVJbDE5XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY3JlYXRlUHJvdG9BY2Nlc3NDb250cm9sID0gY3JlYXRlUHJvdG9BY2Nlc3NDb250cm9sO1xuZXhwb3J0cy5yZXN1bHRJc0FsbG93ZWQgPSByZXN1bHRJc0FsbG93ZWQ7XG5leHBvcnRzLnJlc2V0TG9nZ2VkUHJvcGVydGllcyA9IHJlc2V0TG9nZ2VkUHJvcGVydGllcztcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9jcmVhdGVOZXdMb29rdXBPYmplY3QgPSByZXF1aXJlKCcuL2NyZWF0ZS1uZXctbG9va3VwLW9iamVjdCcpO1xuXG52YXIgX2xvZ2dlciA9IHJlcXVpcmUoJy4uL2xvZ2dlcicpO1xuXG52YXIgX2xvZ2dlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sb2dnZXIpO1xuXG52YXIgbG9nZ2VkUHJvcGVydGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3RvQWNjZXNzQ29udHJvbChydW50aW1lT3B0aW9ucykge1xuICB2YXIgZGVmYXVsdE1ldGhvZFdoaXRlTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGRlZmF1bHRNZXRob2RXaGl0ZUxpc3RbJ2NvbnN0cnVjdG9yJ10gPSBmYWxzZTtcbiAgZGVmYXVsdE1ldGhvZFdoaXRlTGlzdFsnX19kZWZpbmVHZXR0ZXJfXyddID0gZmFsc2U7XG4gIGRlZmF1bHRNZXRob2RXaGl0ZUxpc3RbJ19fZGVmaW5lU2V0dGVyX18nXSA9IGZhbHNlO1xuICBkZWZhdWx0TWV0aG9kV2hpdGVMaXN0WydfX2xvb2t1cEdldHRlcl9fJ10gPSBmYWxzZTtcblxuICB2YXIgZGVmYXVsdFByb3BlcnR5V2hpdGVMaXN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvXG4gIGRlZmF1bHRQcm9wZXJ0eVdoaXRlTGlzdFsnX19wcm90b19fJ10gPSBmYWxzZTtcblxuICByZXR1cm4ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHdoaXRlbGlzdDogX2NyZWF0ZU5ld0xvb2t1cE9iamVjdC5jcmVhdGVOZXdMb29rdXBPYmplY3QoZGVmYXVsdFByb3BlcnR5V2hpdGVMaXN0LCBydW50aW1lT3B0aW9ucy5hbGxvd2VkUHJvdG9Qcm9wZXJ0aWVzKSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogcnVudGltZU9wdGlvbnMuYWxsb3dQcm90b1Byb3BlcnRpZXNCeURlZmF1bHRcbiAgICB9LFxuICAgIG1ldGhvZHM6IHtcbiAgICAgIHdoaXRlbGlzdDogX2NyZWF0ZU5ld0xvb2t1cE9iamVjdC5jcmVhdGVOZXdMb29rdXBPYmplY3QoZGVmYXVsdE1ldGhvZFdoaXRlTGlzdCwgcnVudGltZU9wdGlvbnMuYWxsb3dlZFByb3RvTWV0aG9kcyksXG4gICAgICBkZWZhdWx0VmFsdWU6IHJ1bnRpbWVPcHRpb25zLmFsbG93UHJvdG9NZXRob2RzQnlEZWZhdWx0XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXN1bHRJc0FsbG93ZWQocmVzdWx0LCBwcm90b0FjY2Vzc0NvbnRyb2wsIHByb3BlcnR5TmFtZSkge1xuICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBjaGVja1doaXRlTGlzdChwcm90b0FjY2Vzc0NvbnRyb2wubWV0aG9kcywgcHJvcGVydHlOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2hlY2tXaGl0ZUxpc3QocHJvdG9BY2Nlc3NDb250cm9sLnByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tXaGl0ZUxpc3QocHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZSwgcHJvcGVydHlOYW1lKSB7XG4gIGlmIChwcm90b0FjY2Vzc0NvbnRyb2xGb3JUeXBlLndoaXRlbGlzdFtwcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZS53aGl0ZWxpc3RbcHJvcGVydHlOYW1lXSA9PT0gdHJ1ZTtcbiAgfVxuICBpZiAocHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwcm90b0FjY2Vzc0NvbnRyb2xGb3JUeXBlLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICBsb2dVbmV4cGVjZWRQcm9wZXJ0eUFjY2Vzc09uY2UocHJvcGVydHlOYW1lKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsb2dVbmV4cGVjZWRQcm9wZXJ0eUFjY2Vzc09uY2UocHJvcGVydHlOYW1lKSB7XG4gIGlmIChsb2dnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gIT09IHRydWUpIHtcbiAgICBsb2dnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuICAgIF9sb2dnZXIyWydkZWZhdWx0J10ubG9nKCdlcnJvcicsICdIYW5kbGViYXJzOiBBY2Nlc3MgaGFzIGJlZW4gZGVuaWVkIHRvIHJlc29sdmUgdGhlIHByb3BlcnR5IFwiJyArIHByb3BlcnR5TmFtZSArICdcIiBiZWNhdXNlIGl0IGlzIG5vdCBhbiBcIm93biBwcm9wZXJ0eVwiIG9mIGl0cyBwYXJlbnQuXFxuJyArICdZb3UgY2FuIGFkZCBhIHJ1bnRpbWUgb3B0aW9uIHRvIGRpc2FibGUgdGhlIGNoZWNrIG9yIHRoaXMgd2FybmluZzpcXG4nICsgJ1NlZSBodHRwczovL2hhbmRsZWJhcnNqcy5jb20vYXBpLXJlZmVyZW5jZS9ydW50aW1lLW9wdGlvbnMuaHRtbCNvcHRpb25zLXRvLWNvbnRyb2wtcHJvdG90eXBlLWFjY2VzcyBmb3IgZGV0YWlscycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TG9nZ2VkUHJvcGVydGllcygpIHtcbiAgT2JqZWN0LmtleXMobG9nZ2VkUHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgZGVsZXRlIGxvZ2dlZFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmx1ZEdWeWJtRnNMM0J5YjNSdkxXRmpZMlZ6Y3k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3T3pzN08zRkRRVUZ6UXl3MFFrRkJORUk3TzNOQ1FVTXZReXhYUVVGWE96czdPMEZCUlRsQ0xFbEJRVTBzWjBKQlFXZENMRWRCUVVjc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXpzN1FVRkZkRU1zVTBGQlV5eDNRa0ZCZDBJc1EwRkJReXhqUVVGakxFVkJRVVU3UVVGRGRrUXNUVUZCU1N4elFrRkJjMElzUjBGQlJ5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRMnBFTEhkQ1FVRnpRaXhEUVVGRExHRkJRV0VzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTTVReXgzUWtGQmMwSXNRMEZCUXl4clFrRkJhMElzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTnVSQ3gzUWtGQmMwSXNRMEZCUXl4clFrRkJhMElzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTnVSQ3gzUWtGQmMwSXNRMEZCUXl4clFrRkJhMElzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXpzN1FVRkZia1FzVFVGQlNTeDNRa0ZCZDBJc1IwRkJSeXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPenRCUVVWdVJDd3dRa0ZCZDBJc1EwRkJReXhYUVVGWExFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTTdPMEZCUlRsRExGTkJRVTg3UVVGRFRDeGpRVUZWTEVWQlFVVTdRVUZEVml4bFFVRlRMRVZCUVVVc05rTkJRMVFzZDBKQlFYZENMRVZCUTNoQ0xHTkJRV01zUTBGQlF5eHpRa0ZCYzBJc1EwRkRkRU03UVVGRFJDeHJRa0ZCV1N4RlFVRkZMR05CUVdNc1EwRkJReXcyUWtGQk5rSTdTMEZETTBRN1FVRkRSQ3hYUVVGUExFVkJRVVU3UVVGRFVDeGxRVUZUTEVWQlFVVXNOa05CUTFRc2MwSkJRWE5DTEVWQlEzUkNMR05CUVdNc1EwRkJReXh0UWtGQmJVSXNRMEZEYmtNN1FVRkRSQ3hyUWtGQldTeEZRVUZGTEdOQlFXTXNRMEZCUXl3d1FrRkJNRUk3UzBGRGVFUTdSMEZEUml4RFFVRkRPME5CUTBnN08wRkJSVTBzVTBGQlV5eGxRVUZsTEVOQlFVTXNUVUZCVFN4RlFVRkZMR3RDUVVGclFpeEZRVUZGTEZsQlFWa3NSVUZCUlR0QlFVTjRSU3hOUVVGSkxFOUJRVThzVFVGQlRTeExRVUZMTEZWQlFWVXNSVUZCUlR0QlFVTm9ReXhYUVVGUExHTkJRV01zUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhQUVVGUExFVkJRVVVzV1VGQldTeERRVUZETEVOQlFVTTdSMEZEYWtVc1RVRkJUVHRCUVVOTUxGZEJRVThzWTBGQll5eERRVUZETEd0Q1FVRnJRaXhEUVVGRExGVkJRVlVzUlVGQlJTeFpRVUZaTEVOQlFVTXNRMEZCUXp0SFFVTndSVHREUVVOR096dEJRVVZFTEZOQlFWTXNZMEZCWXl4RFFVRkRMSGxDUVVGNVFpeEZRVUZGTEZsQlFWa3NSVUZCUlR0QlFVTXZSQ3hOUVVGSkxIbENRVUY1UWl4RFFVRkRMRk5CUVZNc1EwRkJReXhaUVVGWkxFTkJRVU1zUzBGQlN5eFRRVUZUTEVWQlFVVTdRVUZEYmtVc1YwRkJUeXg1UWtGQmVVSXNRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hEUVVGRExFdEJRVXNzU1VGQlNTeERRVUZETzBkQlEyNUZPMEZCUTBRc1RVRkJTU3g1UWtGQmVVSXNRMEZCUXl4WlFVRlpMRXRCUVVzc1UwRkJVeXhGUVVGRk8wRkJRM2hFTEZkQlFVOHNlVUpCUVhsQ0xFTkJRVU1zV1VGQldTeERRVUZETzBkQlF5OURPMEZCUTBRc1owTkJRVGhDTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1FVRkROME1zVTBGQlR5eExRVUZMTEVOQlFVTTdRMEZEWkRzN1FVRkZSQ3hUUVVGVExEaENRVUU0UWl4RFFVRkRMRmxCUVZrc1JVRkJSVHRCUVVOd1JDeE5RVUZKTEdkQ1FVRm5RaXhEUVVGRExGbEJRVmtzUTBGQlF5eExRVUZMTEVsQlFVa3NSVUZCUlR0QlFVTXpReXh2UWtGQlowSXNRMEZCUXl4WlFVRlpMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU03UVVGRGRFTXNkMEpCUVU4c1IwRkJSeXhEUVVOU0xFOUJRVThzUlVGRFVDeHBSVUZCSzBRc1dVRkJXU3h2U1VGRFNDeHZTRUZETWtNc1EwRkRjRWdzUTBGQlF6dEhRVU5JTzBOQlEwWTdPMEZCUlUwc1UwRkJVeXh4UWtGQmNVSXNSMEZCUnp0QlFVTjBReXhSUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZETEZWQlFVRXNXVUZCV1N4RlFVRkpPMEZCUTNCRUxGZEJRVThzWjBKQlFXZENMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03UjBGRGRrTXNRMEZCUXl4RFFVRkRPME5CUTBvaUxDSm1hV3hsSWpvaWNISnZkRzh0WVdOalpYTnpMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUhzZ1kzSmxZWFJsVG1WM1RHOXZhM1Z3VDJKcVpXTjBJSDBnWm5KdmJTQW5MaTlqY21WaGRHVXRibVYzTFd4dmIydDFjQzF2WW1wbFkzUW5PMXh1YVcxd2IzSjBJR3h2WjJkbGNpQm1jbTl0SUNjdUxpOXNiMmRuWlhJbk8xeHVYRzVqYjI1emRDQnNiMmRuWldSUWNtOXdaWEowYVdWeklEMGdUMkpxWldOMExtTnlaV0YwWlNodWRXeHNLVHRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdOeVpXRjBaVkJ5YjNSdlFXTmpaWE56UTI5dWRISnZiQ2h5ZFc1MGFXMWxUM0IwYVc5dWN5a2dlMXh1SUNCc1pYUWdaR1ZtWVhWc2RFMWxkR2h2WkZkb2FYUmxUR2x6ZENBOUlFOWlhbVZqZEM1amNtVmhkR1VvYm5Wc2JDazdYRzRnSUdSbFptRjFiSFJOWlhSb2IyUlhhR2wwWlV4cGMzUmJKMk52Ym5OMGNuVmpkRzl5SjEwZ1BTQm1ZV3h6WlR0Y2JpQWdaR1ZtWVhWc2RFMWxkR2h2WkZkb2FYUmxUR2x6ZEZzblgxOWtaV1pwYm1WSFpYUjBaWEpmWHlkZElEMGdabUZzYzJVN1hHNGdJR1JsWm1GMWJIUk5aWFJvYjJSWGFHbDBaVXhwYzNSYkoxOWZaR1ZtYVc1bFUyVjBkR1Z5WDE4blhTQTlJR1poYkhObE8xeHVJQ0JrWldaaGRXeDBUV1YwYUc5a1YyaHBkR1ZNYVhOMFd5ZGZYMnh2YjJ0MWNFZGxkSFJsY2w5ZkoxMGdQU0JtWVd4elpUdGNibHh1SUNCc1pYUWdaR1ZtWVhWc2RGQnliM0JsY25SNVYyaHBkR1ZNYVhOMElEMGdUMkpxWldOMExtTnlaV0YwWlNodWRXeHNLVHRjYmlBZ0x5OGdaWE5zYVc1MExXUnBjMkZpYkdVdGJtVjRkQzFzYVc1bElHNXZMWEJ5YjNSdlhHNGdJR1JsWm1GMWJIUlFjbTl3WlhKMGVWZG9hWFJsVEdsemRGc25YMTl3Y205MGIxOWZKMTBnUFNCbVlXeHpaVHRjYmx4dUlDQnlaWFIxY200Z2UxeHVJQ0FnSUhCeWIzQmxjblJwWlhNNklIdGNiaUFnSUNBZ0lIZG9hWFJsYkdsemREb2dZM0psWVhSbFRtVjNURzl2YTNWd1QySnFaV04wS0Z4dUlDQWdJQ0FnSUNCa1pXWmhkV3gwVUhKdmNHVnlkSGxYYUdsMFpVeHBjM1FzWEc0Z0lDQWdJQ0FnSUhKMWJuUnBiV1ZQY0hScGIyNXpMbUZzYkc5M1pXUlFjbTkwYjFCeWIzQmxjblJwWlhOY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCa1pXWmhkV3gwVm1Gc2RXVTZJSEoxYm5ScGJXVlBjSFJwYjI1ekxtRnNiRzkzVUhKdmRHOVFjbTl3WlhKMGFXVnpRbmxFWldaaGRXeDBYRzRnSUNBZ2ZTeGNiaUFnSUNCdFpYUm9iMlJ6T2lCN1hHNGdJQ0FnSUNCM2FHbDBaV3hwYzNRNklHTnlaV0YwWlU1bGQweHZiMnQxY0U5aWFtVmpkQ2hjYmlBZ0lDQWdJQ0FnWkdWbVlYVnNkRTFsZEdodlpGZG9hWFJsVEdsemRDeGNiaUFnSUNBZ0lDQWdjblZ1ZEdsdFpVOXdkR2x2Ym5NdVlXeHNiM2RsWkZCeWIzUnZUV1YwYUc5a2MxeHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHUmxabUYxYkhSV1lXeDFaVG9nY25WdWRHbHRaVTl3ZEdsdmJuTXVZV3hzYjNkUWNtOTBiMDFsZEdodlpITkNlVVJsWm1GMWJIUmNiaUFnSUNCOVhHNGdJSDA3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnlaWE4xYkhSSmMwRnNiRzkzWldRb2NtVnpkV3gwTENCd2NtOTBiMEZqWTJWemMwTnZiblJ5YjJ3c0lIQnliM0JsY25SNVRtRnRaU2tnZTF4dUlDQnBaaUFvZEhsd1pXOW1JSEpsYzNWc2RDQTlQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJqYUdWamExZG9hWFJsVEdsemRDaHdjbTkwYjBGalkyVnpjME52Ym5SeWIyd3ViV1YwYUc5a2N5d2djSEp2Y0dWeWRIbE9ZVzFsS1R0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCeVpYUjFjbTRnWTJobFkydFhhR2wwWlV4cGMzUW9jSEp2ZEc5QlkyTmxjM05EYjI1MGNtOXNMbkJ5YjNCbGNuUnBaWE1zSUhCeWIzQmxjblI1VG1GdFpTazdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJobFkydFhhR2wwWlV4cGMzUW9jSEp2ZEc5QlkyTmxjM05EYjI1MGNtOXNSbTl5Vkhsd1pTd2djSEp2Y0dWeWRIbE9ZVzFsS1NCN1hHNGdJR2xtSUNod2NtOTBiMEZqWTJWemMwTnZiblJ5YjJ4R2IzSlVlWEJsTG5kb2FYUmxiR2x6ZEZ0d2NtOXdaWEowZVU1aGJXVmRJQ0U5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNCeVpYUjFjbTRnY0hKdmRHOUJZMk5sYzNORGIyNTBjbTlzUm05eVZIbHdaUzUzYUdsMFpXeHBjM1JiY0hKdmNHVnlkSGxPWVcxbFhTQTlQVDBnZEhKMVpUdGNiaUFnZlZ4dUlDQnBaaUFvY0hKdmRHOUJZMk5sYzNORGIyNTBjbTlzUm05eVZIbHdaUzVrWldaaGRXeDBWbUZzZFdVZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQndjbTkwYjBGalkyVnpjME52Ym5SeWIyeEdiM0pVZVhCbExtUmxabUYxYkhSV1lXeDFaVHRjYmlBZ2ZWeHVJQ0JzYjJkVmJtVjRjR1ZqWldSUWNtOXdaWEowZVVGalkyVnpjMDl1WTJVb2NISnZjR1Z5ZEhsT1lXMWxLVHRjYmlBZ2NtVjBkWEp1SUdaaGJITmxPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnNiMmRWYm1WNGNHVmpaV1JRY205d1pYSjBlVUZqWTJWemMwOXVZMlVvY0hKdmNHVnlkSGxPWVcxbEtTQjdYRzRnSUdsbUlDaHNiMmRuWldSUWNtOXdaWEowYVdWelczQnliM0JsY25SNVRtRnRaVjBnSVQwOUlIUnlkV1VwSUh0Y2JpQWdJQ0JzYjJkblpXUlFjbTl3WlhKMGFXVnpXM0J5YjNCbGNuUjVUbUZ0WlYwZ1BTQjBjblZsTzF4dUlDQWdJR3h2WjJkbGNpNXNiMmNvWEc0Z0lDQWdJQ0FuWlhKeWIzSW5MRnh1SUNBZ0lDQWdZRWhoYm1Sc1pXSmhjbk02SUVGalkyVnpjeUJvWVhNZ1ltVmxiaUJrWlc1cFpXUWdkRzhnY21WemIyeDJaU0IwYUdVZ2NISnZjR1Z5ZEhrZ1hDSWtlM0J5YjNCbGNuUjVUbUZ0WlgxY0lpQmlaV05oZFhObElHbDBJR2x6SUc1dmRDQmhiaUJjSW05M2JpQndjbTl3WlhKMGVWd2lJRzltSUdsMGN5QndZWEpsYm5RdVhGeHVZQ0FyWEc0Z0lDQWdJQ0FnSUdCWmIzVWdZMkZ1SUdGa1pDQmhJSEoxYm5ScGJXVWdiM0IwYVc5dUlIUnZJR1JwYzJGaWJHVWdkR2hsSUdOb1pXTnJJRzl5SUhSb2FYTWdkMkZ5Ym1sdVp6cGNYRzVnSUN0Y2JpQWdJQ0FnSUNBZ1lGTmxaU0JvZEhSd2N6b3ZMMmhoYm1Sc1pXSmhjbk5xY3k1amIyMHZZWEJwTFhKbFptVnlaVzVqWlM5eWRXNTBhVzFsTFc5d2RHbHZibk11YUhSdGJDTnZjSFJwYjI1ekxYUnZMV052Ym5SeWIyd3RjSEp2ZEc5MGVYQmxMV0ZqWTJWemN5Qm1iM0lnWkdWMFlXbHNjMkJjYmlBZ0lDQXBPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ5WlhObGRFeHZaMmRsWkZCeWIzQmxjblJwWlhNb0tTQjdYRzRnSUU5aWFtVmpkQzVyWlhsektHeHZaMmRsWkZCeWIzQmxjblJwWlhNcExtWnZja1ZoWTJnb2NISnZjR1Z5ZEhsT1lXMWxJRDArSUh0Y2JpQWdJQ0JrWld4bGRHVWdiRzluWjJWa1VISnZjR1Z5ZEdsbGMxdHdjbTl3WlhKMGVVNWhiV1ZkTzF4dUlDQjlLVHRjYm4xY2JpSmRmUT09XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuSGFuZGxlYmFyc0Vudmlyb25tZW50ID0gSGFuZGxlYmFyc0Vudmlyb25tZW50O1xuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgX2V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7XG5cbnZhciBfaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xuXG52YXIgX2RlY29yYXRvcnMgPSByZXF1aXJlKCcuL2RlY29yYXRvcnMnKTtcblxudmFyIF9sb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcicpO1xuXG52YXIgX2xvZ2dlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sb2dnZXIpO1xuXG52YXIgX2ludGVybmFsUHJvdG9BY2Nlc3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3Byb3RvLWFjY2VzcycpO1xuXG52YXIgVkVSU0lPTiA9ICc0LjcuOCc7XG5leHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OO1xudmFyIENPTVBJTEVSX1JFVklTSU9OID0gODtcbmV4cG9ydHMuQ09NUElMRVJfUkVWSVNJT04gPSBDT01QSUxFUl9SRVZJU0lPTjtcbnZhciBMQVNUX0NPTVBBVElCTEVfQ09NUElMRVJfUkVWSVNJT04gPSA3O1xuXG5leHBvcnRzLkxBU1RfQ09NUEFUSUJMRV9DT01QSUxFUl9SRVZJU0lPTiA9IExBU1RfQ09NUEFUSUJMRV9DT01QSUxFUl9SRVZJU0lPTjtcbnZhciBSRVZJU0lPTl9DSEFOR0VTID0ge1xuICAxOiAnPD0gMS4wLnJjLjInLCAvLyAxLjAucmMuMiBpcyBhY3R1YWxseSByZXYyIGJ1dCBkb2Vzbid0IHJlcG9ydCBpdFxuICAyOiAnPT0gMS4wLjAtcmMuMycsXG4gIDM6ICc9PSAxLjAuMC1yYy40JyxcbiAgNDogJz09IDEueC54JyxcbiAgNTogJz09IDIuMC4wLWFscGhhLngnLFxuICA2OiAnPj0gMi4wLjAtYmV0YS4xJyxcbiAgNzogJz49IDQuMC4wIDw0LjMuMCcsXG4gIDg6ICc+PSA0LjMuMCdcbn07XG5cbmV4cG9ydHMuUkVWSVNJT05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5HRVM7XG52YXIgb2JqZWN0VHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG5mdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBfbG9nZ2VyMlsnZGVmYXVsdCddLFxuICBsb2c6IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nLFxuXG4gIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikge1xuICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTtcbiAgICAgIH1cbiAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gcmVnaXN0ZXJQYXJ0aWFsKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAoX3V0aWxzLnRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIF91dGlscy5leHRlbmQodGhpcy5wYXJ0aWFscywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydGlhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0F0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIicgKyBuYW1lICsgJ1wiIGFzIHVuZGVmaW5lZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbiByZWdpc3RlckRlY29yYXRvcihuYW1lLCBmbikge1xuICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGRlY29yYXRvcnMnKTtcbiAgICAgIH1cbiAgICAgIF91dGlscy5leHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbiB1bnJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5kZWNvcmF0b3JzW25hbWVdO1xuICB9LFxuICAvKipcbiAgICogUmVzZXQgdGhlIG1lbW9yeSBvZiBpbGxlZ2FsIHByb3BlcnR5IGFjY2Vzc2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9nZ2VkLlxuICAgKiBAZGVwcmVjYXRlZCBzaG91bGQgb25seSBiZSB1c2VkIGluIGhhbmRsZWJhcnMgdGVzdC1jYXNlc1xuICAgKi9cbiAgcmVzZXRMb2dnZWRQcm9wZXJ0eUFjY2Vzc2VzOiBmdW5jdGlvbiByZXNldExvZ2dlZFByb3BlcnR5QWNjZXNzZXMoKSB7XG4gICAgX2ludGVybmFsUHJvdG9BY2Nlc3MucmVzZXRMb2dnZWRQcm9wZXJ0aWVzKCk7XG4gIH1cbn07XG5cbnZhciBsb2cgPSBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZztcblxuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmNyZWF0ZUZyYW1lID0gX3V0aWxzLmNyZWF0ZUZyYW1lO1xuZXhwb3J0cy5sb2dnZXIgPSBfbG9nZ2VyMlsnZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMkpoYzJVdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN2NVSkJRVGhETEZOQlFWTTdPM2xDUVVOcVF5eGhRVUZoT3pzN08zVkNRVU5KTEZkQlFWYzdPekJDUVVOU0xHTkJRV003TzNOQ1FVTnlReXhWUVVGVk96czdPMjFEUVVOVExIbENRVUY1UWpzN1FVRkZlRVFzU1VGQlRTeFBRVUZQTEVkQlFVY3NUMEZCVHl4RFFVRkRPenRCUVVONFFpeEpRVUZOTEdsQ1FVRnBRaXhIUVVGSExFTkJRVU1zUTBGQlF6czdRVUZETlVJc1NVRkJUU3hwUTBGQmFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN096dEJRVVUxUXl4SlFVRk5MR2RDUVVGblFpeEhRVUZITzBGQlF6bENMRWRCUVVNc1JVRkJSU3hoUVVGaE8wRkJRMmhDTEVkQlFVTXNSVUZCUlN4bFFVRmxPMEZCUTJ4Q0xFZEJRVU1zUlVGQlJTeGxRVUZsTzBGQlEyeENMRWRCUVVNc1JVRkJSU3hWUVVGVk8wRkJRMklzUjBGQlF5eEZRVUZGTEd0Q1FVRnJRanRCUVVOeVFpeEhRVUZETEVWQlFVVXNhVUpCUVdsQ08wRkJRM0JDTEVkQlFVTXNSVUZCUlN4cFFrRkJhVUk3UVVGRGNFSXNSMEZCUXl4RlFVRkZMRlZCUVZVN1EwRkRaQ3hEUVVGRE96czdRVUZGUml4SlFVRk5MRlZCUVZVc1IwRkJSeXhwUWtGQmFVSXNRMEZCUXpzN1FVRkZPVUlzVTBGQlV5eHhRa0ZCY1VJc1EwRkJReXhQUVVGUExFVkJRVVVzVVVGQlVTeEZRVUZGTEZWQlFWVXNSVUZCUlR0QlFVTnVSU3hOUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEU5QlFVOHNTVUZCU1N4RlFVRkZMRU5CUVVNN1FVRkROMElzVFVGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4UlFVRlJMRWxCUVVrc1JVRkJSU3hEUVVGRE8wRkJReTlDTEUxQlFVa3NRMEZCUXl4VlFVRlZMRWRCUVVjc1ZVRkJWU3hKUVVGSkxFVkJRVVVzUTBGQlF6czdRVUZGYmtNc2EwTkJRWFZDTEVsQlFVa3NRMEZCUXl4RFFVRkRPMEZCUXpkQ0xIZERRVUV3UWl4SlFVRkpMRU5CUVVNc1EwRkJRenREUVVOcVF6czdRVUZGUkN4eFFrRkJjVUlzUTBGQlF5eFRRVUZUTEVkQlFVYzdRVUZEYUVNc1lVRkJWeXhGUVVGRkxIRkNRVUZ4UWpzN1FVRkZiRU1zVVVGQlRTeHhRa0ZCVVR0QlFVTmtMRXRCUVVjc1JVRkJSU3h2UWtGQlR5eEhRVUZIT3p0QlFVVm1MR2RDUVVGakxFVkJRVVVzZDBKQlFWTXNTVUZCU1N4RlFVRkZMRVZCUVVVc1JVRkJSVHRCUVVOcVF5eFJRVUZKTEdkQ1FVRlRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eFZRVUZWTEVWQlFVVTdRVUZEZEVNc1ZVRkJTU3hGUVVGRkxFVkJRVVU3UVVGRFRpeGpRVUZOTERKQ1FVRmpMSGxEUVVGNVF5eERRVUZETEVOQlFVTTdUMEZEYUVVN1FVRkRSQ3h2UWtGQlR5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8wdEJRelZDTEUxQlFVMDdRVUZEVEN4VlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0TFFVTjZRanRIUVVOR08wRkJRMFFzYTBKQlFXZENMRVZCUVVVc01FSkJRVk1zU1VGQlNTeEZRVUZGTzBGQlF5OUNMRmRCUVU4c1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0SFFVTXpRanM3UVVGRlJDeHBRa0ZCWlN4RlFVRkZMSGxDUVVGVExFbEJRVWtzUlVGQlJTeFBRVUZQTEVWQlFVVTdRVUZEZGtNc1VVRkJTU3huUWtGQlV5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1ZVRkJWU3hGUVVGRk8wRkJRM1JETEc5Q1FVRlBMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdTMEZETjBJc1RVRkJUVHRCUVVOTUxGVkJRVWtzVDBGQlR5eFBRVUZQTEV0QlFVc3NWMEZCVnl4RlFVRkZPMEZCUTJ4RExHTkJRVTBzZVVWQlEzZERMRWxCUVVrc2IwSkJRMnBFTEVOQlFVTTdUMEZEU0R0QlFVTkVMRlZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NUMEZCVHl4RFFVRkRPMHRCUXk5Q08wZEJRMFk3UVVGRFJDeHRRa0ZCYVVJc1JVRkJSU3d5UWtGQlV5eEpRVUZKTEVWQlFVVTdRVUZEYUVNc1YwRkJUeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMGRCUXpWQ096dEJRVVZFTEcxQ1FVRnBRaXhGUVVGRkxESkNRVUZUTEVsQlFVa3NSVUZCUlN4RlFVRkZMRVZCUVVVN1FVRkRjRU1zVVVGQlNTeG5Ra0ZCVXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzVlVGQlZTeEZRVUZGTzBGQlEzUkRMRlZCUVVrc1JVRkJSU3hGUVVGRk8wRkJRMDRzWTBGQlRTd3lRa0ZCWXl3MFEwRkJORU1zUTBGQlF5eERRVUZETzA5QlEyNUZPMEZCUTBRc2IwSkJRVThzU1VGQlNTeERRVUZETEZWQlFWVXNSVUZCUlN4SlFVRkpMRU5CUVVNc1EwRkJRenRMUVVNdlFpeE5RVUZOTzBGQlEwd3NWVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdTMEZETlVJN1IwRkRSanRCUVVORUxIRkNRVUZ0UWl4RlFVRkZMRFpDUVVGVExFbEJRVWtzUlVGQlJUdEJRVU5zUXl4WFFVRlBMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdSMEZET1VJN096czdPMEZCUzBRc05rSkJRVEpDTEVWQlFVRXNkVU5CUVVjN1FVRkROVUlzWjBSQlFYVkNMRU5CUVVNN1IwRkRla0k3UTBGRFJpeERRVUZET3p0QlFVVkxMRWxCUVVrc1IwRkJSeXhIUVVGSExHOUNRVUZQTEVkQlFVY3NRMEZCUXpzN08xRkJSVzVDTEZkQlFWYzdVVUZCUlN4TlFVRk5JaXdpWm1sc1pTSTZJbUpoYzJVdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdleUJqY21WaGRHVkdjbUZ0WlN3Z1pYaDBaVzVrTENCMGIxTjBjbWx1WnlCOUlHWnliMjBnSnk0dmRYUnBiSE1uTzF4dWFXMXdiM0owSUVWNFkyVndkR2x2YmlCbWNtOXRJQ2N1TDJWNFkyVndkR2x2YmljN1hHNXBiWEJ2Y25RZ2V5QnlaV2RwYzNSbGNrUmxabUYxYkhSSVpXeHdaWEp6SUgwZ1puSnZiU0FuTGk5b1pXeHdaWEp6Snp0Y2JtbHRjRzl5ZENCN0lISmxaMmx6ZEdWeVJHVm1ZWFZzZEVSbFkyOXlZWFJ2Y25NZ2ZTQm1jbTl0SUNjdUwyUmxZMjl5WVhSdmNuTW5PMXh1YVcxd2IzSjBJR3h2WjJkbGNpQm1jbTl0SUNjdUwyeHZaMmRsY2ljN1hHNXBiWEJ2Y25RZ2V5QnlaWE5sZEV4dloyZGxaRkJ5YjNCbGNuUnBaWE1nZlNCbWNtOXRJQ2N1TDJsdWRHVnlibUZzTDNCeWIzUnZMV0ZqWTJWemN5YzdYRzVjYm1WNGNHOXlkQ0JqYjI1emRDQldSVkpUU1U5T0lEMGdKelF1Tnk0NEp6dGNibVY0Y0c5eWRDQmpiMjV6ZENCRFQwMVFTVXhGVWw5U1JWWkpVMGxQVGlBOUlEZzdYRzVsZUhCdmNuUWdZMjl1YzNRZ1RFRlRWRjlEVDAxUVFWUkpRa3hGWDBOUFRWQkpURVZTWDFKRlZrbFRTVTlPSUQwZ056dGNibHh1Wlhod2IzSjBJR052Ym5OMElGSkZWa2xUU1U5T1gwTklRVTVIUlZNZ1BTQjdYRzRnSURFNklDYzhQU0F4TGpBdWNtTXVNaWNzSUM4dklERXVNQzV5WXk0eUlHbHpJR0ZqZEhWaGJHeDVJSEpsZGpJZ1luVjBJR1J2WlhOdUozUWdjbVZ3YjNKMElHbDBYRzRnSURJNklDYzlQU0F4TGpBdU1DMXlZeTR6Snl4Y2JpQWdNem9nSnowOUlERXVNQzR3TFhKakxqUW5MRnh1SUNBME9pQW5QVDBnTVM1NExuZ25MRnh1SUNBMU9pQW5QVDBnTWk0d0xqQXRZV3h3YUdFdWVDY3NYRzRnSURZNklDYytQU0F5TGpBdU1DMWlaWFJoTGpFbkxGeHVJQ0EzT2lBblBqMGdOQzR3TGpBZ1BEUXVNeTR3Snl4Y2JpQWdPRG9nSno0OUlEUXVNeTR3SjF4dWZUdGNibHh1WTI5dWMzUWdiMkpxWldOMFZIbHdaU0E5SUNkYmIySnFaV04wSUU5aWFtVmpkRjBuTzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1NHRnVaR3hsWW1GeWMwVnVkbWx5YjI1dFpXNTBLR2hsYkhCbGNuTXNJSEJoY25ScFlXeHpMQ0JrWldOdmNtRjBiM0p6S1NCN1hHNGdJSFJvYVhNdWFHVnNjR1Z5Y3lBOUlHaGxiSEJsY25NZ2ZId2dlMzA3WEc0Z0lIUm9hWE11Y0dGeWRHbGhiSE1nUFNCd1lYSjBhV0ZzY3lCOGZDQjdmVHRjYmlBZ2RHaHBjeTVrWldOdmNtRjBiM0p6SUQwZ1pHVmpiM0poZEc5eWN5QjhmQ0I3ZlR0Y2JseHVJQ0J5WldkcGMzUmxja1JsWm1GMWJIUklaV3h3WlhKektIUm9hWE1wTzF4dUlDQnlaV2RwYzNSbGNrUmxabUYxYkhSRVpXTnZjbUYwYjNKektIUm9hWE1wTzF4dWZWeHVYRzVJWVc1a2JHVmlZWEp6Ulc1MmFYSnZibTFsYm5RdWNISnZkRzkwZVhCbElEMGdlMXh1SUNCamIyNXpkSEoxWTNSdmNqb2dTR0Z1Wkd4bFltRnljMFZ1ZG1seWIyNXRaVzUwTEZ4dVhHNGdJR3h2WjJkbGNqb2diRzluWjJWeUxGeHVJQ0JzYjJjNklHeHZaMmRsY2k1c2IyY3NYRzVjYmlBZ2NtVm5hWE4wWlhKSVpXeHdaWEk2SUdaMWJtTjBhVzl1S0c1aGJXVXNJR1p1S1NCN1hHNGdJQ0FnYVdZZ0tIUnZVM1J5YVc1bkxtTmhiR3dvYm1GdFpTa2dQVDA5SUc5aWFtVmpkRlI1Y0dVcElIdGNiaUFnSUNBZ0lHbG1JQ2htYmlrZ2UxeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLQ2RCY21jZ2JtOTBJSE4xY0hCdmNuUmxaQ0IzYVhSb0lHMTFiSFJwY0d4bElHaGxiSEJsY25NbktUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHVjRkR1Z1WkNoMGFHbHpMbWhsYkhCbGNuTXNJRzVoYldVcE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUdsekxtaGxiSEJsY25OYmJtRnRaVjBnUFNCbWJqdGNiaUFnSUNCOVhHNGdJSDBzWEc0Z0lIVnVjbVZuYVhOMFpYSklaV3h3WlhJNklHWjFibU4wYVc5dUtHNWhiV1VwSUh0Y2JpQWdJQ0JrWld4bGRHVWdkR2hwY3k1b1pXeHdaWEp6VzI1aGJXVmRPMXh1SUNCOUxGeHVYRzRnSUhKbFoybHpkR1Z5VUdGeWRHbGhiRG9nWm5WdVkzUnBiMjRvYm1GdFpTd2djR0Z5ZEdsaGJDa2dlMXh1SUNBZ0lHbG1JQ2gwYjFOMGNtbHVaeTVqWVd4c0tHNWhiV1VwSUQwOVBTQnZZbXBsWTNSVWVYQmxLU0I3WEc0Z0lDQWdJQ0JsZUhSbGJtUW9kR2hwY3k1d1lYSjBhV0ZzY3l3Z2JtRnRaU2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdjR0Z5ZEdsaGJDQTlQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVY0WTJWd2RHbHZiaWhjYmlBZ0lDQWdJQ0FnSUNCZ1FYUjBaVzF3ZEdsdVp5QjBieUJ5WldkcGMzUmxjaUJoSUhCaGNuUnBZV3dnWTJGc2JHVmtJRndpSkh0dVlXMWxmVndpSUdGeklIVnVaR1ZtYVc1bFpHQmNiaUFnSUNBZ0lDQWdLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSFJvYVhNdWNHRnlkR2xoYkhOYmJtRnRaVjBnUFNCd1lYSjBhV0ZzTzF4dUlDQWdJSDFjYmlBZ2ZTeGNiaUFnZFc1eVpXZHBjM1JsY2xCaGNuUnBZV3c2SUdaMWJtTjBhVzl1S0c1aGJXVXBJSHRjYmlBZ0lDQmtaV3hsZEdVZ2RHaHBjeTV3WVhKMGFXRnNjMXR1WVcxbFhUdGNiaUFnZlN4Y2JseHVJQ0J5WldkcGMzUmxja1JsWTI5eVlYUnZjam9nWm5WdVkzUnBiMjRvYm1GdFpTd2dabTRwSUh0Y2JpQWdJQ0JwWmlBb2RHOVRkSEpwYm1jdVkyRnNiQ2h1WVcxbEtTQTlQVDBnYjJKcVpXTjBWSGx3WlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLR1p1S1NCN1hHNGdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZlR05sY0hScGIyNG9KMEZ5WnlCdWIzUWdjM1Z3Y0c5eWRHVmtJSGRwZEdnZ2JYVnNkR2x3YkdVZ1pHVmpiM0poZEc5eWN5Y3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdaWGgwWlc1a0tIUm9hWE11WkdWamIzSmhkRzl5Y3l3Z2JtRnRaU2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIUm9hWE11WkdWamIzSmhkRzl5YzF0dVlXMWxYU0E5SUdadU8xeHVJQ0FnSUgxY2JpQWdmU3hjYmlBZ2RXNXlaV2RwYzNSbGNrUmxZMjl5WVhSdmNqb2dablZ1WTNScGIyNG9ibUZ0WlNrZ2UxeHVJQ0FnSUdSbGJHVjBaU0IwYUdsekxtUmxZMjl5WVhSdmNuTmJibUZ0WlYwN1hHNGdJSDBzWEc0Z0lDOHFLbHh1SUNBZ0tpQlNaWE5sZENCMGFHVWdiV1Z0YjNKNUlHOW1JR2xzYkdWbllXd2djSEp2Y0dWeWRIa2dZV05qWlhOelpYTWdkR2hoZENCb1lYWmxJR0ZzY21WaFpIa2dZbVZsYmlCc2IyZG5aV1F1WEc0Z0lDQXFJRUJrWlhCeVpXTmhkR1ZrSUhOb2IzVnNaQ0J2Ym14NUlHSmxJSFZ6WldRZ2FXNGdhR0Z1Wkd4bFltRnljeUIwWlhOMExXTmhjMlZ6WEc0Z0lDQXFMMXh1SUNCeVpYTmxkRXh2WjJkbFpGQnliM0JsY25SNVFXTmpaWE56WlhNb0tTQjdYRzRnSUNBZ2NtVnpaWFJNYjJkblpXUlFjbTl3WlhKMGFXVnpLQ2s3WEc0Z0lIMWNibjA3WEc1Y2JtVjRjRzl5ZENCc1pYUWdiRzluSUQwZ2JHOW5aMlZ5TG14dlp6dGNibHh1Wlhod2IzSjBJSHNnWTNKbFlYUmxSbkpoYldVc0lHeHZaMmRsY2lCOU8xeHVJbDE5XG4iLAogICAgIi8vIEJ1aWxkIG91dCBvdXIgYmFzaWMgU2FmZVN0cmluZyB0eXBlXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBTYWZlU3RyaW5nKHN0cmluZykge1xuICB0aGlzLnN0cmluZyA9IHN0cmluZztcbn1cblxuU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gU2FmZVN0cmluZztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMM05oWm1VdGMzUnlhVzVuTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN096czdRVUZEUVN4VFFVRlRMRlZCUVZVc1EwRkJReXhOUVVGTkxFVkJRVVU3UVVGRE1VSXNUVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UTBGRGRFSTdPMEZCUlVRc1ZVRkJWU3hEUVVGRExGTkJRVk1zUTBGQlF5eFJRVUZSTEVkQlFVY3NWVUZCVlN4RFFVRkRMRk5CUVZNc1EwRkJReXhOUVVGTkxFZEJRVWNzV1VGQlZ6dEJRVU4yUlN4VFFVRlBMRVZCUVVVc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETzBOQlEzcENMRU5CUVVNN08zRkNRVVZoTEZWQlFWVWlMQ0ptYVd4bElqb2ljMkZtWlMxemRISnBibWN1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZMeUJDZFdsc1pDQnZkWFFnYjNWeUlHSmhjMmxqSUZOaFptVlRkSEpwYm1jZ2RIbHdaVnh1Wm5WdVkzUnBiMjRnVTJGbVpWTjBjbWx1WnloemRISnBibWNwSUh0Y2JpQWdkR2hwY3k1emRISnBibWNnUFNCemRISnBibWM3WEc1OVhHNWNibE5oWm1WVGRISnBibWN1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1UyRm1aVk4wY21sdVp5NXdjbTkwYjNSNWNHVXVkRzlJVkUxTUlEMGdablZ1WTNScGIyNG9LU0I3WEc0Z0lISmxkSFZ5YmlBbkp5QXJJSFJvYVhNdWMzUnlhVzVuTzF4dWZUdGNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdVMkZtWlZOMGNtbHVaenRjYmlKZGZRPT1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy53cmFwSGVscGVyID0gd3JhcEhlbHBlcjtcblxuZnVuY3Rpb24gd3JhcEhlbHBlcihoZWxwZXIsIHRyYW5zZm9ybU9wdGlvbnNGbikge1xuICBpZiAodHlwZW9mIGhlbHBlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBhcHBhcmVudGx5IGl0IGRvZXMgaW4gaHR0cHM6Ly9naXRodWIuY29tL3d5Y2F0cy9oYW5kbGViYXJzLmpzL2lzc3Vlcy8xNjM5XG4gICAgLy8gV2UgdHJ5IHRvIG1ha2UgdGhlIHdyYXBwZXIgbGVhc3QtaW52YXNpdmUgYnkgbm90IHdyYXBwaW5nIGl0LCBpZiB0aGUgaGVscGVyIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgIHJldHVybiBoZWxwZXI7XG4gIH1cbiAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbiB3cmFwcGVyKCkgLyogZHluYW1pYyBhcmd1bWVudHMgKi97XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0gPSB0cmFuc2Zvcm1PcHRpb25zRm4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGhlbHBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwybHVkR1Z5Ym1Gc0wzZHlZWEJJWld4d1pYSXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN1FVRkJUeXhUUVVGVExGVkJRVlVzUTBGQlF5eE5RVUZOTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVU3UVVGRGNrUXNUVUZCU1N4UFFVRlBMRTFCUVUwc1MwRkJTeXhWUVVGVkxFVkJRVVU3T3p0QlFVZG9ReXhYUVVGUExFMUJRVTBzUTBGQlF6dEhRVU5tTzBGQlEwUXNUVUZCU1N4UFFVRlBMRWRCUVVjc1UwRkJWaXhQUVVGUExEQkNRVUZ4UXp0QlFVTTVReXhSUVVGTkxFOUJRVThzUjBGQlJ5eFRRVUZUTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU5vUkN4aFFVRlRMRU5CUVVNc1UwRkJVeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4clFrRkJhMElzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTTVSQ3hYUVVGUExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4RlFVRkZMRk5CUVZNc1EwRkJReXhEUVVGRE8wZEJRM1JETEVOQlFVTTdRVUZEUml4VFFVRlBMRTlCUVU4c1EwRkJRenREUVVOb1FpSXNJbVpwYkdVaU9pSjNjbUZ3U0dWc2NHVnlMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUhkeVlYQklaV3h3WlhJb2FHVnNjR1Z5TENCMGNtRnVjMlp2Y20xUGNIUnBiMjV6Um00cElIdGNiaUFnYVdZZ0tIUjVjR1Z2WmlCb1pXeHdaWElnSVQwOUlDZG1kVzVqZEdsdmJpY3BJSHRjYmlBZ0lDQXZMeUJVYUdseklITm9iM1ZzWkNCdWIzUWdhR0Z3Y0dWdUxDQmlkWFFnWVhCd1lYSmxiblJzZVNCcGRDQmtiMlZ6SUdsdUlHaDBkSEJ6T2k4dloybDBhSFZpTG1OdmJTOTNlV05oZEhNdmFHRnVaR3hsWW1GeWN5NXFjeTlwYzNOMVpYTXZNVFl6T1Z4dUlDQWdJQzh2SUZkbElIUnllU0IwYnlCdFlXdGxJSFJvWlNCM2NtRndjR1Z5SUd4bFlYTjBMV2x1ZG1GemFYWmxJR0o1SUc1dmRDQjNjbUZ3Y0dsdVp5QnBkQ3dnYVdZZ2RHaGxJR2hsYkhCbGNpQnBjeUJ1YjNRZ1lTQm1kVzVqZEdsdmJpNWNiaUFnSUNCeVpYUjFjbTRnYUdWc2NHVnlPMXh1SUNCOVhHNGdJR3hsZENCM2NtRndjR1Z5SUQwZ1puVnVZM1JwYjI0b0x5b2daSGx1WVcxcFl5QmhjbWQxYldWdWRITWdLaThwSUh0Y2JpQWdJQ0JqYjI1emRDQnZjSFJwYjI1eklEMGdZWEpuZFcxbGJuUnpXMkZ5WjNWdFpXNTBjeTVzWlc1bmRHZ2dMU0F4WFR0Y2JpQWdJQ0JoY21kMWJXVnVkSE5iWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0F0SURGZElEMGdkSEpoYm5ObWIzSnRUM0IwYVc5dWMwWnVLRzl3ZEdsdmJuTXBPMXh1SUNBZ0lISmxkSFZ5YmlCb1pXeHdaWEl1WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNiaUFnZlR0Y2JpQWdjbVYwZFhKdUlIZHlZWEJ3WlhJN1hHNTlYRzRpWFgwPVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uO1xuZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtO1xuZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsO1xuZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDtcbmV4cG9ydHMubm9vcCA9IG5vb3A7XG4vLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmpbJ2RlZmF1bHQnXSA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF91dGlscyk7XG5cbnZhciBfZXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTtcblxudmFyIF9iYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciBfaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xuXG52YXIgX2ludGVybmFsV3JhcEhlbHBlciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvd3JhcEhlbHBlcicpO1xuXG52YXIgX2ludGVybmFsUHJvdG9BY2Nlc3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3Byb3RvLWFjY2VzcycpO1xuXG5mdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICB2YXIgY29tcGlsZXJSZXZpc2lvbiA9IGNvbXBpbGVySW5mbyAmJiBjb21waWxlckluZm9bMF0gfHwgMSxcbiAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uID49IF9iYXNlLkxBU1RfQ09NUEFUSUJMRV9DT01QSUxFUl9SRVZJU0lPTiAmJiBjb21waWxlclJldmlzaW9uIDw9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBfYmFzZS5MQVNUX0NPTVBBVElCTEVfQ09NUElMRVJfUkVWSVNJT04pIHtcbiAgICB2YXIgcnVudGltZVZlcnNpb25zID0gX2Jhc2UuUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICBjb21waWxlclZlcnNpb25zID0gX2Jhc2UuUkVWSVNJT05fQ0hBTkdFU1tjb21waWxlclJldmlzaW9uXTtcbiAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSB0aGUgZW1iZWRkZWQgdmVyc2lvbiBpbmZvIHNpbmNlIHRoZSBydW50aW1lIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIHJldmlzaW9uIHlldFxuICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7XG4gIH1cbiAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7XG4gICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICB0ZW1wbGF0ZVNwZWMubWFpbi5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWMubWFpbl9kO1xuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc2V1ZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHByZWNvbXBpbGVkIHRlbXBsYXRlcyB3aXRoIGNvbXBpbGVyLXZlcnNpb24gNyAoPDQuMy4wKVxuICB2YXIgdGVtcGxhdGVXYXNQcmVjb21waWxlZFdpdGhDb21waWxlclY3ID0gdGVtcGxhdGVTcGVjLmNvbXBpbGVyICYmIHRlbXBsYXRlU3BlYy5jb21waWxlclswXSA9PT0gNztcblxuICBmdW5jdGlvbiBpbnZva2VQYXJ0aWFsV3JhcHBlcihwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgICAgY29udGV4dCA9IFV0aWxzLmV4dGVuZCh7fSwgY29udGV4dCwgb3B0aW9ucy5oYXNoKTtcbiAgICAgIGlmIChvcHRpb25zLmlkcykge1xuICAgICAgICBvcHRpb25zLmlkc1swXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIHZhciBleHRlbmRlZE9wdGlvbnMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGhvb2tzOiB0aGlzLmhvb2tzLFxuICAgICAgcHJvdG9BY2Nlc3NDb250cm9sOiB0aGlzLnByb3RvQWNjZXNzQ29udHJvbFxuICAgIH0pO1xuXG4gICAgdmFyIHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgZXh0ZW5kZWRPcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBleHRlbmRlZE9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGlmIChvcHRpb25zLmluZGVudCkge1xuICAgICAgICB2YXIgbGluZXMgPSByZXN1bHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICghbGluZXNbaV0gJiYgaSArIDEgPT09IGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgdmFyIGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uIHN0cmljdChvYmosIG5hbWUsIGxvYykge1xuICAgICAgaWYgKCFvYmogfHwgIShuYW1lIGluIG9iaikpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaiwge1xuICAgICAgICAgIGxvYzogbG9jXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXBQcm9wZXJ0eShvYmosIG5hbWUpO1xuICAgIH0sXG4gICAgbG9va3VwUHJvcGVydHk6IGZ1bmN0aW9uIGxvb2t1cFByb3BlcnR5KHBhcmVudCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG4gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyZW50LCBwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChfaW50ZXJuYWxQcm90b0FjY2Vzcy5yZXN1bHRJc0FsbG93ZWQocmVzdWx0LCBjb250YWluZXIucHJvdG9BY2Nlc3NDb250cm9sLCBwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbiBsb29rdXAoZGVwdGhzLCBuYW1lKSB7XG4gICAgICB2YXIgbGVuID0gZGVwdGhzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRlcHRoc1tpXSAmJiBjb250YWluZXIubG9va3VwUHJvcGVydHkoZGVwdGhzW2ldLCBuYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbiBsYW1iZGEoY3VycmVudCwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBjdXJyZW50ID09PSAnZnVuY3Rpb24nID8gY3VycmVudC5jYWxsKGNvbnRleHQpIDogY3VycmVudDtcbiAgICB9LFxuXG4gICAgZXNjYXBlRXhwcmVzc2lvbjogVXRpbHMuZXNjYXBlRXhwcmVzc2lvbixcbiAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQYXJ0aWFsV3JhcHBlcixcblxuICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7XG4gICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldO1xuICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG5cbiAgICBwcm9ncmFtczogW10sXG4gICAgcHJvZ3JhbTogZnVuY3Rpb24gcHJvZ3JhbShpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICB2YXIgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbiBkYXRhKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2VJZk5lZWRlZDogZnVuY3Rpb24gbWVyZ2VJZk5lZWRlZChwYXJhbSwgY29tbW9uKSB7XG4gICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIHBhcmFtICE9PSBjb21tb24pIHtcbiAgICAgICAgb2JqID0gVXRpbHMuZXh0ZW5kKHt9LCBjb21tb24sIHBhcmFtKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIC8vIEFuIGVtcHR5IG9iamVjdCB0byB1c2UgYXMgcmVwbGFjZW1lbnQgZm9yIG51bGwtY29udGV4dHNcbiAgICBudWxsQ29udGV4dDogT2JqZWN0LnNlYWwoe30pLFxuXG4gICAgbm9vcDogZW52LlZNLm5vb3AsXG4gICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXJcbiAgfTtcblxuICBmdW5jdGlvbiByZXQoY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT0gb3B0aW9ucy5kZXB0aHNbMF0gPyBbY29udGV4dF0uY29uY2F0KG9wdGlvbnMuZGVwdGhzKSA6IG9wdGlvbnMuZGVwdGhzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVwdGhzID0gW2NvbnRleHRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7XG4gICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIH1cblxuICAgIG1haW4gPSBleGVjdXRlRGVjb3JhdG9ycyh0ZW1wbGF0ZVNwZWMubWFpbiwgbWFpbiwgY29udGFpbmVyLCBvcHRpb25zLmRlcHRocyB8fCBbXSwgZGF0YSwgYmxvY2tQYXJhbXMpO1xuICAgIHJldHVybiBtYWluKGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCkge1xuICAgICAgdmFyIG1lcmdlZEhlbHBlcnMgPSBVdGlscy5leHRlbmQoe30sIGVudi5oZWxwZXJzLCBvcHRpb25zLmhlbHBlcnMpO1xuICAgICAgd3JhcEhlbHBlcnNUb1Bhc3NMb29rdXBQcm9wZXJ0eShtZXJnZWRIZWxwZXJzLCBjb250YWluZXIpO1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBtZXJnZWRIZWxwZXJzO1xuXG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwpIHtcbiAgICAgICAgLy8gVXNlIG1lcmdlSWZOZWVkZWQgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGluZyBnbG9iYWwgcGFydGlhbHMgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gY29udGFpbmVyLm1lcmdlSWZOZWVkZWQob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykge1xuICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IFV0aWxzLmV4dGVuZCh7fSwgZW52LmRlY29yYXRvcnMsIG9wdGlvbnMuZGVjb3JhdG9ycyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5ob29rcyA9IHt9O1xuICAgICAgY29udGFpbmVyLnByb3RvQWNjZXNzQ29udHJvbCA9IF9pbnRlcm5hbFByb3RvQWNjZXNzLmNyZWF0ZVByb3RvQWNjZXNzQ29udHJvbChvcHRpb25zKTtcblxuICAgICAgdmFyIGtlZXBIZWxwZXJJbkhlbHBlcnMgPSBvcHRpb25zLmFsbG93Q2FsbHNUb0hlbHBlck1pc3NpbmcgfHwgdGVtcGxhdGVXYXNQcmVjb21waWxlZFdpdGhDb21waWxlclY3O1xuICAgICAgX2hlbHBlcnMubW92ZUhlbHBlclRvSG9va3MoY29udGFpbmVyLCAnaGVscGVyTWlzc2luZycsIGtlZXBIZWxwZXJJbkhlbHBlcnMpO1xuICAgICAgX2hlbHBlcnMubW92ZUhlbHBlclRvSG9va3MoY29udGFpbmVyLCAnYmxvY2tIZWxwZXJNaXNzaW5nJywga2VlcEhlbHBlckluSGVscGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5wcm90b0FjY2Vzc0NvbnRyb2wgPSBvcHRpb25zLnByb3RvQWNjZXNzQ29udHJvbDsgLy8gaW50ZXJuYWwgb3B0aW9uXG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IG9wdGlvbnMuZGVjb3JhdG9ycztcbiAgICAgIGNvbnRhaW5lci5ob29rcyA9IG9wdGlvbnMuaG9va3M7XG4gICAgfVxuICB9O1xuXG4gIHJldC5fY2hpbGQgPSBmdW5jdGlvbiAoaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIHBhcmVudCBkZXB0aHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCB0ZW1wbGF0ZVNwZWNbaV0sIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICB2YXIgY3VycmVudERlcHRocyA9IGRlcHRocztcbiAgICBpZiAoZGVwdGhzICYmIGNvbnRleHQgIT0gZGVwdGhzWzBdICYmICEoY29udGV4dCA9PT0gY29udGFpbmVyLm51bGxDb250ZXh0ICYmIGRlcHRoc1swXSA9PT0gbnVsbCkpIHtcbiAgICAgIGN1cnJlbnREZXB0aHMgPSBbY29udGV4dF0uY29uY2F0KGRlcHRocyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTtcbiAgfVxuXG4gIHByb2cgPSBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKTtcblxuICBwcm9nLnByb2dyYW0gPSBpO1xuICBwcm9nLmRlcHRoID0gZGVwdGhzID8gZGVwdGhzLmxlbmd0aCA6IDA7XG4gIHByb2cuYmxvY2tQYXJhbXMgPSBkZWNsYXJlZEJsb2NrUGFyYW1zIHx8IDA7XG4gIHJldHVybiBwcm9nO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgY3VycmVudGx5IHBhcnQgb2YgdGhlIG9mZmljaWFsIEFQSSwgdGhlcmVmb3JlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLlxuICovXG5cbmZ1bmN0aW9uIHJlc29sdmVQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ0BwYXJ0aWFsLWJsb2NrJykge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICghcGFydGlhbC5jYWxsICYmICFvcHRpb25zLm5hbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBwYXJ0aWFsIHRoYXQgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICBvcHRpb25zLm5hbWUgPSBwYXJ0aWFsO1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW3BhcnRpYWxdO1xuICB9XG4gIHJldHVybiBwYXJ0aWFsO1xufVxuXG5mdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgLy8gVXNlIHRoZSBjdXJyZW50IGNsb3N1cmUgY29udGV4dCB0byBzYXZlIHRoZSBwYXJ0aWFsLWJsb2NrIGlmIHRoaXMgcGFydGlhbFxuICB2YXIgY3VycmVudFBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgdmFyIHBhcnRpYWxCbG9jayA9IHVuZGVmaW5lZDtcbiAgaWYgKG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gbm9vcCkge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICBvcHRpb25zLmRhdGEgPSBfYmFzZS5jcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0byBnZXQgYWNjZXNzIHRvIGN1cnJlbnRQYXJ0aWFsQmxvY2sgZnJvbSB0aGUgY2xvc3VyZVxuICAgICAgdmFyIGZuID0gb3B0aW9ucy5mbjtcbiAgICAgIHBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddID0gZnVuY3Rpb24gcGFydGlhbEJsb2NrV3JhcHBlcihjb250ZXh0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcGFydGlhbC1ibG9jayBmcm9tIHRoZSBjbG9zdXJlIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9ja1xuICAgICAgICAvLyBpLmUuIHRoZSBwYXJ0IGluc2lkZSB0aGUgYmxvY2sgb2YgdGhlIHBhcnRpYWwgY2FsbC5cbiAgICAgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBjdXJyZW50UGFydGlhbEJsb2NrO1xuICAgICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgICAgaWYgKGZuLnBhcnRpYWxzKSB7XG4gICAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIGZuLnBhcnRpYWxzKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFsQmxvY2spIHtcbiAgICBwYXJ0aWFsID0gcGFydGlhbEJsb2NrO1xuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBfYmFzZS5jcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpIHtcbiAgaWYgKGZuLmRlY29yYXRvcikge1xuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHByb2cgPSBmbi5kZWNvcmF0b3IocHJvZywgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGhzICYmIGRlcHRoc1swXSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgVXRpbHMuZXh0ZW5kKHByb2csIHByb3BzKTtcbiAgfVxuICByZXR1cm4gcHJvZztcbn1cblxuZnVuY3Rpb24gd3JhcEhlbHBlcnNUb1Bhc3NMb29rdXBQcm9wZXJ0eShtZXJnZWRIZWxwZXJzLCBjb250YWluZXIpIHtcbiAgT2JqZWN0LmtleXMobWVyZ2VkSGVscGVycykuZm9yRWFjaChmdW5jdGlvbiAoaGVscGVyTmFtZSkge1xuICAgIHZhciBoZWxwZXIgPSBtZXJnZWRIZWxwZXJzW2hlbHBlck5hbWVdO1xuICAgIG1lcmdlZEhlbHBlcnNbaGVscGVyTmFtZV0gPSBwYXNzTG9va3VwUHJvcGVydHlPcHRpb24oaGVscGVyLCBjb250YWluZXIpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFzc0xvb2t1cFByb3BlcnR5T3B0aW9uKGhlbHBlciwgY29udGFpbmVyKSB7XG4gIHZhciBsb29rdXBQcm9wZXJ0eSA9IGNvbnRhaW5lci5sb29rdXBQcm9wZXJ0eTtcbiAgcmV0dXJuIF9pbnRlcm5hbFdyYXBIZWxwZXIud3JhcEhlbHBlcihoZWxwZXIsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIFV0aWxzLmV4dGVuZCh7IGxvb2t1cFByb3BlcnR5OiBsb29rdXBQcm9wZXJ0eSB9LCBvcHRpb25zKTtcbiAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwzSjFiblJwYldVdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN096czdPenM3T3pzN2NVSkJRWFZDTEZOQlFWTTdPMGxCUVhCQ0xFdEJRVXM3TzNsQ1FVTkxMR0ZCUVdFN096czdiMEpCVFRWQ0xGRkJRVkU3TzNWQ1FVTnRRaXhYUVVGWE96dHJRMEZEYkVJc2RVSkJRWFZDT3p0dFEwRkpNME1zZVVKQlFYbENPenRCUVVWNlFpeFRRVUZUTEdGQlFXRXNRMEZCUXl4WlFVRlpMRVZCUVVVN1FVRkRNVU1zVFVGQlRTeG5Ra0ZCWjBJc1IwRkJSeXhCUVVGRExGbEJRVmtzU1VGQlNTeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVzc1EwRkJRenROUVVNM1JDeGxRVUZsTERCQ1FVRnZRaXhEUVVGRE96dEJRVVYwUXl4TlFVTkZMR2RDUVVGblFpd3lRMEZCY1VNc1NVRkRja1FzWjBKQlFXZENMREpDUVVGeFFpeEZRVU55UXp0QlFVTkJMRmRCUVU4N1IwRkRVanM3UVVGRlJDeE5RVUZKTEdkQ1FVRm5RaXd3UTBGQmIwTXNSVUZCUlR0QlFVTjRSQ3hSUVVGTkxHVkJRV1VzUjBGQlJ5eDFRa0ZCYVVJc1pVRkJaU3hEUVVGRE8xRkJRM1pFTEdkQ1FVRm5RaXhIUVVGSExIVkNRVUZwUWl4blFrRkJaMElzUTBGQlF5eERRVUZETzBGQlEzaEVMRlZCUVUwc01rSkJRMG9zZVVaQlFYbEdMRWRCUTNaR0xIRkVRVUZ4UkN4SFFVTnlSQ3hsUVVGbExFZEJRMllzYlVSQlFXMUVMRWRCUTI1RUxHZENRVUZuUWl4SFFVTm9RaXhKUVVGSkxFTkJRMUFzUTBGQlF6dEhRVU5JTEUxQlFVMDdPMEZCUlV3c1ZVRkJUU3d5UWtGRFNpeDNSa0ZCZDBZc1IwRkRkRVlzYVVSQlFXbEVMRWRCUTJwRUxGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZEWml4SlFVRkpMRU5CUTFBc1EwRkJRenRIUVVOSU8wTkJRMFk3TzBGQlJVMHNVMEZCVXl4UlFVRlJMRU5CUVVNc1dVRkJXU3hGUVVGRkxFZEJRVWNzUlVGQlJUczdRVUZGTVVNc1RVRkJTU3hEUVVGRExFZEJRVWNzUlVGQlJUdEJRVU5TTEZWQlFVMHNNa0pCUVdNc2JVTkJRVzFETEVOQlFVTXNRMEZCUXp0SFFVTXhSRHRCUVVORUxFMUJRVWtzUTBGQlF5eFpRVUZaTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRk8wRkJRM1pETEZWQlFVMHNNa0pCUVdNc01rSkJRVEpDTEVkQlFVY3NUMEZCVHl4WlFVRlpMRU5CUVVNc1EwRkJRenRIUVVONFJUczdRVUZGUkN4alFVRlpMRU5CUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RFFVRkRPenM3TzBGQlNXeEVMRXRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zWVVGQllTeERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenM3TzBGQlJ6VkRMRTFCUVUwc2IwTkJRVzlETEVkQlEzaERMRmxCUVZrc1EwRkJReXhSUVVGUkxFbEJRVWtzV1VGQldTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03TzBGQlJURkVMRmRCUVZNc2IwSkJRVzlDTEVOQlFVTXNUMEZCVHl4RlFVRkZMRTlCUVU4c1JVRkJSU3hQUVVGUExFVkJRVVU3UVVGRGRrUXNVVUZCU1N4UFFVRlBMRU5CUVVNc1NVRkJTU3hGUVVGRk8wRkJRMmhDTEdGQlFVOHNSMEZCUnl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUlVGQlJTeFBRVUZQTEVWQlFVVXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRMnhFTEZWQlFVa3NUMEZCVHl4RFFVRkRMRWRCUVVjc1JVRkJSVHRCUVVObUxHVkJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRE8wOUJRM1pDTzB0QlEwWTdRVUZEUkN4WFFVRlBMRWRCUVVjc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eGpRVUZqTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSU3hQUVVGUExFVkJRVVVzVDBGQlR5eEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPenRCUVVWMFJTeFJRVUZKTEdWQlFXVXNSMEZCUnl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUlVGQlJTeFBRVUZQTEVWQlFVVTdRVUZET1VNc1YwRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTzBGQlEycENMSGRDUVVGclFpeEZRVUZGTEVsQlFVa3NRMEZCUXl4clFrRkJhMEk3UzBGRE5VTXNRMEZCUXl4RFFVRkRPenRCUVVWSUxGRkJRVWtzVFVGQlRTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1lVRkJZU3hEUVVGRExFbEJRVWtzUTBGRGNFTXNTVUZCU1N4RlFVTktMRTlCUVU4c1JVRkRVQ3hQUVVGUExFVkJRMUFzWlVGQlpTeERRVU5vUWl4RFFVRkRPenRCUVVWR0xGRkJRVWtzVFVGQlRTeEpRVUZKTEVsQlFVa3NTVUZCU1N4SFFVRkhMRU5CUVVNc1QwRkJUeXhGUVVGRk8wRkJRMnBETEdGQlFVOHNRMEZCUXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVkQlFVY3NRMEZCUXl4UFFVRlBMRU5CUXpGRExFOUJRVThzUlVGRFVDeFpRVUZaTEVOQlFVTXNaVUZCWlN4RlFVTTFRaXhIUVVGSExFTkJRMG9zUTBGQlF6dEJRVU5HTEZsQlFVMHNSMEZCUnl4UFFVRlBMRU5CUVVNc1VVRkJVU3hEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4UFFVRlBMRVZCUVVVc1pVRkJaU3hEUVVGRExFTkJRVU03UzBGRGJrVTdRVUZEUkN4UlFVRkpMRTFCUVUwc1NVRkJTU3hKUVVGSkxFVkJRVVU3UVVGRGJFSXNWVUZCU1N4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRk8wRkJRMnhDTEZsQlFVa3NTMEZCU3l4SFFVRkhMRTFCUVUwc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdRVUZETDBJc1lVRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRXRCUVVzc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVNMVF5eGpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZPMEZCUXpWQ0xHdENRVUZOTzFkQlExQTdPMEZCUlVRc1pVRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRWRCUVVjc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFOQlEzUkRPMEZCUTBRc1kwRkJUU3hIUVVGSExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1QwRkRNMEk3UVVGRFJDeGhRVUZQTEUxQlFVMHNRMEZCUXp0TFFVTm1MRTFCUVUwN1FVRkRUQ3haUVVGTkxESkNRVU5LTEdOQlFXTXNSMEZEV2l4UFFVRlBMRU5CUVVNc1NVRkJTU3hIUVVOYUxEQkVRVUV3UkN4RFFVTTNSQ3hEUVVGRE8wdEJRMGc3UjBGRFJqczdPMEZCUjBRc1RVRkJTU3hUUVVGVExFZEJRVWM3UVVGRFpDeFZRVUZOTEVWQlFVVXNaMEpCUVZNc1IwRkJSeXhGUVVGRkxFbEJRVWtzUlVGQlJTeEhRVUZITEVWQlFVVTdRVUZETDBJc1ZVRkJTU3hEUVVGRExFZEJRVWNzU1VGQlNTeEZRVUZGTEVsQlFVa3NTVUZCU1N4SFFVRkhMRU5CUVVFc1FVRkJReXhGUVVGRk8wRkJRekZDTEdOQlFVMHNNa0pCUVdNc1IwRkJSeXhIUVVGSExFbEJRVWtzUjBGQlJ5eHRRa0ZCYlVJc1IwRkJSeXhIUVVGSExFVkJRVVU3UVVGRE1VUXNZVUZCUnl4RlFVRkZMRWRCUVVjN1UwRkRWQ3hEUVVGRExFTkJRVU03VDBGRFNqdEJRVU5FTEdGQlFVOHNVMEZCVXl4RFFVRkRMR05CUVdNc1EwRkJReXhIUVVGSExFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdTMEZETlVNN1FVRkRSQ3hyUWtGQll5eEZRVUZGTEhkQ1FVRlRMRTFCUVUwc1JVRkJSU3haUVVGWkxFVkJRVVU3UVVGRE4wTXNWVUZCU1N4TlFVRk5MRWRCUVVjc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzBGQlEyeERMRlZCUVVrc1RVRkJUU3hKUVVGSkxFbEJRVWtzUlVGQlJUdEJRVU5zUWl4bFFVRlBMRTFCUVUwc1EwRkJRenRQUVVObU8wRkJRMFFzVlVGQlNTeE5RVUZOTEVOQlFVTXNVMEZCVXl4RFFVRkRMR05CUVdNc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEZsQlFWa3NRMEZCUXl4RlFVRkZPMEZCUXpsRUxHVkJRVThzVFVGQlRTeERRVUZETzA5QlEyWTdPMEZCUlVRc1ZVRkJTU3h4UTBGQlowSXNUVUZCVFN4RlFVRkZMRk5CUVZNc1EwRkJReXhyUWtGQmEwSXNSVUZCUlN4WlFVRlpMRU5CUVVNc1JVRkJSVHRCUVVOMlJTeGxRVUZQTEUxQlFVMHNRMEZCUXp0UFFVTm1PMEZCUTBRc1lVRkJUeXhUUVVGVExFTkJRVU03UzBGRGJFSTdRVUZEUkN4VlFVRk5MRVZCUVVVc1owSkJRVk1zVFVGQlRTeEZRVUZGTEVsQlFVa3NSVUZCUlR0QlFVTTNRaXhWUVVGTkxFZEJRVWNzUjBGQlJ5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRPMEZCUXpGQ0xGZEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdRVUZETlVJc1dVRkJTU3hOUVVGTkxFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRk5CUVZNc1EwRkJReXhqUVVGakxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRM0JGTEZsQlFVa3NUVUZCVFN4SlFVRkpMRWxCUVVrc1JVRkJSVHRCUVVOc1FpeHBRa0ZCVHl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdVMEZEZUVJN1QwRkRSanRMUVVOR08wRkJRMFFzVlVGQlRTeEZRVUZGTEdkQ1FVRlRMRTlCUVU4c1JVRkJSU3hQUVVGUExFVkJRVVU3UVVGRGFrTXNZVUZCVHl4UFFVRlBMRTlCUVU4c1MwRkJTeXhWUVVGVkxFZEJRVWNzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1IwRkJSeXhQUVVGUExFTkJRVU03UzBGRGVFVTdPMEZCUlVRc2IwSkJRV2RDTEVWQlFVVXNTMEZCU3l4RFFVRkRMR2RDUVVGblFqdEJRVU40UXl4cFFrRkJZU3hGUVVGRkxHOUNRVUZ2UWpzN1FVRkZia01zVFVGQlJTeEZRVUZGTEZsQlFWTXNRMEZCUXl4RlFVRkZPMEZCUTJRc1ZVRkJTU3hIUVVGSExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpGQ0xGTkJRVWNzUTBGQlF5eFRRVUZUTEVkQlFVY3NXVUZCV1N4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUTBGQlF6dEJRVU4yUXl4aFFVRlBMRWRCUVVjc1EwRkJRenRMUVVOYU96dEJRVVZFTEZsQlFWRXNSVUZCUlN4RlFVRkZPMEZCUTFvc1YwRkJUeXhGUVVGRkxHbENRVUZUTEVOQlFVTXNSVUZCUlN4SlFVRkpMRVZCUVVVc2JVSkJRVzFDTEVWQlFVVXNWMEZCVnl4RlFVRkZMRTFCUVUwc1JVRkJSVHRCUVVOdVJTeFZRVUZKTEdOQlFXTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU51UXl4RlFVRkZMRWRCUVVjc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnNRaXhWUVVGSkxFbEJRVWtzU1VGQlNTeE5RVUZOTEVsQlFVa3NWMEZCVnl4SlFVRkpMRzFDUVVGdFFpeEZRVUZGTzBGQlEzaEVMSE5DUVVGakxFZEJRVWNzVjBGQlZ5eERRVU14UWl4SlFVRkpMRVZCUTBvc1EwRkJReXhGUVVORUxFVkJRVVVzUlVGRFJpeEpRVUZKTEVWQlEwb3NiVUpCUVcxQ0xFVkJRMjVDTEZkQlFWY3NSVUZEV0N4TlFVRk5MRU5CUTFBc1EwRkJRenRQUVVOSUxFMUJRVTBzU1VGQlNTeERRVUZETEdOQlFXTXNSVUZCUlR0QlFVTXhRaXh6UWtGQll5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVjBGQlZ5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU03VDBGRE9VUTdRVUZEUkN4aFFVRlBMR05CUVdNc1EwRkJRenRMUVVOMlFqczdRVUZGUkN4UlFVRkpMRVZCUVVVc1kwRkJVeXhMUVVGTExFVkJRVVVzUzBGQlN5eEZRVUZGTzBGQlF6TkNMR0ZCUVU4c1MwRkJTeXhKUVVGSkxFdEJRVXNzUlVGQlJTeEZRVUZGTzBGQlEzWkNMR0ZCUVVzc1IwRkJSeXhMUVVGTExFTkJRVU1zVDBGQlR5eERRVUZETzA5QlEzWkNPMEZCUTBRc1lVRkJUeXhMUVVGTExFTkJRVU03UzBGRFpEdEJRVU5FTEdsQ1FVRmhMRVZCUVVVc2RVSkJRVk1zUzBGQlN5eEZRVUZGTEUxQlFVMHNSVUZCUlR0QlFVTnlReXhWUVVGSkxFZEJRVWNzUjBGQlJ5eExRVUZMTEVsQlFVa3NUVUZCVFN4RFFVRkRPenRCUVVVeFFpeFZRVUZKTEV0QlFVc3NTVUZCU1N4TlFVRk5MRWxCUVVrc1MwRkJTeXhMUVVGTExFMUJRVTBzUlVGQlJUdEJRVU4yUXl4WFFVRkhMRWRCUVVjc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEVWQlFVVXNUVUZCVFN4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wOUJRM1pET3p0QlFVVkVMR0ZCUVU4c1IwRkJSeXhEUVVGRE8wdEJRMW83TzBGQlJVUXNaVUZCVnl4RlFVRkZMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZET3p0QlFVVTFRaXhSUVVGSkxFVkJRVVVzUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SlFVRkpPMEZCUTJwQ0xHZENRVUZaTEVWQlFVVXNXVUZCV1N4RFFVRkRMRkZCUVZFN1IwRkRjRU1zUTBGQlF6czdRVUZGUml4WFFVRlRMRWRCUVVjc1EwRkJReXhQUVVGUExFVkJRV2RDTzFGQlFXUXNUMEZCVHl4NVJFRkJSeXhGUVVGRk96dEJRVU5vUXl4UlFVRkpMRWxCUVVrc1IwRkJSeXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZET3p0QlFVVjRRaXhQUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUTNCQ0xGRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUMEZCVHl4SlFVRkpMRmxCUVZrc1EwRkJReXhQUVVGUExFVkJRVVU3UVVGRE5VTXNWVUZCU1N4SFFVRkhMRkZCUVZFc1EwRkJReXhQUVVGUExFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdTMEZEYUVNN1FVRkRSQ3hSUVVGSkxFMUJRVTBzV1VGQlFUdFJRVU5TTEZkQlFWY3NSMEZCUnl4WlFVRlpMRU5CUVVNc1kwRkJZeXhIUVVGSExFVkJRVVVzUjBGQlJ5eFRRVUZUTEVOQlFVTTdRVUZETjBRc1VVRkJTU3haUVVGWkxFTkJRVU1zVTBGQlV5eEZRVUZGTzBGQlF6RkNMRlZCUVVrc1QwRkJUeXhEUVVGRExFMUJRVTBzUlVGQlJUdEJRVU5zUWl4alFVRk5MRWRCUTBvc1QwRkJUeXhKUVVGSkxFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUTNoQ0xFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGRGFFTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJRenRQUVVOMFFpeE5RVUZOTzBGQlEwd3NZMEZCVFN4SFFVRkhMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03VDBGRGNFSTdTMEZEUmpzN1FVRkZSQ3hoUVVGVExFbEJRVWtzUTBGQlF5eFBRVUZQTEdkQ1FVRm5RanRCUVVOdVF5eGhRVU5GTEVWQlFVVXNSMEZEUml4WlFVRlpMRU5CUVVNc1NVRkJTU3hEUVVObUxGTkJRVk1zUlVGRFZDeFBRVUZQTEVWQlExQXNVMEZCVXl4RFFVRkRMRTlCUVU4c1JVRkRha0lzVTBGQlV5eERRVUZETEZGQlFWRXNSVUZEYkVJc1NVRkJTU3hGUVVOS0xGZEJRVmNzUlVGRFdDeE5RVUZOTEVOQlExQXNRMEZEUkR0TFFVTklPenRCUVVWRUxGRkJRVWtzUjBGQlJ5eHBRa0ZCYVVJc1EwRkRkRUlzV1VGQldTeERRVUZETEVsQlFVa3NSVUZEYWtJc1NVRkJTU3hGUVVOS0xGTkJRVk1zUlVGRFZDeFBRVUZQTEVOQlFVTXNUVUZCVFN4SlFVRkpMRVZCUVVVc1JVRkRjRUlzU1VGQlNTeEZRVU5LTEZkQlFWY3NRMEZEV2l4RFFVRkRPMEZCUTBZc1YwRkJUeXhKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPMGRCUXk5Q096dEJRVVZFTEV0QlFVY3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRE96dEJRVVZxUWl4TFFVRkhMRU5CUVVNc1RVRkJUU3hIUVVGSExGVkJRVk1zVDBGQlR5eEZRVUZGTzBGQlF6ZENMRkZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlEzQkNMRlZCUVVrc1lVRkJZU3hIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRWRCUVVjc1EwRkJReXhQUVVGUExFVkJRVVVzVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUTI1RkxIRkRRVUVyUWl4RFFVRkRMR0ZCUVdFc1JVRkJSU3hUUVVGVExFTkJRVU1zUTBGQlF6dEJRVU14UkN4bFFVRlRMRU5CUVVNc1QwRkJUeXhIUVVGSExHRkJRV0VzUTBGQlF6czdRVUZGYkVNc1ZVRkJTU3haUVVGWkxFTkJRVU1zVlVGQlZTeEZRVUZGT3p0QlFVVXpRaXhwUWtGQlV5eERRVUZETEZGQlFWRXNSMEZCUnl4VFFVRlRMRU5CUVVNc1lVRkJZU3hEUVVNeFF5eFBRVUZQTEVOQlFVTXNVVUZCVVN4RlFVTm9RaXhIUVVGSExFTkJRVU1zVVVGQlVTeERRVU5pTEVOQlFVTTdUMEZEU0R0QlFVTkVMRlZCUVVrc1dVRkJXU3hEUVVGRExGVkJRVlVzU1VGQlNTeFpRVUZaTEVOQlFVTXNZVUZCWVN4RlFVRkZPMEZCUTNwRUxHbENRVUZUTEVOQlFVTXNWVUZCVlN4SFFVRkhMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRMnBETEVWQlFVVXNSVUZEUml4SFFVRkhMRU5CUVVNc1ZVRkJWU3hGUVVOa0xFOUJRVThzUTBGQlF5eFZRVUZWTEVOQlEyNUNMRU5CUVVNN1QwRkRTRHM3UVVGRlJDeGxRVUZUTEVOQlFVTXNTMEZCU3l4SFFVRkhMRVZCUVVVc1EwRkJRenRCUVVOeVFpeGxRVUZUTEVOQlFVTXNhMEpCUVd0Q0xFZEJRVWNzT0VOQlFYbENMRTlCUVU4c1EwRkJReXhEUVVGRE96dEJRVVZxUlN4VlFVRkpMRzFDUVVGdFFpeEhRVU55UWl4UFFVRlBMRU5CUVVNc2VVSkJRWGxDTEVsQlEycERMRzlEUVVGdlF5eERRVUZETzBGQlEzWkRMR2xEUVVGclFpeFRRVUZUTEVWQlFVVXNaVUZCWlN4RlFVRkZMRzFDUVVGdFFpeERRVUZETEVOQlFVTTdRVUZEYmtVc2FVTkJRV3RDTEZOQlFWTXNSVUZCUlN4dlFrRkJiMElzUlVGQlJTeHRRa0ZCYlVJc1EwRkJReXhEUVVGRE8wdEJRM3BGTEUxQlFVMDdRVUZEVEN4bFFVRlRMRU5CUVVNc2EwSkJRV3RDTEVkQlFVY3NUMEZCVHl4RFFVRkRMR3RDUVVGclFpeERRVUZETzBGQlF6RkVMR1ZCUVZNc1EwRkJReXhQUVVGUExFZEJRVWNzVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXp0QlFVTndReXhsUVVGVExFTkJRVU1zVVVGQlVTeEhRVUZITEU5QlFVOHNRMEZCUXl4UlFVRlJMRU5CUVVNN1FVRkRkRU1zWlVGQlV5eERRVUZETEZWQlFWVXNSMEZCUnl4UFFVRlBMRU5CUVVNc1ZVRkJWU3hEUVVGRE8wRkJRekZETEdWQlFWTXNRMEZCUXl4TFFVRkxMRWRCUVVjc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF6dExRVU5xUXp0SFFVTkdMRU5CUVVNN08wRkJSVVlzUzBGQlJ5eERRVUZETEUxQlFVMHNSMEZCUnl4VlFVRlRMRU5CUVVNc1JVRkJSU3hKUVVGSkxFVkJRVVVzVjBGQlZ5eEZRVUZGTEUxQlFVMHNSVUZCUlR0QlFVTnNSQ3hSUVVGSkxGbEJRVmtzUTBGQlF5eGpRVUZqTEVsQlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVVN1FVRkRMME1zV1VGQlRTd3lRa0ZCWXl4M1FrRkJkMElzUTBGQlF5eERRVUZETzB0QlF5OURPMEZCUTBRc1VVRkJTU3haUVVGWkxFTkJRVU1zVTBGQlV5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTNKRExGbEJRVTBzTWtKQlFXTXNlVUpCUVhsQ0xFTkJRVU1zUTBGQlF6dExRVU5vUkRzN1FVRkZSQ3hYUVVGUExGZEJRVmNzUTBGRGFFSXNVMEZCVXl4RlFVTlVMRU5CUVVNc1JVRkRSQ3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlEyWXNTVUZCU1N4RlFVTktMRU5CUVVNc1JVRkRSQ3hYUVVGWExFVkJRMWdzVFVGQlRTeERRVU5RTEVOQlFVTTdSMEZEU0N4RFFVRkRPMEZCUTBZc1UwRkJUeXhIUVVGSExFTkJRVU03UTBGRFdqczdRVUZGVFN4VFFVRlRMRmRCUVZjc1EwRkRla0lzVTBGQlV5eEZRVU5VTEVOQlFVTXNSVUZEUkN4RlFVRkZMRVZCUTBZc1NVRkJTU3hGUVVOS0xHMUNRVUZ0UWl4RlFVTnVRaXhYUVVGWExFVkJRMWdzVFVGQlRTeEZRVU5PTzBGQlEwRXNWMEZCVXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhGUVVGblFqdFJRVUZrTEU5QlFVOHNlVVJCUVVjc1JVRkJSVHM3UVVGRGFrTXNVVUZCU1N4aFFVRmhMRWRCUVVjc1RVRkJUU3hEUVVGRE8wRkJRek5DTEZGQlEwVXNUVUZCVFN4SlFVTk9MRTlCUVU4c1NVRkJTU3hOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlEzQkNMRVZCUVVVc1QwRkJUeXhMUVVGTExGTkJRVk1zUTBGQlF5eFhRVUZYTEVsQlFVa3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFbEJRVWtzUTBGQlFTeEJRVUZETEVWQlF6RkVPMEZCUTBFc2JVSkJRV0VzUjBGQlJ5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dExRVU14UXpzN1FVRkZSQ3hYUVVGUExFVkJRVVVzUTBGRFVDeFRRVUZUTEVWQlExUXNUMEZCVHl4RlFVTlFMRk5CUVZNc1EwRkJReXhQUVVGUExFVkJRMnBDTEZOQlFWTXNRMEZCUXl4UlFVRlJMRVZCUTJ4Q0xFOUJRVThzUTBGQlF5eEpRVUZKTEVsQlFVa3NTVUZCU1N4RlFVTndRaXhYUVVGWExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNWMEZCVnl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUTBGQlF5eEZRVU40UkN4aFFVRmhMRU5CUTJRc1EwRkJRenRIUVVOSU96dEJRVVZFTEUxQlFVa3NSMEZCUnl4cFFrRkJhVUlzUTBGQlF5eEZRVUZGTEVWQlFVVXNTVUZCU1N4RlFVRkZMRk5CUVZNc1JVRkJSU3hOUVVGTkxFVkJRVVVzU1VGQlNTeEZRVUZGTEZkQlFWY3NRMEZCUXl4RFFVRkRPenRCUVVWNlJTeE5RVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOcVFpeE5RVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTjRReXhOUVVGSkxFTkJRVU1zVjBGQlZ5eEhRVUZITEcxQ1FVRnRRaXhKUVVGSkxFTkJRVU1zUTBGQlF6dEJRVU0xUXl4VFFVRlBMRWxCUVVrc1EwRkJRenREUVVOaU96czdPenM3UVVGTFRTeFRRVUZUTEdOQlFXTXNRMEZCUXl4UFFVRlBMRVZCUVVVc1QwRkJUeXhGUVVGRkxFOUJRVThzUlVGQlJUdEJRVU40UkN4TlFVRkpMRU5CUVVNc1QwRkJUeXhGUVVGRk8wRkJRMW9zVVVGQlNTeFBRVUZQTEVOQlFVTXNTVUZCU1N4TFFVRkxMR2RDUVVGblFpeEZRVUZGTzBGQlEzSkRMR0ZCUVU4c1IwRkJSeXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRPMHRCUTNwRExFMUJRVTA3UVVGRFRDeGhRVUZQTEVkQlFVY3NUMEZCVHl4RFFVRkRMRkZCUVZFc1EwRkJReXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdTMEZETVVNN1IwRkRSaXhOUVVGTkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTVUZCU1N4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUlVGQlJUczdRVUZGZWtNc1YwRkJUeXhEUVVGRExFbEJRVWtzUjBGQlJ5eFBRVUZQTEVOQlFVTTdRVUZEZGtJc1YwRkJUeXhIUVVGSExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1IwRkRja003UVVGRFJDeFRRVUZQTEU5QlFVOHNRMEZCUXp0RFFVTm9RanM3UVVGRlRTeFRRVUZUTEdGQlFXRXNRMEZCUXl4UFFVRlBMRVZCUVVVc1QwRkJUeXhGUVVGRkxFOUJRVThzUlVGQlJUczdRVUZGZGtRc1RVRkJUU3h0UWtGQmJVSXNSMEZCUnl4UFFVRlBMRU5CUVVNc1NVRkJTU3hKUVVGSkxFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RFFVRkRMRU5CUVVNN1FVRkRNVVVzVTBGQlR5eERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRka0lzVFVGQlNTeFBRVUZQTEVOQlFVTXNSMEZCUnl4RlFVRkZPMEZCUTJZc1YwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eFhRVUZYTEVkQlFVY3NUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJRenRIUVVOMlJUczdRVUZGUkN4TlFVRkpMRmxCUVZrc1dVRkJRU3hEUVVGRE8wRkJRMnBDTEUxQlFVa3NUMEZCVHl4RFFVRkRMRVZCUVVVc1NVRkJTU3hQUVVGUExFTkJRVU1zUlVGQlJTeExRVUZMTEVsQlFVa3NSVUZCUlRzN1FVRkRja01zWVVGQlR5eERRVUZETEVsQlFVa3NSMEZCUnl4clFrRkJXU3hQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdPMEZCUlhwRExGVkJRVWtzUlVGQlJTeEhRVUZITEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVNN1FVRkRjRUlzYTBKQlFWa3NSMEZCUnl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExHVkJRV1VzUTBGQlF5eEhRVUZITEZOQlFWTXNiVUpCUVcxQ0xFTkJRM3BGTEU5QlFVOHNSVUZGVUR0WlFVUkJMRTlCUVU4c2VVUkJRVWNzUlVGQlJUczdPenRCUVVsYUxHVkJRVThzUTBGQlF5eEpRVUZKTEVkQlFVY3NhMEpCUVZrc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzBGQlEzcERMR1ZCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZETEVkQlFVY3NiVUpCUVcxQ0xFTkJRVU03UVVGRGNFUXNaVUZCVHl4RlFVRkZMRU5CUVVNc1QwRkJUeXhGUVVGRkxFOUJRVThzUTBGQlF5eERRVUZETzA5QlF6ZENMRU5CUVVNN1FVRkRSaXhWUVVGSkxFVkJRVVVzUTBGQlF5eFJRVUZSTEVWQlFVVTdRVUZEWml4bFFVRlBMRU5CUVVNc1VVRkJVU3hIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRTlCUVU4c1EwRkJReXhSUVVGUkxFVkJRVVVzUlVGQlJTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMDlCUTNCRk96dEhRVU5HT3p0QlFVVkVMRTFCUVVrc1QwRkJUeXhMUVVGTExGTkJRVk1zU1VGQlNTeFpRVUZaTEVWQlFVVTdRVUZEZWtNc1YwRkJUeXhIUVVGSExGbEJRVmtzUTBGQlF6dEhRVU40UWpzN1FVRkZSQ3hOUVVGSkxFOUJRVThzUzBGQlN5eFRRVUZUTEVWQlFVVTdRVUZEZWtJc1ZVRkJUU3d5UWtGQll5eGpRVUZqTEVkQlFVY3NUMEZCVHl4RFFVRkRMRWxCUVVrc1IwRkJSeXh4UWtGQmNVSXNRMEZCUXl4RFFVRkRPMGRCUXpWRkxFMUJRVTBzU1VGQlNTeFBRVUZQTEZsQlFWa3NVVUZCVVN4RlFVRkZPMEZCUTNSRExGZEJRVThzVDBGQlR5eERRVUZETEU5QlFVOHNSVUZCUlN4UFFVRlBMRU5CUVVNc1EwRkJRenRIUVVOc1F6dERRVU5HT3p0QlFVVk5MRk5CUVZNc1NVRkJTU3hIUVVGSE8wRkJRM0pDTEZOQlFVOHNSVUZCUlN4RFFVRkRPME5CUTFnN08wRkJSVVFzVTBGQlV5eFJRVUZSTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1JVRkJSVHRCUVVNdlFpeE5RVUZKTEVOQlFVTXNTVUZCU1N4SlFVRkpMRVZCUVVVc1RVRkJUU3hKUVVGSkxFbEJRVWtzUTBGQlFTeEJRVUZETEVWQlFVVTdRVUZET1VJc1VVRkJTU3hIUVVGSExFbEJRVWtzUjBGQlJ5eHJRa0ZCV1N4SlFVRkpMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03UVVGRGNrTXNVVUZCU1N4RFFVRkRMRWxCUVVrc1IwRkJSeXhQUVVGUExFTkJRVU03UjBGRGNrSTdRVUZEUkN4VFFVRlBMRWxCUVVrc1EwRkJRenREUVVOaU96dEJRVVZFTEZOQlFWTXNhVUpCUVdsQ0xFTkJRVU1zUlVGQlJTeEZRVUZGTEVsQlFVa3NSVUZCUlN4VFFVRlRMRVZCUVVVc1RVRkJUU3hGUVVGRkxFbEJRVWtzUlVGQlJTeFhRVUZYTEVWQlFVVTdRVUZEZWtVc1RVRkJTU3hGUVVGRkxFTkJRVU1zVTBGQlV5eEZRVUZGTzBGQlEyaENMRkZCUVVrc1MwRkJTeXhIUVVGSExFVkJRVVVzUTBGQlF6dEJRVU5tTEZGQlFVa3NSMEZCUnl4RlFVRkZMRU5CUVVNc1UwRkJVeXhEUVVOcVFpeEpRVUZKTEVWQlEwb3NTMEZCU3l4RlFVTk1MRk5CUVZNc1JVRkRWQ3hOUVVGTkxFbEJRVWtzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVTnVRaXhKUVVGSkxFVkJRMG9zVjBGQlZ5eEZRVU5ZTEUxQlFVMHNRMEZEVUN4RFFVRkRPMEZCUTBZc1UwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1IwRkRNMEk3UVVGRFJDeFRRVUZQTEVsQlFVa3NRMEZCUXp0RFFVTmlPenRCUVVWRUxGTkJRVk1zSzBKQlFTdENMRU5CUVVNc1lVRkJZU3hGUVVGRkxGTkJRVk1zUlVGQlJUdEJRVU5xUlN4UlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkJMRlZCUVZVc1JVRkJTVHRCUVVNdlF5eFJRVUZKTEUxQlFVMHNSMEZCUnl4aFFVRmhMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03UVVGRGRrTXNhVUpCUVdFc1EwRkJReXhWUVVGVkxFTkJRVU1zUjBGQlJ5eDNRa0ZCZDBJc1EwRkJReXhOUVVGTkxFVkJRVVVzVTBGQlV5eERRVUZETEVOQlFVTTdSMEZEZWtVc1EwRkJReXhEUVVGRE8wTkJRMG83TzBGQlJVUXNVMEZCVXl4M1FrRkJkMElzUTBGQlF5eE5RVUZOTEVWQlFVVXNVMEZCVXl4RlFVRkZPMEZCUTI1RUxFMUJRVTBzWTBGQll5eEhRVUZITEZOQlFWTXNRMEZCUXl4alFVRmpMRU5CUVVNN1FVRkRhRVFzVTBGQlR5d3JRa0ZCVnl4TlFVRk5MRVZCUVVVc1ZVRkJRU3hQUVVGUExFVkJRVWs3UVVGRGJrTXNWMEZCVHl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzWTBGQll5eEZRVUZrTEdOQlFXTXNSVUZCUlN4RlFVRkZMRTlCUVU4c1EwRkJReXhEUVVGRE8wZEJRMnhFTEVOQlFVTXNRMEZCUXp0RFFVTktJaXdpWm1sc1pTSTZJbkoxYm5ScGJXVXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnS2lCaGN5QlZkR2xzY3lCbWNtOXRJQ2N1TDNWMGFXeHpKenRjYm1sdGNHOXlkQ0JGZUdObGNIUnBiMjRnWm5KdmJTQW5MaTlsZUdObGNIUnBiMjRuTzF4dWFXMXdiM0owSUh0Y2JpQWdRMDlOVUVsTVJWSmZVa1ZXU1ZOSlQwNHNYRzRnSUdOeVpXRjBaVVp5WVcxbExGeHVJQ0JNUVZOVVgwTlBUVkJCVkVsQ1RFVmZRMDlOVUVsTVJWSmZVa1ZXU1ZOSlQwNHNYRzRnSUZKRlZrbFRTVTlPWDBOSVFVNUhSVk5jYm4wZ1puSnZiU0FuTGk5aVlYTmxKenRjYm1sdGNHOXlkQ0I3SUcxdmRtVklaV3h3WlhKVWIwaHZiMnR6SUgwZ1puSnZiU0FuTGk5b1pXeHdaWEp6Snp0Y2JtbHRjRzl5ZENCN0lIZHlZWEJJWld4d1pYSWdmU0JtY205dElDY3VMMmx1ZEdWeWJtRnNMM2R5WVhCSVpXeHdaWEluTzF4dWFXMXdiM0owSUh0Y2JpQWdZM0psWVhSbFVISnZkRzlCWTJObGMzTkRiMjUwY205c0xGeHVJQ0J5WlhOMWJIUkpjMEZzYkc5M1pXUmNibjBnWm5KdmJTQW5MaTlwYm5SbGNtNWhiQzl3Y205MGJ5MWhZMk5sYzNNbk8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMmhsWTJ0U1pYWnBjMmx2YmloamIyMXdhV3hsY2tsdVptOHBJSHRjYmlBZ1kyOXVjM1FnWTI5dGNHbHNaWEpTWlhacGMybHZiaUE5SUNoamIyMXdhV3hsY2tsdVptOGdKaVlnWTI5dGNHbHNaWEpKYm1adld6QmRLU0I4ZkNBeExGeHVJQ0FnSUdOMWNuSmxiblJTWlhacGMybHZiaUE5SUVOUFRWQkpURVZTWDFKRlZrbFRTVTlPTzF4dVhHNGdJR2xtSUNoY2JpQWdJQ0JqYjIxd2FXeGxjbEpsZG1semFXOXVJRDQ5SUV4QlUxUmZRMDlOVUVGVVNVSk1SVjlEVDAxUVNVeEZVbDlTUlZaSlUwbFBUaUFtSmx4dUlDQWdJR052YlhCcGJHVnlVbVYyYVhOcGIyNGdQRDBnUTA5TlVFbE1SVkpmVWtWV1NWTkpUMDVjYmlBZ0tTQjdYRzRnSUNBZ2NtVjBkWEp1TzF4dUlDQjlYRzVjYmlBZ2FXWWdLR052YlhCcGJHVnlVbVYyYVhOcGIyNGdQQ0JNUVZOVVgwTlBUVkJCVkVsQ1RFVmZRMDlOVUVsTVJWSmZVa1ZXU1ZOSlQwNHBJSHRjYmlBZ0lDQmpiMjV6ZENCeWRXNTBhVzFsVm1WeWMybHZibk1nUFNCU1JWWkpVMGxQVGw5RFNFRk9SMFZUVzJOMWNuSmxiblJTWlhacGMybHZibDBzWEc0Z0lDQWdJQ0JqYjIxd2FXeGxjbFpsY25OcGIyNXpJRDBnVWtWV1NWTkpUMDVmUTBoQlRrZEZVMXRqYjIxd2FXeGxjbEpsZG1semFXOXVYVHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLRnh1SUNBZ0lDQWdKMVJsYlhCc1lYUmxJSGRoY3lCd2NtVmpiMjF3YVd4bFpDQjNhWFJvSUdGdUlHOXNaR1Z5SUhabGNuTnBiMjRnYjJZZ1NHRnVaR3hsWW1GeWN5QjBhR0Z1SUhSb1pTQmpkWEp5Wlc1MElISjFiblJwYldVdUlDY2dLMXh1SUNBZ0lDQWdJQ0FuVUd4bFlYTmxJSFZ3WkdGMFpTQjViM1Z5SUhCeVpXTnZiWEJwYkdWeUlIUnZJR0VnYm1WM1pYSWdkbVZ5YzJsdmJpQW9KeUFyWEc0Z0lDQWdJQ0FnSUhKMWJuUnBiV1ZXWlhKemFXOXVjeUFyWEc0Z0lDQWdJQ0FnSUNjcElHOXlJR1J2ZDI1bmNtRmtaU0I1YjNWeUlISjFiblJwYldVZ2RHOGdZVzRnYjJ4a1pYSWdkbVZ5YzJsdmJpQW9KeUFyWEc0Z0lDQWdJQ0FnSUdOdmJYQnBiR1Z5Vm1WeWMybHZibk1nSzF4dUlDQWdJQ0FnSUNBbktTNG5YRzRnSUNBZ0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQXZMeUJWYzJVZ2RHaGxJR1Z0WW1Wa1pHVmtJSFpsY25OcGIyNGdhVzVtYnlCemFXNWpaU0IwYUdVZ2NuVnVkR2x0WlNCa2IyVnpiaWQwSUd0dWIzY2dZV0p2ZFhRZ2RHaHBjeUJ5WlhacGMybHZiaUI1WlhSY2JpQWdJQ0IwYUhKdmR5QnVaWGNnUlhoalpYQjBhVzl1S0Z4dUlDQWdJQ0FnSjFSbGJYQnNZWFJsSUhkaGN5QndjbVZqYjIxd2FXeGxaQ0IzYVhSb0lHRWdibVYzWlhJZ2RtVnljMmx2YmlCdlppQklZVzVrYkdWaVlYSnpJSFJvWVc0Z2RHaGxJR04xY25KbGJuUWdjblZ1ZEdsdFpTNGdKeUFyWEc0Z0lDQWdJQ0FnSUNkUWJHVmhjMlVnZFhCa1lYUmxJSGx2ZFhJZ2NuVnVkR2x0WlNCMGJ5QmhJRzVsZDJWeUlIWmxjbk5wYjI0Z0tDY2dLMXh1SUNBZ0lDQWdJQ0JqYjIxd2FXeGxja2x1Wm05Yk1WMGdLMXh1SUNBZ0lDQWdJQ0FuS1M0blhHNGdJQ0FnS1R0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2RHVnRjR3hoZEdVb2RHVnRjR3hoZEdWVGNHVmpMQ0JsYm5ZcElIdGNiaUFnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYmlBZ2FXWWdLQ0ZsYm5ZcElIdGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYaGpaWEIwYVc5dUtDZE9ieUJsYm5acGNtOXViV1Z1ZENCd1lYTnpaV1FnZEc4Z2RHVnRjR3hoZEdVbktUdGNiaUFnZlZ4dUlDQnBaaUFvSVhSbGJYQnNZWFJsVTNCbFl5QjhmQ0FoZEdWdGNHeGhkR1ZUY0dWakxtMWhhVzRwSUh0Y2JpQWdJQ0IwYUhKdmR5QnVaWGNnUlhoalpYQjBhVzl1S0NkVmJtdHViM2R1SUhSbGJYQnNZWFJsSUc5aWFtVmpkRG9nSnlBcklIUjVjR1Z2WmlCMFpXMXdiR0YwWlZOd1pXTXBPMXh1SUNCOVhHNWNiaUFnZEdWdGNHeGhkR1ZUY0dWakxtMWhhVzR1WkdWamIzSmhkRzl5SUQwZ2RHVnRjR3hoZEdWVGNHVmpMbTFoYVc1ZlpEdGNibHh1SUNBdkx5Qk9iM1JsT2lCVmMybHVaeUJsYm5ZdVZrMGdjbVZtWlhKbGJtTmxjeUJ5WVhSb1pYSWdkR2hoYmlCc2IyTmhiQ0IyWVhJZ2NtVm1aWEpsYm1ObGN5QjBhSEp2ZFdkb2IzVjBJSFJvYVhNZ2MyVmpkR2x2YmlCMGJ5QmhiR3h2ZDF4dUlDQXZMeUJtYjNJZ1pYaDBaWEp1WVd3Z2RYTmxjbk1nZEc4Z2IzWmxjbkpwWkdVZ2RHaGxjMlVnWVhNZ2NITmxkV1J2TFhOMWNIQnZjblJsWkNCQlVFbHpMbHh1SUNCbGJuWXVWazB1WTJobFkydFNaWFpwYzJsdmJpaDBaVzF3YkdGMFpWTndaV011WTI5dGNHbHNaWElwTzF4dVhHNGdJQzh2SUdKaFkydDNZWEprY3lCamIyMXdZWFJwWW1sc2FYUjVJR1p2Y2lCd2NtVmpiMjF3YVd4bFpDQjBaVzF3YkdGMFpYTWdkMmwwYUNCamIyMXdhV3hsY2kxMlpYSnphVzl1SURjZ0tEdzBMak11TUNsY2JpQWdZMjl1YzNRZ2RHVnRjR3hoZEdWWFlYTlFjbVZqYjIxd2FXeGxaRmRwZEdoRGIyMXdhV3hsY2xZM0lEMWNiaUFnSUNCMFpXMXdiR0YwWlZOd1pXTXVZMjl0Y0dsc1pYSWdKaVlnZEdWdGNHeGhkR1ZUY0dWakxtTnZiWEJwYkdWeVd6QmRJRDA5UFNBM08xeHVYRzRnSUdaMWJtTjBhVzl1SUdsdWRtOXJaVkJoY25ScFlXeFhjbUZ3Y0dWeUtIQmhjblJwWVd3c0lHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcElIdGNiaUFnSUNCcFppQW9iM0IwYVc5dWN5NW9ZWE5vS1NCN1hHNGdJQ0FnSUNCamIyNTBaWGgwSUQwZ1ZYUnBiSE11WlhoMFpXNWtLSHQ5TENCamIyNTBaWGgwTENCdmNIUnBiMjV6TG1oaGMyZ3BPMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11YVdSektTQjdYRzRnSUNBZ0lDQWdJRzl3ZEdsdmJuTXVhV1J6V3pCZElEMGdkSEoxWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjR0Z5ZEdsaGJDQTlJR1Z1ZGk1V1RTNXlaWE52YkhabFVHRnlkR2xoYkM1allXeHNLSFJvYVhNc0lIQmhjblJwWVd3c0lHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcE8xeHVYRzRnSUNBZ2JHVjBJR1Y0ZEdWdVpHVmtUM0IwYVc5dWN5QTlJRlYwYVd4ekxtVjRkR1Z1WkNoN2ZTd2diM0IwYVc5dWN5d2dlMXh1SUNBZ0lDQWdhRzl2YTNNNklIUm9hWE11YUc5dmEzTXNYRzRnSUNBZ0lDQndjbTkwYjBGalkyVnpjME52Ym5SeWIydzZJSFJvYVhNdWNISnZkRzlCWTJObGMzTkRiMjUwY205c1hHNGdJQ0FnZlNrN1hHNWNiaUFnSUNCc1pYUWdjbVZ6ZFd4MElEMGdaVzUyTGxaTkxtbHVkbTlyWlZCaGNuUnBZV3d1WTJGc2JDaGNiaUFnSUNBZ0lIUm9hWE1zWEc0Z0lDQWdJQ0J3WVhKMGFXRnNMRnh1SUNBZ0lDQWdZMjl1ZEdWNGRDeGNiaUFnSUNBZ0lHVjRkR1Z1WkdWa1QzQjBhVzl1YzF4dUlDQWdJQ2s3WEc1Y2JpQWdJQ0JwWmlBb2NtVnpkV3gwSUQwOUlHNTFiR3dnSmlZZ1pXNTJMbU52YlhCcGJHVXBJSHRjYmlBZ0lDQWdJRzl3ZEdsdmJuTXVjR0Z5ZEdsaGJITmJiM0IwYVc5dWN5NXVZVzFsWFNBOUlHVnVkaTVqYjIxd2FXeGxLRnh1SUNBZ0lDQWdJQ0J3WVhKMGFXRnNMRnh1SUNBZ0lDQWdJQ0IwWlcxd2JHRjBaVk53WldNdVkyOXRjR2xzWlhKUGNIUnBiMjV6TEZ4dUlDQWdJQ0FnSUNCbGJuWmNiaUFnSUNBZ0lDazdYRzRnSUNBZ0lDQnlaWE4xYkhRZ1BTQnZjSFJwYjI1ekxuQmhjblJwWVd4elcyOXdkR2x2Ym5NdWJtRnRaVjBvWTI5dWRHVjRkQ3dnWlhoMFpXNWtaV1JQY0hScGIyNXpLVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLSEpsYzNWc2RDQWhQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQnBaaUFvYjNCMGFXOXVjeTVwYm1SbGJuUXBJSHRjYmlBZ0lDQWdJQ0FnYkdWMElHeHBibVZ6SUQwZ2NtVnpkV3gwTG5Od2JHbDBLQ2RjWEc0bktUdGNiaUFnSUNBZ0lDQWdabTl5SUNoc1pYUWdhU0E5SURBc0lHd2dQU0JzYVc1bGN5NXNaVzVuZEdnN0lHa2dQQ0JzT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9JV3hwYm1WelcybGRJQ1ltSUdrZ0t5QXhJRDA5UFNCc0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0JzYVc1bGMxdHBYU0E5SUc5d2RHbHZibk11YVc1a1pXNTBJQ3NnYkdsdVpYTmJhVjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2JHbHVaWE11YW05cGJpZ25YRnh1SnlrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYaGpaWEIwYVc5dUtGeHVJQ0FnSUNBZ0lDQW5WR2hsSUhCaGNuUnBZV3dnSnlBclhHNGdJQ0FnSUNBZ0lDQWdiM0IwYVc5dWN5NXVZVzFsSUN0Y2JpQWdJQ0FnSUNBZ0lDQW5JR052ZFd4a0lHNXZkQ0JpWlNCamIyMXdhV3hsWkNCM2FHVnVJSEoxYm01cGJtY2dhVzRnY25WdWRHbHRaUzF2Ym14NUlHMXZaR1VuWEc0Z0lDQWdJQ0FwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4dklFcDFjM1FnWVdSa0lIZGhkR1Z5WEc0Z0lHeGxkQ0JqYjI1MFlXbHVaWElnUFNCN1hHNGdJQ0FnYzNSeWFXTjBPaUJtZFc1amRHbHZiaWh2WW1vc0lHNWhiV1VzSUd4dll5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGdlltb2dmSHdnSVNodVlXMWxJR2x1SUc5aWFpa3BJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWNFkyVndkR2x2YmlnblhDSW5JQ3NnYm1GdFpTQXJJQ2RjSWlCdWIzUWdaR1ZtYVc1bFpDQnBiaUFuSUNzZ2IySnFMQ0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHOWpPaUJzYjJOY2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z1kyOXVkR0ZwYm1WeUxteHZiMnQxY0ZCeWIzQmxjblI1S0c5aWFpd2dibUZ0WlNrN1hHNGdJQ0FnZlN4Y2JpQWdJQ0JzYjI5cmRYQlFjbTl3WlhKMGVUb2dablZ1WTNScGIyNG9jR0Z5Wlc1MExDQndjbTl3WlhKMGVVNWhiV1VwSUh0Y2JpQWdJQ0FnSUd4bGRDQnlaWE4xYkhRZ1BTQndZWEpsYm5SYmNISnZjR1Z5ZEhsT1lXMWxYVHRjYmlBZ0lDQWdJR2xtSUNoeVpYTjFiSFFnUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdhV1lnS0U5aWFtVmpkQzV3Y205MGIzUjVjR1V1YUdGelQzZHVVSEp2Y0dWeWRIa3VZMkZzYkNod1lYSmxiblFzSUhCeWIzQmxjblI1VG1GdFpTa3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0hKbGMzVnNkRWx6UVd4c2IzZGxaQ2h5WlhOMWJIUXNJR052Ym5SaGFXNWxjaTV3Y205MGIwRmpZMlZ6YzBOdmJuUnliMndzSUhCeWIzQmxjblI1VG1GdFpTa3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lISmxkSFZ5YmlCMWJtUmxabWx1WldRN1hHNGdJQ0FnZlN4Y2JpQWdJQ0JzYjI5cmRYQTZJR1oxYm1OMGFXOXVLR1JsY0hSb2N5d2dibUZ0WlNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYkdWdUlEMGdaR1Z3ZEdoekxteGxibWQwYUR0Y2JpQWdJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JHVnVPeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdiR1YwSUhKbGMzVnNkQ0E5SUdSbGNIUm9jMXRwWFNBbUppQmpiMjUwWVdsdVpYSXViRzl2YTNWd1VISnZjR1Z5ZEhrb1pHVndkR2h6VzJsZExDQnVZVzFsS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLSEpsYzNWc2RDQWhQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1JsY0hSb2MxdHBYVnR1WVcxbFhUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMHNYRzRnSUNBZ2JHRnRZbVJoT2lCbWRXNWpkR2x2YmloamRYSnlaVzUwTENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEhsd1pXOW1JR04xY25KbGJuUWdQVDA5SUNkbWRXNWpkR2x2YmljZ1B5QmpkWEp5Wlc1MExtTmhiR3dvWTI5dWRHVjRkQ2tnT2lCamRYSnlaVzUwTzF4dUlDQWdJSDBzWEc1Y2JpQWdJQ0JsYzJOaGNHVkZlSEJ5WlhOemFXOXVPaUJWZEdsc2N5NWxjMk5oY0dWRmVIQnlaWE56YVc5dUxGeHVJQ0FnSUdsdWRtOXJaVkJoY25ScFlXdzZJR2x1ZG05clpWQmhjblJwWVd4WGNtRndjR1Z5TEZ4dVhHNGdJQ0FnWm00NklHWjFibU4wYVc5dUtHa3BJSHRjYmlBZ0lDQWdJR3hsZENCeVpYUWdQU0IwWlcxd2JHRjBaVk53WldOYmFWMDdYRzRnSUNBZ0lDQnlaWFF1WkdWamIzSmhkRzl5SUQwZ2RHVnRjR3hoZEdWVGNHVmpXMmtnS3lBblgyUW5YVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnlaWFE3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJSEJ5YjJkeVlXMXpPaUJiWFN4Y2JpQWdJQ0J3Y205bmNtRnRPaUJtZFc1amRHbHZiaWhwTENCa1lYUmhMQ0JrWldOc1lYSmxaRUpzYjJOclVHRnlZVzF6TENCaWJHOWphMUJoY21GdGN5d2daR1Z3ZEdoektTQjdYRzRnSUNBZ0lDQnNaWFFnY0hKdlozSmhiVmR5WVhCd1pYSWdQU0IwYUdsekxuQnliMmR5WVcxelcybGRMRnh1SUNBZ0lDQWdJQ0JtYmlBOUlIUm9hWE11Wm00b2FTazdYRzRnSUNBZ0lDQnBaaUFvWkdGMFlTQjhmQ0JrWlhCMGFITWdmSHdnWW14dlkydFFZWEpoYlhNZ2ZId2daR1ZqYkdGeVpXUkNiRzlqYTFCaGNtRnRjeWtnZTF4dUlDQWdJQ0FnSUNCd2NtOW5jbUZ0VjNKaGNIQmxjaUE5SUhkeVlYQlFjbTluY21GdEtGeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNc1hHNGdJQ0FnSUNBZ0lDQWdhU3hjYmlBZ0lDQWdJQ0FnSUNCbWJpeGNiaUFnSUNBZ0lDQWdJQ0JrWVhSaExGeHVJQ0FnSUNBZ0lDQWdJR1JsWTJ4aGNtVmtRbXh2WTJ0UVlYSmhiWE1zWEc0Z0lDQWdJQ0FnSUNBZ1lteHZZMnRRWVhKaGJYTXNYRzRnSUNBZ0lDQWdJQ0FnWkdWd2RHaHpYRzRnSUNBZ0lDQWdJQ2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0NGd2NtOW5jbUZ0VjNKaGNIQmxjaWtnZTF4dUlDQWdJQ0FnSUNCd2NtOW5jbUZ0VjNKaGNIQmxjaUE5SUhSb2FYTXVjSEp2WjNKaGJYTmJhVjBnUFNCM2NtRndVSEp2WjNKaGJTaDBhR2x6TENCcExDQm1iaWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjSEp2WjNKaGJWZHlZWEJ3WlhJN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUdSaGRHRTZJR1oxYm1OMGFXOXVLSFpoYkhWbExDQmtaWEIwYUNrZ2UxeHVJQ0FnSUNBZ2QyaHBiR1VnS0haaGJIVmxJQ1ltSUdSbGNIUm9MUzBwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCMllXeDFaUzVmY0dGeVpXNTBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVYwZFhKdUlIWmhiSFZsTzF4dUlDQWdJSDBzWEc0Z0lDQWdiV1Z5WjJWSlprNWxaV1JsWkRvZ1puVnVZM1JwYjI0b2NHRnlZVzBzSUdOdmJXMXZiaWtnZTF4dUlDQWdJQ0FnYkdWMElHOWlhaUE5SUhCaGNtRnRJSHg4SUdOdmJXMXZianRjYmx4dUlDQWdJQ0FnYVdZZ0tIQmhjbUZ0SUNZbUlHTnZiVzF2YmlBbUppQndZWEpoYlNBaFBUMGdZMjl0Ylc5dUtTQjdYRzRnSUNBZ0lDQWdJRzlpYWlBOUlGVjBhV3h6TG1WNGRHVnVaQ2g3ZlN3Z1kyOXRiVzl1TENCd1lYSmhiU2s3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUhKbGRIVnliaUJ2WW1vN1hHNGdJQ0FnZlN4Y2JpQWdJQ0F2THlCQmJpQmxiWEIwZVNCdlltcGxZM1FnZEc4Z2RYTmxJR0Z6SUhKbGNHeGhZMlZ0Wlc1MElHWnZjaUJ1ZFd4c0xXTnZiblJsZUhSelhHNGdJQ0FnYm5Wc2JFTnZiblJsZUhRNklFOWlhbVZqZEM1elpXRnNLSHQ5S1N4Y2JseHVJQ0FnSUc1dmIzQTZJR1Z1ZGk1V1RTNXViMjl3TEZ4dUlDQWdJR052YlhCcGJHVnlTVzVtYnpvZ2RHVnRjR3hoZEdWVGNHVmpMbU52YlhCcGJHVnlYRzRnSUgwN1hHNWNiaUFnWm5WdVkzUnBiMjRnY21WMEtHTnZiblJsZUhRc0lHOXdkR2x2Ym5NZ1BTQjdmU2tnZTF4dUlDQWdJR3hsZENCa1lYUmhJRDBnYjNCMGFXOXVjeTVrWVhSaE8xeHVYRzRnSUNBZ2NtVjBMbDl6WlhSMWNDaHZjSFJwYjI1ektUdGNiaUFnSUNCcFppQW9JVzl3ZEdsdmJuTXVjR0Z5ZEdsaGJDQW1KaUIwWlcxd2JHRjBaVk53WldNdWRYTmxSR0YwWVNrZ2UxeHVJQ0FnSUNBZ1pHRjBZU0E5SUdsdWFYUkVZWFJoS0dOdmJuUmxlSFFzSUdSaGRHRXBPMXh1SUNBZ0lIMWNiaUFnSUNCc1pYUWdaR1Z3ZEdoekxGeHVJQ0FnSUNBZ1lteHZZMnRRWVhKaGJYTWdQU0IwWlcxd2JHRjBaVk53WldNdWRYTmxRbXh2WTJ0UVlYSmhiWE1nUHlCYlhTQTZJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQnBaaUFvZEdWdGNHeGhkR1ZUY0dWakxuVnpaVVJsY0hSb2N5a2dlMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11WkdWd2RHaHpLU0I3WEc0Z0lDQWdJQ0FnSUdSbGNIUm9jeUE5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZENBaFBTQnZjSFJwYjI1ekxtUmxjSFJvYzFzd1hWeHVJQ0FnSUNBZ0lDQWdJQ0FnUHlCYlkyOXVkR1Y0ZEYwdVkyOXVZMkYwS0c5d2RHbHZibk11WkdWd2RHaHpLVnh1SUNBZ0lDQWdJQ0FnSUNBZ09pQnZjSFJwYjI1ekxtUmxjSFJvY3p0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUdSbGNIUm9jeUE5SUZ0amIyNTBaWGgwWFR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJ0WVdsdUtHTnZiblJsZUhRZ0x5b3NJRzl3ZEdsdmJuTXFMeWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJQ2hjYmlBZ0lDQWdJQ0FnSnljZ0sxeHVJQ0FnSUNBZ0lDQjBaVzF3YkdGMFpWTndaV011YldGcGJpaGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWElzWEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZEN4Y2JpQWdJQ0FnSUNBZ0lDQmpiMjUwWVdsdVpYSXVhR1ZzY0dWeWN5eGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1Y0dGeWRHbGhiSE1zWEc0Z0lDQWdJQ0FnSUNBZ1pHRjBZU3hjYmlBZ0lDQWdJQ0FnSUNCaWJHOWphMUJoY21GdGN5eGNiaUFnSUNBZ0lDQWdJQ0JrWlhCMGFITmNiaUFnSUNBZ0lDQWdLVnh1SUNBZ0lDQWdLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnRZV2x1SUQwZ1pYaGxZM1YwWlVSbFkyOXlZWFJ2Y25Nb1hHNGdJQ0FnSUNCMFpXMXdiR0YwWlZOd1pXTXViV0ZwYml4Y2JpQWdJQ0FnSUcxaGFXNHNYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXNYRzRnSUNBZ0lDQnZjSFJwYjI1ekxtUmxjSFJvY3lCOGZDQmJYU3hjYmlBZ0lDQWdJR1JoZEdFc1hHNGdJQ0FnSUNCaWJHOWphMUJoY21GdGMxeHVJQ0FnSUNrN1hHNGdJQ0FnY21WMGRYSnVJRzFoYVc0b1kyOXVkR1Y0ZEN3Z2IzQjBhVzl1Y3lrN1hHNGdJSDFjYmx4dUlDQnlaWFF1YVhOVWIzQWdQU0IwY25WbE8xeHVYRzRnSUhKbGRDNWZjMlYwZFhBZ1BTQm1kVzVqZEdsdmJpaHZjSFJwYjI1ektTQjdYRzRnSUNBZ2FXWWdLQ0Z2Y0hScGIyNXpMbkJoY25ScFlXd3BJSHRjYmlBZ0lDQWdJR3hsZENCdFpYSm5aV1JJWld4d1pYSnpJRDBnVlhScGJITXVaWGgwWlc1a0tIdDlMQ0JsYm5ZdWFHVnNjR1Z5Y3l3Z2IzQjBhVzl1Y3k1b1pXeHdaWEp6S1R0Y2JpQWdJQ0FnSUhkeVlYQklaV3h3WlhKelZHOVFZWE56VEc5dmEzVndVSEp2Y0dWeWRIa29iV1Z5WjJWa1NHVnNjR1Z5Y3l3Z1kyOXVkR0ZwYm1WeUtUdGNiaUFnSUNBZ0lHTnZiblJoYVc1bGNpNW9aV3h3WlhKeklEMGdiV1Z5WjJWa1NHVnNjR1Z5Y3p0Y2JseHVJQ0FnSUNBZ2FXWWdLSFJsYlhCc1lYUmxVM0JsWXk1MWMyVlFZWEowYVdGc0tTQjdYRzRnSUNBZ0lDQWdJQzh2SUZWelpTQnRaWEpuWlVsbVRtVmxaR1ZrSUdobGNtVWdkRzhnY0hKbGRtVnVkQ0JqYjIxd2FXeHBibWNnWjJ4dlltRnNJSEJoY25ScFlXeHpJRzExYkhScGNHeGxJSFJwYldWelhHNGdJQ0FnSUNBZ0lHTnZiblJoYVc1bGNpNXdZWEowYVdGc2N5QTlJR052Ym5SaGFXNWxjaTV0WlhKblpVbG1UbVZsWkdWa0tGeHVJQ0FnSUNBZ0lDQWdJRzl3ZEdsdmJuTXVjR0Z5ZEdsaGJITXNYRzRnSUNBZ0lDQWdJQ0FnWlc1MkxuQmhjblJwWVd4elhHNGdJQ0FnSUNBZ0lDazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnBaaUFvZEdWdGNHeGhkR1ZUY0dWakxuVnpaVkJoY25ScFlXd2dmSHdnZEdWdGNHeGhkR1ZUY0dWakxuVnpaVVJsWTI5eVlYUnZjbk1wSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVkR0ZwYm1WeUxtUmxZMjl5WVhSdmNuTWdQU0JWZEdsc2N5NWxlSFJsYm1Rb1hHNGdJQ0FnSUNBZ0lDQWdlMzBzWEc0Z0lDQWdJQ0FnSUNBZ1pXNTJMbVJsWTI5eVlYUnZjbk1zWEc0Z0lDQWdJQ0FnSUNBZ2IzQjBhVzl1Y3k1a1pXTnZjbUYwYjNKelhHNGdJQ0FnSUNBZ0lDazdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR052Ym5SaGFXNWxjaTVvYjI5cmN5QTlJSHQ5TzF4dUlDQWdJQ0FnWTI5dWRHRnBibVZ5TG5CeWIzUnZRV05qWlhOelEyOXVkSEp2YkNBOUlHTnlaV0YwWlZCeWIzUnZRV05qWlhOelEyOXVkSEp2YkNodmNIUnBiMjV6S1R0Y2JseHVJQ0FnSUNBZ2JHVjBJR3RsWlhCSVpXeHdaWEpKYmtobGJIQmxjbk1nUFZ4dUlDQWdJQ0FnSUNCdmNIUnBiMjV6TG1Gc2JHOTNRMkZzYkhOVWIwaGxiSEJsY2sxcGMzTnBibWNnZkh4Y2JpQWdJQ0FnSUNBZ2RHVnRjR3hoZEdWWFlYTlFjbVZqYjIxd2FXeGxaRmRwZEdoRGIyMXdhV3hsY2xZM08xeHVJQ0FnSUNBZ2JXOTJaVWhsYkhCbGNsUnZTRzl2YTNNb1kyOXVkR0ZwYm1WeUxDQW5hR1ZzY0dWeVRXbHpjMmx1Wnljc0lHdGxaWEJJWld4d1pYSkpia2hsYkhCbGNuTXBPMXh1SUNBZ0lDQWdiVzkyWlVobGJIQmxjbFJ2U0c5dmEzTW9ZMjl1ZEdGcGJtVnlMQ0FuWW14dlkydElaV3h3WlhKTmFYTnphVzVuSnl3Z2EyVmxjRWhsYkhCbGNrbHVTR1ZzY0dWeWN5azdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdOdmJuUmhhVzVsY2k1d2NtOTBiMEZqWTJWemMwTnZiblJ5YjJ3Z1BTQnZjSFJwYjI1ekxuQnliM1J2UVdOalpYTnpRMjl1ZEhKdmJEc2dMeThnYVc1MFpYSnVZV3dnYjNCMGFXOXVYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXVhR1ZzY0dWeWN5QTlJRzl3ZEdsdmJuTXVhR1ZzY0dWeWN6dGNiaUFnSUNBZ0lHTnZiblJoYVc1bGNpNXdZWEowYVdGc2N5QTlJRzl3ZEdsdmJuTXVjR0Z5ZEdsaGJITTdYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXVaR1ZqYjNKaGRHOXljeUE5SUc5d2RHbHZibk11WkdWamIzSmhkRzl5Y3p0Y2JpQWdJQ0FnSUdOdmJuUmhhVzVsY2k1b2IyOXJjeUE5SUc5d2RHbHZibk11YUc5dmEzTTdYRzRnSUNBZ2ZWeHVJQ0I5TzF4dVhHNGdJSEpsZEM1ZlkyaHBiR1FnUFNCbWRXNWpkR2x2YmlocExDQmtZWFJoTENCaWJHOWphMUJoY21GdGN5d2daR1Z3ZEdoektTQjdYRzRnSUNBZ2FXWWdLSFJsYlhCc1lYUmxVM0JsWXk1MWMyVkNiRzlqYTFCaGNtRnRjeUFtSmlBaFlteHZZMnRRWVhKaGJYTXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGZUdObGNIUnBiMjRvSjIxMWMzUWdjR0Z6Y3lCaWJHOWpheUJ3WVhKaGJYTW5LVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLSFJsYlhCc1lYUmxVM0JsWXk1MWMyVkVaWEIwYUhNZ0ppWWdJV1JsY0hSb2N5a2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVY0WTJWd2RHbHZiaWduYlhWemRDQndZWE56SUhCaGNtVnVkQ0JrWlhCMGFITW5LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFIxY200Z2QzSmhjRkJ5YjJkeVlXMG9YRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXNYRzRnSUNBZ0lDQnBMRnh1SUNBZ0lDQWdkR1Z0Y0d4aGRHVlRjR1ZqVzJsZExGeHVJQ0FnSUNBZ1pHRjBZU3hjYmlBZ0lDQWdJREFzWEc0Z0lDQWdJQ0JpYkc5amExQmhjbUZ0Y3l4Y2JpQWdJQ0FnSUdSbGNIUm9jMXh1SUNBZ0lDazdYRzRnSUgwN1hHNGdJSEpsZEhWeWJpQnlaWFE3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQjNjbUZ3VUhKdlozSmhiU2hjYmlBZ1kyOXVkR0ZwYm1WeUxGeHVJQ0JwTEZ4dUlDQm1iaXhjYmlBZ1pHRjBZU3hjYmlBZ1pHVmpiR0Z5WldSQ2JHOWphMUJoY21GdGN5eGNiaUFnWW14dlkydFFZWEpoYlhNc1hHNGdJR1JsY0hSb2MxeHVLU0I3WEc0Z0lHWjFibU4wYVc5dUlIQnliMmNvWTI5dWRHVjRkQ3dnYjNCMGFXOXVjeUE5SUh0OUtTQjdYRzRnSUNBZ2JHVjBJR04xY25KbGJuUkVaWEIwYUhNZ1BTQmtaWEIwYUhNN1hHNGdJQ0FnYVdZZ0tGeHVJQ0FnSUNBZ1pHVndkR2h6SUNZbVhHNGdJQ0FnSUNCamIyNTBaWGgwSUNFOUlHUmxjSFJvYzFzd1hTQW1KbHh1SUNBZ0lDQWdJU2hqYjI1MFpYaDBJRDA5UFNCamIyNTBZV2x1WlhJdWJuVnNiRU52Ym5SbGVIUWdKaVlnWkdWd2RHaHpXekJkSUQwOVBTQnVkV3hzS1Z4dUlDQWdJQ2tnZTF4dUlDQWdJQ0FnWTNWeWNtVnVkRVJsY0hSb2N5QTlJRnRqYjI1MFpYaDBYUzVqYjI1allYUW9aR1Z3ZEdoektUdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnWm00b1hHNGdJQ0FnSUNCamIyNTBZV2x1WlhJc1hHNGdJQ0FnSUNCamIyNTBaWGgwTEZ4dUlDQWdJQ0FnWTI5dWRHRnBibVZ5TG1obGJIQmxjbk1zWEc0Z0lDQWdJQ0JqYjI1MFlXbHVaWEl1Y0dGeWRHbGhiSE1zWEc0Z0lDQWdJQ0J2Y0hScGIyNXpMbVJoZEdFZ2ZId2daR0YwWVN4Y2JpQWdJQ0FnSUdKc2IyTnJVR0Z5WVcxeklDWW1JRnR2Y0hScGIyNXpMbUpzYjJOclVHRnlZVzF6WFM1amIyNWpZWFFvWW14dlkydFFZWEpoYlhNcExGeHVJQ0FnSUNBZ1kzVnljbVZ1ZEVSbGNIUm9jMXh1SUNBZ0lDazdYRzRnSUgxY2JseHVJQ0J3Y205bklEMGdaWGhsWTNWMFpVUmxZMjl5WVhSdmNuTW9abTRzSUhCeWIyY3NJR052Ym5SaGFXNWxjaXdnWkdWd2RHaHpMQ0JrWVhSaExDQmliRzlqYTFCaGNtRnRjeWs3WEc1Y2JpQWdjSEp2Wnk1d2NtOW5jbUZ0SUQwZ2FUdGNiaUFnY0hKdlp5NWtaWEIwYUNBOUlHUmxjSFJvY3lBL0lHUmxjSFJvY3k1c1pXNW5kR2dnT2lBd08xeHVJQ0J3Y205bkxtSnNiMk5yVUdGeVlXMXpJRDBnWkdWamJHRnlaV1JDYkc5amExQmhjbUZ0Y3lCOGZDQXdPMXh1SUNCeVpYUjFjbTRnY0hKdlp6dGNibjFjYmx4dUx5b3FYRzRnS2lCVWFHbHpJR2x6SUdOMWNuSmxiblJzZVNCd1lYSjBJRzltSUhSb1pTQnZabVpwWTJsaGJDQkJVRWtzSUhSb1pYSmxabTl5WlNCcGJYQnNaVzFsYm5SaGRHbHZiaUJrWlhSaGFXeHpJSE5vYjNWc1pDQnViM1FnWW1VZ1kyaGhibWRsWkM1Y2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVlFZWEowYVdGc0tIQmhjblJwWVd3c0lHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcElIdGNiaUFnYVdZZ0tDRndZWEowYVdGc0tTQjdYRzRnSUNBZ2FXWWdLRzl3ZEdsdmJuTXVibUZ0WlNBOVBUMGdKMEJ3WVhKMGFXRnNMV0pzYjJOckp5a2dlMXh1SUNBZ0lDQWdjR0Z5ZEdsaGJDQTlJRzl3ZEdsdmJuTXVaR0YwWVZzbmNHRnlkR2xoYkMxaWJHOWpheWRkTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQndZWEowYVdGc0lEMGdiM0IwYVc5dWN5NXdZWEowYVdGc2MxdHZjSFJwYjI1ekxtNWhiV1ZkTzF4dUlDQWdJSDFjYmlBZ2ZTQmxiSE5sSUdsbUlDZ2hjR0Z5ZEdsaGJDNWpZV3hzSUNZbUlDRnZjSFJwYjI1ekxtNWhiV1VwSUh0Y2JpQWdJQ0F2THlCVWFHbHpJR2x6SUdFZ1pIbHVZVzFwWXlCd1lYSjBhV0ZzSUhSb1lYUWdjbVYwZFhKdVpXUWdZU0J6ZEhKcGJtZGNiaUFnSUNCdmNIUnBiMjV6TG01aGJXVWdQU0J3WVhKMGFXRnNPMXh1SUNBZ0lIQmhjblJwWVd3Z1BTQnZjSFJwYjI1ekxuQmhjblJwWVd4elczQmhjblJwWVd4ZE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCd1lYSjBhV0ZzTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdhVzUyYjJ0bFVHRnlkR2xoYkNod1lYSjBhV0ZzTENCamIyNTBaWGgwTENCdmNIUnBiMjV6S1NCN1hHNGdJQzh2SUZWelpTQjBhR1VnWTNWeWNtVnVkQ0JqYkc5emRYSmxJR052Ym5SbGVIUWdkRzhnYzJGMlpTQjBhR1VnY0dGeWRHbGhiQzFpYkc5amF5QnBaaUIwYUdseklIQmhjblJwWVd4Y2JpQWdZMjl1YzNRZ1kzVnljbVZ1ZEZCaGNuUnBZV3hDYkc5amF5QTlJRzl3ZEdsdmJuTXVaR0YwWVNBbUppQnZjSFJwYjI1ekxtUmhkR0ZiSjNCaGNuUnBZV3d0WW14dlkyc25YVHRjYmlBZ2IzQjBhVzl1Y3k1d1lYSjBhV0ZzSUQwZ2RISjFaVHRjYmlBZ2FXWWdLRzl3ZEdsdmJuTXVhV1J6S1NCN1hHNGdJQ0FnYjNCMGFXOXVjeTVrWVhSaExtTnZiblJsZUhSUVlYUm9JRDBnYjNCMGFXOXVjeTVwWkhOYk1GMGdmSHdnYjNCMGFXOXVjeTVrWVhSaExtTnZiblJsZUhSUVlYUm9PMXh1SUNCOVhHNWNiaUFnYkdWMElIQmhjblJwWVd4Q2JHOWphenRjYmlBZ2FXWWdLRzl3ZEdsdmJuTXVabTRnSmlZZ2IzQjBhVzl1Y3k1bWJpQWhQVDBnYm05dmNDa2dlMXh1SUNBZ0lHOXdkR2x2Ym5NdVpHRjBZU0E5SUdOeVpXRjBaVVp5WVcxbEtHOXdkR2x2Ym5NdVpHRjBZU2s3WEc0Z0lDQWdMeThnVjNKaGNIQmxjaUJtZFc1amRHbHZiaUIwYnlCblpYUWdZV05qWlhOeklIUnZJR04xY25KbGJuUlFZWEowYVdGc1FteHZZMnNnWm5KdmJTQjBhR1VnWTJ4dmMzVnlaVnh1SUNBZ0lHeGxkQ0JtYmlBOUlHOXdkR2x2Ym5NdVptNDdYRzRnSUNBZ2NHRnlkR2xoYkVKc2IyTnJJRDBnYjNCMGFXOXVjeTVrWVhSaFd5ZHdZWEowYVdGc0xXSnNiMk5ySjEwZ1BTQm1kVzVqZEdsdmJpQndZWEowYVdGc1FteHZZMnRYY21Gd2NHVnlLRnh1SUNBZ0lDQWdZMjl1ZEdWNGRDeGNiaUFnSUNBZ0lHOXdkR2x2Ym5NZ1BTQjdmVnh1SUNBZ0lDa2dlMXh1SUNBZ0lDQWdMeThnVW1WemRHOXlaU0IwYUdVZ2NHRnlkR2xoYkMxaWJHOWpheUJtY205dElIUm9aU0JqYkc5emRYSmxJR1p2Y2lCMGFHVWdaWGhsWTNWMGFXOXVJRzltSUhSb1pTQmliRzlqYTF4dUlDQWdJQ0FnTHk4Z2FTNWxMaUIwYUdVZ2NHRnlkQ0JwYm5OcFpHVWdkR2hsSUdKc2IyTnJJRzltSUhSb1pTQndZWEowYVdGc0lHTmhiR3d1WEc0Z0lDQWdJQ0J2Y0hScGIyNXpMbVJoZEdFZ1BTQmpjbVZoZEdWR2NtRnRaU2h2Y0hScGIyNXpMbVJoZEdFcE8xeHVJQ0FnSUNBZ2IzQjBhVzl1Y3k1a1lYUmhXeWR3WVhKMGFXRnNMV0pzYjJOckoxMGdQU0JqZFhKeVpXNTBVR0Z5ZEdsaGJFSnNiMk5yTzF4dUlDQWdJQ0FnY21WMGRYSnVJR1p1S0dOdmJuUmxlSFFzSUc5d2RHbHZibk1wTzF4dUlDQWdJSDA3WEc0Z0lDQWdhV1lnS0dadUxuQmhjblJwWVd4ektTQjdYRzRnSUNBZ0lDQnZjSFJwYjI1ekxuQmhjblJwWVd4eklEMGdWWFJwYkhNdVpYaDBaVzVrS0h0OUxDQnZjSFJwYjI1ekxuQmhjblJwWVd4ekxDQm1iaTV3WVhKMGFXRnNjeWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnYVdZZ0tIQmhjblJwWVd3Z1BUMDlJSFZ1WkdWbWFXNWxaQ0FtSmlCd1lYSjBhV0ZzUW14dlkyc3BJSHRjYmlBZ0lDQndZWEowYVdGc0lEMGdjR0Z5ZEdsaGJFSnNiMk5yTzF4dUlDQjlYRzVjYmlBZ2FXWWdLSEJoY25ScFlXd2dQVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmVHTmxjSFJwYjI0b0oxUm9aU0J3WVhKMGFXRnNJQ2NnS3lCdmNIUnBiMjV6TG01aGJXVWdLeUFuSUdOdmRXeGtJRzV2ZENCaVpTQm1iM1Z1WkNjcE8xeHVJQ0I5SUdWc2MyVWdhV1lnS0hCaGNuUnBZV3dnYVc1emRHRnVZMlZ2WmlCR2RXNWpkR2x2YmlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ3WVhKMGFXRnNLR052Ym5SbGVIUXNJRzl3ZEdsdmJuTXBPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ1YjI5d0tDa2dlMXh1SUNCeVpYUjFjbTRnSnljN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdsdWFYUkVZWFJoS0dOdmJuUmxlSFFzSUdSaGRHRXBJSHRjYmlBZ2FXWWdLQ0ZrWVhSaElIeDhJQ0VvSjNKdmIzUW5JR2x1SUdSaGRHRXBLU0I3WEc0Z0lDQWdaR0YwWVNBOUlHUmhkR0VnUHlCamNtVmhkR1ZHY21GdFpTaGtZWFJoS1NBNklIdDlPMXh1SUNBZ0lHUmhkR0V1Y205dmRDQTlJR052Ym5SbGVIUTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHUmhkR0U3WEc1OVhHNWNibVoxYm1OMGFXOXVJR1Y0WldOMWRHVkVaV052Y21GMGIzSnpLR1p1TENCd2NtOW5MQ0JqYjI1MFlXbHVaWElzSUdSbGNIUm9jeXdnWkdGMFlTd2dZbXh2WTJ0UVlYSmhiWE1wSUh0Y2JpQWdhV1lnS0dadUxtUmxZMjl5WVhSdmNpa2dlMXh1SUNBZ0lHeGxkQ0J3Y205d2N5QTlJSHQ5TzF4dUlDQWdJSEJ5YjJjZ1BTQm1iaTVrWldOdmNtRjBiM0lvWEc0Z0lDQWdJQ0J3Y205bkxGeHVJQ0FnSUNBZ2NISnZjSE1zWEc0Z0lDQWdJQ0JqYjI1MFlXbHVaWElzWEc0Z0lDQWdJQ0JrWlhCMGFITWdKaVlnWkdWd2RHaHpXekJkTEZ4dUlDQWdJQ0FnWkdGMFlTeGNiaUFnSUNBZ0lHSnNiMk5yVUdGeVlXMXpMRnh1SUNBZ0lDQWdaR1Z3ZEdoelhHNGdJQ0FnS1R0Y2JpQWdJQ0JWZEdsc2N5NWxlSFJsYm1Rb2NISnZaeXdnY0hKdmNITXBPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQndjbTluTzF4dWZWeHVYRzVtZFc1amRHbHZiaUIzY21Gd1NHVnNjR1Z5YzFSdlVHRnpjMHh2YjJ0MWNGQnliM0JsY25SNUtHMWxjbWRsWkVobGJIQmxjbk1zSUdOdmJuUmhhVzVsY2lrZ2UxeHVJQ0JQWW1wbFkzUXVhMlY1Y3lodFpYSm5aV1JJWld4d1pYSnpLUzVtYjNKRllXTm9LR2hsYkhCbGNrNWhiV1VnUFQ0Z2UxeHVJQ0FnSUd4bGRDQm9aV3h3WlhJZ1BTQnRaWEpuWldSSVpXeHdaWEp6VzJobGJIQmxjazVoYldWZE8xeHVJQ0FnSUcxbGNtZGxaRWhsYkhCbGNuTmJhR1ZzY0dWeVRtRnRaVjBnUFNCd1lYTnpURzl2YTNWd1VISnZjR1Z5ZEhsUGNIUnBiMjRvYUdWc2NHVnlMQ0JqYjI1MFlXbHVaWElwTzF4dUlDQjlLVHRjYm4xY2JseHVablZ1WTNScGIyNGdjR0Z6YzB4dmIydDFjRkJ5YjNCbGNuUjVUM0IwYVc5dUtHaGxiSEJsY2l3Z1kyOXVkR0ZwYm1WeUtTQjdYRzRnSUdOdmJuTjBJR3h2YjJ0MWNGQnliM0JsY25SNUlEMGdZMjl1ZEdGcGJtVnlMbXh2YjJ0MWNGQnliM0JsY25SNU8xeHVJQ0J5WlhSMWNtNGdkM0poY0VobGJIQmxjaWhvWld4d1pYSXNJRzl3ZEdsdmJuTWdQVDRnZTF4dUlDQWdJSEpsZEhWeWJpQlZkR2xzY3k1bGVIUmxibVFvZXlCc2IyOXJkWEJRY205d1pYSjBlU0I5TENCdmNIUnBiMjV6S1R0Y2JpQWdmU2s3WEc1OVhHNGlYWDA9XG4iLAogICAgIi8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChIYW5kbGViYXJzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9nbG9iYWx0aGlzXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygnX19tYWdpY19fJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gICAgX19tYWdpY19fLmdsb2JhbFRoaXMgPSBfX21hZ2ljX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX21hZ2ljX187XG4gIH0pKCk7XG5cbiAgdmFyICRIYW5kbGViYXJzID0gZ2xvYmFsVGhpcy5IYW5kbGViYXJzO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5IYW5kbGViYXJzID09PSBIYW5kbGViYXJzKSB7XG4gICAgICBnbG9iYWxUaGlzLkhhbmRsZWJhcnMgPSAkSGFuZGxlYmFycztcbiAgICB9XG4gICAgcmV0dXJuIEhhbmRsZWJhcnM7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDI1dkxXTnZibVpzYVdOMExtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3TzNGQ1FVTmxMRlZCUVZNc1ZVRkJWU3hGUVVGRk96czdRVUZIYkVNc1IwRkJReXhaUVVGWE8wRkJRMVlzVVVGQlNTeFBRVUZQTEZWQlFWVXNTMEZCU3l4UlFVRlJMRVZCUVVVc1QwRkJUenRCUVVNelF5eFZRVUZOTEVOQlFVTXNVMEZCVXl4RFFVRkRMR2RDUVVGblFpeERRVUZETEZkQlFWY3NSVUZCUlN4WlFVRlhPMEZCUTNoRUxHRkJRVThzU1VGQlNTeERRVUZETzB0QlEySXNRMEZCUXl4RFFVRkRPMEZCUTBnc1lVRkJVeXhEUVVGRExGVkJRVlVzUjBGQlJ5eFRRVUZUTEVOQlFVTTdRVUZEYWtNc1YwRkJUeXhOUVVGTkxFTkJRVU1zVTBGQlV5eERRVUZETEZOQlFWTXNRMEZCUXp0SFFVTnVReXhEUVVGQkxFVkJRVWNzUTBGQlF6czdRVUZGVEN4TlFVRk5MRmRCUVZjc1IwRkJSeXhWUVVGVkxFTkJRVU1zVlVGQlZTeERRVUZET3pzN1FVRkhNVU1zV1VGQlZTeERRVUZETEZWQlFWVXNSMEZCUnl4WlFVRlhPMEZCUTJwRExGRkJRVWtzVlVGQlZTeERRVUZETEZWQlFWVXNTMEZCU3l4VlFVRlZMRVZCUVVVN1FVRkRlRU1zWjBKQlFWVXNRMEZCUXl4VlFVRlZMRWRCUVVjc1YwRkJWeXhEUVVGRE8wdEJRM0pETzBGQlEwUXNWMEZCVHl4VlFVRlZMRU5CUVVNN1IwRkRia0lzUTBGQlF6dERRVU5JSWl3aVptbHNaU0k2SW01dkxXTnZibVpzYVdOMExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvZ1oyeHZZbUZzSUdkc2IySmhiRlJvYVhNZ0tpOWNibVY0Y0c5eWRDQmtaV1poZFd4MElHWjFibU4wYVc5dUtFaGhibVJzWldKaGNuTXBJSHRjYmlBZ0x5b2dhWE4wWVc1aWRXd2dhV2R1YjNKbElHNWxlSFFnS2k5Y2JpQWdMeThnYUhSMGNITTZMeTl0WVhSb2FXRnpZbmx1Wlc1ekxtSmxMMjV2ZEdWekwyZHNiMkpoYkhSb2FYTmNiaUFnS0daMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ1oyeHZZbUZzVkdocGN5QTlQVDBnSjI5aWFtVmpkQ2NwSUhKbGRIVnlianRjYmlBZ0lDQlBZbXBsWTNRdWNISnZkRzkwZVhCbExsOWZaR1ZtYVc1bFIyVjBkR1Z5WDE4b0oxOWZiV0ZuYVdOZlh5Y3NJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJQ0FnZlNrN1hHNGdJQ0FnWDE5dFlXZHBZMTlmTG1kc2IySmhiRlJvYVhNZ1BTQmZYMjFoWjJsalgxODdJQzh2SUdWemJHbHVkQzFrYVhOaFlteGxMV3hwYm1VZ2JtOHRkVzVrWldaY2JpQWdJQ0JrWld4bGRHVWdUMkpxWldOMExuQnliM1J2ZEhsd1pTNWZYMjFoWjJsalgxODdYRzRnSUgwcEtDazdYRzVjYmlBZ1kyOXVjM1FnSkVoaGJtUnNaV0poY25NZ1BTQm5iRzlpWVd4VWFHbHpMa2hoYm1Sc1pXSmhjbk03WEc1Y2JpQWdMeW9nYVhOMFlXNWlkV3dnYVdkdWIzSmxJRzVsZUhRZ0tpOWNiaUFnU0dGdVpHeGxZbUZ5Y3k1dWIwTnZibVpzYVdOMElEMGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdhV1lnS0dkc2IySmhiRlJvYVhNdVNHRnVaR3hsWW1GeWN5QTlQVDBnU0dGdVpHeGxZbUZ5Y3lrZ2UxeHVJQ0FnSUNBZ1oyeHZZbUZzVkdocGN5NUlZVzVrYkdWaVlYSnpJRDBnSkVoaGJtUnNaV0poY25NN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQklZVzVrYkdWaVlYSnpPMXh1SUNCOU8xeHVmVnh1SWwxOVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4vLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmpbJ2RlZmF1bHQnXSA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbnZhciBfaGFuZGxlYmFyc0Jhc2UgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvYmFzZScpO1xuXG52YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7XG5cbi8vIEVhY2ggb2YgdGhlc2UgYXVnbWVudCB0aGUgSGFuZGxlYmFycyBvYmplY3QuIE5vIG5lZWQgdG8gc2V0dXAgaGVyZS5cbi8vIChUaGlzIGlzIGRvbmUgdG8gZWFzaWx5IHNoYXJlIGNvZGUgYmV0d2VlbiBjb21tb25qcyBhbmQgYnJvd3NlIGVudnMpXG5cbnZhciBfaGFuZGxlYmFyc1NhZmVTdHJpbmcgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvc2FmZS1zdHJpbmcnKTtcblxudmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7XG5cbnZhciBfaGFuZGxlYmFyc0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9leGNlcHRpb24nKTtcblxudmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNFeGNlcHRpb24pO1xuXG52YXIgX2hhbmRsZWJhcnNVdGlscyA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy91dGlscycpO1xuXG52YXIgVXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGFuZGxlYmFyc1V0aWxzKTtcblxudmFyIF9oYW5kbGViYXJzUnVudGltZSA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9ydW50aW1lJyk7XG5cbnZhciBydW50aW1lID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2hhbmRsZWJhcnNSdW50aW1lKTtcblxudmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9uby1jb25mbGljdCcpO1xuXG52YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTtcblxuLy8gRm9yIGNvbXBhdGliaWxpdHkgYW5kIHVzYWdlIG91dHNpZGUgb2YgbW9kdWxlIHN5c3RlbXMsIG1ha2UgdGhlIEhhbmRsZWJhcnMgb2JqZWN0IGEgbmFtZXNwYWNlXG5mdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBoYiA9IG5ldyBiYXNlLkhhbmRsZWJhcnNFbnZpcm9ubWVudCgpO1xuXG4gIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7XG4gIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107XG4gIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddO1xuICBoYi5VdGlscyA9IFV0aWxzO1xuICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjtcblxuICBoYi5WTSA9IHJ1bnRpbWU7XG4gIGhiLnRlbXBsYXRlID0gZnVuY3Rpb24gKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG52YXIgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbl9oYW5kbGViYXJzTm9Db25mbGljdDJbJ2RlZmF1bHQnXShpbnN0KTtcblxuaW5zdFsnZGVmYXVsdCddID0gaW5zdDtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekxuSjFiblJwYldVdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN096czdPRUpCUVhOQ0xHMUNRVUZ0UWpzN1NVRkJOMElzU1VGQlNUczdPenM3YjBOQlNVOHNNRUpCUVRCQ096czdPMjFEUVVNelFpeDNRa0ZCZDBJN096czdLMEpCUTNaQ0xHOUNRVUZ2UWpzN1NVRkJMMElzUzBGQlN6czdhVU5CUTFFc2MwSkJRWE5DT3p0SlFVRnVReXhQUVVGUE96dHZRMEZGU1N3d1FrRkJNRUk3T3pzN08wRkJSMnBFTEZOQlFWTXNUVUZCVFN4SFFVRkhPMEZCUTJoQ0xFMUJRVWtzUlVGQlJTeEhRVUZITEVsQlFVa3NTVUZCU1N4RFFVRkRMSEZDUVVGeFFpeEZRVUZGTEVOQlFVTTdPMEZCUlRGRExFOUJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRM1pDTEVsQlFVVXNRMEZCUXl4VlFVRlZMRzlEUVVGaExFTkJRVU03UVVGRE0wSXNTVUZCUlN4RFFVRkRMRk5CUVZNc2JVTkJRVmtzUTBGQlF6dEJRVU42UWl4SlFVRkZMRU5CUVVNc1MwRkJTeXhIUVVGSExFdEJRVXNzUTBGQlF6dEJRVU5xUWl4SlFVRkZMRU5CUVVNc1owSkJRV2RDTEVkQlFVY3NTMEZCU3l4RFFVRkRMR2RDUVVGblFpeERRVUZET3p0QlFVVTNReXhKUVVGRkxFTkJRVU1zUlVGQlJTeEhRVUZITEU5QlFVOHNRMEZCUXp0QlFVTm9RaXhKUVVGRkxFTkJRVU1zVVVGQlVTeEhRVUZITEZWQlFWTXNTVUZCU1N4RlFVRkZPMEZCUXpOQ0xGZEJRVThzVDBGQlR5eERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU03UjBGRGJrTXNRMEZCUXpzN1FVRkZSaXhUUVVGUExFVkJRVVVzUTBGQlF6dERRVU5ZT3p0QlFVVkVMRWxCUVVrc1NVRkJTU3hIUVVGSExFMUJRVTBzUlVGQlJTeERRVUZETzBGQlEzQkNMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzVFVGQlRTeERRVUZET3p0QlFVVnlRaXhyUTBGQlZ5eEpRVUZKTEVOQlFVTXNRMEZCUXpzN1FVRkZha0lzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJRenM3Y1VKQlJWSXNTVUZCU1NJc0ltWnBiR1VpT2lKb1lXNWtiR1ZpWVhKekxuSjFiblJwYldVdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdLaUJoY3lCaVlYTmxJR1p5YjIwZ0p5NHZhR0Z1Wkd4bFltRnljeTlpWVhObEp6dGNibHh1THk4Z1JXRmphQ0J2WmlCMGFHVnpaU0JoZFdkdFpXNTBJSFJvWlNCSVlXNWtiR1ZpWVhKeklHOWlhbVZqZEM0Z1RtOGdibVZsWkNCMGJ5QnpaWFIxY0NCb1pYSmxMbHh1THk4Z0tGUm9hWE1nYVhNZ1pHOXVaU0IwYnlCbFlYTnBiSGtnYzJoaGNtVWdZMjlrWlNCaVpYUjNaV1Z1SUdOdmJXMXZibXB6SUdGdVpDQmljbTkzYzJVZ1pXNTJjeWxjYm1sdGNHOXlkQ0JUWVdabFUzUnlhVzVuSUdaeWIyMGdKeTR2YUdGdVpHeGxZbUZ5Y3k5ellXWmxMWE4wY21sdVp5YzdYRzVwYlhCdmNuUWdSWGhqWlhCMGFXOXVJR1p5YjIwZ0p5NHZhR0Z1Wkd4bFltRnljeTlsZUdObGNIUnBiMjRuTzF4dWFXMXdiM0owSUNvZ1lYTWdWWFJwYkhNZ1puSnZiU0FuTGk5b1lXNWtiR1ZpWVhKekwzVjBhV3h6Snp0Y2JtbHRjRzl5ZENBcUlHRnpJSEoxYm5ScGJXVWdabkp2YlNBbkxpOW9ZVzVrYkdWaVlYSnpMM0oxYm5ScGJXVW5PMXh1WEc1cGJYQnZjblFnYm05RGIyNW1iR2xqZENCbWNtOXRJQ2N1TDJoaGJtUnNaV0poY25NdmJtOHRZMjl1Wm14cFkzUW5PMXh1WEc0dkx5QkdiM0lnWTI5dGNHRjBhV0pwYkdsMGVTQmhibVFnZFhOaFoyVWdiM1YwYzJsa1pTQnZaaUJ0YjJSMWJHVWdjM2x6ZEdWdGN5d2diV0ZyWlNCMGFHVWdTR0Z1Wkd4bFltRnljeUJ2WW1wbFkzUWdZU0J1WVcxbGMzQmhZMlZjYm1aMWJtTjBhVzl1SUdOeVpXRjBaU2dwSUh0Y2JpQWdiR1YwSUdoaUlEMGdibVYzSUdKaGMyVXVTR0Z1Wkd4bFltRnljMFZ1ZG1seWIyNXRaVzUwS0NrN1hHNWNiaUFnVlhScGJITXVaWGgwWlc1a0tHaGlMQ0JpWVhObEtUdGNiaUFnYUdJdVUyRm1aVk4wY21sdVp5QTlJRk5oWm1WVGRISnBibWM3WEc0Z0lHaGlMa1Y0WTJWd2RHbHZiaUE5SUVWNFkyVndkR2x2Ymp0Y2JpQWdhR0l1VlhScGJITWdQU0JWZEdsc2N6dGNiaUFnYUdJdVpYTmpZWEJsUlhod2NtVnpjMmx2YmlBOUlGVjBhV3h6TG1WelkyRndaVVY0Y0hKbGMzTnBiMjQ3WEc1Y2JpQWdhR0l1VmswZ1BTQnlkVzUwYVcxbE8xeHVJQ0JvWWk1MFpXMXdiR0YwWlNBOUlHWjFibU4wYVc5dUtITndaV01wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdjblZ1ZEdsdFpTNTBaVzF3YkdGMFpTaHpjR1ZqTENCb1lpazdYRzRnSUgwN1hHNWNiaUFnY21WMGRYSnVJR2hpTzF4dWZWeHVYRzVzWlhRZ2FXNXpkQ0E5SUdOeVpXRjBaU2dwTzF4dWFXNXpkQzVqY21WaGRHVWdQU0JqY21WaGRHVTdYRzVjYm01dlEyOXVabXhwWTNRb2FXNXpkQ2s3WEc1Y2JtbHVjM1JiSjJSbFptRjFiSFFuWFNBOUlHbHVjM1E3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdsdWMzUTdYRzRpWFgwPVxuIiwKICAgICIvLyBDcmVhdGUgYSBzaW1wbGUgcGF0aCBhbGlhcyB0byBhbGxvdyBicm93c2VyaWZ5IHRvIHJlc29sdmVcbi8vIHRoZSBydW50aW1lIG9uIGEgc3VwcG9ydGVkIHBhdGguXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGlzdC9janMvaGFuZGxlYmFycy5ydW50aW1lJylbJ2RlZmF1bHQnXTtcbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBJQnJhbmRWZXJzaW9uIHtcbiAgICBicmFuZDogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmdbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJBZ2VudCB7XG4gICAgYnJvd3NlcnM/OiBJQnJhbmRWZXJzaW9uW107XG4gICAgcGxhdGZvcm0/OiBJQnJhbmRWZXJzaW9uO1xuICAgIG1vYmlsZT86IG51bWJlcjtcbiAgICBhcmNoaXRlY3R1cmU/OiBzdHJpbmc7XG4gICAgYml0bmVzcz86IHN0cmluZztcbiAgICBtb2RlbD86IHN0cmluZztcbiAgICBzb3VyY2U/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgY29uc3QgQWdlbnRUeXBlcyA9IHtcbiAgICBTZXNzaW9uOiAxLFxuICAgIERldmljZTogMixcbiAgICBVc2VyOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElVaWQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYXR5cGU/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFaWQge1xuICAgIHNvdXJjZTogc3RyaW5nO1xuICAgIHVpZHM6IElVaWRbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cHBseUNoYWluTm9kZSB7XG4gICAgYXNpPzogc3RyaW5nO1xuICAgIHNpZD86IHN0cmluZztcbiAgICBocD86IG51bWJlcjtcbiAgICByaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdXBwbHlDaGFpbiB7XG4gICAgY29tcGxldGU6IG51bWJlcjtcbiAgICBub2RlczogSVN1cHBseUNoYWluTm9kZVtdO1xuICAgIHZlcjogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbm5lbCB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOZXR3b3JrIHtcbiAgICBpZD86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGRvbWFpbj86IHN0cmluZztcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnQge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhIHtcbiAgICBpZD86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHNlZ21lbnQ/OiBJU2VnbWVudFtdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlciB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgYnV5ZXJ1aWQ/OiBzdHJpbmc7XG4gICAgeW9iPzogbnVtYmVyO1xuICAgIGdlbmRlcj86IHN0cmluZztcbiAgICBrZXl3b3Jkcz86IHN0cmluZztcbiAgICBrd2FycmF5Pzogc3RyaW5nW107XG4gICAgY3VzdG9tZGF0YT86IHN0cmluZztcbiAgICBnZW8/OiBJR2VvO1xuICAgIGRhdGE/OiBJRGF0YVtdO1xuICAgIGNjb25zZW50Pzogc3RyaW5nO1xuICAgIGVpZHM/OiBJRWlkW107XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHZW8ge1xuICAgIGxhdD86IG51bWJlcjtcbiAgICBsb24/OiBudW1iZXI7XG4gICAgdHlwZT86IG51bWJlcjtcbiAgICBhY2N1cmFjeT86IG51bWJlcjtcbiAgICBsYXN0Zml4PzogbnVtYmVyO1xuICAgIGlwc2VydmljZT86IG51bWJlcjtcbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICByZWdpb25maXBzMTA0Pzogc3RyaW5nO1xuICAgIG1ldHJvPzogc3RyaW5nO1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgemlwPzogc3RyaW5nO1xuICAgIHV0Y29mZnNldD86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBBZENvbTEwRGV2aWNlVHlwZXMgPSB7XG4gICAgTW9iaWxlOiAxLFxuICAgIFBDOiAyLFxuICAgIENUVjogMyxcbiAgICBQaG9uZTogNCxcbiAgICBUYWJsZXQ6IDUsXG4gICAgQ29ubmVjdGVkOiA2LFxuICAgIFNldFRvcDogNyxcbiAgICBPT0g6IDhcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURldmljZSB7XG4gICAgdWE/OiBzdHJpbmc7XG4gICAgZ2VvPzogSUdlbztcbiAgICBkbnQ/OiBudW1iZXI7XG4gICAgbG10PzogbnVtYmVyO1xuICAgIGlwPzogc3RyaW5nO1xuICAgIGlwdjY/OiBzdHJpbmc7XG4gICAgZGV2aWNldHlwZT86IG51bWJlcjtcbiAgICBtYWtlPzogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICAgIG9zPzogc3RyaW5nO1xuICAgIG9zdj86IHN0cmluZztcbiAgICBod3Y/OiBzdHJpbmc7XG4gICAgaD86IG51bWJlcjtcbiAgICB3PzogbnVtYmVyO1xuICAgIHBwaT86IG51bWJlcjtcbiAgICBweHJhdGlvPzogbnVtYmVyO1xuICAgIGpzPzogbnVtYmVyO1xuICAgIGdlb2ZldGNoPzogbnVtYmVyO1xuICAgIGZsYXNodmVyPzogc3RyaW5nO1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIGxhbmJnPzogc3RyaW5nO1xuICAgIGNhcnJpZXI/OiBzdHJpbmc7XG4gICAgbWNjbW5jPzogc3RyaW5nO1xuICAgIGNvbm5lY3Rpb250eXBlPzogbnVtYmVyO1xuICAgIGlmYT86IHN0cmluZztcbiAgICBkaWRzaGExPzogc3RyaW5nO1xuICAgIGRpZG1kNT86IHN0cmluZztcbiAgICBkcGlkc2hhMT86IHN0cmluZztcbiAgICBkcGlkbWQ1Pzogc3RyaW5nO1xuICAgIG1hY3NoYTE/OiBzdHJpbmc7XG4gICAgbWFjbWQ1Pzogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbiAgICBzdWE/OiBJVXNlckFnZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9kdWNlciB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjYXR0YXg/OiBudW1iZXJbXTtcbiAgICBjYXQ/OiBzdHJpbmdbXTtcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZW50IHtcbiAgICBpZD86IHN0cmluZztcbiAgICBlcGlzb2RlPzogbnVtYmVyO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNlcmllcz86IHN0cmluZztcbiAgICBzZWFzb24/OiBzdHJpbmc7XG4gICAgYXJ0aXN0Pzogc3RyaW5nO1xuICAgIGdlbnJlPzogc3RyaW5nO1xuICAgIGFsYnVtPzogc3RyaW5nO1xuICAgIGlzcmM/OiBzdHJpbmc7XG4gICAgcHJvZHVjZXI/OiBJUHJvZHVjZXI7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIGNhdHRheD86IG51bWJlcltdO1xuICAgIGNhdD86IHN0cmluZ1tdO1xuICAgIHByb2RxPzogbnVtYmVyO1xuICAgIHZpZGVvcXVhbGl0eT86IG51bWJlcjtcbiAgICBjb250ZXh0PzogbnVtYmVyO1xuICAgIGNvbnRlbnRyYXRpbmc/OiBzdHJpbmc7XG4gICAgdXNlcnJhdGluZz86IHN0cmluZztcbiAgICBxYWdtZWRpYXJhdGluZz86IG51bWJlcjtcbiAgICBrZXl3b3Jkcz86IHN0cmluZztcbiAgICBrd2FycmF5Pzogc3RyaW5nW107XG4gICAgbGl2ZXN0cmVhbT86IG51bWJlcjtcbiAgICBzb3VyY2VyZWxhdGlvbnNoaXA/OiBudW1iZXI7XG4gICAgbGVuPzogbnVtYmVyO1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIGxhbmdiPzogc3RyaW5nO1xuICAgIGVtYmVkZGFibGU/OiBudW1iZXI7XG4gICAgZGF0YT86IElEYXRhW107XG4gICAgbmV0d29yaz86IElOZXR3b3JrO1xuICAgIGNoYW5uZWw/OiBJQ2hhbm5lbDtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVB1Ymxpc2hlciB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjYXR0YXg/OiBudW1iZXJbXTtcbiAgICBjYXQ/OiBzdHJpbmdbXTtcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBcHAge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgYnVuZGxlPzogc3RyaW5nO1xuICAgIGRvbWFpbj86IHN0cmluZztcbiAgICBzdG9yZXVybD86IHN0cmluZztcbiAgICBjYXQ/OiBzdHJpbmdbXTtcbiAgICBzZWN0aW9uY2F0Pzogc3RyaW5nW107XG4gICAgcGFnZWNhdD86IHN0cmluZ1tdO1xuICAgIHZlcj86IHN0cmluZztcbiAgICBwcml2YWN5cG9saWN5PzogbnVtYmVyO1xuICAgIHBhaWQ/OiBudW1iZXI7XG4gICAgcHVibGlzaGVyPzogSVB1Ymxpc2hlcjtcbiAgICBjb250ZW50PzogSUNvbnRlbnQ7XG4gICAga2V5d29yZHM/OiBzdHJpbmc7XG4gICAga3dhcnJheT86IHN0cmluZ1tdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2l0ZSB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgY2F0Pzogc3RyaW5nW107XG4gICAgc2VjdGlvbmNhdD86IHN0cmluZ1tdO1xuICAgIHBhZ2VjYXQ/OiBzdHJpbmdbXTtcbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIHJlZj86IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgbW9iaWxlPzogbnVtYmVyO1xuICAgIHByaXZhY3lwb2xpY3k/OiBudW1iZXI7XG4gICAgcHVibGlzaGVyPzogSVB1Ymxpc2hlcjtcbiAgICBjb250ZW50PzogSUNvbnRlbnQ7XG4gICAga2V5d29yZHM/OiBzdHJpbmc7XG4gICAga3dhcnJheT86IHN0cmluZ1tdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVhbCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBiaWRmbG9vcjogbnVtYmVyO1xuICAgIGJpZGZsb29yY3VyPzogc3RyaW5nO1xuICAgIGF0PzogbnVtYmVyO1xuICAgIHdzZWF0Pzogc3RyaW5nW107XG4gICAgd2Fkb21haW4/OiBzdHJpbmdbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBtcCB7XG4gICAgcHJpdmF0ZV9hdWN0aW9uPzogbnVtYmVyO1xuICAgIGRlYWxzPzogSURlYWxbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1hdCB7XG4gICAgdz86IG51bWJlcjtcbiAgICBoPzogbnVtYmVyO1xuICAgIHdyYXRpbz86IG51bWJlcjtcbiAgICBocmF0aW8/OiBudW1iZXI7XG4gICAgd21pbj86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5hdGl2ZSB7XG4gICAgcmVxdWVzdDogc3RyaW5nO1xuICAgIHZlcj86IHN0cmluZztcbiAgICBhcGk/OiBudW1iZXJbXTtcbiAgICBiYXR0cj86IG51bWJlcltdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXVkaW8ge1xuICAgIG1pbWVzOiBzdHJpbmdbXTtcbiAgICBtaW5kdXJhdGlvbj86IG51bWJlcjtcbiAgICBtYXhkdXJhdGlvbj86IG51bWJlcjtcbiAgICBwb2RkdXI/OiBudW1iZXI7XG4gICAgcHJvdG9jb2xzPzogbnVtYmVyW107XG4gICAgc3RhcnRkZWxheT86IG51bWJlcjtcbiAgICBycWRkdXJzPzogbnVtYmVyW107XG4gICAgcG9kaWQ/OiBzdHJpbmc7XG4gICAgcG9kc2VxPzogbnVtYmVyO1xuICAgIHNlcXVlbmNlPzogbnVtYmVyO1xuICAgIHNsb3RpbnBvZD86IG51bWJlcjtcbiAgICBtaW5jcG1wZXJzZWM/OiBudW1iZXI7XG4gICAgYmF0dHI/OiBudW1iZXJbXTtcbiAgICBtYXhleHRlbmRlZD86IG51bWJlcjtcbiAgICBtaW5iaXRyYXRlPzogbnVtYmVyO1xuICAgIG1heGJpdHJhdGU/OiBudW1iZXI7XG4gICAgZGVsaXZlcnk/OiBudW1iZXJbXTtcbiAgICBjb21wYW5pb25hZD86IElCYW5uZXJbXTtcbiAgICBhcGk/OiBudW1iZXJbXTtcbiAgICBjb21wYW5pb250eXBlPzogbnVtYmVyW107XG4gICAgbWF4c2VxPzogbnVtYmVyO1xuICAgIGZlZWQ/OiBudW1iZXI7XG4gICAgc3RpdGNoZWQ/OiBudW1iZXI7XG4gICAgbnZvbD86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZGVvIHtcbiAgICBtaW1lczogc3RyaW5nW107XG4gICAgbWluZHVyYXRpb24/OiBudW1iZXI7XG4gICAgbWF4ZHVyYXRpb24/OiBudW1iZXI7XG4gICAgc3RhcnRkZWxheT86IG51bWJlcjtcbiAgICBtYXhzZXE/OiBudW1iZXI7XG4gICAgcG9kZHVyPzogbnVtYmVyO1xuICAgIHByb3RvY29scz86IG51bWJlcltdO1xuICAgIHc/OiBudW1iZXI7XG4gICAgaD86IG51bWJlcjtcbiAgICBwb2RpZD86IHN0cmluZztcbiAgICBwb2RzZXE/OiBudW1iZXI7XG4gICAgcnFkZHVycz86IG51bWJlcltdO1xuICAgIHBsYWNlbWVudD86IG51bWJlcjtcbiAgICBsaW5lYXJpdHk/OiBudW1iZXI7XG4gICAgc2tpcD86IG51bWJlcjtcbiAgICBza2lwbWluPzogbnVtYmVyO1xuICAgIHNraXBhZnRlcj86IG51bWJlcjtcbiAgICBzZXF1ZW5jZT86IG51bWJlcjtcbiAgICBzbG90aW5wb2Q/OiBudW1iZXI7XG4gICAgbWluY3BtcGVyc2VjPzogbnVtYmVyO1xuICAgIGJhdHRyPzogbnVtYmVyW107XG4gICAgbWF4ZXh0ZW5kZWQ/OiBudW1iZXI7XG4gICAgbWluYml0cmF0ZT86IG51bWJlcjtcbiAgICBtYXhiaXRyYXRlPzogbnVtYmVyO1xuICAgIGJveGluZ2FsbG93ZWQ/OiBudW1iZXI7XG4gICAgcGxheWJhY2ttZXRob2Q/OiBudW1iZXJbXTtcbiAgICBwbGF5YmFja2VuZD86IG51bWJlcjtcbiAgICBkZWxpdmVyeT86IG51bWJlcltdO1xuICAgIHBvcz86IG51bWJlcjtcbiAgICBjb21wYW5pb25hZD86IElCYW5uZXJbXTtcbiAgICBhcGk/OiBudW1iZXJbXTtcbiAgICBjb21wYW5pb250eXBlPzogbnVtYmVyW107XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCYW5uZXIge1xuICAgIGZvcm1hdD86IElGb3JtYXRbXTtcbiAgICB3PzogbnVtYmVyO1xuICAgIGg/OiBudW1iZXI7XG4gICAgYnR5cGU/OiBudW1iZXJbXTtcbiAgICBiYXR0cj86IG51bWJlcltdO1xuICAgIHBvcz86IG51bWJlcjtcbiAgICBtaW1lcz86IHN0cmluZ1tdO1xuICAgIHRvcGZyYW1lPzogbnVtYmVyO1xuICAgIGV4cGRpcj86IG51bWJlcltdO1xuICAgIGFwaT86IG51bWJlcltdO1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWV0cmljIHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICB2ZW5kb3I/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJbXAge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWV0cmljPzogSU1ldHJpY1tdO1xuICAgIGJhbm5lcj86IElCYW5uZXI7XG4gICAgdmlkZW8/OiBJVmlkZW87XG4gICAgYXVkaW8/OiBJQXVkaW87XG4gICAgbmF0aXZlPzogSU5hdGl2ZTtcbiAgICBwbXA/OiBJUG1wO1xuICAgIGRpc3BsYXltYW5hZ2VyPzogc3RyaW5nO1xuICAgIGRpc3BsYXltYW5hZ2VydmVyPzogc3RyaW5nO1xuICAgIGluc3RsPzogbnVtYmVyO1xuICAgIHRhZ2lkPzogc3RyaW5nO1xuICAgIGJpZGZsb29yPzogbnVtYmVyO1xuICAgIGJpZGZsb29yY3VyPzogc3RyaW5nO1xuICAgIGNsaWNrYnJvd3Nlcj86IG51bWJlcjtcbiAgICBzZWN1cmU/OiBudW1iZXI7XG4gICAgaWZyYW1lYnVzdGVyPzogc3RyaW5nW107XG4gICAgcndkZD86IG51bWJlcjtcbiAgICBzc2FpPzogbnVtYmVyO1xuICAgIGV4cD86IG51bWJlcjtcbiAgICBleHQ/OiBJU3VyZkV4dGVuc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVncyB7XG4gICAgY29wcGE/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xuICAgIGdkcHI/OiBudW1iZXI7XG4gICAgdXNfcHJpdmFjeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU291cmNlIHtcbiAgICBmZD86IG51bWJlcjtcbiAgICB0aWQ/OiBzdHJpbmc7XG4gICAgcGNoYWluPzogc3RyaW5nO1xuICAgIHNjaGFpbj86IElTdXBwbHlDaGFpbjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpZFJlcXVlc3Qge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaW1wOiBJSW1wW107XG4gICAgc2l0ZT86IElTaXRlO1xuICAgIGFwcD86IElBcHA7XG4gICAgZGV2aWNlPzogSURldmljZTtcbiAgICB1c2VyPzogSVVzZXI7XG4gICAgdGVzdD86IG51bWJlcjtcbiAgICBhdD86IG51bWJlcjtcbiAgICB0bWF4PzogbnVtYmVyO1xuICAgIHdzZWF0Pzogc3RyaW5nW107XG4gICAgYnNlYXQ/OiBzdHJpbmdbXTtcbiAgICBhbGxpbXBzPzogbnVtYmVyO1xuICAgIGN1cj86IHN0cmluZ1tdO1xuICAgIHdsYW5nPzogc3RyaW5nW107XG4gICAgd2xhbmdiPzogc3RyaW5nW107XG4gICAgYmNhdD86IHN0cmluZ1tdO1xuICAgIGNhdHRheD86IG51bWJlcltdO1xuICAgIGJhZHY/OiBzdHJpbmdbXTtcbiAgICBiYXBwPzogc3RyaW5nW107XG4gICAgc291cmNlPzogSVNvdXJjZTtcbiAgICByZWdzPzogSVJlZ3M7XG4gICAgZXh0PzogSVN1cmZFeHRlbnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cmZFeHRlbnNpb24ge1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgIHNpdGVJZDogc3RyaW5nO1xuICAgIGNoYW5uZWxJZDogc3RyaW5nO1xuICAgIGxvY2F0aW9uSWQ6IHN0cmluZztcbiAgICB6b25lSWQ6IHN0cmluZztcbiAgICBzdG9yZUlkOiBzdHJpbmc7XG4gICAgcGxhY2VtZW50SWQ6IHN0cmluZztcbiAgICBrZXl3b3Jkcz86IHN0cmluZ1tdXG59O1xuIiwKICAgICJleHBvcnQgY29uc3QgTmF0aXZlUG9zaXRpb24gPSB7XG4gICAgVW5rbm93bjogMCxcbiAgICBBYm92ZVRoZUZvbGQ6IDEsXG4gICAgQmVsb3dUaGVGb2xkOiAzLFxuICAgIEhlYWRlcjogNCxcbiAgICBGb290ZXI6IDUsXG4gICAgU2lkZWJhcjogNixcbiAgICBGdWxsU2NyZWVuOiA3XG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBpbWFnZSB3aXRoaW4gbmF0aXZlIGFkIChpY29uIHZzIG1haW4gaW1hZ2UpXG4gKi9cbmV4cG9ydCBjb25zdCBOYXRpdmVJbWFnZVR5cGVzID0ge1xuICAgIEljb246IDEsXG4gICAgTWFpbjogM1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgdHlwZSBJRCBmb3IgZWFjaCBuYXRpdmUgYXNzZXQgdHlwZS4gSURzIGFib3ZlIDUwMCBhcmUgc3VyZnNpZGUtc3BlY2lmaWMgZmllbGRzLCBhbGxcbiAqIG90aGVycyBhcmUgT3BlblJUQiBOYXRpdmUgQWQgU3BlYyAxLjIgZmllbGRzLlxuICovXG5leHBvcnQgY29uc3QgTmF0aXZlRGF0YVR5cGVzID0ge1xuICAgIFNwb25zb3JlZDogMSxcbiAgICBEZXNjOiAyLFxuICAgIFJhdGluZzogMyxcbiAgICBMaWtlczogNCxcbiAgICBEb3dubG9hZHM6IDUsXG4gICAgUHJpY2U6IDYsXG4gICAgU2FsZVByaWNlOiA3LFxuICAgIFBob25lOiA4LFxuICAgIEFkZHJlc3M6IDksXG4gICAgRGVzYzI6IDEwLFxuICAgIERpc3BsYXlVUkw6IDExLFxuICAgIENUQVRleHQ6IDEyLFxuXG4gICAgLyogU3VyZnNpZGUgU3BlY2lmaWMgY29kZXMgKi9cbiAgICBTdXJmU3RyYWluOiA1MDAsXG4gICAgU3VyZlRIQzogNTAxLFxuICAgIFN1cmZDQkQ6IDUwMixcbiAgICBTdXJmQ2F0ZWdvcnk6IDUwMyxcbiAgICBTdXJmTWV0YVByb2R1Y3Q6IDU5OVxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgSUQgZm9yIGVhY2ggZmllbGQgd2l0aGluIGEgc3VyZnNpZGUgbmF0aXZlIGFkIHJlcXVlc3QuIFRoZSBBc3NldCBJRCBtYXRjaGVzIHRoZSBhc3NldCB0eXBlLCBmb3Igc2ltcGxpY2l0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IE5hdGl2ZUFzc2V0SWQgPSB7XG4gICAgVGl0bGU6IDAsXG4gICAgSW1hZ2U6IDEsXG4gICAgU3BvbnNvcmVkOiAyLFxuICAgIERlc2M6IDMsXG4gICAgUmF0aW5nOiA0LFxuICAgIFByaWNlOiA1LFxuICAgIFNhbGVQcmljZTogNixcbiAgICBEaXNwbGF5VVJMOiA3LFxuICAgIENUQVRleHQ6IDgsXG4gICAgVmlkZW86IDksXG5cbiAgICBTdXJmU3RyYWluOiA1MDAsXG4gICAgU3VyZlRIQzogNTAxLFxuICAgIFN1cmZDQkQ6IDUwMixcbiAgICBTdXJmQ2F0ZWdvcnk6IDUwMyxcbiAgICBTdXJmTWV0YUJyYW5kOiA1OTgsXG4gICAgU3VyZk1ldGFQcm9kdWN0OiA1OTlcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgd2hpY2ggY2FuIGJlIHRyYWNrZWQgYnkgdGhlIG5hdGl2ZSBhZCB1bml0XG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudFR5cGVzID0ge1xuICAgIEltcDogMSxcbiAgICBWaWV3YWJsZU1SQzUwOiAyLFxuICAgIFZpZXdhYmxlTVJDMTAwOiAzLFxuICAgIFZpZXdhYmxlVklERU81MDogNFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgY29udGV4dCBvZiB0aGUgcGFnZSBmb3IgdGhlIG5hdGl2ZSBhZCB1bml0LCBpLmUgd2hhdCB0eXBlIG9mIGNvbnRlbnQgaXMgYmVpbmcgZGlzcGxheWVkXG4gKi9cbmV4cG9ydCBjb25zdCBDb250ZXh0VHlwZXMgPSB7XG4gICAgQ29udGVudDogMSxcbiAgICBTb2NpYWw6IDIsXG4gICAgUHJvZHVjdDogM1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgc3ViLXR5cGUgb2YgdGhlIGNvbnRleHRcbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRleHRTdWJUeXBlcyA9IHtcbiAgICBHZW5lcmFsOiAxMCxcbiAgICBBcnRpY2xlOiAxMSxcbiAgICBWaWRlbzogMTIsXG4gICAgQXVkaW86IDEzLFxuICAgIEltYWdlOiAxNCxcbiAgICBVc2VyR2VuZXJhdGVkOiAxNSxcbiAgICBHZW5lcmFsU29jaWFsOiAyMCxcbiAgICBFbWFpbDogMjEsXG4gICAgQ2hhdDogMjIsXG4gICAgUHJvZHVjdDogMzAsXG4gICAgQXBwbGljYXRpb246IDMxLFxuICAgIFByb2R1Y3RSZXZpZXdzOiAzMlxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgZm9ybWF0IG9mIHRoZSBhZCB1bml0LCBpLmU6IHdoYXQgdHlwZSBvZiBhZCBpcyBiZWluZyBkaXNwbGF5ZWQgYW5kIHdoZXJlXG4gKi9cbmV4cG9ydCBjb25zdCBQbGFjZW1lbnRUeXBlcyA9IHtcbiAgICBJbkZlZWQ6IDEsXG4gICAgQXRvbWljOiAyLFxuICAgIE91dHNpZGVDb3JlOiAzLFxuICAgIFJlY29tbWVuZGF0aW9uOiA0XG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFByZXNldHMgZm9yIGRlZmF1bHQgdmlkZW8gTUlNRSB0eXBlc1xuICovXG5leHBvcnQgY29uc3QgVmlkZW9NaW1lcyA9IHtcbiAgICBNUDQ6ICd2aWRlby9tcDQnLFxuICAgIFdFQk06ICd2aWRlby93ZWJtJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgbWV0aG9kIHVzZWQgdG8gdHJhY2sgZXZlbnRzLCAxeDEgcGl4ZWwgb2YgSmF2YXNjcmlwdCB0YWdcbiAqL1xuZXhwb3J0IGNvbnN0IEV2ZW50VHJhY2tpbmdNZXRob2RzID0ge1xuICAgIEltZzogMSxcbiAgICBKUzogMlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJTmF0aXZlUmVxdWVzdCB7XG4gICAgdmVyPzogc3RyaW5nO1xuICAgIGNvbnRleHQ/OiBudW1iZXI7XG4gICAgY29udGV4dHN1YnR5cGU/OiBudW1iZXI7XG4gICAgcGxjbXR0eXBlPzogbnVtYmVyO1xuICAgIHBsY210Y250PzogbnVtYmVyO1xuICAgIHNlcT86IG51bWJlcjtcbiAgICBhc3NldHM6IElBc3NldE9iamVjdFtdO1xuICAgIGF1cmxzdXBwb3J0PzogbnVtYmVyO1xuICAgIGR1cmxzdXBwb3J0PzogbnVtYmVyO1xuICAgIGV2ZW50dHJhY2tlcnM/OiBJRXZlbnRUcmFja2VyUmVxdWVzdE9iamVjdFtdO1xuICAgIHByaXZhY3k/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBc3NldE9iamVjdCB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICByZXF1aXJlZD86IG51bWJlcjtcbiAgICB0aXRsZT86IElUaXRsZVJlcXVlc3RPYmplY3Q7XG4gICAgaW1nPzogSUltYWdlUmVxdWVzdE9iamVjdDtcbiAgICB2aWRlbz86IElWaWRlb1JlcXVlc3RPYmplY3Q7XG4gICAgZGF0YT86IElEYXRhUmVxdWVzdE9iamVjdDtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRpdGxlUmVxdWVzdE9iamVjdCB7XG4gICAgbGVuOiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJbWFnZVJlcXVlc3RPYmplY3Qge1xuICAgIHR5cGU/OiBudW1iZXI7XG4gICAgdz86IG51bWJlcjtcbiAgICB3bWluPzogbnVtYmVyO1xuICAgIGg/OiBudW1iZXI7XG4gICAgaG1pbj86IG51bWJlcjtcbiAgICBtaW1lcz86IHN0cmluZ1tdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlkZW9SZXF1ZXN0T2JqZWN0IHtcbiAgICBtaW1lczogbnVtYmVyW10gfCBzdHJpbmdbXTtcbiAgICBtaW5kdXJhdGlvbjogbnVtYmVyO1xuICAgIG1heGR1cmF0aW9uOiBudW1iZXI7XG4gICAgcHJvdG9jb2xzOiBudW1iZXJbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZXF1ZXN0T2JqZWN0IHtcbiAgICB0eXBlOiBudW1iZXI7XG4gICAgbGVuPzogbnVtYmVyO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRUcmFja2VyUmVxdWVzdE9iamVjdCB7XG4gICAgZXZlbnQ6IG51bWJlcjtcbiAgICBtZXRob2RzOiBudW1iZXJbXTtcbiAgICBleHQ/OiBhbnk7XG59XG4iLAogICAgImltcG9ydCB7XG4gICAgdHlwZSBJUHJvZHVjdEluZm9ybWF0aW9uLFxuICAgIE5hdGl2ZUFzc2V0SWQsXG4gICAgTmF0aXZlSW1hZ2VUeXBlcyxcbiAgICBFdmVudFR5cGVzXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5hdGl2ZVJlc3BvbnNlIHtcbiAgICBuYXRpdmU6IElOYXRpdmVSZXNwb25zZURldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5hdGl2ZVJlc3BvbnNlRGV0YWlscyB7XG4gICAgdmVyPzogc3RyaW5nO1xuICAgIGFzc2V0cz86IElBc3NldFJlc3BvbnNlT2JqZWN0W107XG4gICAgYXNzZXRzdXJsPzogc3RyaW5nO1xuICAgIGRjb3VybD86IHN0cmluZztcbiAgICBsaW5rOiBJTGlua1Jlc3BvbnNlT2JqZWN0O1xuICAgIGltcHRyYWNrZXJzPzogc3RyaW5nW107XG4gICAganN0cmFja2VyPzogc3RyaW5nO1xuICAgIGV2ZW50dHJhY2tlcnM/OiBJRXZlbnRUcmFja2VyUmVzcG9uc2VPYmplY3RbXTtcbiAgICBwcml2YWN5Pzogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXNzZXRSZXNwb25zZU9iamVjdCB7XG4gICAgaWQ/OiBudW1iZXI7XG4gICAgcmVxdWlyZWQ/OiBudW1iZXI7XG4gICAgdGl0bGU/OiBJVGl0bGVSZXNwb25zZU9iamVjdDtcbiAgICBpbWc/OiBJSW1hZ2VSZXNwb25zZU9iamVjdDtcbiAgICBkYXRhPzogSURhdGFSZXNwb25zZU9iamVjdDtcbiAgICB2aWRlbz86IElWaWRlb1Jlc3BvbnNlT2JqZWN0O1xuICAgIGxpbms/OiBJTGlua1Jlc3BvbnNlT2JqZWN0O1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGl0bGVSZXNwb25zZU9iamVjdCB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGxlbj86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlUmVzcG9uc2VPYmplY3Qge1xuICAgIHR5cGU6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICB3PzogbnVtYmVyO1xuICAgIGg/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhUmVzcG9uc2VPYmplY3Qge1xuICAgIHR5cGU/OiBudW1iZXI7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZGVvUmVzcG9uc2VPYmplY3Qge1xuICAgIHZhc3R0YWc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGlua1Jlc3BvbnNlT2JqZWN0IHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBjbGlja3RyYWNrZXJzPzogc3RyaW5nW107XG4gICAgZmFsbGJhY2s/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudFRyYWNrZXJSZXNwb25zZU9iamVjdCB7XG4gICAgZXZlbnQ6IG51bWJlcjtcbiAgICBtZXRob2Q6IG51bWJlcjtcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgY3VzdG9tZGF0YT86IGFueTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmNvbnN0IGZpbmREYXRhQXNzZXRCeVR5cGUgPSAoYXNzZXRzOiBJQXNzZXRSZXNwb25zZU9iamVjdFtdIHwgdW5kZWZpbmVkLCBpZDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gICAgYXNzZXRzPy5maW5kKChhc3NldCkgPT4gYXNzZXQuaWQgPT09IGlkKT8uZGF0YT8udmFsdWU7XG5cbmV4cG9ydCBmdW5jdGlvbiBOYXRpdmVSZXNwb25zZVRvUHJvZHVjdEluZm9ybWF0aW9uKFxuICAgIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlXG4pOiBJUHJvZHVjdEluZm9ybWF0aW9uIHtcbiAgICBjb25zdCBicmFuZCA9IGZpbmREYXRhQXNzZXRCeVR5cGUobmF0aXZlLm5hdGl2ZS5hc3NldHMsIE5hdGl2ZUFzc2V0SWQuU3BvbnNvcmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbWFnZTogbmF0aXZlLm5hdGl2ZS5hc3NldHM/LmZpbmQoKGFzc2V0KSA9PiBhc3NldC5pbWc/LnR5cGUgPT09IE5hdGl2ZUltYWdlVHlwZXMuTWFpbik/LmltZz8udXJsLFxuICAgICAgICBuYW1lOiBuYXRpdmUubmF0aXZlLmFzc2V0cz8uZmluZCgoYXNzZXQpID0+IGFzc2V0LnRpdGxlICE9PSB1bmRlZmluZWQpPy50aXRsZT8udGV4dCxcblxuICAgICAgICBwcmljZTogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5QcmljZSksXG4gICAgICAgIHNhbGVQcmljZTogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5TYWxlUHJpY2UpLFxuICAgICAgICB0aGM6IGZpbmREYXRhQXNzZXRCeVR5cGUobmF0aXZlLm5hdGl2ZS5hc3NldHMsIE5hdGl2ZUFzc2V0SWQuU3VyZlRIQyksXG4gICAgICAgIGNiZDogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5TdXJmQ0JEKSxcbiAgICAgICAgc3RyYWluOiBmaW5kRGF0YUFzc2V0QnlUeXBlKG5hdGl2ZS5uYXRpdmUuYXNzZXRzLCBOYXRpdmVBc3NldElkLlN1cmZTdHJhaW4pLFxuICAgICAgICBicmFuZF9uYW1lOiBicmFuZCxcbiAgICAgICAgYnJhbmROYW1lOiBicmFuZCxcbiAgICAgICAgcHJvZHVjdFR5cGU6IGZpbmREYXRhQXNzZXRCeVR5cGUobmF0aXZlLm5hdGl2ZS5hc3NldHMsIE5hdGl2ZUFzc2V0SWQuU3VyZkNhdGVnb3J5KSxcbiAgICAgICAgZGV0YWlsczogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5EZXNjKSxcbiAgICAgICAgY3RhOiBmaW5kRGF0YUFzc2V0QnlUeXBlKG5hdGl2ZS5uYXRpdmUuYXNzZXRzLCBOYXRpdmVBc3NldElkLkNUQVRleHQpLFxuXG4gICAgICAgIGNsaWNrdGhyb3VnaFVybDogbmF0aXZlLm5hdGl2ZS5saW5rPy51cmwgPz8gbnVsbCxcbiAgICAgICAgcGl4ZWxVcmw6IG5hdGl2ZS5uYXRpdmUuZXZlbnR0cmFja2Vycz8uZmluZCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50ID09PSBFdmVudFR5cGVzLkltcCk/LnVybFxuICAgIH07XG59O1xuIiwKICAgICJleHBvcnQgdHlwZSBMb2dnZXJGbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbnRleHRGbiA9ICguLi5wcmVmaXg6IChzdHJpbmd8IHVuZGVmaW5lZClbXSkgPT4gSUNvbnRleHRMb2dnZXI7XG5cbmNvbnN0IFNVUkZfUFJFRklYOiBzdHJpbmcgPSAnJWNbU1VSRl0nO1xuY29uc3QgU0VQQVJBVE9SID0gJyDigLonO1xuY29uc3QgVU5ERUYgPSAnWyB1bmRlZmluZWQgXSc7XG5cbmNvbnN0IExvZ0NvbG9ycyA9IHtcbiAgICAvKiBBY2NlbnRzICovXG4gICAgTGF2ZW5kZXI6ICcjYzBhYmZmJyxcbiAgICBVbHRyYVJlZDogJyNmOTc1ODUnLFxuICAgIFNvZnRHb2xkOiAnI2Y0YmQ1ZCcsXG4gICAgTWFnaWNNaW50OiAnI2JhZjdkYidcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2dlciB7XG4gICAgaW5mbzogTG9nZ2VyRm4sXG4gICAgZGVidWc6IExvZ2dlckZuLFxuICAgIHdhcm46IExvZ2dlckZuLFxuICAgIGVycm9yOiBMb2dnZXJGbixcbiAgICB0YWJsZTogKGRhdGE6IGFueSwgcHJvcGVydGllcz86IHN0cmluZ1tdKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJQ29udGV4dExvZ2dlciBleHRlbmRzIElMb2dnZXIge1xuICAgIHdpdGg6IENvbnRleHRGbixcbn07XG5cbmNvbnN0IGxvZyA9IChsb2c6IExvZ2dlckZuLCBhcmdzOiBhbnlbXSwgY29sb3I6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGFyZ3MudW5zaGlmdChcbiAgICAgICAgYGJvcmRlci1yYWRpdXM6IDNweDsgbWFyZ2luLWxlZnQ6IDEwcHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiBib2xkO2BcbiAgICApO1xuICAgIGFyZ3MudW5zaGlmdChTVVJGX1BSRUZJWCk7XG4gICAgbG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuXG59O1xuXG5jb25zdCBpbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBsb2coY29uc29sZS5sb2csIFsnKEluZm8pJywgLi4uYXJnc10sIExvZ0NvbG9ycy5MYXZlbmRlcik7XG5jb25zdCB3YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBsb2coY29uc29sZS53YXJuLCBbJyhXYXJuaW5nKScsIC4uLmFyZ3NdLCBMb2dDb2xvcnMuU29mdEdvbGQpO1xuY29uc3QgZGVidWcgPSAoLi4uYXJnczogYW55W10pID0+IGxvZyhjb25zb2xlLmRlYnVnLCBbJyhEZWJ1ZyknLCAuLi5hcmdzXSwgTG9nQ29sb3JzLk1hZ2ljTWludCk7XG5jb25zdCBlcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4gbG9nKGNvbnNvbGUuZXJyb3IsIFsnKEVycm9yKScsIC4uLmFyZ3NdLCBMb2dDb2xvcnMuVWx0cmFSZWQpO1xuXG5jb25zdCBjb250ZXh0ID0gKGxvZ2dlcjogSUNvbnRleHRMb2dnZXIsIC4uLnByZWZpeDogKHN0cmluZ3wgdW5kZWZpbmVkKVtdKTogSUNvbnRleHRMb2dnZXIgPT4ge1xuICAgIGNvbnN0IG5ld1ByZWZpeCA9IGpvaW5DdHgocHJlZml4KSArIFNFUEFSQVRPUjtcbiAgICBjb25zdCBuZXdMb2dnZXI6IElDb250ZXh0TG9nZ2VyID0ge1xuICAgICAgICBpbmZvOiBsb2dnZXIuaW5mby5iaW5kKHVuZGVmaW5lZCwgbmV3UHJlZml4KSxcbiAgICAgICAgd2FybjogbG9nZ2VyLndhcm4uYmluZCh1bmRlZmluZWQsIG5ld1ByZWZpeCksXG4gICAgICAgIGRlYnVnOiBsb2dnZXIuZGVidWcuYmluZCh1bmRlZmluZWQsIG5ld1ByZWZpeCksXG4gICAgICAgIGVycm9yOiBsb2dnZXIuZXJyb3IuYmluZCh1bmRlZmluZWQsIG5ld1ByZWZpeCksXG4gICAgICAgIHRhYmxlOiBjb25zb2xlLnRhYmxlLFxuICAgICAgICB3aXRoOiBsb2dnZXIud2l0aFxuICAgIH07XG4gICAgbmV3TG9nZ2VyLndpdGggPSBjb250ZXh0LmJpbmQodW5kZWZpbmVkLCBuZXdMb2dnZXIpO1xuICAgIHJldHVybiBuZXdMb2dnZXI7XG59O1xuXG5leHBvcnQgY29uc3QgSW5pdExvZ2dlciA9ICgpOiBJQ29udGV4dExvZ2dlciA9PiB7XG4gICAgY29uc3QgbG9nZ2VyOiBQYXJ0aWFsPElDb250ZXh0TG9nZ2VyPiA9IHtcbiAgICAgICAgaW5mbyxcbiAgICAgICAgd2FybixcbiAgICAgICAgZGVidWcsXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0YWJsZTogY29uc29sZS50YWJsZVxuICAgIH07XG4gICAgbG9nZ2VyLndpdGggPSBjb250ZXh0LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIgYXMgSUNvbnRleHRMb2dnZXIpO1xuICAgIHJldHVybiBsb2dnZXIgYXMgSUNvbnRleHRMb2dnZXI7XG59O1xuXG5jb25zdCBqb2luQ3R4ID0gKGN0eDogKHN0cmluZyB8IHVuZGVmaW5lZClbXSkgPT4gY3R4Lm1hcChlID0+IGUgPT09IHVuZGVmaW5lZCA/IFVOREVGIDogZSkuam9pbihTRVBBUkFUT1IpO1xuXG5leHBvcnQgY29uc3QgQ3R4ID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCk6IElDb250ZXh0TG9nZ2VyIHwgdW5kZWZpbmVkID0+XG4gICAgbG9nZ2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiAobG9nZ2VyIGFzIGFueSk/LndpdGggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IC4uLmxvZ2dlciwgd2l0aDogKCkgPT4gQ3R4KGxvZ2dlcikhIH1cbiAgICAgICAgICAgIDogbG9nZ2VyIGFzIElDb250ZXh0TG9nZ2VyO1xuIiwKICAgICJleHBvcnQgdHlwZSBPa1Jlc3VsdDxUPiA9IHsgb2s6IHRydWUsIHZhbHVlOiBUIH07XG5leHBvcnQgdHlwZSBFcnJSZXN1bHQ8RSA9IEVycm9yPiA9IHsgb2s6IGZhbHNlLCBlcnJvcjogRSB9O1xuXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRSA9IEVycm9yPiA9XG4gICAgfCBPa1Jlc3VsdDxUPlxuICAgIHwgRXJyUmVzdWx0PEU+XG5cbmV4cG9ydCB0eXBlIEFzeW5jUmVzdWx0PFQsIEUgPSBFcnJvcj4gPSBQcm9taXNlPFJlc3VsdDxULCBFPj47XG5cbmV4cG9ydCBjb25zdCBPayA9IDxUPih0OiBUKTogT2tSZXN1bHQ8VD4gPT4gKHtcbiAgICBvazogdHJ1ZSxcbiAgICB2YWx1ZTogdFxufSk7XG5cbmV4cG9ydCBjb25zdCBFcnIgPSA8RSA9IEVycm9yPihlOiBFKTogRXJyUmVzdWx0PEU+ID0+ICh7XG4gICAgb2s6IGZhbHNlLFxuICAgIGVycm9yOiBlXG59KTtcblxuZXhwb3J0IGNvbnN0IFRyeURvID0gPFQsIEUgPSBFcnJvcj4oZm46ICgpID0+IFQpOiBSZXN1bHQ8VCwgRT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBPayhmbigpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IFRyeURvRmxhdCA9IDxULCBFID0gRXJyb3I+KGZuOiAoKSA9PiBSZXN1bHQ8VCwgRT4pOiBSZXN1bHQ8VCwgRT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyIGFzIEUpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBUcnlEb0FzeW5jID0gYXN5bmMgPFQsIEUgPSBFcnJvcj4oZm46ICgpID0+IFByb21pc2U8VD4pOiBBc3luY1Jlc3VsdDxULCBFPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9rKGF3YWl0IGZuKCkpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyIGFzIEUpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBHZXRWYWx1ZSA9IDxULCBFID0gRXJyb3I+KHJlc3VsdDogUmVzdWx0PFQsIEU+IHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCA9PlxuICAgIHJlc3VsdD8ub2sgPyByZXN1bHQudmFsdWUgOiB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBWYWx1ZU9yID0gPFQsIEUgPSBFcnJvciwgVSA9IFQ+KHJlc3VsdDogUmVzdWx0PFQsIEU+IHwgdW5kZWZpbmVkLCBvcjogVSk6IFQgfCBVID0+XG4gICAgcmVzdWx0Py5vayA/IHJlc3VsdC52YWx1ZSA6IG9yO1xuXG5leHBvcnQgY29uc3QgR2V0VmFsdWVPclRocm93ID0gPFQ+KHJlc3VsdDogUmVzdWx0PFQsIEVycm9yPik6IFQgPT4ge1xuICAgIGlmKHJlc3VsdC5vaykge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG59O1xuXG5leHBvcnQgY29uc3QgV3JhcFZhbHVlID0gPFQ+KHZhbHVlOiBUIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlc3VsdDxUPiA9PiB7XG4gICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBOb1ZhbHVlRXJyb3IodmFsdWUgYXMgKHVuZGVmaW5lZCB8IG51bGwpKSk7XG4gICAgfVxuICAgIHJldHVybiBPayh2YWx1ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBBc3NlcnRWYWx1ZSA9IEdldFZhbHVlT3JUaHJvdztcblxuZXhwb3J0IGNvbnN0IEFsbE9yTm9uZSA9IDxUPihyZXN1bHRzOiBSZXN1bHQ8VCwgRXJyb3I+W10pOiBSZXN1bHQ8VFtdPiA9PiB7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIocmVzID0+ICFyZXMub2spLm1hcChyZXMgPT4gcmVzLmVycm9yKTtcbiAgICBpZihmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBNdWx0aXBsZUVycm9yc0Vycm9yKGZhaWxlZCkpO1xuICAgIH1cbiAgICBjb25zdCBzdWNjZXNzID0gcmVzdWx0cy5maWx0ZXIocmVzID0+IHJlcy5vaykubWFwKHJlcyA9PiByZXMudmFsdWUpO1xuICAgIHJldHVybiBPayhzdWNjZXNzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTb21lID0gPFQ+KHJlc3VsdHM6IFJlc3VsdDxULCBFcnJvcj5bXSk6IE9rUmVzdWx0PFRbXT4gPT4ge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSByZXN1bHRzLmZpbHRlcihyZXMgPT4gcmVzLm9rKS5tYXAocmVzID0+IHJlcy52YWx1ZSk7XG4gICAgcmV0dXJuIE9rKHN1Y2Nlc3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IEZpbHRlciA9IDxUPiguLi5yZXN1bHRzOiBSZXN1bHQ8VCwgRXJyb3I+W10pOiBbT2tSZXN1bHQ8VD5bXSwgRXJyUmVzdWx0W11dID0+IHtcbiAgICBjb25zdCBzdWNjZXNzID0gU29tZShyZXN1bHRzKS52YWx1ZS5tYXAodmFsID0+IE9rKHZhbCkpO1xuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKHJlcyA9PiAhcmVzLm9rKTtcbiAgICByZXR1cm4gW3N1Y2Nlc3MsIGZhaWxlZF07XG59O1xuXG5leHBvcnQgY29uc3QgQW55RmFpbGVkID0gKC4uLnJlc3VsdHM6IFJlc3VsdDxhbnksIEVycm9yPltdKTogW3RydWUsIEVycm9yW11dIHwgW2ZhbHNlXSA9PiB7XG4gICAgY29uc3QgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIocmVzID0+ICFyZXMub2spLm1hcChyZXMgPT4gcmVzLmVycm9yKTtcbiAgICBpZihlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbdHJ1ZSwgZXJyb3JzXTtcbiAgICB9XG4gICAgcmV0dXJuIFtmYWxzZV07XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUVycm9yc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBlcnJvcnM6IEVycm9yW10pIHtcbiAgICAgICAgc3VwZXIoJ0dvdCBtdWx0aXBsZSBlcnJvcnM6XFxuJyArXG4gICAgICAgICAgICBlcnJvcnMubWFwKGVyciA9PiAnXFx0JyArIGVyci5tZXNzYWdlLnN1YnN0cmluZygwLCAzMikucGFkRW5kKDM1LCAnLicpKS5qb2luKCdcXG4nKVxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIElSZXN1bHRQaXBlPFQsIEUgPSBFcnJvcj4ge1xuICAgIHRoZW46IDxVPihmbjogKHQ6IFQpID0+IFUpID0+IElSZXN1bHRQaXBlPFUsIEU+O1xuICAgIHJlc3VsdDogKCkgPT4gUmVzdWx0PFQsIEU+O1xuICAgIHZhbHVlOiAoKSA9PiBUIHwgdW5kZWZpbmVkO1xuICAgIHZhbHVlT3I6IDxVPihvcjogVSkgPT4gVCB8IFU7XG4gICAgdmFsdWVPclRocm93OiAoKSA9PiBUO1xufVxuXG5leHBvcnQgY29uc3QgUGlwZSA9IDxULCBFID0gRXJyb3I+KHJlc3VsdDogUmVzdWx0PFQsIEU+KTogSVJlc3VsdFBpcGU8VCwgRT4gPT4gKHtcbiAgICB0aGVuOiBwaXBlVGhlbihyZXN1bHQpLFxuICAgIHJlc3VsdDogcGlwZVJlc3VsdChyZXN1bHQpLFxuICAgIHZhbHVlOiBwaXBlVmFsdWUocmVzdWx0KSxcbiAgICB2YWx1ZU9yOiBwaXBlVmFsdWVPcihyZXN1bHQpLFxuICAgIHZhbHVlT3JUaHJvdzogcGlwZVZhbHVlT3JUaHJvdyhyZXN1bHQpXG59KTtcblxuY29uc3QgcGlwZVRoZW4gPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+IDxVPihmbjogKHQ6IFQpID0+IFUpOiBJUmVzdWx0UGlwZTxVLCBFPiA9PiB7XG4gICAgaWYoIXJlc3VsdC5vaykge1xuICAgICAgICByZXR1cm4gUGlwZShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gUGlwZShPayhmbihyZXN1bHQudmFsdWUpKSk7XG59XG5cbmNvbnN0IHBpcGVSZXN1bHQgPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+ICgpOiBSZXN1bHQ8VCwgRT4gPT4gcmVzdWx0O1xuY29uc3QgcGlwZVZhbHVlID0gPFQsIEU+KHJlc3VsdDogUmVzdWx0PFQsIEU+KSA9PiAoKTogVCB8IHVuZGVmaW5lZCA9PiBHZXRWYWx1ZShyZXN1bHQpO1xuY29uc3QgcGlwZVZhbHVlT3IgPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+IDxVPihvcjogVSkgPT4gR2V0VmFsdWUocmVzdWx0KSA/PyBvcjtcbmNvbnN0IHBpcGVWYWx1ZU9yVGhyb3cgPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+ICgpID0+IHtcbiAgICBpZihyZXN1bHQub2spIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgcmVzdWx0LmVycm9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBc3luY1Jlc3VsdFBpcGU8VCwgRSA9IEVycm9yPiB7XG4gICAgdGhlbjogPFU+KGZuOiAodDogVCkgPT4gQXN5bmNSZXN1bHQ8VT4gfCBSZXN1bHQ8VT4pID0+IElBc3luY1Jlc3VsdFBpcGU8VSwgRT47XG4gICAgcmVzdWx0OiAoKSA9PiBBc3luY1Jlc3VsdDxULCBFPjtcbiAgICB2YWx1ZTogKCkgPT4gUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICB2YWx1ZU9yOiA8VT4ob3I6IFUpID0+IFByb21pc2U8VCB8IFU+O1xuICAgIHZhbHVlT3JUaHJvdzogKCkgPT4gUHJvbWlzZTxUPjtcbn1cblxuZXhwb3J0IGNvbnN0IEFzeW5jUGlwZSA9IDxULCBFPihyZXN1bHQ6IEFzeW5jUmVzdWx0PFQsIEU+KTogSUFzeW5jUmVzdWx0UGlwZTxULCBFPiA9PiAoe1xuICAgIHRoZW46IGFzeW5jUGlwZVRoZW4ocmVzdWx0KSxcbiAgICByZXN1bHQ6IGFzeW5jUGlwZVJlc3VsdChyZXN1bHQpLFxuICAgIHZhbHVlOiBhc3luY1BpcGVWYWx1ZShyZXN1bHQpLFxuICAgIHZhbHVlT3I6IGFzeW5jUGlwZVZhbHVlT3IocmVzdWx0KSxcbiAgICB2YWx1ZU9yVGhyb3c6IGFzeW5jUGlwZVZhbHVlT3JUaHJvdyhyZXN1bHQpXG59KVxuXG5jb25zdCBhc3luY1BpcGVUaGVuID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+XG4gICAgPFU+KGZuOiAodDogVCkgPT4gQXN5bmNSZXN1bHQ8VT4gfCBSZXN1bHQ8VT4pOiBJQXN5bmNSZXN1bHRQaXBlPFUsIEU+ID0+IHtcbiAgICAgICAgY29uc3QgYXN5bmNSZXN1bHQgPSByZXN1bHQgYXMgQXN5bmNSZXN1bHQ8VCwgRT47XG4gICAgICAgIGNvbnN0IHdyYXBwZWRQcm9taXNlUmVzdWx0ID0gYXN5bmNSZXN1bHQudGhlbih1bndyYXBwZWRSZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYodW53cmFwcGVkUmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm5SZXMgPSBmbih1bndyYXBwZWRSZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZuUmVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKEVycilcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVud3JhcHBlZFJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBBc3luY1BpcGUod3JhcHBlZFByb21pc2VSZXN1bHQpO1xuICAgIH07XG5cbmNvbnN0IGFzeW5jUGlwZVJlc3VsdCA9IDxULCBFID0gRXJyb3I+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+ICgpID0+IHJlc3VsdDtcbmNvbnN0IGFzeW5jUGlwZVZhbHVlID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXN1bHQ7XG4gICAgICAgIGlmKHJlcy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcy52YWx1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5jb25zdCBhc3luY1BpcGVWYWx1ZU9yID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+IGFzeW5jIDxVPihvcjogVSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgaWYocmVzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcjtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG9yO1xuICAgIH1cbn1cblxuY29uc3QgYXN5bmNQaXBlVmFsdWVPclRocm93ID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXN1bHQ7XG4gICAgaWYocmVzLm9rKSB7XG4gICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgfVxuICAgIHRocm93IHJlcy5lcnJvcjtcbn1cbiAgICBcblxuZXhwb3J0IHR5cGUgSVJlc3VsdFN0cmVhbTxULCBFID0gRXJyb3I+ID0ge1xuICAgIG1hcDogPFU+KGZuOiAodDogVCkgPT4gVSkgPT4gSVJlc3VsdFN0cmVhbTxVLCBFPixcbiAgICBmaWx0ZXI6IChmbjogKHQ6IFQpID0+IGJvb2xlYW4pID0+IElSZXN1bHRTdHJlYW08VCwgRT5cbiAgICByZXN1bHRzOiAoKSA9PiBSZXN1bHQ8VFtdLCBFPjtcbiAgICB2YWx1ZTogKCkgPT4gVFtdIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlT3I6IDxVPih1OiBVKSA9PiBUW10gfCBVLFxuICAgIHZhbHVlT3JUaHJvdzogKCkgPT4gVFtdLFxufVxuXG5leHBvcnQgY29uc3QgUmVzdWx0U3RyZWFtID0gPFQsIEUgPSBFcnJvcj4ocmVzdWx0czogUmVzdWx0PFRbXSwgRT4pOiBJUmVzdWx0U3RyZWFtPFQsIEU+ID0+ICh7XG4gICAgbWFwOiBzdHJlYW1NYXAocmVzdWx0cyksXG4gICAgZmlsdGVyOiBzdHJlYW1GaWx0ZXIocmVzdWx0cyksXG4gICAgcmVzdWx0czogc3RyZWFtUmVzdWx0cyhyZXN1bHRzKSxcbiAgICB2YWx1ZTogc3RyZWFtVmFsdWUocmVzdWx0cyksXG4gICAgdmFsdWVPcjogc3RyZWFtVmFsdWVPcihyZXN1bHRzKSxcbiAgICB2YWx1ZU9yVGhyb3c6IHN0cmVhbVZhbHVlT3JUaHJvdyhyZXN1bHRzKVxufSlcblxuY29uc3Qgc3RyZWFtTWFwID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+KSA9PiA8VT4oZm46ICh0OiBUKSA9PiBVKTogSVJlc3VsdFN0cmVhbTxVLCBFPiA9PiB7XG4gICAgaWYoIXJlc3VsdHMub2spIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdFN0cmVhbShyZXN1bHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlc3VsdFN0cmVhbShPayhyZXN1bHRzLnZhbHVlLm1hcChmbikpKTtcbn1cblxuY29uc3Qgc3RyZWFtRmlsdGVyID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+KSA9PiAoZm46ICh0OiBUKSA9PiBib29sZWFuKTogSVJlc3VsdFN0cmVhbTxULCBFPiA9PiB7XG4gICAgaWYoIXJlc3VsdHMub2spIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdFN0cmVhbShyZXN1bHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlc3VsdFN0cmVhbShPayhyZXN1bHRzLnZhbHVlLmZpbHRlcihmbikpKTtcbn1cblxuY29uc3Qgc3RyZWFtUmVzdWx0cyA9IDxULCBFPihyZXN1bHRzOiBSZXN1bHQ8VFtdLCBFPikgPT4gKCk6IFJlc3VsdDxUW10sIEU+ID0+IHJlc3VsdHM7XG5cbmNvbnN0IHN0cmVhbVZhbHVlID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+KSA9PiAoKTogVFtdIHwgdW5kZWZpbmVkID0+IHJlc3VsdHMub2sgPyByZXN1bHRzLnZhbHVlIDogdW5kZWZpbmVkO1xuXG5jb25zdCBzdHJlYW1WYWx1ZU9yID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+LCkgPT4gPFU+KG9yOiBVKTogVFtdIHwgVSA9PiByZXN1bHRzLm9rID8gcmVzdWx0cy52YWx1ZSA6IG9yO1xuXG5jb25zdCBzdHJlYW1WYWx1ZU9yVGhyb3cgPSA8VCwgRT4ocmVzdWx0czogUmVzdWx0PFRbXSwgRT4pID0+ICgpOiBUW10gPT4ge1xuICAgIGlmKHJlc3VsdHMub2spe1xuICAgICAgICByZXR1cm4gcmVzdWx0cy52YWx1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHJlc3VsdHMuZXJyb3I7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE5vVmFsdWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoJ1ZhbHVlIHdhcyB1bmRlZmluZWQgb3IgbnVsbCcpXG4gICAgfVxufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJR2VvLCBJR2VvQ29udGV4dCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIHR5cGUgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB7IEVyciwgT2ssIHR5cGUgQXN5bmNSZXN1bHQgfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmNvbnN0IFNVUkZfR0VPX1NFUlZJQ0VfVVJMID0gJ2h0dHBzOi8vZy5zdXJmc2lkZS5pby9lbnJpY2gnO1xuXG5leHBvcnQgdHlwZSBHZXRHZW9GbiA9IChpcD86IHN0cmluZywgZ2VvUHJvdmlkZXJUb2tlbj86IHN0cmluZykgPT4gQXN5bmNSZXN1bHQ8SUdlb0NvbnRleHQ+O1xuXG5jb25zdCBMT0NBVElPTl9UWVBFX0lQID0gMjtcbmNvbnN0IElQX1NFUlZJQ0VTX01BWE1JTkQgPSAzO1xuXG5leHBvcnQgY29uc3QgR2V0R2VvID0gYXN5bmMgKGxvZ2dlcj86IElMb2dnZXIsIGFwaVRva2VuPzogc3RyaW5nLCBpcD86IHN0cmluZyk6IEFzeW5jUmVzdWx0PElHZW9Db250ZXh0PiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dlb1NlcnZpY2UnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgR2VvIGluZm8nKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFNVUkZfR0VPX1NFUlZJQ0VfVVJMKTtcbiAgICAgICAgLy8gY29uc3QgcmVzcG9uc2UgPSBpcCA9PT0gdW5kZWZpbmVkXG4gICAgICAgIC8vICAgICA/IGF3YWl0IGZldGNoKFNVUkZfR0VPX1NFUlZJQ0VfVVJMKVxuICAgICAgICAvLyAgICAgOiBhd2FpdCBmZXRjaChTVVJGX0dFT19TRVJWSUNFX1VSTCwge1xuICAgICAgICAvLyAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAvLyAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7YXBpVG9rZW59YFxuICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgIC8vICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpcCB9KVxuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIGxvZz8uZGVidWcoJ0dlbyBSZXNwb25zZScsIHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuIE9rKGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBJR2VvQ29udGV4dCk7XG4gICAgfSBjYXRjaChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBHZW9Db250ZXh0VG9PUlRCID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgZ2VvQ29udGV4dDogSUdlb0NvbnRleHQpOiBJR2VvID0+ICh7XG4gICAgbGF0OiBnZW9Db250ZXh0LmNvb3Jkcy5sYXRpdHVkZSxcbiAgICBsb246IGdlb0NvbnRleHQuY29vcmRzLmxvbmdpdHVkZSxcbiAgICBjaXR5OiBnZW9Db250ZXh0LmNpdHksXG4gICAgcmVnaW9uOiBnZW9Db250ZXh0LnJlZ2lvbixcbiAgICBjb3VudHJ5OiBnZW9Db250ZXh0LmNvdW50cnksXG4gICAgemlwOiBnZW9Db250ZXh0LnppcCxcbiAgICB0eXBlOiBMT0NBVElPTl9UWVBFX0lQLFxuICAgIGFjY3VyYWN5OiBnZW9Db250ZXh0LmNvb3Jkcy5hY2N1cmFjeSxcbiAgICB1dGNvZmZzZXQ6IGdlb0NvbnRleHQudXRjb2Zmc2V0LFxuICAgIGlwc2VydmljZTogSVBfU0VSVklDRVNfTUFYTUlORFxufSk7XG4iLAogICAgImltcG9ydCB7IEFkQ29tMTBEZXZpY2VUeXBlcywgdHlwZSBJQnJhbmRWZXJzaW9uLCB0eXBlIElEZXZpY2UsIHR5cGUgSVVzZXJBZ2VudCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIE9rLCB0eXBlIElMb2dnZXIsIHR5cGUgUmVzdWx0IH0gZnJvbSAnLic7XG5cbmludGVyZmFjZSBJRGV2aWNlQ29udGV4dCB7XG4gICAgbWFrZT86IHN0cmluZztcbiAgICBtb2RlbD86IHN0cmluZztcbiAgICBvcz86IHN0cmluZztcbiAgICBvc3Y/OiBzdHJpbmc7XG4gICAgYnJvd3Nlcj86IElCcmFuZFZlcnNpb247XG59XG5cbmV4cG9ydCB0eXBlIEdldERldmljZUZuID0gKHNjcmVlbjogSVNjcmVlbiwgbmF2aWdhdG9yOiBJTmF2aWdhdG9yLCBtb2JpbGU6IGJvb2xlYW4pID0+IFJlc3VsdDxJRGV2aWNlPjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2NyZWVuIHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOYXZpZ2F0b3Ige1xuICAgIHVzZXJBZ2VudDogc3RyaW5nLFxuICAgIGxhbmd1YWdlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IEdldERldmljZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc2NyZWVuOiBJU2NyZWVuLFxuICAgIG5hdmlnYXRvcjogSU5hdmlnYXRvcixcbiAgICBtb2JpbGU6IGJvb2xlYW5cbik6IFJlc3VsdDxJRGV2aWNlPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0RldmljZVNlcnZpY2UnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgZGV2aWNlIGluZm8nKTtcblxuICAgIGNvbnN0IGRldmljZUluZm8gPSBnZXREZXZpY2VJbmZvKGxvZywgbmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbiAgICBjb25zdCBzdWE6IElVc2VyQWdlbnQgPSB7XG4gICAgICAgIG1vZGVsOiBkZXZpY2VJbmZvPy5tb2RlbCxcbiAgICAgICAgbW9iaWxlOiBtb2JpbGUgPyAxIDogMCwgLy8gb3BlbiBSVEIgdXNlcyAxIGZvciB0cnVlIGFuZCAwIGZvciBmYWxzZVxuICAgICAgICBicm93c2VyczogZGV2aWNlSW5mbz8uYnJvd3NlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IFtkZXZpY2VJbmZvLmJyb3dzZXJdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcGxhdGZvcm06IChkZXZpY2VJbmZvPy5vcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgYnJhbmQ6IGRldmljZUluZm8/Lm9zLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGRldmljZUluZm8/Lm9zdj8uc3BsaXQoJy4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFyY2hpdGVjdHVyZTogZ2V0Q1BVQXJjaGl0ZWN0dXJlKGxvZywgbmF2aWdhdG9yLnVzZXJBZ2VudCwgbW9iaWxlKSxcbiAgICAgICAgc291cmNlOiAzXG4gICAgfTtcblxuICAgIHJldHVybiBPayh7XG4gICAgICAgIG1ha2U6IGRldmljZUluZm8/Lm1ha2UsXG4gICAgICAgIG1vZGVsOiBkZXZpY2VJbmZvPy5tb2RlbCxcbiAgICAgICAgdzogc2NyZWVuLndpZHRoLFxuICAgICAgICBoOiBzY3JlZW4uaGVpZ2h0LFxuICAgICAgICBsYW5ndWFnZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgICAgICB1YTogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgZGV2aWNldHlwZTogZ2V0RGV2aWNlVHlwZShsb2csIHNjcmVlbiwgbW9iaWxlKSxcbiAgICAgICAgb3M6IGRldmljZUluZm8/Lm9zLFxuICAgICAgICBvc3Y6IGRldmljZUluZm8/Lm9zdixcbiAgICAgICAgc3VhXG4gICAgfSk7XG59O1xuXG5jb25zdCBnZXREZXZpY2VJbmZvID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgdXNlckFnZW50OiBzdHJpbmcpOiBJRGV2aWNlQ29udGV4dCA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ3RyeUdldERldmljZUluZm8nKTtcbiAgICBsb2c/LmRlYnVnKCdnZXR0aW5nIGRldmljZSBpbmZvJyk7XG4gICAgY29uc3QgdXNlckFnZW50TG93ZXIgPSB1c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGJyb3dzZXIgPSBnZXRCcm93c2VySW5mbyhsb2csIG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGlmICh1c2VyQWdlbnRMb3dlci5pbmNsdWRlcygnYW5kcm9pZCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5nZXRBbmRyb2lkRGV2aWNlSW5mbyhsb2csIHVzZXJBZ2VudCksXG4gICAgICAgICAgICBicm93c2VyXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh1c2VyQWdlbnRMb3dlci5pbmNsdWRlcygnaXBob25lJykgfHwgdXNlckFnZW50TG93ZXIuaW5jbHVkZXMoJ2lwYWQnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZ2V0aVBob25lRGV2aWNlSW5mbyhsb2csIHVzZXJBZ2VudCksXG4gICAgICAgICAgICBicm93c2VyXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh1c2VyQWdlbnRMb3dlci5pbmNsdWRlcygnd2luZG93cyBudCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYWtlOiAnTWljcm9zb2Z0JyxcbiAgICAgICAgICAgIG1vZGVsOiAnV2luZG93cycsXG4gICAgICAgICAgICBvczogJ1dpbmRvd3MnLFxuICAgICAgICAgICAgb3N2OiAvV2luZG93cyBOVCAoPzxvc3Y+WzAtOS5dKykvaWcuZXhlYyh1c2VyQWdlbnQpPy5ncm91cHM/Lm9zdixcbiAgICAgICAgICAgIGJyb3dzZXJcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHVzZXJBZ2VudExvd2VyLmluY2x1ZGVzKCdtYWNpbnRvc2gnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFrZTogJ0FwcGxlJyxcbiAgICAgICAgICAgIG1vZGVsOiAnTWFjaW50b3NoJyxcbiAgICAgICAgICAgIG9zOiAnTWFjT1MnLFxuICAgICAgICAgICAgb3N2OiAvTWFjIE9TIFggKD88b3N2PlswLTlfXSspL2lnLmV4ZWModXNlckFnZW50KT8uZ3JvdXBzPy5vc3Y/LnJlcGxhY2VBbGwoJ18nLCAnLicpLFxuICAgICAgICAgICAgYnJvd3NlclxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBicm93c2VyIH07XG59O1xuXG5jb25zdCBnZXRBbmRyb2lkRGV2aWNlSW5mbyA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHVzZXJBZ2VudDogc3RyaW5nKTogSURldmljZSA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldEFuZHJvaWREZXZpY2VJbmZvJyk7XG4gICAgbG9nPy5kZWJ1ZygnZ2V0dGluZyBhbmRyb2lkIGluZm8nKTtcbiAgICBjb25zdCBtYXRjaCA9IC9eW15cXHNdK1xcc1xcKCg/PExpbnV4Pi4qKTtcXHMqKD88b3N2PlteKV0rKTtcXHMqKD88TW9kZWw+W14pXSspXFwpL2lnLmV4ZWModXNlckFnZW50KTtcbiAgICBjb25zdCBvc3YgPSBtYXRjaD8uZ3JvdXBzPy5vc3Y7XG4gICAgY29uc3QgbW9kZWwgPSBtYXRjaD8uZ3JvdXBzPy5Nb2RlbDtcbiAgICBjb25zdCBwYXJ0aWFsRGV2aWNlID0ge1xuICAgICAgICBvczogJ0FuZHJvaWQnLFxuICAgICAgICBvc3YsXG4gICAgICAgIG1vZGVsLFxuICAgIH07XG4gICAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKCdQaXhlbCcpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBhcnRpYWxEZXZpY2UsXG4gICAgICAgICAgICAgICAgbWFrZTogJ0dvb2dsZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoJ1NNLScpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBhcnRpYWxEZXZpY2UsXG4gICAgICAgICAgICAgICAgbWFrZTogJ1NhbXN1bmcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLnN0YXJ0c1dpdGgoJ0xHLScpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBhcnRpYWxEZXZpY2UsXG4gICAgICAgICAgICAgICAgbWFrZTogJ0xHJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5zdGFydHNXaXRoKCdtb3RvJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGFydGlhbERldmljZSxcbiAgICAgICAgICAgICAgICBtYWtlOiAnTW90b3JvbGEnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLnN0YXJ0c1dpdGgoJ1JlZG1pJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGFydGlhbERldmljZSxcbiAgICAgICAgICAgICAgICBtYWtlOiAnWGlhb21pJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGFydGlhbERldmljZSxcbiAgICAgICAgICAgICAgICBtYWtlOiAnQW5kcm9pZCdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBvczogJ0FuZHJvaWQnLFxuICAgICAgICBvc3ZcbiAgICB9O1xufTtcblxuY29uc3QgZ2V0aVBob25lRGV2aWNlSW5mbyA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHVzZXJBZ2VudDogc3RyaW5nKTogSURldmljZSA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldElwaG9uZURldmljZUluZm8nKTtcbiAgICBsb2c/LmRlYnVnKCdnZXR0aW5nIGlQaG9uZSBpbmZvJyk7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlteXFxzXStcXHMqXFwoKD88RGV2aWNlPlteO10rKTtcXHMoPzxNb2RlbD5bXjspXStbOyldKVxccyg/PE1vZGVsRXh0PlteOyldK1s7KV0pPy9pZy5leGVjKHVzZXJBZ2VudCk7XG4gICAgY29uc3QgbWFrZSA9ICdBcHBsZSc7XG4gICAgY29uc3QgZGV2aWNlID0gbWF0Y2g/Lmdyb3Vwcz8uRGV2aWNlO1xuICAgIGNvbnN0IG1vZGVsID0gZGV2aWNlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdpcGFkJylcbiAgICAgICAgPyAnaVBhZCdcbiAgICAgICAgOiAnaVBob25lJztcblxuICAgIGNvbnN0IG1vZGVsR3JvdXAgPSBtYXRjaD8uZ3JvdXBzPy5Nb2RlbDtcbiAgICAvKiBOZXdlciBEZXZpY2UgKi9cbiAgICBjb25zdCBvczogc3RyaW5nID0gJ2lPUyc7XG5cbiAgICBjb25zdCBvc3ZTZWFyY2ggPSBtb2RlbEdyb3VwID09PSAnVSdcbiAgICAgICAgPyBtYXRjaD8uZ3JvdXBzPy5Nb2RlbEV4dFxuICAgICAgICA6IG1vZGVsR3JvdXA7XG5cbiAgICBjb25zdCBvc3YgPSBvc3ZTZWFyY2ggIT09IHVuZGVmaW5lZFxuICAgICAgICA/IC9PUyAoPzx2ZXI+WzAtOV9dKykvaWcuZXhlYyhvc3ZTZWFyY2gpPy5ncm91cHM/Lk1vZGVsRXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWFrZSxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG9zLFxuICAgICAgICBvc3ZcbiAgICB9O1xufTtcblxuY29uc3QgZ2V0QnJvd3NlckluZm8gPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCB1c2VyQWdlbnQ6IHN0cmluZyk6IElCcmFuZFZlcnNpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXRCcm93c2VySW5mbycpO1xuICAgIGxvZz8uZGVidWcoJ2dldHRpbmcgYnJvd3NlciBpbmZvJyk7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveC8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB1c2VyQWdlbnQuc3BsaXQoJ0ZpcmVmb3gvJylbMV0/LnNwbGl0KCcuJyksXG4gICAgICAgICAgICAgICAgYnJhbmQ6ICdGaXJlZm94J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZS8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB1c2VyQWdlbnQuc3BsaXQoJ0Nocm9tZS8nKVsxXT8uc3BsaXQoJyAnKVswXT8uc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgICBicmFuZDogJ0Nocm9tZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdDcmlPUycpKSB7XG4gICAgICAgICAgICAvLyBDaHJvbWUgb24gaU9TIHVzZXMgXCJDcmlPUy9cIiBpbnN0ZWFkIG9mIFwiQ2hyb21lL1wiLCB3aGljaCB3YXMgY2F1c2luZyBpc3N1ZXNcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogdXNlckFnZW50LnNwbGl0KCdDcmlPUy8nKVsxXT8uc3BsaXQoJyAnKVswXT8uc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgICBicmFuZDogJ0Nocm9tZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdTYWZhcmkvJykgJiYgIXVzZXJBZ2VudC5pbmNsdWRlcygnQ2hyb21lJykpIHtcbiAgICAgICAgICAgIC8vIFNhZmFyaSB2ZXJzaW9uIGlzIGEgYml0IHRyaWNraWVyIGR1ZSB0byBpdHMgVUEgc3RyaW5nIGZvcm1hdFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB1c2VyQWdlbnQuc3BsaXQoJ1ZlcnNpb24vJylbMV0/LnNwbGl0KCcgJylbMF0/LnNwbGl0KCcuJyksXG4gICAgICAgICAgICAgICAgYnJhbmQ6ICdTYWZhcmknXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHVzZXJBZ2VudC5pbmNsdWRlcygnRWRnLycpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZlcnNpb246IHVzZXJBZ2VudC5zcGxpdCgnRWRnLycpWzFdPy5zcGxpdCgnLicpLFxuICAgICAgICAgICAgICAgIGJyYW5kOiAnRWRnZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2c/LmVycm9yKGVycm9yKTtcbiAgICB9XG59O1xuXG5jb25zdCBnZXRDUFVBcmNoaXRlY3R1cmUgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCB1c2VyQWdlbnQ6IHN0cmluZywgbW9iaWxlOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0Q1BVQXJjaGl0ZWN0dXJlJyk7XG4gICAgbG9nPy5kZWJ1ZygnR2V0dGluZyBDUFUgYXJjaCcpO1xuICAgIC8vIENvbW1vbiBhcmNoaXRlY3R1cmUgcGF0dGVybnNcbiAgICBpZiAoL1dpbjY0fHg2NHx4ODZfNjR8V09XNjQvLnRlc3QodXNlckFnZW50KSkge1xuICAgICAgICByZXR1cm4gJ3g2NCc7XG4gICAgfVxuICAgIGlmICgvV2luMzJ8eDg2Ly50ZXN0KHVzZXJBZ2VudCkpIHtcbiAgICAgICAgcmV0dXJuICd4ODYnO1xuICAgIH1cbiAgICBpZiAoL2FhcmNoNjR8YXJtNjQvLnRlc3QodXNlckFnZW50KSkge1xuICAgICAgICByZXR1cm4gJ0FSTTY0JztcbiAgICB9XG4gICAgaWYgKC9hcm12XFxkKy8udGVzdCh1c2VyQWdlbnQpKSB7XG4gICAgICAgIHJldHVybiAnQVJNJztcbiAgICB9XG5cbiAgICAvKiBKdXN0IG5haXZlbHkgYXNzdW1lIGFsbCBwaG9uZXMgYXJlIGFybSAqL1xuICAgIGlmIChtb2JpbGUpIHtcbiAgICAgICAgcmV0dXJuICdBUk0nO1xuICAgIH1cblxuICAgIGxvZz8ud2FybignRmFpbGVkIHRvIGdldCBjcHUgYXJjaGl0ZWN0dXJlJyk7XG4gICAgcmV0dXJuO1xufTtcblxuY29uc3QgZ2V0RGV2aWNlVHlwZSA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHNjcmVlbjogSVNjcmVlbiwgbW9iaWxlOiBib29sZWFuKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0RGV2aWNlVHlwZScpO1xuICAgIGxvZz8uZGVidWcoJ2dldHRpbmcgZGV2aWNlIHR5cGUnKTtcbiAgICBjb25zdCBNSU5JTVVNX1NIT1JUX1RBQkxFVCA9IDYwMDtcbiAgICBjb25zdCBNQVhJTVVNX0xPTkdfVEFCTEVUID0gOTYwO1xuXG4gICAgY29uc3QgaGFzVG91Y2ggPSBtb2JpbGU7XG4gICAgaWYgKCFoYXNUb3VjaCkge1xuICAgICAgICByZXR1cm4gQWRDb20xMERldmljZVR5cGVzLlBDO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gc2NyZWVuLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHNjcmVlbi5oZWlnaHQ7XG4gICAgY29uc3QgW3Nob3J0ZXJTaWRlLCBsb25nZXJTaWRlXSA9IFt3aWR0aCwgaGVpZ2h0XS5zb3J0KChhLCBiKSA9PiBhIC0gYikgYXMgW251bWJlciwgbnVtYmVyXTtcblxuICAgIGlmIChoYXNUb3VjaCAmJiBzaG9ydGVyU2lkZSA+PSBNSU5JTVVNX1NIT1JUX1RBQkxFVCAmJiBsb25nZXJTaWRlID49IE1BWElNVU1fTE9OR19UQUJMRVQpIHtcbiAgICAgICAgcmV0dXJuIEFkQ29tMTBEZXZpY2VUeXBlcy5UYWJsZXQ7XG4gICAgfVxuICAgIHJldHVybiBBZENvbTEwRGV2aWNlVHlwZXMuTW9iaWxlO1xufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzL3J1bnRpbWUnO1xuaW1wb3J0IHR5cGUgeyBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLCBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uRFRPLCBJUHJvZHVjdENvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0ICB7IHR5cGUgQXN5bmNSZXN1bHQsIHR5cGUgSUxvZ2dlciwgQ3R4LCBFcnIsIE9rIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBIYW5kbGViYXJzSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgdHlwZSBHZXRDb25maWd1cmF0aW9uRm4gPSAoKSA9PiBBc3luY1Jlc3VsdDxJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uPjtcblxuZXhwb3J0IGNvbnN0IEdldENvbmZpZ3VyYXRpb24gPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGhhbmRsZWJhcnM6IHR5cGVvZiBIYW5kbGViYXJzLFxuICAgIGhlbHBlcnM6IEhhbmRsZWJhcnNIZWxwZXJzLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nXG4pOiBBc3luY1Jlc3VsdDxJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0NvbmZpZ3VyYXRpb25TZXJ2aWNlJykud2l0aCh1cmwpLndpdGgoYWNjb3VudElkKS53aXRoKHNpdGVJZCk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIGNvbmZpZ3VyYXRpb24nKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfS8ke2FjY291bnRJZH0vJHtzaXRlSWR9L2NvbmZpZy5qc29uYCk7XG4gICAgICAgIGlmKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgbG9nPy5lcnJvcignRmFpbGVkIHRvIGdldCBjb25maWd1cmF0aW9uJywgdXJsLCBhY2NvdW50SWQsIHNpdGVJZCk7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBjb25maWd1cmF0aW9uJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb25EVE87XG4gICAgICAgIGlmKGNvbmZpZy5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy50ZW1wbGF0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9nPy5lcnJvcignY29uZmlndXJhdGlvbiB3YXMgYW4gaW52YWxpZCBmb3JtYXQnKTtcbiAgICAgICAgICAgIHJldHVybiBFcnIobmV3IEVycm9yKCdjb25maWd1cmF0aW9uIHdhcyBhbiBpbnZhbGlkIGZvcm1hdCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZz8uZGVidWcoJ2NvbmZpZ3VyYXRpb246ICcsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhd2FpdCBtYXBDb25maWcobG9nLCBoYW5kbGViYXJzLCBoZWxwZXJzLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gRXJyKGVyciBhcyBFcnJvcik7XG4gICAgfVxufTtcblxuY29uc3QgbWFwQ29uZmlnID0gYXN5bmMgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBoYW5kbGViYXJzOiB0eXBlb2YgSGFuZGxlYmFycyxcbiAgICBoZWxwZXJzOiBIYW5kbGViYXJzSGVscGVycyxcbiAgICBjb25maWc6IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb25EVE9cbik6IEFzeW5jUmVzdWx0PElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnbWFwQ29uZmlnJyk7XG4gICAgbG9nPy5kZWJ1ZygnbWFwcGluZyBjb25maWd1cmF0aW9uJyk7XG5cbiAgICBjb25zdCBwcm9kdWN0Q2FyZFRlbXBsYXRlID0gaGFuZGxlYmFycy50ZW1wbGF0ZTxJUHJvZHVjdENvbnRleHQ+KChhd2FpdCBpbXBvcnRNb2R1bGU8YW55PihcbiAgICAgICAgbG9nLFxuICAgICAgICBgZXhwb3J0IGRlZmF1bHQgJHtjb25maWcudGVtcGxhdGVzPy5wcm9kdWN0Q2FyZFRlbXBsYXRlID8/ICcnfWBcbiAgICApKS5kZWZhdWx0IGFzIFRlbXBsYXRlU3BlY2lmaWNhdGlvbik7XG5cbiAgICBjb25zdCBjbGlja3Rocm91Z2hUZW1wbGF0ZSA9IGhhbmRsZWJhcnMudGVtcGxhdGU8SVByb2R1Y3RDb250ZXh0PigoYXdhaXQgaW1wb3J0TW9kdWxlPGFueT4oXG4gICAgICAgIGxvZyxcbiAgICAgICAgYGV4cG9ydCBkZWZhdWx0ICR7Y29uZmlnLnRlbXBsYXRlcz8uY2xpY2tUaHJvdWdoVXJsVGVtcGxhdGUgPz8gJyd9YFxuICAgICkpLmRlZmF1bHQgYXMgVGVtcGxhdGVTcGVjaWZpY2F0aW9uKTtcblxuICAgIHJldHVybiBPayh7XG4gICAgICAgIHNldHRpbmdzOiBjb25maWcuc2V0dGluZ3MsXG4gICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgY2xpY2tUaHJvdWdoVXJsVGVtcGxhdGU6IChjb250ZXh0OiBJUHJvZHVjdENvbnRleHQpID0+IGNsaWNrdGhyb3VnaFRlbXBsYXRlKGNvbnRleHQsIHsgaGVscGVycyB9KSxcbiAgICAgICAgICAgIHByb2R1Y3RDYXJkVGVtcGxhdGU6IChjb250ZXh0OiBJUHJvZHVjdENvbnRleHQpID0+IHByb2R1Y3RDYXJkVGVtcGxhdGUoY29udGV4dCwgeyBoZWxwZXJzIH0pLFxuICAgICAgICAgICAgamF2YXNjcmlwdENhbGxiYWNrczogYXdhaXQgaW1wb3J0TW9kdWxlKGxvZywgY29uZmlnLnRlbXBsYXRlcz8uamF2YXNjcmlwdENhbGxiYWNrcyA/PyAnJyksXG4gICAgICAgICAgICBwcm9kdWN0Q2FyZFN0eWxlc2hlZXQ6IGNvbmZpZy50ZW1wbGF0ZXM/LnByb2R1Y3RDYXJkU3R5bGVzaGVldCxcbiAgICAgICAgICAgIGNhcm91c2VsU3R5bGVzaGVldDogY29uZmlnLnRlbXBsYXRlcz8uY2Fyb3VzZWxTdHlsZXNoZWV0XG4gICAgICAgIH0sXG4gICAgICAgIGR5bmFtaWNab25lczogY29uZmlnLmR5bmFtaWNab25lc1xuICAgIH0pO1xufTtcblxuY29uc3QgaW1wb3J0TW9kdWxlID0gYXN5bmMgPFQ+KGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnaW1wb3J0TW9kdWxlJyk7XG4gICAgbG9nPy5kZWJ1ZygnaW1wb3J0aW5nJywgc2NyaXB0KTtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3NjcmlwdF0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgY29uc3QgbW9kdWxlVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBsb2c/LmRlYnVnKCdtb2R1bGVVcmwnLCBtb2R1bGVVcmwpO1xuICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gbW9kdWxlVXJsKSBhcyBUO1xuICAgIGxvZz8uZGVidWcoJ21vZHVsZTonLCBtb2R1bGUpO1xuICAgIHJldHVybiBtb2R1bGU7XG59O1xuIiwKICAgICJpbXBvcnQgeyBJQmlkUmVxdWVzdCwgSUJpZFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEN0eCwgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB7IEFzeW5jUmVzdWx0LCBFcnIsIE9rIH0gZnJvbSAnLi9SZXN1bHQnO1xuXG5jb25zdCBBVUNUSU9OX1BSSUNFX01BQ1JPID0gLyg/OlxcJHwlMjQpPyg/Olxce3wlN2IpYXVjdGlvbl9wcmljZSg/OlxcfXwlN2QpL2lnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0Qmlkc0ZuID0gKHJlcXVlc3Q6IElCaWRSZXF1ZXN0KSA9PiBBc3luY1Jlc3VsdDxJQmlkUmVzcG9uc2U+O1xuXG5leHBvcnQgY29uc3QgUmVxdWVzdEJpZHMgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICBiaWRSZXF1ZXN0OiBJQmlkUmVxdWVzdFxuKTogQXN5bmNSZXN1bHQ8SUJpZFJlc3BvbnNlPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcilcbiAgICAgICAgPy53aXRoKCdSZXF1ZXN0QmlkcycpXG4gICAgICAgIC53aXRoKGFjY291bnRJZClcbiAgICAgICAgLndpdGgoc2l0ZUlkKVxuICAgICAgICAud2l0aChsb2NhdGlvbklkKVxuICAgICAgICAud2l0aChjaGFubmVsSWQpO1xuICAgIGxvZz8uaW5mbygnUmVxdWVzdGluZyBiaWRzJyk7XG4gICAgbG9nPy5kZWJ1ZyhiaWRSZXF1ZXN0KTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJpZFJlcXVlc3QpXG4gICAgICAgIH0pO1xuICAgICAgICBsb2c/LmRlYnVnKCdHb3QgcmVzcG9uc2UnLCByZXNwb25zZSk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgbG9nPy53YXJuKCdObyBiaWRzJywgYmlkUmVxdWVzdCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBOb0JpZHNFcnJvcihiaWRSZXF1ZXN0LCByZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIGNhc2UgNTAwOlxuICAgICAgICAgICAgICAgICAgICBsb2c/LmVycm9yKCdCaWRkZXIgZmFpbGVkIHNlcnZlcnNpZGUuIFJlcG9ydCB0aGlzIGVycm9yLicsIGJpZFJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvcihiaWRSZXF1ZXN0LCByZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIGNhc2UgNTAzOlxuICAgICAgICAgICAgICAgICAgICBsb2c/LmVycm9yKCdCaWRkZXIgc3RhcnRpbmcgdXAuIFRyeSBhZ2FpbiBpbiBhIGZldyBtaW51dGVzJywgYmlkUmVxdWVzdCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBCaWRkZXJTdGFydGluZ1VwRXJyb3IoYmlkUmVxdWVzdCwgcmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsb2c/LmVycm9yKCdVbmtub3duIGJpZGRlciBlcnJvcicsIGJpZFJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgVW5rbm93bkJpZGRlckVycm9yKGJpZFJlcXVlc3QsIHJlc3BvbnNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2c/LmRlYnVnKCdTdWNjZXNzZnVsbHkgZ290IGJpZHMnLCBiaWRSZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgYmlkUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgSUJpZFJlc3BvbnNlO1xuICAgICAgICBpZiAoYmlkUmVzcG9uc2Uuc2VhdGJpZCA9PT0gdW5kZWZpbmVkIHx8IGJpZFJlc3BvbnNlLnNlYXRiaWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBsb2c/LmVycm9yKCdCaWRkZXIgZGlkblxcJ3QgcmV0dXJuIGFueSBzZWF0YmlkcycpO1xuICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgTWFsZm9ybWVkQmlkUmVzcG9uc2VFcnJvcihiaWRSZXF1ZXN0LCByZXNwb25zZSwgYmlkUmVzcG9uc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpZFJlc3BvbnNlLnNlYXRiaWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXRiaWQgPSBiaWRSZXNwb25zZS5zZWF0YmlkW2ldO1xuICAgICAgICAgICAgaWYgKHNlYXRiaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxvZz8ud2FybihgU2VhdGJpZCAjJHtpfSB3YXMgdW5kZWZpbmVkYCwgYmlkUmVxdWVzdCwgcmVzcG9uc2UsIGJpZFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2VhdGJpZC5iaWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiaWQgPSBzZWF0YmlkLmJpZFtqXTtcbiAgICAgICAgICAgICAgICBpZiAoYmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nPy53YXJuKGBCaWQgIyR7an0gaW4gc2VhdGJpZCAjJHtpfSB3YXMgdW5kZWZpbmVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBEZWNvZGUgYW55IHBvdGVudGlhbCBVUkkgZW5jb2RpbmcgKi9cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBiaWQuYWRtID0gZGVjb2RlVVJJQ29tcG9uZW50KGJpZD8uYWRtID8/ICcnKS5yZXBsYWNlQWxsKC9cXFxcXCIvaWcsICdcIicpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBsb2c/LmRlYnVnKCdBZG0gaXMgbm90IGVuY29kZWQuIFRoaXMgaXMgbm90IGFuIGlzc3VlLiBNb3Zpbmcgb24uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIE1hY3JvIHJlcGxhY2VtZW50IGlzIHBhcnQgb2YgT1JUQiBzcGVjLCBzbyBpdCBiZWxvbmdzIGhlcmUgKi9cbiAgICAgICAgICAgICAgICBiaWQubnVybCA9IGJpZC5udXJsPy5yZXBsYWNlKEFVQ1RJT05fUFJJQ0VfTUFDUk8sIGJpZC5wcmljZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBiaWQuYWRtID0gYmlkLmFkbT8ucmVwbGFjZUFsbChBVUNUSU9OX1BSSUNFX01BQ1JPLCBiaWQucHJpY2UudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2c/LmRlYnVnKCdSZXR1cm5pbmcgYmlkIHJlc3BvbnNlcycpO1xuICAgICAgICByZXR1cm4gT2soYmlkUmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gRXJyKGVyciBhcyBFcnJvcik7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE5vQmlkc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZT86IFJlc3BvbnNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCcyMDQgLSBObyBiaWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsU2VydmVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlOiBSZXNwb25zZVxuICAgICkge1xuICAgICAgICBzdXBlcignNTAwIC0gQmlkZGVyIGhhZCBhbiB1bmtub3duIHNlcnZlcnNpZGUgZXJyb3InKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaWRkZXJTdGFydGluZ1VwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlOiBSZXNwb25zZVxuICAgICkge1xuICAgICAgICBzdXBlcignNTAzIC0gQmlkZGVyIGlzIHN0YXJ0aW5nIHVwJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkJpZGRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZTogUmVzcG9uc2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ1Vua25vd24gYmlkZGVyIGVycm9yJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFsZm9ybWVkQmlkUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYmlkUmVzcG9uc2U6IHVua25vd25cbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ01hbGZvcm1lZCBiaWQgcmVzcG9uc2UgZXJyb3InKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSVByb2R1Y3RJbmZvcm1hdGlvbiB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIHR5cGUgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB7IEVyciwgT2ssIFJlc3VsdCwgdHlwZSBBc3luY1Jlc3VsdCB9IGZyb20gJy4vUmVzdWx0JztcblxuZXhwb3J0IHR5cGUgR2V0U3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuID0gKG5hdGl2ZUlkOiBzdHJpbmcpID0+IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+O1xuZXhwb3J0IHR5cGUgR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuID0gKG5hdGl2ZUlkOiBzdHJpbmcpID0+IFByb21pc2U8UmVzdWx0PElQcm9kdWN0SW5mb3JtYXRpb25bXT4+O1xuZXhwb3J0IHR5cGUgR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuID0gKHByb2R1Y3RJZDogc3RyaW5nKSA9PiBBc3luY1Jlc3VsdDxJUHJvZHVjdEluZm9ybWF0aW9uPlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gKkdldFNwb25zb3JlZFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBuYXRpdmVJZDogc3RyaW5nXG4pOiBBc3luY0dlbmVyYXRvcjxJUHJvZHVjdEluZm9ybWF0aW9uPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dldFNwb25zb3JlZFByb2R1Y3QnKS53aXRoKGFjY291bnRJZCkud2l0aChsb2NhdGlvbklkKS53aXRoKG5hdGl2ZUlkKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgc3BvbnNvcmVkIHByb2R1Y3QnLCApO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhd1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfS9uYXRpdmUvJHthY2NvdW50SWR9LyR7bG9jYXRpb25JZH0vJHtuYXRpdmVJZH0uanNvbmApO1xuICAgICAgICBpZihyYXdSZXNwb25zZS5zdGF0dXMgIT09IDIwMClcbiAgICAgICAge1xuICAgICAgICAgICAgbG9nPy5lcnJvcigncHJvZHVjdCBmZWVkIHNlcnZpY2UgcmV0dXJuZWQgd2l0aCBub24tMjAwIHJlc3BvbnNlJywgcmF3UmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWN0cyA9IHJhd1Jlc3BvbnNlIGFzIChSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdKTtcbiAgICAgICAgbG9nPy5kZWJ1ZygncmVzcG9uc2UnLCBwcm9kdWN0cyk7XG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvZHVjdHMpKSB7XG4gICAgICAgICAgICBsb2c/LmRlYnVnKCdCcmFuZCBsZXZlbCBjcmVhdGl2ZScpO1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdEFyciA9IHByb2R1Y3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICAgICAgICAgIGZvcihjb25zdCBwcm9kdWN0IG9mIHByb2R1Y3RBcnIpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm8obG9nLCBwcm9kdWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZz8uZGVidWcoJ0luZGl2aWR1YWwgcHJvZHVjdCBjcmVhdGl2ZScpO1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdCA9IHByb2R1Y3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICByZXR1cm4gbWFwUmVzcG9uc2VUb1Byb2R1Y3RJbmZvKGxvZywgcHJvZHVjdCk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGVycikge1xuICAgICAgICBsb2c/LmVycm9yKGVycik7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgR2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBuYXRpdmVJZDogc3RyaW5nXG4pOiBQcm9taXNlPFJlc3VsdDxJUHJvZHVjdEluZm9ybWF0aW9uW10+PiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dldFNwb25zb3JlZFByb2R1Y3QnKS53aXRoKGFjY291bnRJZCkud2l0aChsb2NhdGlvbklkKS53aXRoKG5hdGl2ZUlkKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgc3BvbnNvcmVkIHByb2R1Y3QnLCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt1cmx9L25hdGl2ZS8ke2FjY291bnRJZH0vJHtsb2NhdGlvbklkfS8ke25hdGl2ZUlkfS5qc29uYCk7XG4gICAgICAgIGlmIChyYXdSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgbG9nPy5lcnJvcigncHJvZHVjdCBmZWVkIHNlcnZpY2UgcmV0dXJuZWQgd2l0aCBub24tMjAwIHJlc3BvbnNlJywgcmF3UmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybiBFcnIobmV3IE5vTmF0aXZlRXJyb3IobmF0aXZlSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWN0cyA9IChhd2FpdCByYXdSZXNwb25zZS5qc29uKCkpIGFzIChSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdKTtcbiAgICAgICAgbG9nPy5kZWJ1ZygncmVzcG9uc2UnLCBwcm9kdWN0cyk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb2R1Y3RzKSkge1xuICAgICAgICAgICAgbG9nPy5kZWJ1ZygnQnJhbmQgbGV2ZWwgY3JlYXRpdmUnKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RBcnIgPSBwcm9kdWN0cyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgICAgICAgICBjb25zdCBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm9Mb2dnZWQgPSBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm8uYmluZCh1bmRlZmluZWQsIGxvZyk7XG4gICAgICAgICAgICByZXR1cm4gT2socHJvZHVjdEFyci5tYXAobWFwUmVzcG9uc2VUb1Byb2R1Y3RJbmZvTG9nZ2VkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2c/LmRlYnVnKCdJbmRpdmlkdWFsIHByb2R1Y3QgY3JlYXRpdmUnKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3QgPSBwcm9kdWN0cyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgcmV0dXJuIE9rKFttYXBSZXNwb25zZVRvUHJvZHVjdEluZm8obG9nLCBwcm9kdWN0KV0pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZz8uZXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBHZXRSZWNvbW1lbmRlZFByb2R1Y3QgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBwcm9kdWN0SWQ6IHN0cmluZ1xuKTogQXN5bmNSZXN1bHQ8SVByb2R1Y3RJbmZvcm1hdGlvbj4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdHZXRSZWNvbW1lbmRlZFByb2R1Y3QnKS53aXRoKGFjY291bnRJZCkud2l0aChsb2NhdGlvbklkKS53aXRoKHByb2R1Y3RJZCk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIHJlY29tbWVuZGVkIHByb2R1Y3QnKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgYCR7dXJsfS9wcm9kdWN0LyR7YWNjb3VudElkfS8ke2xvY2F0aW9uSWR9LyR7cHJvZHVjdElkfS5qc29uYFxuICAgICAgICApO1xuICAgICAgICBpZiAocmF3UmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgIGxvZz8uZXJyb3IoJ3Byb2R1Y3QgZmVlZCBzZXJ2aWNlIHJldHVybmVkIHdpdGggbm9uLTIwMCByZXNwb25zZScsIHJhd1Jlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcigncHJvZHVjdCBmZWVkIHNlcnZpY2UgcmV0dXJuZWQgd2l0aCBub24tMjAwIHJlc3BvbnNlJykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhd1Byb2R1Y3QgPSBhd2FpdCByYXdSZXNwb25zZS5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgbG9nPy5kZWJ1ZygncmVzcG9uc2UnLCByYXdQcm9kdWN0KTtcbiAgICAgICAgY29uc3QgcHJvZHVjdEluZm8gPSBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm8obG9nLCByYXdQcm9kdWN0KTtcbiAgICAgICAgbG9nPy5kZWJ1ZygnbWFwcGVkJywgcHJvZHVjdEluZm8pO1xuICAgICAgICByZXR1cm4gT2socHJvZHVjdEluZm8pO1xuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIGxvZz8uZXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmNvbnN0IG1hcFJlc3BvbnNlVG9Qcm9kdWN0SW5mbyA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PlxuKTogSVByb2R1Y3RJbmZvcm1hdGlvbiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ21hcFJlc3BvbnNlVG9Qcm9kdWN0SW5mbycpO1xuICAgIGxvZz8uZGVidWcoJ01hcHBpbmcgcHJvZHVjdCcpO1xuICAgIGNvbnN0IGdldEZpZWxkID0gZmllbGRPclVuZGVmLmJpbmQodW5kZWZpbmVkLCBkYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbWFnZTogZ2V0RmllbGQoJ2ltYWdlX2xpbmsnKSxcbiAgICAgICAgcHJpY2U6IGdldEZpZWxkKCdwcmljZScpLFxuICAgICAgICBzYWxlUHJpY2U6IGdldEZpZWxkKCdzYWxlX3ByaWNlJyksXG4gICAgICAgIHRoYzogZ2V0RmllbGQoJ3RoYycpLFxuICAgICAgICBjYmQ6IGdldEZpZWxkKCdjYmQnKSxcbiAgICAgICAgc3RyYWluOiBnZXRGaWVsZCgnc3RyYWluJyksXG4gICAgICAgIG5hbWU6IGdldEZpZWxkKCduYW1lJyksXG4gICAgICAgIGJyYW5kX25hbWU6IGdldEZpZWxkKCdicmFuZCcpLFxuICAgICAgICBicmFuZE5hbWU6IGdldEZpZWxkKCdicmFuZCcpLFxuICAgICAgICBwcm9kdWN0VHlwZTogZ2V0RmllbGQoJ3Byb2R1Y3RUeXBlJyksXG4gICAgICAgIGRldGFpbHM6IGdldEZpZWxkKCdkZXRhaWxzJyksXG4gICAgICAgIGN0YTogZ2V0RmllbGQoJ2N0YScpLFxuICAgICAgICBjbGlja3Rocm91Z2hVcmw6IGdldEZpZWxkKCdjbGlja3Rocm91Z2hVcmwnKSxcbiAgICAgICAgd2luVXJsOiBnZXRGaWVsZCgnd2luVXJsJyksXG4gICAgICAgIHBpeGVsVXJsOiBnZXRGaWVsZCgncGl4ZWxVcmwnKSxcbiAgICAgICAgZXh0OiBkYXRhXG4gICAgfTtcbn07XG5cbmNvbnN0IGZpZWxkT3JVbmRlZiA9IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZihmaWVsZCBpbiBkYXRhKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZGF0YVtmaWVsZF0pO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNsYXNzIE5vTmF0aXZlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hdGl2ZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoJ05hdGl2ZSBJRCBkaWQgbm90IGV4aXN0IGluIHByb2R1Y3QgZmVlZDogJyArIG5hdGl2ZUlkKTtcbiAgICB9XG59XG5cblxuLy9ibGlzc2FuZGxleC11ZXNcbi8vIGJsaXNzYW5kbGV4LXVlc1xuLy8gYmxpc3NhbmRsZXgtdWVzXG4vLyBibGlzc2FuZGxleC11ZXNcbi8vIGJsaXNzYW5kbGV4LXVlcyIsCiAgICAiaW1wb3J0IHR5cGUgeyBJUHJvZHVjdEluZm9ybWF0aW9uLCBJUmVjb21tZW5kZWRQcm9kdWN0LCBJUmVjb21tZW5kZXJSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIHR5cGUgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuIH0gZnJvbSAnLi9Qcm9kdWN0JztcbmltcG9ydCB7IEVyciwgT2ssIHR5cGUgQXN5bmNSZXN1bHQgfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbiA9ICgpID0+IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+O1xuZXhwb3J0IHR5cGUgUGVyc29uYWxSZWNvbW1lbmRlckZuID0gKHVzZXJJZDogc3RyaW5nKSA9PiBBc3luY0dlbmVyYXRvcjxJUHJvZHVjdEluZm9ybWF0aW9uPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICpHZW5lcmF0ZVRvcFByb2R1Y3RzKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBwcm9kdWN0RmVlZDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZ1xuKTogQXN5bmNHZW5lcmF0b3I8SVByb2R1Y3RJbmZvcm1hdGlvbj4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdHZW5lcmF0ZVRvcFByb2R1Y3RzJykud2l0aChhY2NvdW50SWQpLndpdGgoc2l0ZUlkKS53aXRoKGxvY2F0aW9uSWQpO1xuICAgIGxvZz8uaW5mbygnR2VuZXJhdGluZyB0b3AgcHJvZHVjdHMnKTtcblxuICAgIHlpZWxkKiBnZW5lcmF0ZVByb2R1Y3RSZWNvbW1lbmRhdGlvbihcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBwcm9kdWN0RmVlZCxcbiAgICAgICAgdXJsLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAndG9wLXByb2R1Y3RzJ1xuICAgICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAqR2VuZXJhdGVGb3JZb3UoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHByb2R1Y3RGZWVkOiBHZXRSZWNvbW1lbmRlZFByb2R1Y3RGcm9tUHJvZHVjdElkRm4sXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICAgc2l0ZUlkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25JZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nXG4pOiBBc3luY0dlbmVyYXRvcjxJUHJvZHVjdEluZm9ybWF0aW9uPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dlbmVyYXRlRm9yWW91Jykud2l0aChhY2NvdW50SWQpLndpdGgoc2l0ZUlkKS53aXRoKGxvY2F0aW9uSWQpLndpdGgodXNlcklkKTtcbiAgICBsb2c/LmluZm8oJ0dlbmVyYXRpbmcgZm9yIHlvdScpO1xuXG4gICAgeWllbGQqIGdlbmVyYXRlUHJvZHVjdFJlY29tbWVuZGF0aW9uKFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIHByb2R1Y3RGZWVkLFxuICAgICAgICB1cmwsXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgc2l0ZUlkLFxuICAgICAgICBsb2NhdGlvbklkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgICdmb3IteW91J1xuICAgICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAqR2VuZXJhdGVQcmV2aW91c1B1cmNoYXNlcyhcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgcHJvZHVjdEZlZWQ6IEdldFJlY29tbWVuZGVkUHJvZHVjdEZyb21Qcm9kdWN0SWRGbixcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgICBzaXRlSWQ6IHN0cmluZyxcbiAgICBsb2NhdGlvbklkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmdcbik6IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKVxuICAgICAgICA/LndpdGgoJ0dlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMnKVxuICAgICAgICAud2l0aChhY2NvdW50SWQpXG4gICAgICAgIC53aXRoKHNpdGVJZClcbiAgICAgICAgLndpdGgobG9jYXRpb25JZClcbiAgICAgICAgLndpdGgodXNlcklkKTtcbiAgICBsb2c/LmluZm8oJ0dlbmVyYXRpbmcgcHJldmlvdXMgcHVyY2hhc2VzJyk7XG5cbiAgICB5aWVsZCogZ2VuZXJhdGVQcm9kdWN0UmVjb21tZW5kYXRpb24oXG4gICAgICAgIGxvZyxcbiAgICAgICAgcHJvZHVjdEZlZWQsXG4gICAgICAgIHVybCwgYWNjb3VudElkLFxuICAgICAgICBzaXRlSWQsXG4gICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgJ2J1eS1hZ2FpbidcbiAgICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiAqZ2VuZXJhdGVQcm9kdWN0UmVjb21tZW5kYXRpb24gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBwcm9kdWN0RmVlZDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBzdHJpbmdcbik6IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2VuZXJhdHJlUHJvZHVjdFJlY29tbWVuZGF0aW9uJyk7XG4gICAgbG9nPy5kZWJ1ZygnR2VuZXJhdGluZyBwcm9kdWN0IHJlY29tbWVuZGF0aW9uJyk7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25zID0gYXdhaXQgZmV0Y2hSZWNvbW1lbmRhdGlvbnMoXG4gICAgICAgIGxvZyxcbiAgICAgICAgdXJsLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB0eXBlXG4gICAgKTtcbiAgICBpZighcmVjb21tZW5kYXRpb25zLm9rKSB7XG4gICAgICAgIGxvZz8uZXJyb3IocmVjb21tZW5kYXRpb25zLmVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkKiBnZW5lcmF0ZVByb2R1Y3QobG9nLCBwcm9kdWN0RmVlZCwgYWNjb3VudElkLCBsb2NhdGlvbklkLCByZWNvbW1lbmRhdGlvbnMudmFsdWUpO1xuICAgIGxvZz8uZGVidWcoJ291dCBvZiByZWNvbW1lbmRhdGlvbnMnKTtcbn1cblxuY29uc3QgZmV0Y2hSZWNvbW1lbmRhdGlvbnMgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBzdHJpbmdcbik6IEFzeW5jUmVzdWx0PElSZWNvbW1lbmRlZFByb2R1Y3RbXT4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdmZXRjaFJlY29tbWVuZGF0aW9ucycpO1xuICAgIGxvZz8uZGVidWcoJ0ZldGNoaW5nIHJlY29tbWVuZGF0aW9ucycpO1xuXG4gICAgY29uc3Qga2V5ID0gYGFjY291bnRJZD0ke2FjY291bnRJZH0mc2l0ZUlkPSR7c2l0ZUlkfSZsb2NhdGlvbklkPSR7bG9jYXRpb25JZH0mdXNlcklkPSR7dXNlcklkID8/ICdudWxsJ31gO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBmZXRjaChgJHt1cmx9L3IvJHt0eXBlfT8ke2tleX0mbGltaXQ9MTAwYCk7XG4gICAgICAgIGlmKCFyZXN1bHRzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgcmVjb21tZW5kYXRpb25zLiBTZXJ2aWNlIHJldHVybmVkICcgKyByZXN1bHRzLnN0YXR1cykpO1xuICAgICAgICB9XG4gICAgICAgIC8qIE9uIGVycm9yLCB0aGUgcmVzdWx0IHdpbGwgYmUgSVJlY29tbWVuZGVyUmVzcG9uc2UuXG4gICAgICAgICAqIE9uIHN1Y2Nlc3MsIGl0IHdpbGwganVzdCBiZSBhIHNldCBvZiByZWNvbW1lbmRlZCBwcm9kdWN0cyAqL1xuICAgICAgICBjb25zdCByZWNvbW1lbmRhdGlvbnMgPSBhd2FpdCByZXN1bHRzLmpzb24oKSBhcyAoSVJlY29tbWVuZGVyUmVzcG9uc2UgfCBJUmVjb21tZW5kZWRQcm9kdWN0W10pO1xuICAgICAgICBjb25zdCBlcnJvciA9IChyZWNvbW1lbmRhdGlvbnMgYXMgSVJlY29tbWVuZGVyUmVzcG9uc2UpLmVycm9yO1xuICAgICAgICBpZihlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcihlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9rKHJlY29tbWVuZGF0aW9ucyBhcyBJUmVjb21tZW5kZWRQcm9kdWN0W10pO1xuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyIGFzIEVycm9yKTtcbiAgICB9XG59O1xuXG5hc3luYyBmdW5jdGlvbiogZ2VuZXJhdGVQcm9kdWN0KFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBwcm9kdWN0RmVlZDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICByZXN1bHRzOiBJUmVjb21tZW5kZWRQcm9kdWN0W11cbik6IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2VuZXJhdGVQcm9kdWN0Jyk7XG4gICAgbG9nPy5kZWJ1ZygnZ2VuZXJhdGluZyBwcm9kdWN0IGluZm8nKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0uaXRlbV9pZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZz8uZGVidWcoJ2l0ZW1JZCcsIGl0ZW1JZCk7XG4gICAgICAgICAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgcHJvZHVjdEZlZWQoaXRlbUlkKTtcbiAgICAgICAgICAgIGxvZz8uZGVidWcoJ3Byb2R1Y3QnLCBpdGVtSWQsIHByb2R1Y3QpO1xuICAgICAgICAgICAgaWYgKHByb2R1Y3Qub2spIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2c/Lndhcm4oJ2l0ZW0gd2FzIG1pc3NpbmcgZnJvbSBwcm9kdWN0IGZlZWQnLCBpdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZz8ud2FybignY291bGRuXFwndCBnZXQgcHJvZHVjdCcsIGVycik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2c/LmluZm8oJ25vIG1vcmUgcHJvZHVjdHMuIEV4aXRpbmcnKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbiwgSU5hdGl2ZVRlbXBsYXRlRGVsZWdhdGVXaW5kb3csIElQcm9kdWN0SW5mb3JtYXRpb24gfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ3R4LCBJTG9nZ2VyIH0gZnJvbSAnLi9Mb2dnZXInO1xuaW1wb3J0IHsgRXJyLCBHZXRWYWx1ZU9yVGhyb3csIE9rLCBSZXN1bHQgfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIEV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZUZuID0gKFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb24sXG4gICAgY2xpY2t0aHJvdWdoPzogc3RyaW5nXG4pID0+IFJlc3VsdDxzdHJpbmc+O1xuXG5leHBvcnQgdHlwZSBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4gPSAoXG4gICAgcHJvZHVjdDogSVByb2R1Y3RJbmZvcm1hdGlvblxuKSA9PiBSZXN1bHQ8c3RyaW5nPjtcblxuZXhwb3J0IGNvbnN0IEV2YWx1YXRlSGFuZGxlYmFyc1Byb2R1Y3RDYXJkVGVtcGxhdGUgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIHB1Ymxpc2hlcjogSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbixcbiAgICBwcm9kdWN0OiBJUHJvZHVjdEluZm9ybWF0aW9uLFxuICAgIGNsaWNrdGhyb3VnaD86IHN0cmluZ1xuKTogUmVzdWx0PHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdFdmFsdWF0ZUhhbmRsZWJhcnNQcm9kdWN0Q2FyZFRlbXBsYXRlJyk7XG4gICAgbG9nPy5pbmZvKCdFdmFsdWF0aW5nIGhhbmRsZWJhcnMgcHJvZHVjdCBjYXJkIHRlbXBsYXRlJywgcHJvZHVjdCk7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZW5kZXJlZENsaWNrdGhyb3VnaCA9IGNsaWNrdGhyb3VnaCA/PyBHZXRWYWx1ZU9yVGhyb3coXG4gICAgICAgICAgICBFdmFsdWF0ZUhhbmRsZWJhcnNDbGlja3Rocm91Z2hUZW1wbGF0ZShsb2csXG4gICAgICAgICAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgICAgICAgICAgcHJvZHVjdFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBsb2c/LmRlYnVnKCdHb3QgY2xpY2t0aHJvdWdoIFVSTCcsIHJlbmRlcmVkQ2xpY2t0aHJvdWdoKTtcblxuICAgICAgICByZXR1cm4gT2socHVibGlzaGVyLnRlbXBsYXRlcy5wcm9kdWN0Q2FyZFRlbXBsYXRlKHtcbiAgICAgICAgICAgIC4uLnByb2R1Y3QsXG4gICAgICAgICAgICBwcm9kdWN0LFxuICAgICAgICAgICAgd2luZG93OiB3aW5kb3dJbmZvLFxuICAgICAgICAgICAgcHVibGlzaGVyLFxuICAgICAgICAgICAgY2F0YWxvZzogcHJvZHVjdCxcbiAgICAgICAgICAgIGNsaWNrdGhyb3VnaDogcmVuZGVyZWRDbGlja3Rocm91Z2hcbiAgICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBFdmFsdWF0ZUhhbmRsZWJhcnNDbGlja3Rocm91Z2hUZW1wbGF0ZSA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgd2luZG93SW5mbzogSU5hdGl2ZVRlbXBsYXRlRGVsZWdhdGVXaW5kb3csXG4gICAgcHVibGlzaGVyOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb25cbik6IFJlc3VsdDxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnRXZhbHVhdGVIYW5kbGViYXJzQ2xpY2t0aHJvdWdoVGVtcGxhdGUnKTtcbiAgICBsb2c/LmluZm8oJ0V2YWx1YXRpbmcgaGFuZGxlYmFycyBjbGlja3Rocm91Z2ggVVJMIHRlbXBsYXRlJywgcHJvZHVjdCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9rKHB1Ymxpc2hlci50ZW1wbGF0ZXMuY2xpY2tUaHJvdWdoVXJsVGVtcGxhdGUoe1xuICAgICAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgICAgIGNhdGFsb2c6IHByb2R1Y3QsXG4gICAgICAgICAgICB3aW5kb3c6IHdpbmRvd0luZm8sXG4gICAgICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgICAgICAuLi5wcm9kdWN0XG4gICAgICAgIH0pKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbn07XG4iLAogICAgImltcG9ydCB7IElCdWlsdFJlc3BvbnNlLCBOYXRpdmVSZXF1ZXN0QnVpbGRlckZuLCBSZXF1ZXN0QnVpbGRlciwgUmVxdWVzdEJ1aWxkZXJGbiB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgSUJpZFJlcXVlc3QsIElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sIElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb25EVE8sIElQdWJsaXNoZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gICAgRHluYW1pY0NyZWF0aXZlLFxuICAgIElEeW5hbWljQmFubmVyLFxuICAgIElEeW5hbWljVmlkZW8sXG4gICAgSUR5bmFtaWNab25lLFxuICAgIElTY3JlZW5TaXplXG59IGZyb20gJy4uL21vZGVscy9keW5hbWljL0R5bmFtaWNab25lJztcbmltcG9ydCB7IElTY3JlZW4gfSBmcm9tICcuL0RldmljZSc7XG5pbXBvcnQgeyBDdHgsIElMb2dnZXIgfSBmcm9tICcuL0xvZ2dlcic7XG5pbXBvcnQgeyBBc3luY1Jlc3VsdCwgRXJyLCBHZXRWYWx1ZSwgT2ssIFJlc3VsdCwgVHJ5RG8gfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUR5bmFtaWNab25lUmVxdWVzdCB7XG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3Q7XG4gICAgcmVxdWVzdElkczogUmVjb3JkPHN0cmluZywgRHluYW1pY0NyZWF0aXZlPjtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGREeW5hbWljWm9uZVJlcXVlc3RGbiA9ICh6b25lSWQ6IHN0cmluZywgZHluYW1pY1pvbmU6IElEeW5hbWljWm9uZSkgPT4gUmVzdWx0PElEeW5hbWljWm9uZVJlcXVlc3Q+O1xuZXhwb3J0IHR5cGUgR2V0RHluYW1pY1pvbmVGbiA9ICh6b25lSWQ6IHN0cmluZykgPT4gQXN5bmNSZXN1bHQ8SUR5bmFtaWNab25lPjtcblxuZXhwb3J0IGNvbnN0IEdldER5bmFtaWNab25lID0gYXN5bmMgKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBjb25maWc6IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgem9uZUlkOiBzdHJpbmdcbikgPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdHZXREeW5hbWljWm9uZScpO1xuICAgIGxvZz8uaW5mbygnR2V0dGluZyBkeW5hbWljIHpvbmUnLCB6b25lSWQpO1xuXG4gICAgY29uc3QgZHluYW1pY1pvbmUgPSBjb25maWc/LmR5bmFtaWNab25lcz8uW3pvbmVJZF07XG4gICAgaWYoZHluYW1pY1pvbmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nRHluYW1pY1pvbmVFcnJvcih6b25lSWQpKTtcbiAgICB9XG4gICAgbG9nPy5kZWJ1ZygnRHluYW1pYyB6b25lJywgZHluYW1pY1pvbmUpO1xuICAgIHJldHVybiBPayhkeW5hbWljWm9uZSk7XG59O1xuXG5leHBvcnQgY29uc3QgQnVpbGREeW5hbWljWm9uZVJlcXVlc3QgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXJ0UmVxdWVzdDogUmVxdWVzdEJ1aWxkZXJGbixcbiAgICBuYXRpdmVSZXF1ZXN0OiBOYXRpdmVSZXF1ZXN0QnVpbGRlckZuLFxuICAgIHNjcmVlbkluZm86IElTY3JlZW4sXG4gICAgem9uZUlkOiBzdHJpbmcsXG4gICAgZHluYW1pY1pvbmU6IElEeW5hbWljWm9uZVxuKTogUmVzdWx0PElEeW5hbWljWm9uZVJlcXVlc3Q+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnQnVpbGREeW5hbWljWm9uZVJlcXVlc3QnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIGR5bmFtaWMgem9uZSByZXF1ZXN0JywgZHluYW1pY1pvbmUpO1xuXG4gICAgY29uc3Qgc2NyZWVuU2l6ZVJlcyA9IHNlbGVjdER5bmFtaWNTY3JlZW5TaXplKGxvZywgc2NyZWVuSW5mbywgZHluYW1pY1pvbmUpO1xuICAgIGlmKCFzY3JlZW5TaXplUmVzLm9rKSB7XG4gICAgICAgIHJldHVybiBzY3JlZW5TaXplUmVzO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZER5bmFtaWNCaWRSZXF1ZXN0RnJvbVNlbGVjdGVkU2NyZWVuU2l6ZShsb2csXG4gICAgICAgIHN0YXJ0UmVxdWVzdCxcbiAgICAgICAgbmF0aXZlUmVxdWVzdCxcbiAgICAgICAgem9uZUlkLFxuICAgICAgICBzY3JlZW5TaXplUmVzLnZhbHVlXG4gICAgKTtcbn07XG5cbmNvbnN0IHNlbGVjdER5bmFtaWNTY3JlZW5TaXplID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgIGR5bmFtaWNab25lOiBJRHluYW1pY1pvbmVcbik6IFJlc3VsdDxJU2NyZWVuU2l6ZT4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdzZWxlY3REeW5hbWljU2NyZWVuU2l6ZScpO1xuICAgIGxvZz8uaW5mbygnR2V0dGluZyBzY3JlZW4gc2l6ZSBmb3IgZHluYW1pYyB6b25lJywgc2NyZWVuSW5mbyk7XG4gICAgY29uc3Qgc2NyZWVuU2l6ZSA9IEdldFZhbHVlKFRyeURvKCgpID0+IHtcbiAgICAgICAgaWYoc2NyZWVuSW5mby53aWR0aCA8IDc2OCkge1xuICAgICAgICAgICAgcmV0dXJuICdtb2JpbGUnO1xuICAgICAgICB9IGVsc2UgaWYoc2NyZWVuSW5mby53aWR0aCA8IDEwMjQpIHtcbiAgICAgICAgICAgIHJldHVybiAndGFibGV0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnZGVza3RvcCc7XG4gICAgICAgIH1cbiAgICB9KSkgPz8gJ2RlZmF1bHQnO1xuICAgIGNvbnN0IHNlbGVjdGVkRHluYW1pYyA9IGR5bmFtaWNab25lLnZhbHVlXG4gICAgICAgIC5maWx0ZXIoc2NyZWVuID0+IHNjcmVlbi5zaXplID09PSBzY3JlZW5TaXplKVxuICAgICAgICA/LlswXVxuICAgID8/IGR5bmFtaWNab25lLnZhbHVlXG4gICAgICAgIC5maWx0ZXIoc2NyZWVuID0+IHNjcmVlbi5zaXplID09PSAnZGVmYXVsdCcpXG4gICAgICAgID8uWzBdO1xuXG4gICAgaWYoc2VsZWN0ZWREeW5hbWljID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTm9EeW5hbWljU2NyZWVuU2l6ZU1hdGNoRXJyb3IoXG4gICAgICAgICAgICBkeW5hbWljWm9uZSxcbiAgICAgICAgICAgIHNjcmVlbkluZm8sXG4gICAgICAgICAgICBzY3JlZW5TaXplXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIGxvZz8uZGVidWcoJ3NlbGVjdGVkRHluYW1pYycsIHNlbGVjdGVkRHluYW1pYylcbiAgICByZXR1cm4gT2soc2VsZWN0ZWREeW5hbWljKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBOb0R5bmFtaWNTY3JlZW5TaXplTWF0Y2hFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGR5bmFtaWNab25lOiBJRHluYW1pY1pvbmUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWRTdHJpbmdTaXplOiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ05vIGR5bmFtaWMgc2NyZWVuIHNpemUgbWF0Y2hlZCB0aGUgd2luZG93IHdpZHRoJyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkRHluYW1pY0JpZFJlcXVlc3RGcm9tU2VsZWN0ZWRTY3JlZW5TaXplID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGFydFJlcXVlc3Q6IFJlcXVlc3RCdWlsZGVyRm4sXG4gICAgbmF0aXZlUmVxdWVzdDogTmF0aXZlUmVxdWVzdEJ1aWxkZXJGbixcbiAgICB6b25lSWQ6IHN0cmluZyxcbiAgICBzY3JlZW5TaXplOiBJU2NyZWVuU2l6ZVxuKTogUmVzdWx0PElEeW5hbWljWm9uZVJlcXVlc3Q+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnYnVpbGREeW5hbWljQmlkUmVxdWVzdEZyb21TZWxlY3RlZFNjcmVlblNpemUnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIGR5bmFtaWMgYmlkIHJlcXVlc3QnLCB6b25lSWQsIHNjcmVlblNpemUpO1xuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgIG5hdGl2ZVJlcXVlc3QsXG4gICAgICAgIHN0YXJ0UmVxdWVzdCh6b25lSWQpLFxuICAgICAgICB7fSxcbiAgICAgICAgc2NyZWVuU2l6ZS52YWx1ZXNcbiAgICApO1xuXG4gICAgaWYoIXJlcXVlc3RQYXlsb2FkLm9rKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0UGF5bG9hZDtcbiAgICB9XG4gICAgbG9nPy5kZWJ1ZygncmVxdWVzdFBheWxvYWQnLCByZXF1ZXN0UGF5bG9hZCk7XG5cbiAgICBjb25zdCBbYnVpbGRlciwgcmVxdWVzdElkc10gPSByZXF1ZXN0UGF5bG9hZC52YWx1ZTtcbiAgICByZXR1cm4gT2soe1xuICAgICAgICByZXF1ZXN0OiBidWlsZGVyLmJ1aWxkKCksXG4gICAgICAgIHJlcXVlc3RJZHNcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZER5bmFtaWNCaWRSZXF1ZXN0UmVjdXJzaXZlID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBuYXRpdmVSZXF1ZXN0OiBOYXRpdmVSZXF1ZXN0QnVpbGRlckZuLFxuICAgIGJ1aWxkZXI6IFJlcXVlc3RCdWlsZGVyLFxuICAgIHJlcXVlc3RJZHM6IFJlY29yZDxzdHJpbmcsIER5bmFtaWNDcmVhdGl2ZT4sXG4gICAgW2hlYWQsIC4uLnRhaWxdOiBEeW5hbWljQ3JlYXRpdmVbXVxuKTogUmVzdWx0PFtidWlsZGVyOiBSZXF1ZXN0QnVpbGRlciwgcmVxdWVzdElkczogUmVjb3JkPHN0cmluZywgRHluYW1pY0NyZWF0aXZlPl0+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKTtcbiAgICBsb2c/LmluZm8oJ2Rlc2NlbmRpbmcuLi4nKTtcbiAgICBpZihoZWFkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTm90IGFuIGVycm9yIC0gd2UgYXJlIGRvbmVcbiAgICAgICAgbG9nPy5pbmZvKCdGaW5pc2hlZCcpO1xuICAgICAgICByZXR1cm4gT2soW2J1aWxkZXIsIHJlcXVlc3RJZHNdKTtcbiAgICB9XG4gICAgaWYoaGVhZC50eXBlID09PSAnQmFubmVyJykge1xuICAgICAgICBsb2c/LmluZm8oJ0FkZGluZyBiYW5uZXIgdG8gcmVxdWVzdCcpO1xuICAgICAgICBjb25zdCBiYW5uZXIgPSBoZWFkIGFzIElEeW5hbWljQmFubmVyO1xuICAgICAgICBjb25zdCBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICAgIHJldHVybiBidWlsZER5bmFtaWNCaWRSZXF1ZXN0UmVjdXJzaXZlKGxvZyxcbiAgICAgICAgICAgIG5hdGl2ZVJlcXVlc3QsXG4gICAgICAgICAgICBidWlsZGVyLndpdGhCYW5uZXIoYmFubmVyLndpZHRoLCBiYW5uZXIuaGVpZ2h0LCB1bmRlZmluZWQsIHsgaWQgfSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucmVxdWVzdElkcyxcbiAgICAgICAgICAgICAgICBbaWRdOiBoZWFkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFpbFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZihoZWFkLnR5cGUgPT09ICdWaWRlbycpIHtcbiAgICAgICAgbG9nPy5pbmZvKCdBZGRpbmcgdmlkZW8gdG8gcmVxdWVzdCcpO1xuICAgICAgICBjb25zdCB2aWRlbyA9IGhlYWQgYXMgSUR5bmFtaWNWaWRlbztcbiAgICAgICAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICByZXR1cm4gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgICAgICBuYXRpdmVSZXF1ZXN0LFxuICAgICAgICAgICAgYnVpbGRlci53aXRoVmlkZW8oXG4gICAgICAgICAgICAgICAgdmlkZW8ud2lkdGgsXG4gICAgICAgICAgICAgICAgdmlkZW8uaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHZpZGVvLm1pbkR1cmF0aW9uID8/IDAsXG4gICAgICAgICAgICAgICAgdmlkZW8ubWF4RHVyYXRpb24sXG4gICAgICAgICAgICAgICAgWyd2aWRlby9tcDQnLCAndmlkZW8vd2VibSddLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB7IGlkIH1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucmVxdWVzdElkcyxcbiAgICAgICAgICAgICAgICBbaWRdOiBoZWFkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFpbFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZihoZWFkLnR5cGUgPT09ICdDYXJvdXNlbCcgfHwgaGVhZC50eXBlID09PSAnUHJvZHVjdENhcmQnKSB7XG4gICAgICAgIGxvZz8uaW5mbygnQWRkaW5nIGNhcm91c2VsIHRvIHJlcXVlc3QnKTtcbiAgICAgICAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICByZXR1cm4gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgICAgICBuYXRpdmVSZXF1ZXN0LFxuICAgICAgICAgICAgYnVpbGRlci53aXRoTmF0aXZlKFxuICAgICAgICAgICAgICAgIG5hdGl2ZVJlcXVlc3QoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aE1ldGFQcm9kdWN0KClcbiAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCksXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHsgaWQgfVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5yZXF1ZXN0SWRzLFxuICAgICAgICAgICAgICAgIFtpZF06IGhlYWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWlsXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nPy53YXJuKCdJbnZhbGlkIGNyZWF0aXZlIHR5cGUuIFNraXBwaW5nLicsIGhlYWQpO1xuICAgICAgICByZXR1cm4gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgICAgICBuYXRpdmVSZXF1ZXN0LFxuICAgICAgICAgICAgYnVpbGRlcixcbiAgICAgICAgICAgIHJlcXVlc3RJZHMsXG4gICAgICAgICAgICB0YWlsXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdEeW5hbWljWm9uZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB6b25lSWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcignTWlzc2luZyBkeW5hbWljIHpvbmUgJyArIHpvbmVJZCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQge1xuICAgIENvbnRleHRTdWJUeXBlcyxcbiAgICBDb250ZXh0VHlwZXMsXG4gICAgRXZlbnRUcmFja2luZ01ldGhvZHMsXG4gICAgRXZlbnRUeXBlcyxcbiAgICB0eXBlIElBc3NldE9iamVjdCxcbiAgICB0eXBlIElFdmVudFRyYWNrZXJSZXF1ZXN0T2JqZWN0LFxuICAgIHR5cGUgSU5hdGl2ZVJlcXVlc3QsXG4gICAgTmF0aXZlQXNzZXRJZCxcbiAgICBOYXRpdmVEYXRhVHlwZXMsXG4gICAgUGxhY2VtZW50VHlwZXMsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIElMb2dnZXIgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbmNvbnN0IERFRkFVTFRfTEVOR1RIID0gODA7XG5jb25zdCBWQVNUXzNfMCA9IDM7XG5cbmV4cG9ydCB0eXBlIE5hdGl2ZVJlcXVlc3RCdWlsZGVyRm4gPSAoKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcjtcblxuZXhwb3J0IHR5cGUgTmF0aXZlUmVxdWVzdEJ1aWxkZXIgPSB7XG4gICAgd2l0aFZlcjogKHZlcjogc3RyaW5nKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoQ29udGV4dDogKGNvbnRleHQ6IG51bWJlcikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENvbnRleHRTdWJUeXBlOiAoY29udGV4dFN1YlR5cGU6IG51bWJlcikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aFBsYWNlbWVudFR5cGU6IChwbGFjZW1lbnRUeXBlOiBudW1iZXIpID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhUaXRsZTogKGxlbmd0aD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoSW1hZ2U6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgbWluV2lkdGg/OiBudW1iZXIsIG1pbkhlaWdodD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKVxuICAgICAgICA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoVmlkZW86IChtaW1lczogbnVtYmVyW10gfCBzdHJpbmdbXSwgbWluRHVyYXRpb246IG51bWJlciwgbWF4RHVyYXRpb246IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKVxuICAgICAgICA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoRGF0YTogKHR5cGU6IG51bWJlciwgaWQ6IG51bWJlciwgbGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhTcG9uc29yZWQ6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aERlc2NyaXB0aW9uOiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhSYXRpbmc6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aFByaWNlOiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhTYWxlUHJpY2U6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aERpc3BsYXlVUkw6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENUQVRleHQ6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENhdGVnb3J5OiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhUSEM6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENCRDogKGxlbmd0aD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoU3RyYWluOiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhNZXRhUHJvZHVjdDogKGxlbmd0aD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoRXZlbnRUcmFja2VyOiAoZXZlbnQ6IG51bWJlciwgbWV0aG9kczogbnVtYmVyW10pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIGJ1aWxkOiAoKSA9PiBJTmF0aXZlUmVxdWVzdFxufTtcblxuaW50ZXJmYWNlIElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlIHtcbiAgICByZWFkb25seSB2ZXI/OiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgY29udGV4dD86IG51bWJlcixcbiAgICByZWFkb25seSBwbGFjZW1lbnRUeXBlPzogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGNvbnRleHRTdWJUeXBlPzogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGFzc2V0czogSUFzc2V0T2JqZWN0W10sXG4gICAgcmVhZG9ubHkgZXZlbnRUcmFja2VyczogSUV2ZW50VHJhY2tlclJlcXVlc3RPYmplY3RbXVxufTtcblxuY29uc3QgYnVpbGRlcldpdGhWZXIgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICB2ZXI6IHN0cmluZ1xuKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHZlcnNpb24gdG8gbmF0aXZlIHJlcXVlc3QnLCB2ZXIpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlciwgey4uLnN0YXRlLCB2ZXIgfSk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aENvbnRleHQgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICBjb250ZXh0OiBudW1iZXJcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBjb250ZXh0IHRvIG5hdGl2ZSByZXF1ZXN0JywgY29udGV4dCk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBjb250ZXh0IH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhDb250ZXh0U3ViVHlwZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIGNvbnRleHRTdWJUeXBlOiBudW1iZXJcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBjb250ZXh0IHN1YnR5cGUgdG8gbmF0aXZlIHJlcXVlc3QnLCBjb250ZXh0U3ViVHlwZSk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBjb250ZXh0U3ViVHlwZSB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUGxhY2VtZW50VHlwZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIHBsYWNlbWVudFR5cGU6IG51bWJlclxuKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHBsYWNlbWVudCB0eXBlIHRvIG5hdGl2ZSByZXF1ZXN0JywgcGxhY2VtZW50VHlwZSk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBwbGFjZW1lbnRUeXBlIH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhUaXRsZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIGxlbmd0aDogbnVtYmVyID0gREVGQVVMVF9MRU5HVEgsXG4gICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgdGl0bGUgdG8gbmF0aXZlIHJlcXVlc3QnLCBsZW5ndGgsIHJlcXVpcmVkKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhsb2dnZXIsXG4gICAgICAgIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgYXNzZXRzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuYXNzZXRzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE5hdGl2ZUFzc2V0SWQuVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZCA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuOiBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aEltYWdlID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSU5hdGl2ZVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBtaW5XaWR0aD86IG51bWJlcixcbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIsXG4gICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgaW1hZ2UgdG8gbmF0aXZlIHJlcXVlc3QnLCB3aWR0aCwgaGVpZ2h0LCBtaW5XaWR0aCwgbWluSGVpZ2h0LCByZXF1aXJlZCk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLFxuICAgICAgICB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGFzc2V0czogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLmFzc2V0cyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBOYXRpdmVBc3NldElkLkltYWdlLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgaW1nOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdtaW46IG1pbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaG1pbjogbWluSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhWaWRlbyA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIG1pbWVzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgIG1pbkR1cmF0aW9uOiBudW1iZXIsXG4gICAgbWF4RHVyYXRpb246IG51bWJlcixcbiAgICByZXF1aXJlZDogYm9vbGVhbiA9IHRydWVcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyB2aWRlbyB0byBuYXRpdmUgcmVxdWVzdCcsIG1pbWVzLCBtaW5EdXJhdGlvbiwgbWF4RHVyYXRpb24sIHJlcXVpcmVkKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGFzc2V0czogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLmFzc2V0cyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBOYXRpdmVBc3NldElkLlZpZGVvLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluZHVyYXRpb246IG1pbkR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb246IG1heER1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xzOiBbVkFTVF8zXzBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhEYXRhID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSU5hdGl2ZVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgdHlwZTogbnVtYmVyLFxuICAgIGlkOiBudW1iZXIsXG4gICAgbGVuZ3RoOiBudW1iZXIgPSBERUZBVUxUX0xFTkdUSCxcbiAgICByZXF1aXJlZDogYm9vbGVhbiA9IHRydWVcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBkYXRhIHRvIHJlcXVlc3QnLCB0eXBlLCBpZCwgbGVuZ3RoLCByZXF1aXJlZCk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMoXG4gICAgICAgIGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBhc3NldHM6IFtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5hc3NldHMsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkID8gMSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW46IGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IHBhc3NUb0RhdGEgPSAodHlwZTogbnVtYmVyLCBpZDogbnVtYmVyKSA9PlxuICAgIChcbiAgICAgICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgICAgICBzdGF0ZTogSU5hdGl2ZVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgICAgIGxlbmd0aDogbnVtYmVyID0gREVGQVVMVF9MRU5HVEgsXG4gICAgICAgIHJlcXVpcmVkOiBib29sZWFuID0gdHJ1ZVxuICAgICkgPT5cbiAgICAgICAgYnVpbGRlcldpdGhEYXRhKGxvZ2dlciwgc3RhdGUsIHR5cGUsIGlkLCBsZW5ndGgsIHJlcXVpcmVkKTtcblxuY29uc3QgYnVpbGRlcldpdGhTcG9uc29yZWQgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5TcG9uc29yZWQsIE5hdGl2ZUFzc2V0SWQuU3BvbnNvcmVkKTtcblxuY29uc3QgYnVpbGRlcldpdGhEZXNjcmlwdGlvbiA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLkRlc2MsIE5hdGl2ZUFzc2V0SWQuRGVzYyk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUmF0aW5nID0gcGFzc1RvRGF0YShOYXRpdmVEYXRhVHlwZXMuUmF0aW5nLCBOYXRpdmVBc3NldElkLlJhdGluZyk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUHJpY2UgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5QcmljZSwgTmF0aXZlQXNzZXRJZC5QcmljZSk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoU2FsZVByaWNlID0gcGFzc1RvRGF0YShOYXRpdmVEYXRhVHlwZXMuU2FsZVByaWNlLCBOYXRpdmVBc3NldElkLlNhbGVQcmljZSk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoRGlzcGxheVVSTCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLkRpc3BsYXlVUkwsIE5hdGl2ZUFzc2V0SWQuRGlzcGxheVVSTCk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoQ1RBVGV4dCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLkNUQVRleHQsIE5hdGl2ZUFzc2V0SWQuQ1RBVGV4dCk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoQ2F0ZWdvcnkgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5TdXJmQ2F0ZWdvcnksIE5hdGl2ZUFzc2V0SWQuU3VyZkNhdGVnb3J5KTtcblxuY29uc3QgYnVpbGRlcldpdGhUSEMgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5TdXJmVEhDLCBOYXRpdmVBc3NldElkLlN1cmZUSEMpO1xuXG5jb25zdCBidWlsZGVyV2l0aENCRCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLlN1cmZDQkQsIE5hdGl2ZUFzc2V0SWQuU3VyZkNCRCk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoU3RyYWluID0gcGFzc1RvRGF0YShOYXRpdmVEYXRhVHlwZXMuU3VyZlN0cmFpbiwgTmF0aXZlQXNzZXRJZC5TdXJmU3RyYWluKTtcblxuY29uc3QgYnVpbGRlcldpdGhNZXRhUHJvZHVjdCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLlN1cmZNZXRhUHJvZHVjdCwgTmF0aXZlQXNzZXRJZC5TdXJmTWV0YUJyYW5kKTtcblxuY29uc3QgYnVpbGRlcldpdGhFdmVudFRyYWNrZXIgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICBldmVudDogbnVtYmVyLFxuICAgIG1ldGhvZHM6IG51bWJlcltdXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgZXZlbnQgdHJhY2tlciB0byBiaWcgcmVxdWVzdCcpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBldmVudFRyYWNrZXJzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuZXZlbnRUcmFja2VycyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJCdWlsZCA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSk6IElOYXRpdmVSZXF1ZXN0ID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdCdWlsZGluZyBiaWQgcmVxdWVzdCcsIHN0YXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2ZXI6IHN0YXRlLnZlcixcbiAgICAgICAgY29udGV4dDogc3RhdGUuY29udGV4dCxcbiAgICAgICAgY29udGV4dHN1YnR5cGU6IHN0YXRlLmNvbnRleHRTdWJUeXBlLFxuICAgICAgICBhc3NldHM6IHN0YXRlLmFzc2V0cyxcbiAgICAgICAgZXZlbnR0cmFja2Vyczogc3RhdGUuZXZlbnRUcmFja2Vyc1xuICAgIH07XG59O1xuXG5jb25zdCBib3RzQnVpbGRCb3RzID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlKTogTmF0aXZlUmVxdWVzdEJ1aWxkZXIgPT4gKHtcbiAgICB3aXRoVmVyOiBidWlsZGVyV2l0aFZlci5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENvbnRleHQ6IGJ1aWxkZXJXaXRoQ29udGV4dC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENvbnRleHRTdWJUeXBlOiBidWlsZGVyV2l0aENvbnRleHRTdWJUeXBlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoUGxhY2VtZW50VHlwZTogYnVpbGRlcldpdGhQbGFjZW1lbnRUeXBlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoVGl0bGU6IGJ1aWxkZXJXaXRoVGl0bGUuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhJbWFnZTogYnVpbGRlcldpdGhJbWFnZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aFZpZGVvOiBidWlsZGVyV2l0aFZpZGVvLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoRGF0YTogYnVpbGRlcldpdGhEYXRhLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoU3BvbnNvcmVkOiBidWlsZGVyV2l0aFNwb25zb3JlZC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aERlc2NyaXB0aW9uOiBidWlsZGVyV2l0aERlc2NyaXB0aW9uLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoUmF0aW5nOiBidWlsZGVyV2l0aFJhdGluZy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aFByaWNlOiBidWlsZGVyV2l0aFByaWNlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoU2FsZVByaWNlOiBidWlsZGVyV2l0aFNhbGVQcmljZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aERpc3BsYXlVUkw6IGJ1aWxkZXJXaXRoRGlzcGxheVVSTC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENUQVRleHQ6IGJ1aWxkZXJXaXRoQ1RBVGV4dC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENhdGVnb3J5OiBidWlsZGVyV2l0aENhdGVnb3J5LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoVEhDOiBidWlsZGVyV2l0aFRIQy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENCRDogYnVpbGRlcldpdGhDQkQuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhTdHJhaW46IGJ1aWxkZXJXaXRoU3RyYWluLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoTWV0YVByb2R1Y3Q6IGJ1aWxkZXJXaXRoTWV0YVByb2R1Y3QuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhFdmVudFRyYWNrZXI6IGJ1aWxkZXJXaXRoRXZlbnRUcmFja2VyLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICBidWlsZDogYnVpbGRlckJ1aWxkLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKVxufSk7XG5cbmV4cG9ydCBjb25zdCBTdGFydE5hdGl2ZSA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnU3RhcnROYXRpdmUnKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhsb2csIHtcbiAgICAgICAgYXNzZXRzOiBbXSxcbiAgICAgICAgZXZlbnRUcmFja2VyczogW11cbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0TmF0aXZlID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdEZWZhdWx0TmF0aXZlJyk7XG4gICAgcmV0dXJuIFN0YXJ0TmF0aXZlKGxvZylcbiAgICAgICAgLndpdGhWZXIoJzEuMicpXG4gICAgICAgIC53aXRoQ29udGV4dChDb250ZXh0VHlwZXMuUHJvZHVjdClcbiAgICAgICAgLndpdGhDb250ZXh0U3ViVHlwZShDb250ZXh0U3ViVHlwZXMuUHJvZHVjdClcbiAgICAgICAgLndpdGhQbGFjZW1lbnRUeXBlKFBsYWNlbWVudFR5cGVzLkluRmVlZClcbiAgICAgICAgLndpdGhFdmVudFRyYWNrZXIoRXZlbnRUeXBlcy5JbXAsIFtFdmVudFRyYWNraW5nTWV0aG9kcy5JbWcsIEV2ZW50VHJhY2tpbmdNZXRob2RzLkltZ10pO1xufTtcbiIsCiAgICAiaW1wb3J0IHtcbiAgICBBZ2VudFR5cGVzLFxuICAgIHR5cGUgSUFwcCxcbiAgICB0eXBlIElCYW5uZXIsXG4gICAgdHlwZSBJQmlkUmVxdWVzdCxcbiAgICB0eXBlIElEZXZpY2UsXG4gICAgdHlwZSBJR2VvQ29udGV4dCxcbiAgICB0eXBlIElJbXAsXG4gICAgdHlwZSBJTmF0aXZlLFxuICAgIHR5cGUgSU5hdGl2ZVJlcXVlc3QsXG4gICAgdHlwZSBJUmVncyxcbiAgICB0eXBlIElTaXRlLFxuICAgIHR5cGUgSVN1cmZFeHRlbnNpb24sXG4gICAgdHlwZSBJVXNlcixcbiAgICB0eXBlIElWaWRlb1xufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ3R4LCBHZW9Db250ZXh0VG9PUlRCLCBJTG9nZ2VyIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuXG5jb25zdCBTVVJGX0VJRF9TT1VSQ0UgPSAnc3VyZi1kb21haW4taWQnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0QnVpbGRlckZuID0gKHpvbmVJZDogc3RyaW5nLCBpZD86IHN0cmluZykgPT4gUmVxdWVzdEJ1aWxkZXI7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RXaXRoPFQ+ID0gKHQ6IFQpID0+IFJlcXVlc3RCdWlsZGVyO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0QnVpbGRlciA9IHtcbiAgICB3aXRoVXNlcjogUmVxdWVzdFdpdGg8SVVzZXI+LFxuICAgIHdpdGhSZWd1bGF0aW9uczogUmVxdWVzdFdpdGg8SVJlZ3M+LFxuICAgIHdpdGhBcHA6IFJlcXVlc3RXaXRoPElBcHA+LFxuICAgIHdpdGhTaXRlOiBSZXF1ZXN0V2l0aDxJU2l0ZT4sXG4gICAgd2l0aEtleXdvcmRzOiBSZXF1ZXN0V2l0aDxzdHJpbmdbXT4sXG4gICAgd2l0aEJhbm5lcjogKHc6IG51bWJlciwgaDogbnVtYmVyLCBvcHRpb25zPzogUGFydGlhbDxJQmFubmVyPiwgaW1wT3B0aW9ucz86IFBhcnRpYWw8SUltcD4pID0+IFJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhWaWRlbzogKHc6IG51bWJlcixcbiAgICAgICAgaDogbnVtYmVyLFxuICAgICAgICBtaW5kdXJhdGlvbjogbnVtYmVyLFxuICAgICAgICBtYXhkdXJhdGlvbjogbnVtYmVyLFxuICAgICAgICBtaW1lcz86IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogUGFydGlhbDxJVmlkZW8+LFxuICAgICAgICBpbXBPcHRpb25zPzogUGFydGlhbDxJSW1wPlxuICAgICkgPT4gUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aE5hdGl2ZTogKFxuICAgICAgICByZXF1ZXN0OiBzdHJpbmcgfCBJTmF0aXZlUmVxdWVzdCxcbiAgICAgICAgb3B0aW9ucz86IFBhcnRpYWw8SU5hdGl2ZT4sXG4gICAgICAgIGltcE9wdGlvbnM/OiBQYXJ0aWFsPElJbXA+XG4gICAgKSA9PiBSZXF1ZXN0QnVpbGRlcixcbiAgICBidWlsZDogKCkgPT4gSUJpZFJlcXVlc3Rcbn1cblxuaW50ZXJmYWNlIElSZXF1ZXN0QnVpbGRlclN0YXRlIHtcbiAgICByZWFkb25seSBpZD86IHN0cmluZyxcbiAgICByZWFkb25seSBjb250ZXh0OiBJU3VyZkV4dGVuc2lvbixcbiAgICByZWFkb25seSB1c2VyPzogSVVzZXIsXG4gICAgcmVhZG9ubHkgc2l0ZT86IElTaXRlLFxuICAgIHJlYWRvbmx5IGFwcD86IElBcHAsXG4gICAgcmVhZG9ubHkgaW1wOiBJSW1wW10sXG4gICAgcmVhZG9ubHkgcmVncz86IElSZWdzLFxuXG4gICAgLy8gVGhlc2UgZmllbGRzIGFyZSBwYXJ0aWFsbHkgYXBwbGllZCBhdCB0aGUgU3RhcnRSZXF1ZXN0IGxldmVsLlxuICAgIHJlYWRvbmx5IGRldmljZT86IElEZXZpY2UsXG4gICAgcmVhZG9ubHkgZ2VvPzogSUdlb0NvbnRleHQsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTdGFydFJlcXVlc3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBkZXZpY2U6IElEZXZpY2UgfCB1bmRlZmluZWQsXG4gICAgZ2VvOiBJR2VvQ29udGV4dCB8IHVuZGVmaW5lZCxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB6b25lSWQ6IHN0cmluZyxcbiAgICBpZD86IHN0cmluZ1xuKSB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcilcbiAgICAgICAgPy53aXRoKCdTdGFydFJlcXVlc3QnKVxuICAgICAgICAud2l0aChhY2NvdW50SWQpXG4gICAgICAgIC53aXRoKHNpdGVJZClcbiAgICAgICAgLndpdGgoY2hhbm5lbElkKVxuICAgICAgICAud2l0aChsb2NhdGlvbklkKVxuICAgICAgICAud2l0aChpZCk7XG4gICAgbG9nPy5pbmZvKCdTdGFydGluZyByZXF1ZXN0Jyk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLFxuICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgICAgICAgIHNpdGVJZCxcbiAgICAgICAgICAgICAgICBjaGFubmVsSWQsXG4gICAgICAgICAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgICAgICAgICB6b25lSWQsXG4gICAgICAgICAgICAgICAgc3RvcmVJZDogbG9jYXRpb25JZCxcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRJZDogem9uZUlkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2VvLFxuICAgICAgICAgICAgZGV2aWNlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1c2VyOiB1c2VySWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlaWRzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBTVVJGX0VJRF9TT1VSQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1aWRzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IEFnZW50VHlwZXMuU2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbXA6IFtdXG4gICAgICAgIH0pO1xufVxuXG5jb25zdCBidWlsZGVyV2l0aFVzZXIgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsIHVzZXI6IElVc2VyKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHVzZXIgdG8gcmVxdWVzdCcsIHVzZXIpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgICAgLi4udXNlcixcbiAgICAgICAgICAgICAgICBlaWRzOiBbIC8vIHdlIGNhbiB0b3NzIHRoZSByZXN0IG9mIHRoZSB1c2VyIG9iamVjdCwgYnV0IHdlIG5lZWQgdG8ga2VlcCB0aGUgZWlkc1xuICAgICAgICAgICAgICAgICAgICAuLi4oc3RhdGUudXNlcj8uZWlkcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXRlLnVzZXIuZWlkc1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLih1c2VyLmVpZHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB1c2VyLmVpZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10pXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUmVndWxhdGlvbnMgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsIHJlZ3M6IElSZWdzKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkZWQgcmVndWxhdGlvbnMgdG8gcmVxdWVzdCcsIHJlZ3MpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlciwgeyAuLi5zdGF0ZSwgcmVncyB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoQXBwID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLCBhcHA6IElBcHApID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgYXBwIHRvIHJlcXVlc3QnKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhsb2dnZXIsIHsgLi4uIHN0YXRlLCBhcHAgfSk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aFNpdGUgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsIHNpdGU6IElTaXRlKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHNpdGUgdG8gcmVxdWVzdCcpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlciwgeyAuLi5zdGF0ZSwgc2l0ZSB9KTtcbn1cblxuY29uc3QgYnVpbGRlcldpdGhCYW5uZXIgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICB3OiBudW1iZXIsXG4gICAgaDogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPElCYW5uZXI+LFxuICAgIGltcE9wdGlvbnM/OiBQYXJ0aWFsPElJbXA+XG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgYmFubmVyIHRvIHJlcXVlc3QnLCB3LCBoLCBvcHRpb25zLCBpbXBPcHRpb25zKTtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSWQoKTtcbiAgICByZXR1cm4gYm90c0J1aWxkSW1wKGxvZ2dlcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdGFnaWQ6IGlkLFxuICAgICAgICAgICAgYmFubmVyOiB7XG4gICAgICAgICAgICAgICAgdyxcbiAgICAgICAgICAgICAgICBoLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5pbXBPcHRpb25zXG4gICAgICAgIH1cbiAgICApO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhWaWRlbyA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIHc6IG51bWJlcixcbiAgICBoOiBudW1iZXIsXG4gICAgbWluZHVyYXRpb246IG51bWJlcixcbiAgICBtYXhkdXJhdGlvbjogbnVtYmVyLFxuICAgIG1pbWVzPzogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8SVZpZGVvPixcbiAgICBpbXBPcHRpb25zPzogUGFydGlhbDxJSW1wPlxuKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHZpZGVvIHRvIHJlcXVlc3QnLCB3LCBoLCBtaW5kdXJhdGlvbiwgbWF4ZHVyYXRpb24sIG1pbWVzLCBvcHRpb25zLCBpbXBPcHRpb25zKTtcbiAgICByZXR1cm4gYm90c0J1aWxkSW1wKGxvZ2dlcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBnZW5lcmF0ZUlkKCksXG4gICAgICAgICAgICB2aWRlbzoge1xuICAgICAgICAgICAgICAgIHcsXG4gICAgICAgICAgICAgICAgaCxcbiAgICAgICAgICAgICAgICBtaW1lczogKG1pbWVzID8/IFsndmlkZW8vbXA0JywgJ3ZpZGVvL3dlYm0nXSksXG4gICAgICAgICAgICAgICAgbWluZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmltcE9wdGlvbnNcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aEtleXdvcmRzID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAga2V5d29yZHM6IHN0cmluZ1tdXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcga2V5d29yZCB0byByZXF1ZXN0Jywga2V5d29yZHMpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dCxcbiAgICAgICAgICAgICAgICBrZXl3b3Jkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoTmF0aXZlID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgcmVxdWVzdDogc3RyaW5nIHwgSU5hdGl2ZVJlcXVlc3QsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8SU5hdGl2ZT4sXG4gICAgaW1wT3B0aW9ucz86IFBhcnRpYWw8SUltcD5cbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBuYXRpdmUgdG8gcmVxdWVzdCcsIHJlcXVlc3QsIG9wdGlvbnMsIGltcE9wdGlvbnMpO1xuICAgIHJldHVybiB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBidWlsZGVyV2l0aE5hdGl2ZVN0cihsb2dnZXIsXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgaW1wT3B0aW9uc1xuICAgICAgICApXG4gICAgICAgIDogYnVpbGRlcldpdGhOYXRpdmVTdHIobG9nZ2VyLFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBpbXBPcHRpb25zXG4gICAgICAgICk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aE5hdGl2ZVN0ciA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIHJlcXVlc3Q6IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxJTmF0aXZlPixcbiAgICBpbXBPcHRpb25zPzogUGFydGlhbDxJSW1wPlxuKSA9PiBib3RzQnVpbGRJbXAobG9nZ2VyLFxuICAgIHN0YXRlLFxuICAgIHtcbiAgICAgICAgaWQ6IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgbmF0aXZlOiB7XG4gICAgICAgICAgICB2ZXI6ICcxLjInLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgLi4uaW1wT3B0aW9uc1xuICAgIH1cbik7XG5cbmNvbnN0IGJ1aWxkZXJCdWlsZCA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHN0YXRlOiBJUmVxdWVzdEJ1aWxkZXJTdGF0ZSk6IElCaWRSZXF1ZXN0ID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdCdWlsZGluZyByZXF1ZXN0Jywgc3RhdGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBzdGF0ZS5pZCA/PyBnZW5lcmF0ZUlkKCksXG4gICAgICAgIGltcDogc3RhdGUuaW1wLm1hcChpbXAgPT4gKHtcbiAgICAgICAgICAgIC4uLmltcCxcbiAgICAgICAgICAgIGV4dDogeyAuLi5pbXAuZXh0LCAuLi5zdGF0ZS5jb250ZXh0IH1cbiAgICAgICAgfSkpLFxuICAgICAgICBkZXZpY2U6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmRldmljZSxcbiAgICAgICAgICAgIGdlbzogc3RhdGUuZ2VvID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogR2VvQ29udGV4dFRvT1JUQih1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmdlb1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpcDogc3RhdGUuZ2VvPy5pcFxuICAgICAgICB9LFxuICAgICAgICB1c2VyOiBzdGF0ZS51c2VyLFxuICAgICAgICBhcHA6IHN0YXRlLmFwcCxcbiAgICAgICAgc2l0ZTogc3RhdGUuc2l0ZSxcbiAgICAgICAgZXh0OiBzdGF0ZS5jb250ZXh0XG4gICAgfTtcbn07XG5cbmNvbnN0IGJvdHNCdWlsZEJvdHMgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUpOiBSZXF1ZXN0QnVpbGRlciA9PiAoe1xuICAgIHdpdGhVc2VyOiBidWlsZGVyV2l0aFVzZXIuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhSZWd1bGF0aW9uczogYnVpbGRlcldpdGhSZWd1bGF0aW9ucy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aEJhbm5lcjogYnVpbGRlcldpdGhCYW5uZXIuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhWaWRlbzogYnVpbGRlcldpdGhWaWRlby5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aE5hdGl2ZTogYnVpbGRlcldpdGhOYXRpdmUuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhBcHA6IGJ1aWxkZXJXaXRoQXBwLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoU2l0ZTogYnVpbGRlcldpdGhTaXRlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoS2V5d29yZHM6IGJ1aWxkZXJXaXRoS2V5d29yZHMuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIGJ1aWxkOiBidWlsZGVyQnVpbGQuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpXG59KTtcblxuY29uc3QgYm90c0J1aWxkSW1wID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLCBpbXA6IElJbXApOiBSZXF1ZXN0QnVpbGRlciA9PlxuICAgIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBpbXA6IFsuLi5zdGF0ZS5pbXAsIGltcF19KTtcblxuY29uc3QgZ2VuZXJhdGVJZCA9ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKCk7XG4iLAogICAgImltcG9ydCB7IElCaWQgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgQ3JlYXRpdmVUeXBlID0ge1xuICAgIEJhbm5lcjogMCxcbiAgICBWaWRlbzogMSxcbiAgICBQcm9kdWN0Q2FyZDogMixcbiAgICBDYXJvdXNlbDogM1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBBIGJ1aWx0IGNyZWF0aXZlIHJlc3BvbnNlLiBJbmNsdWRlcyB0aGUgYmlkIHJlc3BvbnNlIHdoaWNoIGZlZCB0aGUgY3JlYXRpdmUgYXMgd2VsbCBhcyBhIGB0eXBlYCBmaWVsZCBpbmRpY2F0aW5nIHdoYXRcbiAqIGtpbmQgb2YgY3JlYXRpdmUgaXQgaXMgKGkuZSwge0BsaW5rIElCdWlsdEJhbm5lclJlc3BvbnNlIH0sIHtAbGluayBJQnVpbHRWaWRlb30sIHtAbGluayBJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlfSxcbiAqIHtAbGluayBJQnVpbHRDYXJvdXNlbH0pLlxuICogXG4gKiBAc2VlIElCdWlsdEJhbm5lclJlc3BvbnNlXG4gKiBAc2VlIElCdWlsdFZpZGVvXG4gKiBAc2VlIElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2VcbiAqIEBzZWUgSUJ1aWx0Q2Fyb3VzZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnVpbHRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIE9wZW5SVEIgQmlkIG9iamVjdCB3aGljaCBjcmVhdGVkIHRoaXMgY3JlYXRpdmVcbiAgICAgKi9cbiAgICBiaWQ6IElCaWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0FkbUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBiaWQ6IElCaWQgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCdDYW5ub3QgYnVpbGQgY3JlYXRpdmU7IG1pc3NpbmcgYWRtIGZpZWxkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ1Byb2R1Y3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmlkPzogSUJpZCkge1xuICAgICAgICBzdXBlcignQ291bGQgbm90IGZpbmQgcHJvZHVjdCBkYXRhIGZvciBjcmVhdGl2ZSB3aGlsZSBidWlsZGluZyBjbGlja3Rocm91Z2ggVVJMLiBTb21lIGRhdGEgZmllbGRzIGFyZSBtaXNzaW5nJyk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gICAgSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbixcbiAgICBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBJUHJvZHVjdEluZm9ybWF0aW9uXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIEVyciwgSUxvZ2dlciwgT2ssIFJlc3VsdCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcblxuZXhwb3J0IGNvbnN0IEJ1aWxkQ2xpY2t0aHJvdWdoVXJsID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBjb25maWd1cmF0aW9uOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb24sXG4pOiBSZXN1bHQ8c3RyaW5nPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0J1aWxkQ2xpY2t0aHJvdWdoVXJsJyk7XG4gICAgbG9nPy5pbmZvKCdCdWlsZGluZyBjbGlja3Rocm91Z2ggVVJMJyk7XG4gICAgbG9nPy5kZWJ1ZyhcbiAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgY29uZmlndXJhdGlvblxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9rKGNvbmZpZ3VyYXRpb24udGVtcGxhdGVzLmNsaWNrVGhyb3VnaFVybFRlbXBsYXRlKHtcbiAgICAgICAgICAgIHByb2R1Y3QsXG4gICAgICAgICAgICBjYXRhbG9nOiBwcm9kdWN0LFxuICAgICAgICAgICAgd2luZG93OiB3aW5kb3dJbmZvLFxuICAgICAgICAgICAgcHVibGlzaGVyOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgLi4ucHJvZHVjdFxuICAgICAgICB9KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2c/LmVycm9yKCdGYWlsZWQgdG8gZXhlY3V0ZSBjbGlja3Rocm91Z2ggVVJMIHRlbXBsYXRlJywgcHJvZHVjdCwgY29uZmlndXJhdGlvbiwgd2luZG93SW5mbyk7XG4gICAgICAgIHJldHVybiBFcnIoZSBhcyBFcnJvcik7XG4gICAgfVxufTtcbiIsCiAgICAiZXhwb3J0IGNvbnN0IENvbnN1bWVOID0gPFQ+KGdlbmVyYXRvcjogR2VuZXJhdG9yPFQ+LCBuOiBudW1iZXIpOiBUW10gPT4ge1xuICAgIGNvbnN0IGNvbnN1bWVkOiBUW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdlbmVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmKHZhbHVlLmRvbmUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN1bWVkLnB1c2godmFsdWUudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc3VtZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBDb25zdW1lQWxsID0gPFQ+KGdlbmVyYXRvcjogR2VuZXJhdG9yPFQ+KTogVFtdID0+IHtcbiAgICBjb25zdCBjb25zdW1lZDogVFtdID0gW107XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBnZW5lcmF0b3IpIHtcbiAgICAgICAgY29uc3VtZWQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBjb25zdW1lZDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbnN1bWVOQXN5bmMgPSBhc3luYyA8VD4oZ2VuZXJhdG9yOiBBc3luY0dlbmVyYXRvcjxUPiwgbjogbnVtYmVyKTogUHJvbWlzZTxbZGF0YTogVFtdLCBmaW5pc2hlZDogYm9vbGVhbl0+ID0+IHtcbiAgICBjb25zdCBjb25zdW1lZDogVFtdID0gW107XG4gICAgd2hpbGUoY29uc3VtZWQubGVuZ3RoIDwgbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0b3IubmV4dCgpO1xuICAgICAgICBpZihyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtjb25zdW1lZCwgdHJ1ZV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3VtZWQucHVzaChyZXN1bHQudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gW2NvbnN1bWVkLCBmYWxzZV07XG59XG5cbmV4cG9ydCBjb25zdCBDb25zdW1lQWxsQXN5bmMgPSBhc3luYyA8VD4oZ2VuZXJhdG9yOiBBc3luY0dlbmVyYXRvcjxUPik6IFByb21pc2U8VFtdPiA9PiB7XG4gICAgY29uc3QgY29uc3VtZWQ6IFRbXSA9IFtdO1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZ2VuZXJhdG9yKSB7XG4gICAgICAgIGNvbnN1bWVkLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc3VtZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogR2VuZXJhdGVBcnJheTxUPihkYXRhOiBUW10pOiBHZW5lcmF0b3I8VD4ge1xuICAgIGZvcihjb25zdCB0IG9mIGRhdGEpIHtcbiAgICAgICAgeWllbGQgdDtcbiAgICB9XG59IiwKICAgICJpbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbmV4cG9ydCBjb25zdCBUcnlHZXQgPSA8VD4oZ2V0OiAoKSA9PiBUKTogUmVzdWx0PFQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2soZ2V0KCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbn07IiwKICAgICJpbXBvcnQge1xuICAgIEV2ZW50VHJhY2tpbmdNZXRob2RzLFxuICAgIEV2ZW50VHlwZXMsXG4gICAgSUJpZCxcbiAgICBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIElOYXRpdmVSZXNwb25zZSxcbiAgICBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBJUHJvZHVjdEluZm9ybWF0aW9uLFxuICAgIE5hdGl2ZUFzc2V0SWRcbn0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gICAgQXN5bmNSZXN1bHQsXG4gICAgQ3R4LFxuICAgIEVycixcbiAgICBFcnJSZXN1bHQsXG4gICAgR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIElMb2dnZXIsXG4gICAgT2ssXG4gICAgT2tSZXN1bHQsXG4gICAgUmVzdWx0LFxuICAgIFRyeURvXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENvbnN1bWVBbGxBc3luYywgR2VuZXJhdGVBcnJheSB9IGZyb20gJy4uL0dlbmVyYXRvcic7XG5pbXBvcnQgeyBUcnlHZXQgfSBmcm9tICcuLi9UcnlHZXQnO1xuaW1wb3J0IHsgSUJ1aWx0UmVzcG9uc2UsIE1pc3NpbmdBZG1FcnJvciB9IGZyb20gJy4vQnVpbHRSZXNwb25zZSc7XG5pbXBvcnQgeyBCdWlsZENsaWNrdGhyb3VnaFVybCB9IGZyb20gJy4vQ2xpY2t0aHJvdWdoJztcblxuZXhwb3J0IHR5cGUgQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlc0ZuID0gKGJpZHM6IElCaWRbXSkgPT4gQXN5bmNSZXN1bHQ8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZVtdPjtcbmV4cG9ydCB0eXBlIEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuID0gKGJpZHM6IElCaWRbXSkgPT4gQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRyYWNrZXIge1xuICAgIHR5cGU6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGl4ZWxUcmFja2VyIGV4dGVuZHMgSVRyYWNrZXIge1xuICAgIHR5cGU6IDE7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTY3JpcHRUcmFja2VyIGV4dGVuZHMgSVRyYWNrZXIge1xuICAgIHR5cGU6IDI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElUcmFja2VyT2JqZWN0IHtcbiAgICB3aW46IHN0cmluZyxcbiAgICBpbXA6IHN0cmluZ1tdLFxuICAgIG90aGVyczogSVRyYWNrZXJbXVxufTtcblxuZXhwb3J0IHR5cGUgSUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZSA9IElCdWlsdFJlc3BvbnNlXG4gICAgJiBJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlXG4gICAgJiB7XG4gICAgICAgIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlLFxuICAgICAgICBzcG9uc29yZWQ6IHRydWVcbiAgICB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2Uge1xuICAgIHR5cGU6ICdwcm9kdWN0LWNhcmQnLFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb24sXG4gICAgdHJhY2tlcnM/OiBJVHJhY2tlck9iamVjdCxcbiAgICBjbGlja3Rocm91Z2g6IHN0cmluZyxcbiAgICBzcG9uc29yZWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlcyA9IGFzeW5jIChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHM6IEdldEFsbFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBjb25maWd1cmF0aW9uOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIGJpZHM6IElCaWRbXVxuKTogQXN5bmNSZXN1bHQ8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZVtdPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0J1aWxkUHJvZHVjdENhcmRSZXNwb25zZScpO1xuICAgIGxvZz8uaW5mbygnQnVpbGRpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlcycpO1xuICAgIGlmIChiaWRzID09PSB1bmRlZmluZWQgfHwgYmlkcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nQmlkc0Vycm9yKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpZFByb21pc2VzID0gYmlkcy5tYXAoYnVpbGRBbGxQcm9kdWN0Q2FyZFJlc3BvbnNlc0Zyb21CaWQuYmluZCh1bmRlZmluZWQsIGxvZyxcbiAgICAgICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMsXG4gICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgIGNvbmZpZ3VyYXRpb25cbiAgICApKTtcblxuICAgIGNvbnN0IHByb2R1Y3RDYXJkUmVzcG9uc2VSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGJpZFByb21pc2VzKTtcbiAgICBwcm9kdWN0Q2FyZFJlc3BvbnNlUmVzdWx0c1xuICAgICAgICAuZmlsdGVyKHJlcyA9PiByZXMuc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICAgICAubWFwKHJlcyA9PiByZXMucmVhc29uIGFzIEVyclJlc3VsdDxFcnJvcj4pXG4gICAgICAgIC5mb3JFYWNoKGVyciA9PiBsb2c/Lndhcm4oZXJyKSk7XG4gICAgXG4gICAgY29uc3QgZnVsZmlsbGVkID0gcHJvZHVjdENhcmRSZXNwb25zZVJlc3VsdHNcbiAgICAgICAgLmZpbHRlcihyZXMgPT4gcmVzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpO1xuXG4gICAgZnVsZmlsbGVkXG4gICAgICAgIC5maWx0ZXIocmVzID0+ICFyZXMudmFsdWUub2spXG4gICAgICAgIC5tYXAocmVzID0+IHJlcy52YWx1ZSBhcyBFcnJSZXN1bHQpXG4gICAgICAgIC5tYXAocmVzID0+IHJlcy5lcnJvcilcbiAgICAgICAgLmZvckVhY2goZXJyID0+IGxvZz8ud2FybihlcnIpKTtcbiAgICBcbiAgICByZXR1cm4gT2socHJvZHVjdENhcmRSZXNwb25zZVJlc3VsdHNcbiAgICAgICAgLmZpbHRlcihyZXMgPT4gcmVzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpXG4gICAgICAgIC5maWx0ZXIocmVzID0+IHJlcy52YWx1ZS5vaylcbiAgICAgICAgLm1hcChyZXMgPT4gcmVzLnZhbHVlIGFzIE9rUmVzdWx0PElCdWlsdFByb2R1Y3RDYXJkQmlkUmVzcG9uc2VbXT4pXG4gICAgICAgIC5mbGF0TWFwKHJlcyA9PiByZXMudmFsdWUpKTtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkczogSUJpZFtdXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZEJpZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZScpO1xuICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlIGdlbmVyYXRvcicsIGJpZHMpO1xuICAgIGZvcihjb25zdCBiaWQgb2YgYmlkcykge1xuICAgICAgICBsb2c/LmluZm8oJ0dlbmVyYXRpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlJywgYmlkKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRBbGxQcm9kdWN0Q2FyZFJlc3BvbnNlc0Zyb21CaWQoXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgYmlkXG4gICAgICAgICk7XG4gICAgICAgIGlmKCFyZXN1bHQub2spIHtcbiAgICAgICAgICAgIGxvZz8ud2FybihyZXN1bHQuZXJyb3IpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIEdlbmVyYXRlQXJyYXkocmVzdWx0LnZhbHVlKTtcbiAgICB9XG59XG5cbmNvbnN0IGdldEZpZWxkID0gKG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlKSA9PlxuICAgIChpZDogbnVtYmVyKSA9PlxuICAgICAgICBuYXRpdmUubmF0aXZlLmFzc2V0c1xuICAgICAgICAgICAgPy5maW5kKGFzc2V0ID0+IGFzc2V0LmlkID09PSBpZClcbiAgICAgICAgICAgID8uZGF0YVxuICAgICAgICAgICAgPy52YWx1ZTtcblxuY29uc3QgZ2V0VHJhY2tlcnMgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBiaWQ6IElCaWQsIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlKTogUmVzdWx0PElUcmFja2VyT2JqZWN0PiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldFRyYWNrZXJzJyk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIHRyYWNrZXJzJyk7XG5cbiAgICBjb25zdCB3aW4gPSBiaWQubnVybDtcbiAgICBpZiAod2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTWlzc2luZ1dpblVybEVycm9yKGJpZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcCA9IG5hdGl2ZS5uYXRpdmUuZXZlbnR0cmFja2Vyc1xuICAgICAgICA/LmZpbHRlcih0cmFja2VyID0+IHRyYWNrZXIuZXZlbnQgPT09IEV2ZW50VHlwZXMuSW1wICYmIHRyYWNrZXIubWV0aG9kID09PSBFdmVudFRyYWNraW5nTWV0aG9kcy5JbWcpXG4gICAgICAgIC5tYXAodHJhY2tlciA9PiB0cmFja2VyLnVybClcbiAgICAgICAgLmZpbHRlcih1cmwgPT4gdXJsICE9PSB1bmRlZmluZWQpID8/IFtdO1xuXG4gICAgY29uc3Qgb3RoZXJzID0gbmF0aXZlLm5hdGl2ZS5ldmVudHRyYWNrZXJzXG4gICAgICAgID8uZmlsdGVyKHRyYWNrZXIgPT4gdHJhY2tlci51cmwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLm1hcCh0cmFja2VyID0+ICh7XG4gICAgICAgICAgICB0eXBlOiB0cmFja2VyLm1ldGhvZCxcbiAgICAgICAgICAgIHVybDogdHJhY2tlci51cmwhXG4gICAgICAgIH0pKSA/PyBbXTtcblxuICAgIHJldHVybiBPayh7IHdpbiwgaW1wLCBvdGhlcnMgfSk7XG59O1xuXG5jb25zdCBmZXRjaFByb2R1Y3RzRnJvbUJpZCA9IGFzeW5jIChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHM6IEdldEFsbFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICBiaWQ6IElCaWRcbik6IEFzeW5jUmVzdWx0PHtcbiAgICBwcm9kdWN0czogSVByb2R1Y3RJbmZvcm1hdGlvbltdXG4gICAgbmF0aXZlOiBJTmF0aXZlUmVzcG9uc2Vcbn0+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZmV0Y2hQcm9kdWN0c0Zyb21CaWQnKTtcbiAgICAgICAgbG9nPy5pbmZvKCdGZXRjaGluZyBwcm9kdWN0cyBmcm9tIElCaWQnKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdENhcmRSZXNwb25zZXM6IElCdWlsdFByb2R1Y3RDYXJkQmlkUmVzcG9uc2VbXSA9IFtdO1xuICAgICAgICBpZiAoYmlkLmFkbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2c/Lndhcm4oJ0JpZCBpcyBtaXNzaW5nIEFETScsIGJpZCk7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nQWRtRXJyb3IoYmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRtID0gYmlkLmFkbTsgLy8gc2F2ZSBpdCBoZXJlIHRvIG1ha2UgaXQgZWZmZWN0aXZlbHkgZmluYWw7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVJlcyA9IFRyeUdldCgoKSA9PiBKU09OLnBhcnNlKGFkbSkgYXMgSU5hdGl2ZVJlc3BvbnNlKTtcbiAgICAgICAgaWYgKCFuYXRpdmVSZXMub2spIHtcbiAgICAgICAgICAgIGxvZz8uZXJyb3IoJ0JpZCBhZG0gZmFpbGVkIHRvIGRlc2VyaWFsaXplJywgYmlkLCBhZG0pO1xuICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgTWFsZm9ybWVkTmF0aXZlUmVzcG9uc2VFcnJvcihiaWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hdGl2ZSA9IG5hdGl2ZVJlcy52YWx1ZTtcbiAgICAgICAgY29uc3QgbWV0YVByb2R1Y3RJZCA9IGdldEZpZWxkKG5hdGl2ZSkoTmF0aXZlQXNzZXRJZC5TdXJmTWV0YUJyYW5kKTtcblxuICAgICAgICBpZiAobWV0YVByb2R1Y3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nUHJvZHVjdElkRXJyb3IoYmlkLCBuYXRpdmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb2R1Y3RSZXMgPSBhd2FpdCBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyhtZXRhUHJvZHVjdElkKTtcbiAgICAgICAgaWYgKCFwcm9kdWN0UmVzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvZHVjdFJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBPayh7XG4gICAgICAgICAgICBwcm9kdWN0czogcHJvZHVjdFJlcy52YWx1ZSxcbiAgICAgICAgICAgIG5hdGl2ZVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gKmJ1aWxkUHJvZHVjdENhcmRSZXNwb25zZUZyb21SZWNvbW1lbmRlZFByb2R1Y3RJbmZvKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBjb25maWd1cmF0aW9uOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIHByb2R1Y3RzOiBJUHJvZHVjdEluZm9ybWF0aW9uW11cbik6IEdlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlPiB7XG4gICAgXG59XG5cbmZ1bmN0aW9uICpidWlsZFByb2R1Y3RDYXJkUmVzcG9uc2VGcm9tUHJvZHVjdEluZm8oXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkOiBJQmlkLFxuICAgIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlLFxuICAgIHByb2R1Y3RzOiBJUHJvZHVjdEluZm9ybWF0aW9uW10sXG4pOiBHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdidWlsZFByb2R1Y3RDYXJkUmVzcG9uc2VGcm9tUHJvZHVjdEluZm8nKTtcbiAgICBmb3IgKGNvbnN0IHByb2R1Y3Qgb2YgcHJvZHVjdHMpIHtcbiAgICAgICAgY29uc3QgY2xpY2t0aHJvdWdoID0gQnVpbGRDbGlja3Rocm91Z2hVcmwoXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICB3aW5kb3dJbmZvLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHByb2R1Y3RcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWNsaWNrdGhyb3VnaC5vaykge1xuICAgICAgICAgICAgcmV0dXJuIGNsaWNrdGhyb3VnaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYWNrZXJzID0gZ2V0VHJhY2tlcnMobG9nLCBiaWQsIG5hdGl2ZSk7XG5cbiAgICAgICAgaWYgKCF0cmFja2Vycy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmluYWxDbGlja3Rocm91Z2ggPSBUcnlEbygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaWRkZXJDbGlja3Rocm91Z2ggPSBuZXcgVVJMKG5hdGl2ZS5uYXRpdmUubGluay51cmwpO1xuICAgICAgICAgICAgYmlkZGVyQ2xpY2t0aHJvdWdoLnNlYXJjaFBhcmFtcy5zZXQoJ3VybCcsIGNsaWNrdGhyb3VnaC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gYmlkZGVyQ2xpY2t0aHJvdWdoLnRvU3RyaW5nKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZighZmluYWxDbGlja3Rocm91Z2gub2spIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbENsaWNrdGhyb3VnaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHR5cGU6ICdwcm9kdWN0LWNhcmQnLFxuICAgICAgICAgICAgbmF0aXZlLFxuICAgICAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgICAgIGJpZCxcbiAgICAgICAgICAgIGNsaWNrdGhyb3VnaDogZmluYWxDbGlja3Rocm91Z2gudmFsdWUsXG4gICAgICAgICAgICB0cmFja2VyczogdHJhY2tlcnMudmFsdWUsXG4gICAgICAgICAgICBzcG9uc29yZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNvbnN0IGJ1aWxkQWxsUHJvZHVjdENhcmRSZXNwb25zZXNGcm9tQmlkID0gYXN5bmMgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkOiBJQmlkXG4pOiBBc3luY1Jlc3VsdDxJQnVpbHRQcm9kdWN0Q2FyZEJpZFJlc3BvbnNlW10+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnYnVpbGRBbGxQcm9kdWN0Q2FyZFJlc3BvbnNlQmlkcycpO1xuICAgIGxvZz8uaW5mbygnQnVpbGRpbmcgYWxsIHByb2R1Y3QgY2FyZCByZXNwb25zZXMnKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2soYXdhaXQgQ29uc3VtZUFsbEFzeW5jKGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZUZyb21CaWQoXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgYmlkXG4gICAgICAgICkpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZUZyb21CaWQgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkOiBJQmlkXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZEJpZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZUZyb21CaWQnKTtcbiAgICBsb2c/LmluZm8oJ2dlbmVyYXRpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlIGZyb20gYmlkJyk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvZHVjdFJlc3VsdCA9IGF3YWl0IGZldGNoUHJvZHVjdHNGcm9tQmlkKGxvZywgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMsIGJpZCk7XG4gICAgICAgIGlmKCFwcm9kdWN0UmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICBsb2c/LmluZm8oJ05vIHByb2R1Y3RzIScpO1xuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHByb2R1Y3RzLCBuYXRpdmUgfSA9IHByb2R1Y3RSZXN1bHQudmFsdWU7XG5cbiAgICAgICAgY29uc3QgYnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlczogSUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZVtdID0gW107XG4gICAgICAgIHlpZWxkKiBidWlsZFByb2R1Y3RDYXJkUmVzcG9uc2VGcm9tUHJvZHVjdEluZm8obG9nLFxuICAgICAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBiaWQsXG4gICAgICAgICAgICBuYXRpdmUsXG4gICAgICAgICAgICBwcm9kdWN0c1xuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0JpZHNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ1VuYWJsZSB0byBidWlsZCBwcm9kdWN0IGNhcmRzIC0gbm8gYmlkcyB3ZXJlIHByb3ZpZGVkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFsZm9ybWVkTmF0aXZlUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmlkOiBJQmlkKSB7XG4gICAgICAgIHN1cGVyKCdVbmFibGUgdG8gYnVpbGQgcHJvZHVjdCBjYXJkIC0gbWlzc2luZyBuYXRpdmUgcmVzcG9uc2UnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nV2luVXJsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGJpZDogSUJpZCkge1xuICAgICAgICBzdXBlcignVW5hYmxlIHRvIGJ1aWxkIHByb2R1Y3QgY2FyZCAtIG5vIHdpbiBVUkwgd2FzIHByb3ZpZGVkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ1Byb2R1Y3RJZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYmlkOiBJQmlkLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmF0aXZlOiBJTmF0aXZlUmVzcG9uc2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ1VuYWJsZSB0byBidWlsZCBwcm9kdWN0IGNhcmQgLSBubyBwcm9kdWN0IElEIHdhcyBwcm92aWRlZCcpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICAgIElCaWQsXG4gICAgSUJpZFJlcXVlc3QsXG4gICAgSVByb2R1Y3RJbmZvcm1hdGlvblxufSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgICBDdHgsXG4gICAgdHlwZSBJTG9nZ2VyLFxuICAgIHR5cGUgTm9uUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIE9rLFxuICAgIHR5cGUgUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIHR5cGUgUmVxdWVzdEJpZHNGbixcbiAgICB0eXBlIFJlc3VsdFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9UZW1wbGF0ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgSUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZSxcbiAgICBJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlXG59IGZyb20gJy4vUHJvZHVjdENhcmQnO1xuXG5leHBvcnQgdHlwZSBCdWlsZFNwb25zb3JlZENhcm91c2VsRm4gPSAocmVxdWVzdDogSUJpZFJlcXVlc3QpID0+IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD47XG5leHBvcnQgdHlwZSBCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWRGbiA9IChyZXF1ZXN0OiBJQmlkUmVxdWVzdCwgaW5pdGlhbEJpZDogSUJpZCkgPT4gUmVzdWx0PElCdWlsdENhcm91c2VsPjtcbmV4cG9ydCB0eXBlIEJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbEZuID0gKFJlY29tbWVuZGVyVHlwZTogUHVibGljUmVjb21tZW5kZXJUeXBlKSA9PiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+O1xuZXhwb3J0IHR5cGUgQnVpbGRIeWJyaWRDYXJvdXNlbEZuID0gKHJlY29tbWVuZGVyVHlwZTogUHVibGljUmVjb21tZW5kZXJUeXBlLCByZXF1ZXN0OiBJQmlkUmVxdWVzdClcbiAgICA9PiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+O1xuZXhwb3J0IHR5cGUgQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkRm4gPSAoXG4gICAgUmVjb21tZW5kZXJUeXBlOiBQdWJsaWNSZWNvbW1lbmRlclR5cGUsXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgaW5pdGlhbEJpZDogSUJpZFxuKSA9PiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+O1xuZXhwb3J0IHR5cGUgQ2Fyb3VzZWxOZXh0UHJvZHVjdEZuID0gKCkgPT4gQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1aWx0Q2Fyb3VzZWwge1xuICAgIHR5cGU6ICdjYXJvdXNlbCcsXG4gICAgZ2V0UHJvZHVjdDogQ2Fyb3VzZWxOZXh0UHJvZHVjdEZuXG59XG5cbmV4cG9ydCB0eXBlIFJlY29tbWVuZGVyVHlwZSA9ICd0b3AtcHJvZHVjdHMnIHwgJ2Zvci15b3UnIHwgJ3Bhc3QtcHVyY2hhc2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBJUHVibGljVG9wUHJvZHVjdHNSZWNvbW1lbmRlclR5cGUge1xuICAgIHR5cGU6ICd0b3AtcHJvZHVjdHMnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVB1YmxpY0ZvcllvdVJlY29tbWVuZGVyVHlwZSB7XG4gICAgdHlwZTogJ2Zvci15b3UnLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJUHVibGljUGFzdFB1cmNoYXNlc1JlY29tbWVuZGVyVHlwZSB7XG4gICAgdHlwZTogJ3Bhc3QtcHVyY2hhc2VzJyxcbn07XG5cbmV4cG9ydCB0eXBlIFB1YmxpY1JlY29tbWVuZGVyVHlwZSA9IElQdWJsaWNUb3BQcm9kdWN0c1JlY29tbWVuZGVyVHlwZVxuICAgIHwgSVB1YmxpY0ZvcllvdVJlY29tbWVuZGVyVHlwZVxuICAgIHwgSVB1YmxpY1Bhc3RQdXJjaGFzZXNSZWNvbW1lbmRlclR5cGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvcFByb2R1Y3RSZWNvbW1lbmRlciB7XG4gICAgcmVjb21tZW5kZXJUeXBlOiAndG9wLXByb2R1Y3RzJztcbiAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElGb3JZb3VQcm9kdWN0UmVjb21tZW5kZXIge1xuICAgIHJlY29tbWVuZGVyVHlwZTogJ2Zvci15b3UnO1xuICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3I6IFBlcnNvbmFsUmVjb21tZW5kZXJGblxuICAgIHRvcFByb2R1Y3RHZW5lcmF0b3I6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbjtcbiAgICB1c2VySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhc3RQdXJjaGFzZXNQcm9kdWN0UmVjb21tZW5kZXIge1xuICAgIHJlY29tbWVuZGVyVHlwZTogJ3Bhc3QtcHVyY2hhc2VzJztcbiAgICBwYXN0UHVyY2hhc2VzUHJvZHVjdEdlbmVyYXRvcjogUGVyc29uYWxSZWNvbW1lbmRlckZuO1xuICAgIHRvcFByb2R1Y3RHZW5lcmF0b3I6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbjtcbiAgICB1c2VySWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0UmVjb21tZW5kZXIgPSBJVG9wUHJvZHVjdFJlY29tbWVuZGVyIHwgSUZvcllvdVByb2R1Y3RSZWNvbW1lbmRlciB8IElQYXN0UHVyY2hhc2VzUHJvZHVjdFJlY29tbWVuZGVyO1xuXG5leHBvcnQgY29uc3QgQnVpbGRTcG9uc29yZWRDYXJvdXNlbCA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgcmVxdWVzdEJpZHM6IFJlcXVlc3RCaWRzRm4sXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICByZXF1ZXN0OiBJQmlkUmVxdWVzdFxuKTogUmVzdWx0PElCdWlsdENhcm91c2VsPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0J1aWxkU3BvbnNvcmVkQ2Fyb3VzZWwnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIHNwb25zb3JlZCBjYXJvdXNlbCcpO1xuICAgIHJldHVybiBPayh7XG4gICAgICAgIHR5cGU6ICdjYXJvdXNlbCcsXG4gICAgICAgIGdldFByb2R1Y3Q6IGdldE5leHRTcG9uc29yZWRDYXJvdXNlbFByb2R1Y3QuYmluZCh1bmRlZmluZWQsIGxvZyxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgcmVxdWVzdFxuICAgICAgICApXG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgQnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2U6IEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgIGluaXRpYWxCaWQ6IElCaWRcbik6IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWQnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIHNwb25zb3JlZCBjYXJvdXNlbCBmcm9tIGluaXRpYWwgYmlkJyk7XG4gICAgcmV0dXJuIE9rKHtcbiAgICAgICAgdHlwZTogJ2Nhcm91c2VsJyxcbiAgICAgICAgZ2V0UHJvZHVjdDogZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdEZyb21Jbml0aWFsQmlkLmJpbmQodW5kZWZpbmVkLCBsb2csXG4gICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBpbml0aWFsQmlkLFxuICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlXG4gICAgICAgIClcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBCdWlsZFJlY29tbWVuZGVkQ2Fyb3VzZWwgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgZm9yWW91UHJvZHVjdEdlbmVyYXRvcjogUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIHBhc3RQdXJjaGFzZXNQcm9kdWN0R2VuZXJhdG9yOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgdXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjb21tZW5kZXJUeXBlOiBQdWJsaWNSZWNvbW1lbmRlclR5cGVcbik6IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD4gPT4ge1xuICAgIHN3aXRjaChyZWNvbW1lbmRlclR5cGUudHlwZSkge1xuICAgICAgICBjYXNlICd0b3AtcHJvZHVjdHMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRSZWNvbW1lbmRlZENhcm91c2VsSW50ZXJuYWwobG9nZ2VyLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRlclR5cGU6ICd0b3AtcHJvZHVjdHMnLFxuICAgICAgICAgICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmb3IteW91Jzoge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbEludGVybmFsKGxvZ2dlcixcbiAgICAgICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAnZm9yLXlvdScsXG4gICAgICAgICAgICAgICAgICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzdC1wdXJjaGFzZXMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRSZWNvbW1lbmRlZENhcm91c2VsSW50ZXJuYWwobG9nZ2VyLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRlclR5cGU6ICdwYXN0LXB1cmNoYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIHBhc3RQdXJjaGFzZXNQcm9kdWN0R2VuZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICB1c2VySWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuY29uc3QgYnVpbGRSZWNvbW1lbmRlZENhcm91c2VsSW50ZXJuYWwgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZWNvbW1lbmRlclR5cGU6IFByb2R1Y3RSZWNvbW1lbmRlclxuKTogUmVzdWx0PElCdWlsdENhcm91c2VsPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2J1aWxkUmVjb21tZW5kZWRDYXJvdXNlbEludGVybmFsJyk7XG4gICAgbG9nPy5pbmZvKCdCdWlsZGluZyBSZWNvbW1lbmRlZCBDYXJvdXNlbCcpO1xuXG4gICAgcmV0dXJuIE9rKHtcbiAgICAgICAgdHlwZTogJ2Nhcm91c2VsJyxcbiAgICAgICAgZ2V0UHJvZHVjdDogZ2V0TmV4dFJlY29tbWVuZGVkQ2Fyb3VzZWxQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2csXG4gICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgICAgIClcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBCdWlsZEh5YnJpZENhcm91c2VsID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlOiBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4sXG4gICAgcmVxdWVzdEJpZHM6IFJlcXVlc3RCaWRzRm4sXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgZm9yWW91UHJvZHVjdEdlbmVyYXRvcjogUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIHBhc3RQdXJjaGFzZXNQcm9kdWN0R2VuZXJhdG9yOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgdXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjb21tZW5kZXJUeXBlOiBQdWJsaWNSZWNvbW1lbmRlclR5cGUsXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3Rcbik6IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD4gPT4ge1xuICAgIHN3aXRjaCAocmVjb21tZW5kZXJUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndG9wLXByb2R1Y3RzJzoge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkSHlicmlkQ2Fyb3VzZWxJbnRlcm5hbChsb2dnZXIsXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3RvcC1wcm9kdWN0cycsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Zvci15b3UnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRIeWJyaWRDYXJvdXNlbEludGVybmFsKGxvZ2dlcixcbiAgICAgICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAnZm9yLXlvdScsXG4gICAgICAgICAgICAgICAgICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzdC1wdXJjaGFzZXMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRIeWJyaWRDYXJvdXNlbEludGVybmFsKGxvZ2dlcixcbiAgICAgICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAncGFzdC1wdXJjaGFzZXMnLFxuICAgICAgICAgICAgICAgICAgICBwYXN0UHVyY2hhc2VzUHJvZHVjdEdlbmVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgdG9wUHJvZHVjdEdlbmVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBCdWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWQgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2U6IEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIHRvcFByb2R1Y3RHZW5lcmF0b3I6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBmb3JZb3VQcm9kdWN0R2VuZXJhdG9yOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgcGFzdFB1cmNoYXNlc1Byb2R1Y3RHZW5lcmF0b3I6IFBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZWNvbW1lbmRlclR5cGU6IFB1YmxpY1JlY29tbWVuZGVyVHlwZSxcbiAgICByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICBpbml0aWFsQmlkOiBJQmlkXG4pOiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+ID0+IHtcbiAgICBzd2l0Y2ggKHJlY29tbWVuZGVyVHlwZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1wcm9kdWN0cyc6IHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWRJbnRlcm5hbChsb2dnZXIsXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICBpbml0aWFsQmlkLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAndG9wLXByb2R1Y3RzJyxcbiAgICAgICAgICAgICAgICAgICAgdG9wUHJvZHVjdEdlbmVyYXRvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZm9yLXlvdSc6IHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWRJbnRlcm5hbChsb2dnZXIsXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICBpbml0aWFsQmlkLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAnZm9yLXlvdScsXG4gICAgICAgICAgICAgICAgICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzdC1wdXJjaGFzZXMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkSW50ZXJuYWwobG9nZ2VyLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdEJpZHMsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgaW5pdGlhbEJpZCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3Bhc3QtcHVyY2hhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcGFzdFB1cmNoYXNlc1Byb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCBidWlsZEh5YnJpZENhcm91c2VsSW50ZXJuYWwgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2U6IEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgIHJlY29tbWVuZGVyVHlwZTogUHJvZHVjdFJlY29tbWVuZGVyXG4pOiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnQnVpbGRIeWJyaWRDYXJvdXNlbCcpO1xuICAgIGxvZz8uaW5mbygnQnVpbGRpbmcgaHlicmlkIGNhcm91c2VsJywgcmVxdWVzdCwgcmVjb21tZW5kZXJUeXBlKTtcbiAgICByZXR1cm4gT2soe1xuICAgICAgICB0eXBlOiAnY2Fyb3VzZWwnLFxuICAgICAgICBnZXRQcm9kdWN0OiBnZXROZXh0SHlicmlkQ2Fyb3VzZWxQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2csXG4gICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgcmVxdWVzdEJpZHMsXG4gICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgICAgIClcbiAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZEludGVybmFsID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlOiBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4sXG4gICAgcmVxdWVzdEJpZHM6IFJlcXVlc3RCaWRzRm4sXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICBpbml0aWFsQmlkOiBJQmlkLFxuICAgIHJlY29tbWVuZGVyVHlwZTogUHJvZHVjdFJlY29tbWVuZGVyXG4pOiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkJyk7XG4gICAgbG9nPy5pbmZvKCdCdWlsZGluZyBoeWJyaWQgY2Fyb3VzZWwgZnJvbSBiaWQnLCByZXF1ZXN0LCByZWNvbW1lbmRlclR5cGUsIGluaXRpYWxCaWQpO1xuICAgIHJldHVybiBPayh7XG4gICAgICAgIHR5cGU6ICdjYXJvdXNlbCcsXG4gICAgICAgIGdldFByb2R1Y3Q6IGdldE5leHRIeWJyaWRDYXJvdXNlbFByb2R1Y3RGcm9tSW5pdGlhbEJpZC5iaW5kKHVuZGVmaW5lZCwgbG9nLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGluaXRpYWxCaWQsXG4gICAgICAgICAgICByZWNvbW1lbmRlclR5cGVcbiAgICAgICAgKVxuICAgIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiogZ2V0TmV4dEh5YnJpZENhcm91c2VsUHJvZHVjdChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgcmVjb21tZW5kZXJUeXBlOiBQcm9kdWN0UmVjb21tZW5kZXJcbik6IEFzeW5jR2VuZXJhdG9yPElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2U+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0TmV4dEh5YnJpZENhcm91c2VsUHJvZHVjdCcpO1xuICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgaHlicmlkIGNhcm91c2VsIHByb2R1Y3QgZ2VuZXJhdG9yJyk7XG5cbiAgICB5aWVsZCogZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgIHJlcXVlc3RcbiAgICApO1xuICAgIGxvZz8uaW5mbygnRG9uZSBnZXR0aW5nIG5leHQgc3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0Jyk7XG5cbiAgICB5aWVsZCogZ2V0TmV4dFJlY29tbWVuZGVkQ2Fyb3VzZWxQcm9kdWN0KGxvZyxcbiAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdldE5leHRIeWJyaWRDYXJvdXNlbFByb2R1Y3RGcm9tSW5pdGlhbEJpZChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgaW5pdGlhbEJpZDogSUJpZCxcbiAgICByZWNvbW1lbmRlclR5cGU6IFByb2R1Y3RSZWNvbW1lbmRlclxuKTogQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXROZXh0SHlicmlkQ2Fyb3VzZWxQcm9kdWN0Jyk7XG4gICAgbG9nPy5pbmZvKCdFbnRlcmluZyBoeWJyaWQgY2Fyb3VzZWwgcHJvZHVjdCBnZW5lcmF0b3InKTtcblxuICAgIHlpZWxkKiBnZXROZXh0U3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0RnJvbUluaXRpYWxCaWQobG9nLFxuICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgaW5pdGlhbEJpZCxcbiAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICk7XG4gICAgbG9nPy5pbmZvKCdEb25lIGdldHRpbmcgbmV4dCBzcG9uc29yZWRDYXJvdXNlbFByb2R1Y3QnKTtcblxuICAgIHlpZWxkKiBnZXROZXh0UmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QobG9nLFxuICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICByZWNvbW1lbmRlclR5cGVcbiAgICApO1xufVxuYXN5bmMgZnVuY3Rpb24gKmdldE5leHRTcG9uc29yZWRDYXJvdXNlbFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3Rcbik6IEFzeW5jR2VuZXJhdG9yPElCdWlsdFByb2R1Y3RDYXJkQmlkUmVzcG9uc2U+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdCcpO1xuICAgIHRyeSB7XG4gICAgICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgc3BvbnNvcmVkIGNhcm91c2VsIHByb2R1Y3QgZ2VuZXJhdG9yJyk7XG4gICAgICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgICAgIGxvZz8uaW5mbygnR2V0dGluZyBuZXh0IHNwb25zb3JlZCBjYXJvdXNlbCBwcm9kdWN0cycsIHJlcXVlc3QpO1xuXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RCaWRzKHJlcXVlc3QpO1xuICAgICAgICAgICAgaWYoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbG9nPy5pbmZvKCdObyByZXNwb25zZSBmcm9tIGJpZGRlcicsIHJlc3BvbnNlLmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJpZHMgPSByZXNwb25zZS52YWx1ZS5zZWF0YmlkPy5bMF0/LmJpZDtcbiAgICAgICAgICAgIGlmKGJpZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxvZz8uaW5mbygnR290IG5vIGJpZHMgaW4gcmVzcG9uc2UhJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UoYmlkcyk7XG4gICAgICAgICAgICBmb3IgYXdhaXQoY29uc3QgcHJvZHVjdCBvZiBnZW5lcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBsb2c/LmRlYnVnKCdHZXR0aW5nIG5leHQgcHJvZHVjdCBmcm9tIGV4aXN0aW5nIGJpZGRlciByZXNwb25zZScsIHByb2R1Y3QpO1xuICAgICAgICAgICAgICAgIHlpZWxkIHByb2R1Y3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2c/LmRlYnVnKCdPdXQgb2YgYmlkcyBmcm9tIHByZXZpb3VzIHJlc3BvbnNlLiBSZXF1ZXN0aW5nIG5ldyBiaWQgcmVzcG9uc2UnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIGxvZz8uZXJyb3IoJ3Byb2R1Y3QgY2Fyb3VzZWwgZ2VuZXJhdG9yIGZhaWxlZCEgR290JywgZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBsb2c/Lndhcm4oJ0V4aXRpbmcgY2Fyb3VzZWwgcHJvZHVjdCBnZW5lcmF0b3InKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uICpnZXROZXh0U3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0RnJvbUluaXRpYWxCaWQoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgIGluaXRpYWxCaWQ6IElCaWQsXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGblxuKTogQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXROZXh0U3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0RnJvbVJlc3BvbnNlJyk7XG4gICAgbG9nPy5pbmZvKCdHZW5lcmF0aW5nIHNwb25zb3JlZCBwcm9kdWN0IGNhcmRzIGZyb20gaW5pdGlhbCBiaWQgcmVzcG9uc2UnKTtcbiAgICBsb2c/LmRlYnVnKGluaXRpYWxCaWQpO1xuICAgIHlpZWxkKiBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UoW2luaXRpYWxCaWRdKTtcbiAgICB5aWVsZCogZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdChsb2dnZXIsXG4gICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgIHJlcXVlc3RcbiAgICApO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gKmdldE5leHRSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlY29tbWVuZGVyVHlwZTogUHJvZHVjdFJlY29tbWVuZGVyXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldE5leHRSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdCcpO1xuICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgcmVjb21tZW5kZWQgY2Fyb3VzZWwgcHJvZHVjdCBnZW5lcmF0b3InKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgbmV4dCByZWNvbW1lbmRlZCBjYXJvdXNlbCBwcm9kdWN0Jyk7XG4gICAgc3dpdGNoIChyZWNvbW1lbmRlclR5cGUucmVjb21tZW5kZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1wcm9kdWN0cyc6IHtcbiAgICAgICAgICAgIHlpZWxkKiBnZXROZXh0VG9wQWxsUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QobG9nLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Zvci15b3UnOiB7XG4gICAgICAgICAgICBpZiAocmVjb21tZW5kZXJUeXBlLnVzZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIGdldE5leHRGb3JZb3VSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlLnVzZXJJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXN0LXB1cmNoYXNlcyc6IHtcbiAgICAgICAgICAgIGlmIChyZWNvbW1lbmRlclR5cGUudXNlcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogZ2V0TmV4dFBhc3RQdXJjaGFzZXNSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlLnVzZXJJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiBmYWxsYmFjayBjYXNlIGlmIHRoZSBvdGhlciBvbmVzIHlpZWxkIG5vdGhpbmcsIG9yIGlmIHVzZXIgSUQgaXMgbm90IHNldCAqL1xuICAgIHlpZWxkKiBnZXROZXh0VG9wQWxsUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QobG9nLFxuICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICB7XG4gICAgICAgICAgICByZWNvbW1lbmRlclR5cGU6ICd0b3AtcHJvZHVjdHMnLFxuICAgICAgICAgICAgdG9wUHJvZHVjdEdlbmVyYXRvcjogcmVjb21tZW5kZXJUeXBlLnRvcFByb2R1Y3RHZW5lcmF0b3JcbiAgICAgICAgfVxuICAgICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uKiBnZXROZXh0VG9wQWxsUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZWNvbW1lbmRlclR5cGU6IElUb3BQcm9kdWN0UmVjb21tZW5kZXJcbik6IEFzeW5jR2VuZXJhdG9yPElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2U+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0TmV4dFRvcEFsbFJlY29tbWVuZGVkQ2Fyb3VzZWxQcm9kdWN0Jyk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIG5leHQgdG9wIGFsbCBwcm9kdWN0Jyk7XG4gICAgZm9yIGF3YWl0IChjb25zdCBwcm9kdWN0IG9mIHJlY29tbWVuZGVyVHlwZS50b3BQcm9kdWN0R2VuZXJhdG9yKCkpIHtcbiAgICAgICAgY29uc3QgYnVpbHQgPSByZWNvbW1lbmRlZFByb2R1Y3RUb0J1aWx0UHJvZHVjdChsb2csIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsIHByb2R1Y3QpO1xuICAgICAgICBpZiAoIWJ1aWx0Lm9rKSB7XG4gICAgICAgICAgICBsb2c/Lndhcm4oJ0ZhaWxlZCB0byBidWlsZCBwcm9kdWN0IHJlc3BvbnNlIGZyb20gcmVjb21tZW5kZWQgcHJvZHVjdC4gU2tpcHBpbmcgdGhpcyBvbmUnLCBwcm9kdWN0KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIGJ1aWx0LnZhbHVlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdldE5leHRGb3JZb3VSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlY29tbWVuZGVyVHlwZTogSUZvcllvdVByb2R1Y3RSZWNvbW1lbmRlcixcbiAgICB1c2VySWQ6IHN0cmluZ1xuKTogQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXROZXh0Rm9yWW91UmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgbmV4dCBcImZvci15b3VcIiByZWNvbW1lbmRlZCBwcm9kdWN0Jyk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHByb2R1Y3Qgb2YgcmVjb21tZW5kZXJUeXBlLmZvcllvdVByb2R1Y3RHZW5lcmF0b3IodXNlcklkKSkge1xuICAgICAgICBjb25zdCBidWlsdCA9IHJlY29tbWVuZGVkUHJvZHVjdFRvQnVpbHRQcm9kdWN0KGxvZywgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSwgcHJvZHVjdCk7XG4gICAgICAgIGlmICghYnVpbHQub2spIHtcbiAgICAgICAgICAgIGxvZz8ud2FybignRmFpbGVkIHRvIGJ1aWxkIHByb2R1Y3QgcmVzcG9uc2UgZnJvbSByZWNvbW1lbmRlZCBwcm9kdWN0LiBTa2lwcGluZyB0aGlzIG9uZScsIHByb2R1Y3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgYnVpbHQudmFsdWU7XG4gICAgfVxuICAgIC8qIFVzZSB0b3AtYWxsIGFzIGZhbGxiYWNrICovXG4gICAgeWllbGQqIGdldE5leHRUb3BBbGxSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3RvcC1wcm9kdWN0cycsXG4gICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiByZWNvbW1lbmRlclR5cGUudG9wUHJvZHVjdEdlbmVyYXRvclxuICAgICAgICB9XG4gICAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdldE5leHRQYXN0UHVyY2hhc2VzUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZWNvbW1lbmRlclR5cGU6IElQYXN0UHVyY2hhc2VzUHJvZHVjdFJlY29tbWVuZGVyLFxuICAgIHVzZXJJZDogc3RyaW5nXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldE5leHRQYXN0UHVyY2hhc2VzUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgbmV4dCBcImJ1eS1hZ2FpblwiIHJlY29tbWVuZGVkIHByb2R1Y3QnKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgcHJvZHVjdCBvZiByZWNvbW1lbmRlclR5cGUucGFzdFB1cmNoYXNlc1Byb2R1Y3RHZW5lcmF0b3IodXNlcklkKSkge1xuICAgICAgICBjb25zdCBidWlsdCA9IHJlY29tbWVuZGVkUHJvZHVjdFRvQnVpbHRQcm9kdWN0KGxvZywgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSwgcHJvZHVjdCk7XG4gICAgICAgIGlmICghYnVpbHQub2spIHtcbiAgICAgICAgICAgIGxvZz8ud2FybignRmFpbGVkIHRvIGJ1aWxkIHByb2R1Y3QgcmVzcG9uc2UgZnJvbSByZWNvbW1lbmRlZCBwcm9kdWN0LiBTa2lwcGluZyB0aGlzIG9uZScsIHByb2R1Y3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgYnVpbHQudmFsdWU7XG4gICAgfVxuXG4gICAgeWllbGQqIGdldE5leHRUb3BBbGxSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3RvcC1wcm9kdWN0cycsXG4gICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiByZWNvbW1lbmRlclR5cGUudG9wUHJvZHVjdEdlbmVyYXRvclxuICAgICAgICB9XG4gICAgKTtcbn1cblxuY29uc3QgcmVjb21tZW5kZWRQcm9kdWN0VG9CdWlsdFByb2R1Y3QgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICBwcm9kdWN0OiBJUHJvZHVjdEluZm9ybWF0aW9uXG4pOiBSZXN1bHQ8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdyZWNvbW1lbmRlZFByb2R1Y3RUb0J1aWx0UHJvZHVjdCcpO1xuICAgIGxvZz8uaW5mbygnQ29udmVydGluZyByZWNvbW1lbmRlZCBwcm9kdWN0IHRvIGJ1aWx0IHByb2R1Y3QgY2FyZCByZXNwb25zZScpO1xuXG4gICAgY29uc3QgY2xpY2t0aHJvdWdoID0gZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZShwcm9kdWN0KTtcbiAgICBpZiAoIWNsaWNrdGhyb3VnaC5vaykge1xuICAgICAgICByZXR1cm4gY2xpY2t0aHJvdWdoO1xuICAgIH1cbiAgICByZXR1cm4gT2soe1xuICAgICAgICB0eXBlOiAncHJvZHVjdC1jYXJkJyxcbiAgICAgICAgY2xpY2t0aHJvdWdoOiBjbGlja3Rocm91Z2gudmFsdWUgKyAnX3JlY29tbWVuZGVkJyxcbiAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgc3BvbnNvcmVkOiBmYWxzZVxuICAgIH0pO1xufTtcblxuZXhwb3J0IGNsYXNzIEludmFsaWRSZWNvbW1lbmRlclR5cGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCdDb3VsZCBub3QgZ2VuZXJhdGUgY2Fyb3VzZWw7IGludmFsaWQgcmVjb21tZW5kZXIgdHlwZSBcIicgKyB0eXBlICsgJ1wiJyk7XG4gICAgfVxufTtcbiIsCiAgICAiY29uc3QgREVGQVVMVF9NQVhfU0xVRzogbnVtYmVyID0gNTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgcGFzc2VkIHN0cmluZyB0byBhIHNsdWcgd2l0aCB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuIEJ5IGRlZmF1bHQsIHRoZSBzbHVnIGlzIGh5cGhlbmF0ZWQgYW5kIG9ubHlcbiAqIGNvbnRhaW5zIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBZb3UgY2FuIHBhc3MgYSBkaWZmZXJlbnQgaHlwaGVuYXRpb24gcmVnZXggYW5kIGEgZGlmZmVyZW50IGRyb3AgcmVnZXggdG9cbiAqIGN1c3RvbWl6ZSB0aGUgc2x1Zy4gRm9yIGV4YW1wbGUsIHt7c2x1ZyBcIk15IFByb2R1Y3QgTmFtZVwifX0gd2lsbCByZXR1cm4gXCJteS1wcm9kdWN0LW5hbWVcIi5cbiAqXG4gKiBUbyBjaGFuZ2Ugd2hpY2ggY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvIGh5cGhlbnMsIHlvdSBjYW4gcGFzcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB0aGUgaHlwaGVuYXRlIG9wdGlvbi5cbiAqIEZvciBleGFtcGxlLCB7e3NsdWcgXCJNeSBQcm9kdWN0J3MgTmFtZVwiIGh5cGhlbmF0ZT1cIltcXHMnXVwifX0gd2lsbCByZXR1cm4gXCJteS1wcm9kdWN0LXMtbmFtZVwiLlxuICogVGhlIGRlZmF1bHQgaHlwaGVuYXRlIHJlZ2V4IGlzIC9bXFxzX1xcLSxdL2lnLlxuICpcbiAqIFRvIHJlbW92ZSBjaGFyYWN0ZXJzIGluc3RlYWQgb2YgaHlwaGVuYXRlIHRoZW0sIHlvdSBjYW4gcGFzcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB0aGUgZHJvcCBvcHRpb24uXG4gKiBGb3IgZXhhbXBsZSwge3tzbHVnIFwiTXkgUHJvZHVjdCdzIE5hbWVcIiBkcm9wPVwiW15BLVphLXowLTlcXHMnXVwifX0gd2lsbCByZXR1cm4gXCJteS1wcm9kdWN0J3MtbmFtZVwiLlxuICogVGhlIGRlZmF1bHQgZHJvcCByZWdleCBpcyAvW15BLVphLXowLTlcXC1dL2lnLlxuICpcbiAqIFRvIGxpbWl0IHRoZSBtYXggbnVtYmVyIG9mIGh5cGhlbmF0ZWQgc2x1ZyBjb21wb25lbnRzIHJldHVybmVkLCB5b3UgY2FuIHBhc3MgYSBsZW5ndGggb3B0aW9uLlxuICogRm9yIGV4YW1wbGUsIHt7c2x1ZyBcIk15IFByb2R1Y3QncyBOYW1lXCIgbGVuZ3RoPTJ9fSB3aWxsIHJldHVybiBcIm15LXByb2R1Y3RcIi5cbiAqIFRoZSBkZWZhdWx0IGxlbmd0aCBpcyA1LlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBzdHJpbmcgdG8gYmUgc2x1Z2lmaWVkXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuIENhbiB0YWtlIFwiaHlwZW5hdGVcIiwgXCJkcm9wXCIsIGFuZCBcImxlbmd0aFwiIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgc2x1Z2lmaWVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2x1ZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgICBoYXNoOiB7XG4gICAgICAgICAgICBoeXBoZW5hdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRyb3A6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRyb3BCZWZvcmU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxlbmd0aDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgc2VwYXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG4pOiBzdHJpbmcge1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgKG5hbWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgaHlwaGVuYXRlOiBSZWdFeHAgPSBvcHRpb25zLmhhc2guaHlwaGVuYXRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgUmVnRXhwKG9wdGlvbnMuaGFzaC5oeXBoZW5hdGUsICdpZycpXG4gICAgICAgIDogL1tcXHNfXFwtLF0vaWc7XG5cbiAgICBjb25zdCBkcm9wOiBSZWdFeHAgPSBvcHRpb25zLmhhc2guZHJvcCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IFJlZ0V4cChvcHRpb25zLmhhc2guZHJvcCwgJ2lnJylcbiAgICAgICAgOiAvW15BLVphLXowLTktXS9pZztcblxuICAgIGNvbnN0IGRyb3BCZWZvcmUgPSBvcHRpb25zLmhhc2guZHJvcEJlZm9yZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IFJlZ0V4cChvcHRpb25zLmhhc2guZHJvcEJlZm9yZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBtYXhTbHVnOiBudW1iZXIgPSBvcHRpb25zLmhhc2gubGVuZ3RoID8/IERFRkFVTFRfTUFYX1NMVUc7XG5cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBvcHRpb25zLmhhc2guc2VwYXJhdG9yID8/ICctJztcbiAgICBpZiAoZHJvcEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoZHJvcEJlZm9yZSwgJycpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICAgICAgICAucmVwbGFjZShoeXBoZW5hdGUsIHNlcGFyYXRvcilcbiAgICAgICAgLnJlcGxhY2UoZHJvcCwgJycpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5zcGxpdChzZXBhcmF0b3IpXG4gICAgICAgIC5zbGljZSgwLCBtYXhTbHVnKVxuICAgICAgICAuam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBwYXNzZWQgc3RyaW5nIHRvIGxvd2VyY2FzZS4gRm9yIGV4YW1wbGUsIHt7bG93ZXIgXCJNeSBQcm9kdWN0IE5hbWVcIn19IHdpbGwgcmV0dXJuIFwibXkgcHJvZHVjdCBuYW1lXCIuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlXG4gKiBAcmV0dXJucyBBIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIHRoZSBwYXNzZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgKG5hbWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cHBlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgKG5hbWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBuYW1lLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBjb21wb25lbnQgb2YgdGhlIFVSTCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLCAxLWluZGV4ZWRcbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgVVJMIGlzIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9mb28vYmFyXCIsIHt7cGF0aCAxfX0gd2lsbCByZXR1cm4gXCJmb29cIi5cbiAqXG4gKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBwYXRoIGNvbXBvbmVudCB0byByZXR1cm4sIDEtaW5kZXhlZFxuICogQHJldHVybnMgVGhlIHBhdGggY29tcG9uZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGgocG9zaXRpb246IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHBvc2l0aW9uID09PSAwIHx8IHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBwYXRocyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpO1xuICAgIGlmIChwYXRocy5sZW5ndGggPD0gcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHNbcG9zaXRpb25dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VkKGlucHV0OiBzdHJpbmcsIHNlYXJjaFJlZ2V4OiBzdHJpbmcsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKG5ldyBSZWdFeHAoc2VhcmNoUmVnZXgpLCAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBFTkQgPSAtMjtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gYXJncy5zbGljZSgxLCBFTkQpIGFzIHN0cmluZ1tdOyAvLyBFeHRyYWN0IGNhcHR1cmUgZ3JvdXBzXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlcGxhY2VtZW50O1xuXG4gICAgICAgIC8vIFJlcGxhY2UgYmFja3JlZmVyZW5jZXMgKFxcMSwgXFwyLCBldGMuKVxuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxcXChcXGQrKS9nLCAoXywgZ3JvdXBJbmRleCkgPT4gZ3JvdXBzW2dyb3VwSW5kZXggLSAxXSA/PyAnJyk7XG5cbiAgICAgICAgLy8gU3VwcG9ydCBmb3IgXFxVICh1cHBlcmNhc2UgdHJhbnNmb3JtYXRpb24pXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXFxcVShcXGQrKS9nLCAoXywgZ3JvdXBJbmRleCkgPT5cbiAgICAgICAgICAgIChncm91cHNbZ3JvdXBJbmRleCAtIDFdID8/ICcnKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVzdWx0ID0gc2VkQ29tbWFuZChyZXN1bHQsICdVJywgZ3JvdXBzLCBzdHIgPT4gc3RyPy50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgcmVzdWx0ID0gc2VkQ29tbWFuZChyZXN1bHQsICdMJywgZ3JvdXBzLCBzdHIgPT4gc3RyPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmVzdWx0ID0gc2VkQ29tbWFuZChyZXN1bHQsICdJJywgZ3JvdXBzLCBzdHIgPT4gc3RyPy5bMF0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQgPz8gJyc7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlKGlucHV0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nLCBhbGw6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYoc2VhcmNoID09PSBudWxsIHx8IHNlYXJjaCA9PT0gdW5kZWZpbmVkIHx8IHJlcGxhY2VtZW50ID09PSBudWxsIHx8IHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmKGFsbCkge1xuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZUFsbChzZWFyY2gsIHJlcGxhY2VtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2Uoc2VhcmNoLCByZXBsYWNlbWVudCk7XG59XG5cbmZ1bmN0aW9uIHNlZENvbW1hbmQoXG4gICAgaW5wdXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjaGFyOiBzdHJpbmcsXG4gICAgZ3JvdXBzOiBzdHJpbmdbXSxcbiAgICB0cmFuc2Zvcm06IChpbnB1dDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXFxcXFwke2NoYXJ9KFxcXFxkKylgLCAnZycpLCAoXywgZ3JvdXBJbmRleCkgPT5cbiAgICAgICAgdHJhbnNmb3JtKGdyb3Vwc1tncm91cEluZGV4IC0gMV0gPz8gJycpID8/ICcnXG4gICAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIHRoZSBVUkwsIHNwZWNpZmllZCBieSBrZXkuXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIFVSTCBpcyBcImh0dHBzOi8vZXhhbXBsZS5jb20/Zm9vPWJhclwiLCB7e3NlYXJjaCBcImZvb1wifX0gd2lsbCByZXR1cm4gXCJiYXJcIi5cbiAqXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHRvIHJldHVyblxuICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhcmNoKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG5hbWU/Lmxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcbiAgICBpZiAoc2VhcmNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKTtcbiAgICByZXR1cm4gcGFyYW1zLmdldChuYW1lKSA/PyAnJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgYXJndW1lbnQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBhbGwgYXJndW1lbnRzIGFyZSBmYWxzeS4gUmV0dXJucyBmYWxzZSBmb3IgZW1wdHkgc3RyaW5nc1xuICogRm9yIGV4YW1wbGUsIHt7Y29hbGVzY2UgZmFsc2UgKGVxIFwiYlwiIFwiZFwiKSBjfX0gd2lsbCByZXR1cm4gXCJjXCIsIGJlY2F1c2UgZmFsc2UgaXMgZmFsc3ksIFwiYlwiIGlzIG5vdCBlcXVhbCB0byBcImRcIixcbiAqIGFuZCBjIGlzIHRydXRoeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZmlyc3QgdHJ1dGh5IGFyZ3VtZW50LCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgYWxsIGFyZ3VtZW50cyBhcmUgZmFsc3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvYWxlc2NlKCk6IHN0cmluZyB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaWYgKGFyZyAhPT0gbnVsbCAmJiBhcmcgIT09IHVuZGVmaW5lZCAmJiBhcmcgIT09ICcnICYmIGFyZyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEpvaW5zIHRoZSBwYXNzZWQgYXJndW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBzZXBhcmF0b3IuXG4gKiBGb3IgZXhhbXBsZSwge3tqb2luIFwiZm9vXCIgXCJiYXJcIiBcImJhelwifX0gd2lsbCByZXR1cm4gXCJmb28vYmFyL2JhelwiLi5cbiAqXG4gKiBUaGVyZSBpcyBhbiBvcHRpb25hbCBcInNlcGFyYXRvclwiIGFyZ3VtZW50IHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjaGFuZ2UgdGhlIHNlcGFyYXRvci4gRm9yIGV4YW1wbGUsXG4gKiB7e2pvaW4gXCJmb29cIiBcImJhclwiIFwiYmF6XCIgc2VwYXJhdG9yPVwiLFwifX0gd2lsbCByZXR1cm4gXCJmb28sYmFyLGJhelwiLlxuICpcbiAqIEByZXR1cm5zIFRoZSBqb2luZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYXJncyA9IFsuLi5hcmd1bWVudHNdLnNsaWNlKDAsIGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBjb25zdCBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsgLyogb3B0aW9ucyBpcyBhbHdheXMgdGhlIGxhc3QgYXJndW1lbnQgKi9cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBvcHRpb25zLmhhc2guc2VwYXJhdG9yIGFzIHN0cmluZyA/PyAnLyc7XG4gICAgcmV0dXJuIGFyZ3NcbiAgICAgICAgLmZpbHRlcihhcmcgPT4gYXJnICE9PSB1bmRlZmluZWQgJiYgYXJnICE9PSBudWxsICYmIGFyZyAhPT0gJycpIC8qIGZpbHRlciBvdXQgbnVsbHMgYW5kIGVtcHRpZXMgKi9cbiAgICAgICAgLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIHRoZSBwYXNzZWQgc3RyaW5nIGZvciB1c2UgaW4gYSBVUkkgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgVGhlIHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIHN0cmluZywgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBjb21wb25lbnQgaXMgZmFsc3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVyaShjb21wb25lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNvbXBvbmVudD8ubGVuZ3RoID09PSB1bmRlZmluZWQgfHwgY29tcG9uZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlQWxsKCdcXCcnLCAnJTI3Jyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcGFzc2VkIGFyZ3VtZW50cyBhcmUgZXF1YWwgKHVzaW5nIGphdmFzY3JpcHQgPT09KSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBhcmd1bWVudFxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBhcmd1bWVudFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHdvIGFyZ3VtZW50cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXEoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYSA9PT0gYjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIG9mIHRoZSBwYXNzZWQgYXJndW1lbnRzIGFyZSB0cnV0aHksIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgYXJndW1lbnRcbiAqIEByZXR1cm5zIFRydWUgaWYgZWl0aGVyIG9mIHRoZSBhcmd1bWVudHMgYXJlIHRydXRoeSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKGEpIHx8IEJvb2xlYW4oYik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGJvdGggb2YgdGhlIHBhc3NlZCBhcmd1bWVudHMgYXJlIHRydXRoeSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBhcmd1bWVudFxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBhcmd1bWVudFxuICogQHJldHVybnMgVHJ1ZSBpZiBib3RoIG9mIHRoZSBhcmd1bWVudHMgYXJlIHRydXRoeSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmQoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihhKSAmJiBCb29sZWFuKGIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgaW4gdGhlIHNlY29uZCBhcmd1bWVudCAoYW4gYXJyYXkpLiBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UuXG4gKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhbiBhcnJheSwgb3IgdGhlIGFycmF5IGlzIGVtcHR5LCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFRoZSBuYW1lIG9mIHRoZSBoZWxwZXIgaXMgXCJpblwiIGJ1dCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaXMgXCJpc0luXCIgYmVjYXVzZSBcImluXCIgaXMgYSByZXNlcnZlZCB3b3JkIGluIGphdmFzY3JpcHQuXG4gKlxuICogQHBhcmFtIGEgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcGFyYW0gYiBUaGUgYXJyYXkgdG8gY2hlY2sgYWdhaW5zdFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGFycmF5LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW4oYTogYW55LCBiOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChiPy5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBiLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBiLmluY2x1ZGVzKGEpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHBhc3NlZCBhcmd1bWVudHMuIFVzZWZ1bCB3aXRoIHRoZSBcImluXCIgaGVscGVyXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgdGhlIHBhc3NlZCBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KCk6IGFueVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhcmd1bWVudHMpLnNsaWNlKDAsIC0xKTtcbn1cblxuLyogTmVlZCB0byBkaXNhYmxlIHRoaXMgcnVsZSBoZXJlIHRvIGJlIGNvbXBhdGJpbGUgd2l0aCBoYW5kbGViYXJzICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbmV4cG9ydCB0eXBlIEhhbmRsZWJhcnNIZWxwZXJzID0gUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+XG5cbmV4cG9ydCBjb25zdCBHZXRIZWxwZXJzID0gKCk6IEhhbmRsZWJhcnNIZWxwZXJzID0+ICh7XG4gICAgc2x1ZyxcbiAgICBsb3dlcixcbiAgICBwYXRoLFxuICAgIHNlZCxcbiAgICByZXBsYWNlLFxuICAgIHNlYXJjaCxcbiAgICBjb2FsZXNjZSxcbiAgICBqb2luLFxuICAgIGdldF9maXJzdDogY29hbGVzY2UsXG4gICAgdXJpLFxuICAgIG9yLFxuICAgIGFuZCxcbiAgICBpc0luLFxuICAgIGFycmF5XG59KTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdywgSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbiwgSURldmljZSwgSUdlb0NvbnRleHQgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQge1xuICAgIEFzeW5jUmVzdWx0LFxuICAgIEVycixcbiAgICBJTmF2aWdhdG9yLFxuICAgIHR5cGUgSVNjcmVlbixcbiAgICBHZXRWYWx1ZSxcbiAgICBPayxcbiAgICBSZXF1ZXN0Qmlkc0ZuLFxuICAgIElMb2dnZXIsXG4gICAgR2V0U3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIFBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgR2V0Q29uZmlndXJhdGlvbkZuLFxuICAgIEdldEdlb0ZuLFxuICAgIEdldERldmljZUZuLFxuICAgIEdldFJlY29tbWVuZGVkUHJvZHVjdEZyb21Qcm9kdWN0SWRGbixcbiAgICBSZXF1ZXN0QmlkcyxcbiAgICBHZXRDb25maWd1cmF0aW9uLFxuICAgIEdldEdlbyxcbiAgICBHZXREZXZpY2UsXG4gICAgR2V0U3BvbnNvcmVkUHJvZHVjdCxcbiAgICBHZXRSZWNvbW1lbmRlZFByb2R1Y3QsXG4gICAgR2VuZXJhdGVUb3BQcm9kdWN0cyxcbiAgICBHZW5lcmF0ZUZvcllvdSxcbiAgICBHZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzLFxuICAgIEdldEFsbFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICBHZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbn0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICAgIEJ1aWxkQWxsU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZXMsXG4gICAgQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlc0ZuLFxuICAgIERlZmF1bHROYXRpdmUsXG4gICAgR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgIEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIEdldEhlbHBlcnMsXG4gICAgTmF0aXZlUmVxdWVzdEJ1aWxkZXJGbixcbiAgICBSZXF1ZXN0QnVpbGRlckZuLFxuICAgIFN0YXJ0TmF0aXZlLFxuICAgIFN0YXJ0UmVxdWVzdFxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycy9ydW50aW1lJztcbmltcG9ydCB7XG4gICAgQnVpbGRIeWJyaWRDYXJvdXNlbCxcbiAgICBCdWlsZEh5YnJpZENhcm91c2VsRm4sXG4gICAgQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkLFxuICAgIEJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZEZuLFxuICAgIEJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbCxcbiAgICBCdWlsZFJlY29tbWVuZGVkQ2Fyb3VzZWxGbixcbiAgICBCdWlsZFNwb25zb3JlZENhcm91c2VsLFxuICAgIEJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWxGbixcbiAgICBCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWQsXG4gICAgQnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkRm5cbn0gZnJvbSAnLi9oZWxwZXJzL3Jlc3BvbnNlL0Nhcm91c2VsJztcbmltcG9ydCB7IEdldFdpbmRvd0luZm8gfSBmcm9tICcuL2hlbHBlcnMvV2luZG93JztcbmltcG9ydCB7XG4gICAgdHlwZSBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4sXG4gICAgRXZhbHVhdGVIYW5kbGViYXJzQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgRXZhbHVhdGVIYW5kbGViYXJzUHJvZHVjdENhcmRUZW1wbGF0ZSxcbiAgICB0eXBlIEV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZUZuXG59IGZyb20gJy4vc2VydmljZXMvVGVtcGxhdGUnO1xuaW1wb3J0IHtcbiAgICBCdWlsZER5bmFtaWNab25lUmVxdWVzdCxcbiAgICBCdWlsZER5bmFtaWNab25lUmVxdWVzdEZuLFxuICAgIEdldER5bmFtaWNab25lLFxuICAgIEdldER5bmFtaWNab25lRm5cbn0gZnJvbSAnLi9zZXJ2aWNlcy9EeW5hbWljJztcblxuZXhwb3J0IGNvbnN0IFBST0RfQklEREVSID0gJy8vcnRiLnN1cmZzaWRlLmlvL3J0Yi9iaWRzL3N1cmZzaWRlJztcbmV4cG9ydCBjb25zdCBQUk9EX0NPTkZJR1VSQVRJT05fU0VSVklDRSA9ICcvL3Iuc3VyZnNpZGUuaW8nO1xuZXhwb3J0IGNvbnN0IFBST0RfU1BPTlNPUkVEX1BST0RVQ1RfRkVFRCA9ICcvL2NyZWF0aXZlLnN1cmZzaWRlLmlvJztcbmV4cG9ydCBjb25zdCBQUk9EX1JFQ09NTUVOREVEX1BST0RVQ1RfRkVFRCA9ICcvL2NyZWF0aXZlLnN1cmZzaWRlLmlvJztcbmV4cG9ydCBjb25zdCBQUk9EX1JFQ09NTUVOREVSX1NFUlZJQ0UgPSAnLy90LnN1cmZzaWRlLmlvJztcbmV4cG9ydCBjb25zdCBQUk9EX0RZTkFNSUNfWk9ORV9TRVJWSUNFID0gJy8vci5zdXJmc2lkZS5pby8nO1xuXG5jb25zdCBUTFMgPSAodXJsOiBzdHJpbmcpID0+ICdodHRwOicgKyB1cmw7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNlcnZpY2VzIGZvciBxdWVyeWluZyB0aGUgc3VyZnNpZGUgQVBJIGFuZCBidWlsZGluZyByZXNwb25zZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VyZnNpZGVBcGkge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcj86IElMb2dnZXIsXG5cbiAgICAvKiA9PT09PT09PT09IERhdGEgPT09PT09PT09PSAqL1xuICAgIC8qKlxuICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFVzZXIncyBkZXZpY2UgaW4gT3BlblJUQidzIGRldmljZSBmb3JtYXRcbiAgICAgKi9cbiAgICBnZXREZXZpY2U6IEdldERldmljZUZuLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIncyBkZXZpY2UgaW5mb1xuICAgICAqL1xuICAgIGRldmljZTogSURldmljZSB8IHVuZGVmaW5lZCxcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHVzZXIncyBjdXJyZW50IGN1cnJlbnQgZ2VvIGFuZCBJUCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBnZXRHZW86IEdldEdlb0ZuLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIncyBjdXJyZW50IGdlbyBhbmQgSVAgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBnZW86IElHZW9Db250ZXh0IHwgdW5kZWZpbmVkLFxuXG4gICAgLyogPT09PT09PT09PSBDb25maWcgPT09PT09PT09PSAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBzaXRlJ3MgcHVibGlzaGVyIGNvbmZpZ3VyYXRpb24uIFByb2R1Y3QgY2FyZCB0ZW1wbGF0ZXMsIGNsaWNrdGhyb3VnaCBVUkwgdGVtcGxhdGVzLCBzZXR0aW5ncywgZXRjLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXRlJ3MgcHVibGlzaGVyIGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBnZXRDb25maWd1cmF0aW9uOiBHZXRDb25maWd1cmF0aW9uRm4sXG5cbiAgICAvKipcbiAgICAgKiBBIGhhbmRsZWJhcnMgcnVudGltZSBpbnN0YW5jZSwgZm9yIGV2YWx1YXRpbmcgdGVtcGxhdGVzXG4gICAgICovXG4gICAgaGFuZGxlYmFyczogdHlwZW9mIEhhbmRsZWJhcnNcblxuICAgIC8qID09PT09PT09PT0gQmlkZGVyID09PT09PT09PT0gKi9cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIGJpZCByZXF1ZXN0IHRvIHRoZSBiaWRkZXIgYW5kIHJldHVybnMgaXRzIHJlc3BvbnNlLCBpZiBhdmFpbGFibGVcbiAgICAgKi9cbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhbiBPcGVuUlRCIDIuNiByZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRSZXF1ZXN0OiBSZXF1ZXN0QnVpbGRlckZuLFxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGFuIE9wZW5SVEIgTmF0aXZlIDEuMiByZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnROYXRpdmU6IE5hdGl2ZVJlcXVlc3RCdWlsZGVyRm4sXG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYW4gT3BlblJUQiBOYXRpdmUgMS4yIHJlcXVlc3Qgd2l0aCBpbml0aWFsIGZpZWxkcywgc3VjaCBhcyBzaXRlLCBhcHAsIGFuZCB0cmFja2Vyc1xuICAgICAqL1xuICAgIGRlZmF1bHROYXRpdmU6IE5hdGl2ZVJlcXVlc3RCdWlsZGVyRm4sXG5cbiAgICAvKiA9PT09PT09PT09IFByb2R1Y3QgRmVlZCA9PT09PT09PT09ICovXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNwb25zb3JlZCBwcm9kdWN0IGdlbmVyYXRvciBmcm9tIHRoZSBnaXZlbiBOYXRpdmUgQ3JlYXRpdmUgSUQuIE9uZSBuYXRpdmUgY3JlYXRpdmUgSUQgY2FuIGdlbmVyYXRlXG4gICAgICogbXVsdGlwbGUgcHJvZHVjdHNcbiAgICAgKi9cbiAgICBnZXRTcG9uc29yZWRQcm9kdWN0OiBHZXRTcG9uc29yZWRQcm9kdWN0RnJvbU5hdGl2ZUlkRm4sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBzcG9uc29yZWQgcHJvZHVjdHMgZnJvbSB0aGUgbmF0aXZlIGNyZWF0aXZlIElELiBPbmUgbmF0aXZlIGNyZWF0aXZlIElEIGNhbiBnZW5lcmF0ZSBtdWx0aXBsZSBwcm9kdWN0c1xuICAgICAqL1xuICAgIGdldEFsbFNwb25zb3JlZFByb2R1Y3RzOiBHZXRBbGxTcG9uc29yZWRQcm9kdWN0RnJvbU5hdGl2ZUlkRm4sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIHByb2R1Y3QgaW5mbyBmb3IgdGhlIHNpdGUgZnJvbSBhIHByb2R1Y3QgSURcbiAgICAgKi9cbiAgICBnZXRSZWNvbW1lbmRlZFByb2R1Y3Q6IEdldFJlY29tbWVuZGVkUHJvZHVjdEZyb21Qcm9kdWN0SWRGbixcblxuICAgIC8qID09PT09PT09PT0gUmVjb21tZW5kZXIgPT09PT09PT09PSAqL1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZWNvbW1lbmRlZCBwcm9kdWN0IGdlbmVyYXRvciBmb3IgdGhlIHRvcCAobW9zdCBwb3B1bGFyKSBwcm9kdWN0cyBvbiB0aGUgc2l0ZS5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVRvcFByb2R1Y3RzOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVjb21tZW5kZWQgcHJvZHVjdCBnZW5lcmF0b3IgZm9yIHByb2R1Y3RzIHJlY29tbWVuZGVkIGZvciB0aGUgdXNlci4gSWYgdGhlcmUgYXJlIG5vIHJlY29tbWVuZGVkXG4gICAgICogcHJvZHVjdHMgZm9yIHRoZSB1c2VyLCBvciBpZiB0aGUgQVBJIHdhcyBpbml0aWFsaXplZCB3aXRob3V0IGEgdXNlciBJRCwgdGhpcyB3aWxsIHJldHVybiBhIGdlbmVyYXRvciBmb3IgdG9wXG4gICAgICogcHJvZHVjdHMgaW5zdGVhZFxuICAgICAqL1xuICAgIGdlbmVyYXRlRm9yWW91OiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlY29tbWVuZGVkIHByb2R1Y3QgZ2VuZXJhdG9yIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcHJldmlvdXNseSBwdXJjaGFzZWQgcHJvZHVjdHMuIElmIHRoZXJlIGFyZSBub1xuICAgICAqIHJlY29tbWVuZGVkIHByb2R1Y3RzIGZvciB0aGUgdXNlciwgb3IgaWYgdGhlIEFQSSB3YXMgaW5pdGlhbGl6ZWQgd2l0aG91dCBhIHVzZXIgSUQsIHRoaXMgd2lsbCByZXR1cm4gYSBnZW5lcmF0b3JcbiAgICAgKiBmb3IgdG9wIHByb2R1Y3RzIGluc3RlYWRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG5cbiAgICAvKiA9PT09PT09PT09IFByb2R1Y3QgQ2FyZCBSZXNwb25zZSBoYW5kbGVycyA9PT09PT09PT09ICovXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNhcm91c2VsIHN0YXRlIG9iamVjdCB1c2luZyB0aGUgYmlkIHJlcXVlc3QuIFRoZSBzdGF0ZSBvYmplY3QgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBzZW5kcyB0aGVcbiAgICAgKiBiaWQgcmVxdWVzdCB0byB0aGUgYmlkZGVyIGFuZCBnZW5lcmF0ZXMgcHJvZHVjdCBjYXJkcyBmcm9tIGl0LiBXaGVuIHRoZSBiaWQgaXMgb3V0IG9mIHByb2R1Y3QgY2FyZHMsIHRoZVxuICAgICAqIGdlbmVyYXRvciB3aWxsIHJlcXVlc3QgbW9yZSBiaWRzIHdpdGggdGhlIHNhbWUgYmlkIHJlcXVlc3QuIElmIG5vIGJpZHMgYXJlIHJldHVybmVkLCB0aGUgZ2VuZXJhdG9yIGNvbXBsZXRlcy5cbiAgICAgKi9cbiAgICBidWlsZFNwb25zb3JlZENhcm91c2VsOiBCdWlsZFNwb25zb3JlZENhcm91c2VsRm4sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2Fyb3VzZWwgc3RhdGUgb2JqZWN0IHVzaW5nIHRoZSBiaWQgcmVxdWVzdCBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCBhIHByZS1leGlzdGluZyBiaWQuIFRoaXMgaXMgdXNlZFxuICAgICAqIGZvciBkeW5hbWljIHpvbmVzIGFuZCBwcm9iYWJseSBkb2Vzbid0IG5lZWQgdG8gYmUgdXNlZCBpbiBhbnkgY2xpZW50IGFwcGxpY2F0aW9ucy4gVGhlIHN0YXRlIG9iamVjdCBpcyBhIGNhbGxiYWNrXG4gICAgICogZnVuY3Rpb24gd2hpY2ggc2VuZHMgdGhlIGJpZCByZXF1ZXN0IHRvIHRoZSBiaWRkZXIgYW5kIGdlbmVyYXRlcyBwcm9kdWN0IGNhcmRzIGZyb20gaXQuIFdoZW4gdGhlIGJpZCBpcyBvdXQgb2ZcbiAgICAgKiBwcm9kdWN0IGNhcmRzLCB0aGUgZ2VuZXJhdG9yIHdpbGwgcmVxdWVzdCBtb3JlIGJpZHMgd2l0aCB0aGUgc2FtZSBiaWQgcmVxdWVzdC4gSWYgbm8gYmlkcyBhcmUgcmV0dXJuZWQsIHRoZVxuICAgICAqIGdlbmVyYXRvciBjb21wbGV0ZXMuXG4gICAgICovXG4gICAgYnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkOiBCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWRGbixcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjYXJvdXNlbCBzdGF0ZSBvYmplY3Qgd2l0aCByZWNvbW1lbmRhdGlvbnMgZnJvbSB0aGUgZ2l2ZW4gcmVjb21tZW5kZXIgdHlwZSAodG9wIHByb2R1Y3QsIGZvciB5b3UsXG4gICAgICogcHJldmlvdXMgcHVyY2hhc2VzKS4gVGhlIHN0YXRlIG9iamVjdCBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHNlbmRzIHRoZSBiaWQgcmVxdWVzdCB0byB0aGUgYmlkZGVyIGFuZFxuICAgICAqIGdlbmVyYXRlcyBwcm9kdWN0IGNhcmRzIGZyb20gaXQuIFdoZW4gdGhlIGJpZCBpcyBvdXQgb2YgcHJvZHVjdCBjYXJkcywgdGhlIGdlbmVyYXRvciB3aWxsIHJlcXVlc3QgbW9yZSBiaWRzIHdpdGhcbiAgICAgKiB0aGUgc2FtZSBiaWQgcmVxdWVzdC4gSWYgbm8gYmlkcyBhcmUgcmV0dXJuZWQsIHRoZSBnZW5lcmF0b3IgY29tcGxldGVzLlxuICAgICAqL1xuICAgIGJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbDogQnVpbGRSZWNvbW1lbmRlZENhcm91c2VsRm4sXG4gICAgYnVpbGRIeWJyaWRDYXJvdXNlbDogQnVpbGRIeWJyaWRDYXJvdXNlbEZuLFxuICAgIGJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZDogQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkRm4sXG4gICAgYnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlczogQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlc0ZuLFxuICAgIGdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm5cblxuICAgIC8qIFRlbXBsYXRlcyAqL1xuICAgIGV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZTogRXZhbHVhdGVQcm9kdWN0Q2FyZFRlbXBsYXRlRm4sXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuXG5cbiAgICAvKiBEeW5hbWljIHpvbmVzICovXG4gICAgZ2V0RHluYW1pY1pvbmU6IEdldER5bmFtaWNab25lRm4sXG4gICAgYnVpbGREeW5hbWljWm9uZVJlcXVlc3Q6IEJ1aWxkRHluYW1pY1pvbmVSZXF1ZXN0Rm5cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgQVBJIHdpdGggdGhlIHNlcnZpY2VzIGV4cGxpY2l0bHkgcGFzc2VkIHRvIGl0LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yayBmb3Igb3ZlcmxvYWRpbmdcbiAqIG1vY2sgc2VydmljZXMuIEl0IHNob3VsZCBub3QgYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvblxuICogQHBhcmFtIGludGVybmFsQXBpRHRvIFRoZSBsaXN0IG9mIHNlcnZpY2VzIGFuZCBoZWxwZXJzIHRvIGluamVjdFxuICogQHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgU3VyZnNpZGUgQVBJXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBJbml0U3VyZkFkc0NvcmVJbnRlcm5hbChpbnRlcm5hbEFwaUR0bzoge1xuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZXRDb25maWd1cmF0aW9uOiBHZXRDb25maWd1cmF0aW9uRm4sXG4gICAgZ2V0R2VvOiBHZXRHZW9GbixcbiAgICBnZXREZXZpY2U6IEdldERldmljZUZuLFxuICAgIGdldFNwb25zb3JlZFByb2R1Y3Q6IEdldFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIGdldFJlY29tbWVuZGVkUHJvZHVjdDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIGdlbmVyYXRlVG9wUHJvZHVjdHM6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBnZW5lcmF0ZUZvcllvdTogUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXM6IFBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBnZXREeW5hbWljWm9uZTogR2V0RHluYW1pY1pvbmVGbixcbiAgICBidWlsZEFsbFNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VzOiBCdWlsZEFsbFNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VzRm4sXG4gICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGU6IEV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZUZuLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICBoYW5kbGViYXJzOiB0eXBlb2YgSGFuZGxlYmFycyxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgIG5hdmlnYXRvcjogSU5hdmlnYXRvcixcbiAgICBtb2JpbGU6IGJvb2xlYW4sXG4gICAgaXA6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBnZW9Qcm92aWRlclRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICAgc2l0ZUlkOiBzdHJpbmcsXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25JZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG59KTogQXN5bmNSZXN1bHQ8SVN1cmZzaWRlQXBpPiB7XG4gICAgY29uc3Qge1xuICAgICAgICBnZXREZXZpY2UsIG1vYmlsZSxcbiAgICAgICAgbmF2aWdhdG9yLFxuICAgICAgICBpcCxcbiAgICAgICAgZ2V0R2VvLFxuICAgICAgICBnZW9Qcm92aWRlclRva2VuLFxuICAgICAgICBnZXRDb25maWd1cmF0aW9uLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZCxcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBjaGFubmVsSWQsXG4gICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgaGFuZGxlYmFycyxcbiAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgc2NyZWVuSW5mbyxcbiAgICAgICAgcmVxdWVzdEJpZHMsXG4gICAgICAgIGdldFNwb25zb3JlZFByb2R1Y3QsXG4gICAgICAgIGdldEFsbFNwb25zb3JlZFByb2R1Y3RzLFxuICAgICAgICBnZXRSZWNvbW1lbmRlZFByb2R1Y3QsXG4gICAgICAgIGdlbmVyYXRlVG9wUHJvZHVjdHMsXG4gICAgICAgIGdlbmVyYXRlRm9yWW91LFxuICAgICAgICBnZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzLFxuICAgICAgICBnZXREeW5hbWljWm9uZSxcbiAgICAgICAgYnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlcyxcbiAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGUsXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgfSA9IGludGVybmFsQXBpRHRvO1xuXG4gICAgY29uc3QgZGV2aWNlID0gZ2V0RGV2aWNlKHNjcmVlbkluZm8sIG5hdmlnYXRvciwgbW9iaWxlKTtcbiAgICBjb25zdCBnZW8gPSBhd2FpdCBnZXRHZW8oZ2VvUHJvdmlkZXJUb2tlbiwgaXApO1xuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGdldENvbmZpZ3VyYXRpb24oKTtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24ub2spIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvcihhY2NvdW50SWQsIHNpdGVJZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0UmVxdWVzdEJvdW5kID0gU3RhcnRSZXF1ZXN0LmJpbmQodW5kZWZpbmVkLFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgc2l0ZUlkLFxuICAgICAgICBjaGFubmVsSWQsXG4gICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgIEdldFZhbHVlKGRldmljZSksXG4gICAgICAgIEdldFZhbHVlKGdlbyksXG4gICAgICAgIHVzZXJJZFxuICAgICk7XG5cbiAgICBjb25zdCBzdGFydFJlcXVlc3QgPSAoem9uZUlkOiBzdHJpbmcsIGlkPzogc3RyaW5nKSA9PiBzdGFydFJlcXVlc3RCb3VuZCh6b25lSWQsIGlkKVxuICAgICAgICAud2l0aEFwcCh7XG4gICAgICAgICAgICBidW5kbGU6IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIG5hbWU6IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgICBkb21haW46IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIHB1Ymxpc2hlcjoge1xuICAgICAgICAgICAgICAgIGRvbWFpbjogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAud2l0aFNpdGUoe1xuICAgICAgICAgICAgbmFtZTogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgaWQ6IHNpdGVJZCxcbiAgICAgICAgICAgIGt3YXJyYXk6IFtdLFxuICAgICAgICAgICAgbW9iaWxlOiBpc01vYmlsZSgpID8gMSA6IDAsXG4gICAgICAgICAgICBwYWdlOiB3aW5kb3dJbmZvLmhyZWYsXG4gICAgICAgICAgICBkb21haW46IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIHB1Ymxpc2hlcjoge1xuICAgICAgICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgICAgIGRvbWFpbjogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZjogXCJcIixcbiAgICAgICAgICAgIHNlYXJjaDogd2luZG93SW5mby5zZWFyY2hcbiAgICAgICAgfSk7XG5cbiAgICBjb25zdCBzdGFydE5hdGl2ZSA9IFN0YXJ0TmF0aXZlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIpO1xuICAgIGNvbnN0IGRlZmF1bHROYXRpdmUgPSBEZWZhdWx0TmF0aXZlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIpO1xuXG4gICAgcmV0dXJuIE9rKHtcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBnZXREZXZpY2UsXG4gICAgICAgIGRldmljZTogR2V0VmFsdWUoZGV2aWNlKSxcbiAgICAgICAgZ2V0R2VvLFxuICAgICAgICBnZW86IEdldFZhbHVlKGdlbyksXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24udmFsdWUsXG4gICAgICAgIGdldENvbmZpZ3VyYXRpb24sXG4gICAgICAgIGhhbmRsZWJhcnMsXG4gICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICBzdGFydFJlcXVlc3QsXG4gICAgICAgIHN0YXJ0TmF0aXZlLFxuICAgICAgICBkZWZhdWx0TmF0aXZlLFxuICAgICAgICBnZXRTcG9uc29yZWRQcm9kdWN0LFxuICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgZ2V0UmVjb21tZW5kZWRQcm9kdWN0LFxuICAgICAgICBnZW5lcmF0ZVRvcFByb2R1Y3RzLFxuICAgICAgICBnZW5lcmF0ZUZvcllvdSxcbiAgICAgICAgZ2VuZXJhdGVQcmV2aW91c1B1cmNoYXNlcyxcbiAgICAgICAgYnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlcyxcbiAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGUsXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIGJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWw6IEJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWwuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlXG4gICAgICAgICksXG4gICAgICAgIGJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZDogQnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgIGdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZVxuICAgICAgICApLFxuICAgICAgICBidWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWQ6IEJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgZ2VuZXJhdGVUb3BQcm9kdWN0cyxcbiAgICAgICAgICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMsXG4gICAgICAgICAgICBnZW5lcmF0ZUZvcllvdSxcbiAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICApLFxuICAgICAgICBidWlsZFJlY29tbWVuZGVkQ2Fyb3VzZWw6IEJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIGdlbmVyYXRlVG9wUHJvZHVjdHMsXG4gICAgICAgICAgICBnZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzLFxuICAgICAgICAgICAgZ2VuZXJhdGVGb3JZb3UsXG4gICAgICAgICAgICB1c2VySWRcbiAgICAgICAgKSxcbiAgICAgICAgYnVpbGRIeWJyaWRDYXJvdXNlbDogQnVpbGRIeWJyaWRDYXJvdXNlbC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgZ2VuZXJhdGVUb3BQcm9kdWN0cyxcbiAgICAgICAgICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMsXG4gICAgICAgICAgICBnZW5lcmF0ZUZvcllvdSxcbiAgICAgICAgICAgIHVzZXJJZFxuXG4gICAgICAgICksXG4gICAgICAgIGdldER5bmFtaWNab25lLFxuICAgICAgICBidWlsZER5bmFtaWNab25lUmVxdWVzdDogQnVpbGREeW5hbWljWm9uZVJlcXVlc3QuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHN0YXJ0UmVxdWVzdCxcbiAgICAgICAgICAgIGRlZmF1bHROYXRpdmUsXG4gICAgICAgICAgICBzY3JlZW5JbmZvXG4gICAgICAgIClcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IEluaXRTdXJmQWRzQ29yZVNlcnZpY2VzID0gYXN5bmMgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBiaWRkZXJTZXJ2aWNlVXJsOiBzdHJpbmcsXG4gICAgY29uZmlndXJhdGlvblNlcnZpY2VVcmw6IHN0cmluZyxcbiAgICBwcm9kdWN0RmVlZFVybDogc3RyaW5nLFxuICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWRVcmw6IHN0cmluZyxcbiAgICByZWNvbW1lbmRlclNlcnZpY2VVcmw6IHN0cmluZyxcbiAgICBkeW5hbWljWm9uZVNlcnZpY2VVcmw6IHN0cmluZyxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgIG5hdmlnYXRvcjogSU5hdmlnYXRvcixcbiAgICBtb2JpbGU6IGJvb2xlYW4sXG4gICAgaXA6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBnZW9Qcm92aWRlclRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICAgc2l0ZUlkOiBzdHJpbmcsXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25JZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogQXN5bmNSZXN1bHQ8SVN1cmZzaWRlQXBpPiA9PiB7XG4gICAgY29uc3QgaGFuZGxlYmFycyA9IEhhbmRsZWJhcnMuY3JlYXRlKCk7XG4gICAgY29uc3QgaGVscGVycyA9IEdldEhlbHBlcnMoKTtcbiAgICBjb25zdCByZWNvbW1lbmRlZFByb2R1Y3RGZWVkID0gR2V0UmVjb21tZW5kZWRQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWRVcmwsXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgbG9jYXRpb25JZFxuICAgICk7XG4gICAgY29uc3QgY29uZmlndXJhdGlvblNlcnZpY2UgPSBHZXRDb25maWd1cmF0aW9uLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgIGNvbmZpZ3VyYXRpb25TZXJ2aWNlVXJsLFxuICAgICAgICBoYW5kbGViYXJzLFxuICAgICAgICBoZWxwZXJzLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZFxuICAgICk7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGNvbmZpZ3VyYXRpb25TZXJ2aWNlKCk7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uLm9rKSB7XG4gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IGdldEFsbFNwb25zb3JlZFByb2R1Y3RzID0gR2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgcHJvZHVjdEZlZWRVcmwsIGFjY291bnRJZCwgbG9jYXRpb25JZCk7XG4gICAgY29uc3QgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlID0gR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgIGdldEFsbFNwb25zb3JlZFByb2R1Y3RzLFxuICAgICAgICB3aW5kb3dJbmZvLFxuICAgICAgICBjb25maWd1cmF0aW9uLnZhbHVlXG4gICAgKTtcblxuICAgIGNvbnN0IGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUgPSBFdmFsdWF0ZUhhbmRsZWJhcnNDbGlja3Rocm91Z2hUZW1wbGF0ZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICB3aW5kb3dJbmZvLFxuICAgICAgICBjb25maWd1cmF0aW9uLnZhbHVlXG4gICAgKTtcblxuICAgIGNvbnN0IGV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZSA9IEV2YWx1YXRlSGFuZGxlYmFyc1Byb2R1Y3RDYXJkVGVtcGxhdGUuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgY29uZmlndXJhdGlvbi52YWx1ZVxuICAgICk7XG5cbiAgICByZXR1cm4gYXdhaXQgSW5pdFN1cmZBZHNDb3JlSW50ZXJuYWwoe1xuICAgICAgICBsb2dnZXIsXG4gICAgICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkcy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgYmlkZGVyU2VydmljZVVybCxcbiAgICAgICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgICAgIHNpdGVJZCxcbiAgICAgICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgICAgICBjaGFubmVsSWRcbiAgICAgICAgKSxcbiAgICAgICAgZ2V0Q29uZmlndXJhdGlvbjogY29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgIGdldEdlbzogR2V0R2VvLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIpLFxuICAgICAgICBnZXREZXZpY2U6IEdldERldmljZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyKSxcbiAgICAgICAgZ2V0U3BvbnNvcmVkUHJvZHVjdDogR2V0U3BvbnNvcmVkUHJvZHVjdC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBwcm9kdWN0RmVlZFVybCwgYWNjb3VudElkLCBsb2NhdGlvbklkKSxcbiAgICAgICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMsXG4gICAgICAgIGdldFJlY29tbWVuZGVkUHJvZHVjdDogR2V0UmVjb21tZW5kZWRQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgICAgICByZWNvbW1lbmRlZFByb2R1Y3RGZWVkVXJsLFxuICAgICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgICAgbG9jYXRpb25JZFxuICAgICAgICApLFxuICAgICAgICBnZW5lcmF0ZVRvcFByb2R1Y3RzOiBHZW5lcmF0ZVRvcFByb2R1Y3RzLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgICAgICByZWNvbW1lbmRlZFByb2R1Y3RGZWVkLFxuICAgICAgICAgICAgcmVjb21tZW5kZXJTZXJ2aWNlVXJsLFxuICAgICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgICAgc2l0ZUlkLFxuICAgICAgICAgICAgbG9jYXRpb25JZFxuICAgICAgICApLFxuICAgICAgICBnZW5lcmF0ZUZvcllvdTogR2VuZXJhdGVGb3JZb3UuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWQsXG4gICAgICAgICAgICByZWNvbW1lbmRlclNlcnZpY2VVcmwsXG4gICAgICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgICAgICBzaXRlSWQsXG4gICAgICAgICAgICBsb2NhdGlvbklkLFxuICAgICAgICAgICAgdXNlcklkID8/ICd1bmRlZmluZWQnXG4gICAgICAgICksXG4gICAgICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXM6IEdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWQsXG4gICAgICAgICAgICByZWNvbW1lbmRlclNlcnZpY2VVcmwsXG4gICAgICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgICAgICBzaXRlSWQsXG4gICAgICAgICAgICBsb2NhdGlvbklkLFxuICAgICAgICAgICAgdXNlcklkID8/ICd1bmRlZmluZWQnXG4gICAgICAgICksXG4gICAgICAgIGJ1aWxkQWxsU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZXM6IEJ1aWxkQWxsU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZXMuYmluZCh1bmRlZmluZWQsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLnZhbHVlXG4gICAgICAgICksXG4gICAgICAgIGdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZTogZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGUsXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIGhhbmRsZWJhcnMsXG4gICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgIHNjcmVlbkluZm8sXG4gICAgICAgIG5hdmlnYXRvcixcbiAgICAgICAgbW9iaWxlLFxuICAgICAgICBpcCxcbiAgICAgICAgZ2VvUHJvdmlkZXJUb2tlbixcbiAgICAgICAgYWNjb3VudElkLFxuICAgICAgICBzaXRlSWQsXG4gICAgICAgIGNoYW5uZWxJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBnZXREeW5hbWljWm9uZTogR2V0RHluYW1pY1pvbmUuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgY29uZmlndXJhdGlvbi52YWx1ZSlcbiAgICB9KTtcbn07XG5cbi8qIEZvciB1c2UgaW4gc2VydmVyc2lkZSByZW5kZXJpbmcgKi9cbi8vIFRPRE86IFJlbmFtZSB0aGlzP1xuZXhwb3J0IGNvbnN0IEluaXRTdXJmQWRzQ29yZVNTUiA9IGFzeW5jIChcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBzY3JlZW46IElTY3JlZW4sXG4gICAgbmF2aWdhdG9yOiBJTmF2aWdhdG9yLFxuICAgIG1vYmlsZTogYm9vbGVhbixcbiAgICBpcDogc3RyaW5nLFxuICAgIGdlb1Byb3ZpZGVyVG9rZW46IHN0cmluZyxcbiAgICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgICBzaXRlSWQ6IHN0cmluZyxcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICBsb2NhdGlvbklkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgbG9nZ2VyPzogSUxvZ2dlcixcbik6IEFzeW5jUmVzdWx0PElTdXJmc2lkZUFwaT4gPT4gSW5pdFN1cmZBZHNDb3JlU2VydmljZXMoXG4gICAgbG9nZ2VyLFxuICAgIFRMUyhQUk9EX0JJRERFUiksXG4gICAgVExTKFBST0RfQ09ORklHVVJBVElPTl9TRVJWSUNFKSxcbiAgICBUTFMoUFJPRF9TUE9OU09SRURfUFJPRFVDVF9GRUVEKSxcbiAgICBUTFMoUFJPRF9SRUNPTU1FTkRFRF9QUk9EVUNUX0ZFRUQpLFxuICAgIFRMUyhQUk9EX1JFQ09NTUVOREVSX1NFUlZJQ0UpLFxuICAgIFRMUyhQUk9EX0RZTkFNSUNfWk9ORV9TRVJWSUNFKSxcbiAgICB3aW5kb3dJbmZvLFxuICAgIHNjcmVlbixcbiAgICBuYXZpZ2F0b3IsXG4gICAgbW9iaWxlLFxuICAgIGlwLFxuICAgIGdlb1Byb3ZpZGVyVG9rZW4sXG4gICAgYWNjb3VudElkLFxuICAgIHNpdGVJZCxcbiAgICBjaGFubmVsSWQsXG4gICAgbG9jYXRpb25JZCxcbiAgICB1c2VySWRcbik7XG5cbi8qIEZvciB1c2UgaW4gd2ViIGJyb3dzZXJzICovXG5leHBvcnQgY29uc3QgSW5pdFN1cmZBZHNDb3JlID0gYXN5bmMgKFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBsb2dnZXI/OiBJTG9nZ2VyXG4pOiBBc3luY1Jlc3VsdDxJU3VyZnNpZGVBcGk+ID0+IHtcbiAgICAvKiBOb3QgaW4gYSBicm93c2VyICovXG4gICAgY29uc3Qgd2luZG93SW5mbyA9IEdldFdpbmRvd0luZm8oKTtcbiAgICBpZighd2luZG93SW5mby5vaykge1xuICAgICAgICByZXR1cm4gd2luZG93SW5mbztcbiAgICB9XG4gICAgcmV0dXJuIEluaXRTdXJmQWRzQ29yZVNlcnZpY2VzKFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIFRMUyhQUk9EX0JJRERFUiksXG4gICAgICAgIFRMUyhQUk9EX0NPTkZJR1VSQVRJT05fU0VSVklDRSksXG4gICAgICAgIFRMUyhQUk9EX1NQT05TT1JFRF9QUk9EVUNUX0ZFRUQpLFxuICAgICAgICBUTFMoUFJPRF9SRUNPTU1FTkRFRF9QUk9EVUNUX0ZFRUQpLFxuICAgICAgICBUTFMoUFJPRF9SRUNPTU1FTkRFUl9TRVJWSUNFKSxcbiAgICAgICAgVExTKFBST0RfRFlOQU1JQ19aT05FX1NFUlZJQ0UpLFxuICAgICAgICB3aW5kb3dJbmZvLnZhbHVlLFxuICAgICAgICB3aW5kb3cuc2NyZWVuLFxuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLFxuICAgICAgICBpc01vYmlsZSgpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYWNjb3VudElkLFxuICAgICAgICBzaXRlSWQsXG4gICAgICAgIGNoYW5uZWxJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdXNlcklkXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGFjY291bnRJZDogc3RyaW5nLCBzaXRlSWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgICdNaXNzaW5nIGNvbmZpZ3VyYXRpb24gZm9yXFxuJyArXG4gICAgICAgICAgICBgICAgIGFjY291bnRJZDogJHthY2NvdW50SWR9XFxuYCArXG4gICAgICAgICAgICBgICAgIHNpdGVJZDogJHtzaXRlSWR9XFxuYCArXG4gICAgICAgICAgICAnMS4gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlc2UgYXJlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgZWFjaCBmaWVsZCcgK1xuICAgICAgICAgICAgJzIuIENoZWNrIHlvdXIgcHVibGlzaGVyIGNvbmZpZ3VyYXRpb24gYXQgJyArXG4gICAgICAgICAgICBgaHR0cHM6Ly9hcHAuc3VyZnNpZGUuaW8vaW52ZW50b3J5L3NpdGVzL3B1Ymxpc2hlci8ke2FjY291bnRJZH0vJHtzaXRlSWR9YFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBOb3RBQnJvd3NlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgICdZb3UgYXJlIG5vdCBydW5uaW5nIFN1cmZzaWRlIEFkcyBDb3JlIGluIGEgV2ViIGJyb3dzZXIsIHNvIHlvdSBjYW5ub3QgdXNlIFwiSW5pdFN1cmZBZHNDb3JlXCIuICcgK1xuICAgICAgICAgICAgJ0luc3RlYWQsIHVzZSBJbml0U3VyZkFkc0NvcmVTU1IsIGFuZCBwYXNzIHRoZSB1c2VyXFwncyBzY3JlZW4sIG5hdmlnYXRvciwgYW5kIElQIGFkZHJlc3MgZXhwbGljaXRseSAnICtcbiAgICAgICAgICAgICdzbyB0aGF0IFN1cmZzaWRlIEFkcyBDb3JlIGNhbiBpbml0aWFsaXplIGdlbyBhbmQgZGV2aWNlIGluZm9ybWF0aW9uIHNlcnZpY2VzLiBlLmc6IFxcbicgK1xuICAgICAgICAgICAgJyAgICBJbml0U3VyZkFkc0NvcmVTU1IoXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB1c2VyXFwncyBzY3JlZW46ICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgeyB3aWR0aDogc2NyZWVuV2lkdGgsIGhlaWdodDogc2NyZWVuSGVpZ2h0IH0sXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiB1c2VyQWdlbnQgc3RyaW5nIGFuZCBsYW5ndWFnZSBvZiB0aGUgdXNlcjogKi9cXG4nICtcbiAgICAgICAgICAgICcgICAgICB7IHVzZXJBZ2VudDogdXNlckFnZW50LCBsYW5ndWFnZTogdXNlckxhbmd1YWdlIH0sXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiB3aGV0aGVyIHRoZSB1c2VyIGlzIG9uIG1vYmlsZSBvciBub3Q6ICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgdHJ1ZSxcXG4nICtcbiAgICAgICAgICAgICcgICAgICAgIC8qIHRoZSByZXF1ZXN0aW5nIFVzZXJcXCdzIElQICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgcmVxdWVzdC5pcEFkZHJlc3MsXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiBZb3VyIEFQSSBUb2tlbiBmb3IgdGhlIFN1cmZzaWRlIEdlbyBTZXJ2aWNlOiAqL1xcbicgK1xuICAgICAgICAgICAgJyAgICAgIGdlb1Byb3ZpZGVyVG9rZW4sXFxuJyArXG4gICAgICAgICAgICAnICAgICAgYWNjb3VudElkLFxcbicgK1xuICAgICAgICAgICAgJyAgICAgIHNpdGVJZCxcXG4nICtcbiAgICAgICAgICAgICcgICAgICBjaGFubmVsSWQsXFxuJyArXG4gICAgICAgICAgICAnICAgICAgbG9jYXRpb25JZCxcXG4nICtcbiAgICAgICAgICAgICcgICAgICB1c2VySWQsXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiBPcHRpb25hbCBsb2dnZXI6ICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgbG9nZ2VyXFxuJyArXG4gICAgICAgICAgICAnICAgICknXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5jb25zdCBpc01vYmlsZSA9ICgpID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdy5vbnRvdWNoc3RhcnQgIT09IHVuZGVmaW5lZCkgOiBmYWxzZTtcbiIsCiAgICAiaW1wb3J0IHsgTm90QUJyb3dzZXJFcnJvciB9IGZyb20gJy4uL0FwaSc7XG5pbXBvcnQgeyBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbmV4cG9ydCBjb25zdCBHZXRXaW5kb3dJbmZvID0gKCk6IFJlc3VsdDxJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdz4gPT4ge1xuICAgIGlmKCh0eXBlb2Ygd2luZG93KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTm90QUJyb3dzZXJFcnJvcigpKTtcbiAgICB9O1xuICAgIHJldHVybiBPayh7XG4gICAgICAgIGhyZWY6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgICBvcmlnaW46IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sXG4gICAgICAgIHBvcnQ6IHdpbmRvdy5sb2NhdGlvbi5wb3J0LFxuICAgICAgICBwYXRoOiAnLycgKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIocGFydCA9PiBwYXJ0Lmxlbmd0aCA+IDApLmpvaW4oJy8nKSxcbiAgICAgICAgaG9zdDogd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgIGhvc3RfbmFtZTogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgICBzZWFyY2g6IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsXG4gICAgICAgIGhhc2g6IHdpbmRvdy5sb2NhdGlvbi5oYXNoLFxuICAgICAgICBwcm90b2NvbDogd2luZG93LmxvY2F0aW9uLnByb3RvY29sXG4gICAgfSk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUVRLHFCQUFhO0FBQUEsRUFDYixpQkFBUztBQUFBLEVBQ1Qsa0JBQVU7QUFBQSxFQUNWLDJCQUFtQjtBQUFBLEVBQ25CLGtCQUFVO0FBQUEsRUFDVixzQkFBYztBQUFBLEVBQ2Qsc0JBQWM7QUFBQSxFQUNkLDRCQUFvQjtBQUFBLEVBQzVCLElBQUksU0FBUztBQUFBLElBQ1gsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUVBLElBQUksV0FBVztBQUFBLEVBQWYs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
|
|
1
|
+
export * from './helpers';
|
|
2
|
+
export * from './models';
|
|
3
|
+
export * from './services';
|
|
4
|
+
export * from './Api';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|