1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | var _exportNames = {
|
7 | invertBase16Theme: true,
|
8 | createStyling: true,
|
9 | getBase16Theme: true,
|
10 | invertTheme: true,
|
11 | Base16Theme: true
|
12 | };
|
13 | Object.defineProperty(exports, "Base16Theme", {
|
14 | enumerable: true,
|
15 | get: function get() {
|
16 | return base16.Base16Theme;
|
17 | }
|
18 | });
|
19 | exports.invertTheme = exports.invertBase16Theme = exports.getBase16Theme = exports.createStyling = void 0;
|
20 |
|
21 | var base16 = _interopRequireWildcard(require("base16"));
|
22 |
|
23 | var _color = _interopRequireDefault(require("color"));
|
24 |
|
25 | var _lodash = _interopRequireDefault(require("lodash.curry"));
|
26 |
|
27 | var _colorConverters = require("./colorConverters");
|
28 |
|
29 | var _types = require("./types");
|
30 |
|
31 | Object.keys(_types).forEach(function (key) {
|
32 | if (key === "default" || key === "__esModule") return;
|
33 | if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
34 | if (key in exports && exports[key] === _types[key]) return;
|
35 | Object.defineProperty(exports, key, {
|
36 | enumerable: true,
|
37 | get: function get() {
|
38 | return _types[key];
|
39 | }
|
40 | });
|
41 | });
|
42 |
|
43 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
44 |
|
45 | function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
46 |
|
47 | function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
48 |
|
49 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
50 |
|
51 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
52 |
|
53 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
54 |
|
55 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
56 |
|
57 | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
58 |
|
59 | function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
60 |
|
61 | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
62 |
|
63 | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
64 |
|
65 | function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
66 |
|
67 | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
68 |
|
69 | var DEFAULT_BASE16 = base16["default"];
|
70 | var BASE16_KEYS = Object.keys(DEFAULT_BASE16); // we need a correcting factor, so that a dark, but not black background color
|
71 | // converts to bright enough inversed color
|
72 |
|
73 | var flip = function flip(x) {
|
74 | return x < 0.25 ? 1 : x < 0.5 ? 0.9 - x : 1.1 - x;
|
75 | };
|
76 |
|
77 | var invertColor = function invertColor(hexString) {
|
78 | var color = (0, _color["default"])(hexString);
|
79 |
|
80 | var _rgb2yuv = (0, _colorConverters.rgb2yuv)(color.array()),
|
81 | _rgb2yuv2 = _slicedToArray(_rgb2yuv, 3),
|
82 | y = _rgb2yuv2[0],
|
83 | u = _rgb2yuv2[1],
|
84 | v = _rgb2yuv2[2];
|
85 |
|
86 | var flippedYuv = [flip(y), u, v];
|
87 | var rgb = (0, _colorConverters.yuv2rgb)(flippedYuv);
|
88 | return _color["default"].rgb(rgb).hex();
|
89 | };
|
90 |
|
91 | var merger = function merger(styling) {
|
92 | return function (prevStyling) {
|
93 | return {
|
94 | className: [prevStyling.className, styling.className].filter(Boolean).join(' '),
|
95 | style: _objectSpread(_objectSpread({}, prevStyling.style || {}), styling.style || {})
|
96 | };
|
97 | };
|
98 | };
|
99 |
|
100 | var mergeStyling = function mergeStyling(customStyling, defaultStyling) {
|
101 | if (customStyling === undefined) {
|
102 | return defaultStyling;
|
103 | }
|
104 |
|
105 | if (defaultStyling === undefined) {
|
106 | return customStyling;
|
107 | }
|
108 |
|
109 | var customType = _typeof(customStyling);
|
110 |
|
111 | var defaultType = _typeof(defaultStyling);
|
112 |
|
113 | switch (customType) {
|
114 | case 'string':
|
115 | switch (defaultType) {
|
116 | case 'string':
|
117 | return [defaultStyling, customStyling].filter(Boolean).join(' ');
|
118 |
|
119 | case 'object':
|
120 | return merger({
|
121 | className: customStyling,
|
122 | style: defaultStyling
|
123 | });
|
124 |
|
125 | case 'function':
|
126 | return function (styling) {
|
127 | for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
128 | args[_key - 1] = arguments[_key];
|
129 | }
|
130 |
|
131 | return merger({
|
132 | className: customStyling
|
133 | })(defaultStyling.apply(void 0, [styling].concat(args)));
|
134 | };
|
135 | }
|
136 |
|
137 | break;
|
138 |
|
139 | case 'object':
|
140 | switch (defaultType) {
|
141 | case 'string':
|
142 | return merger({
|
143 | className: defaultStyling,
|
144 | style: customStyling
|
145 | });
|
146 |
|
147 | case 'object':
|
148 | return _objectSpread(_objectSpread({}, defaultStyling), customStyling);
|
149 |
|
150 | case 'function':
|
151 | return function (styling) {
|
152 | for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
153 | args[_key2 - 1] = arguments[_key2];
|
154 | }
|
155 |
|
156 | return merger({
|
157 | style: customStyling
|
158 | })(defaultStyling.apply(void 0, [styling].concat(args)));
|
159 | };
|
160 | }
|
161 |
|
162 | break;
|
163 |
|
164 | case 'function':
|
165 | switch (defaultType) {
|
166 | case 'string':
|
167 | return function (styling) {
|
168 | for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
169 | args[_key3 - 1] = arguments[_key3];
|
170 | }
|
171 |
|
172 | return customStyling.apply(void 0, [merger(styling)({
|
173 | className: defaultStyling
|
174 | })].concat(args));
|
175 | };
|
176 |
|
177 | case 'object':
|
178 | return function (styling) {
|
179 | for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
|
180 | args[_key4 - 1] = arguments[_key4];
|
181 | }
|
182 |
|
183 | return customStyling.apply(void 0, [merger(styling)({
|
184 | style: defaultStyling
|
185 | })].concat(args));
|
186 | };
|
187 |
|
188 | case 'function':
|
189 | return function (styling) {
|
190 | for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
|
191 | args[_key5 - 1] = arguments[_key5];
|
192 | }
|
193 |
|
194 | return customStyling.apply(void 0, [defaultStyling.apply(void 0, [styling].concat(args))].concat(args));
|
195 | };
|
196 | }
|
197 |
|
198 | }
|
199 | };
|
200 |
|
201 | var mergeStylings = function mergeStylings(customStylings, defaultStylings) {
|
202 | var keys = Object.keys(defaultStylings);
|
203 |
|
204 | for (var key in customStylings) {
|
205 | if (keys.indexOf(key) === -1) keys.push(key);
|
206 | }
|
207 |
|
208 | return keys.reduce(function (mergedStyling, key) {
|
209 | return mergedStyling[key] = mergeStyling(customStylings[key], defaultStylings[key]), mergedStyling;
|
210 | }, {});
|
211 | };
|
212 |
|
213 | var getStylingByKeys = function getStylingByKeys(mergedStyling, keys) {
|
214 | for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {
|
215 | args[_key6 - 2] = arguments[_key6];
|
216 | }
|
217 |
|
218 | if (keys === null) {
|
219 | return mergedStyling;
|
220 | }
|
221 |
|
222 | if (!Array.isArray(keys)) {
|
223 | keys = [keys];
|
224 | }
|
225 |
|
226 | var styles = keys.map(function (key) {
|
227 | return mergedStyling[key];
|
228 | }).filter(Boolean);
|
229 | var props = styles.reduce(function (obj, s) {
|
230 | if (typeof s === 'string') {
|
231 | obj.className = [obj.className, s].filter(Boolean).join(' ');
|
232 | } else if (_typeof(s) === 'object') {
|
233 | obj.style = _objectSpread(_objectSpread({}, obj.style), s);
|
234 | } else if (typeof s === 'function') {
|
235 | obj = _objectSpread(_objectSpread({}, obj), s.apply(void 0, [obj].concat(args)));
|
236 | }
|
237 |
|
238 | return obj;
|
239 | }, {
|
240 | className: '',
|
241 | style: {}
|
242 | });
|
243 |
|
244 | if (!props.className) {
|
245 | delete props.className;
|
246 | }
|
247 |
|
248 | if (Object.keys(props.style).length === 0) {
|
249 | delete props.style;
|
250 | }
|
251 |
|
252 | return props;
|
253 | };
|
254 |
|
255 | var invertBase16Theme = function invertBase16Theme(base16Theme) {
|
256 | return Object.keys(base16Theme).reduce(function (t, key) {
|
257 | return t[key] = /^base/.test(key) ? invertColor(base16Theme[key]) : key === 'scheme' ? base16Theme[key] + ':inverted' : base16Theme[key], t;
|
258 | }, {});
|
259 | };
|
260 |
|
261 | exports.invertBase16Theme = invertBase16Theme;
|
262 | var createStyling = (0, _lodash["default"])(function (getStylingFromBase16) {
|
263 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
264 | var themeOrStyling = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
265 | var _options$defaultBase = options.defaultBase16,
|
266 | defaultBase16 = _options$defaultBase === void 0 ? DEFAULT_BASE16 : _options$defaultBase,
|
267 | _options$base16Themes = options.base16Themes,
|
268 | base16Themes = _options$base16Themes === void 0 ? null : _options$base16Themes;
|
269 | var base16Theme = getBase16Theme(themeOrStyling, base16Themes);
|
270 |
|
271 | if (base16Theme) {
|
272 | themeOrStyling = _objectSpread(_objectSpread({}, base16Theme), themeOrStyling);
|
273 | }
|
274 |
|
275 | var theme = BASE16_KEYS.reduce(function (t, key) {
|
276 | return t[key] = themeOrStyling[key] || defaultBase16[key], t;
|
277 | }, {});
|
278 | var customStyling = Object.keys(themeOrStyling).reduce(function (s, key) {
|
279 | return BASE16_KEYS.indexOf(key) === -1 ? (s[key] = themeOrStyling[key], s) : s;
|
280 | }, {});
|
281 | var defaultStyling = getStylingFromBase16(theme);
|
282 | var mergedStyling = mergeStylings(customStyling, defaultStyling);
|
283 |
|
284 | for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) {
|
285 | args[_key7 - 3] = arguments[_key7];
|
286 | }
|
287 |
|
288 | return (0, _lodash["default"])(getStylingByKeys, 2).apply(void 0, [mergedStyling].concat(args));
|
289 | }, 3);
|
290 | exports.createStyling = createStyling;
|
291 |
|
292 | var isStylingConfig = function isStylingConfig(theme) {
|
293 | return !!theme.extend;
|
294 | };
|
295 |
|
296 | var getBase16Theme = function getBase16Theme(theme, base16Themes) {
|
297 | if (theme && isStylingConfig(theme) && theme.extend) {
|
298 | theme = theme.extend;
|
299 | }
|
300 |
|
301 | if (typeof theme === 'string') {
|
302 | var _theme$split = theme.split(':'),
|
303 | _theme$split2 = _slicedToArray(_theme$split, 2),
|
304 | _themeName = _theme$split2[0],
|
305 | modifier = _theme$split2[1];
|
306 |
|
307 | if (base16Themes) {
|
308 | theme = base16Themes[_themeName];
|
309 | } else {
|
310 | theme = base16[_themeName];
|
311 | }
|
312 |
|
313 | if (modifier === 'inverted') {
|
314 | theme = invertBase16Theme(theme);
|
315 | }
|
316 | }
|
317 |
|
318 | return theme && Object.prototype.hasOwnProperty.call(theme, 'base00') ? theme : undefined;
|
319 | };
|
320 |
|
321 | exports.getBase16Theme = getBase16Theme;
|
322 |
|
323 | var invertTheme = function invertTheme(theme) {
|
324 | if (typeof theme === 'string') {
|
325 | return "".concat(theme, ":inverted");
|
326 | }
|
327 |
|
328 | if (theme && isStylingConfig(theme) && theme.extend) {
|
329 | if (typeof theme.extend === 'string') {
|
330 | return _objectSpread(_objectSpread({}, theme), {}, {
|
331 | extend: "".concat(theme.extend, ":inverted")
|
332 | });
|
333 | }
|
334 |
|
335 | return _objectSpread(_objectSpread({}, theme), {}, {
|
336 | extend: invertBase16Theme(theme.extend)
|
337 | });
|
338 | }
|
339 |
|
340 | if (theme) {
|
341 | return invertBase16Theme(theme);
|
342 | }
|
343 |
|
344 | return theme;
|
345 | };
|
346 |
|
347 | exports.invertTheme = invertTheme;
|
348 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0JBU0UxNiIsImJhc2UxNiIsIkJBU0UxNl9LRVlTIiwiT2JqZWN0Iiwia2V5cyIsImZsaXAiLCJ4IiwiaW52ZXJ0Q29sb3IiLCJoZXhTdHJpbmciLCJjb2xvciIsImFycmF5IiwieSIsInUiLCJ2IiwiZmxpcHBlZFl1diIsInJnYiIsIkNvbG9yIiwiaGV4IiwibWVyZ2VyIiwic3R5bGluZyIsInByZXZTdHlsaW5nIiwiY2xhc3NOYW1lIiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJzdHlsZSIsIm1lcmdlU3R5bGluZyIsImN1c3RvbVN0eWxpbmciLCJkZWZhdWx0U3R5bGluZyIsInVuZGVmaW5lZCIsImN1c3RvbVR5cGUiLCJkZWZhdWx0VHlwZSIsImFyZ3MiLCJtZXJnZVN0eWxpbmdzIiwiY3VzdG9tU3R5bGluZ3MiLCJkZWZhdWx0U3R5bGluZ3MiLCJrZXkiLCJpbmRleE9mIiwicHVzaCIsInJlZHVjZSIsIm1lcmdlZFN0eWxpbmciLCJnZXRTdHlsaW5nQnlLZXlzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3R5bGVzIiwibWFwIiwicHJvcHMiLCJvYmoiLCJzIiwibGVuZ3RoIiwiaW52ZXJ0QmFzZTE2VGhlbWUiLCJiYXNlMTZUaGVtZSIsInQiLCJ0ZXN0IiwiY3JlYXRlU3R5bGluZyIsImdldFN0eWxpbmdGcm9tQmFzZTE2Iiwib3B0aW9ucyIsInRoZW1lT3JTdHlsaW5nIiwiZGVmYXVsdEJhc2UxNiIsImJhc2UxNlRoZW1lcyIsImdldEJhc2UxNlRoZW1lIiwidGhlbWUiLCJpc1N0eWxpbmdDb25maWciLCJleHRlbmQiLCJzcGxpdCIsInRoZW1lTmFtZSIsIm1vZGlmaWVyIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaW52ZXJ0VGhlbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBMlNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFqU0EsSUFBTUEsY0FBYyxHQUFHQyxNQUFNLFdBQTdCO0FBRUEsSUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWUosY0FBWixDQUFwQixDLENBRUE7QUFDQTs7QUFDQSxJQUFNSyxJQUFJLEdBQUcsU0FBUEEsSUFBTyxDQUFDQyxDQUFEO0FBQUEsU0FBZ0JBLENBQUMsR0FBRyxJQUFKLEdBQVcsQ0FBWCxHQUFlQSxDQUFDLEdBQUcsR0FBSixHQUFVLE1BQU1BLENBQWhCLEdBQW9CLE1BQU1BLENBQXpEO0FBQUEsQ0FBYjs7QUFFQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDQyxTQUFELEVBQXVCO0FBQ3pDLE1BQU1DLEtBQUssR0FBRyx1QkFBTUQsU0FBTixDQUFkOztBQUNBLGlCQUFrQiw4QkFBUUMsS0FBSyxDQUFDQyxLQUFOLEVBQVIsQ0FBbEI7QUFBQTtBQUFBLE1BQU9DLENBQVA7QUFBQSxNQUFVQyxDQUFWO0FBQUEsTUFBYUMsQ0FBYjs7QUFDQSxNQUFNQyxVQUFzQixHQUFHLENBQUNULElBQUksQ0FBQ00sQ0FBRCxDQUFMLEVBQVVDLENBQVYsRUFBYUMsQ0FBYixDQUEvQjtBQUNBLE1BQU1FLEdBQUcsR0FBRyw4QkFBUUQsVUFBUixDQUFaO0FBQ0EsU0FBT0Usa0JBQU1ELEdBQU4sQ0FBVUEsR0FBVixFQUFlRSxHQUFmLEVBQVA7QUFDRCxDQU5EOztBQVFBLElBQU1DLE1BQU0sR0FBRyxTQUFUQSxNQUFTLENBQUNDLE9BQUQsRUFBK0I7QUFDNUMsU0FBTyxVQUFDQyxXQUFEO0FBQUEsV0FBb0M7QUFDekNDLE1BQUFBLFNBQVMsRUFBRSxDQUFDRCxXQUFXLENBQUNDLFNBQWIsRUFBd0JGLE9BQU8sQ0FBQ0UsU0FBaEMsRUFDUkMsTUFEUSxDQUNEQyxPQURDLEVBRVJDLElBRlEsQ0FFSCxHQUZHLENBRDhCO0FBSXpDQyxNQUFBQSxLQUFLLGtDQUFRTCxXQUFXLENBQUNLLEtBQVosSUFBcUIsRUFBN0IsR0FBc0NOLE9BQU8sQ0FBQ00sS0FBUixJQUFpQixFQUF2RDtBQUpvQyxLQUFwQztBQUFBLEdBQVA7QUFNRCxDQVBEOztBQVNBLElBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQ25CQyxhQURtQixFQUVuQkMsY0FGbUIsRUFHVTtBQUM3QixNQUFJRCxhQUFhLEtBQUtFLFNBQXRCLEVBQWlDO0FBQy9CLFdBQU9ELGNBQVA7QUFDRDs7QUFDRCxNQUFJQSxjQUFjLEtBQUtDLFNBQXZCLEVBQWtDO0FBQ2hDLFdBQU9GLGFBQVA7QUFDRDs7QUFFRCxNQUFNRyxVQUFVLFdBQVVILGFBQVYsQ0FBaEI7O0FBQ0EsTUFBTUksV0FBVyxXQUFVSCxjQUFWLENBQWpCOztBQUVBLFVBQVFFLFVBQVI7QUFDRSxTQUFLLFFBQUw7QUFDRSxjQUFRQyxXQUFSO0FBQ0UsYUFBSyxRQUFMO0FBQ0UsaUJBQU8sQ0FBQ0gsY0FBRCxFQUFpQkQsYUFBakIsRUFBZ0NMLE1BQWhDLENBQXVDQyxPQUF2QyxFQUFnREMsSUFBaEQsQ0FBcUQsR0FBckQsQ0FBUDs7QUFDRixhQUFLLFFBQUw7QUFDRSxpQkFBT04sTUFBTSxDQUFDO0FBQ1pHLFlBQUFBLFNBQVMsRUFBRU0sYUFEQztBQUVaRixZQUFBQSxLQUFLLEVBQUVHO0FBRkssV0FBRCxDQUFiOztBQUlGLGFBQUssVUFBTDtBQUNFLGlCQUFPLFVBQUNULE9BQUQ7QUFBQSw4Q0FBc0JhLElBQXRCO0FBQXNCQSxjQUFBQSxJQUF0QjtBQUFBOztBQUFBLG1CQUNMZCxNQUFNLENBQUM7QUFDTEcsY0FBQUEsU0FBUyxFQUFFTTtBQUROLGFBQUQsQ0FBTixDQUVJQyxjQUFELGdCQUF5Q1QsT0FBekMsU0FBcURhLElBQXJELEVBRkgsQ0FESztBQUFBLFdBQVA7QUFUSjs7QUFjQTs7QUFDRixTQUFLLFFBQUw7QUFDRSxjQUFRRCxXQUFSO0FBQ0UsYUFBSyxRQUFMO0FBQ0UsaUJBQU9iLE1BQU0sQ0FBQztBQUNaRyxZQUFBQSxTQUFTLEVBQUVPLGNBREM7QUFFWkgsWUFBQUEsS0FBSyxFQUFFRTtBQUZLLFdBQUQsQ0FBYjs7QUFJRixhQUFLLFFBQUw7QUFDRSxpREFDTUMsY0FETixHQUVNRCxhQUZOOztBQUlGLGFBQUssVUFBTDtBQUNFLGlCQUFPLFVBQUNSLE9BQUQ7QUFBQSwrQ0FBc0JhLElBQXRCO0FBQXNCQSxjQUFBQSxJQUF0QjtBQUFBOztBQUFBLG1CQUNMZCxNQUFNLENBQUM7QUFDTE8sY0FBQUEsS0FBSyxFQUFFRTtBQURGLGFBQUQsQ0FBTixDQUVJQyxjQUFELGdCQUF5Q1QsT0FBekMsU0FBcURhLElBQXJELEVBRkgsQ0FESztBQUFBLFdBQVA7QUFaSjs7QUFpQkE7O0FBQ0YsU0FBSyxVQUFMO0FBQ0UsY0FBUUQsV0FBUjtBQUNFLGFBQUssUUFBTDtBQUNFLGlCQUFPLFVBQUNaLE9BQUQ7QUFBQSwrQ0FBYWEsSUFBYjtBQUFhQSxjQUFBQSxJQUFiO0FBQUE7O0FBQUEsbUJBQ0pMLGFBQUQsZ0JBQ0VULE1BQU0sQ0FBQ0MsT0FBRCxDQUFOLENBQWdCO0FBQ2RFLGNBQUFBLFNBQVMsRUFBRU87QUFERyxhQUFoQixDQURGLFNBSUtJLElBSkwsRUFESztBQUFBLFdBQVA7O0FBT0YsYUFBSyxRQUFMO0FBQ0UsaUJBQU8sVUFBQ2IsT0FBRDtBQUFBLCtDQUFhYSxJQUFiO0FBQWFBLGNBQUFBLElBQWI7QUFBQTs7QUFBQSxtQkFDSkwsYUFBRCxnQkFDRVQsTUFBTSxDQUFDQyxPQUFELENBQU4sQ0FBZ0I7QUFDZE0sY0FBQUEsS0FBSyxFQUFFRztBQURPLGFBQWhCLENBREYsU0FJS0ksSUFKTCxFQURLO0FBQUEsV0FBUDs7QUFPRixhQUFLLFVBQUw7QUFDRSxpQkFBTyxVQUFDYixPQUFEO0FBQUEsK0NBQWFhLElBQWI7QUFBYUEsY0FBQUEsSUFBYjtBQUFBOztBQUFBLG1CQUNKTCxhQUFELGdCQUNHQyxjQUFELGdCQUNFVCxPQURGLFNBRUthLElBRkwsRUFERixTQUtLQSxJQUxMLEVBREs7QUFBQSxXQUFQO0FBbEJKOztBQXJDSjtBQWlFRCxDQS9FRDs7QUFpRkEsSUFBTUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixDQUNwQkMsY0FEb0IsRUFFcEJDLGVBRm9CLEVBR0Y7QUFDbEIsTUFBTS9CLElBQUksR0FBR0QsTUFBTSxDQUFDQyxJQUFQLENBQVkrQixlQUFaLENBQWI7O0FBQ0EsT0FBSyxJQUFNQyxHQUFYLElBQWtCRixjQUFsQixFQUFrQztBQUNoQyxRQUFJOUIsSUFBSSxDQUFDaUMsT0FBTCxDQUFhRCxHQUFiLE1BQXNCLENBQUMsQ0FBM0IsRUFBOEJoQyxJQUFJLENBQUNrQyxJQUFMLENBQVVGLEdBQVY7QUFDL0I7O0FBRUQsU0FBT2hDLElBQUksQ0FBQ21DLE1BQUwsQ0FDTCxVQUFDQyxhQUFELEVBQWdCSixHQUFoQjtBQUFBLFdBQ0dJLGFBQWEsQ0FBQ0osR0FBRCxDQUFiLEdBQTRDVixZQUFZLENBQ3ZEUSxjQUFjLENBQUNFLEdBQUQsQ0FEeUMsRUFFdkRELGVBQWUsQ0FBQ0MsR0FBRCxDQUZ3QyxDQUF6RCxFQUlBSSxhQUxGO0FBQUEsR0FESyxFQVFMLEVBUkssQ0FBUDtBQVVELENBbkJEOztBQXFCQSxJQUFNQyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLENBQ3ZCRCxhQUR1QixFQUV2QnBDLElBRnVCLEVBSVg7QUFBQSxxQ0FEVDRCLElBQ1M7QUFEVEEsSUFBQUEsSUFDUztBQUFBOztBQUNaLE1BQUk1QixJQUFJLEtBQUssSUFBYixFQUFtQjtBQUNqQixXQUFPb0MsYUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0UsS0FBSyxDQUFDQyxPQUFOLENBQWN2QyxJQUFkLENBQUwsRUFBMEI7QUFDeEJBLElBQUFBLElBQUksR0FBRyxDQUFDQSxJQUFELENBQVA7QUFDRDs7QUFFRCxNQUFNd0MsTUFBTSxHQUFHeEMsSUFBSSxDQUNoQnlDLEdBRFksQ0FDUixVQUFDVCxHQUFEO0FBQUEsV0FBU0ksYUFBYSxDQUFDSixHQUFELENBQXRCO0FBQUEsR0FEUSxFQUVaZCxNQUZZLENBRUxDLE9BRkssQ0FBZjtBQUlBLE1BQU11QixLQUFLLEdBQUdGLE1BQU0sQ0FBQ0wsTUFBUCxDQUNaLFVBQUNRLEdBQUQsRUFBTUMsQ0FBTixFQUFZO0FBQ1YsUUFBSSxPQUFPQSxDQUFQLEtBQWEsUUFBakIsRUFBMkI7QUFDekJELE1BQUFBLEdBQUcsQ0FBQzFCLFNBQUosR0FBZ0IsQ0FBQzBCLEdBQUcsQ0FBQzFCLFNBQUwsRUFBZ0IyQixDQUFoQixFQUFtQjFCLE1BQW5CLENBQTBCQyxPQUExQixFQUFtQ0MsSUFBbkMsQ0FBd0MsR0FBeEMsQ0FBaEI7QUFDRCxLQUZELE1BRU8sSUFBSSxRQUFPd0IsQ0FBUCxNQUFhLFFBQWpCLEVBQTJCO0FBQ2hDRCxNQUFBQSxHQUFHLENBQUN0QixLQUFKLG1DQUFpQnNCLEdBQUcsQ0FBQ3RCLEtBQXJCLEdBQStCdUIsQ0FBL0I7QUFDRCxLQUZNLE1BRUEsSUFBSSxPQUFPQSxDQUFQLEtBQWEsVUFBakIsRUFBNkI7QUFDbENELE1BQUFBLEdBQUcsbUNBQVFBLEdBQVIsR0FBZ0JDLENBQUMsTUFBRCxVQUFFRCxHQUFGLFNBQVVmLElBQVYsRUFBaEIsQ0FBSDtBQUNEOztBQUVELFdBQU9lLEdBQVA7QUFDRCxHQVhXLEVBWVo7QUFBRTFCLElBQUFBLFNBQVMsRUFBRSxFQUFiO0FBQWlCSSxJQUFBQSxLQUFLLEVBQUU7QUFBeEIsR0FaWSxDQUFkOztBQWVBLE1BQUksQ0FBQ3FCLEtBQUssQ0FBQ3pCLFNBQVgsRUFBc0I7QUFDcEIsV0FBT3lCLEtBQUssQ0FBQ3pCLFNBQWI7QUFDRDs7QUFFRCxNQUFJbEIsTUFBTSxDQUFDQyxJQUFQLENBQVkwQyxLQUFLLENBQUNyQixLQUFsQixFQUEwQndCLE1BQTFCLEtBQXFDLENBQXpDLEVBQTRDO0FBQzFDLFdBQU9ILEtBQUssQ0FBQ3JCLEtBQWI7QUFDRDs7QUFFRCxTQUFPcUIsS0FBUDtBQUNELENBekNEOztBQTJDTyxJQUFNSSxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLENBQUNDLFdBQUQ7QUFBQSxTQUMvQmhELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZK0MsV0FBWixFQUF5QlosTUFBekIsQ0FDRSxVQUFDYSxDQUFELEVBQUloQixHQUFKO0FBQUEsV0FDR2dCLENBQUMsQ0FBQ2hCLEdBQUQsQ0FBRCxHQUE4QixRQUFRaUIsSUFBUixDQUFhakIsR0FBYixJQUMzQjdCLFdBQVcsQ0FBQzRDLFdBQVcsQ0FBQ2YsR0FBRCxDQUFaLENBRGdCLEdBRTNCQSxHQUFHLEtBQUssUUFBUixHQUNBZSxXQUFXLENBQUNmLEdBQUQsQ0FBWCxHQUFtQixXQURuQixHQUVBZSxXQUFXLENBQUNmLEdBQUQsQ0FKZixFQUtBZ0IsQ0FORjtBQUFBLEdBREYsRUFTRSxFQVRGLENBRCtCO0FBQUEsQ0FBMUI7OztBQWtCQSxJQUFNRSxhQUFhLEdBQUcsd0JBTTNCLFVBQ0VDLG9CQURGLEVBS3NCO0FBQUEsTUFIcEJDLE9BR29CLHVFQUhELEVBR0M7QUFBQSxNQUZwQkMsY0FFb0IsdUVBRkksRUFFSjtBQUNwQiw2QkFBZ0VELE9BQWhFLENBQVFFLGFBQVI7QUFBQSxNQUFRQSxhQUFSLHFDQUF3QjFELGNBQXhCO0FBQUEsOEJBQWdFd0QsT0FBaEUsQ0FBd0NHLFlBQXhDO0FBQUEsTUFBd0NBLFlBQXhDLHNDQUF1RCxJQUF2RDtBQUVBLE1BQU1SLFdBQVcsR0FBR1MsY0FBYyxDQUFDSCxjQUFELEVBQWlCRSxZQUFqQixDQUFsQzs7QUFDQSxNQUFJUixXQUFKLEVBQWlCO0FBQ2ZNLElBQUFBLGNBQWMsbUNBQ1ROLFdBRFMsR0FFUk0sY0FGUSxDQUFkO0FBSUQ7O0FBRUQsTUFBTUksS0FBSyxHQUFHM0QsV0FBVyxDQUFDcUMsTUFBWixDQUNaLFVBQUNhLENBQUQsRUFBSWhCLEdBQUo7QUFBQSxXQUNHZ0IsQ0FBQyxDQUFDaEIsR0FBRCxDQUFELEdBQ0VxQixjQUFELENBQWdDckIsR0FBaEMsS0FDQXNCLGFBQWEsQ0FBQ3RCLEdBQUQsQ0FGZixFQUdBZ0IsQ0FKRjtBQUFBLEdBRFksRUFPWixFQVBZLENBQWQ7QUFVQSxNQUFNekIsYUFBYSxHQUFHeEIsTUFBTSxDQUFDQyxJQUFQLENBQVlxRCxjQUFaLEVBQTRCbEIsTUFBNUIsQ0FDcEIsVUFBQ1MsQ0FBRCxFQUFJWixHQUFKO0FBQUEsV0FDRWxDLFdBQVcsQ0FBQ21DLE9BQVosQ0FBb0JELEdBQXBCLE1BQTZCLENBQUMsQ0FBOUIsSUFDTVksQ0FBQyxDQUFDWixHQUFELENBQUQsR0FBVXFCLGNBQUQsQ0FBa0NyQixHQUFsQyxDQUFWLEVBQW1EWSxDQUR4RCxJQUVJQSxDQUhOO0FBQUEsR0FEb0IsRUFLcEIsRUFMb0IsQ0FBdEI7QUFRQSxNQUFNcEIsY0FBYyxHQUFHMkIsb0JBQW9CLENBQUNNLEtBQUQsQ0FBM0M7QUFFQSxNQUFNckIsYUFBYSxHQUFHUCxhQUFhLENBQUNOLGFBQUQsRUFBZ0JDLGNBQWhCLENBQW5DOztBQS9Cb0IscUNBRGpCSSxJQUNpQjtBQURqQkEsSUFBQUEsSUFDaUI7QUFBQTs7QUFpQ3BCLFNBQU8sd0JBQU1TLGdCQUFOLEVBQXdCLENBQXhCLGlCQUEyQkQsYUFBM0IsU0FBNkNSLElBQTdDLEVBQVA7QUFDRCxDQTdDMEIsRUE4QzNCLENBOUMyQixDQUF0Qjs7O0FBaURQLElBQU04QixlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQUNELEtBQUQ7QUFBQSxTQUN0QixDQUFDLENBQUVBLEtBQUQsQ0FBeUJFLE1BREw7QUFBQSxDQUF4Qjs7QUFHTyxJQUFNSCxjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQzVCQyxLQUQ0QixFQUU1QkYsWUFGNEIsRUFHQTtBQUM1QixNQUFJRSxLQUFLLElBQUlDLGVBQWUsQ0FBQ0QsS0FBRCxDQUF4QixJQUFtQ0EsS0FBSyxDQUFDRSxNQUE3QyxFQUFxRDtBQUNuREYsSUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNFLE1BQWQ7QUFDRDs7QUFFRCxNQUFJLE9BQU9GLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IsdUJBQThCQSxLQUFLLENBQUNHLEtBQU4sQ0FBWSxHQUFaLENBQTlCO0FBQUE7QUFBQSxRQUFPQyxVQUFQO0FBQUEsUUFBa0JDLFFBQWxCOztBQUNBLFFBQUlQLFlBQUosRUFBa0I7QUFDaEJFLE1BQUFBLEtBQUssR0FBR0YsWUFBWSxDQUFDTSxVQUFELENBQXBCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xKLE1BQUFBLEtBQUssR0FBRzVELE1BQU0sQ0FBQ2dFLFVBQUQsQ0FBZDtBQUNEOztBQUNELFFBQUlDLFFBQVEsS0FBSyxVQUFqQixFQUE2QjtBQUMzQkwsTUFBQUEsS0FBSyxHQUFHWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF6QjtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0EsS0FBSyxJQUFJMUQsTUFBTSxDQUFDZ0UsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDUixLQUFyQyxFQUE0QyxRQUE1QyxDQUFULEdBQ0ZBLEtBREUsR0FFSGhDLFNBRko7QUFHRCxDQXZCTTs7OztBQXlCQSxJQUFNeUMsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ1QsS0FBRCxFQUFpRDtBQUMxRSxNQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IscUJBQVVBLEtBQVY7QUFDRDs7QUFFRCxNQUFJQSxLQUFLLElBQUlDLGVBQWUsQ0FBQ0QsS0FBRCxDQUF4QixJQUFtQ0EsS0FBSyxDQUFDRSxNQUE3QyxFQUFxRDtBQUNuRCxRQUFJLE9BQU9GLEtBQUssQ0FBQ0UsTUFBYixLQUF3QixRQUE1QixFQUFzQztBQUNwQyw2Q0FBWUYsS0FBWjtBQUFtQkUsUUFBQUEsTUFBTSxZQUFLRixLQUFLLENBQUNFLE1BQVg7QUFBekI7QUFDRDs7QUFFRCwyQ0FDS0YsS0FETDtBQUVFRSxNQUFBQSxNQUFNLEVBQUViLGlCQUFpQixDQUFDVyxLQUFLLENBQUNFLE1BQVA7QUFGM0I7QUFJRDs7QUFFRCxNQUFJRixLQUFKLEVBQVc7QUFDVCxXQUFPWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF4QjtBQUNEOztBQUVELFNBQU9BLEtBQVA7QUFDRCxDQXJCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJhc2UxNiBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IHsgQmFzZTE2VGhlbWUgfSBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IENvbG9yIGZyb20gJ2NvbG9yJztcbmltcG9ydCAqIGFzIENTUyBmcm9tICdjc3N0eXBlJztcbmltcG9ydCBjdXJyeSBmcm9tICdsb2Rhc2guY3VycnknO1xuaW1wb3J0IHsgQ29sb3IgYXMgQ29sb3JUdXBsZSwgeXV2MnJnYiwgcmdiMnl1diB9IGZyb20gJy4vY29sb3JDb252ZXJ0ZXJzJztcbmltcG9ydCB7XG4gIFN0eWxpbmcsXG4gIFN0eWxpbmdDb25maWcsXG4gIFN0eWxpbmdGdW5jdGlvbixcbiAgU3R5bGluZ1ZhbHVlLFxuICBTdHlsaW5nVmFsdWVGdW5jdGlvbixcbiAgVGhlbWUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0UxNiA9IGJhc2UxNi5kZWZhdWx0O1xuXG5jb25zdCBCQVNFMTZfS0VZUyA9IE9iamVjdC5rZXlzKERFRkFVTFRfQkFTRTE2KTtcblxuLy8gd2UgbmVlZCBhIGNvcnJlY3RpbmcgZmFjdG9yLCBzbyB0aGF0IGEgZGFyaywgYnV0IG5vdCBibGFjayBiYWNrZ3JvdW5kIGNvbG9yXG4vLyBjb252ZXJ0cyB0byBicmlnaHQgZW5vdWdoIGludmVyc2VkIGNvbG9yXG5jb25zdCBmbGlwID0gKHg6IG51bWJlcikgPT4gKHggPCAwLjI1ID8gMSA6IHggPCAwLjUgPyAwLjkgLSB4IDogMS4xIC0geCk7XG5cbmNvbnN0IGludmVydENvbG9yID0gKGhleFN0cmluZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNvbG9yID0gQ29sb3IoaGV4U3RyaW5nKTtcbiAgY29uc3QgW3ksIHUsIHZdID0gcmdiMnl1dihjb2xvci5hcnJheSgpIGFzIENvbG9yVHVwbGUpO1xuICBjb25zdCBmbGlwcGVkWXV2OiBDb2xvclR1cGxlID0gW2ZsaXAoeSksIHUsIHZdO1xuICBjb25zdCByZ2IgPSB5dXYycmdiKGZsaXBwZWRZdXYpO1xuICByZXR1cm4gQ29sb3IucmdiKHJnYikuaGV4KCk7XG59O1xuXG5jb25zdCBtZXJnZXIgPSAoc3R5bGluZzogUGFydGlhbDxTdHlsaW5nPikgPT4ge1xuICByZXR1cm4gKHByZXZTdHlsaW5nOiBQYXJ0aWFsPFN0eWxpbmc+KSA9PiAoe1xuICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignICcpLFxuICAgIHN0eWxlOiB7IC4uLihwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIC4uLihzdHlsaW5nLnN0eWxlIHx8IHt9KSB9LFxuICB9KTtcbn07XG5cbmNvbnN0IG1lcmdlU3R5bGluZyA9IChcbiAgY3VzdG9tU3R5bGluZzogU3R5bGluZ1ZhbHVlLFxuICBkZWZhdWx0U3R5bGluZzogU3R5bGluZ1ZhbHVlXG4pOiBTdHlsaW5nVmFsdWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoY3VzdG9tU3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRTdHlsaW5nO1xuICB9XG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICBjb25zdCBjdXN0b21UeXBlID0gdHlwZW9mIGN1c3RvbVN0eWxpbmc7XG4gIGNvbnN0IGRlZmF1bHRUeXBlID0gdHlwZW9mIGRlZmF1bHRTdHlsaW5nO1xuXG4gIHN3aXRjaCAoY3VzdG9tVHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIFtkZWZhdWx0U3R5bGluZywgY3VzdG9tU3R5bGluZ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY3VzdG9tU3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZzogU3R5bGluZywgLi4uYXJnczogdW5rbm93bltdKSA9PlxuICAgICAgICAgICAgbWVyZ2VyKHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nIGFzIHN0cmluZyxcbiAgICAgICAgICAgIH0pKChkZWZhdWx0U3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoc3R5bGluZywgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogZGVmYXVsdFN0eWxpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uKGRlZmF1bHRTdHlsaW5nIGFzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4pLFxuICAgICAgICAgICAgLi4uKGN1c3RvbVN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiksXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZzogU3R5bGluZywgLi4uYXJnczogdW5rbm93bltdKSA9PlxuICAgICAgICAgICAgbWVyZ2VyKHtcbiAgICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICAgIH0pKChkZWZhdWx0U3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoc3R5bGluZywgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZywgLi4uYXJncykgPT5cbiAgICAgICAgICAgIChjdXN0b21TdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgbWVyZ2VyKHN0eWxpbmcpKHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIChzdHlsaW5nLCAuLi5hcmdzKSA9PlxuICAgICAgICAgICAgKGN1c3RvbVN0eWxpbmcgYXMgU3R5bGluZ1ZhbHVlRnVuY3Rpb24pKFxuICAgICAgICAgICAgICBtZXJnZXIoc3R5bGluZykoe1xuICAgICAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0U3R5bGluZyBhcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZywgLi4uYXJncykgPT5cbiAgICAgICAgICAgIChjdXN0b21TdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgKGRlZmF1bHRTdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgICBzdHlsaW5nLFxuICAgICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICAgKSBhcyBTdHlsaW5nLFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApO1xuICAgICAgfVxuICB9XG59O1xuXG5jb25zdCBtZXJnZVN0eWxpbmdzID0gKFxuICBjdXN0b21TdHlsaW5nczogU3R5bGluZ0NvbmZpZyxcbiAgZGVmYXVsdFN0eWxpbmdzOiBTdHlsaW5nQ29uZmlnXG4pOiBTdHlsaW5nQ29uZmlnID0+IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRTdHlsaW5ncyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGN1c3RvbVN0eWxpbmdzKSB7XG4gICAgaWYgKGtleXMuaW5kZXhPZihrZXkpID09PSAtMSkga2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICByZXR1cm4ga2V5cy5yZWR1Y2UoXG4gICAgKG1lcmdlZFN0eWxpbmcsIGtleSkgPT4gKFxuICAgICAgKG1lcmdlZFN0eWxpbmdba2V5IGFzIGtleW9mIFN0eWxpbmdDb25maWddID0gbWVyZ2VTdHlsaW5nKFxuICAgICAgICBjdXN0b21TdHlsaW5nc1trZXldIGFzIFN0eWxpbmdWYWx1ZSxcbiAgICAgICAgZGVmYXVsdFN0eWxpbmdzW2tleV0gYXMgU3R5bGluZ1ZhbHVlXG4gICAgICApIGFzIFN0eWxpbmdWYWx1ZSksXG4gICAgICBtZXJnZWRTdHlsaW5nXG4gICAgKSxcbiAgICB7fSBhcyBTdHlsaW5nQ29uZmlnXG4gICk7XG59O1xuXG5jb25zdCBnZXRTdHlsaW5nQnlLZXlzID0gKFxuICBtZXJnZWRTdHlsaW5nOiBTdHlsaW5nQ29uZmlnLFxuICBrZXlzOiAoc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQpIHwgKHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkKVtdLFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IFN0eWxpbmcgPT4ge1xuICBpZiAoa2V5cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBtZXJnZWRTdHlsaW5nIGFzIHVua25vd24gYXMgU3R5bGluZztcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBba2V5c107XG4gIH1cblxuICBjb25zdCBzdHlsZXMgPSBrZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBtZXJnZWRTdHlsaW5nW2tleSBhcyBzdHJpbmddKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgY29uc3QgcHJvcHMgPSBzdHlsZXMucmVkdWNlPFN0eWxpbmc+KFxuICAgIChvYmosIHMpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqLmNsYXNzTmFtZSA9IFtvYmouY2xhc3NOYW1lLCBzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb2JqLnN0eWxlID0geyAuLi5vYmouc3R5bGUsIC4uLnMgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqID0geyAuLi5vYmosIC4uLnMob2JqLCAuLi5hcmdzKSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgeyBjbGFzc05hbWU6ICcnLCBzdHlsZToge30gfVxuICApO1xuXG4gIGlmICghcHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwcm9wcy5zdHlsZSEpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBwcm9wcy5zdHlsZTtcbiAgfVxuXG4gIHJldHVybiBwcm9wcztcbn07XG5cbmV4cG9ydCBjb25zdCBpbnZlcnRCYXNlMTZUaGVtZSA9IChiYXNlMTZUaGVtZTogQmFzZTE2VGhlbWUpOiBCYXNlMTZUaGVtZSA9PlxuICBPYmplY3Qua2V5cyhiYXNlMTZUaGVtZSkucmVkdWNlKFxuICAgICh0LCBrZXkpID0+IChcbiAgICAgICh0W2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0gPSAvXmJhc2UvLnRlc3Qoa2V5KVxuICAgICAgICA/IGludmVydENvbG9yKGJhc2UxNlRoZW1lW2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0pXG4gICAgICAgIDoga2V5ID09PSAnc2NoZW1lJ1xuICAgICAgICA/IGJhc2UxNlRoZW1lW2tleV0gKyAnOmludmVydGVkJ1xuICAgICAgICA6IGJhc2UxNlRoZW1lW2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0pLFxuICAgICAgdFxuICAgICksXG4gICAge30gYXMgQmFzZTE2VGhlbWVcbiAgKTtcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBkZWZhdWx0QmFzZTE2PzogQmFzZTE2VGhlbWU7XG4gIGJhc2UxNlRoZW1lcz86IHsgW3RoZW1lTmFtZTogc3RyaW5nXTogQmFzZTE2VGhlbWUgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVN0eWxpbmcgPSBjdXJyeTxcbiAgKGJhc2UxNlRoZW1lOiBCYXNlMTZUaGVtZSkgPT4gU3R5bGluZ0NvbmZpZyxcbiAgT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgVGhlbWUgfCB1bmRlZmluZWQsXG4gIFN0eWxpbmdGdW5jdGlvblxuPihcbiAgKFxuICAgIGdldFN0eWxpbmdGcm9tQmFzZTE2OiAoYmFzZTE2VGhlbWU6IEJhc2UxNlRoZW1lKSA9PiBTdHlsaW5nQ29uZmlnLFxuICAgIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSxcbiAgICB0aGVtZU9yU3R5bGluZzogVGhlbWUgPSB7fSxcbiAgICAuLi5hcmdzXG4gICk6IFN0eWxpbmdGdW5jdGlvbiA9PiB7XG4gICAgY29uc3QgeyBkZWZhdWx0QmFzZTE2ID0gREVGQVVMVF9CQVNFMTYsIGJhc2UxNlRoZW1lcyA9IG51bGwgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBiYXNlMTZUaGVtZSA9IGdldEJhc2UxNlRoZW1lKHRoZW1lT3JTdHlsaW5nLCBiYXNlMTZUaGVtZXMpO1xuICAgIGlmIChiYXNlMTZUaGVtZSkge1xuICAgICAgdGhlbWVPclN0eWxpbmcgPSB7XG4gICAgICAgIC4uLmJhc2UxNlRoZW1lLFxuICAgICAgICAuLi4odGhlbWVPclN0eWxpbmcgYXMgQmFzZTE2VGhlbWUgfCBTdHlsaW5nQ29uZmlnKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdGhlbWUgPSBCQVNFMTZfS0VZUy5yZWR1Y2UoXG4gICAgICAodCwga2V5KSA9PiAoXG4gICAgICAgICh0W2tleSBhcyBrZXlvZiBCYXNlMTZUaGVtZV0gPVxuICAgICAgICAgICh0aGVtZU9yU3R5bGluZyBhcyBCYXNlMTZUaGVtZSlba2V5IGFzIGtleW9mIEJhc2UxNlRoZW1lXSB8fFxuICAgICAgICAgIGRlZmF1bHRCYXNlMTZba2V5IGFzIGtleW9mIEJhc2UxNlRoZW1lXSksXG4gICAgICAgIHRcbiAgICAgICksXG4gICAgICB7fSBhcyBCYXNlMTZUaGVtZVxuICAgICk7XG5cbiAgICBjb25zdCBjdXN0b21TdHlsaW5nID0gT2JqZWN0LmtleXModGhlbWVPclN0eWxpbmcpLnJlZHVjZShcbiAgICAgIChzLCBrZXkpID0+XG4gICAgICAgIEJBU0UxNl9LRVlTLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgICAgICAgICA/ICgoc1trZXldID0gKHRoZW1lT3JTdHlsaW5nIGFzIFN0eWxpbmdDb25maWcpW2tleV0pLCBzKVxuICAgICAgICAgIDogcyxcbiAgICAgIHt9IGFzIFN0eWxpbmdDb25maWdcbiAgICApO1xuXG4gICAgY29uc3QgZGVmYXVsdFN0eWxpbmcgPSBnZXRTdHlsaW5nRnJvbUJhc2UxNih0aGVtZSk7XG5cbiAgICBjb25zdCBtZXJnZWRTdHlsaW5nID0gbWVyZ2VTdHlsaW5ncyhjdXN0b21TdHlsaW5nLCBkZWZhdWx0U3R5bGluZyk7XG5cbiAgICByZXR1cm4gY3VycnkoZ2V0U3R5bGluZ0J5S2V5cywgMikobWVyZ2VkU3R5bGluZywgLi4uYXJncyk7XG4gIH0sXG4gIDNcbik7XG5cbmNvbnN0IGlzU3R5bGluZ0NvbmZpZyA9ICh0aGVtZTogVGhlbWUpOiB0aGVtZSBpcyBTdHlsaW5nQ29uZmlnID0+XG4gICEhKHRoZW1lIGFzIFN0eWxpbmdDb25maWcpLmV4dGVuZDtcblxuZXhwb3J0IGNvbnN0IGdldEJhc2UxNlRoZW1lID0gKFxuICB0aGVtZTogVGhlbWUsXG4gIGJhc2UxNlRoZW1lcz86IHsgW3RoZW1lTmFtZTogc3RyaW5nXTogQmFzZTE2VGhlbWUgfSB8IG51bGxcbik6IEJhc2UxNlRoZW1lIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgdGhlbWUgPSB0aGVtZS5leHRlbmQgYXMgc3RyaW5nIHwgQmFzZTE2VGhlbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IFt0aGVtZU5hbWUsIG1vZGlmaWVyXSA9IHRoZW1lLnNwbGl0KCc6Jyk7XG4gICAgaWYgKGJhc2UxNlRoZW1lcykge1xuICAgICAgdGhlbWUgPSBiYXNlMTZUaGVtZXNbdGhlbWVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBiYXNlMTZbdGhlbWVOYW1lIGFzIGtleW9mIHR5cGVvZiBiYXNlMTZdO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXIgPT09ICdpbnZlcnRlZCcpIHtcbiAgICAgIHRoZW1lID0gaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGVtZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhlbWUsICdiYXNlMDAnKVxuICAgID8gKHRoZW1lIGFzIEJhc2UxNlRoZW1lKVxuICAgIDogdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGludmVydFRoZW1lID0gKHRoZW1lOiBUaGVtZSB8IHVuZGVmaW5lZCk6IFRoZW1lIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYCR7dGhlbWV9OmludmVydGVkYDtcbiAgfVxuXG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIGlmICh0eXBlb2YgdGhlbWUuZXh0ZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgLi4udGhlbWUsIGV4dGVuZDogYCR7dGhlbWUuZXh0ZW5kfTppbnZlcnRlZGAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhlbWUsXG4gICAgICBleHRlbmQ6IGludmVydEJhc2UxNlRoZW1lKHRoZW1lLmV4dGVuZCBhcyBCYXNlMTZUaGVtZSksXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0aGVtZSkge1xuICAgIHJldHVybiBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZSBhcyBCYXNlMTZUaGVtZSk7XG4gIH1cblxuICByZXR1cm4gdGhlbWU7XG59O1xuXG5leHBvcnQgeyBCYXNlMTZUaGVtZSB9O1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXX0= |
\ | No newline at end of file |