1 | ;
|
2 |
|
3 | var fs = require('fs-extra');
|
4 | var path = require('path');
|
5 | var tsMorph = require('ts-morph');
|
6 | var LiveServer = require('@compodoc/live-server');
|
7 | var _ = require('lodash');
|
8 | var ts = require('typescript');
|
9 | var i18next = require('i18next');
|
10 | var Handlebars = require('handlebars');
|
11 | var semver = require('semver');
|
12 | var htmlEntities = require('html-entities');
|
13 | var JSON5 = require('json5');
|
14 | var uuid = require('uuid');
|
15 | var cosmiconfig = require('cosmiconfig');
|
16 |
|
17 | function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
18 |
|
19 | function _interopNamespace(e) {
|
20 | if (e && e.__esModule) return e;
|
21 | var n = Object.create(null);
|
22 | if (e) {
|
23 | Object.keys(e).forEach(function (k) {
|
24 | if (k !== 'default') {
|
25 | var d = Object.getOwnPropertyDescriptor(e, k);
|
26 | Object.defineProperty(n, k, d.get ? d : {
|
27 | enumerable: true,
|
28 | get: function () { return e[k]; }
|
29 | });
|
30 | }
|
31 | });
|
32 | }
|
33 | n["default"] = e;
|
34 | return Object.freeze(n);
|
35 | }
|
36 |
|
37 | var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
38 | var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
39 | var LiveServer__namespace = /*#__PURE__*/_interopNamespace(LiveServer);
|
40 | var ___namespace = /*#__PURE__*/_interopNamespace(_);
|
41 | var ts__namespace = /*#__PURE__*/_interopNamespace(ts);
|
42 | var i18next__default = /*#__PURE__*/_interopDefaultLegacy(i18next);
|
43 | var Handlebars__namespace = /*#__PURE__*/_interopNamespace(Handlebars);
|
44 | var semver__namespace = /*#__PURE__*/_interopNamespace(semver);
|
45 | var JSON5__namespace = /*#__PURE__*/_interopNamespace(JSON5);
|
46 |
|
47 | /*! *****************************************************************************
|
48 | Copyright (c) Microsoft Corporation.
|
49 |
|
50 | Permission to use, copy, modify, and/or distribute this software for any
|
51 | purpose with or without fee is hereby granted.
|
52 |
|
53 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
54 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
55 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
56 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
57 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
58 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
59 | PERFORMANCE OF THIS SOFTWARE.
|
60 | ***************************************************************************** */
|
61 | /* global Reflect, Promise */
|
62 |
|
63 | var extendStatics = function(d, b) {
|
64 | extendStatics = Object.setPrototypeOf ||
|
65 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
66 | function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
67 | return extendStatics(d, b);
|
68 | };
|
69 |
|
70 | function __extends(d, b) {
|
71 | if (typeof b !== "function" && b !== null)
|
72 | throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
73 | extendStatics(d, b);
|
74 | function __() { this.constructor = d; }
|
75 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
76 | }
|
77 |
|
78 | var __assign = function() {
|
79 | __assign = Object.assign || function __assign(t) {
|
80 | for (var s, i = 1, n = arguments.length; i < n; i++) {
|
81 | s = arguments[i];
|
82 | for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
83 | }
|
84 | return t;
|
85 | };
|
86 | return __assign.apply(this, arguments);
|
87 | };
|
88 |
|
89 | function __values(o) {
|
90 | var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
91 | if (m) return m.call(o);
|
92 | if (o && typeof o.length === "number") return {
|
93 | next: function () {
|
94 | if (o && i >= o.length) o = void 0;
|
95 | return { value: o && o[i++], done: !o };
|
96 | }
|
97 | };
|
98 | throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
99 | }
|
100 |
|
101 | function __read(o, n) {
|
102 | var m = typeof Symbol === "function" && o[Symbol.iterator];
|
103 | if (!m) return o;
|
104 | var i = m.call(o), r, ar = [], e;
|
105 | try {
|
106 | while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
107 | }
|
108 | catch (error) { e = { error: error }; }
|
109 | finally {
|
110 | try {
|
111 | if (r && !r.done && (m = i["return"])) m.call(i);
|
112 | }
|
113 | finally { if (e) throw e.error; }
|
114 | }
|
115 | return ar;
|
116 | }
|
117 |
|
118 | function __spreadArray(to, from, pack) {
|
119 | if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
120 | if (ar || !(i in from)) {
|
121 | if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
122 | ar[i] = from[i];
|
123 | }
|
124 | }
|
125 | return to.concat(ar || Array.prototype.slice.call(from));
|
126 | }
|
127 |
|
128 | var log = require('fancy-log');
|
129 | var c = require('chalk');
|
130 | var LEVEL;
|
131 | (function (LEVEL) {
|
132 | LEVEL[LEVEL["INFO"] = 0] = "INFO";
|
133 | LEVEL[LEVEL["DEBUG"] = 1] = "DEBUG";
|
134 | LEVEL[LEVEL["ERROR"] = 2] = "ERROR";
|
135 | LEVEL[LEVEL["WARN"] = 3] = "WARN";
|
136 | })(LEVEL || (LEVEL = {}));
|
137 | var Logger = /** @class */ (function () {
|
138 | function Logger() {
|
139 | this.logger = log;
|
140 | this.silent = true;
|
141 | }
|
142 | Logger.prototype.info = function () {
|
143 | var args = [];
|
144 | for (var _i = 0; _i < arguments.length; _i++) {
|
145 | args[_i] = arguments[_i];
|
146 | }
|
147 | if (!this.silent) {
|
148 | return;
|
149 | }
|
150 | this.logger(this.format.apply(this, __spreadArray([LEVEL.INFO], __read(args), false)));
|
151 | };
|
152 | Logger.prototype.error = function () {
|
153 | var args = [];
|
154 | for (var _i = 0; _i < arguments.length; _i++) {
|
155 | args[_i] = arguments[_i];
|
156 | }
|
157 | this.logger(this.format.apply(this, __spreadArray([LEVEL.ERROR], __read(args), false)));
|
158 | };
|
159 | Logger.prototype.warn = function () {
|
160 | var args = [];
|
161 | for (var _i = 0; _i < arguments.length; _i++) {
|
162 | args[_i] = arguments[_i];
|
163 | }
|
164 | if (!this.silent) {
|
165 | return;
|
166 | }
|
167 | this.logger(this.format.apply(this, __spreadArray([LEVEL.WARN], __read(args), false)));
|
168 | };
|
169 | Logger.prototype.debug = function () {
|
170 | var args = [];
|
171 | for (var _i = 0; _i < arguments.length; _i++) {
|
172 | args[_i] = arguments[_i];
|
173 | }
|
174 | if (!this.silent) {
|
175 | return;
|
176 | }
|
177 | this.logger(this.format.apply(this, __spreadArray([LEVEL.DEBUG], __read(args), false)));
|
178 | };
|
179 | Logger.prototype.format = function (level) {
|
180 | var args = [];
|
181 | for (var _i = 1; _i < arguments.length; _i++) {
|
182 | args[_i - 1] = arguments[_i];
|
183 | }
|
184 | var pad = function (s, l, z) {
|
185 | if (z === void 0) { z = ''; }
|
186 | return s + Array(Math.max(0, l - s.length + 1)).join(z);
|
187 | };
|
188 | var msg = args.join(' ');
|
189 | if (args.length > 1) {
|
190 | msg = pad(args.shift(), 15, ' ') + ": " + args.join(' ');
|
191 | }
|
192 | switch (level) {
|
193 | case LEVEL.INFO:
|
194 | msg = c.green(msg);
|
195 | break;
|
196 | case LEVEL.DEBUG:
|
197 | msg = c.cyan(msg);
|
198 | break;
|
199 | case LEVEL.WARN:
|
200 | msg = c.yellow(msg);
|
201 | break;
|
202 | case LEVEL.ERROR:
|
203 | msg = c.red(msg);
|
204 | break;
|
205 | }
|
206 | return [msg].join('');
|
207 | };
|
208 | return Logger;
|
209 | }());
|
210 | var logger = new Logger();
|
211 |
|
212 | var COMPODOC_DEFAULTS = {
|
213 | title: 'Application documentation',
|
214 | additionalEntryName: 'Additional documentation',
|
215 | additionalEntryPath: 'additional-documentation',
|
216 | folder: './documentation/',
|
217 | hostname: '127.0.0.1',
|
218 | port: 8080,
|
219 | theme: 'gitbook',
|
220 | exportFormat: 'html',
|
221 | exportFormatsSupported: ['html', 'json', 'pdf'],
|
222 | base: '/',
|
223 | defaultCoverageThreshold: 70,
|
224 | defaultCoverageMinimumPerFile: 0,
|
225 | coverageTestThresholdFail: true,
|
226 | toggleMenuItems: ['all'],
|
227 | navTabConfig: [],
|
228 | disableSourceCode: false,
|
229 | disableDomTree: false,
|
230 | disableTemplateTab: false,
|
231 | disableStyleTab: false,
|
232 | disableGraph: false,
|
233 | disableMainGraph: false,
|
234 | disableCoverage: false,
|
235 | disablePrivate: false,
|
236 | disableProtected: false,
|
237 | disableInternal: false,
|
238 | disableLifeCycleHooks: false,
|
239 | disableRoutesGraph: false,
|
240 | disableDependencies: false,
|
241 | disableProperties: false,
|
242 | PAGE_TYPES: {
|
243 | ROOT: 'root',
|
244 | INTERNAL: 'internal'
|
245 | },
|
246 | gaSite: 'auto',
|
247 | coverageTestShowOnlyFailed: false,
|
248 | language: 'en-US',
|
249 | maxSearchResults: 15
|
250 | };
|
251 |
|
252 | var Configuration = /** @class */ (function () {
|
253 | function Configuration() {
|
254 | this._pages = [];
|
255 | this._mainData = {
|
256 | output: COMPODOC_DEFAULTS.folder,
|
257 | theme: COMPODOC_DEFAULTS.theme,
|
258 | extTheme: '',
|
259 | serve: false,
|
260 | hostname: COMPODOC_DEFAULTS.hostname,
|
261 | host: '',
|
262 | port: COMPODOC_DEFAULTS.port,
|
263 | open: false,
|
264 | assetsFolder: '',
|
265 | documentationMainName: COMPODOC_DEFAULTS.title,
|
266 | documentationMainDescription: '',
|
267 | base: COMPODOC_DEFAULTS.base,
|
268 | hideGenerator: false,
|
269 | hideDarkModeToggle: false,
|
270 | hasFilesToCoverage: false,
|
271 | modules: [],
|
272 | readme: false,
|
273 | changelog: '',
|
274 | contributing: '',
|
275 | license: '',
|
276 | todo: '',
|
277 | markdowns: [],
|
278 | additionalPages: [],
|
279 | pipes: [],
|
280 | classes: [],
|
281 | interfaces: [],
|
282 | components: [],
|
283 | controllers: [],
|
284 | entities: [],
|
285 | directives: [],
|
286 | injectables: [],
|
287 | interceptors: [],
|
288 | guards: [],
|
289 | miscellaneous: [],
|
290 | routes: [],
|
291 | tsconfig: '',
|
292 | toggleMenuItems: COMPODOC_DEFAULTS.toggleMenuItems,
|
293 | navTabConfig: [],
|
294 | templates: '',
|
295 | includes: '',
|
296 | includesName: COMPODOC_DEFAULTS.additionalEntryName,
|
297 | includesFolder: COMPODOC_DEFAULTS.additionalEntryPath,
|
298 | disableSourceCode: COMPODOC_DEFAULTS.disableSourceCode,
|
299 | disableDomTree: COMPODOC_DEFAULTS.disableDomTree,
|
300 | disableTemplateTab: COMPODOC_DEFAULTS.disableTemplateTab,
|
301 | disableStyleTab: COMPODOC_DEFAULTS.disableStyleTab,
|
302 | disableGraph: COMPODOC_DEFAULTS.disableGraph,
|
303 | disableMainGraph: COMPODOC_DEFAULTS.disableMainGraph,
|
304 | disableCoverage: COMPODOC_DEFAULTS.disableCoverage,
|
305 | disablePrivate: COMPODOC_DEFAULTS.disablePrivate,
|
306 | disableInternal: COMPODOC_DEFAULTS.disableInternal,
|
307 | disableProtected: COMPODOC_DEFAULTS.disableProtected,
|
308 | disableLifeCycleHooks: COMPODOC_DEFAULTS.disableLifeCycleHooks,
|
309 | disableRoutesGraph: COMPODOC_DEFAULTS.disableRoutesGraph,
|
310 | disableSearch: false,
|
311 | disableDependencies: COMPODOC_DEFAULTS.disableDependencies,
|
312 | disableProperties: COMPODOC_DEFAULTS.disableProperties,
|
313 | watch: false,
|
314 | mainGraph: '',
|
315 | coverageTest: false,
|
316 | coverageTestThreshold: COMPODOC_DEFAULTS.defaultCoverageThreshold,
|
317 | coverageTestThresholdFail: COMPODOC_DEFAULTS.coverageTestThresholdFail,
|
318 | coverageTestPerFile: false,
|
319 | coverageMinimumPerFile: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile,
|
320 | unitTestCoverage: '',
|
321 | unitTestData: undefined,
|
322 | coverageTestShowOnlyFailed: COMPODOC_DEFAULTS.coverageTestShowOnlyFailed,
|
323 | routesLength: 0,
|
324 | angularVersion: '',
|
325 | exportFormat: COMPODOC_DEFAULTS.exportFormat,
|
326 | coverageData: {},
|
327 | customFavicon: '',
|
328 | customLogo: '',
|
329 | packageDependencies: [],
|
330 | packagePeerDependencies: [],
|
331 | packageProperties: {},
|
332 | gaID: '',
|
333 | gaSite: '',
|
334 | angularProject: false,
|
335 | angularJSProject: false,
|
336 | language: COMPODOC_DEFAULTS.language,
|
337 | maxSearchResults: 15
|
338 | };
|
339 | }
|
340 | Configuration.getInstance = function () {
|
341 | if (!Configuration.instance) {
|
342 | Configuration.instance = new Configuration();
|
343 | }
|
344 | return Configuration.instance;
|
345 | };
|
346 | Configuration.prototype.addPage = function (page) {
|
347 | var indexPage = ___namespace.findIndex(this._pages, { name: page.name });
|
348 | if (indexPage === -1) {
|
349 | this._pages.push(page);
|
350 | }
|
351 | };
|
352 | Configuration.prototype.hasPage = function (name) {
|
353 | var indexPage = ___namespace.findIndex(this._pages, { name: name });
|
354 | return indexPage !== -1;
|
355 | };
|
356 | Configuration.prototype.addAdditionalPage = function (page) {
|
357 | this._mainData.additionalPages.push(page);
|
358 | };
|
359 | Configuration.prototype.getAdditionalPageById = function (id) {
|
360 | return this._mainData.additionalPages.find(function (page) { return page.id === id; });
|
361 | };
|
362 | Configuration.prototype.resetPages = function () {
|
363 | this._pages = [];
|
364 | };
|
365 | Configuration.prototype.resetAdditionalPages = function () {
|
366 | this._mainData.additionalPages = [];
|
367 | };
|
368 | Configuration.prototype.resetRootMarkdownPages = function () {
|
369 | var indexPage = ___namespace.findIndex(this._pages, { name: 'index' });
|
370 | this._pages.splice(indexPage, 1);
|
371 | indexPage = ___namespace.findIndex(this._pages, { name: 'changelog' });
|
372 | this._pages.splice(indexPage, 1);
|
373 | indexPage = ___namespace.findIndex(this._pages, { name: 'contributing' });
|
374 | this._pages.splice(indexPage, 1);
|
375 | indexPage = ___namespace.findIndex(this._pages, { name: 'license' });
|
376 | this._pages.splice(indexPage, 1);
|
377 | indexPage = ___namespace.findIndex(this._pages, { name: 'todo' });
|
378 | this._pages.splice(indexPage, 1);
|
379 | this._mainData.markdowns = [];
|
380 | };
|
381 | Object.defineProperty(Configuration.prototype, "pages", {
|
382 | get: function () {
|
383 | return this._pages;
|
384 | },
|
385 | set: function (pages) {
|
386 | this._pages = [];
|
387 | },
|
388 | enumerable: false,
|
389 | configurable: true
|
390 | });
|
391 | Object.defineProperty(Configuration.prototype, "markDownPages", {
|
392 | get: function () {
|
393 | return this._pages.filter(function (page) { return page.markdown; });
|
394 | },
|
395 | enumerable: false,
|
396 | configurable: true
|
397 | });
|
398 | Object.defineProperty(Configuration.prototype, "mainData", {
|
399 | get: function () {
|
400 | return this._mainData;
|
401 | },
|
402 | set: function (data) {
|
403 | Object.assign(this._mainData, data);
|
404 | },
|
405 | enumerable: false,
|
406 | configurable: true
|
407 | });
|
408 | return Configuration;
|
409 | }());
|
410 | var Configuration$1 = Configuration.getInstance();
|
411 |
|
412 | var AngularAPIs = require('../src/data/api-list.json');
|
413 | var AngularApiUtil = /** @class */ (function () {
|
414 | function AngularApiUtil() {
|
415 | }
|
416 | AngularApiUtil.getInstance = function () {
|
417 | if (!AngularApiUtil.instance) {
|
418 | AngularApiUtil.instance = new AngularApiUtil();
|
419 | }
|
420 | return AngularApiUtil.instance;
|
421 | };
|
422 | AngularApiUtil.prototype.findApi = function (type) {
|
423 | var foundedApi;
|
424 | ___namespace.forEach(AngularAPIs, function (mainApi) {
|
425 | ___namespace.forEach(mainApi.items, function (api) {
|
426 | if (api.title === type) {
|
427 | foundedApi = api;
|
428 | }
|
429 | });
|
430 | });
|
431 | return {
|
432 | source: 'external',
|
433 | data: foundedApi
|
434 | };
|
435 | };
|
436 | return AngularApiUtil;
|
437 | }());
|
438 | var AngularApiUtil$1 = AngularApiUtil.getInstance();
|
439 |
|
440 | function extractLeadingText(string, completeTag) {
|
441 | var tagIndex = string.indexOf(completeTag);
|
442 | var leadingText = undefined;
|
443 | var leadingTextRegExp = /\[(.+?)\]/g;
|
444 | var leadingTextInfo = leadingTextRegExp.exec(string);
|
445 | // did we find leading text, and if so, does it immediately precede the tag?
|
446 | while (leadingTextInfo && leadingTextInfo.length) {
|
447 | if (leadingTextInfo.index + leadingTextInfo[0].length === tagIndex) {
|
448 | string = string.replace(leadingTextInfo[0], '');
|
449 | leadingText = leadingTextInfo[1];
|
450 | break;
|
451 | }
|
452 | leadingTextInfo = leadingTextRegExp.exec(string);
|
453 | }
|
454 | return {
|
455 | leadingText: leadingText,
|
456 | string: string
|
457 | };
|
458 | }
|
459 | function splitLinkText(text) {
|
460 | var linkText;
|
461 | var target;
|
462 | var splitIndex;
|
463 | // if a pipe is not present, we split on the first space
|
464 | splitIndex = text.indexOf('|');
|
465 | if (splitIndex === -1) {
|
466 | splitIndex = text.search(/\s/);
|
467 | }
|
468 | if (splitIndex !== -1) {
|
469 | linkText = text.substr(splitIndex + 1);
|
470 | // Normalize subsequent newlines to a single space.
|
471 | linkText = linkText.replace(/\n+/, ' ');
|
472 | target = text.substr(0, splitIndex);
|
473 | }
|
474 | return {
|
475 | linkText: linkText,
|
476 | target: target || text
|
477 | };
|
478 | }
|
479 | var LinkParser = (function () {
|
480 | var processTheLink = function (string, tagInfo, leadingText) {
|
481 | var leading = extractLeadingText(string, tagInfo.completeTag), linkText, split, target, stringtoReplace;
|
482 | linkText = leadingText ? leadingText : leading.leadingText || '';
|
483 | split = splitLinkText(tagInfo.text);
|
484 | target = split.target;
|
485 | if (leading.leadingText !== undefined) {
|
486 | stringtoReplace = '[' + leading.leadingText + ']' + tagInfo.completeTag;
|
487 | }
|
488 | else if (typeof split.linkText !== 'undefined') {
|
489 | stringtoReplace = tagInfo.completeTag;
|
490 | linkText = split.linkText;
|
491 | }
|
492 | if (linkText === '' || linkText == null || target == null) {
|
493 | return string;
|
494 | }
|
495 | return string.replace(stringtoReplace, '[' + linkText + '](' + target + ')');
|
496 | };
|
497 | /**
|
498 | * Convert
|
499 | * {@link http://www.google.com|Google} or {@link https://github.com GitHub} or [Github]{@link https://github.com} to [Github](https://github.com)
|
500 | */
|
501 | var replaceLinkTag = function (str) {
|
502 | if (typeof str === 'undefined') {
|
503 | return {
|
504 | newString: ''
|
505 | };
|
506 | }
|
507 | // new RegExp('\\[((?:.|\n)+?)]\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TO DO]{@link Todo} fo') -> "[TO DO]{@link Todo}", "TO DO", "Todo"
|
508 | // new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TODO]{@link Todo} fo') -> "{@link Todo}", "Todo"
|
509 | var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExp, matches, previousString;
|
510 | tagRegExp = str.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
|
511 | function replaceMatch(replacer, tag, match, text, linkText) {
|
512 | var matchedTag = {
|
513 | completeTag: match,
|
514 | tag: tag,
|
515 | text: text
|
516 | };
|
517 | if (linkText) {
|
518 | return replacer(str, matchedTag, linkText);
|
519 | }
|
520 | else {
|
521 | return replacer(str, matchedTag);
|
522 | }
|
523 | }
|
524 | do {
|
525 | matches = tagRegExp.exec(str);
|
526 | if (matches) {
|
527 | previousString = str;
|
528 | if (matches.length === 2) {
|
529 | str = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
|
530 | }
|
531 | if (matches.length === 3) {
|
532 | str = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
|
533 | }
|
534 | }
|
535 | } while (matches && previousString !== str);
|
536 | return {
|
537 | newString: str
|
538 | };
|
539 | };
|
540 | var _resolveLinks = function (str) {
|
541 | return replaceLinkTag(str).newString;
|
542 | };
|
543 | return {
|
544 | resolveLinks: _resolveLinks
|
545 | };
|
546 | })();
|
547 |
|
548 | var AngularLifecycleHooks;
|
549 | (function (AngularLifecycleHooks) {
|
550 | AngularLifecycleHooks[AngularLifecycleHooks["ngOnChanges"] = 0] = "ngOnChanges";
|
551 | AngularLifecycleHooks[AngularLifecycleHooks["ngOnInit"] = 1] = "ngOnInit";
|
552 | AngularLifecycleHooks[AngularLifecycleHooks["ngDoCheck"] = 2] = "ngDoCheck";
|
553 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentInit"] = 3] = "ngAfterContentInit";
|
554 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentChecked"] = 4] = "ngAfterContentChecked";
|
555 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewInit"] = 5] = "ngAfterViewInit";
|
556 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewChecked"] = 6] = "ngAfterViewChecked";
|
557 | AngularLifecycleHooks[AngularLifecycleHooks["ngOnDestroy"] = 7] = "ngOnDestroy";
|
558 | })(AngularLifecycleHooks || (AngularLifecycleHooks = {}));
|
559 |
|
560 | var KindType;
|
561 | (function (KindType) {
|
562 | KindType["UNKNOWN"] = "";
|
563 | KindType["STRING"] = "string";
|
564 | KindType["NUMBER"] = "number";
|
565 | KindType["ARRAY"] = "[]";
|
566 | KindType["VOID"] = "void";
|
567 | KindType["FUNCTION"] = "function";
|
568 | KindType["TEMPLATE_LITERAL"] = "template literal type";
|
569 | KindType["LITERAL"] = "literal type";
|
570 | KindType["BOOLEAN"] = "boolean";
|
571 | KindType["ANY"] = "any";
|
572 | KindType["NULL"] = "null";
|
573 | KindType["SYMBOL"] = "symbol";
|
574 | KindType["NEVER"] = "never";
|
575 | KindType["UNDEFINED"] = "undefined";
|
576 | KindType["OBJECT"] = "object";
|
577 | })(KindType || (KindType = {}));
|
578 | var IsKindType = {
|
579 | ANY: function (kind) {
|
580 | return kindToType(kind) === KindType.ANY;
|
581 | },
|
582 | ARRAY: function (kind) {
|
583 | return kindToType(kind) === KindType.ARRAY;
|
584 | },
|
585 | BOOLEAN: function (kind) {
|
586 | return kindToType(kind) === KindType.BOOLEAN;
|
587 | },
|
588 | FUNCTION: function (kind) {
|
589 | return kindToType(kind) === KindType.FUNCTION;
|
590 | },
|
591 | LITERAL: function (kind) {
|
592 | return kindToType(kind) === KindType.LITERAL;
|
593 | },
|
594 | NEVER: function (kind) {
|
595 | return kindToType(kind) === KindType.NEVER;
|
596 | },
|
597 | NULL: function (kind) {
|
598 | return kindToType(kind) === KindType.NULL;
|
599 | },
|
600 | NUMBER: function (kind) {
|
601 | return kindToType(kind) === KindType.NUMBER;
|
602 | },
|
603 | OBJECT: function (kind) {
|
604 | return kindToType(kind) === KindType.OBJECT;
|
605 | },
|
606 | STRING: function (kind) {
|
607 | return kindToType(kind) === KindType.STRING;
|
608 | },
|
609 | SYMBOL: function (kind) {
|
610 | return kindToType(kind) === KindType.SYMBOL;
|
611 | },
|
612 | TEMPLATE_LITERAL: function (kind) {
|
613 | return kindToType(kind) === KindType.TEMPLATE_LITERAL;
|
614 | },
|
615 | UNDEFINED: function (kind) {
|
616 | return kindToType(kind) === KindType.UNDEFINED;
|
617 | },
|
618 | UNKNOWN: function (kind) {
|
619 | return kindToType(kind) === KindType.UNKNOWN;
|
620 | },
|
621 | VOID: function (kind) {
|
622 | return kindToType(kind) === KindType.VOID;
|
623 | }
|
624 | };
|
625 | function kindToType(kind) {
|
626 | var _type = KindType.UNKNOWN;
|
627 | switch (kind) {
|
628 | case tsMorph.SyntaxKind.StringKeyword:
|
629 | case tsMorph.SyntaxKind.StringLiteral:
|
630 | _type = KindType.STRING;
|
631 | break;
|
632 | case tsMorph.SyntaxKind.NumberKeyword:
|
633 | case tsMorph.SyntaxKind.NumericLiteral:
|
634 | _type = KindType.NUMBER;
|
635 | break;
|
636 | case tsMorph.SyntaxKind.ArrayType:
|
637 | case tsMorph.SyntaxKind.ArrayLiteralExpression:
|
638 | _type = KindType.ARRAY;
|
639 | break;
|
640 | case tsMorph.SyntaxKind.VoidKeyword:
|
641 | _type = KindType.VOID;
|
642 | break;
|
643 | case tsMorph.SyntaxKind.FunctionType:
|
644 | _type = KindType.FUNCTION;
|
645 | break;
|
646 | case tsMorph.SyntaxKind.TemplateLiteralType:
|
647 | _type = KindType.TEMPLATE_LITERAL;
|
648 | break;
|
649 | case tsMorph.SyntaxKind.TypeLiteral:
|
650 | _type = KindType.LITERAL;
|
651 | break;
|
652 | case tsMorph.SyntaxKind.BooleanKeyword:
|
653 | _type = KindType.BOOLEAN;
|
654 | break;
|
655 | case tsMorph.SyntaxKind.AnyKeyword:
|
656 | _type = KindType.ANY;
|
657 | break;
|
658 | case tsMorph.SyntaxKind.NullKeyword:
|
659 | _type = KindType.NULL;
|
660 | break;
|
661 | case tsMorph.SyntaxKind.SymbolKeyword:
|
662 | _type = KindType.SYMBOL;
|
663 | break;
|
664 | case tsMorph.SyntaxKind.NeverKeyword:
|
665 | _type = KindType.NEVER;
|
666 | break;
|
667 | case tsMorph.SyntaxKind.UndefinedKeyword:
|
668 | _type = KindType.UNDEFINED;
|
669 | break;
|
670 | case tsMorph.SyntaxKind.ObjectKeyword:
|
671 | case tsMorph.SyntaxKind.ObjectLiteralExpression:
|
672 | _type = KindType.OBJECT;
|
673 | break;
|
674 | }
|
675 | return _type;
|
676 | }
|
677 |
|
678 | var tsany = ts__namespace;
|
679 | // https://github.com/Microsoft/TypeScript/blob/v2.1.4/src/compiler/utilities.ts#L1423
|
680 | function getJSDocCommentRanges(node, text) {
|
681 | return tsany.getJSDocCommentRanges.apply(this, arguments);
|
682 | }
|
683 |
|
684 | var JsdocParserUtil = /** @class */ (function () {
|
685 | function JsdocParserUtil() {
|
686 | }
|
687 | JsdocParserUtil.prototype.isVariableLike = function (node) {
|
688 | if (node) {
|
689 | switch (node.kind) {
|
690 | case tsMorph.SyntaxKind.BindingElement:
|
691 | case tsMorph.SyntaxKind.EnumMember:
|
692 | case tsMorph.SyntaxKind.Parameter:
|
693 | case tsMorph.SyntaxKind.PropertyAssignment:
|
694 | case tsMorph.SyntaxKind.PropertyDeclaration:
|
695 | case tsMorph.SyntaxKind.PropertySignature:
|
696 | case tsMorph.SyntaxKind.ShorthandPropertyAssignment:
|
697 | case tsMorph.SyntaxKind.VariableDeclaration:
|
698 | return true;
|
699 | }
|
700 | }
|
701 | return false;
|
702 | };
|
703 | JsdocParserUtil.prototype.isTopmostModuleDeclaration = function (node) {
|
704 | if (node.nextContainer && node.nextContainer.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
|
705 | var next = node.nextContainer;
|
706 | if (node.name.end + 1 === next.name.pos) {
|
707 | return false;
|
708 | }
|
709 | }
|
710 | return true;
|
711 | };
|
712 | JsdocParserUtil.prototype.getRootModuleDeclaration = function (node) {
|
713 | while (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
|
714 | var parent = node.parent;
|
715 | if (node.name.pos === parent.name.end + 1) {
|
716 | node = parent;
|
717 | }
|
718 | else {
|
719 | break;
|
720 | }
|
721 | }
|
722 | return node;
|
723 | };
|
724 | JsdocParserUtil.prototype.getMainCommentOfNode = function (node, sourceFile) {
|
725 | var description = '';
|
726 | if (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.VariableDeclarationList) {
|
727 | node = node.parent.parent;
|
728 | }
|
729 | else if (node.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
|
730 | if (!this.isTopmostModuleDeclaration(node)) {
|
731 | return null;
|
732 | }
|
733 | else {
|
734 | node = this.getRootModuleDeclaration(node);
|
735 | }
|
736 | }
|
737 | var comments = getJSDocCommentRanges(node, sourceFile.text);
|
738 | if (comments && comments.length) {
|
739 | var comment = void 0;
|
740 | if (node.kind === tsMorph.ts.SyntaxKind.SourceFile) {
|
741 | if (comments.length === 1) {
|
742 | return null;
|
743 | }
|
744 | comment = comments[0];
|
745 | }
|
746 | else {
|
747 | comment = comments[comments.length - 1];
|
748 | }
|
749 | description = sourceFile.text.substring(comment.pos, comment.end);
|
750 | }
|
751 | return description;
|
752 | };
|
753 | JsdocParserUtil.prototype.parseComment = function (text) {
|
754 | var comment = '';
|
755 | var shortText = 0;
|
756 | function readBareLine(line) {
|
757 | comment += '\n' + line;
|
758 | if (line === '' && shortText === 0) ;
|
759 | else if (line === '' && shortText === 1) {
|
760 | shortText = 2;
|
761 | }
|
762 | else {
|
763 | if (shortText === 2) {
|
764 | comment += (comment === '' ? '' : '\n') + line;
|
765 | }
|
766 | }
|
767 | }
|
768 | var CODE_FENCE = /^\s*```(?!.*```)/;
|
769 | var inCode = false;
|
770 | var inExample = false; // first line with @example, end line with empty string or string or */
|
771 | function readLine(line, index) {
|
772 | line = line.replace(/^\s*\*? ?/, '');
|
773 | line = line.replace(/\s*$/, '');
|
774 | if (CODE_FENCE.test(line)) {
|
775 | inCode = !inCode;
|
776 | }
|
777 | if (line.indexOf('@example') !== -1) {
|
778 | inExample = true;
|
779 | line = '```html';
|
780 | }
|
781 | if (inExample && line === '') {
|
782 | inExample = false;
|
783 | line = '```';
|
784 | }
|
785 | if (!inCode) {
|
786 | var tag = /^@(\S+)/.exec(line);
|
787 | var SeeTag = /^@see/.exec(line);
|
788 | if (SeeTag) {
|
789 | line = line.replace(/^@see/, 'See');
|
790 | }
|
791 | if (tag && !SeeTag) {
|
792 | return;
|
793 | }
|
794 | }
|
795 | readBareLine(line);
|
796 | }
|
797 | text = text.replace(/^\s*\/\*+/, '');
|
798 | text = text.replace(/\*+\/\s*$/, '');
|
799 | text.split(/\r\n?|\n/).length;
|
800 | text.split(/\r\n?|\n/).forEach(readLine);
|
801 | return comment;
|
802 | };
|
803 | JsdocParserUtil.prototype.getJSDocTags = function (node, kind) {
|
804 | var e_1, _a;
|
805 | var docs = this.getJSDocs(node);
|
806 | if (docs) {
|
807 | var result = [];
|
808 | try {
|
809 | for (var docs_1 = __values(docs), docs_1_1 = docs_1.next(); !docs_1_1.done; docs_1_1 = docs_1.next()) {
|
810 | var doc = docs_1_1.value;
|
811 | if (tsMorph.ts.isJSDocParameterTag(doc)) {
|
812 | if (doc.kind === kind) {
|
813 | result.push(doc);
|
814 | }
|
815 | }
|
816 | else if (tsMorph.ts.isJSDoc(doc)) {
|
817 | result.push.apply(result, __spreadArray([], __read(___namespace.filter(doc.tags, function (tag) { return tag.kind === kind; })), false));
|
818 | }
|
819 | else {
|
820 | throw new Error('Unexpected type');
|
821 | }
|
822 | }
|
823 | }
|
824 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
825 | finally {
|
826 | try {
|
827 | if (docs_1_1 && !docs_1_1.done && (_a = docs_1["return"])) _a.call(docs_1);
|
828 | }
|
829 | finally { if (e_1) throw e_1.error; }
|
830 | }
|
831 | return result;
|
832 | }
|
833 | };
|
834 | JsdocParserUtil.prototype.getJSDocs = function (node) {
|
835 | // TODO: jsDocCache is internal, see if there's a way around it
|
836 | var cache = node.jsDocCache;
|
837 | if (!cache) {
|
838 | cache = this.getJSDocsWorker(node, []).filter(function (x) { return x; });
|
839 | node.jsDocCache = cache;
|
840 | }
|
841 | return cache;
|
842 | };
|
843 | // Try to recognize this pattern when node is initializer
|
844 | // of variable declaration and JSDoc comments are on containing variable statement.
|
845 | // /**
|
846 | // * @param {number} name
|
847 | // * @returns {number}
|
848 | // */
|
849 | // var x = function(name) { return name.length; }
|
850 | JsdocParserUtil.prototype.getJSDocsWorker = function (node, cache) {
|
851 | var parent = node.parent;
|
852 | var isInitializerOfVariableDeclarationInStatement = this.isVariableLike(parent) &&
|
853 | parent.initializer === node &&
|
854 | tsMorph.ts.isVariableStatement(parent.parent.parent);
|
855 | var isVariableOfVariableDeclarationStatement = this.isVariableLike(node) && tsMorph.ts.isVariableStatement(parent.parent);
|
856 | var variableStatementNode = isInitializerOfVariableDeclarationInStatement
|
857 | ? parent.parent.parent
|
858 | : isVariableOfVariableDeclarationStatement
|
859 | ? parent.parent
|
860 | : undefined;
|
861 | if (variableStatementNode) {
|
862 | cache = this.getJSDocsWorker(variableStatementNode, cache);
|
863 | }
|
864 | // Also recognize when the node is the RHS of an assignment expression
|
865 | var isSourceOfAssignmentExpressionStatement = parent &&
|
866 | parent.parent &&
|
867 | tsMorph.ts.isBinaryExpression(parent) &&
|
868 | parent.operatorToken.kind === tsMorph.SyntaxKind.EqualsToken &&
|
869 | tsMorph.ts.isExpressionStatement(parent.parent);
|
870 | if (isSourceOfAssignmentExpressionStatement) {
|
871 | cache = this.getJSDocsWorker(parent.parent, cache);
|
872 | }
|
873 | var isModuleDeclaration = tsMorph.ts.isModuleDeclaration(node) && parent && tsMorph.ts.isModuleDeclaration(parent);
|
874 | var isPropertyAssignmentExpression = parent && tsMorph.ts.isPropertyAssignment(parent);
|
875 | if (isModuleDeclaration || isPropertyAssignmentExpression) {
|
876 | cache = this.getJSDocsWorker(parent, cache);
|
877 | }
|
878 | // Pull parameter comments from declaring function as well
|
879 | if (tsMorph.ts.isParameter(node)) {
|
880 | cache = ___namespace.concat(cache, this.getJSDocParameterTags(node));
|
881 | }
|
882 | if (this.isVariableLike(node) && node.initializer) {
|
883 | cache = ___namespace.concat(cache, node.initializer.jsDoc);
|
884 | }
|
885 | cache = ___namespace.concat(cache, node.jsDoc);
|
886 | return cache;
|
887 | };
|
888 | JsdocParserUtil.prototype.getJSDocParameterTags = function (param) {
|
889 | var func = param.parent;
|
890 | var tags = this.getJSDocTags(func, tsMorph.SyntaxKind.JSDocParameterTag);
|
891 | if (!param.name) {
|
892 | // this is an anonymous jsdoc param from a `function(type1, type2): type3` specification
|
893 | var i = func.parameters.indexOf(param);
|
894 | var paramTags = ___namespace.filter(tags, function (tag) { return tsMorph.ts.isJSDocParameterTag(tag); });
|
895 | if (paramTags && 0 <= i && i < paramTags.length) {
|
896 | return [paramTags[i]];
|
897 | }
|
898 | }
|
899 | else if (tsMorph.ts.isIdentifier(param.name)) {
|
900 | var name_1 = param.name.text;
|
901 | return ___namespace.filter(tags, function (tag) {
|
902 | if (tsMorph.ts && tsMorph.ts.isJSDocParameterTag(tag)) {
|
903 | var t = tag;
|
904 | if (typeof t.parameterName !== 'undefined') {
|
905 | return t.parameterName.text === name_1;
|
906 | }
|
907 | else if (typeof t.name !== 'undefined') {
|
908 | if (typeof t.name.escapedText !== 'undefined') {
|
909 | return t.name.escapedText === name_1;
|
910 | }
|
911 | }
|
912 | }
|
913 | });
|
914 | }
|
915 | else {
|
916 | // TODO: it's a destructured parameter, so it should look up an "object type" series of multiple lines
|
917 | // But multi-line object types aren't supported yet either
|
918 | return undefined;
|
919 | }
|
920 | };
|
921 | JsdocParserUtil.prototype.parseJSDocNode = function (node) {
|
922 | var rawDescription = '';
|
923 | if (typeof node.comment === 'string') {
|
924 | rawDescription += node.comment;
|
925 | }
|
926 | else {
|
927 | if (node.comment) {
|
928 | var len = node.comment.length;
|
929 | for (var i = 0; i < len; i++) {
|
930 | var JSDocNode = node.comment[i];
|
931 | switch (JSDocNode.kind) {
|
932 | case tsMorph.SyntaxKind.JSDocComment:
|
933 | rawDescription += JSDocNode.comment;
|
934 | break;
|
935 | case tsMorph.SyntaxKind.JSDocText:
|
936 | rawDescription += JSDocNode.text;
|
937 | break;
|
938 | case tsMorph.SyntaxKind.JSDocLink:
|
939 | if (JSDocNode.name) {
|
940 | var text = JSDocNode.name.escapedText;
|
941 | if (text === undefined &&
|
942 | JSDocNode.name.left &&
|
943 | JSDocNode.name.right) {
|
944 | text =
|
945 | JSDocNode.name.left.escapedText +
|
946 | '.' +
|
947 | JSDocNode.name.right.escapedText;
|
948 | }
|
949 | rawDescription += JSDocNode.text + '{@link ' + text + '}';
|
950 | }
|
951 | break;
|
952 | }
|
953 | }
|
954 | }
|
955 | }
|
956 | return rawDescription;
|
957 | };
|
958 | return JsdocParserUtil;
|
959 | }());
|
960 |
|
961 | var getCurrentDirectory = tsMorph.ts.sys.getCurrentDirectory;
|
962 | var useCaseSensitiveFileNames = tsMorph.ts.sys.useCaseSensitiveFileNames;
|
963 | var newLine = tsMorph.ts.sys.newLine;
|
964 | var marked$3 = require('marked').marked;
|
965 | function getNewLine() {
|
966 | return newLine;
|
967 | }
|
968 | function cleanNameWithoutSpaceAndToLowerCase(name) {
|
969 | return name.toLowerCase().replace(/ /g, '-');
|
970 | }
|
971 | function getCanonicalFileName(fileName) {
|
972 | return useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
|
973 | }
|
974 | var formatDiagnosticsHost = {
|
975 | getCurrentDirectory: getCurrentDirectory,
|
976 | getCanonicalFileName: getCanonicalFileName,
|
977 | getNewLine: getNewLine
|
978 | };
|
979 | function markedtags(tags) {
|
980 | var jsdocParserUtil = new JsdocParserUtil();
|
981 | var mtags = tags;
|
982 | ___namespace.forEach(mtags, function (tag) {
|
983 | var rawComment = jsdocParserUtil.parseJSDocNode(tag);
|
984 | tag.comment = marked$3(LinkParser.resolveLinks(rawComment));
|
985 | });
|
986 | return mtags;
|
987 | }
|
988 | function mergeTagsAndArgs(args, jsdoctags) {
|
989 | var margs = ___namespace.cloneDeep(args);
|
990 | ___namespace.forEach(margs, function (arg) {
|
991 | arg.tagName = {
|
992 | text: 'param'
|
993 | };
|
994 | if (jsdoctags) {
|
995 | ___namespace.forEach(jsdoctags, function (jsdoctag) {
|
996 | if (jsdoctag.name && jsdoctag.name.text === arg.name) {
|
997 | arg.tagName = jsdoctag.tagName;
|
998 | arg.name = jsdoctag.name;
|
999 | arg.comment = jsdoctag.comment;
|
1000 | arg.typeExpression = jsdoctag.typeExpression;
|
1001 | }
|
1002 | });
|
1003 | }
|
1004 | });
|
1005 | // Add example & returns & private
|
1006 | if (jsdoctags) {
|
1007 | ___namespace.forEach(jsdoctags, function (jsdoctag) {
|
1008 | if (jsdoctag.tagName &&
|
1009 | (jsdoctag.tagName.text === 'example' || jsdoctag.tagName.text === 'private')) {
|
1010 | margs.push({
|
1011 | tagName: jsdoctag.tagName,
|
1012 | comment: jsdoctag.comment
|
1013 | });
|
1014 | }
|
1015 | if (jsdoctag.tagName &&
|
1016 | (jsdoctag.tagName.text === 'returns' || jsdoctag.tagName.text === 'return')) {
|
1017 | var ret = {
|
1018 | tagName: jsdoctag.tagName,
|
1019 | comment: jsdoctag.comment
|
1020 | };
|
1021 | if (jsdoctag.typeExpression && jsdoctag.typeExpression.type) {
|
1022 | ret.returnType = kindToType(jsdoctag.typeExpression.type.kind);
|
1023 | }
|
1024 | margs.push(ret);
|
1025 | }
|
1026 | });
|
1027 | }
|
1028 | return margs;
|
1029 | }
|
1030 | function readConfig(configFile) {
|
1031 | var result = tsMorph.ts.readConfigFile(configFile, tsMorph.ts.sys.readFile);
|
1032 | if (result.error) {
|
1033 | var message = tsMorph.ts.formatDiagnostics([result.error], formatDiagnosticsHost);
|
1034 | throw new Error(message);
|
1035 | }
|
1036 | return result.config;
|
1037 | }
|
1038 | function stripBom(source) {
|
1039 | if (source.charCodeAt(0) === 0xfeff) {
|
1040 | return source.slice(1);
|
1041 | }
|
1042 | return source;
|
1043 | }
|
1044 | function hasBom(source) {
|
1045 | return source.charCodeAt(0) === 0xfeff;
|
1046 | }
|
1047 | function cleanLifecycleHooksFromMethods(methods) {
|
1048 | var result = [];
|
1049 | if (typeof methods !== 'undefined') {
|
1050 | var i = 0;
|
1051 | var len = methods.length;
|
1052 | for (i; i < len; i++) {
|
1053 | if (!(methods[i].name in AngularLifecycleHooks)) {
|
1054 | result.push(methods[i]);
|
1055 | }
|
1056 | }
|
1057 | }
|
1058 | return result;
|
1059 | }
|
1060 | function cleanSourcesForWatch(list) {
|
1061 | return list.filter(function (element) {
|
1062 | if (fs__namespace.existsSync(process.cwd() + path__namespace.sep + element)) {
|
1063 | return element;
|
1064 | }
|
1065 | });
|
1066 | }
|
1067 | function getNamesCompareFn(name) {
|
1068 | /**
|
1069 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
1070 | */
|
1071 | name = name || 'name';
|
1072 | var t = function (a, b) {
|
1073 | if (a[name]) {
|
1074 | return a[name].localeCompare(b[name]);
|
1075 | }
|
1076 | else {
|
1077 | return 0;
|
1078 | }
|
1079 | };
|
1080 | return t;
|
1081 | }
|
1082 | function isIgnore(member) {
|
1083 | var e_1, _a, e_2, _b;
|
1084 | if (member.jsDoc) {
|
1085 | try {
|
1086 | for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
|
1087 | var doc = _d.value;
|
1088 | if (doc.tags) {
|
1089 | try {
|
1090 | for (var _e = (e_2 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
1091 | var tag = _f.value;
|
1092 | if (tag.tagName.text.indexOf('ignore') > -1) {
|
1093 | return true;
|
1094 | }
|
1095 | }
|
1096 | }
|
1097 | catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
1098 | finally {
|
1099 | try {
|
1100 | if (_f && !_f.done && (_b = _e["return"])) _b.call(_e);
|
1101 | }
|
1102 | finally { if (e_2) throw e_2.error; }
|
1103 | }
|
1104 | }
|
1105 | }
|
1106 | }
|
1107 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
1108 | finally {
|
1109 | try {
|
1110 | if (_d && !_d.done && (_a = _c["return"])) _a.call(_c);
|
1111 | }
|
1112 | finally { if (e_1) throw e_1.error; }
|
1113 | }
|
1114 | }
|
1115 | return false;
|
1116 | }
|
1117 | // https://tc39.github.io/ecma262/#sec-array.prototype.includes
|
1118 | if (!Array.prototype.includes) {
|
1119 | Object.defineProperty(Array.prototype, 'includes', {
|
1120 | value: function (searchElement, fromIndex) {
|
1121 | if (this == null) {
|
1122 | throw new TypeError('"this" is null or not defined');
|
1123 | }
|
1124 | // 1. Let O be ? ToObject(this value).
|
1125 | var o = Object(this);
|
1126 | // 2. Let len be ? ToLength(? Get(O, "length")).
|
1127 | var len = o.length >>> 0;
|
1128 | // 3. If len is 0, return false.
|
1129 | if (len === 0) {
|
1130 | return false;
|
1131 | }
|
1132 | // 4. Let n be ? ToInteger(fromIndex).
|
1133 | // (If fromIndex is undefined, this step produces the value 0.)
|
1134 | var n = fromIndex | 0;
|
1135 | // 5. If n ≥ 0, then
|
1136 | // a. Let k be n.
|
1137 | // 6. Else n < 0,
|
1138 | // a. Let k be len + n.
|
1139 | // b. If k < 0, let k be 0.
|
1140 | var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
1141 | function sameValueZero(x, y) {
|
1142 | return (x === y ||
|
1143 | (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)));
|
1144 | }
|
1145 | // 7. Repeat, while k < len
|
1146 | while (k < len) {
|
1147 | // a. Let elementK be the result of ? Get(O, ! ToString(k)).
|
1148 | // b. If SameValueZero(searchElement, elementK) is true, return true.
|
1149 | if (sameValueZero(o[k], searchElement)) {
|
1150 | return true;
|
1151 | }
|
1152 | // c. Increase k by 1.
|
1153 | k++;
|
1154 | }
|
1155 | // 8. Return false
|
1156 | return false;
|
1157 | }
|
1158 | });
|
1159 | }
|
1160 | function findMainSourceFolder(files) {
|
1161 | var mainFolder = '';
|
1162 | var mainFolderCount = 0;
|
1163 | var rawFolders = files.map(function (filepath) {
|
1164 | var shortPath = filepath.replace(process.cwd() + path__namespace.sep, '');
|
1165 | return path__namespace.dirname(shortPath);
|
1166 | });
|
1167 | var folders = {};
|
1168 | rawFolders = ___namespace.uniq(rawFolders);
|
1169 | for (var i = 0; i < rawFolders.length; i++) {
|
1170 | var sep = rawFolders[i].split(path__namespace.sep);
|
1171 | sep.forEach(function (folder) {
|
1172 | if (folders[folder]) {
|
1173 | folders[folder] += 1;
|
1174 | }
|
1175 | else {
|
1176 | folders[folder] = 1;
|
1177 | }
|
1178 | });
|
1179 | }
|
1180 | for (var f in folders) {
|
1181 | if (folders[f] > mainFolderCount) {
|
1182 | mainFolderCount = folders[f];
|
1183 | mainFolder = f;
|
1184 | }
|
1185 | }
|
1186 | return mainFolder;
|
1187 | }
|
1188 | // Create a compilerHost object to allow the compiler to read and write files
|
1189 | function compilerHost(transpileOptions) {
|
1190 | var inputFileName = transpileOptions.fileName || (transpileOptions.jsx ? 'module.tsx' : 'module.ts');
|
1191 | var toReturn = {
|
1192 | getSourceFile: function (fileName) {
|
1193 | if (fileName.lastIndexOf('.ts') !== -1 || fileName.lastIndexOf('.js') !== -1) {
|
1194 | if (fileName === 'lib.d.ts') {
|
1195 | return undefined;
|
1196 | }
|
1197 | if (fileName.substr(-5) === '.d.ts') {
|
1198 | return undefined;
|
1199 | }
|
1200 | if (path__namespace.isAbsolute(fileName) === false) {
|
1201 | fileName = path__namespace.join(transpileOptions.tsconfigDirectory, fileName);
|
1202 | }
|
1203 | if (!fs__namespace.existsSync(fileName)) {
|
1204 | return undefined;
|
1205 | }
|
1206 | var libSource = '';
|
1207 | try {
|
1208 | libSource = fs__namespace.readFileSync(fileName).toString();
|
1209 | if (hasBom(libSource)) {
|
1210 | libSource = stripBom(libSource);
|
1211 | }
|
1212 | }
|
1213 | catch (e) {
|
1214 | logger.debug(e, fileName);
|
1215 | }
|
1216 | return tsMorph.ts.createSourceFile(fileName, libSource, transpileOptions.target, false);
|
1217 | }
|
1218 | return undefined;
|
1219 | },
|
1220 | writeFile: function (name, text) { },
|
1221 | getDefaultLibFileName: function () { return 'lib.d.ts'; },
|
1222 | useCaseSensitiveFileNames: function () { return false; },
|
1223 | getCanonicalFileName: function (fileName) { return fileName; },
|
1224 | getCurrentDirectory: function () { return ''; },
|
1225 | getNewLine: function () { return '\n'; },
|
1226 | fileExists: function (fileName) { return fileName === inputFileName; },
|
1227 | readFile: function () { return ''; },
|
1228 | directoryExists: function () { return true; },
|
1229 | getDirectories: function () { return []; }
|
1230 | };
|
1231 | return toReturn;
|
1232 | }
|
1233 | function detectIndent(str, count) {
|
1234 | var stripIndent = function (stripedString) {
|
1235 | var match = stripedString.match(/^[ \t]*(?=\S)/gm);
|
1236 | if (!match) {
|
1237 | return stripedString;
|
1238 | }
|
1239 | // TODO: use spread operator when targeting Node.js 6
|
1240 | var indent = Math.min.apply(Math, match.map(function (x) { return x.length; })); // eslint-disable-line
|
1241 | var re = new RegExp("^[ \\t]{" + indent + "}", 'gm');
|
1242 | return indent > 0 ? stripedString.replace(re, '') : stripedString;
|
1243 | };
|
1244 | var repeating = function (n, repeatString) {
|
1245 | repeatString = repeatString === undefined ? ' ' : repeatString;
|
1246 | if (typeof repeatString !== 'string') {
|
1247 | throw new TypeError("Expected `input` to be a `string`, got `" + typeof repeatString + "`");
|
1248 | }
|
1249 | if (n < 0) {
|
1250 | throw new TypeError("Expected `count` to be a positive finite number, got `" + n + "`");
|
1251 | }
|
1252 | var ret = '';
|
1253 | do {
|
1254 | if (n & 1) {
|
1255 | ret += repeatString;
|
1256 | }
|
1257 | repeatString += repeatString;
|
1258 | } while ((n >>= 1));
|
1259 | return ret;
|
1260 | };
|
1261 | var indentString = function (indentedString, indentCount) {
|
1262 | var indent = ' ';
|
1263 | indentCount = indentCount === undefined ? 1 : indentCount;
|
1264 | if (typeof indentedString !== 'string') {
|
1265 | throw new TypeError("Expected `input` to be a `string`, got `" + typeof indentedString + "`");
|
1266 | }
|
1267 | if (typeof indentCount !== 'number') {
|
1268 | throw new TypeError("Expected `count` to be a `number`, got `" + typeof indentCount + "`");
|
1269 | }
|
1270 | if (typeof indent !== 'string') {
|
1271 | throw new TypeError("Expected `indent` to be a `string`, got `" + typeof indent + "`");
|
1272 | }
|
1273 | if (indentCount === 0) {
|
1274 | return indentedString;
|
1275 | }
|
1276 | indent = indentCount > 1 ? repeating(indentCount, indent) : indent;
|
1277 | return indentedString.replace(/^(?!\s*$)/gm, indent);
|
1278 | };
|
1279 | return indentString(stripIndent(str), count || 0);
|
1280 | }
|
1281 | var IGNORED_DIRECTORIES = ['.git', 'node_modules'];
|
1282 | function ignoreDirectory(dir) {
|
1283 | var base = path__namespace.basename(dir);
|
1284 | if (IGNORED_DIRECTORIES.includes(base))
|
1285 | return true;
|
1286 | try {
|
1287 | fs__namespace.accessSync(dir, fs__namespace.constants.W_OK);
|
1288 | }
|
1289 | catch (err) {
|
1290 | logger.warn('Ignoring inaccessible folder', dir);
|
1291 | return true;
|
1292 | }
|
1293 | return false;
|
1294 | }
|
1295 |
|
1296 | var traverse$3 = require('traverse');
|
1297 | var DependenciesEngine = /** @class */ (function () {
|
1298 | function DependenciesEngine() {
|
1299 | this.miscellaneous = {
|
1300 | variables: [],
|
1301 | functions: [],
|
1302 | typealiases: [],
|
1303 | enumerations: [],
|
1304 | groupedVariables: [],
|
1305 | groupedFunctions: [],
|
1306 | groupedEnumerations: [],
|
1307 | groupedTypeAliases: []
|
1308 | };
|
1309 | }
|
1310 | DependenciesEngine.getInstance = function () {
|
1311 | if (!DependenciesEngine.instance) {
|
1312 | DependenciesEngine.instance = new DependenciesEngine();
|
1313 | }
|
1314 | return DependenciesEngine.instance;
|
1315 | };
|
1316 | DependenciesEngine.prototype.updateModulesDeclarationsExportsTypes = function () {
|
1317 | var _this = this;
|
1318 | var mergeTypes = function (entry) {
|
1319 | var directive = _this.findInCompodocDependencies(entry.name, _this.directives, entry.file);
|
1320 | if (typeof directive.data !== 'undefined') {
|
1321 | entry.type = 'directive';
|
1322 | entry.id = directive.data.id;
|
1323 | }
|
1324 | var component = _this.findInCompodocDependencies(entry.name, _this.components, entry.file);
|
1325 | if (typeof component.data !== 'undefined') {
|
1326 | entry.type = 'component';
|
1327 | entry.id = component.data.id;
|
1328 | }
|
1329 | var pipe = _this.findInCompodocDependencies(entry.name, _this.pipes, entry.file);
|
1330 | if (typeof pipe.data !== 'undefined') {
|
1331 | entry.type = 'pipe';
|
1332 | entry.id = pipe.data.id;
|
1333 | }
|
1334 | };
|
1335 | this.modules.forEach(function (module) {
|
1336 | module.declarations.forEach(function (declaration) {
|
1337 | mergeTypes(declaration);
|
1338 | });
|
1339 | module.exports.forEach(function (expt) {
|
1340 | mergeTypes(expt);
|
1341 | });
|
1342 | module.entryComponents.forEach(function (ent) {
|
1343 | mergeTypes(ent);
|
1344 | });
|
1345 | });
|
1346 | };
|
1347 | DependenciesEngine.prototype.init = function (data) {
|
1348 | traverse$3(data).forEach(function (node) {
|
1349 | if (node) {
|
1350 | if (node.parent) {
|
1351 | delete node.parent;
|
1352 | }
|
1353 | if (node.initializer) {
|
1354 | delete node.initializer;
|
1355 | }
|
1356 | }
|
1357 | });
|
1358 | this.rawData = data;
|
1359 | this.modules = ___namespace.sortBy(this.rawData.modules, [function (el) { return el.name.toLowerCase(); }]);
|
1360 | this.rawModulesForOverview = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
|
1361 | this.rawModules = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
|
1362 | this.components = ___namespace.sortBy(this.rawData.components, [function (el) { return el.name.toLowerCase(); }]);
|
1363 | this.controllers = ___namespace.sortBy(this.rawData.controllers, [function (el) { return el.name.toLowerCase(); }]);
|
1364 | this.entities = ___namespace.sortBy(this.rawData.entities, [function (el) { return el.name.toLowerCase(); }]);
|
1365 | this.directives = ___namespace.sortBy(this.rawData.directives, [function (el) { return el.name.toLowerCase(); }]);
|
1366 | this.injectables = ___namespace.sortBy(this.rawData.injectables, [function (el) { return el.name.toLowerCase(); }]);
|
1367 | this.interceptors = ___namespace.sortBy(this.rawData.interceptors, [function (el) { return el.name.toLowerCase(); }]);
|
1368 | this.guards = ___namespace.sortBy(this.rawData.guards, [function (el) { return el.name.toLowerCase(); }]);
|
1369 | this.interfaces = ___namespace.sortBy(this.rawData.interfaces, [function (el) { return el.name.toLowerCase(); }]);
|
1370 | this.pipes = ___namespace.sortBy(this.rawData.pipes, [function (el) { return el.name.toLowerCase(); }]);
|
1371 | this.classes = ___namespace.sortBy(this.rawData.classes, [function (el) { return el.name.toLowerCase(); }]);
|
1372 | this.miscellaneous = this.rawData.miscellaneous;
|
1373 | this.prepareMiscellaneous();
|
1374 | this.updateModulesDeclarationsExportsTypes();
|
1375 | this.routes = this.rawData.routesTree;
|
1376 | this.manageDuplicatesName();
|
1377 | this.cleanRawModulesNames();
|
1378 | };
|
1379 | DependenciesEngine.prototype.cleanRawModulesNames = function () {
|
1380 | this.rawModulesForOverview = this.rawModulesForOverview.map(function (module) {
|
1381 | module.name = module.name.replace('$', '');
|
1382 | return module;
|
1383 | });
|
1384 | };
|
1385 | DependenciesEngine.prototype.findInCompodocDependencies = function (name, data, file) {
|
1386 | var _result = {
|
1387 | source: 'internal',
|
1388 | data: undefined
|
1389 | };
|
1390 | var nameFoundCounter = 0;
|
1391 | if (data && data.length > 0) {
|
1392 | for (var i = 0; i < data.length; i++) {
|
1393 | if (typeof name !== 'undefined') {
|
1394 | if (typeof file !== 'undefined') {
|
1395 | if (name.indexOf(data[i].name) !== -1 &&
|
1396 | file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
|
1397 | nameFoundCounter += 1;
|
1398 | _result.data = data[i];
|
1399 | }
|
1400 | }
|
1401 | else {
|
1402 | if (name.indexOf(data[i].name) !== -1) {
|
1403 | nameFoundCounter += 1;
|
1404 | _result.data = data[i];
|
1405 | }
|
1406 | }
|
1407 | }
|
1408 | }
|
1409 | // Prevent wrong matching like MultiSelectOptionDirective with SelectOptionDirective, or QueryParamGroupService with QueryParamGroup
|
1410 | if (nameFoundCounter > 1) {
|
1411 | var found = false;
|
1412 | for (var i = 0; i < data.length; i++) {
|
1413 | if (typeof name !== 'undefined') {
|
1414 | if (typeof file !== 'undefined') {
|
1415 | if (name === data[i].name &&
|
1416 | file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
|
1417 | found = true;
|
1418 | _result.data = data[i];
|
1419 | }
|
1420 | }
|
1421 | else {
|
1422 | if (name === data[i].name) {
|
1423 | found = true;
|
1424 | _result.data = data[i];
|
1425 | }
|
1426 | }
|
1427 | }
|
1428 | }
|
1429 | if (!found) {
|
1430 | _result = {
|
1431 | source: 'internal',
|
1432 | data: undefined
|
1433 | };
|
1434 | }
|
1435 | }
|
1436 | }
|
1437 | return _result;
|
1438 | };
|
1439 | DependenciesEngine.prototype.manageDuplicatesName = function () {
|
1440 | var processDuplicates = function (element, index, array) {
|
1441 | var elementsWithSameName = ___namespace.filter(array, { name: element.name });
|
1442 | if (elementsWithSameName.length > 1) {
|
1443 | // First element is the reference for duplicates
|
1444 | for (var i = 1; i < elementsWithSameName.length; i++) {
|
1445 | var elementToEdit = elementsWithSameName[i];
|
1446 | if (typeof elementToEdit.isDuplicate === 'undefined') {
|
1447 | elementToEdit.isDuplicate = true;
|
1448 | elementToEdit.duplicateId = i;
|
1449 | elementToEdit.duplicateName =
|
1450 | elementToEdit.name + '-' + elementToEdit.duplicateId;
|
1451 | elementToEdit.id = elementToEdit.id + '-' + elementToEdit.duplicateId;
|
1452 | }
|
1453 | }
|
1454 | }
|
1455 | return element;
|
1456 | };
|
1457 | this.classes = this.classes.map(processDuplicates);
|
1458 | this.interfaces = this.interfaces.map(processDuplicates);
|
1459 | this.injectables = this.injectables.map(processDuplicates);
|
1460 | this.pipes = this.pipes.map(processDuplicates);
|
1461 | this.interceptors = this.interceptors.map(processDuplicates);
|
1462 | this.guards = this.guards.map(processDuplicates);
|
1463 | this.modules = this.modules.map(processDuplicates);
|
1464 | this.components = this.components.map(processDuplicates);
|
1465 | this.controllers = this.controllers.map(processDuplicates);
|
1466 | this.entities = this.entities.map(processDuplicates);
|
1467 | this.directives = this.directives.map(processDuplicates);
|
1468 | };
|
1469 | DependenciesEngine.prototype.find = function (name) {
|
1470 | var e_1, _a;
|
1471 | var _this = this;
|
1472 | var searchFunctions = [
|
1473 | function () { return _this.findInCompodocDependencies(name, _this.injectables); },
|
1474 | function () { return _this.findInCompodocDependencies(name, _this.interceptors); },
|
1475 | function () { return _this.findInCompodocDependencies(name, _this.guards); },
|
1476 | function () { return _this.findInCompodocDependencies(name, _this.interfaces); },
|
1477 | function () { return _this.findInCompodocDependencies(name, _this.classes); },
|
1478 | function () { return _this.findInCompodocDependencies(name, _this.components); },
|
1479 | function () { return _this.findInCompodocDependencies(name, _this.controllers); },
|
1480 | function () { return _this.findInCompodocDependencies(name, _this.entities); },
|
1481 | function () { return _this.findInCompodocDependencies(name, _this.directives); },
|
1482 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.variables); },
|
1483 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.functions); },
|
1484 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.typealiases); },
|
1485 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.enumerations); },
|
1486 | function () { return AngularApiUtil$1.findApi(name); }
|
1487 | ];
|
1488 | try {
|
1489 | for (var searchFunctions_1 = __values(searchFunctions), searchFunctions_1_1 = searchFunctions_1.next(); !searchFunctions_1_1.done; searchFunctions_1_1 = searchFunctions_1.next()) {
|
1490 | var searchFunction = searchFunctions_1_1.value;
|
1491 | var result = searchFunction();
|
1492 | if (result.data) {
|
1493 | return result;
|
1494 | }
|
1495 | }
|
1496 | }
|
1497 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
1498 | finally {
|
1499 | try {
|
1500 | if (searchFunctions_1_1 && !searchFunctions_1_1.done && (_a = searchFunctions_1["return"])) _a.call(searchFunctions_1);
|
1501 | }
|
1502 | finally { if (e_1) throw e_1.error; }
|
1503 | }
|
1504 | return undefined;
|
1505 | };
|
1506 | DependenciesEngine.prototype.update = function (updatedData) {
|
1507 | var _this = this;
|
1508 | if (updatedData.modules.length > 0) {
|
1509 | ___namespace.forEach(updatedData.modules, function (module) {
|
1510 | var _index = ___namespace.findIndex(_this.modules, { name: module.name });
|
1511 | _this.modules[_index] = module;
|
1512 | });
|
1513 | }
|
1514 | if (updatedData.components.length > 0) {
|
1515 | ___namespace.forEach(updatedData.components, function (component) {
|
1516 | var _index = ___namespace.findIndex(_this.components, { name: component.name });
|
1517 | _this.components[_index] = component;
|
1518 | });
|
1519 | }
|
1520 | if (updatedData.controllers.length > 0) {
|
1521 | ___namespace.forEach(updatedData.controllers, function (controller) {
|
1522 | var _index = ___namespace.findIndex(_this.controllers, { name: controller.name });
|
1523 | _this.controllers[_index] = controller;
|
1524 | });
|
1525 | }
|
1526 | if (updatedData.entities.length > 0) {
|
1527 | ___namespace.forEach(updatedData.entities, function (entity) {
|
1528 | var _index = ___namespace.findIndex(_this.entities, { name: entity.name });
|
1529 | _this.entities[_index] = entity;
|
1530 | });
|
1531 | }
|
1532 | if (updatedData.directives.length > 0) {
|
1533 | ___namespace.forEach(updatedData.directives, function (directive) {
|
1534 | var _index = ___namespace.findIndex(_this.directives, { name: directive.name });
|
1535 | _this.directives[_index] = directive;
|
1536 | });
|
1537 | }
|
1538 | if (updatedData.injectables.length > 0) {
|
1539 | ___namespace.forEach(updatedData.injectables, function (injectable) {
|
1540 | var _index = ___namespace.findIndex(_this.injectables, { name: injectable.name });
|
1541 | _this.injectables[_index] = injectable;
|
1542 | });
|
1543 | }
|
1544 | if (updatedData.interceptors.length > 0) {
|
1545 | ___namespace.forEach(updatedData.interceptors, function (interceptor) {
|
1546 | var _index = ___namespace.findIndex(_this.interceptors, { name: interceptor.name });
|
1547 | _this.interceptors[_index] = interceptor;
|
1548 | });
|
1549 | }
|
1550 | if (updatedData.guards.length > 0) {
|
1551 | ___namespace.forEach(updatedData.guards, function (guard) {
|
1552 | var _index = ___namespace.findIndex(_this.guards, { name: guard.name });
|
1553 | _this.guards[_index] = guard;
|
1554 | });
|
1555 | }
|
1556 | if (updatedData.interfaces.length > 0) {
|
1557 | ___namespace.forEach(updatedData.interfaces, function (int) {
|
1558 | var _index = ___namespace.findIndex(_this.interfaces, { name: int.name });
|
1559 | _this.interfaces[_index] = int;
|
1560 | });
|
1561 | }
|
1562 | if (updatedData.pipes.length > 0) {
|
1563 | ___namespace.forEach(updatedData.pipes, function (pipe) {
|
1564 | var _index = ___namespace.findIndex(_this.pipes, { name: pipe.name });
|
1565 | _this.pipes[_index] = pipe;
|
1566 | });
|
1567 | }
|
1568 | if (updatedData.classes.length > 0) {
|
1569 | ___namespace.forEach(updatedData.classes, function (classe) {
|
1570 | var _index = ___namespace.findIndex(_this.classes, { name: classe.name });
|
1571 | _this.classes[_index] = classe;
|
1572 | });
|
1573 | }
|
1574 | /**
|
1575 | * Miscellaneous update
|
1576 | */
|
1577 | if (updatedData.miscellaneous.variables.length > 0) {
|
1578 | ___namespace.forEach(updatedData.miscellaneous.variables, function (variable) {
|
1579 | var _index = ___namespace.findIndex(_this.miscellaneous.variables, {
|
1580 | name: variable.name,
|
1581 | file: variable.file
|
1582 | });
|
1583 | _this.miscellaneous.variables[_index] = variable;
|
1584 | });
|
1585 | }
|
1586 | if (updatedData.miscellaneous.functions.length > 0) {
|
1587 | ___namespace.forEach(updatedData.miscellaneous.functions, function (func) {
|
1588 | var _index = ___namespace.findIndex(_this.miscellaneous.functions, {
|
1589 | name: func.name,
|
1590 | file: func.file
|
1591 | });
|
1592 | _this.miscellaneous.functions[_index] = func;
|
1593 | });
|
1594 | }
|
1595 | if (updatedData.miscellaneous.typealiases.length > 0) {
|
1596 | ___namespace.forEach(updatedData.miscellaneous.typealiases, function (typealias) {
|
1597 | var _index = ___namespace.findIndex(_this.miscellaneous.typealiases, {
|
1598 | name: typealias.name,
|
1599 | file: typealias.file
|
1600 | });
|
1601 | _this.miscellaneous.typealiases[_index] = typealias;
|
1602 | });
|
1603 | }
|
1604 | if (updatedData.miscellaneous.enumerations.length > 0) {
|
1605 | ___namespace.forEach(updatedData.miscellaneous.enumerations, function (enumeration) {
|
1606 | var _index = ___namespace.findIndex(_this.miscellaneous.enumerations, {
|
1607 | name: enumeration.name,
|
1608 | file: enumeration.file
|
1609 | });
|
1610 | _this.miscellaneous.enumerations[_index] = enumeration;
|
1611 | });
|
1612 | }
|
1613 | this.prepareMiscellaneous();
|
1614 | };
|
1615 | DependenciesEngine.prototype.findInCompodoc = function (name) {
|
1616 | var mergedData = ___namespace.concat([], this.modules, this.components, this.controllers, this.entities, this.directives, this.injectables, this.interceptors, this.guards, this.interfaces, this.pipes, this.classes, this.miscellaneous.enumerations, this.miscellaneous.typealiases, this.miscellaneous.variables, this.miscellaneous.functions);
|
1617 | var result = ___namespace.find(mergedData, { name: name });
|
1618 | return result || false;
|
1619 | };
|
1620 | DependenciesEngine.prototype.prepareMiscellaneous = function () {
|
1621 | this.miscellaneous.variables.sort(getNamesCompareFn());
|
1622 | this.miscellaneous.functions.sort(getNamesCompareFn());
|
1623 | this.miscellaneous.enumerations.sort(getNamesCompareFn());
|
1624 | this.miscellaneous.typealiases.sort(getNamesCompareFn());
|
1625 | // group each subgoup by file
|
1626 | this.miscellaneous.groupedVariables = ___namespace.groupBy(this.miscellaneous.variables, 'file');
|
1627 | this.miscellaneous.groupedFunctions = ___namespace.groupBy(this.miscellaneous.functions, 'file');
|
1628 | this.miscellaneous.groupedEnumerations = ___namespace.groupBy(this.miscellaneous.enumerations, 'file');
|
1629 | this.miscellaneous.groupedTypeAliases = ___namespace.groupBy(this.miscellaneous.typealiases, 'file');
|
1630 | };
|
1631 | DependenciesEngine.prototype.getModule = function (name) {
|
1632 | return ___namespace.find(this.modules, ['name', name]);
|
1633 | };
|
1634 | DependenciesEngine.prototype.getRawModule = function (name) {
|
1635 | return ___namespace.find(this.rawModules, ['name', name]);
|
1636 | };
|
1637 | DependenciesEngine.prototype.getModules = function () {
|
1638 | return this.modules;
|
1639 | };
|
1640 | DependenciesEngine.prototype.getComponents = function () {
|
1641 | return this.components;
|
1642 | };
|
1643 | DependenciesEngine.prototype.getControllers = function () {
|
1644 | return this.controllers;
|
1645 | };
|
1646 | DependenciesEngine.prototype.getEntities = function () {
|
1647 | return this.entities;
|
1648 | };
|
1649 | DependenciesEngine.prototype.getDirectives = function () {
|
1650 | return this.directives;
|
1651 | };
|
1652 | DependenciesEngine.prototype.getInjectables = function () {
|
1653 | return this.injectables;
|
1654 | };
|
1655 | DependenciesEngine.prototype.getInterceptors = function () {
|
1656 | return this.interceptors;
|
1657 | };
|
1658 | DependenciesEngine.prototype.getGuards = function () {
|
1659 | return this.guards;
|
1660 | };
|
1661 | DependenciesEngine.prototype.getInterfaces = function () {
|
1662 | return this.interfaces;
|
1663 | };
|
1664 | DependenciesEngine.prototype.getRoutes = function () {
|
1665 | return this.routes;
|
1666 | };
|
1667 | DependenciesEngine.prototype.getPipes = function () {
|
1668 | return this.pipes;
|
1669 | };
|
1670 | DependenciesEngine.prototype.getClasses = function () {
|
1671 | return this.classes;
|
1672 | };
|
1673 | DependenciesEngine.prototype.getMiscellaneous = function () {
|
1674 | return this.miscellaneous;
|
1675 | };
|
1676 | return DependenciesEngine;
|
1677 | }());
|
1678 | var DependenciesEngine$1 = DependenciesEngine.getInstance();
|
1679 |
|
1680 | var FileEngine = /** @class */ (function () {
|
1681 | function FileEngine() {
|
1682 | }
|
1683 | FileEngine.getInstance = function () {
|
1684 | if (!FileEngine.instance) {
|
1685 | FileEngine.instance = new FileEngine();
|
1686 | }
|
1687 | return FileEngine.instance;
|
1688 | };
|
1689 | FileEngine.prototype.get = function (filepath) {
|
1690 | return new Promise(function (resolve, reject) {
|
1691 | fs__namespace.readFile(path__namespace.resolve(filepath), 'utf8', function (err, data) {
|
1692 | if (err) {
|
1693 | reject('Error during ' + filepath + ' read');
|
1694 | }
|
1695 | else {
|
1696 | resolve(data);
|
1697 | }
|
1698 | });
|
1699 | });
|
1700 | };
|
1701 | FileEngine.prototype.write = function (filepath, contents) {
|
1702 | return new Promise(function (resolve, reject) {
|
1703 | fs__namespace.outputFile(path__namespace.resolve(filepath), contents, function (err) {
|
1704 | if (err) {
|
1705 | reject(err);
|
1706 | }
|
1707 | else {
|
1708 | resolve();
|
1709 | }
|
1710 | });
|
1711 | });
|
1712 | };
|
1713 | FileEngine.prototype.writeSync = function (filepath, contents) {
|
1714 | fs__namespace.outputFileSync(filepath, contents);
|
1715 | };
|
1716 | FileEngine.prototype.getSync = function (filepath) {
|
1717 | return fs__namespace.readFileSync(path__namespace.resolve(filepath), 'utf8');
|
1718 | };
|
1719 | /**
|
1720 | * @param file The file to check
|
1721 | */
|
1722 | FileEngine.prototype.existsSync = function (file) {
|
1723 | return fs__namespace.existsSync(file);
|
1724 | };
|
1725 | return FileEngine;
|
1726 | }());
|
1727 | var FileEngine$1 = FileEngine.getInstance();
|
1728 |
|
1729 | var traverse$2 = require('traverse');
|
1730 | var ExportJsonEngine = /** @class */ (function () {
|
1731 | function ExportJsonEngine() {
|
1732 | }
|
1733 | ExportJsonEngine.getInstance = function () {
|
1734 | if (!ExportJsonEngine.instance) {
|
1735 | ExportJsonEngine.instance = new ExportJsonEngine();
|
1736 | }
|
1737 | return ExportJsonEngine.instance;
|
1738 | };
|
1739 | ExportJsonEngine.prototype["export"] = function (outputFolder, data) {
|
1740 | var exportData = {};
|
1741 | traverse$2(data).forEach(function (node) {
|
1742 | if (node) {
|
1743 | if (node.parent) {
|
1744 | delete node.parent;
|
1745 | }
|
1746 | if (node.initializer) {
|
1747 | delete node.initializer;
|
1748 | }
|
1749 | if (Configuration$1.mainData.disableSourceCode) {
|
1750 | delete node.sourceCode;
|
1751 | }
|
1752 | }
|
1753 | });
|
1754 | exportData.pipes = data.pipes;
|
1755 | exportData.interfaces = data.interfaces;
|
1756 | exportData.injectables = data.injectables;
|
1757 | exportData.guards = data.guards;
|
1758 | exportData.interceptors = data.interceptors;
|
1759 | exportData.classes = data.classes;
|
1760 | exportData.directives = data.directives;
|
1761 | exportData.components = data.components;
|
1762 | exportData.modules = this.processModules();
|
1763 | exportData.miscellaneous = data.miscellaneous;
|
1764 | if (!Configuration$1.mainData.disableRoutesGraph) {
|
1765 | exportData.routes = data.routes;
|
1766 | }
|
1767 | if (!Configuration$1.mainData.disableCoverage) {
|
1768 | exportData.coverage = data.coverageData;
|
1769 | }
|
1770 | return FileEngine$1.write(outputFolder + path__namespace.sep + '/documentation.json', JSON.stringify(exportData, undefined, 4))["catch"](function (err) {
|
1771 | logger.error('Error during export file generation ', err);
|
1772 | return Promise.reject(err);
|
1773 | });
|
1774 | };
|
1775 | ExportJsonEngine.prototype.processModules = function () {
|
1776 | var modules = DependenciesEngine$1.getModules();
|
1777 | var _resultedModules = [];
|
1778 | for (var moduleNr = 0; moduleNr < modules.length; moduleNr++) {
|
1779 | var module_1 = modules[moduleNr];
|
1780 | var moduleElement = {
|
1781 | name: module_1.name,
|
1782 | id: module_1.id,
|
1783 | description: module_1.description,
|
1784 | rawDescription: module_1.rawDescription,
|
1785 | deprecationMessage: module_1.deprecationMessage,
|
1786 | deprecated: module_1.deprecated,
|
1787 | file: module_1.file,
|
1788 | methods: module_1.methods,
|
1789 | sourceCode: module_1.sourceCode,
|
1790 | children: [
|
1791 | {
|
1792 | type: 'providers',
|
1793 | elements: []
|
1794 | },
|
1795 | {
|
1796 | type: 'declarations',
|
1797 | elements: []
|
1798 | },
|
1799 | {
|
1800 | type: 'imports',
|
1801 | elements: []
|
1802 | },
|
1803 | {
|
1804 | type: 'exports',
|
1805 | elements: []
|
1806 | },
|
1807 | {
|
1808 | type: 'bootstrap',
|
1809 | elements: []
|
1810 | },
|
1811 | {
|
1812 | type: 'classes',
|
1813 | elements: []
|
1814 | }
|
1815 | ]
|
1816 | };
|
1817 | for (var k = 0; k < module_1.providers.length; k++) {
|
1818 | var providerElement = {
|
1819 | name: module_1.providers[k].name
|
1820 | };
|
1821 | moduleElement.children[0].elements.push(providerElement);
|
1822 | }
|
1823 | for (var k = 0; k < module_1.declarations.length; k++) {
|
1824 | var declarationElement = {
|
1825 | name: module_1.declarations[k].name
|
1826 | };
|
1827 | moduleElement.children[1].elements.push(declarationElement);
|
1828 | }
|
1829 | for (var k = 0; k < module_1.imports.length; k++) {
|
1830 | var importElement = {
|
1831 | name: module_1.imports[k].name
|
1832 | };
|
1833 | moduleElement.children[2].elements.push(importElement);
|
1834 | }
|
1835 | for (var k = 0; k < module_1.exports.length; k++) {
|
1836 | var exportElement = {
|
1837 | name: module_1.exports[k].name
|
1838 | };
|
1839 | moduleElement.children[3].elements.push(exportElement);
|
1840 | }
|
1841 | for (var k = 0; k < module_1.bootstrap.length; k++) {
|
1842 | var bootstrapElement = {
|
1843 | name: module_1.bootstrap[k].name
|
1844 | };
|
1845 | moduleElement.children[4].elements.push(bootstrapElement);
|
1846 | }
|
1847 | _resultedModules.push(moduleElement);
|
1848 | }
|
1849 | return _resultedModules;
|
1850 | };
|
1851 | return ExportJsonEngine;
|
1852 | }());
|
1853 | var ExportJsonEngine$1 = ExportJsonEngine.getInstance();
|
1854 |
|
1855 | var TRANSLATION_DE_DE = {
|
1856 | accessors: 'Accessors',
|
1857 | arguments: 'Argumente',
|
1858 | bootstrap: 'Bootstrap',
|
1859 | branches: 'Branches',
|
1860 | browse: 'Durchsuche',
|
1861 | classe: 'Klasse',
|
1862 | classes: 'Klassen',
|
1863 | component: 'Komponente',
|
1864 | components: 'Komponenten',
|
1865 | constructor: 'Konstruktor',
|
1866 | controllers: 'Controllers',
|
1867 | controller: 'Controller',
|
1868 | 'coverage-page-title': 'Dokumentation Abdeckung',
|
1869 | declarations: 'Declarations',
|
1870 | decorators: 'Decorators',
|
1871 | 'default-value': 'Standardwert',
|
1872 | 'defined-in': 'Definiert in',
|
1873 | dependencies: 'Abhängigkeiten',
|
1874 | deprecated: 'Veraltet',
|
1875 | description: 'Beschreibung',
|
1876 | directive: 'Direktive',
|
1877 | directives: 'Direktiven',
|
1878 | 'dom tree': 'DOM baum',
|
1879 | entities: 'Entities',
|
1880 | entity: 'Entity',
|
1881 | entrycomponents: 'EntryComponents',
|
1882 | enumerations: 'Enumerations',
|
1883 | enums: 'Enums',
|
1884 | example: 'Beispiel',
|
1885 | examples: 'Beispiele',
|
1886 | exports: 'Exportiert',
|
1887 | "extends": 'Erweitert',
|
1888 | file: 'Datei',
|
1889 | functions: 'Funktionen',
|
1890 | 'generated-using': 'Dokumentation generiert mit',
|
1891 | 'getting-started': "Los geht's",
|
1892 | guard: 'Guard',
|
1893 | guards: 'Guards',
|
1894 | hostbindings: 'HostBindings',
|
1895 | hostlisteners: 'HostListeners',
|
1896 | 'html-element': 'Html Element',
|
1897 | 'html-element-with-directive': 'Html-Element mit Direktive',
|
1898 | identifier: 'Kennung',
|
1899 | implements: 'Implementiert',
|
1900 | imports: 'Importiert',
|
1901 | index: 'Index',
|
1902 | indexable: 'Indizierbar',
|
1903 | info: 'Information',
|
1904 | 'inherited-from': 'Geerbt von',
|
1905 | injectable: 'Injectable',
|
1906 | injectables: 'Injectables',
|
1907 | inputs: 'Inputs',
|
1908 | interceptors: 'Interceptors',
|
1909 | interface: 'Interface',
|
1910 | interfaces: 'Interfaces',
|
1911 | legend: 'Legende',
|
1912 | license: 'Lizenz',
|
1913 | lines: 'Linien',
|
1914 | metadata: 'Metadata',
|
1915 | methods: 'Methoden',
|
1916 | miscellaneous: 'Verschiedenes',
|
1917 | module: 'Modul',
|
1918 | modules: 'Module',
|
1919 | name: 'Name',
|
1920 | no: 'Nein',
|
1921 | 'no-graph': 'Kein Graph verfügbar.',
|
1922 | 'no-iframe': 'Dein Browser unterstützt keine iframes.',
|
1923 | 'no-result-matching': 'Kein passendes Ergebnis',
|
1924 | 'no-svg': 'Dein Browser unterstützt kein SVG',
|
1925 | optional: 'Optional',
|
1926 | outputs: 'Ausgaben',
|
1927 | overview: 'Übersicht',
|
1928 | parameters: 'Parameter',
|
1929 | 'peer-dependencies': 'Peer-Abhängigkeiten',
|
1930 | pipe: 'Pipe',
|
1931 | pipes: 'Pipes',
|
1932 | prefix: 'Präfix',
|
1933 | properties: 'Eigenschaften',
|
1934 | providers: 'Providers',
|
1935 | pure: 'Pure',
|
1936 | readme: 'README',
|
1937 | reset: 'Zurücksetzen',
|
1938 | 'results-matching': 'übereinstimmende Ergebnisse',
|
1939 | returns: 'Returns',
|
1940 | route: 'Route',
|
1941 | routes: 'Routen',
|
1942 | schemas: 'Schemata',
|
1943 | 'search-placeholder': 'Eingeben zur Suche',
|
1944 | selector: 'Selektor',
|
1945 | signature: 'Unterschrift',
|
1946 | source: 'Quelle',
|
1947 | statements: 'Statements',
|
1948 | styles: 'Stile',
|
1949 | template: 'Vorlage',
|
1950 | type: 'Typ',
|
1951 | 'type-aliases': 'Typ Aliase',
|
1952 | 'type-parameters': 'Typ Parameter',
|
1953 | types: 'Typen',
|
1954 | 'unamed-property': 'Unbenannte Eigenschaft',
|
1955 | 'unit-test-coverage': 'Unit-Test-Abdeckung',
|
1956 | value: 'Wert',
|
1957 | variables: 'Variablen',
|
1958 | yes: 'Ja',
|
1959 | zoomin: 'Vergrößern',
|
1960 | zoomout: 'Verkleinern'
|
1961 | };
|
1962 |
|
1963 | var TRANSLATION_EN_US = {
|
1964 | accessors: 'Accessors',
|
1965 | arguments: 'Arguments',
|
1966 | bootstrap: 'Bootstrap',
|
1967 | branches: 'Branches',
|
1968 | browse: 'Browse',
|
1969 | classe: 'Class',
|
1970 | classes: 'Classes',
|
1971 | component: 'Component',
|
1972 | components: 'Components',
|
1973 | constructor: 'Constructor',
|
1974 | controllers: 'Controllers',
|
1975 | controller: 'Controller',
|
1976 | 'coverage-page-title': 'Documentation coverage',
|
1977 | declarations: 'Declarations',
|
1978 | decorators: 'Decorators',
|
1979 | 'default-value': 'Default value',
|
1980 | 'defined-in': 'Defined in',
|
1981 | dependencies: 'Dependencies',
|
1982 | deprecated: 'Deprecated',
|
1983 | description: 'Description',
|
1984 | directive: 'Directive',
|
1985 | directives: 'Directives',
|
1986 | 'dom tree': 'DOM tree',
|
1987 | entities: 'Entities',
|
1988 | entity: 'Entity',
|
1989 | entrycomponents: 'EntryComponents',
|
1990 | enumerations: 'Enumerations',
|
1991 | enums: 'Enums',
|
1992 | example: 'Example',
|
1993 | examples: 'Examples',
|
1994 | exports: 'Exports',
|
1995 | "extends": 'Extends',
|
1996 | file: 'File',
|
1997 | functions: 'Functions',
|
1998 | 'generated-using': 'Documentation generated using',
|
1999 | 'getting-started': 'Getting started',
|
2000 | guard: 'Guard',
|
2001 | guards: 'Guards',
|
2002 | hostbindings: 'HostBindings',
|
2003 | hostlisteners: 'HostListeners',
|
2004 | 'html-element': 'Html element',
|
2005 | 'html-element-with-directive': 'Html element with directive',
|
2006 | identifier: 'Identifier',
|
2007 | implements: 'Implements',
|
2008 | imports: 'Imports',
|
2009 | index: 'Index',
|
2010 | indexable: 'Indexable',
|
2011 | info: 'Information',
|
2012 | 'inherited-from': 'Inherited from',
|
2013 | injectable: 'Injectable',
|
2014 | injectables: 'Injectables',
|
2015 | inputs: 'Inputs',
|
2016 | interceptors: 'Interceptors',
|
2017 | interface: 'Interface',
|
2018 | interfaces: 'Interfaces',
|
2019 | legend: 'Legend',
|
2020 | license: 'License',
|
2021 | lines: 'Lines',
|
2022 | metadata: 'Metadata',
|
2023 | methods: 'Methods',
|
2024 | miscellaneous: 'Miscellaneous',
|
2025 | module: 'Module',
|
2026 | modules: 'Modules',
|
2027 | name: 'Name',
|
2028 | no: 'No',
|
2029 | 'no-graph': 'No graph available.',
|
2030 | 'no-iframe': 'Your browser does not support iframes.',
|
2031 | 'no-result-matching': 'No results matching',
|
2032 | 'no-svg': 'Your browser does not support SVG',
|
2033 | optional: 'Optional',
|
2034 | outputs: 'Outputs',
|
2035 | overview: 'Overview',
|
2036 | parameters: 'Parameters',
|
2037 | 'peer-dependencies': 'Peer dependencies',
|
2038 | pipe: 'Pipe',
|
2039 | pipes: 'Pipes',
|
2040 | prefix: 'Prefix',
|
2041 | properties: 'Properties',
|
2042 | providers: 'Providers',
|
2043 | pure: 'Pure',
|
2044 | readme: 'README',
|
2045 | reset: 'Reset',
|
2046 | 'results-matching': 'results matching',
|
2047 | returns: 'Returns',
|
2048 | route: 'Route',
|
2049 | routes: 'Routes',
|
2050 | schemas: 'Schemas',
|
2051 | 'search-placeholder': 'Type to search',
|
2052 | selector: 'Selector',
|
2053 | signature: 'Signature',
|
2054 | source: 'Source',
|
2055 | statements: 'Statements',
|
2056 | styles: 'Styles',
|
2057 | template: 'Template',
|
2058 | type: 'Type',
|
2059 | 'type-aliases': 'Type aliases',
|
2060 | 'type-parameters': 'Type parameters',
|
2061 | types: 'Types',
|
2062 | 'unamed-property': 'Unamed property',
|
2063 | 'unit-test-coverage': 'Unit test coverage',
|
2064 | value: 'Value',
|
2065 | variables: 'Variables',
|
2066 | yes: 'Yes',
|
2067 | zoomin: 'Zoom in',
|
2068 | zoomout: 'Zoom out'
|
2069 | };
|
2070 |
|
2071 | var TRANSLATION_ES_ES = {
|
2072 | accessors: 'Accesorios',
|
2073 | arguments: 'Argumentos',
|
2074 | bootstrap: 'Arranque',
|
2075 | branches: 'Ramas',
|
2076 | browse: 'Navegar',
|
2077 | classe: 'Clase',
|
2078 | classes: 'Clases',
|
2079 | component: 'Componente',
|
2080 | components: 'Componentes',
|
2081 | constructor: 'Constructor',
|
2082 | controllers: 'Controladores',
|
2083 | controller: 'Controlador',
|
2084 | 'coverage-page-title': 'Cobertura de la documentación',
|
2085 | declarations: 'Declaraciones',
|
2086 | decorators: 'Decoradores',
|
2087 | 'default-value': 'Valor por defecto',
|
2088 | 'defined-in': 'Definido en',
|
2089 | dependencies: 'Dependencias',
|
2090 | deprecated: 'Obsoleta',
|
2091 | description: 'Descripción',
|
2092 | directive: 'Directiva',
|
2093 | directives: 'Directivas',
|
2094 | 'dom tree': 'DOM arbol',
|
2095 | entities: 'Entidades',
|
2096 | entity: 'Entidad',
|
2097 | entrycomponents: 'Componentes de entrada',
|
2098 | enumerations: 'Enumeraciones',
|
2099 | enums: 'Enums',
|
2100 | example: 'Ejemplo',
|
2101 | examples: 'Ejemplos',
|
2102 | exports: 'Exporta',
|
2103 | "extends": 'Extiende',
|
2104 | file: 'Fichero',
|
2105 | functions: 'Funciones',
|
2106 | 'generated-using': 'Documentación generada utilizando',
|
2107 | 'getting-started': 'Comenzando',
|
2108 | guard: 'Guardia',
|
2109 | guards: 'Guardias',
|
2110 | hostbindings: 'Fijaciones de Host',
|
2111 | hostlisteners: 'Escuchadores de Host',
|
2112 | 'html-element': 'Elemento Html',
|
2113 | 'html-element-with-directive': 'Elemento Html con directiva',
|
2114 | identifier: 'Identificador',
|
2115 | implements: 'Implementa',
|
2116 | imports: 'Importa',
|
2117 | index: 'Índice',
|
2118 | indexable: 'Indexable',
|
2119 | info: 'Información',
|
2120 | 'inherited-from': 'Heredado desde',
|
2121 | injectable: 'Inyectable',
|
2122 | injectables: 'Inyectables',
|
2123 | inputs: 'Entradas',
|
2124 | interceptors: 'Interceptores',
|
2125 | interface: 'Interfaz',
|
2126 | interfaces: 'Interfaces',
|
2127 | legend: 'Leyenda',
|
2128 | license: 'Licencia',
|
2129 | lines: 'Líneas',
|
2130 | metadata: 'Meta datos',
|
2131 | methods: 'Métodos',
|
2132 | miscellaneous: 'Miscelánea',
|
2133 | module: 'Módulo',
|
2134 | modules: 'Módulos',
|
2135 | name: 'Nombre',
|
2136 | no: 'No',
|
2137 | 'no-graph': 'No hay gráfica disponible.',
|
2138 | 'no-iframe': 'Tu navegador no soporta iframes.',
|
2139 | 'no-result-matching': 'No hay resultados que coincidan',
|
2140 | 'no-svg': 'Tu navegador no soporta SVG',
|
2141 | optional: 'Opcional',
|
2142 | outputs: 'Salidas',
|
2143 | overview: 'Descripción general',
|
2144 | parameters: 'Parámetros',
|
2145 | 'peer-dependencies': 'Dependencias entre pares',
|
2146 | pipe: 'Tubería',
|
2147 | pipes: 'Tuberías',
|
2148 | prefix: 'Prefijo',
|
2149 | properties: 'Propiedades',
|
2150 | providers: 'Proveedores',
|
2151 | pure: 'Puro',
|
2152 | readme: 'Léeme',
|
2153 | reset: 'Restablecer',
|
2154 | 'results-matching': 'comparación de resultados',
|
2155 | returns: 'Devuelve',
|
2156 | route: 'Ruta',
|
2157 | routes: 'Rutas',
|
2158 | schemas: 'Esquemas',
|
2159 | 'search-placeholder': 'Escribe para buscar',
|
2160 | selector: 'Selector',
|
2161 | signature: 'Firma',
|
2162 | source: 'Fuente',
|
2163 | statements: 'Declaraciones',
|
2164 | styles: 'Estilos',
|
2165 | template: 'Plantilla',
|
2166 | type: 'Tipo',
|
2167 | 'type-aliases': 'Alias de tipo',
|
2168 | 'type-parameters': 'Parámetros de tipo',
|
2169 | types: 'Tipos',
|
2170 | 'unamed-property': 'Propiedad sin nombre',
|
2171 | 'unit-test-coverage': 'Cobertura de las pruebas unitarias',
|
2172 | value: 'Valor',
|
2173 | variables: 'Variables',
|
2174 | yes: 'Si',
|
2175 | zoomin: 'Ampliar',
|
2176 | zoomout: 'Alejar'
|
2177 | };
|
2178 |
|
2179 | var TRANSLATION_FR_FR = {
|
2180 | accessors: 'Accesseurs',
|
2181 | arguments: 'Arguments',
|
2182 | bootstrap: 'Bootstrap',
|
2183 | branches: 'Branches',
|
2184 | browse: 'Parcourir',
|
2185 | classe: 'Class',
|
2186 | classes: 'Classes',
|
2187 | component: 'Composant',
|
2188 | components: 'Composants',
|
2189 | constructor: 'Constructeur',
|
2190 | controllers: 'Contrôleurs',
|
2191 | controller: 'Contrôleur',
|
2192 | 'coverage-page-title': 'Couverture de documentation',
|
2193 | declarations: 'Déclarations',
|
2194 | decorators: 'Décorateurs',
|
2195 | 'default-value': 'Valeur par défaut',
|
2196 | 'defined-in': 'Défini dans',
|
2197 | dependencies: 'Dépendances',
|
2198 | deprecated: 'Obsolète',
|
2199 | description: 'Description',
|
2200 | directive: 'Directive',
|
2201 | directives: 'Directives',
|
2202 | 'dom tree': 'Arbre DOM',
|
2203 | entities: 'Entités',
|
2204 | entity: 'Entité',
|
2205 | entrycomponents: "Composants d'entrée",
|
2206 | enumerations: 'Enumérations',
|
2207 | enums: 'Enumérations',
|
2208 | example: 'Example',
|
2209 | examples: 'Examples',
|
2210 | exports: 'Exports',
|
2211 | "extends": 'Etend',
|
2212 | file: 'Fichier',
|
2213 | functions: 'Fonctions',
|
2214 | 'generated-using': 'Documentation générée avec',
|
2215 | 'getting-started': 'Démarrage',
|
2216 | guard: 'Garde',
|
2217 | guards: 'Gardes',
|
2218 | hostbindings: 'HostBindings',
|
2219 | hostlisteners: 'HostListeners',
|
2220 | 'html-element': 'Elément Html',
|
2221 | 'html-element-with-directive': 'Elément Html avec une directive',
|
2222 | identifier: 'Identifiant',
|
2223 | implements: 'Implémente',
|
2224 | imports: 'Imports',
|
2225 | index: 'Index',
|
2226 | indexable: 'Indexable',
|
2227 | info: 'Information',
|
2228 | 'inherited-from': 'Hérité de',
|
2229 | injectable: 'Injectable',
|
2230 | injectables: 'Injectables',
|
2231 | inputs: 'Entrées',
|
2232 | interceptors: 'Intercepteurs',
|
2233 | interface: 'Interface',
|
2234 | interfaces: 'Interfaces',
|
2235 | legend: 'Légende',
|
2236 | license: 'License',
|
2237 | lines: 'Lignes',
|
2238 | metadata: 'Métadonnées',
|
2239 | methods: 'Méthodes',
|
2240 | miscellaneous: 'Divers',
|
2241 | module: 'Module',
|
2242 | modules: 'Modules',
|
2243 | name: 'Nom',
|
2244 | no: 'Non',
|
2245 | 'no-graph': 'Aucun graphique disponible.',
|
2246 | 'no-iframe': 'Votre navigateur ne supporte pas les iframes.',
|
2247 | 'no-result-matching': 'Aucun résultat matchant',
|
2248 | 'no-svg': 'Votre navigateur ne supporte pas le SVG',
|
2249 | optional: 'Optionnel',
|
2250 | outputs: 'Sorties',
|
2251 | overview: "Vue d'ensemble",
|
2252 | parameters: 'Paramètres',
|
2253 | 'peer-dependencies': 'Dépendances de pair',
|
2254 | pipe: 'Pipe',
|
2255 | pipes: 'Pipes',
|
2256 | prefix: 'Préfixe',
|
2257 | properties: 'Propriétés',
|
2258 | providers: 'Providers',
|
2259 | pure: 'Pure',
|
2260 | readme: 'README',
|
2261 | reset: 'Remise à zéro',
|
2262 | 'results-matching': 'résultats matchant',
|
2263 | returns: 'Renvoie',
|
2264 | route: 'Route',
|
2265 | routes: 'Routes',
|
2266 | schemas: 'Schémas',
|
2267 | 'search-placeholder': 'Saisissez un texte',
|
2268 | selector: 'Sélecteur',
|
2269 | signature: 'Signature',
|
2270 | source: 'Source',
|
2271 | statements: 'Déclarations',
|
2272 | styles: 'Styles',
|
2273 | template: 'Template',
|
2274 | 'table-of-contents': 'Table des matières',
|
2275 | type: 'Type',
|
2276 | 'type-aliases': 'Alias de type',
|
2277 | 'type-parameters': 'Paramètres de type',
|
2278 | types: 'Types',
|
2279 | 'unamed-property': 'Propriété non nommée',
|
2280 | 'unit-test-coverage': 'Couverture de test unitaire',
|
2281 | value: 'Valeur',
|
2282 | variables: 'Variables',
|
2283 | yes: 'Oui',
|
2284 | zoomin: 'Zoom avant',
|
2285 | zoomout: 'Zoom arrière'
|
2286 | };
|
2287 |
|
2288 | var TRANSLATION_HU_HU = {
|
2289 | accessors: 'Getter/setter metódusok',
|
2290 | arguments: 'Argumentumok',
|
2291 | bootstrap: 'Betöltés',
|
2292 | branches: 'Branchek',
|
2293 | browse: 'Böngészés',
|
2294 | classe: 'Osztály',
|
2295 | classes: 'Osztályok',
|
2296 | component: 'Komponens',
|
2297 | components: 'Komponensek',
|
2298 | constructor: 'Konstruktor',
|
2299 | controllers: 'Kontrollerek',
|
2300 | controller: 'Kontroller',
|
2301 | 'coverage-page-title': 'Dokumentáció lefedettség',
|
2302 | declarations: 'Deklarációk',
|
2303 | decorators: 'Dekorátorok',
|
2304 | 'default-value': 'Alapértelmezett érték',
|
2305 | 'defined-in': 'Definíció helye:',
|
2306 | dependencies: 'Függőségek',
|
2307 | deprecated: 'Elavult',
|
2308 | description: 'Leírás',
|
2309 | directive: 'Direktíva',
|
2310 | directives: 'Direktívák',
|
2311 | 'dom tree': 'DOM fa',
|
2312 | entities: 'Entitások',
|
2313 | entity: 'Entitás',
|
2314 | entrycomponents: 'Entry komponensek',
|
2315 | enumerations: 'Enumerációk',
|
2316 | enums: 'Enumok',
|
2317 | example: 'Példa',
|
2318 | examples: 'Példák',
|
2319 | exports: 'Exportok',
|
2320 | "extends": 'Ősosztály',
|
2321 | file: 'File',
|
2322 | functions: 'Függvények',
|
2323 | 'generated-using': 'A dokumentációt generálta:',
|
2324 | 'getting-started': 'Bevezető',
|
2325 | guard: 'Guard',
|
2326 | guards: 'Guardok',
|
2327 | hostbindings: 'HostBindingok',
|
2328 | hostlisteners: 'HostListenerek',
|
2329 | 'html-element': 'Html elem',
|
2330 | 'html-element-with-directive': 'Html elem direktívával',
|
2331 | identifier: 'Azonosító',
|
2332 | implements: 'Implementált interfészek',
|
2333 | imports: 'Importok',
|
2334 | index: 'Tartalomjegyzék',
|
2335 | indexable: 'Indexelhető',
|
2336 | info: 'Információ',
|
2337 | 'inherited-from': 'Örökölve innen:',
|
2338 | injectable: 'Injektálható',
|
2339 | injectables: 'Injektálhatók',
|
2340 | inputs: 'Bemenetek',
|
2341 | interceptors: 'Interceptorok',
|
2342 | interface: 'Interfész',
|
2343 | interfaces: 'Interfészek',
|
2344 | legend: 'Jelmagyarázat',
|
2345 | license: 'Licenc',
|
2346 | lines: 'Sorok',
|
2347 | metadata: 'Metaadatok',
|
2348 | methods: 'Metódusok',
|
2349 | miscellaneous: 'Egyéb',
|
2350 | module: 'Modul',
|
2351 | modules: 'Modulok',
|
2352 | name: 'Név',
|
2353 | no: 'Nem',
|
2354 | 'no-graph': 'Grafikon nem elérhető.',
|
2355 | 'no-iframe': 'A böngészője nem támogatja az iframe-eket.',
|
2356 | 'no-result-matching': 'Nincs találat',
|
2357 | 'no-svg': 'A böngészője nem támogatja az SVG formátumot.',
|
2358 | optional: 'Opcionális',
|
2359 | outputs: 'Kimenetek',
|
2360 | overview: 'Áttekintés',
|
2361 | parameters: 'Paraméterek',
|
2362 | 'peer-dependencies': 'Peer függőségek',
|
2363 | pipe: 'Pipe',
|
2364 | pipes: 'Pipe-ok',
|
2365 | prefix: 'Előtag',
|
2366 | properties: 'Tagváltozók',
|
2367 | providers: 'Providerek',
|
2368 | pure: 'Pure',
|
2369 | readme: 'README',
|
2370 | reset: 'Visszaállít',
|
2371 | 'results-matching': 'találat',
|
2372 | returns: 'Visszatérési érték',
|
2373 | route: 'Útvonal',
|
2374 | routes: 'Útvonalak',
|
2375 | schemas: 'Sémák',
|
2376 | 'search-placeholder': 'Keresendő kifejezés',
|
2377 | selector: 'Szelektor',
|
2378 | signature: 'Aláírás',
|
2379 | source: 'Forrás',
|
2380 | statements: 'Utasítások',
|
2381 | styles: 'Stílusok',
|
2382 | template: 'Sablon',
|
2383 | type: 'Típus',
|
2384 | 'type-aliases': 'Típus álnév',
|
2385 | 'type-parameters': 'Típus paraméterek',
|
2386 | types: 'Típusok',
|
2387 | 'unamed-property': 'Névtelen property',
|
2388 | 'unit-test-coverage': 'Unit teszt lefedettség',
|
2389 | value: 'Érték',
|
2390 | variables: 'Változók',
|
2391 | yes: 'Igen',
|
2392 | zoomin: 'Nagyítás',
|
2393 | zoomout: 'Kicsinyítés'
|
2394 | };
|
2395 |
|
2396 | var TRANSLATION_IT_IT = {
|
2397 | accessors: 'Accessori',
|
2398 | arguments: 'Argomenti',
|
2399 | bootstrap: 'Bootstrap',
|
2400 | branches: 'Rami',
|
2401 | browse: 'Cerca',
|
2402 | classe: 'Classe',
|
2403 | classes: 'Classi',
|
2404 | component: 'Componente',
|
2405 | components: 'Componenti',
|
2406 | constructor: 'Costruttore',
|
2407 | controllers: 'Controllers',
|
2408 | controller: 'Controller',
|
2409 | 'coverage-page-title': 'Copertura codice',
|
2410 | declarations: 'Dichiarazioni',
|
2411 | decorators: 'Decorators',
|
2412 | 'default-value': 'Valore predefinito',
|
2413 | 'defined-in': 'Definito in',
|
2414 | dependencies: 'Dependencies',
|
2415 | deprecated: 'Deprecata',
|
2416 | description: 'Descrizione',
|
2417 | directive: 'Direttiva',
|
2418 | directives: 'Direttive',
|
2419 | 'dom tree': 'Albero DOM',
|
2420 | entities: 'Entità',
|
2421 | entity: 'Entità',
|
2422 | entrycomponents: 'EntryComponents',
|
2423 | enumerations: 'Enumerations',
|
2424 | enums: 'Enums',
|
2425 | example: 'Esempio',
|
2426 | examples: 'Esempi',
|
2427 | exports: 'Exports',
|
2428 | "extends": 'Extends',
|
2429 | file: 'File',
|
2430 | functions: 'Funzioni',
|
2431 | 'generated-using': 'Documentazione generata usando',
|
2432 | 'getting-started': 'Iniziamo',
|
2433 | guard: 'Guardia',
|
2434 | guards: 'Guardie',
|
2435 | hostbindings: 'HostBindings',
|
2436 | hostlisteners: 'HostListeners',
|
2437 | 'html-element': 'Elemento Html',
|
2438 | 'html-element-with-directive': 'Elemento html con direttive',
|
2439 | identifier: 'Identificatore',
|
2440 | implements: 'Implementa',
|
2441 | imports: 'Importa',
|
2442 | index: 'Indice',
|
2443 | indexable: 'Indicizzabile',
|
2444 | info: 'Informazione',
|
2445 | 'inherited-from': 'ereditato da',
|
2446 | injectable: 'Injectable',
|
2447 | injectables: 'Injectables',
|
2448 | inputs: 'Input',
|
2449 | interceptors: 'Interceptors',
|
2450 | interface: 'Interfaccia',
|
2451 | interfaces: 'Interfacce',
|
2452 | legend: 'Legenda',
|
2453 | license: 'Licenza',
|
2454 | lines: 'Linee',
|
2455 | metadata: 'Metadati',
|
2456 | methods: 'Metodi',
|
2457 | miscellaneous: 'Varie',
|
2458 | module: 'Modulo',
|
2459 | modules: 'Moduli',
|
2460 | name: 'Nome',
|
2461 | no: 'No',
|
2462 | 'no-graph': 'Grafico non disponibile.',
|
2463 | 'no-iframe': 'Il tuo browser non supporta iframe.',
|
2464 | 'no-result-matching': 'Nessun risultato corrispondente',
|
2465 | 'no-svg': 'Il tuo browser non supporta SVG',
|
2466 | optional: 'Opzionale',
|
2467 | outputs: 'Output',
|
2468 | overview: 'Sommario',
|
2469 | parameters: 'Parametri',
|
2470 | 'peer-dependencies': 'Peer dependencies',
|
2471 | pipe: 'Pipe',
|
2472 | pipes: 'Pipes',
|
2473 | prefix: 'Prefisso',
|
2474 | properties: 'Proprietà',
|
2475 | providers: 'Providers',
|
2476 | pure: 'Pure',
|
2477 | readme: 'README',
|
2478 | reset: 'Reset',
|
2479 | 'results-matching': 'corrispondenza',
|
2480 | returns: 'Returns',
|
2481 | route: 'Route',
|
2482 | routes: 'Routes',
|
2483 | schemas: 'Schemas',
|
2484 | 'search-placeholder': 'Digita per avviare la ricerca',
|
2485 | selector: 'Selector',
|
2486 | signature: 'Signature',
|
2487 | source: 'Fonte',
|
2488 | statements: 'Statements',
|
2489 | styles: 'Stili',
|
2490 | template: 'Modello',
|
2491 | type: 'Tipo',
|
2492 | 'type-aliases': 'Type aliases',
|
2493 | 'type-parameters': 'Type parameters',
|
2494 | types: 'Tipi',
|
2495 | 'unamed-property': 'Proprietà senza nome',
|
2496 | 'unit-test-coverage': 'Copertura unit test',
|
2497 | value: 'Valori',
|
2498 | variables: 'Variabili',
|
2499 | yes: 'Si',
|
2500 | zoomin: 'Ingrandisci',
|
2501 | zoomout: 'Rimpocciolisci'
|
2502 | };
|
2503 |
|
2504 | var TRANSLATION_JA_JP = {
|
2505 | accessors: 'アクセサ',
|
2506 | arguments: '引数',
|
2507 | bootstrap: 'ブートストラップ',
|
2508 | branches: 'ブランチ',
|
2509 | browse: 'ブラウズ',
|
2510 | classe: 'クラス',
|
2511 | classes: 'クラス',
|
2512 | component: 'コンポーネント',
|
2513 | components: 'コンポーネント',
|
2514 | constructor: 'コンストラクタ',
|
2515 | controllers: 'コントローラー',
|
2516 | controller: 'コントローラー',
|
2517 | 'coverage-page-title': 'カバレッジ',
|
2518 | declarations: '宣言',
|
2519 | decorators: 'デコレーター',
|
2520 | 'default-value': '初期値',
|
2521 | 'defined-in': 'Defined in',
|
2522 | dependencies: '依存関係',
|
2523 | deprecated: '非推奨',
|
2524 | description: '説明',
|
2525 | directive: 'ディレクティブ',
|
2526 | directives: 'ディレクティブ',
|
2527 | 'dom tree': 'DOM ツリー',
|
2528 | entities: 'エンティティ',
|
2529 | entity: '実在物',
|
2530 | entrycomponents: 'エントリーコンポーネント',
|
2531 | enumerations: '列挙型',
|
2532 | enums: 'Enums',
|
2533 | example: '例',
|
2534 | examples: '例',
|
2535 | exports: 'エクスポート',
|
2536 | "extends": '継承',
|
2537 | file: 'ファイル',
|
2538 | functions: '関数',
|
2539 | 'generated-using': 'このドキュメントは以下を使用して生成されています',
|
2540 | 'getting-started': 'はじめに',
|
2541 | guard: 'ガード',
|
2542 | guards: 'ガード',
|
2543 | hostbindings: 'ホストバインディング',
|
2544 | hostlisteners: 'ホストリスナー',
|
2545 | 'html-element': 'Html要素',
|
2546 | 'html-element-with-directive': 'ディレクティブHtml要素',
|
2547 | identifier: '識別子',
|
2548 | implements: '実装',
|
2549 | imports: 'インポート',
|
2550 | index: '索引',
|
2551 | indexable: 'インデクサブル',
|
2552 | info: '情報',
|
2553 | 'inherited-from': 'Inherited from',
|
2554 | injectable: 'インジェクタブル',
|
2555 | injectables: 'インジェクタブル',
|
2556 | inputs: '入力',
|
2557 | interceptors: 'インターセプター',
|
2558 | interface: 'インターフェイス',
|
2559 | interfaces: 'インターフェイス',
|
2560 | legend: '凡例',
|
2561 | license: 'ライセンス',
|
2562 | lines: '行数',
|
2563 | metadata: 'メタデータ',
|
2564 | methods: 'メソッド',
|
2565 | miscellaneous: 'その他',
|
2566 | module: 'モジュール',
|
2567 | modules: 'モジュール',
|
2568 | name: '名前',
|
2569 | no: 'いいえ',
|
2570 | 'no-graph': '使用できるグラフがありません',
|
2571 | 'no-iframe': 'ブラウザがiframeを対応していません',
|
2572 | 'no-result-matching': '見つかりませんでした',
|
2573 | 'no-svg': 'ブラウザがSVGに対応してません',
|
2574 | optional: 'オプション',
|
2575 | outputs: '出力',
|
2576 | overview: '概要',
|
2577 | parameters: 'パラメータ',
|
2578 | 'peer-dependencies': 'Peer dependencies',
|
2579 | pipe: 'パイプ',
|
2580 | pipes: 'パイプ',
|
2581 | prefix: '接頭辞',
|
2582 | properties: 'プロパティ',
|
2583 | providers: 'プロバイダー',
|
2584 | pure: 'Pure',
|
2585 | readme: 'README',
|
2586 | reset: 'リセット',
|
2587 | 'results-matching': '件の結果が一致しました',
|
2588 | returns: '戻り値',
|
2589 | route: 'ルート',
|
2590 | routes: 'ルート',
|
2591 | schemas: 'スキーマ',
|
2592 | 'search-placeholder': '入力して検索',
|
2593 | selector: 'セレクタ',
|
2594 | signature: 'シグネチャ',
|
2595 | source: 'ソース',
|
2596 | statements: '文',
|
2597 | styles: 'スタイル',
|
2598 | template: 'テンプレート',
|
2599 | type: '型',
|
2600 | 'type-aliases': 'タイプエイリアス',
|
2601 | 'type-parameters': '型パラメーター',
|
2602 | types: '型',
|
2603 | 'unamed-property': '匿名プロパティ',
|
2604 | 'unit-test-coverage': 'ユニットテストカバレッジ',
|
2605 | value: '値',
|
2606 | variables: '変数',
|
2607 | yes: 'はい',
|
2608 | zoomin: '拡大',
|
2609 | zoomout: '縮小'
|
2610 | };
|
2611 |
|
2612 | var TRANSLATION_NL_NL = {
|
2613 | accessors: 'Accessors',
|
2614 | arguments: 'Argumenten',
|
2615 | bootstrap: 'Bootstrap',
|
2616 | branches: 'Branches',
|
2617 | browse: 'Browse',
|
2618 | classe: 'Klasse',
|
2619 | classes: 'Klassen',
|
2620 | component: 'Component',
|
2621 | components: 'Componenten',
|
2622 | constructor: 'Constructor',
|
2623 | controllers: 'Controllers',
|
2624 | controller: 'Controller',
|
2625 | 'coverage-page-title': 'Documentatie coverage',
|
2626 | declarations: 'Declaraties',
|
2627 | decorators: 'Decorators',
|
2628 | 'default-value': 'Default waarde',
|
2629 | 'defined-in': 'Gedefinieerd in',
|
2630 | dependencies: 'Dependencies',
|
2631 | deprecated: 'Verouderd',
|
2632 | description: 'Omschrijving',
|
2633 | directive: 'Directive',
|
2634 | directives: 'Directives',
|
2635 | 'dom tree': 'DOM boom',
|
2636 | entities: 'Entiteiten',
|
2637 | entity: 'Entiteit',
|
2638 | entrycomponents: 'EntryComponents',
|
2639 | enumerations: 'Enumerations',
|
2640 | enums: 'Enums',
|
2641 | example: 'Voorbeeld',
|
2642 | examples: 'Voorbeelden',
|
2643 | exports: 'Exports',
|
2644 | "extends": 'Extends',
|
2645 | file: 'Bestand',
|
2646 | functions: 'Functies',
|
2647 | 'generated-using': 'Documentatie gegenereed met',
|
2648 | 'getting-started': 'Aan de slag',
|
2649 | guard: 'Guard',
|
2650 | guards: 'Guards',
|
2651 | hostbindings: 'HostBindings',
|
2652 | hostlisteners: 'HostListeners',
|
2653 | 'html-element': 'Html element',
|
2654 | 'html-element-with-directive': 'Html element met directive',
|
2655 | identifier: 'Identifier',
|
2656 | implements: 'Implementeert',
|
2657 | imports: 'Imports',
|
2658 | index: 'Index',
|
2659 | indexable: 'Indexeerbaar',
|
2660 | info: 'Informatie',
|
2661 | 'inherited-from': 'Inherited van',
|
2662 | injectable: 'Injectable',
|
2663 | injectables: 'Injectables',
|
2664 | inputs: 'Inputs',
|
2665 | interceptors: 'Interceptors',
|
2666 | interface: 'Interface',
|
2667 | interfaces: 'Interfaces',
|
2668 | legend: 'Legenda',
|
2669 | license: 'Licentie',
|
2670 | lines: 'Regels',
|
2671 | metadata: 'Metadata',
|
2672 | methods: 'Methods',
|
2673 | miscellaneous: 'Diversen',
|
2674 | module: 'Module',
|
2675 | modules: 'Modules',
|
2676 | name: 'Naam',
|
2677 | no: 'Nee',
|
2678 | 'no-graph': 'Geen diagram beschikbaar.',
|
2679 | 'no-iframe': 'Uw browser ondersteund geen iframes.',
|
2680 | 'no-result-matching': 'Geen overeenkomende resultaten',
|
2681 | 'no-svg': 'Uw browser ondersteund geen SVG',
|
2682 | optional: 'Optioneel',
|
2683 | outputs: 'Outputs',
|
2684 | overview: 'Overzicht',
|
2685 | parameters: 'Parameters',
|
2686 | 'peer-dependencies': 'Peer dependencies',
|
2687 | pipe: 'Pipe',
|
2688 | pipes: 'Pipes',
|
2689 | prefix: 'Voorvoegsel',
|
2690 | properties: 'Properties',
|
2691 | providers: 'Providers',
|
2692 | pure: 'Puur',
|
2693 | readme: 'README',
|
2694 | reset: 'Reset',
|
2695 | 'results-matching': 'overeenkomende resultaten',
|
2696 | returns: 'Returns',
|
2697 | route: 'Route',
|
2698 | routes: 'Routes',
|
2699 | schemas: "Schema's",
|
2700 | 'search-placeholder': 'Type om te zoeken',
|
2701 | selector: 'Selector',
|
2702 | signature: 'Handtekening',
|
2703 | source: 'Bron',
|
2704 | statements: 'Statements',
|
2705 | styles: 'Stijlen',
|
2706 | template: 'Sjabloon',
|
2707 | type: 'Type',
|
2708 | 'type-aliases': 'Type aliassen',
|
2709 | 'type-parameters': 'Type parameters',
|
2710 | types: 'Types',
|
2711 | 'unamed-property': 'Naamloze property',
|
2712 | 'unit-test-coverage': 'Unit test coverage',
|
2713 | value: 'Waarde',
|
2714 | variables: 'Variabelen',
|
2715 | yes: 'Ja',
|
2716 | zoomin: 'Zoom in',
|
2717 | zoomout: 'Zoom uit'
|
2718 | };
|
2719 |
|
2720 | var TRANSLATION_PL_PL = {
|
2721 | accessors: 'Akcesor',
|
2722 | arguments: 'Argumenty',
|
2723 | bootstrap: 'Uruchomienie',
|
2724 | branches: 'Gałęzie',
|
2725 | browse: 'Przeglądaj',
|
2726 | classe: 'Klasa',
|
2727 | classes: 'Klasy',
|
2728 | component: 'Komponent',
|
2729 | components: 'Komponenty',
|
2730 | constructor: 'Konstruktor',
|
2731 | controllers: 'Kontrolery',
|
2732 | controller: 'Kontroler',
|
2733 | 'coverage-page-title': 'Pokrycie dokumentacją',
|
2734 | declarations: 'Deklaracje',
|
2735 | decorators: 'Dekoratory',
|
2736 | 'default-value': 'Domyślna wartość',
|
2737 | 'defined-in': 'Zdefiniowane w',
|
2738 | dependencies: 'Biblioteki',
|
2739 | deprecated: 'Przestarzałe',
|
2740 | description: 'Opis',
|
2741 | directive: 'Dyrektywa',
|
2742 | directives: 'Dyrektywy',
|
2743 | 'dom tree': 'DOM drzewo',
|
2744 | entities: 'Podmioty',
|
2745 | entity: 'Podmiot',
|
2746 | entrycomponents: 'EntryComponents',
|
2747 | enumerations: 'Enumeracje',
|
2748 | enums: 'Enumy',
|
2749 | example: 'Przykład',
|
2750 | examples: 'Przykłady',
|
2751 | exports: 'Exporty',
|
2752 | "extends": 'Rozszerza',
|
2753 | file: 'Plik',
|
2754 | functions: 'Funkcje',
|
2755 | 'generated-using': 'Dokumentacja wygenerowana przy użyciu',
|
2756 | 'getting-started': 'Start',
|
2757 | guard: 'Guard',
|
2758 | guards: "Guard'y",
|
2759 | hostbindings: 'HostBindingi',
|
2760 | hostlisteners: 'HostListenery',
|
2761 | 'html-element': 'Html element',
|
2762 | 'html-element-with-directive': 'Html element z dyrektywą',
|
2763 | identifier: 'Identyfikator',
|
2764 | implements: 'Implementuje',
|
2765 | imports: 'Importuje',
|
2766 | index: 'Indeks',
|
2767 | indexable: 'Indeksowany',
|
2768 | info: 'Informatie',
|
2769 | 'inherited-from': 'Dziedziczy z',
|
2770 | injectable: 'Injectable',
|
2771 | injectables: 'Injectables',
|
2772 | inputs: 'Inputy',
|
2773 | interceptors: 'Interceptory',
|
2774 | interface: 'Interfejs',
|
2775 | interfaces: 'Interfejsy',
|
2776 | legend: 'Legenda',
|
2777 | license: 'Licencja',
|
2778 | lines: 'Linie',
|
2779 | metadata: 'Metadane',
|
2780 | methods: 'Metody',
|
2781 | miscellaneous: 'Różne',
|
2782 | module: 'Moduł',
|
2783 | modules: 'Moduły',
|
2784 | name: 'Nazwa',
|
2785 | no: 'Nie',
|
2786 | 'no-graph': 'Graf niedostępny.',
|
2787 | 'no-iframe': "Twoja przeglądarka nie wspiera iframe'ów.",
|
2788 | 'no-result-matching': 'Brak pasujących wyników',
|
2789 | 'no-svg': 'Twoja przeglądarka nie wspiera SVG',
|
2790 | optional: 'Opcjonalne',
|
2791 | outputs: 'Outputy',
|
2792 | overview: 'Przegląd',
|
2793 | parameters: 'Parametry',
|
2794 | 'peer-dependencies': 'Biblioteki zależne',
|
2795 | pipe: 'Pipe',
|
2796 | pipes: "Pipe'y",
|
2797 | prefix: 'Prefiks',
|
2798 | properties: 'Włąściwości',
|
2799 | providers: 'Dostarczyciele',
|
2800 | pure: 'Czysty',
|
2801 | readme: 'README',
|
2802 | reset: 'Reset',
|
2803 | 'results-matching': 'pasujących wyników',
|
2804 | returns: 'Zwraca',
|
2805 | route: 'Route',
|
2806 | routes: "Route'y",
|
2807 | schemas: 'Schematy',
|
2808 | 'search-placeholder': 'Wprowadź tekst wyszukiwania',
|
2809 | selector: 'Selektor',
|
2810 | signature: 'Podpis',
|
2811 | statements: 'Instrukcje',
|
2812 | styles: 'Estilos',
|
2813 | template: 'Modelo',
|
2814 | type: 'Typ',
|
2815 | 'type-aliases': 'Aliasy typów',
|
2816 | 'type-parameters': 'Parametry typów',
|
2817 | types: 'Typy',
|
2818 | 'unamed-property': 'Nienazwana właśność',
|
2819 | 'unit-test-coverage': 'Pokrycie testami jednostkowymi',
|
2820 | value: 'Wartość',
|
2821 | variables: 'Zmienne',
|
2822 | yes: 'Tak',
|
2823 | zoomin: 'Przybliż',
|
2824 | zoomout: 'Oddal'
|
2825 | };
|
2826 |
|
2827 | var TRANSLATION_PT_BR = {
|
2828 | accessors: 'Acessores',
|
2829 | arguments: 'Argumentos',
|
2830 | bootstrap: 'Bootstrap',
|
2831 | branches: 'Branches',
|
2832 | browse: 'Navegar',
|
2833 | classe: 'Classe',
|
2834 | classes: 'Classes',
|
2835 | component: 'Componente',
|
2836 | components: 'Componentes',
|
2837 | constructor: 'Construtor',
|
2838 | controllers: 'Controladores',
|
2839 | controller: 'Controlador',
|
2840 | 'coverage-page-title': 'Cobertura da documentação',
|
2841 | declarations: 'Declarações',
|
2842 | decorators: 'Decoradores',
|
2843 | 'default-value': 'Valor padrão',
|
2844 | 'defined-in': 'Definido em',
|
2845 | dependencies: 'Dependências',
|
2846 | deprecated: 'Descontinuada',
|
2847 | description: 'Descrição',
|
2848 | directive: 'Diretiva',
|
2849 | directives: 'Diretivas',
|
2850 | 'dom tree': 'Arvore DOM',
|
2851 | entities: 'Entidades',
|
2852 | entity: 'Entidade',
|
2853 | entrycomponents: 'EntryComponents',
|
2854 | enumerations: 'Enumerações',
|
2855 | enums: 'Enums',
|
2856 | example: 'Exemplo',
|
2857 | examples: 'Exemplos',
|
2858 | exports: 'Exports',
|
2859 | "extends": 'Extende',
|
2860 | file: 'Arquivo',
|
2861 | functions: 'Funções',
|
2862 | 'generated-using': 'Documentação gerada usando',
|
2863 | 'getting-started': 'Começando',
|
2864 | guard: 'Guarda',
|
2865 | guards: 'Guardas',
|
2866 | hostbindings: 'HostBindings',
|
2867 | hostlisteners: 'HostListeners',
|
2868 | 'html-element': 'Elemento HTML',
|
2869 | 'html-element-with-directive': 'Elemento HTML com diretiva',
|
2870 | identifier: 'Identificador',
|
2871 | implements: 'Implementa',
|
2872 | imports: 'Imports',
|
2873 | index: 'Index',
|
2874 | indexable: 'Indexável',
|
2875 | info: 'Informação',
|
2876 | 'inherited-from': 'Herdado de',
|
2877 | injectable: 'Injetável',
|
2878 | injectables: 'Injetáveis',
|
2879 | inputs: 'Inputs',
|
2880 | interceptors: 'Interceptors',
|
2881 | interface: 'Interface',
|
2882 | interfaces: 'Interfaces',
|
2883 | legend: 'Legend',
|
2884 | license: 'Licença',
|
2885 | lines: 'Linhas',
|
2886 | metadata: 'Metadata',
|
2887 | methods: 'Métodos',
|
2888 | miscellaneous: 'Miscelânea',
|
2889 | module: 'Módulo',
|
2890 | modules: 'Módulos',
|
2891 | name: 'Nome',
|
2892 | no: 'Não',
|
2893 | 'no-graph': 'Sem gráfico disponível.',
|
2894 | 'no-iframe': 'Seu browser não tem suporte a iframes.',
|
2895 | 'no-result-matching': 'Nenhum resultado correspondente',
|
2896 | 'no-svg': 'Seu browser não tem suporte a SVG',
|
2897 | optional: 'Opcional',
|
2898 | outputs: 'Outputs',
|
2899 | overview: 'Visão geral',
|
2900 | parameters: 'Parâmetros',
|
2901 | 'peer-dependencies': 'Peer dependencies',
|
2902 | pipe: 'Pipe',
|
2903 | pipes: 'Pipes',
|
2904 | prefix: 'Prefixo',
|
2905 | properties: 'Propriedades',
|
2906 | providers: 'Providers',
|
2907 | pure: 'Puro',
|
2908 | readme: 'README',
|
2909 | reset: 'Resetar',
|
2910 | 'results-matching': 'resultados correspondentes',
|
2911 | returns: 'Retorna',
|
2912 | route: 'Rota',
|
2913 | routes: 'Rotas',
|
2914 | schemas: 'Esquemas',
|
2915 | 'search-placeholder': 'Digite para pesquisar',
|
2916 | selector: 'Seletor',
|
2917 | signature: 'Assinatura',
|
2918 | source: 'Fonte',
|
2919 | statements: 'Statements',
|
2920 | styles: 'Estilos',
|
2921 | template: 'Modelo',
|
2922 | type: 'Tipo',
|
2923 | 'type-aliases': 'Aliases de tipo',
|
2924 | 'type-parameters': 'Parâmetros de tipo',
|
2925 | types: 'Tipos',
|
2926 | 'unamed-property': 'Propriedade não-nomeada',
|
2927 | 'unit-test-coverage': 'Cobertura de teste unitário',
|
2928 | value: 'Valor',
|
2929 | variables: 'Variáveis',
|
2930 | yes: 'Sim',
|
2931 | zoomin: 'Zoom in',
|
2932 | zoomout: 'Zoom out'
|
2933 | };
|
2934 |
|
2935 | var TRANSLATION_SK_SK = {
|
2936 | accessors: 'Modifikátory prístupu',
|
2937 | arguments: 'Argumenty',
|
2938 | bootstrap: 'Bootstrap',
|
2939 | branches: 'Vetvy',
|
2940 | browse: 'Prezerať',
|
2941 | classe: 'Trieda',
|
2942 | classes: 'Triedy',
|
2943 | component: 'Komponent',
|
2944 | components: 'Komponenty',
|
2945 | constructor: 'Konštruktor',
|
2946 | controllers: 'Controllers',
|
2947 | controller: 'Controller',
|
2948 | 'coverage-page-title': 'Pokrytie dokumentáciou',
|
2949 | declarations: 'Deklarácie',
|
2950 | decorators: 'Dekorátory',
|
2951 | 'default-value': 'Predvolená hodnota',
|
2952 | 'defined-in': 'Definované v',
|
2953 | dependencies: 'Závislosti',
|
2954 | deprecated: 'Zastarel',
|
2955 | description: 'Popis',
|
2956 | directive: 'Direktíva',
|
2957 | directives: 'Direktívy',
|
2958 | 'dom tree': 'DOM strom',
|
2959 | entities: 'Subjektov',
|
2960 | entity: 'Subjekt',
|
2961 | entrycomponents: 'EntryComponents',
|
2962 | enumerations: 'Enumerátory',
|
2963 | enums: 'Enumerátory',
|
2964 | example: 'Príklad',
|
2965 | examples: 'Príklady',
|
2966 | exports: 'Exporty',
|
2967 | "extends": 'Rozširuje',
|
2968 | file: 'Súbor',
|
2969 | functions: 'Funkcie',
|
2970 | 'generated-using': 'Dokumentácia vytvorená pomocou',
|
2971 | 'getting-started': 'Začíname',
|
2972 | guard: 'Guard',
|
2973 | guards: 'Guards',
|
2974 | hostbindings: 'HostBindings',
|
2975 | hostlisteners: 'HostListeners',
|
2976 | 'html-element': 'HTML element',
|
2977 | 'html-element-with-directive': 'HTML element s direktívou',
|
2978 | identifier: 'Identifikátor',
|
2979 | implements: 'Implementuje',
|
2980 | imports: 'Importuje',
|
2981 | index: 'Index',
|
2982 | indexable: 'Indexovateľný',
|
2983 | info: 'Informácie',
|
2984 | 'inherited-from': 'Zdedené od',
|
2985 | injectable: 'Injectable',
|
2986 | injectables: 'Injectables',
|
2987 | inputs: 'Vstupy',
|
2988 | interceptors: 'Interceptors',
|
2989 | interface: 'Rozhranie',
|
2990 | interfaces: 'Rozhrania',
|
2991 | legend: 'Legenda',
|
2992 | license: 'Licencia',
|
2993 | lines: 'Riadky',
|
2994 | metadata: 'Metadáta',
|
2995 | methods: 'Metódy',
|
2996 | miscellaneous: 'Rôzne',
|
2997 | module: 'Modul',
|
2998 | modules: 'Moduly',
|
2999 | name: 'Názov',
|
3000 | no: 'Nie',
|
3001 | 'no-graph': 'Nie je k dispozícii žiadny graf.',
|
3002 | 'no-iframe': 'Váš prehliadač nepodporuje iframe',
|
3003 | 'no-result-matching': 'Nenájdené žiadne výsledky pre',
|
3004 | 'no-svg': 'Váš prehliadač nepodporuje SVG',
|
3005 | optional: 'Voliteľný',
|
3006 | outputs: 'Výstupy',
|
3007 | overview: 'Prehľad',
|
3008 | parameters: 'Parametre',
|
3009 | 'peer-dependencies': 'Peer dependencies',
|
3010 | pipe: 'Pipe',
|
3011 | pipes: 'Pipes',
|
3012 | prefix: 'Prefix',
|
3013 | properties: 'Vlastnosti',
|
3014 | providers: 'Providers',
|
3015 | pure: 'Pure',
|
3016 | readme: 'README',
|
3017 | reset: 'Resetovať',
|
3018 | 'results-matching': 'výsledkov pre',
|
3019 | returns: 'Návratová hodnota',
|
3020 | route: 'Route',
|
3021 | routes: 'Routes',
|
3022 | schemas: 'Schémy',
|
3023 | 'search-placeholder': 'Zadajte hľadaný text',
|
3024 | selector: 'Selektor',
|
3025 | signature: 'Podpis',
|
3026 | source: 'Zdroj',
|
3027 | statements: 'Statements',
|
3028 | styles: 'Štýly',
|
3029 | template: 'Šablóna',
|
3030 | type: 'Typ',
|
3031 | 'type-aliases': 'Type aliases',
|
3032 | 'type-parameters': 'Type parameters',
|
3033 | types: 'Typy',
|
3034 | 'unamed-property': 'Nepomenovaný atribút',
|
3035 | 'unit-test-coverage': 'Pokrytie unit testami',
|
3036 | value: 'Hodnota',
|
3037 | variables: 'Premenné',
|
3038 | yes: 'Áno',
|
3039 | zoomin: 'Priblížiť',
|
3040 | zoomout: 'Oddialiť'
|
3041 | };
|
3042 |
|
3043 | var TRANSLATION_ZH_CN = {
|
3044 | accessors: '存取器',
|
3045 | arguments: 'Arguments',
|
3046 | bootstrap: '根组件',
|
3047 | branches: '分支',
|
3048 | browse: '查看',
|
3049 | classe: '类',
|
3050 | classes: '类列表',
|
3051 | component: '组件',
|
3052 | components: '组件列表',
|
3053 | constructor: '构造方法',
|
3054 | controllers: 'Controllers',
|
3055 | controller: 'Controller',
|
3056 | 'coverage-page-title': '文档概览',
|
3057 | declarations: '可声明对象列表',
|
3058 | decorators: '装饰器列表',
|
3059 | 'default-value': '缺省值',
|
3060 | 'defined-in': '被定义在',
|
3061 | dependencies: '依赖项',
|
3062 | deprecated: '已弃用',
|
3063 | description: '描述',
|
3064 | directive: '指令',
|
3065 | directives: '指令列表',
|
3066 | 'dom tree': 'DOM 树',
|
3067 | entities: '实体',
|
3068 | entity: '实体',
|
3069 | entrycomponents: '入口组件列表',
|
3070 | enumerations: '列举',
|
3071 | enums: '枚举列表',
|
3072 | example: '例子',
|
3073 | examples: '例子',
|
3074 | exports: '导出',
|
3075 | "extends": '继承',
|
3076 | file: '文件',
|
3077 | functions: '函数',
|
3078 | 'generated-using': '文档生成使用',
|
3079 | 'getting-started': '入门指南',
|
3080 | guard: '路由守卫',
|
3081 | guards: '路由守卫列表',
|
3082 | hostbindings: '宿主绑定',
|
3083 | hostlisteners: '宿主监听',
|
3084 | 'html-element': 'Html 元素',
|
3085 | 'html-element-with-directive': '带指令的Html元素',
|
3086 | identifier: '标识符',
|
3087 | implements: '实现',
|
3088 | imports: '引入',
|
3089 | index: '索引',
|
3090 | indexable: 'Indexable',
|
3091 | info: '信息',
|
3092 | 'inherited-from': '继承自',
|
3093 | injectable: '可注入的',
|
3094 | injectables: '可注入的',
|
3095 | inputs: '输入属性',
|
3096 | interceptors: '拦截器',
|
3097 | interface: '接口',
|
3098 | interfaces: '接口',
|
3099 | legend: '图例',
|
3100 | license: '许可协议',
|
3101 | lines: 'Lines',
|
3102 | metadata: '元数据',
|
3103 | methods: '方法',
|
3104 | miscellaneous: '其他',
|
3105 | module: '模块',
|
3106 | modules: '模块列表',
|
3107 | name: '名称',
|
3108 | no: '否',
|
3109 | 'no-graph': '无数据显示',
|
3110 | 'no-iframe': '你的浏览器不支持iframes',
|
3111 | 'no-result-matching': '无匹配的结果',
|
3112 | 'no-svg': '你的浏览器不支持SVG',
|
3113 | optional: '可选的',
|
3114 | outputs: '输出属性',
|
3115 | overview: '概述',
|
3116 | parameters: '参数列表',
|
3117 | 'peer-dependencies': '同级依赖',
|
3118 | pipe: '管道',
|
3119 | pipes: '管道列表',
|
3120 | prefix: '字首',
|
3121 | properties: '属性列表',
|
3122 | providers: '提供商列表',
|
3123 | pure: 'Pure',
|
3124 | readme: '手册',
|
3125 | reset: '重置',
|
3126 | 'results-matching': '匹配的结果',
|
3127 | returns: '返回',
|
3128 | route: '路由',
|
3129 | routes: '路由列表',
|
3130 | schemas: '模式',
|
3131 | 'search-placeholder': '请输入查询关键字',
|
3132 | selector: '选择器',
|
3133 | signature: '签名',
|
3134 | source: '来源',
|
3135 | statements: '注释',
|
3136 | styles: '样式',
|
3137 | template: '模板',
|
3138 | type: '类型',
|
3139 | 'type-aliases': '类型别名',
|
3140 | 'type-parameters': '类型参数',
|
3141 | types: '类型',
|
3142 | 'unamed-property': '未命名属性',
|
3143 | 'unit-test-coverage': '单元测试概览',
|
3144 | value: '值',
|
3145 | variables: '变量',
|
3146 | yes: '是',
|
3147 | zoomin: '放大',
|
3148 | zoomout: '缩小'
|
3149 | };
|
3150 |
|
3151 | var TRANSLATION_ZH_TW = {
|
3152 | accessors: '存取器',
|
3153 | arguments: '參數',
|
3154 | bootstrap: '根元件',
|
3155 | branches: '分支',
|
3156 | browse: '瀏覽',
|
3157 | classe: '類別',
|
3158 | classes: '類別',
|
3159 | component: '元件',
|
3160 | components: '元件列表',
|
3161 | constructor: '建構式方法',
|
3162 | controllers: 'Controllers',
|
3163 | controller: 'Controller',
|
3164 | 'coverage-page-title': '覆蓋率頁面標題',
|
3165 | declarations: 'Declarations',
|
3166 | decorators: '裝飾器列表',
|
3167 | 'default-value': '預設值',
|
3168 | 'defined-in': '被定義在',
|
3169 | dependencies: '依賴項',
|
3170 | deprecated: '已棄用',
|
3171 | description: '描述',
|
3172 | directive: '指令 (Directive)',
|
3173 | directives: '指令 (Directives)',
|
3174 | 'dom tree': 'DOM 樹',
|
3175 | entities: '實體',
|
3176 | entity: '實體',
|
3177 | entrycomponents: 'Entrycomponents',
|
3178 | enumerations: '列舉',
|
3179 | enums: '枚舉列表',
|
3180 | example: '範例',
|
3181 | examples: '範例',
|
3182 | exports: '匯出',
|
3183 | "extends": '繼承',
|
3184 | file: '檔案',
|
3185 | functions: '函數',
|
3186 | 'generated-using': '產生文件使用',
|
3187 | 'getting-started': '快速上手',
|
3188 | guard: '路由守衛',
|
3189 | guards: '路由守衛列表',
|
3190 | hostbindings: 'Host Bindings',
|
3191 | hostlisteners: 'Host Listeners',
|
3192 | 'html-element': 'HTML 元素',
|
3193 | 'html-element-with-directive': '帶指令的 HTML 元素',
|
3194 | identifier: '識別符號',
|
3195 | implements: '實作',
|
3196 | imports: '匯入',
|
3197 | index: '索引',
|
3198 | indexable: 'Indexable',
|
3199 | info: '資訊',
|
3200 | 'inherited-from': '繼承自',
|
3201 | injectable: 'Injectable',
|
3202 | injectables: 'Injectables',
|
3203 | inputs: '輸入屬性',
|
3204 | interceptors: '攔截器',
|
3205 | interface: '介面',
|
3206 | interfaces: '介面',
|
3207 | legend: '圖例',
|
3208 | license: '授權協議',
|
3209 | lines: 'Lines',
|
3210 | metadata: '元數據',
|
3211 | methods: '方法',
|
3212 | miscellaneous: '其他',
|
3213 | module: '模組',
|
3214 | modules: '模組列表',
|
3215 | name: '名稱',
|
3216 | no: '否',
|
3217 | 'no-graph': '無數據顯示',
|
3218 | 'no-iframe': '你的瀏覽器不支援 iframes',
|
3219 | 'no-result-matching': '無匹配的結果',
|
3220 | 'no-svg': '你的瀏覽器不支援 SVG',
|
3221 | optional: '可選的',
|
3222 | outputs: '輸出屬性',
|
3223 | overview: '概述',
|
3224 | parameters: '參數列表',
|
3225 | 'peer-dependencies': 'Peer Dependencies',
|
3226 | pipe: '管道',
|
3227 | pipes: '管道列表',
|
3228 | prefix: '前置詞',
|
3229 | properties: '屬性列表',
|
3230 | providers: '提供者列表',
|
3231 | pure: 'Pure',
|
3232 | readme: 'README',
|
3233 | reset: '重設',
|
3234 | 'results-matching': '匹配的結果',
|
3235 | returns: '回傳值',
|
3236 | route: '路由',
|
3237 | routes: '路由列表',
|
3238 | schemas: 'Schemas',
|
3239 | 'search-placeholder': '請輸入查詢關鍵字',
|
3240 | selector: '選擇器',
|
3241 | signature: '簽名',
|
3242 | source: '來源',
|
3243 | statements: '陳述式',
|
3244 | styles: '樣式',
|
3245 | template: '範本',
|
3246 | type: '型別',
|
3247 | 'type-aliases': '型別別名',
|
3248 | 'type-parameters': '型別參數',
|
3249 | types: '型別',
|
3250 | 'unamed-property': '未命名屬性',
|
3251 | 'unit-test-coverage': '單元測試覆蓋率',
|
3252 | value: '值',
|
3253 | variables: '變數',
|
3254 | yes: '是',
|
3255 | zoomin: '放大',
|
3256 | zoomout: '縮小'
|
3257 | };
|
3258 |
|
3259 | var TRANSLATION_KO_KR = {
|
3260 | accessors: '접근자',
|
3261 | arguments: '인수',
|
3262 | bootstrap: 'Bootstrap',
|
3263 | branches: '브랜치',
|
3264 | browse: '탐색',
|
3265 | classe: '클래스',
|
3266 | classes: '클래스',
|
3267 | component: '컴포넌트',
|
3268 | components: '컴포넌트',
|
3269 | constructor: '생성자',
|
3270 | controllers: '컨트롤러',
|
3271 | controller: '컨트롤러',
|
3272 | 'coverage-page-title': '문서 커버리지',
|
3273 | declarations: '선언',
|
3274 | decorators: '데코레이터',
|
3275 | 'default-value': '기본 값',
|
3276 | 'defined-in': '다음에 정의됨',
|
3277 | dependencies: '의존성',
|
3278 | deprecated: '비추천',
|
3279 | description: '설명',
|
3280 | directive: 'Directive',
|
3281 | directives: 'Directives',
|
3282 | 'dom tree': '돔 트리',
|
3283 | entities: '엔티티',
|
3284 | entity: '실재',
|
3285 | entrycomponents: 'EntryComponents',
|
3286 | enumerations: '열거',
|
3287 | enums: 'Enums',
|
3288 | example: '예시',
|
3289 | examples: '예',
|
3290 | exports: '내보내기',
|
3291 | "extends": 'Extends',
|
3292 | file: '파일',
|
3293 | functions: '함수',
|
3294 | 'generated-using': '이 문서는 다음을 이용하여 생성되었습니다',
|
3295 | 'getting-started': '시작하기',
|
3296 | guard: '가드',
|
3297 | guards: '가드',
|
3298 | hostbindings: 'HostBindings',
|
3299 | hostlisteners: 'HostListeners',
|
3300 | 'html-element': 'HTML 요소',
|
3301 | 'html-element-with-directive': '지시어가 있는 HTML 요소',
|
3302 | identifier: '식별자',
|
3303 | implements: '구현',
|
3304 | imports: '가져오기',
|
3305 | index: '색인',
|
3306 | indexable: 'Indexable',
|
3307 | info: '정보',
|
3308 | 'inherited-from': '다음에서 상속됨',
|
3309 | injectable: 'Injectable',
|
3310 | injectables: 'Injectables',
|
3311 | inputs: '입력',
|
3312 | interceptors: 'Interceptors',
|
3313 | interface: '인터페이스',
|
3314 | interfaces: '인터페이스',
|
3315 | legend: '범례',
|
3316 | license: '라이선스',
|
3317 | lines: '줄',
|
3318 | metadata: '메타데이터',
|
3319 | methods: '메소드',
|
3320 | miscellaneous: '기타',
|
3321 | module: '모듈',
|
3322 | modules: '모듈',
|
3323 | name: '이름',
|
3324 | no: '아니오',
|
3325 | 'no-graph': '사용할 수 있는 그래프가 없습니다.',
|
3326 | 'no-iframe': '사용중인 브라우저가 iframe을 지원하지 않습니다',
|
3327 | 'no-result-matching': '검색 결과가 없습니다',
|
3328 | 'no-svg': '브라우저가 SVG를 지원하지 않습니다',
|
3329 | optional: '선택적',
|
3330 | outputs: '결과물',
|
3331 | overview: '개요',
|
3332 | parameters: '매개변수',
|
3333 | 'peer-dependencies': '상호 의존성',
|
3334 | pipe: '파이프',
|
3335 | pipes: '파이프',
|
3336 | prefix: '접두어',
|
3337 | properties: '속성',
|
3338 | providers: '제공자',
|
3339 | pure: 'Pure',
|
3340 | readme: 'README',
|
3341 | reset: '초기화',
|
3342 | 'results-matching': '개의 결과가 일치했습니다',
|
3343 | returns: '반환',
|
3344 | route: 'Route',
|
3345 | routes: 'Routes',
|
3346 | schemas: '스키마',
|
3347 | 'search-placeholder': '검색어 입력',
|
3348 | selector: '선택자',
|
3349 | signature: 'Signature',
|
3350 | source: '출처',
|
3351 | statements: 'Statements',
|
3352 | styles: '스타일',
|
3353 | template: '주형',
|
3354 | type: '타입',
|
3355 | 'type-aliases': '타입 별칭',
|
3356 | 'type-parameters': '타입 매개 변수',
|
3357 | types: '타입',
|
3358 | 'unamed-property': '익명 속성',
|
3359 | 'unit-test-coverage': '단위 테스트 커버리지',
|
3360 | value: '값',
|
3361 | variables: '변수',
|
3362 | yes: '네',
|
3363 | zoomin: '확대',
|
3364 | zoomout: '축소'
|
3365 | };
|
3366 |
|
3367 | var I18nEngine = /** @class */ (function () {
|
3368 | function I18nEngine() {
|
3369 | this.availablesLanguages = {
|
3370 | 'de-DE': 'de-DE',
|
3371 | 'en-US': 'en-US',
|
3372 | 'es-ES': 'es-ES',
|
3373 | 'fr-FR': 'fr-FR',
|
3374 | 'hu-HU': 'hu-HU',
|
3375 | 'it-IT': 'it-IT',
|
3376 | 'ja-JP': 'ja-JP',
|
3377 | 'ko-KR': 'ko-KR',
|
3378 | 'nl-NL': 'nl-NL',
|
3379 | 'pl-PL': 'pl-PL',
|
3380 | 'pt-BR': 'pt-BR',
|
3381 | 'sk-SK': 'sk-SK',
|
3382 | 'zh-CN': 'zh-CN',
|
3383 | 'zh-TW': 'zh-TW'
|
3384 | };
|
3385 | this.fallbackLanguage = 'en-US';
|
3386 | }
|
3387 | I18nEngine.getInstance = function () {
|
3388 | if (!I18nEngine.instance) {
|
3389 | I18nEngine.instance = new I18nEngine();
|
3390 | }
|
3391 | return I18nEngine.instance;
|
3392 | };
|
3393 | I18nEngine.prototype.init = function (language) {
|
3394 | i18next__default["default"].init({
|
3395 | lng: language,
|
3396 | fallbackLng: this.fallbackLanguage,
|
3397 | interpolation: {
|
3398 | skipOnVariables: false
|
3399 | }
|
3400 | });
|
3401 | i18next__default["default"].addResources('de-DE', 'translation', TRANSLATION_DE_DE);
|
3402 | i18next__default["default"].addResources('en-US', 'translation', TRANSLATION_EN_US);
|
3403 | i18next__default["default"].addResources('es-ES', 'translation', TRANSLATION_ES_ES);
|
3404 | i18next__default["default"].addResources('fr-FR', 'translation', TRANSLATION_FR_FR);
|
3405 | i18next__default["default"].addResources('hu-HU', 'translation', TRANSLATION_HU_HU);
|
3406 | i18next__default["default"].addResources('it-IT', 'translation', TRANSLATION_IT_IT);
|
3407 | i18next__default["default"].addResources('ja-JP', 'translation', TRANSLATION_JA_JP);
|
3408 | i18next__default["default"].addResources('ko-KR', 'translation', TRANSLATION_KO_KR);
|
3409 | i18next__default["default"].addResources('nl-NL', 'translation', TRANSLATION_NL_NL);
|
3410 | i18next__default["default"].addResources('pl-PL', 'translation', TRANSLATION_PL_PL);
|
3411 | i18next__default["default"].addResources('pt-BR', 'translation', TRANSLATION_PT_BR);
|
3412 | i18next__default["default"].addResources('sk-SK', 'translation', TRANSLATION_SK_SK);
|
3413 | i18next__default["default"].addResources('zh-CN', 'translation', TRANSLATION_ZH_CN);
|
3414 | i18next__default["default"].addResources('zh-TW', 'translation', TRANSLATION_ZH_TW);
|
3415 | };
|
3416 | I18nEngine.prototype.translate = function (key) {
|
3417 | return i18next__default["default"].t(key);
|
3418 | };
|
3419 | I18nEngine.prototype.exists = function (key) {
|
3420 | return i18next__default["default"].exists(key);
|
3421 | };
|
3422 | I18nEngine.prototype.supportLanguage = function (language) {
|
3423 | return typeof this.availablesLanguages[language] !== 'undefined';
|
3424 | };
|
3425 | return I18nEngine;
|
3426 | }());
|
3427 | var I18nEngine$1 = I18nEngine.getInstance();
|
3428 |
|
3429 | var decache$1 = require('decache');
|
3430 | var MarkdownToPDFEngine = /** @class */ (function () {
|
3431 | function MarkdownToPDFEngine() {
|
3432 | var _this = this;
|
3433 | this.convertedTokens = [];
|
3434 | decache$1('marked');
|
3435 | var marked = require('marked').marked;
|
3436 | this.markedInstance = marked;
|
3437 | var renderer = new this.markedInstance.Renderer();
|
3438 | renderer.strong = function (text) {
|
3439 | // console.log('MarkdownToPDFEngine strong: ', text);
|
3440 | return { text: text, bold: true };
|
3441 | };
|
3442 | renderer.em = function (text) {
|
3443 | // console.log('MarkdownToPDFEngine em: ', text);
|
3444 | _this.convertedTokens.push({ text: text, italics: true });
|
3445 | return text;
|
3446 | };
|
3447 | renderer.paragraph = function (text) {
|
3448 | // console.log('MarkdownToPDFEngine paragraph: ', text);
|
3449 | return text;
|
3450 | };
|
3451 | // TODO Add custom parser... -> https://github.com/markedjs/marked/issues/504
|
3452 | this.markedInstance.setOptions({
|
3453 | renderer: renderer,
|
3454 | gfm: true,
|
3455 | breaks: false
|
3456 | });
|
3457 | }
|
3458 | MarkdownToPDFEngine.getInstance = function () {
|
3459 | if (!MarkdownToPDFEngine.instance) {
|
3460 | MarkdownToPDFEngine.instance = new MarkdownToPDFEngine();
|
3461 | }
|
3462 | return MarkdownToPDFEngine.instance;
|
3463 | };
|
3464 | MarkdownToPDFEngine.prototype.convert = function (stringToConvert) {
|
3465 | this.convertedTokens = [];
|
3466 | // console.log('MarkdownToPDFEngine convert: ', stringToConvert);
|
3467 | var tokens = this.markedInstance.lexer(stringToConvert);
|
3468 | // console.log(tokens);
|
3469 | this.markedInstance.Parser.parse(tokens);
|
3470 | // console.log(this.convertedTokens);
|
3471 | var result = {
|
3472 | text: this.convertedTokens
|
3473 | };
|
3474 | return result;
|
3475 | };
|
3476 | return MarkdownToPDFEngine;
|
3477 | }());
|
3478 | var MarkdownToPdfEngine = MarkdownToPDFEngine.getInstance();
|
3479 |
|
3480 | var PdfPrinter = require('pdfmake');
|
3481 | var ExportPdfEngine = /** @class */ (function () {
|
3482 | function ExportPdfEngine() {
|
3483 | }
|
3484 | ExportPdfEngine.getInstance = function () {
|
3485 | if (!ExportPdfEngine.instance) {
|
3486 | ExportPdfEngine.instance = new ExportPdfEngine();
|
3487 | }
|
3488 | return ExportPdfEngine.instance;
|
3489 | };
|
3490 | ExportPdfEngine.prototype["export"] = function (outputFolder) {
|
3491 | var fonts = {
|
3492 | Roboto: {
|
3493 | normal: path__namespace.join(__dirname, '../src/resources/fonts/roboto-v15-latin-regular.ttf'),
|
3494 | bold: path__namespace.join(__dirname, '../src/resources/fonts/roboto-v15-latin-700.ttf'),
|
3495 | italics: path__namespace.join(__dirname, '../src/resources/fonts/roboto-v15-latin-italic.ttf')
|
3496 | }
|
3497 | };
|
3498 | var printer = new PdfPrinter(fonts);
|
3499 | var docDefinition = {
|
3500 | info: {
|
3501 | title: Configuration$1.mainData.documentationMainName
|
3502 | },
|
3503 | content: [],
|
3504 | styles: {
|
3505 | header: {
|
3506 | fontSize: 18,
|
3507 | bold: true,
|
3508 | color: '#008cff',
|
3509 | margin: [0, 0, 0, 15]
|
3510 | },
|
3511 | subheader: {
|
3512 | fontSize: 15,
|
3513 | bold: true
|
3514 | }
|
3515 | }
|
3516 | };
|
3517 | docDefinition.content.push({
|
3518 | text: Configuration$1.mainData.documentationMainName,
|
3519 | alignment: 'center',
|
3520 | bold: true,
|
3521 | fontSize: 22,
|
3522 | margin: [10, 350, 10, 270]
|
3523 | });
|
3524 | Configuration$1.mainData.hideDarkModeToggle = true;
|
3525 | if (!Configuration$1.mainData.hideGenerator) {
|
3526 | docDefinition.content.push({
|
3527 | text: I18nEngine$1.translate('generated-using'),
|
3528 | alignment: 'center'
|
3529 | });
|
3530 | docDefinition.content.push({
|
3531 | image: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAUgAA/+4AJkFkb2JlAGTAAAAAAQMAFQQDBgoNAAAEqAAAB+0AAAr7AAAPLf/bAIQAAgEBAQIBAgICAgMCAgIDBAMCAgMEBAMDBAMDBAUEBQUFBQQFBQYHBwcGBQkJCQkJCQwMDAwMDAwMDAwMDAwMDAECAgIEBAQIBQUIDAkICQwODg4ODg4ODAwMDAwODgwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8IAEQgARgBGAwERAAIRAQMRAf/EAOoAAAIDAQEBAQAAAAAAAAAAAAAIBAYHBQIBCQEBAAIDAQEBAAAAAAAAAAAAAAQHAgUGAwgBEAABBAIBAgUDBQAAAAAAAAAEAQIDBQAGByATEBESFBVAMSIhMzUWCBEAAQIDAwcGCwcFAAAAAAAAAQIDERMEABIFITFBUSIyFBAgYUIzFXGBkaHBUmIjcyQG8LFykkM0NdGC4lMWEgABAwMCAwgDAAAAAAAAAAABABECEDESIEHwIQMwQFBRYYGhIrEyExMBAAEDAwMEAwEBAQAAAAAAAREAITFBUWEQcYEg8JGhscHh0UDx/9oADAMBAAIRAxEAAAF/gADn4SvT8nZxgAONlChfvhZsNorWW8per7lk+uou+6bdycPTjZQsBlV/u8XvbBjsER5b6NYHoqX7vT1tjvT8o0Ff2Pkfzx119ujk7juPajxujVWsbqdm1fneTl5Lnts6N2VYtjTNrZXQnX6tf/HqzIsP3G27a7um8sg9rguss5tN7RfZ9IHL0MuNF9fz1k3i5+6pTWPXU5TB7fSZnITco4AFX8NxZ/fT/SISwAS0gFYOmaUdM0o04AA5ZMJAAB//2gAIAQEAAQUC6LO0ACCr7OuKg6Ly8CAC1rZhLEXP9Ib20KPgJYrPb9n5JqK2zELGnGy8vAgApZbm6ude14OvDzkW0Wy2LgnUQ67UuQOP4bKHS90PpT/l6z4zaYTpTtLBqYarORb34/UQiorBwgsMAmc0yaywirl2H+l2tUMWMi2VZZVlmMUN/oLe6+O84DqISrvORuRhqgbSdJtdgtf6/TfDZa1QxY1RUDAibuIyz2PhbUEp9Bzb+Kam0uK+vDFD6LvTNXscRE8sBNFJC8bGHf8A23w26kWVlX8j1mrwQ8iSh6bBsaKMJfQ6tqX8z0XXwvxAntfa9H//2gAIAQIAAQUC6FXyxF6UTFTw9v3EaK5jhwXPa5qouImfbFXwfP8AnG9ytCN9GFCpKnbd6ijyoCgrBhDMld5NhAf3k8BrLtLI+L12FewhiLMDMCcwhk7VXB2frksvlkcfqz0p5ZYV7CGVlY0ZnfXG/bHwIqonS6NF+o//2gAIAQMAAQUC6IYXSOlhcxeiedI0GJSRMr7BBpLG7hmgIsGxua5FTJ50jRVfM8cdI0wARrILaOJk5wPcwQtYl7rfS4OKaJgPY8Kkbuzyt7WPerlxdbkLZHBP6YZlYv4ytliVi0EscWbAYnaypqVnWxsWCs9y/uZDMrFmmWRWU7GsO/dwC7fCyWVz3dA580X1H//aAAgBAgIGPwLtuadMdXIrmmNk4usd1lK/wyyjV64ysoy4ZYyXDELKK5aWpjJeu/gX/9oACAEDAgY/AtGMbppBtLmuZi6aF0ycUc6B05e6I6YZOLpjZZbLFNQBHqHZOaGcLj5Uum3t6vVijKe6EYm9Mpfr+VjG+wX9H+2gCJYojyphfyWUr6frLvH/2gAIAQEBBj8C5i6iqcDTKIXln2jAZrTKZ9D6PWQoKHm5peePw29KjaKdh5Has6ukdHJQYYE358X6iBhBKdlHlMfJYvtLWluibK3k5U5VbKQYfbJZqmKS+qPzN39NJ9PRZDzKw404IoWMxHIXnj8NvSo29Zat1PUQi0tvacV2rulR5KupKb9OpctgkRQUN5B5c9lVKGg27iS5ivho2Uek+OxqaYBFcgeAOAaD06jZVPUJUaUqg+wd5CtYtxk5PC3b87q3bLTV5/04bt32bDh9pw/uFHevf05Kt4GDriZTP43MnmGW1PhrSDOqVIazbKY5z4rNMtiDbKQhseykQHIzD+TPaBGaV7fTqtid3+M93MKs0yajc9Nri8hG4vSDbUoflUm0xv8AuTpBtS4UtSkBlE5xcNiY5kAjrAHns/iUQtukRdaUMomu/wCMeSQxBzEHBspzhsHrK9AsuoqFq4a9GqqjvKV6qen7rd38Ong7lyRoh9tPJcXkI3F6QbHSuEXXPBatxCY4w9VuEqyxF0ZEhSTqAtStKCZ9VGpqFJFyKnd3J+ADkaqws06ifnAnrpGrUbN09O2GmWhBCBzY1dG24v8A27q/zJgeVmoYXMZqEJcZXrQsRBy9HM+pi2zj/wD05fq+CeQX+7uCvAolZZMZW5DavWZp6BGPsfTj2L4ciFUqrbrEtqpnxVmKjNS1EpiTkjmsmsL2MoLtHjbWILfcqShtqlAFGdvIgw3Tps67h4+oDgb3dhxebxPHuRvGqNLf95AxEbniyWIxNvGR9O8XW92NL4w1wR8vw82V8xc7W7e6I9WzDBZxNGJt4VRN4ElsVMlFQlgCDsv3YId7SZ1bVPGIr+859TFa+K4Ph5ypV0/t4S7sBnz6Y82o7xk8BLPF8TdkStN+/sw8Nm5F2TdEm5C5chkuwyQhzf/aAAgBAQMBPyH0Z6rshBiLloU785aMmHj0yIFsHin7afFrBl/IXRNcl2LM5uPCspYSGzxlViaRVDmyy+9XCj8qZlHSRAtg8U/bQcDHCQT9B996PhYLn8oaHTjXpAVJGHyqwgFzqB+CnsQEd/wNsPWiAh2E3CamtfI6+T+Zm2aICD2Gh4e2pg2NkPa7bP8AZ6eROPVnMnhUaumRcBZcC9cUadEXwdEpxDaNiz/7I4iolcRS4WHd8I5inB5R+0blecA9+KNJfD+E1OvYmuVYnJdqEiXCLiSJsJdzogf/AN/qPZGQrTnKrqOVq/4H4Nrn7zN9U3z0cHlH7RuUmzNYNLoDYqLZqOCUMIjipniCRAwYQKb9ATriTGz2MT5yX0OEfD9rq+lzhofnDy0AAQFgMR0NoKogfGg3XoBFCmLOrSEA4Jiuf7Iem5CFda5btRSkCbLpWkJFOob7ZhLsb0PIrbHgSB2bK6VAD0ESMrhDNlySpBYj+SHOlhWNx6f9Tm3jucK/TvW+qI9P/9oACAECAwE/IfQYloXHpkqPotQYipJhS7HbmsCE6SVYVP0BWT7okuaR/wDnrx3O9aR2U/8AG17Tj7nmvkUaj7116TDWc2nz73oQR0Mri+uf5VwL3Z7HPFagNHUfeStip7HH47189zUffzVp0U97p0xzNI5cV2DpqA0dR95Kihd5f5xTNcmnMukyoAg9OTP+j//aAAgBAwMBPyH0DBlVJkuben2Uat6zqdJUikbR23aT5CWS5rO3Fmime/FGkkenso1yL6Co6Z1ehWCxIb3b3OMVGEGe+v8AlAP/AH15/jatQ7q2K31Gu477+9ukj4LvY/3HmmDLSe/HmmOZZ+egRxgnXt/cadr0chZexYN96kBSe/bpgAkGIxaNb9/xV+Semx/Y+OmCh9g/bQUC3scvH5rvhM+/cW6SArjOlIAgvFxeRzS0DKLEDHHRfD9D/lIklenKQbZPh/6P/9oADAMBAAIRAxEAABAADIAAEUBAJBiqBCnAtSQhDBOICAAYiAACASAAAAAf/9oACAEBAwE/EPQ0Vyd+zkJMsfVQdesoiZOQKE19N+ymQOSG4DsB4EgAwvAsJBsGLNnSazPqxJiQhRhiFO2A8prqSQwEZTsrkOxaFkS+XDcilaaaLwEdEwjcbN+l+ymQOSG4DsB4F/Kla5RW91dyt0FGgAJADzdNy3Kq0sJdcSncyDhuqxoE84dVAiw0pb87bALJYAEJ9Bpb/keEZqjTAbw18fXx6szNrNhhV6us10zH5arOVaVBMIYBYLxGIvfoZ4QxCMiWhFqpAFxlFE44KjS7N/jwA6LhRFMkL4jC26U6KoZhIe8+rtHkdS+gAAtMm68neEfic3VPiVFnI7JUfkQsWvwbOEotp8IuIFrwAb7T5HaQLKDEDJ0pB4EgJY9VlM5aE/7WX4QoJ1AMt6ADuUk2e6Z7u3eXS+gAAtMm68neEY8wnlRYKUKYC7QMVsGMcUsbFCZjPn3pgoloNiegCWw7JJLWTiiXDQO+4mD3VWVCqKqqqvpvqGZduIlRWwhxR9jg0AWADoFwg3hQAKgg3uei7zCjSUWEiLmyhHvBcRMAGYuUaGBARTnIrq0yGnW4b7j3EsA4ThUXVFvgEZRh2oooc22B33E/RFmA1gvOm0wSpWIk30fuUn+a9pm1ex9gmi0oiLen/9oACAECAwE/EPRLGAouUJx6XcFI+OgIUh3nvsUZEyhGz++blChhGWr9HO9OAUQj0dwUFBHL0iSDoNhva5T4leJ2oEkr2Tjc8l8gkLOAbPGzpWsbo3T71xF8U4cCxfdW3FvhcwGi6xFl8J/WA8hW7DY80II3WRZTvbnVvQgMHRqFXdn+G/kXsy6bQCRdSsWYfi00nCBc/KNx7CbIJH3dF7r7WjlbCjCXwnhP6cDyENA5JN/ijI05bv8AOhnI/qnqcnetIwiOicIFz8o3HsJsgi5rV3Y0Gg01cuxOxCbTZOyVEXEk3Z++hKcb8/2jQQHpx0v3/wBH/9oACAEDAwE/EPQxWZAReBXMGBrgtIV95OS3pev2NVsft0qU2Pg5NzoKaaY7CshILRJZzenPUxhDlq0XI3pyk5w0ft1jbxQJgSJ0ev2NVsft0rf6wewB996yLXcX/Nj99HC6AGpSTq0aUV84AmHNAtokgQSNqfgAPB2ednw2w/Bv5Fuc7mvetP2zsj3pmbZqVSVf7XvxhLYoTbKu++wfD7ahpLfcw8KKCBR5b2Mdyt5pHJcndUv30NYRlYBpcSGHYwmL0hHLUsZrL7D5vFaH9TRPeGtwD8r/AH89q+CjolTLsFq1gDVhOhC9OPXyoS2xbdQ7uhoFt3Cj6PgwXxjTAMDABgaGVY1TXfkZ/ERaMaEW6aH9TRPeGg5ESgd9+WjJ4iVmuygLeLFDCQSYTELCxLOLbdEMCDe5tHfNizNphs4lsq6/zQCwWLekmOYPyAdwmlVl/wCf/9k=",
|
3532 | width: 70,
|
3533 | alignment: 'center',
|
3534 | pageBreak: 'after'
|
3535 | });
|
3536 | }
|
3537 | docDefinition.content.push({
|
3538 | toc: {
|
3539 | title: {
|
3540 | text: I18nEngine$1.translate('table-of-contents'),
|
3541 | bold: true,
|
3542 | alignment: 'center',
|
3543 | fontSize: 18,
|
3544 | margin: [10, 10, 10, 50]
|
3545 | },
|
3546 | numberStyle: {
|
3547 | bold: true
|
3548 | }
|
3549 | },
|
3550 | pageBreak: 'after'
|
3551 | });
|
3552 | // Add README page if available
|
3553 | docDefinition.content.push(this.generateMarkdownContent());
|
3554 | // Add CHANGELOG page if available
|
3555 | // Add CONTRIBUTING page if available
|
3556 | // Add LICENSE page if available
|
3557 | // Add TODO page if available
|
3558 | // Add Dependencies page if available
|
3559 | // Add Additional pages if available
|
3560 | docDefinition.content.push(this.generateModulesContent());
|
3561 | docDefinition.content.push(this.generateComponentsContent());
|
3562 | // Classes
|
3563 | // Injectables
|
3564 | // Interceptors
|
3565 | // Guards
|
3566 | // Interfaces
|
3567 | // Pipes
|
3568 | // Miscellaneous
|
3569 | // Routes
|
3570 | // Coverage - docDefinition.content.push(...this.coverageEngine.calculateTable());
|
3571 | var pdfDoc = printer.createPdfKitDocument(docDefinition);
|
3572 | return new Promise(function (resolve, reject) {
|
3573 | fs__namespace.ensureFile(outputFolder + path__namespace.sep + 'documentation.pdf', function (err) {
|
3574 | if (err) {
|
3575 | reject("Error during pdf generation: " + err);
|
3576 | }
|
3577 | else {
|
3578 | pdfDoc.pipe(fs__namespace.createWriteStream(outputFolder + path__namespace.sep + 'documentation.pdf'));
|
3579 | pdfDoc.end();
|
3580 | resolve();
|
3581 | }
|
3582 | });
|
3583 | });
|
3584 | };
|
3585 | ExportPdfEngine.prototype.firstCharacterUpperCase = function (sentence) {
|
3586 | return sentence.charAt(0).toUpperCase() + sentence.slice(1);
|
3587 | };
|
3588 | ExportPdfEngine.prototype.generateMarkdownContent = function () {
|
3589 | var _this = this;
|
3590 | var pages = Configuration$1.markDownPages;
|
3591 | var data = [];
|
3592 | pages.forEach(function (page) {
|
3593 | data.push({
|
3594 | text: "" + _this.firstCharacterUpperCase(page.name),
|
3595 | tocItem: true,
|
3596 | style: 'header'
|
3597 | });
|
3598 | var convertedMarkdownObject = MarkdownToPdfEngine.convert(page.data);
|
3599 | convertedMarkdownObject.margin = [0, 10];
|
3600 | data.push(convertedMarkdownObject);
|
3601 | });
|
3602 | this.insertPageReturn(data);
|
3603 | return data;
|
3604 | };
|
3605 | ExportPdfEngine.prototype.insertPageReturn = function (data) {
|
3606 | data.push({
|
3607 | text: " ",
|
3608 | margin: [0, 0, 0, 20],
|
3609 | pageBreak: 'after'
|
3610 | });
|
3611 | };
|
3612 | ExportPdfEngine.prototype.generateModulesContent = function () {
|
3613 | var data = [];
|
3614 | data.push({
|
3615 | text: 'Modules',
|
3616 | tocItem: true,
|
3617 | style: 'header'
|
3618 | });
|
3619 | ___namespace.forEach(Configuration$1.mainData.modules, function (module) {
|
3620 | data.push({
|
3621 | text: "" + module.name,
|
3622 | style: 'subheader',
|
3623 | margin: [0, 15, 0, 15]
|
3624 | });
|
3625 | data.push({
|
3626 | text: [
|
3627 | {
|
3628 | text: "Filename : ",
|
3629 | bold: true
|
3630 | },
|
3631 | {
|
3632 | text: module.file
|
3633 | }
|
3634 | ],
|
3635 | margin: [0, 10]
|
3636 | });
|
3637 | if (module.rawdescription != '') {
|
3638 | data.push({
|
3639 | text: "Description :",
|
3640 | bold: true,
|
3641 | margin: [0, 10]
|
3642 | });
|
3643 | data.push({
|
3644 | text: "" + module.rawdescription,
|
3645 | margin: [0, 5]
|
3646 | });
|
3647 | }
|
3648 | if (module.declarations.length > 0) {
|
3649 | data.push({
|
3650 | text: "Declarations :",
|
3651 | bold: true,
|
3652 | margin: [0, 10]
|
3653 | });
|
3654 | var list_1 = { ul: [] };
|
3655 | ___namespace.forEach(module.declarations, function (declaration) {
|
3656 | list_1.ul.push({
|
3657 | text: "" + declaration.name
|
3658 | });
|
3659 | });
|
3660 | data.push(list_1);
|
3661 | }
|
3662 | if (module.providers.length > 0) {
|
3663 | data.push({
|
3664 | text: "Providers :",
|
3665 | bold: true,
|
3666 | margin: [0, 10]
|
3667 | });
|
3668 | var list_2 = { ul: [] };
|
3669 | ___namespace.forEach(module.providers, function (provider) {
|
3670 | list_2.ul.push({
|
3671 | text: "" + provider.name
|
3672 | });
|
3673 | });
|
3674 | data.push(list_2);
|
3675 | }
|
3676 | if (module.imports.length > 0) {
|
3677 | data.push({
|
3678 | text: "Imports :",
|
3679 | bold: true,
|
3680 | margin: [0, 10]
|
3681 | });
|
3682 | var list_3 = { ul: [] };
|
3683 | ___namespace.forEach(module.imports, function (importRef) {
|
3684 | list_3.ul.push({
|
3685 | text: "" + importRef.name
|
3686 | });
|
3687 | });
|
3688 | data.push(list_3);
|
3689 | }
|
3690 | if (module.exports.length > 0) {
|
3691 | data.push({
|
3692 | text: "Exports :",
|
3693 | bold: true,
|
3694 | margin: [0, 10]
|
3695 | });
|
3696 | var list_4 = { ul: [] };
|
3697 | ___namespace.forEach(module.exports, function (exportRef) {
|
3698 | list_4.ul.push({
|
3699 | text: "" + exportRef.name
|
3700 | });
|
3701 | });
|
3702 | data.push(list_4);
|
3703 | }
|
3704 | data.push({
|
3705 | text: " ",
|
3706 | margin: [0, 0, 0, 20]
|
3707 | });
|
3708 | });
|
3709 | this.insertPageReturn(data);
|
3710 | return data;
|
3711 | };
|
3712 | ExportPdfEngine.prototype.generateComponentsContent = function () {
|
3713 | var data = [];
|
3714 | data.push({
|
3715 | text: 'Components',
|
3716 | tocItem: true,
|
3717 | style: 'header'
|
3718 | });
|
3719 | ___namespace.forEach(Configuration$1.mainData.components, function (component) {
|
3720 | data.push({
|
3721 | text: "" + component.name,
|
3722 | style: 'subheader',
|
3723 | margin: [0, 15, 0, 15]
|
3724 | });
|
3725 | data.push({
|
3726 | text: [
|
3727 | {
|
3728 | text: "Filename : ",
|
3729 | bold: true
|
3730 | },
|
3731 | {
|
3732 | text: component.file
|
3733 | }
|
3734 | ],
|
3735 | margin: [0, 10]
|
3736 | });
|
3737 | if (component.rawdescription != '') {
|
3738 | data.push({
|
3739 | text: "Description :",
|
3740 | bold: true,
|
3741 | margin: [0, 10]
|
3742 | });
|
3743 | data.push({
|
3744 | text: "" + component.rawdescription,
|
3745 | margin: [0, 5]
|
3746 | });
|
3747 | }
|
3748 | data.push({
|
3749 | text: " ",
|
3750 | margin: [0, 0, 0, 20]
|
3751 | });
|
3752 | });
|
3753 | this.insertPageReturn(data);
|
3754 | return data;
|
3755 | };
|
3756 | return ExportPdfEngine;
|
3757 | }());
|
3758 | var ExportPdfEngine$1 = ExportPdfEngine.getInstance();
|
3759 |
|
3760 | var ExportEngine = /** @class */ (function () {
|
3761 | function ExportEngine() {
|
3762 | }
|
3763 | ExportEngine.getInstance = function () {
|
3764 | if (!ExportEngine.instance) {
|
3765 | ExportEngine.instance = new ExportEngine();
|
3766 | }
|
3767 | return ExportEngine.instance;
|
3768 | };
|
3769 | ExportEngine.prototype["export"] = function (outputFolder, data) {
|
3770 | switch (Configuration$1.mainData.exportFormat) {
|
3771 | case 'json':
|
3772 | return ExportJsonEngine$1["export"](outputFolder, data);
|
3773 | case 'pdf':
|
3774 | return ExportPdfEngine$1["export"](outputFolder);
|
3775 | }
|
3776 | };
|
3777 | return ExportEngine;
|
3778 | }());
|
3779 | var ExportEngine$1 = ExportEngine.getInstance();
|
3780 |
|
3781 | var BreakCommaHelper = /** @class */ (function () {
|
3782 | function BreakCommaHelper(bars) {
|
3783 | this.bars = bars;
|
3784 | }
|
3785 | BreakCommaHelper.prototype.helperFunc = function (context, text) {
|
3786 | text = this.bars.Utils.escapeExpression(text);
|
3787 | text = text.replace(/,/g, ',<br>');
|
3788 | return new Handlebars__namespace.SafeString(text);
|
3789 | };
|
3790 | return BreakCommaHelper;
|
3791 | }());
|
3792 |
|
3793 | var BreakLinesHelper = /** @class */ (function () {
|
3794 | function BreakLinesHelper(bars) {
|
3795 | this.bars = bars;
|
3796 | }
|
3797 | BreakLinesHelper.prototype.helperFunc = function (context, text) {
|
3798 | text = this.bars.Utils.escapeExpression(text);
|
3799 | text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
|
3800 | text = text.replace(/ /gm, ' ');
|
3801 | text = text.replace(/ /gm, ' ');
|
3802 | return new Handlebars__namespace.SafeString(text);
|
3803 | };
|
3804 | return BreakLinesHelper;
|
3805 | }());
|
3806 |
|
3807 | var CapitalizeHelper = /** @class */ (function () {
|
3808 | function CapitalizeHelper() {
|
3809 | }
|
3810 | CapitalizeHelper.prototype.helperFunc = function (context, text) {
|
3811 | return text.charAt(0).toUpperCase() + text.slice(1);
|
3812 | };
|
3813 | return CapitalizeHelper;
|
3814 | }());
|
3815 |
|
3816 | var CleanParagraphHelper = /** @class */ (function () {
|
3817 | function CleanParagraphHelper() {
|
3818 | }
|
3819 | CleanParagraphHelper.prototype.helperFunc = function (context, text) {
|
3820 | text = text.replace(/<p>/gm, '');
|
3821 | text = text.replace(/<\/p>/gm, '');
|
3822 | return new Handlebars__namespace.SafeString(text);
|
3823 | };
|
3824 | return CleanParagraphHelper;
|
3825 | }());
|
3826 |
|
3827 | var CompareHelper = /** @class */ (function () {
|
3828 | function CompareHelper() {
|
3829 | }
|
3830 | CompareHelper.prototype.helperFunc = function (context, a, operator, b, options) {
|
3831 | if (arguments.length < 4) {
|
3832 | throw new Error('handlebars Helper {{compare}} expects 4 arguments');
|
3833 | }
|
3834 | var result;
|
3835 | switch (operator) {
|
3836 | case 'indexof':
|
3837 | result = b.indexOf(a) !== -1;
|
3838 | break;
|
3839 | case '===':
|
3840 | result = a === b;
|
3841 | break;
|
3842 | case '!==':
|
3843 | result = a !== b;
|
3844 | break;
|
3845 | case '>':
|
3846 | result = a > b;
|
3847 | break;
|
3848 | default: {
|
3849 | throw new Error('helper {{compare}}: invalid operator: `' + operator + '`');
|
3850 | }
|
3851 | }
|
3852 | if (result === false) {
|
3853 | return options.inverse(context);
|
3854 | }
|
3855 | return options.fn(context);
|
3856 | };
|
3857 | return CompareHelper;
|
3858 | }());
|
3859 |
|
3860 | var DebugHelper = /** @class */ (function () {
|
3861 | function DebugHelper() {
|
3862 | }
|
3863 | DebugHelper.prototype.helperFunc = function (context, optionalValue) {
|
3864 | console.log('Current Context');
|
3865 | console.log('====================');
|
3866 | console.log(context);
|
3867 | if (optionalValue) {
|
3868 | console.log('OptionalValue');
|
3869 | console.log('====================');
|
3870 | console.log(optionalValue);
|
3871 | }
|
3872 | };
|
3873 | return DebugHelper;
|
3874 | }());
|
3875 |
|
3876 | var ElementAloneHelper = /** @class */ (function () {
|
3877 | function ElementAloneHelper() {
|
3878 | }
|
3879 | ElementAloneHelper.prototype.helperFunc = function (context, elements, elementType, options) {
|
3880 | var alones = [];
|
3881 | var modules = DependenciesEngine$1.modules;
|
3882 | elements.forEach(function (element) {
|
3883 | var foundInOneModule = false;
|
3884 | modules.forEach(function (module) {
|
3885 | module.declarations.forEach(function (declaration) {
|
3886 | if (declaration.id === element.id) {
|
3887 | foundInOneModule = true;
|
3888 | }
|
3889 | if (declaration.file === element.file) {
|
3890 | foundInOneModule = true;
|
3891 | }
|
3892 | });
|
3893 | module.bootstrap.forEach(function (boostrapedElement) {
|
3894 | if (boostrapedElement.id === element.id) {
|
3895 | foundInOneModule = true;
|
3896 | }
|
3897 | if (boostrapedElement.file === element.file) {
|
3898 | foundInOneModule = true;
|
3899 | }
|
3900 | });
|
3901 | module.controllers.forEach(function (controller) {
|
3902 | if (controller.id === element.id) {
|
3903 | foundInOneModule = true;
|
3904 | }
|
3905 | if (controller.file === element.file) {
|
3906 | foundInOneModule = true;
|
3907 | }
|
3908 | });
|
3909 | module.providers.forEach(function (provider) {
|
3910 | if (provider.id === element.id) {
|
3911 | foundInOneModule = true;
|
3912 | }
|
3913 | if (provider.file === element.file) {
|
3914 | foundInOneModule = true;
|
3915 | }
|
3916 | });
|
3917 | });
|
3918 | if (!foundInOneModule) {
|
3919 | alones.push(element);
|
3920 | }
|
3921 | });
|
3922 | if (alones.length > 0) {
|
3923 | switch (elementType) {
|
3924 | case 'component':
|
3925 | context.components = alones;
|
3926 | break;
|
3927 | case 'directive':
|
3928 | context.directives = alones;
|
3929 | break;
|
3930 | case 'controller':
|
3931 | context.controllers = alones;
|
3932 | break;
|
3933 | case 'injectable':
|
3934 | context.injectables = alones;
|
3935 | break;
|
3936 | case 'pipe':
|
3937 | context.pipes = alones;
|
3938 | break;
|
3939 | }
|
3940 | return options.fn(context);
|
3941 | }
|
3942 | };
|
3943 | return ElementAloneHelper;
|
3944 | }());
|
3945 |
|
3946 | var EscapeSimpleQuoteHelper = /** @class */ (function () {
|
3947 | function EscapeSimpleQuoteHelper() {
|
3948 | }
|
3949 | EscapeSimpleQuoteHelper.prototype.helperFunc = function (context, text) {
|
3950 | if (!text) {
|
3951 | return;
|
3952 | }
|
3953 | text = text.replace(/'/g, "\\'");
|
3954 | text = text.replace(/(\r\n|\n|\r)/gm, '');
|
3955 | return text;
|
3956 | };
|
3957 | return EscapeSimpleQuoteHelper;
|
3958 | }());
|
3959 |
|
3960 | var FilterAngular2ModulesHelper = /** @class */ (function () {
|
3961 | function FilterAngular2ModulesHelper() {
|
3962 | }
|
3963 | FilterAngular2ModulesHelper.prototype.helperFunc = function (context, text, options) {
|
3964 | var NG2_MODULES = [
|
3965 | 'BrowserModule',
|
3966 | 'FormsModule',
|
3967 | 'HttpModule',
|
3968 | 'RouterModule'
|
3969 | ];
|
3970 | var len = NG2_MODULES.length;
|
3971 | var i = 0;
|
3972 | var result = false;
|
3973 | for (i; i < len; i++) {
|
3974 | if (text.indexOf(NG2_MODULES[i]) > -1) {
|
3975 | result = true;
|
3976 | }
|
3977 | }
|
3978 | if (result) {
|
3979 | return options.fn(context);
|
3980 | }
|
3981 | else {
|
3982 | return options.inverse(context);
|
3983 | }
|
3984 | };
|
3985 | return FilterAngular2ModulesHelper;
|
3986 | }());
|
3987 |
|
3988 | var AngularVersionUtil = /** @class */ (function () {
|
3989 | function AngularVersionUtil() {
|
3990 | }
|
3991 | AngularVersionUtil.getInstance = function () {
|
3992 | if (!AngularVersionUtil.instance) {
|
3993 | AngularVersionUtil.instance = new AngularVersionUtil();
|
3994 | }
|
3995 | return AngularVersionUtil.instance;
|
3996 | };
|
3997 | AngularVersionUtil.prototype.cleanVersion = function (version) {
|
3998 | return version
|
3999 | .replace('~', '')
|
4000 | .replace('^', '')
|
4001 | .replace('=', '')
|
4002 | .replace('<', '')
|
4003 | .replace('>', '');
|
4004 | };
|
4005 | AngularVersionUtil.prototype.getAngularVersionOfProject = function (packageData) {
|
4006 | var _result = '';
|
4007 | if (packageData.dependencies) {
|
4008 | var angularCore = packageData.dependencies[AngularVersionUtil.CorePackage];
|
4009 | if (angularCore) {
|
4010 | _result = this.cleanVersion(angularCore);
|
4011 | }
|
4012 | }
|
4013 | return _result;
|
4014 | };
|
4015 | AngularVersionUtil.prototype.isAngularVersionArchived = function (version) {
|
4016 | var result;
|
4017 | try {
|
4018 | result = semver__namespace.compare(version, '2.4.10') <= 0;
|
4019 | }
|
4020 | catch (e) { }
|
4021 | return result;
|
4022 | };
|
4023 | AngularVersionUtil.prototype.prefixOfficialDoc = function (version) {
|
4024 | return this.isAngularVersionArchived(version) ? 'v2.' : '';
|
4025 | };
|
4026 | AngularVersionUtil.prototype.getApiLink = function (api, angularVersion) {
|
4027 | var angularDocPrefix = this.prefixOfficialDoc(angularVersion);
|
4028 | return "https://" + angularDocPrefix + "angular.io/" + api.path;
|
4029 | };
|
4030 | AngularVersionUtil.CorePackage = '@angular/core';
|
4031 | return AngularVersionUtil;
|
4032 | }());
|
4033 | var AngularVersionUtil$1 = AngularVersionUtil.getInstance();
|
4034 |
|
4035 | var BasicTypes;
|
4036 | (function (BasicTypes) {
|
4037 | BasicTypes[BasicTypes["number"] = 0] = "number";
|
4038 | BasicTypes[BasicTypes["boolean"] = 1] = "boolean";
|
4039 | BasicTypes[BasicTypes["string"] = 2] = "string";
|
4040 | BasicTypes[BasicTypes["object"] = 3] = "object";
|
4041 | BasicTypes[BasicTypes["date"] = 4] = "date";
|
4042 | BasicTypes[BasicTypes["function"] = 5] = "function";
|
4043 | })(BasicTypes || (BasicTypes = {}));
|
4044 | var BasicTypeScriptTypes;
|
4045 | (function (BasicTypeScriptTypes) {
|
4046 | BasicTypeScriptTypes[BasicTypeScriptTypes["any"] = 0] = "any";
|
4047 | BasicTypeScriptTypes[BasicTypeScriptTypes["void"] = 1] = "void";
|
4048 | })(BasicTypeScriptTypes || (BasicTypeScriptTypes = {}));
|
4049 | var BasicTypeUtil = /** @class */ (function () {
|
4050 | function BasicTypeUtil() {
|
4051 | }
|
4052 | BasicTypeUtil.getInstance = function () {
|
4053 | if (!BasicTypeUtil.instance) {
|
4054 | BasicTypeUtil.instance = new BasicTypeUtil();
|
4055 | }
|
4056 | return BasicTypeUtil.instance;
|
4057 | };
|
4058 | /**
|
4059 | * Checks if a given types is a basic javascript type
|
4060 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
|
4061 | * @param type The type to check
|
4062 | */
|
4063 | BasicTypeUtil.prototype.isJavascriptType = function (type) {
|
4064 | if (typeof type !== 'undefined' && type.toLowerCase) {
|
4065 | return type.toLowerCase() in BasicTypes;
|
4066 | }
|
4067 | else {
|
4068 | return false;
|
4069 | }
|
4070 | };
|
4071 | /**
|
4072 | * Checks if a given type is a typescript type (That is not a javascript type)
|
4073 | * https://www.typescriptlang.org/docs/handbook/basic-types.html
|
4074 | * @param type The type to check
|
4075 | */
|
4076 | BasicTypeUtil.prototype.isTypeScriptType = function (type) {
|
4077 | if (typeof type !== 'undefined' && type.toLowerCase) {
|
4078 | return type.toLowerCase() in BasicTypeScriptTypes;
|
4079 | }
|
4080 | else {
|
4081 | return false;
|
4082 | }
|
4083 | };
|
4084 | /**
|
4085 | * Check if the type is a typescript or javascript type
|
4086 | * @param type The type to check
|
4087 | */
|
4088 | BasicTypeUtil.prototype.isKnownType = function (type) {
|
4089 | return this.isJavascriptType(type) || this.isTypeScriptType(type);
|
4090 | };
|
4091 | /**
|
4092 | * Returns a official documentation link to either the javascript or typescript type
|
4093 | * @param type The type to check
|
4094 | * @returns The documentation link or undefined if type not found
|
4095 | */
|
4096 | BasicTypeUtil.prototype.getTypeUrl = function (type) {
|
4097 | if (this.isJavascriptType(type)) {
|
4098 | return "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/" + type;
|
4099 | }
|
4100 | if (this.isTypeScriptType(type)) {
|
4101 | return "https://www.typescriptlang.org/docs/handbook/basic-types.html";
|
4102 | }
|
4103 | return undefined;
|
4104 | };
|
4105 | return BasicTypeUtil;
|
4106 | }());
|
4107 | var BasicTypeUtil$1 = BasicTypeUtil.getInstance();
|
4108 |
|
4109 | var FunctionSignatureHelper = /** @class */ (function () {
|
4110 | function FunctionSignatureHelper() {
|
4111 | }
|
4112 | FunctionSignatureHelper.prototype.handleFunction = function (arg) {
|
4113 | var _this = this;
|
4114 | if (arg["function"].length === 0) {
|
4115 | return "" + arg.name + this.getOptionalString(arg) + ": () => void";
|
4116 | }
|
4117 | var argums = arg["function"].map(function (argu) {
|
4118 | var _result = DependenciesEngine$1.find(argu.type);
|
4119 | if (_result) {
|
4120 | if (_result.source === 'internal') {
|
4121 | var path = _result.data.type;
|
4122 | if (_result.data.type === 'class') {
|
4123 | path = 'classe';
|
4124 | }
|
4125 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"../" + path + "s/" + _result.data.name + ".html\">" + argu.type + "</a>";
|
4126 | }
|
4127 | else {
|
4128 | var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
4129 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + argu.type + "</a>";
|
4130 | }
|
4131 | }
|
4132 | else if (BasicTypeUtil$1.isKnownType(argu.type)) {
|
4133 | var path = BasicTypeUtil$1.getTypeUrl(argu.type);
|
4134 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + argu.type + "</a>";
|
4135 | }
|
4136 | else {
|
4137 | if (argu.name && argu.type) {
|
4138 | return "" + argu.name + _this.getOptionalString(arg) + ": " + argu.type;
|
4139 | }
|
4140 | else {
|
4141 | if (argu.name) {
|
4142 | return "" + argu.name.text;
|
4143 | }
|
4144 | else {
|
4145 | return '';
|
4146 | }
|
4147 | }
|
4148 | }
|
4149 | });
|
4150 | return "" + arg.name + this.getOptionalString(arg) + ": (" + argums + ") => void";
|
4151 | };
|
4152 | FunctionSignatureHelper.prototype.getOptionalString = function (arg) {
|
4153 | return arg.optional ? '?' : '';
|
4154 | };
|
4155 | FunctionSignatureHelper.prototype.helperFunc = function (context, method) {
|
4156 | var _this = this;
|
4157 | var args = '';
|
4158 | var argDestructuredCounterInitial = 0;
|
4159 | var argDestructuredCounterReal = 0;
|
4160 | if (method.args) {
|
4161 | method.args.forEach(function (arg) {
|
4162 | if (arg.destructuredParameter) {
|
4163 | argDestructuredCounterInitial += 1;
|
4164 | }
|
4165 | });
|
4166 | method.args.forEach(function (arg, index) {
|
4167 | var _result = DependenciesEngine$1.find(arg.type);
|
4168 | if (arg.destructuredParameter) {
|
4169 | if (argDestructuredCounterReal === 0) {
|
4170 | args += '__namedParameters: {';
|
4171 | }
|
4172 | argDestructuredCounterReal += 1;
|
4173 | }
|
4174 | if (_result) {
|
4175 | if (_result.source === 'internal') {
|
4176 | var path = _result.data.type;
|
4177 | if (_result.data.type === 'class') {
|
4178 | path = 'classe';
|
4179 | }
|
4180 | args += "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"../" + path + "s/" + _result.data.name + ".html\" target=\"_self\">" + Handlebars__namespace.escapeExpression(arg.type) + "</a>";
|
4181 | }
|
4182 | else {
|
4183 | var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
4184 | args += "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + Handlebars__namespace.escapeExpression(arg.type) + "</a>";
|
4185 | }
|
4186 | }
|
4187 | else if (arg.dotDotDotToken) {
|
4188 | args += "..." + arg.name + ": " + arg.type;
|
4189 | }
|
4190 | else if (arg["function"]) {
|
4191 | args += _this.handleFunction(arg);
|
4192 | }
|
4193 | else if (BasicTypeUtil$1.isKnownType(arg.type)) {
|
4194 | var path = BasicTypeUtil$1.getTypeUrl(arg.type);
|
4195 | args += "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + Handlebars__namespace.escapeExpression(arg.type) + "</a>";
|
4196 | }
|
4197 | else {
|
4198 | if (arg.type) {
|
4199 | args += "" + arg.name + _this.getOptionalString(arg) + ": " + arg.type;
|
4200 | }
|
4201 | else {
|
4202 | args += "" + arg.name + _this.getOptionalString(arg);
|
4203 | }
|
4204 | }
|
4205 | if (arg.destructuredParameter) {
|
4206 | if (argDestructuredCounterReal === argDestructuredCounterInitial) {
|
4207 | args += '}';
|
4208 | }
|
4209 | }
|
4210 | if (index < method.args.length - 1) {
|
4211 | args += ', ';
|
4212 | }
|
4213 | });
|
4214 | }
|
4215 | if (method.name) {
|
4216 | return method.name + "(" + args + ")";
|
4217 | }
|
4218 | else {
|
4219 | return "(" + args + ")";
|
4220 | }
|
4221 | };
|
4222 | return FunctionSignatureHelper;
|
4223 | }());
|
4224 |
|
4225 | var HasOwnHelper = /** @class */ (function () {
|
4226 | function HasOwnHelper() {
|
4227 | }
|
4228 | HasOwnHelper.prototype.helperFunc = function (context, entity, key, options) {
|
4229 | if (Object.hasOwnProperty.call(entity, key)) {
|
4230 | return options.fn(context);
|
4231 | }
|
4232 | else {
|
4233 | return options.inverse(context);
|
4234 | }
|
4235 | };
|
4236 | return HasOwnHelper;
|
4237 | }());
|
4238 |
|
4239 | var I18nHelper = /** @class */ (function () {
|
4240 | function I18nHelper() {
|
4241 | }
|
4242 | I18nHelper.prototype.helperFunc = function (context, i18n_key) {
|
4243 | if (I18nEngine$1.exists(i18n_key)) {
|
4244 | return I18nEngine$1.translate(i18n_key.toLowerCase());
|
4245 | }
|
4246 | else {
|
4247 | return i18n_key;
|
4248 | }
|
4249 | };
|
4250 | return I18nHelper;
|
4251 | }());
|
4252 |
|
4253 | var IfStringHelper = /** @class */ (function () {
|
4254 | function IfStringHelper() {
|
4255 | }
|
4256 | IfStringHelper.prototype.helperFunc = function (context, a, options) {
|
4257 | if (typeof a === 'string') {
|
4258 | return options.fn(context);
|
4259 | }
|
4260 | return options.inverse(context);
|
4261 | };
|
4262 | return IfStringHelper;
|
4263 | }());
|
4264 |
|
4265 | var IndexableSignatureHelper = /** @class */ (function () {
|
4266 | function IndexableSignatureHelper() {
|
4267 | }
|
4268 | IndexableSignatureHelper.prototype.helperFunc = function (context, method) {
|
4269 | var args = method.args.map(function (arg) { return arg.name + ": " + arg.type; }).join(', ');
|
4270 | if (method.name) {
|
4271 | return method.name + "[" + args + "]";
|
4272 | }
|
4273 | else {
|
4274 | return "[" + args + "]";
|
4275 | }
|
4276 | };
|
4277 | return IndexableSignatureHelper;
|
4278 | }());
|
4279 |
|
4280 | var IsInitialTabHelper = /** @class */ (function () {
|
4281 | function IsInitialTabHelper() {
|
4282 | }
|
4283 | IsInitialTabHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
|
4284 | return tabs[0].id === tabId ? options.fn(context) : options.inverse(context);
|
4285 | };
|
4286 | return IsInitialTabHelper;
|
4287 | }());
|
4288 |
|
4289 | var IsNotToggleHelper = /** @class */ (function () {
|
4290 | function IsNotToggleHelper() {
|
4291 | }
|
4292 | IsNotToggleHelper.prototype.helperFunc = function (context, type, options) {
|
4293 | var result = Configuration$1.mainData.toggleMenuItems.indexOf(type);
|
4294 | if (Configuration$1.mainData.toggleMenuItems.indexOf('all') !== -1) {
|
4295 | return options.inverse(context);
|
4296 | }
|
4297 | else if (result !== -1) {
|
4298 | return options.fn(context);
|
4299 | }
|
4300 | else {
|
4301 | return options.inverse(context);
|
4302 | }
|
4303 | };
|
4304 | return IsNotToggleHelper;
|
4305 | }());
|
4306 |
|
4307 | var IsTabEnabledHelper = /** @class */ (function () {
|
4308 | function IsTabEnabledHelper() {
|
4309 | }
|
4310 | IsTabEnabledHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
|
4311 | var isTabEnabled = -1 !== ___namespace.findIndex(tabs, { id: tabId });
|
4312 | return isTabEnabled ? options.fn(context) : options.inverse(context);
|
4313 | };
|
4314 | return IsTabEnabledHelper;
|
4315 | }());
|
4316 |
|
4317 | var JsdocCodeExampleHelper = /** @class */ (function () {
|
4318 | function JsdocCodeExampleHelper() {
|
4319 | }
|
4320 | JsdocCodeExampleHelper.prototype.cleanTag = function (comment) {
|
4321 | if (comment.charAt(0) === '*') {
|
4322 | comment = comment.substring(1, comment.length);
|
4323 | }
|
4324 | if (comment.charAt(0) === ' ') {
|
4325 | comment = comment.substring(1, comment.length);
|
4326 | }
|
4327 | if (comment.indexOf('<p>') === 0) {
|
4328 | comment = comment.substring(3, comment.length);
|
4329 | }
|
4330 | if (comment.substr(-1) === '\n') {
|
4331 | comment = comment.substring(0, comment.length - 1);
|
4332 | }
|
4333 | if (comment.substr(-4) === '</p>') {
|
4334 | comment = comment.substring(0, comment.length - 4);
|
4335 | }
|
4336 | return comment;
|
4337 | };
|
4338 | JsdocCodeExampleHelper.prototype.getHtmlEntities = function (str) {
|
4339 | return String(str)
|
4340 | .replace(/&/g, '&')
|
4341 | .replace(/</g, '<')
|
4342 | .replace(/>/g, '>')
|
4343 | .replace(/"/g, '"');
|
4344 | };
|
4345 | JsdocCodeExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
4346 | var i = 0;
|
4347 | var len = jsdocTags.length;
|
4348 | var tags = [];
|
4349 | var type = 'html';
|
4350 | if (options.hash.type) {
|
4351 | type = options.hash.type;
|
4352 | }
|
4353 | for (i; i < len; i++) {
|
4354 | if (jsdocTags[i].tagName) {
|
4355 | if (jsdocTags[i].tagName.text === 'example') {
|
4356 | var tag = {};
|
4357 | if (jsdocTags[i].comment) {
|
4358 | if (jsdocTags[i].comment.indexOf('<caption>') !== -1) {
|
4359 | tag.comment = jsdocTags[i].comment
|
4360 | .replace(/<caption>/g, '<b><i>')
|
4361 | .replace(/\/caption>/g, '/b></i>');
|
4362 | }
|
4363 | else {
|
4364 | tag.comment =
|
4365 | "<pre class=\"line-numbers\"><code class=\"language-" + type + "\">" +
|
4366 | this.getHtmlEntities(this.cleanTag(jsdocTags[i].comment)) +
|
4367 | "</code></pre>";
|
4368 | }
|
4369 | tags.push(tag);
|
4370 | }
|
4371 | }
|
4372 | }
|
4373 | }
|
4374 | if (tags.length > 0) {
|
4375 | context.tags = tags;
|
4376 | return options.fn(context);
|
4377 | }
|
4378 | };
|
4379 | return JsdocCodeExampleHelper;
|
4380 | }());
|
4381 |
|
4382 | var JsdocDefaultHelper = /** @class */ (function () {
|
4383 | function JsdocDefaultHelper() {
|
4384 | }
|
4385 | JsdocDefaultHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
4386 | if (jsdocTags) {
|
4387 | var i = 0;
|
4388 | var len = jsdocTags.length;
|
4389 | var tag = {};
|
4390 | var defaultValue = false;
|
4391 | for (i; i < len; i++) {
|
4392 | if (jsdocTags[i].tagName) {
|
4393 | if (jsdocTags[i].tagName.text === 'default') {
|
4394 | defaultValue = true;
|
4395 | if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
|
4396 | tag.type = jsdocTags[i].typeExpression.type.name.text;
|
4397 | }
|
4398 | if (jsdocTags[i].comment) {
|
4399 | tag.comment = jsdocTags[i].comment;
|
4400 | }
|
4401 | if (jsdocTags[i].name) {
|
4402 | tag.name = jsdocTags[i].name.text;
|
4403 | }
|
4404 | }
|
4405 | }
|
4406 | }
|
4407 | if (defaultValue) {
|
4408 | context.tag = tag;
|
4409 | return options.fn(context);
|
4410 | }
|
4411 | }
|
4412 | };
|
4413 | return JsdocDefaultHelper;
|
4414 | }());
|
4415 |
|
4416 | var JsdocExampleHelper = /** @class */ (function () {
|
4417 | function JsdocExampleHelper() {
|
4418 | }
|
4419 | JsdocExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
4420 | var i = 0;
|
4421 | var len = jsdocTags.length;
|
4422 | var tags = [];
|
4423 | for (i; i < len; i++) {
|
4424 | if (jsdocTags[i].tagName) {
|
4425 | if (jsdocTags[i].tagName.text === 'example') {
|
4426 | var tag = {};
|
4427 | if (jsdocTags[i].comment) {
|
4428 | tag.comment = jsdocTags[i].comment
|
4429 | .replace(/<caption>/g, '<b><i>')
|
4430 | .replace(/\/caption>/g, '/b></i>');
|
4431 | }
|
4432 | tags.push(tag);
|
4433 | }
|
4434 | }
|
4435 | }
|
4436 | if (tags.length > 0) {
|
4437 | context.tags = tags;
|
4438 | return options.fn(context);
|
4439 | }
|
4440 | };
|
4441 | return JsdocExampleHelper;
|
4442 | }());
|
4443 |
|
4444 | var JsdocParamsValidHelper = /** @class */ (function () {
|
4445 | function JsdocParamsValidHelper() {
|
4446 | }
|
4447 | JsdocParamsValidHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
4448 | var i = 0;
|
4449 | var len = jsdocTags.length;
|
4450 | var valid = false;
|
4451 | for (i; i < len; i++) {
|
4452 | if (jsdocTags[i].tagName) {
|
4453 | if (jsdocTags[i].tagName.text === 'param') {
|
4454 | valid = true;
|
4455 | }
|
4456 | }
|
4457 | }
|
4458 | if (valid) {
|
4459 | return options.fn(context);
|
4460 | }
|
4461 | else {
|
4462 | return options.inverse(context);
|
4463 | }
|
4464 | };
|
4465 | return JsdocParamsValidHelper;
|
4466 | }());
|
4467 |
|
4468 | var JsdocParamsHelper = /** @class */ (function () {
|
4469 | function JsdocParamsHelper() {
|
4470 | }
|
4471 | JsdocParamsHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
4472 | var i = 0;
|
4473 | var len = jsdocTags.length;
|
4474 | var tags = [];
|
4475 | for (i; i < len; i++) {
|
4476 | if (jsdocTags[i].tagName) {
|
4477 | if (jsdocTags[i].tagName.text === 'param') {
|
4478 | var tag = {};
|
4479 | if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.kind) {
|
4480 | tag.type = kindToType(jsdocTags[i].typeExpression.type.kind);
|
4481 | }
|
4482 | if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
|
4483 | tag.type = jsdocTags[i].typeExpression.type.name.text;
|
4484 | }
|
4485 | else {
|
4486 | tag.type = jsdocTags[i].type;
|
4487 | }
|
4488 | if (jsdocTags[i].comment) {
|
4489 | tag.comment = jsdocTags[i].comment;
|
4490 | }
|
4491 | if (jsdocTags[i].defaultValue) {
|
4492 | tag.defaultValue = jsdocTags[i].defaultValue;
|
4493 | }
|
4494 | if (jsdocTags[i].name) {
|
4495 | if (jsdocTags[i].name.text) {
|
4496 | tag.name = jsdocTags[i].name.text;
|
4497 | }
|
4498 | else {
|
4499 | tag.name = jsdocTags[i].name;
|
4500 | }
|
4501 | }
|
4502 | if (jsdocTags[i].optional) {
|
4503 | tag.optional = true;
|
4504 | }
|
4505 | tags.push(tag);
|
4506 | }
|
4507 | }
|
4508 | }
|
4509 | if (tags.length >= 1) {
|
4510 | context.tags = tags;
|
4511 | return options.fn(context);
|
4512 | }
|
4513 | };
|
4514 | return JsdocParamsHelper;
|
4515 | }());
|
4516 |
|
4517 | var JsdocReturnsCommentHelper = /** @class */ (function () {
|
4518 | function JsdocReturnsCommentHelper() {
|
4519 | }
|
4520 | JsdocReturnsCommentHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
4521 | var i = 0;
|
4522 | var len = jsdocTags.length;
|
4523 | var result;
|
4524 | for (i; i < len; i++) {
|
4525 | if (jsdocTags[i].tagName) {
|
4526 | if (jsdocTags[i].tagName.text === 'returns' ||
|
4527 | jsdocTags[i].tagName.text === 'return') {
|
4528 | result = jsdocTags[i].comment;
|
4529 | break;
|
4530 | }
|
4531 | }
|
4532 | }
|
4533 | return result;
|
4534 | };
|
4535 | return JsdocReturnsCommentHelper;
|
4536 | }());
|
4537 |
|
4538 | var LinkTypeHelper = /** @class */ (function () {
|
4539 | function LinkTypeHelper() {
|
4540 | }
|
4541 | LinkTypeHelper.prototype.helperFunc = function (context, name, options) {
|
4542 | var _result = DependenciesEngine$1.find(name);
|
4543 | var angularDocPrefix = AngularVersionUtil$1.prefixOfficialDoc(Configuration$1.mainData.angularVersion);
|
4544 | if (_result) {
|
4545 | context.type = {
|
4546 | raw: name
|
4547 | };
|
4548 | if (_result.source === 'internal') {
|
4549 | if (_result.data.type === 'class') {
|
4550 | _result.data.type = 'classe';
|
4551 | }
|
4552 | context.type.href = '../' + _result.data.type + 's/' + _result.data.name + '.html';
|
4553 | if (_result.data.type === 'miscellaneous' ||
|
4554 | (_result.data.ctype && _result.data.ctype === 'miscellaneous')) {
|
4555 | var mainpage = '';
|
4556 | switch (_result.data.subtype) {
|
4557 | case 'enum':
|
4558 | mainpage = 'enumerations';
|
4559 | break;
|
4560 | case 'function':
|
4561 | mainpage = 'functions';
|
4562 | break;
|
4563 | case 'typealias':
|
4564 | mainpage = 'typealiases';
|
4565 | break;
|
4566 | case 'variable':
|
4567 | mainpage = 'variables';
|
4568 | }
|
4569 | context.type.href =
|
4570 | '../' + _result.data.ctype + '/' + mainpage + '.html#' + _result.data.name;
|
4571 | }
|
4572 | context.type.target = '_self';
|
4573 | }
|
4574 | else {
|
4575 | context.type.href = "https://" + angularDocPrefix + "angular.io/" + _result.data.path;
|
4576 | context.type.target = '_blank';
|
4577 | }
|
4578 | return options.fn(context);
|
4579 | }
|
4580 | else if (BasicTypeUtil$1.isKnownType(name)) {
|
4581 | context.type = {
|
4582 | raw: name
|
4583 | };
|
4584 | context.type.target = '_blank';
|
4585 | context.type.href = BasicTypeUtil$1.getTypeUrl(name);
|
4586 | return options.fn(context);
|
4587 | }
|
4588 | else {
|
4589 | return options.inverse(context);
|
4590 | }
|
4591 | };
|
4592 | return LinkTypeHelper;
|
4593 | }());
|
4594 |
|
4595 | var ModifIconHelper = /** @class */ (function () {
|
4596 | function ModifIconHelper() {
|
4597 | }
|
4598 | ModifIconHelper.prototype.helperFunc = function (context, kind) {
|
4599 | var _kindText = '';
|
4600 | switch (kind) {
|
4601 | case tsMorph.SyntaxKind.PrivateKeyword:
|
4602 | _kindText = 'lock'; // private
|
4603 | break;
|
4604 | case tsMorph.SyntaxKind.ProtectedKeyword:
|
4605 | _kindText = 'lock'; // protected
|
4606 | break;
|
4607 | case tsMorph.SyntaxKind.StaticKeyword:
|
4608 | _kindText = 'reset'; // static
|
4609 | break;
|
4610 | case tsMorph.SyntaxKind.ExportKeyword:
|
4611 | _kindText = 'export'; // export
|
4612 | break;
|
4613 | default:
|
4614 | _kindText = 'reset';
|
4615 | break;
|
4616 | }
|
4617 | return _kindText;
|
4618 | };
|
4619 | return ModifIconHelper;
|
4620 | }());
|
4621 |
|
4622 | var ModifKindHelper = /** @class */ (function () {
|
4623 | function ModifKindHelper() {
|
4624 | }
|
4625 | /**
|
4626 | * Transform SyntaxKind into string
|
4627 | * @param {any} context Handlebars context
|
4628 | * @param {SyntaxKind[]} kind SyntaxKind concatenated
|
4629 | * @return {string} Parsed string
|
4630 | */
|
4631 | ModifKindHelper.prototype.helperFunc = function (context, kind) {
|
4632 | var _kindText = '';
|
4633 | switch (kind) {
|
4634 | case tsMorph.SyntaxKind.PrivateKeyword:
|
4635 | _kindText = 'Private';
|
4636 | break;
|
4637 | case tsMorph.SyntaxKind.ReadonlyKeyword:
|
4638 | _kindText = 'Readonly';
|
4639 | break;
|
4640 | case tsMorph.SyntaxKind.ProtectedKeyword:
|
4641 | _kindText = 'Protected';
|
4642 | break;
|
4643 | case tsMorph.SyntaxKind.PublicKeyword:
|
4644 | _kindText = 'Public';
|
4645 | break;
|
4646 | case tsMorph.SyntaxKind.StaticKeyword:
|
4647 | _kindText = 'Static';
|
4648 | break;
|
4649 | case tsMorph.SyntaxKind.AsyncKeyword:
|
4650 | _kindText = 'Async';
|
4651 | break;
|
4652 | case tsMorph.SyntaxKind.AbstractKeyword:
|
4653 | _kindText = 'Abstract';
|
4654 | break;
|
4655 | }
|
4656 | return new Handlebars__namespace.SafeString(_kindText);
|
4657 | };
|
4658 | return ModifKindHelper;
|
4659 | }());
|
4660 |
|
4661 | var ObjectLengthHelper = /** @class */ (function () {
|
4662 | function ObjectLengthHelper() {
|
4663 | }
|
4664 | ObjectLengthHelper.prototype.helperFunc = function (context, obj, operator, length) {
|
4665 | var len = arguments.length - 1;
|
4666 | var options = arguments[len];
|
4667 | if (typeof obj !== 'object') {
|
4668 | return options.inverse(context);
|
4669 | }
|
4670 | var size = 0, key;
|
4671 | for (key in obj) {
|
4672 | if (obj.hasOwnProperty(key)) {
|
4673 | size++;
|
4674 | }
|
4675 | }
|
4676 | var result;
|
4677 | switch (operator) {
|
4678 | case '===':
|
4679 | result = size === length;
|
4680 | break;
|
4681 | case '!==':
|
4682 | result = size !== length;
|
4683 | break;
|
4684 | case '>':
|
4685 | result = size > length;
|
4686 | break;
|
4687 | default: {
|
4688 | throw new Error('helper {{objectLength}}: invalid operator: `' + operator + '`');
|
4689 | }
|
4690 | }
|
4691 | if (result === false) {
|
4692 | return options.inverse(context);
|
4693 | }
|
4694 | return options.fn(context);
|
4695 | };
|
4696 | return ObjectLengthHelper;
|
4697 | }());
|
4698 |
|
4699 | var ObjectHelper = /** @class */ (function () {
|
4700 | function ObjectHelper() {
|
4701 | }
|
4702 | ObjectHelper.prototype.helperFunc = function (context, text) {
|
4703 | text = JSON.stringify(text);
|
4704 | text = text.replace(/{"/, '{<br> "');
|
4705 | text = text.replace(/,"/, ',<br> "');
|
4706 | text = text.replace(/}$/, '<br>}');
|
4707 | return new Handlebars__namespace.SafeString(text);
|
4708 | };
|
4709 | return ObjectHelper;
|
4710 | }());
|
4711 |
|
4712 | var OneParameterHasHelper = /** @class */ (function () {
|
4713 | function OneParameterHasHelper() {
|
4714 | }
|
4715 | OneParameterHasHelper.prototype.helperFunc = function (context, tags, typeToCheck) {
|
4716 | var result = false;
|
4717 | var len = arguments.length - 1;
|
4718 | var options = arguments[len];
|
4719 | var i = 0, leng = tags.length;
|
4720 | for (i; i < leng; i++) {
|
4721 | if (typeof tags[i][typeToCheck] !== 'undefined' && tags[i][typeToCheck] !== '') {
|
4722 | result = true;
|
4723 | }
|
4724 | }
|
4725 | if (result) {
|
4726 | return options.fn(context);
|
4727 | }
|
4728 | else {
|
4729 | return options.inverse(context);
|
4730 | }
|
4731 | };
|
4732 | return OneParameterHasHelper;
|
4733 | }());
|
4734 |
|
4735 | var OrLengthHelper = /** @class */ (function () {
|
4736 | function OrLengthHelper() {
|
4737 | }
|
4738 | OrLengthHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
|
4739 | var len = arguments.length - 1;
|
4740 | var options = arguments[len];
|
4741 | // We start at 1 because of options
|
4742 | for (var i = 1; i < len; i++) {
|
4743 | if (typeof arguments[i] !== 'undefined') {
|
4744 | if (Object.keys(arguments[i]).length > 0) {
|
4745 | return options.fn(context);
|
4746 | }
|
4747 | }
|
4748 | }
|
4749 | return options.inverse(context);
|
4750 | };
|
4751 | return OrLengthHelper;
|
4752 | }());
|
4753 |
|
4754 | var OrHelper = /** @class */ (function () {
|
4755 | function OrHelper() {
|
4756 | }
|
4757 | OrHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
|
4758 | var len = arguments.length - 1;
|
4759 | var options = arguments[len];
|
4760 | // We start at 1 because of options
|
4761 | for (var i = 1; i < len; i++) {
|
4762 | if (arguments[i]) {
|
4763 | return options.fn(context);
|
4764 | }
|
4765 | }
|
4766 | return options.inverse(context);
|
4767 | };
|
4768 | return OrHelper;
|
4769 | }());
|
4770 |
|
4771 | var ParseDescriptionHelper = /** @class */ (function () {
|
4772 | function ParseDescriptionHelper() {
|
4773 | }
|
4774 | ParseDescriptionHelper.prototype.helperFunc = function (context, description, depth) {
|
4775 | var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
|
4776 | var tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
|
4777 | var tagRegExp;
|
4778 | var matches;
|
4779 | var previousString;
|
4780 | tagRegExp = description.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
|
4781 | var processTheLink = function (originalDescription, matchedTag, leadingText) {
|
4782 | var leading = extractLeadingText(originalDescription, matchedTag.completeTag);
|
4783 | var split;
|
4784 | var resultInCompodoc;
|
4785 | var newLink;
|
4786 | var rootPath;
|
4787 | var stringtoReplace;
|
4788 | var anchor = '';
|
4789 | var label;
|
4790 | var pageName;
|
4791 | split = splitLinkText(matchedTag.text);
|
4792 | if (typeof split.linkText !== 'undefined') {
|
4793 | resultInCompodoc = DependenciesEngine$1.findInCompodoc(split.target);
|
4794 | }
|
4795 | else {
|
4796 | var info = matchedTag.text;
|
4797 | if (matchedTag.text.indexOf('#') !== -1) {
|
4798 | anchor = matchedTag.text.substr(matchedTag.text.indexOf('#'), matchedTag.text.length);
|
4799 | info = matchedTag.text.substr(0, matchedTag.text.indexOf('#'));
|
4800 | }
|
4801 | resultInCompodoc = DependenciesEngine$1.findInCompodoc(info);
|
4802 | }
|
4803 | if (resultInCompodoc) {
|
4804 | label = resultInCompodoc.name;
|
4805 | pageName = resultInCompodoc.name;
|
4806 | if (leadingText) {
|
4807 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
4808 | }
|
4809 | else if (leading.leadingText !== undefined) {
|
4810 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
4811 | }
|
4812 | else if (typeof split.linkText !== 'undefined') {
|
4813 | stringtoReplace = matchedTag.completeTag;
|
4814 | }
|
4815 | else {
|
4816 | stringtoReplace = matchedTag.completeTag;
|
4817 | }
|
4818 | if (resultInCompodoc.type === 'class') {
|
4819 | resultInCompodoc.type = 'classes';
|
4820 | }
|
4821 | else if (resultInCompodoc.type === 'miscellaneous' ||
|
4822 | (resultInCompodoc.ctype && resultInCompodoc.ctype === 'miscellaneous')) {
|
4823 | resultInCompodoc.type = 'miscellaneous'; // Not a typo, it is for matching other single types : component, module etc
|
4824 | label = resultInCompodoc.name;
|
4825 | anchor = '#' + resultInCompodoc.name;
|
4826 | if (resultInCompodoc.subtype === 'enum') {
|
4827 | pageName = 'enumerations';
|
4828 | }
|
4829 | else if (resultInCompodoc.subtype === 'function') {
|
4830 | pageName = 'functions';
|
4831 | }
|
4832 | else if (resultInCompodoc.subtype === 'typealias') {
|
4833 | pageName = 'typealiases';
|
4834 | }
|
4835 | else if (resultInCompodoc.subtype === 'variable') {
|
4836 | pageName = 'variables';
|
4837 | }
|
4838 | }
|
4839 | rootPath = '';
|
4840 | switch (depth) {
|
4841 | case 0:
|
4842 | rootPath = './';
|
4843 | break;
|
4844 | case 1:
|
4845 | case 2:
|
4846 | case 3:
|
4847 | case 4:
|
4848 | case 5:
|
4849 | rootPath = '../'.repeat(depth);
|
4850 | break;
|
4851 | }
|
4852 | if (leading.leadingText !== undefined) {
|
4853 | label = leading.leadingText;
|
4854 | }
|
4855 | if (typeof split.linkText !== 'undefined') {
|
4856 | label = split.linkText;
|
4857 | }
|
4858 | if (resultInCompodoc.type === 'miscellaneous' ||
|
4859 | resultInCompodoc.type === 'classes') {
|
4860 | newLink = "<a href=\"" + rootPath + resultInCompodoc.type + "/" + pageName + ".html" + anchor + "\">" + label + "</a>";
|
4861 | }
|
4862 | else {
|
4863 | newLink = "<a href=\"" + rootPath + resultInCompodoc.type + "s/" + pageName + ".html" + anchor + "\">" + label + "</a>";
|
4864 | }
|
4865 | return originalDescription.replace(stringtoReplace, newLink);
|
4866 | }
|
4867 | else if (!resultInCompodoc && typeof split.linkText !== 'undefined') {
|
4868 | newLink = "<a href=\"" + split.target + "\">" + split.linkText + "</a>";
|
4869 | if (leadingText) {
|
4870 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
4871 | }
|
4872 | else if (leading.leadingText !== undefined) {
|
4873 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
4874 | }
|
4875 | else if (typeof split.linkText !== 'undefined') {
|
4876 | stringtoReplace = matchedTag.completeTag;
|
4877 | }
|
4878 | else {
|
4879 | stringtoReplace = matchedTag.completeTag;
|
4880 | }
|
4881 | return originalDescription.replace(stringtoReplace, newLink);
|
4882 | }
|
4883 | else if (!resultInCompodoc && leading && typeof leading.leadingText !== 'undefined') {
|
4884 | newLink = "<a href=\"" + split.target + "\">" + leading.leadingText + "</a>";
|
4885 | if (leadingText) {
|
4886 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
4887 | }
|
4888 | else if (leading.leadingText !== undefined) {
|
4889 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
4890 | }
|
4891 | else if (typeof split.linkText !== 'undefined') {
|
4892 | stringtoReplace = matchedTag.completeTag;
|
4893 | }
|
4894 | else {
|
4895 | stringtoReplace = matchedTag.completeTag;
|
4896 | }
|
4897 | return originalDescription.replace(stringtoReplace, newLink);
|
4898 | }
|
4899 | else if (!resultInCompodoc && typeof split.linkText === 'undefined') {
|
4900 | newLink = "<a href=\"" + split.target + "\">" + split.target + "</a>";
|
4901 | if (leadingText) {
|
4902 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
4903 | }
|
4904 | else if (leading.leadingText !== undefined) {
|
4905 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
4906 | }
|
4907 | else {
|
4908 | stringtoReplace = matchedTag.completeTag;
|
4909 | }
|
4910 | return originalDescription.replace(stringtoReplace, newLink);
|
4911 | }
|
4912 | else {
|
4913 | return originalDescription;
|
4914 | }
|
4915 | };
|
4916 | function replaceMatch(replacer, tag, match, text, linkText) {
|
4917 | var matchedTag = {
|
4918 | completeTag: match,
|
4919 | tag: tag,
|
4920 | text: text
|
4921 | };
|
4922 | if (linkText) {
|
4923 | return replacer(description, matchedTag, linkText);
|
4924 | }
|
4925 | else {
|
4926 | return replacer(description, matchedTag);
|
4927 | }
|
4928 | }
|
4929 | // Clean description for marked a tag parsed too early
|
4930 | if (description.indexOf('href=') !== -1) {
|
4931 | var insideMarkedATagResults = description.match(/<a [^>]+>([^<]+)<\/a>/g);
|
4932 | if (insideMarkedATagResults && insideMarkedATagResults.length > 0) {
|
4933 | for (var i = 0; i < insideMarkedATagResults.length; i++) {
|
4934 | var markedATagRegExp = new RegExp('<a [^>]+>([^<]+)</a>', 'gm');
|
4935 | var parsedATag = markedATagRegExp.exec(description);
|
4936 | if (parsedATag && parsedATag.length === 2) {
|
4937 | var insideMarkedATag = parsedATag[1];
|
4938 | description = description.replace("{@link <a href=\"" + encodeURI(insideMarkedATag) + "\">" + insideMarkedATag + "</a>", "{@link " + insideMarkedATag);
|
4939 | }
|
4940 | }
|
4941 | }
|
4942 | }
|
4943 | do {
|
4944 | matches = tagRegExp.exec(description);
|
4945 | // Did we have {@link ?
|
4946 | if (matches) {
|
4947 | previousString = description;
|
4948 | if (matches.length === 2) {
|
4949 | description = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
|
4950 | }
|
4951 | if (matches.length === 3) {
|
4952 | description = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
|
4953 | }
|
4954 | }
|
4955 | } while (matches && previousString !== description);
|
4956 | return description;
|
4957 | };
|
4958 | return ParseDescriptionHelper;
|
4959 | }());
|
4960 |
|
4961 | var ParsePropertyHelper = /** @class */ (function () {
|
4962 | function ParsePropertyHelper() {
|
4963 | }
|
4964 | ParsePropertyHelper.prototype.helperFunc = function (context, text) {
|
4965 | var prop = text;
|
4966 | if (!!text && text.constructor === Object && text['url'] !== undefined) {
|
4967 | prop = text['url'];
|
4968 | }
|
4969 | if (!!text && text.constructor === Object && text['name'] !== undefined) {
|
4970 | prop = text['name'];
|
4971 | }
|
4972 | if (!!text && text.constructor === Object && Object.keys(text).length === 0) {
|
4973 | prop = '';
|
4974 | }
|
4975 | if (prop instanceof String && prop !== '' && prop.indexOf('https') !== -1) {
|
4976 | return "<a href=\"" + prop + "\" target=\"_blank\">" + prop + "</a>";
|
4977 | }
|
4978 | else if (prop !== '' && prop instanceof Array && prop.length > 0) {
|
4979 | prop = JSON.stringify(prop);
|
4980 | prop = prop.replace(/","/g, ', ');
|
4981 | prop = prop.replace(/\["/g, '');
|
4982 | prop = prop.replace(/"]/g, '');
|
4983 | return prop;
|
4984 | }
|
4985 | else {
|
4986 | return prop;
|
4987 | }
|
4988 | };
|
4989 | return ParsePropertyHelper;
|
4990 | }());
|
4991 |
|
4992 | var RelativeURLHelper = /** @class */ (function () {
|
4993 | function RelativeURLHelper() {
|
4994 | }
|
4995 | RelativeURLHelper.prototype.helperFunc = function (context, currentDepth, options) {
|
4996 | switch (currentDepth) {
|
4997 | case 0:
|
4998 | return './';
|
4999 | case 1:
|
5000 | case 2:
|
5001 | case 3:
|
5002 | case 4:
|
5003 | case 5:
|
5004 | return '../'.repeat(currentDepth);
|
5005 | }
|
5006 | return '';
|
5007 | };
|
5008 | return RelativeURLHelper;
|
5009 | }());
|
5010 |
|
5011 | var ShortURLHelper = /** @class */ (function () {
|
5012 | function ShortURLHelper() {
|
5013 | }
|
5014 | ShortURLHelper.prototype.helperFunc = function (context, url, options) {
|
5015 | var newUrl = url;
|
5016 | var firstIndexOfSlash = newUrl.indexOf('/');
|
5017 | var lastIndexOfSlash = newUrl.lastIndexOf('/');
|
5018 | if (firstIndexOfSlash !== -1 || lastIndexOfSlash !== -1) {
|
5019 | newUrl =
|
5020 | newUrl.substr(0, firstIndexOfSlash + 1) +
|
5021 | '...' +
|
5022 | newUrl.substr(lastIndexOfSlash, newUrl.length);
|
5023 | }
|
5024 | return newUrl;
|
5025 | };
|
5026 | return ShortURLHelper;
|
5027 | }());
|
5028 |
|
5029 | var StripURLHelper = /** @class */ (function () {
|
5030 | function StripURLHelper() {
|
5031 | }
|
5032 | StripURLHelper.prototype.helperFunc = function (context, prefix, url, options) {
|
5033 | return prefix + url.split("/").pop();
|
5034 | };
|
5035 | return StripURLHelper;
|
5036 | }());
|
5037 |
|
5038 | var HtmlEngineHelpers = /** @class */ (function () {
|
5039 | function HtmlEngineHelpers() {
|
5040 | }
|
5041 | HtmlEngineHelpers.prototype.registerHelpers = function (bars) {
|
5042 | this.registerHelper(bars, 'compare', new CompareHelper());
|
5043 | this.registerHelper(bars, 'or', new OrHelper());
|
5044 | this.registerHelper(bars, 'functionSignature', new FunctionSignatureHelper());
|
5045 | this.registerHelper(bars, 'isNotToggle', new IsNotToggleHelper());
|
5046 | this.registerHelper(bars, 'isInitialTab', new IsInitialTabHelper());
|
5047 | this.registerHelper(bars, 'isTabEnabled', new IsTabEnabledHelper());
|
5048 | this.registerHelper(bars, 'ifString', new IfStringHelper());
|
5049 | this.registerHelper(bars, 'orLength', new OrLengthHelper());
|
5050 | this.registerHelper(bars, 'filterAngular2Modules', new FilterAngular2ModulesHelper());
|
5051 | this.registerHelper(bars, 'debug', new DebugHelper());
|
5052 | this.registerHelper(bars, 'breaklines', new BreakLinesHelper(bars));
|
5053 | this.registerHelper(bars, 'clean-paragraph', new CleanParagraphHelper());
|
5054 | this.registerHelper(bars, 'escapeSimpleQuote', new EscapeSimpleQuoteHelper());
|
5055 | this.registerHelper(bars, 'breakComma', new BreakCommaHelper(bars));
|
5056 | this.registerHelper(bars, 'modifKind', new ModifKindHelper());
|
5057 | this.registerHelper(bars, 'modifIcon', new ModifIconHelper());
|
5058 | this.registerHelper(bars, 'relativeURL', new RelativeURLHelper());
|
5059 | this.registerHelper(bars, 'jsdoc-returns-comment', new JsdocReturnsCommentHelper());
|
5060 | this.registerHelper(bars, 'jsdoc-code-example', new JsdocCodeExampleHelper());
|
5061 | this.registerHelper(bars, 'jsdoc-example', new JsdocExampleHelper());
|
5062 | this.registerHelper(bars, 'jsdoc-params', new JsdocParamsHelper());
|
5063 | this.registerHelper(bars, 'jsdoc-params-valid', new JsdocParamsValidHelper());
|
5064 | this.registerHelper(bars, 'jsdoc-default', new JsdocDefaultHelper());
|
5065 | this.registerHelper(bars, 'linkType', new LinkTypeHelper());
|
5066 | this.registerHelper(bars, 'indexableSignature', new IndexableSignatureHelper());
|
5067 | this.registerHelper(bars, 'object', new ObjectHelper());
|
5068 | this.registerHelper(bars, 'objectLength', new ObjectLengthHelper());
|
5069 | this.registerHelper(bars, 'parseDescription', new ParseDescriptionHelper());
|
5070 | this.registerHelper(bars, 'one-parameter-has', new OneParameterHasHelper());
|
5071 | this.registerHelper(bars, 'element-alone', new ElementAloneHelper());
|
5072 | this.registerHelper(bars, 'hasOwn', new HasOwnHelper());
|
5073 | this.registerHelper(bars, 'short-url', new ShortURLHelper());
|
5074 | this.registerHelper(bars, 'strip-url', new StripURLHelper());
|
5075 | this.registerHelper(bars, 't', new I18nHelper());
|
5076 | this.registerHelper(bars, 'capitalize', new CapitalizeHelper());
|
5077 | this.registerHelper(bars, 'parse-property', new ParsePropertyHelper());
|
5078 | };
|
5079 | HtmlEngineHelpers.prototype.registerHelper = function (bars, key, helper) {
|
5080 | Handlebars__namespace.registerHelper(key, function () {
|
5081 | // tslint:disable-next-line:no-invalid-this
|
5082 | return helper.helperFunc.apply(helper, __spreadArray([this], __read(___namespace.slice(arguments)), false));
|
5083 | });
|
5084 | };
|
5085 | return HtmlEngineHelpers;
|
5086 | }());
|
5087 |
|
5088 | var HtmlEngine = /** @class */ (function () {
|
5089 | function HtmlEngine() {
|
5090 | this.cache = {};
|
5091 | var helper = new HtmlEngineHelpers();
|
5092 | helper.registerHelpers(Handlebars__namespace);
|
5093 | }
|
5094 | HtmlEngine.getInstance = function () {
|
5095 | if (!HtmlEngine.instance) {
|
5096 | HtmlEngine.instance = new HtmlEngine();
|
5097 | }
|
5098 | return HtmlEngine.instance;
|
5099 | };
|
5100 | HtmlEngine.prototype.init = function (templatePath) {
|
5101 | var _this = this;
|
5102 | var partials = [
|
5103 | 'overview',
|
5104 | 'markdown',
|
5105 | 'modules',
|
5106 | 'module',
|
5107 | 'component',
|
5108 | 'controller',
|
5109 | 'entity',
|
5110 | 'component-detail',
|
5111 | 'directive',
|
5112 | 'injectable',
|
5113 | 'interceptor',
|
5114 | 'guard',
|
5115 | 'pipe',
|
5116 | 'class',
|
5117 | 'interface',
|
5118 | 'routes',
|
5119 | 'index',
|
5120 | 'index-misc',
|
5121 | 'search-results',
|
5122 | 'search-input',
|
5123 | 'link-type',
|
5124 | 'block-method',
|
5125 | 'block-host-listener',
|
5126 | 'block-enum',
|
5127 | 'block-property',
|
5128 | 'block-index',
|
5129 | 'block-constructor',
|
5130 | 'block-typealias',
|
5131 | 'block-accessors',
|
5132 | 'block-input',
|
5133 | 'block-output',
|
5134 | 'coverage-report',
|
5135 | 'unit-test-report',
|
5136 | 'miscellaneous-functions',
|
5137 | 'miscellaneous-variables',
|
5138 | 'miscellaneous-typealiases',
|
5139 | 'miscellaneous-enumerations',
|
5140 | 'additional-page',
|
5141 | 'package-dependencies',
|
5142 | 'package-properties'
|
5143 | ];
|
5144 | if (templatePath) {
|
5145 | if (FileEngine$1.existsSync(path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath)) ===
|
5146 | false) {
|
5147 | logger.warn('Template path specificed but does not exist...using default templates');
|
5148 | }
|
5149 | }
|
5150 | return Promise.all(partials.map(function (partial) {
|
5151 | var partialPath = _this.determineTemplatePath(templatePath, 'partials/' + partial + '.hbs');
|
5152 | return FileEngine$1.get(partialPath).then(function (data) {
|
5153 | return Handlebars__namespace.registerPartial(partial, data);
|
5154 | });
|
5155 | }))
|
5156 | .then(function () {
|
5157 | var pagePath = _this.determineTemplatePath(templatePath, 'page.hbs');
|
5158 | return FileEngine$1.get(pagePath).then(function (data) {
|
5159 | _this.cache.page = data;
|
5160 | _this.compiledPage = Handlebars__namespace.compile(_this.cache.page, {
|
5161 | preventIndent: true,
|
5162 | strict: true
|
5163 | });
|
5164 | });
|
5165 | })
|
5166 | .then(function () {
|
5167 | var menuPath = _this.determineTemplatePath(templatePath, 'partials/menu.hbs');
|
5168 | return FileEngine$1.get(menuPath).then(function (menuTemplate) {
|
5169 | _this.precompiledMenu = Handlebars__namespace.compile(menuTemplate, {
|
5170 | preventIndent: true,
|
5171 | strict: true
|
5172 | });
|
5173 | });
|
5174 | });
|
5175 | };
|
5176 | HtmlEngine.prototype.renderMenu = function (templatePath, data) {
|
5177 | var menuPath = this.determineTemplatePath(templatePath, 'partials/menu.hbs');
|
5178 | return FileEngine$1.get(menuPath).then(function (menuTemplate) {
|
5179 | data.menu = 'normal';
|
5180 | return Handlebars__namespace.compile(menuTemplate, {
|
5181 | preventIndent: true,
|
5182 | strict: true
|
5183 | })(__assign({}, data));
|
5184 | });
|
5185 | };
|
5186 | HtmlEngine.prototype.render = function (mainData, page) {
|
5187 | var o = mainData;
|
5188 | Object.assign(o, page);
|
5189 | // let mem = process.memoryUsage();
|
5190 | // console.log(`heapTotal: ${mem.heapTotal} | heapUsed: ${mem.heapUsed}`);
|
5191 | return this.compiledPage({
|
5192 | data: o
|
5193 | });
|
5194 | };
|
5195 | HtmlEngine.prototype.determineTemplatePath = function (templatePath, filePath) {
|
5196 | var outPath = path__namespace.resolve(__dirname + '/../src/templates/' + filePath);
|
5197 | if (templatePath) {
|
5198 | var testPath = path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath + path__namespace.sep + filePath);
|
5199 | outPath = FileEngine$1.existsSync(testPath) ? testPath : outPath;
|
5200 | }
|
5201 | return outPath;
|
5202 | };
|
5203 | HtmlEngine.prototype.generateCoverageBadge = function (outputFolder, label, coverageData) {
|
5204 | return FileEngine$1.get(path__namespace.resolve(__dirname + '/../src/templates/partials/coverage-badge.hbs')).then(function (data) {
|
5205 | var template = Handlebars__namespace.compile(data);
|
5206 | coverageData.label = label;
|
5207 | var result = template({
|
5208 | data: coverageData
|
5209 | });
|
5210 | var testOutputDir = outputFolder.match(process.cwd());
|
5211 | if (testOutputDir && testOutputDir.length > 0) {
|
5212 | outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
|
5213 | }
|
5214 | return FileEngine$1.write(outputFolder + path__namespace.sep + '/images/coverage-badge-' + label + '.svg', result)["catch"](function (err) {
|
5215 | logger.error('Error during coverage badge ' + label + ' file generation ', err);
|
5216 | return Promise.reject(err);
|
5217 | });
|
5218 | }, function (err) { return Promise.reject('Error during coverage badge generation'); });
|
5219 | };
|
5220 | return HtmlEngine;
|
5221 | }());
|
5222 | var HtmlEngine$1 = HtmlEngine.getInstance();
|
5223 |
|
5224 | var decache = require('decache');
|
5225 | var MarkdownEngine = /** @class */ (function () {
|
5226 | function MarkdownEngine() {
|
5227 | var _this = this;
|
5228 | /**
|
5229 | * List of markdown files without .md extension
|
5230 | */
|
5231 | this.markdownFiles = ['README', 'CHANGELOG', 'LICENSE', 'CONTRIBUTING', 'TODO'];
|
5232 | decache('marked');
|
5233 | var marked = require('marked').marked;
|
5234 | this.markedInstance = marked;
|
5235 | var renderer = new this.markedInstance.Renderer();
|
5236 | renderer.code = function (code, language) {
|
5237 | var highlighted = code;
|
5238 | if (!language) {
|
5239 | language = 'none';
|
5240 | }
|
5241 | highlighted = _this.escape(code);
|
5242 | return "<div><pre class=\"line-numbers\"><code class=\"language-" + language + "\">" + highlighted + "</code></pre></div>";
|
5243 | };
|
5244 | renderer.table = function (header, body) {
|
5245 | return ('<table class="table table-bordered compodoc-table">\n' +
|
5246 | '<thead>\n' +
|
5247 | header +
|
5248 | '</thead>\n' +
|
5249 | '<tbody>\n' +
|
5250 | body +
|
5251 | '</tbody>\n' +
|
5252 | '</table>\n');
|
5253 | };
|
5254 | renderer.image = function (href, title, text) {
|
5255 | var out = '<img src="' + href + '" alt="' + text + '" class="img-responsive"';
|
5256 | if (title) {
|
5257 | out += ' title="' + title + '"';
|
5258 | }
|
5259 | out += '>';
|
5260 | return out;
|
5261 | };
|
5262 | this.markedInstance.setOptions({
|
5263 | renderer: renderer,
|
5264 | gfm: true,
|
5265 | breaks: false
|
5266 | });
|
5267 | }
|
5268 | MarkdownEngine.getInstance = function () {
|
5269 | if (!MarkdownEngine.instance) {
|
5270 | MarkdownEngine.instance = new MarkdownEngine();
|
5271 | }
|
5272 | return MarkdownEngine.instance;
|
5273 | };
|
5274 | MarkdownEngine.prototype.getTraditionalMarkdown = function (filepath) {
|
5275 | var _this = this;
|
5276 | return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath + '.md')["catch"](function (err) { return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath).then(); })
|
5277 | .then(function (data) {
|
5278 | var returnedData = {
|
5279 | markdown: _this.markedInstance(data),
|
5280 | rawData: data
|
5281 | };
|
5282 | return returnedData;
|
5283 | });
|
5284 | };
|
5285 | MarkdownEngine.prototype.getTraditionalMarkdownSync = function (filepath) {
|
5286 | return this.markedInstance(FileEngine$1.getSync(process.cwd() + path__namespace.sep + filepath));
|
5287 | };
|
5288 | MarkdownEngine.prototype.getReadmeFile = function () {
|
5289 | var _this = this;
|
5290 | return FileEngine$1.get(process.cwd() + path__namespace.sep + 'README.md').then(function (data) {
|
5291 | return _this.markedInstance(data);
|
5292 | });
|
5293 | };
|
5294 | MarkdownEngine.prototype.readNeighbourReadmeFile = function (file) {
|
5295 | var dirname = path__namespace.dirname(file);
|
5296 | var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
|
5297 | return fs__namespace.readFileSync(readmeFile, 'utf8');
|
5298 | };
|
5299 | MarkdownEngine.prototype.hasNeighbourReadmeFile = function (file) {
|
5300 | var dirname = path__namespace.dirname(file);
|
5301 | var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
|
5302 | return FileEngine$1.existsSync(readmeFile);
|
5303 | };
|
5304 | MarkdownEngine.prototype.componentReadmeFile = function (file) {
|
5305 | var dirname = path__namespace.dirname(file);
|
5306 | var readmeFile = dirname + path__namespace.sep + 'README.md';
|
5307 | var readmeAlternativeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
|
5308 | var finalPath = '';
|
5309 | if (FileEngine$1.existsSync(readmeFile)) {
|
5310 | finalPath = readmeFile;
|
5311 | }
|
5312 | else {
|
5313 | finalPath = readmeAlternativeFile;
|
5314 | }
|
5315 | return finalPath;
|
5316 | };
|
5317 | /**
|
5318 | * Checks if any of the markdown files is exists with or without endings
|
5319 | */
|
5320 | MarkdownEngine.prototype.hasRootMarkdowns = function () {
|
5321 | return this.addEndings(this.markdownFiles).some(function (x) {
|
5322 | return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
|
5323 | });
|
5324 | };
|
5325 | MarkdownEngine.prototype.listRootMarkdowns = function () {
|
5326 | var foundFiles = this.markdownFiles.filter(function (x) {
|
5327 | return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x + '.md') ||
|
5328 | FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
|
5329 | });
|
5330 | return this.addEndings(foundFiles);
|
5331 | };
|
5332 | MarkdownEngine.prototype.escape = function (html) {
|
5333 | return html
|
5334 | .replace(/&/g, '&')
|
5335 | .replace(/</g, '<')
|
5336 | .replace(/>/g, '>')
|
5337 | .replace(/"/g, '"')
|
5338 | .replace(/'/g, ''')
|
5339 | .replace(/@/g, '@');
|
5340 | };
|
5341 | /**
|
5342 | * ['README'] => ['README', 'README.md']
|
5343 | */
|
5344 | MarkdownEngine.prototype.addEndings = function (files) {
|
5345 | return ___namespace.flatMap(files, function (x) { return [x, x + '.md']; });
|
5346 | };
|
5347 | return MarkdownEngine;
|
5348 | }());
|
5349 | var MarkdownEngine$1 = MarkdownEngine.getInstance();
|
5350 |
|
5351 | var ngdT = require('@compodoc/ngd-transformer');
|
5352 | var NgdEngine = /** @class */ (function () {
|
5353 | function NgdEngine() {
|
5354 | }
|
5355 | NgdEngine.getInstance = function () {
|
5356 | if (!NgdEngine.instance) {
|
5357 | NgdEngine.instance = new NgdEngine();
|
5358 | }
|
5359 | return NgdEngine.instance;
|
5360 | };
|
5361 | NgdEngine.prototype.init = function (outputpath) {
|
5362 | this.engine = new ngdT.DotEngine({
|
5363 | output: outputpath,
|
5364 | displayLegend: true,
|
5365 | outputFormats: 'svg',
|
5366 | silent: true
|
5367 | });
|
5368 | };
|
5369 | NgdEngine.prototype.renderGraph = function (filepath, outputpath, type, name) {
|
5370 | this.engine.updateOutput(outputpath);
|
5371 | if (type === 'f') {
|
5372 | return this.engine.generateGraph([DependenciesEngine$1.getRawModule(name)]);
|
5373 | }
|
5374 | else {
|
5375 | return this.engine.generateGraph(DependenciesEngine$1.rawModulesForOverview);
|
5376 | }
|
5377 | };
|
5378 | NgdEngine.prototype.readGraph = function (filepath, name) {
|
5379 | return FileEngine$1.get(filepath)["catch"](function (err) {
|
5380 | return Promise.reject('Error during graph read ' + name);
|
5381 | });
|
5382 | };
|
5383 | return NgdEngine;
|
5384 | }());
|
5385 | var NgdEngine$1 = NgdEngine.getInstance();
|
5386 |
|
5387 | var COMPODOC_CONSTANTS = {
|
5388 | navTabDefinitions: [
|
5389 | {
|
5390 | id: 'info',
|
5391 | href: '#info',
|
5392 | 'data-link': 'info',
|
5393 | label: 'Info',
|
5394 | depTypes: ['all']
|
5395 | },
|
5396 | {
|
5397 | id: 'readme',
|
5398 | href: '#readme',
|
5399 | 'data-link': 'readme',
|
5400 | label: 'README',
|
5401 | depTypes: ['all']
|
5402 | },
|
5403 | {
|
5404 | id: 'source',
|
5405 | href: '#source',
|
5406 | 'data-link': 'source',
|
5407 | label: 'Source',
|
5408 | depTypes: ['all']
|
5409 | },
|
5410 | {
|
5411 | id: 'templateData',
|
5412 | href: '#templateData',
|
5413 | 'data-link': 'template',
|
5414 | label: 'Template',
|
5415 | depTypes: ['component']
|
5416 | },
|
5417 | {
|
5418 | id: 'styleData',
|
5419 | href: '#styleData',
|
5420 | 'data-link': 'style',
|
5421 | label: 'Styles',
|
5422 | depTypes: ['component']
|
5423 | },
|
5424 | {
|
5425 | id: 'tree',
|
5426 | href: '#tree',
|
5427 | 'data-link': 'dom-tree',
|
5428 | label: 'DOM Tree',
|
5429 | depTypes: ['component']
|
5430 | },
|
5431 | {
|
5432 | id: 'example',
|
5433 | href: '#example',
|
5434 | 'data-link': 'example',
|
5435 | label: 'Examples',
|
5436 | depTypes: ['component', 'directive', 'injectable', 'pipe']
|
5437 | }
|
5438 | ]
|
5439 | };
|
5440 | /**
|
5441 | * Max length for the string of a file during Lunr search engine indexing.
|
5442 | * Prevent stack size exceeded
|
5443 | */
|
5444 | var MAX_SIZE_FILE_SEARCH_INDEX = 50000;
|
5445 | /**
|
5446 | * Max length for the string of a file during cheerio parsing.
|
5447 | * Prevent stack size exceeded
|
5448 | */
|
5449 | var MAX_SIZE_FILE_CHEERIO_PARSING = 400000000;
|
5450 |
|
5451 | var lunr = require('lunr');
|
5452 | var cheerio = require('cheerio');
|
5453 | var SearchEngine = /** @class */ (function () {
|
5454 | function SearchEngine() {
|
5455 | this.searchDocuments = [];
|
5456 | this.documentsStore = {};
|
5457 | this.amountOfMemory = 0;
|
5458 | }
|
5459 | SearchEngine.getInstance = function () {
|
5460 | if (!SearchEngine.instance) {
|
5461 | SearchEngine.instance = new SearchEngine();
|
5462 | }
|
5463 | return SearchEngine.instance;
|
5464 | };
|
5465 | SearchEngine.prototype.indexPage = function (page) {
|
5466 | var text;
|
5467 | this.amountOfMemory += page.rawData.length;
|
5468 | if (this.amountOfMemory < MAX_SIZE_FILE_CHEERIO_PARSING) {
|
5469 | var indexStartContent = page.rawData.indexOf('<!-- START CONTENT -->');
|
5470 | var indexEndContent = page.rawData.indexOf('<!-- END CONTENT -->');
|
5471 | var $ = cheerio.load(page.rawData.substring(indexStartContent + 1, indexEndContent));
|
5472 | text = $('.content').html();
|
5473 | text = htmlEntities.decode(text);
|
5474 | text = text.replace(/(<([^>]+)>)/gi, '');
|
5475 | page.url = page.url.replace(Configuration$1.mainData.output, '');
|
5476 | var doc = {
|
5477 | url: page.url,
|
5478 | title: page.infos.context + ' - ' + page.infos.name,
|
5479 | body: text
|
5480 | };
|
5481 | if (!this.documentsStore.hasOwnProperty(doc.url) &&
|
5482 | doc.body.length < MAX_SIZE_FILE_SEARCH_INDEX) {
|
5483 | this.documentsStore[doc.url] = doc;
|
5484 | this.searchDocuments.push(doc);
|
5485 | }
|
5486 | }
|
5487 | };
|
5488 | SearchEngine.prototype.generateSearchIndexJson = function (outputFolder) {
|
5489 | var _this = this;
|
5490 | var that = this;
|
5491 | var searchIndex = lunr(function () {
|
5492 | /* tslint:disable:no-invalid-this */
|
5493 | this.ref('url');
|
5494 | this.field('title');
|
5495 | this.field('body');
|
5496 | this.pipeline.remove(lunr.stemmer);
|
5497 | var i = 0;
|
5498 | var len = that.searchDocuments.length;
|
5499 | for (i; i < len; i++) {
|
5500 | this.add(that.searchDocuments[i]);
|
5501 | }
|
5502 | });
|
5503 | return FileEngine$1.get(__dirname + '/../src/templates/partials/search-index.hbs').then(function (data) {
|
5504 | var template = Handlebars__namespace.compile(data);
|
5505 | var result = template({
|
5506 | index: JSON.stringify(searchIndex),
|
5507 | store: JSON.stringify(_this.documentsStore)
|
5508 | });
|
5509 | var testOutputDir = outputFolder.match(process.cwd());
|
5510 | if (testOutputDir && testOutputDir.length > 0) {
|
5511 | outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
|
5512 | }
|
5513 | return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/search/search_index.js', result)["catch"](function (err) {
|
5514 | logger.error('Error during search index file generation ', err);
|
5515 | return Promise.reject(err);
|
5516 | });
|
5517 | }, function (err) { return Promise.reject('Error during search index generation'); });
|
5518 | };
|
5519 | return SearchEngine;
|
5520 | }());
|
5521 | var SearchEngine$1 = SearchEngine.getInstance();
|
5522 |
|
5523 | var $ = require('cheerio');
|
5524 | var ComponentsTreeEngine = /** @class */ (function () {
|
5525 | function ComponentsTreeEngine() {
|
5526 | this.components = [];
|
5527 | this.componentsForTree = [];
|
5528 | }
|
5529 | ComponentsTreeEngine.getInstance = function () {
|
5530 | if (!ComponentsTreeEngine.instance) {
|
5531 | ComponentsTreeEngine.instance = new ComponentsTreeEngine();
|
5532 | }
|
5533 | return ComponentsTreeEngine.instance;
|
5534 | };
|
5535 | ComponentsTreeEngine.prototype.addComponent = function (component) {
|
5536 | this.components.push(component);
|
5537 | };
|
5538 | ComponentsTreeEngine.prototype.readTemplates = function () {
|
5539 | var _this = this;
|
5540 | return new Promise(function (resolve, reject) {
|
5541 | var i = 0;
|
5542 | var len = _this.componentsForTree.length;
|
5543 | var loop = function () {
|
5544 | if (i <= len - 1) {
|
5545 | if (_this.componentsForTree[i].templateUrl) {
|
5546 | var filePath = process.cwd() +
|
5547 | path__namespace.sep +
|
5548 | path__namespace.dirname(_this.componentsForTree[i].file) +
|
5549 | path__namespace.sep +
|
5550 | _this.componentsForTree[i].templateUrl;
|
5551 | FileEngine$1.get(filePath).then(function (templateData) {
|
5552 | _this.componentsForTree[i].templateData = templateData;
|
5553 | i++;
|
5554 | loop();
|
5555 | }, function (e) {
|
5556 | logger.error(e);
|
5557 | reject();
|
5558 | });
|
5559 | }
|
5560 | else {
|
5561 | _this.componentsForTree[i].templateData = _this.componentsForTree[i].template;
|
5562 | i++;
|
5563 | loop();
|
5564 | }
|
5565 | }
|
5566 | else {
|
5567 | resolve();
|
5568 | }
|
5569 | };
|
5570 | loop();
|
5571 | });
|
5572 | };
|
5573 | ComponentsTreeEngine.prototype.findChildrenAndParents = function () {
|
5574 | var _this = this;
|
5575 | return new Promise(function (resolve, reject) {
|
5576 | ___namespace.forEach(_this.componentsForTree, function (component) {
|
5577 | var $component = $(component.templateData);
|
5578 | ___namespace.forEach(_this.componentsForTree, function (componentToFind) {
|
5579 | if ($component.find(componentToFind.selector).length > 0) {
|
5580 | console.log(componentToFind.name + ' found in ' + component.name);
|
5581 | component.children.push(componentToFind.name);
|
5582 | }
|
5583 | });
|
5584 | });
|
5585 | resolve();
|
5586 | });
|
5587 | };
|
5588 | ComponentsTreeEngine.prototype.createTreesForComponents = function () {
|
5589 | var _this = this;
|
5590 | return new Promise(function (resolve, reject) {
|
5591 | ___namespace.forEach(_this.components, function (component) {
|
5592 | var _component = {
|
5593 | name: component.name,
|
5594 | file: component.file,
|
5595 | selector: component.selector,
|
5596 | children: [],
|
5597 | template: '',
|
5598 | templateUrl: ''
|
5599 | };
|
5600 | if (typeof component.template !== 'undefined') {
|
5601 | _component.template = component.template;
|
5602 | }
|
5603 | if (component.templateUrl.length > 0) {
|
5604 | _component.templateUrl = component.templateUrl[0];
|
5605 | }
|
5606 | _this.componentsForTree.push(_component);
|
5607 | });
|
5608 | _this.readTemplates().then(function () {
|
5609 | _this.findChildrenAndParents().then(function () {
|
5610 | console.log('this.componentsForTree: ', _this.componentsForTree);
|
5611 | resolve();
|
5612 | }, function (e) {
|
5613 | logger.error(e);
|
5614 | reject();
|
5615 | });
|
5616 | }, function (e) {
|
5617 | logger.error(e);
|
5618 | });
|
5619 | });
|
5620 | };
|
5621 | return ComponentsTreeEngine;
|
5622 | }());
|
5623 | var ComponentsTreeEngine$1 = ComponentsTreeEngine.getInstance();
|
5624 |
|
5625 | var ast$2 = new tsMorph.Project();
|
5626 | var ImportsUtil = /** @class */ (function () {
|
5627 | function ImportsUtil() {
|
5628 | }
|
5629 | ImportsUtil.getInstance = function () {
|
5630 | if (!ImportsUtil.instance) {
|
5631 | ImportsUtil.instance = new ImportsUtil();
|
5632 | }
|
5633 | return ImportsUtil.instance;
|
5634 | };
|
5635 | /**
|
5636 | * Find for a sourceFile a variable value in a local enum
|
5637 | * @param srcFile
|
5638 | * @param variableName
|
5639 | * @param variableValue
|
5640 | */
|
5641 | ImportsUtil.prototype.findInEnums = function (srcFile, variableName, variableValue) {
|
5642 | var res = '';
|
5643 | srcFile.getEnum(function (e) {
|
5644 | if (e.getName() === variableName) {
|
5645 | e.getMember(function (m) {
|
5646 | if (m.getName() === variableValue) {
|
5647 | res = m.getValue();
|
5648 | }
|
5649 | });
|
5650 | }
|
5651 | });
|
5652 | return res;
|
5653 | };
|
5654 | /**
|
5655 | * Find for a sourceFile a variable value in a local static class
|
5656 | * @param srcFile
|
5657 | * @param variableName
|
5658 | * @param variableValue
|
5659 | */
|
5660 | ImportsUtil.prototype.findInClasses = function (srcFile, variableName, variableValue) {
|
5661 | var res = '';
|
5662 | srcFile.getClass(function (c) {
|
5663 | var staticProperty = c.getStaticProperty(variableValue);
|
5664 | if (staticProperty) {
|
5665 | if (staticProperty.getInitializer()) {
|
5666 | res = staticProperty.getInitializer().getText();
|
5667 | }
|
5668 | }
|
5669 | });
|
5670 | return res;
|
5671 | };
|
5672 | /**
|
5673 | * Find a value in a local variable declaration like an object
|
5674 | * @param variableDeclaration
|
5675 | * @param variablesAttributes
|
5676 | */
|
5677 | ImportsUtil.prototype.findInObjectVariableDeclaration = function (variableDeclaration, variablesAttributes) {
|
5678 | var variableKind = variableDeclaration.getKind();
|
5679 | if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
|
5680 | var initializer = variableDeclaration.getInitializer();
|
5681 | if (initializer) {
|
5682 | var initializerKind = initializer.getKind();
|
5683 | if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
5684 | var compilerNode = initializer.compilerNode, finalValue_1 = '';
|
5685 | // Find thestring from AVAR.BVAR.thestring inside properties
|
5686 | var depth_1 = 0;
|
5687 | var loopProperties_1 = function (properties) {
|
5688 | properties.forEach(function (prop) {
|
5689 | if (prop.name) {
|
5690 | if (variablesAttributes[depth_1 + 1]) {
|
5691 | if (prop.name.getText() === variablesAttributes[depth_1 + 1]) {
|
5692 | if (prop.initializer) {
|
5693 | if (prop.initializer.properties) {
|
5694 | depth_1 += 1;
|
5695 | loopProperties_1(prop.initializer.properties);
|
5696 | }
|
5697 | else {
|
5698 | finalValue_1 = prop.initializer.text;
|
5699 | }
|
5700 | }
|
5701 | else {
|
5702 | finalValue_1 = prop.initializer.text;
|
5703 | }
|
5704 | }
|
5705 | }
|
5706 | }
|
5707 | });
|
5708 | };
|
5709 | loopProperties_1(compilerNode.properties);
|
5710 | return finalValue_1;
|
5711 | }
|
5712 | }
|
5713 | }
|
5714 | };
|
5715 | /**
|
5716 | * Find in imports something like myvar
|
5717 | * @param {string} inputVariableName like myvar
|
5718 | * @return {[type]} myvar value
|
5719 | */
|
5720 | ImportsUtil.prototype.findValueInImportOrLocalVariables = function (inputVariableName, sourceFile, decoratorType) {
|
5721 | var e_1, _a;
|
5722 | var metadataVariableName = inputVariableName, searchedImport, aliasOriginalName = '', foundWithNamedImport = false, foundWithAlias = false;
|
5723 | var file = typeof ast$2.getSourceFile(sourceFile.fileName) !== 'undefined'
|
5724 | ? ast$2.getSourceFile(sourceFile.fileName)
|
5725 | : ast$2.addSourceFileAtPathIfExists(sourceFile.fileName); // tslint:disable-line
|
5726 | var imports = file.getImportDeclarations();
|
5727 | /**
|
5728 | * Loop through all imports, and find one matching inputVariableName
|
5729 | */
|
5730 | imports.forEach(function (i) {
|
5731 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
5732 | if (namedImportsLength > 0) {
|
5733 | for (j; j < namedImportsLength; j++) {
|
5734 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
5735 | if (namedImports[j].getAliasNode()) {
|
5736 | importAlias = namedImports[j].getAliasNode().getText();
|
5737 | }
|
5738 | if (importName === metadataVariableName) {
|
5739 | foundWithNamedImport = true;
|
5740 | searchedImport = i;
|
5741 | break;
|
5742 | }
|
5743 | if (importAlias === metadataVariableName) {
|
5744 | foundWithNamedImport = true;
|
5745 | foundWithAlias = true;
|
5746 | aliasOriginalName = importName;
|
5747 | searchedImport = i;
|
5748 | break;
|
5749 | }
|
5750 | }
|
5751 | }
|
5752 | var namespaceImport = i.getNamespaceImport();
|
5753 | if (namespaceImport) {
|
5754 | var namespaceImportLocalName = namespaceImport.getText();
|
5755 | if (namespaceImportLocalName === metadataVariableName) {
|
5756 | searchedImport = i;
|
5757 | }
|
5758 | }
|
5759 | if (!foundWithNamedImport) {
|
5760 | var defaultImport = i.getDefaultImport();
|
5761 | if (defaultImport) {
|
5762 | var defaultImportText = defaultImport.getText();
|
5763 | if (defaultImportText === metadataVariableName) {
|
5764 | searchedImport = i;
|
5765 | }
|
5766 | }
|
5767 | }
|
5768 | });
|
5769 | function hasFoundValues(variableDeclaration) {
|
5770 | var variableKind = variableDeclaration.getKind();
|
5771 | if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
|
5772 | var initializer = variableDeclaration.getInitializer();
|
5773 | if (initializer) {
|
5774 | var initializerKind = initializer.getKind();
|
5775 | if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
5776 | var compilerNode = initializer.compilerNode;
|
5777 | return compilerNode.properties;
|
5778 | }
|
5779 | }
|
5780 | }
|
5781 | }
|
5782 | if (typeof searchedImport !== 'undefined') {
|
5783 | var importPathReference = searchedImport.getModuleSpecifierSourceFile();
|
5784 | var importPath = void 0;
|
5785 | if (typeof importPathReference !== 'undefined') {
|
5786 | importPath = importPathReference.compilerNode.fileName;
|
5787 | var sourceFileImport = typeof ast$2.getSourceFile(importPath) !== 'undefined'
|
5788 | ? ast$2.getSourceFile(importPath)
|
5789 | : ast$2.addSourceFileAtPathIfExists(importPath); // tslint:disable-line
|
5790 | if (sourceFileImport) {
|
5791 | var variableName_1 = foundWithAlias ? aliasOriginalName : metadataVariableName;
|
5792 | var variableDeclaration = sourceFileImport.getVariableDeclaration(variableName_1);
|
5793 | if (variableDeclaration) {
|
5794 | return hasFoundValues(variableDeclaration);
|
5795 | }
|
5796 | else {
|
5797 | // Try with exports
|
5798 | var exportDeclarations = sourceFileImport.getExportedDeclarations();
|
5799 | if (exportDeclarations && exportDeclarations.size > 0) {
|
5800 | try {
|
5801 | for (var exportDeclarations_1 = __values(exportDeclarations), exportDeclarations_1_1 = exportDeclarations_1.next(); !exportDeclarations_1_1.done; exportDeclarations_1_1 = exportDeclarations_1.next()) {
|
5802 | var _b = __read(exportDeclarations_1_1.value, 2), exportDeclarationKey = _b[0], exportDeclarationValues = _b[1];
|
5803 | exportDeclarationValues.forEach(function (exportDeclarationValue) {
|
5804 | if (exportDeclarationValue instanceof tsMorph.VariableDeclaration &&
|
5805 | exportDeclarationValue.getName() === variableName_1) {
|
5806 | return hasFoundValues(exportDeclarationValue);
|
5807 | }
|
5808 | });
|
5809 | }
|
5810 | }
|
5811 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
5812 | finally {
|
5813 | try {
|
5814 | if (exportDeclarations_1_1 && !exportDeclarations_1_1.done && (_a = exportDeclarations_1["return"])) _a.call(exportDeclarations_1);
|
5815 | }
|
5816 | finally { if (e_1) throw e_1.error; }
|
5817 | }
|
5818 | }
|
5819 | }
|
5820 | }
|
5821 | }
|
5822 | if (!importPathReference &&
|
5823 | decoratorType === 'template' &&
|
5824 | searchedImport.getModuleSpecifierValue().indexOf('.html') !== -1) {
|
5825 | var originalSourceFilePath = sourceFile.path;
|
5826 | var originalSourceFilePathFolder = originalSourceFilePath.substring(0, originalSourceFilePath.lastIndexOf('/'));
|
5827 | var finalImportedPath = originalSourceFilePathFolder + '/' + searchedImport.getModuleSpecifierValue();
|
5828 | var finalImportedPathData = FileEngine$1.getSync(finalImportedPath);
|
5829 | return finalImportedPathData;
|
5830 | }
|
5831 | }
|
5832 | else {
|
5833 | // Find in local variables of the file
|
5834 | var variableDeclaration = file.getVariableDeclaration(metadataVariableName);
|
5835 | if (variableDeclaration) {
|
5836 | var variableKind = variableDeclaration.getKind();
|
5837 | if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
|
5838 | var initializer = variableDeclaration.getInitializer();
|
5839 | if (initializer) {
|
5840 | var initializerKind = initializer.getKind();
|
5841 | if (initializerKind &&
|
5842 | initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
5843 | var compilerNode = initializer.compilerNode;
|
5844 | return compilerNode.properties;
|
5845 | }
|
5846 | else if (initializerKind &&
|
5847 | (initializerKind === tsMorph.SyntaxKind.StringLiteral ||
|
5848 | initializerKind === tsMorph.SyntaxKind.NoSubstitutionTemplateLiteral)) {
|
5849 | if (decoratorType === 'template') {
|
5850 | return initializer.getText();
|
5851 | }
|
5852 | else {
|
5853 | return variableDeclaration.compilerNode;
|
5854 | }
|
5855 | }
|
5856 | else if (initializerKind) {
|
5857 | return variableDeclaration.compilerNode;
|
5858 | }
|
5859 | }
|
5860 | }
|
5861 | }
|
5862 | }
|
5863 | return [];
|
5864 | };
|
5865 | ImportsUtil.prototype.getFileNameOfImport = function (variableName, sourceFile) {
|
5866 | var file = typeof ast$2.getSourceFile(sourceFile.fileName) !== 'undefined'
|
5867 | ? ast$2.getSourceFile(sourceFile.fileName)
|
5868 | : ast$2.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
|
5869 | var imports = file.getImportDeclarations();
|
5870 | var searchedImport, finalPath = '';
|
5871 | imports.forEach(function (i) {
|
5872 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
5873 | if (namedImportsLength > 0) {
|
5874 | for (j; j < namedImportsLength; j++) {
|
5875 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
5876 | if (namedImports[j].getAliasNode()) {
|
5877 | importAlias = namedImports[j].getAliasNode().getText();
|
5878 | }
|
5879 | if (importName === variableName) {
|
5880 | searchedImport = i;
|
5881 | break;
|
5882 | }
|
5883 | if (importAlias === variableName) {
|
5884 | searchedImport = i;
|
5885 | break;
|
5886 | }
|
5887 | }
|
5888 | }
|
5889 | });
|
5890 | if (typeof searchedImport !== 'undefined') {
|
5891 | var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
|
5892 | '/' +
|
5893 | searchedImport.getModuleSpecifierValue() +
|
5894 | '.ts');
|
5895 | var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
|
5896 | finalPath = importPath.replace(cleaner, '');
|
5897 | }
|
5898 | return finalPath;
|
5899 | };
|
5900 | /**
|
5901 | * Find the file path of imported variable
|
5902 | * @param {string} inputVariableName like thestring
|
5903 | * @return {[type]} thestring destination path
|
5904 | */
|
5905 | ImportsUtil.prototype.findFilePathOfImportedVariable = function (inputVariableName, sourceFilePath) {
|
5906 | var searchedImport, finalPath = '';
|
5907 | var file = typeof ast$2.getSourceFile(sourceFilePath) !== 'undefined'
|
5908 | ? ast$2.getSourceFile(sourceFilePath)
|
5909 | : ast$2.addSourceFileAtPath(sourceFilePath); // tslint:disable-line
|
5910 | var imports = file.getImportDeclarations();
|
5911 | /**
|
5912 | * Loop through all imports, and find one matching inputVariableName
|
5913 | */
|
5914 | imports.forEach(function (i) {
|
5915 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
5916 | if (namedImportsLength > 0) {
|
5917 | for (j; j < namedImportsLength; j++) {
|
5918 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
5919 | if (namedImports[j].getAliasNode()) {
|
5920 | importAlias = namedImports[j].getAliasNode().getText();
|
5921 | }
|
5922 | if (importName === inputVariableName) {
|
5923 | searchedImport = i;
|
5924 | break;
|
5925 | }
|
5926 | if (importAlias === inputVariableName) {
|
5927 | searchedImport = i;
|
5928 | break;
|
5929 | }
|
5930 | }
|
5931 | }
|
5932 | });
|
5933 | if (typeof searchedImport !== 'undefined') {
|
5934 | finalPath = path__namespace.resolve(path__namespace.dirname(sourceFilePath) +
|
5935 | '/' +
|
5936 | searchedImport.getModuleSpecifierValue() +
|
5937 | '.ts');
|
5938 | }
|
5939 | return finalPath;
|
5940 | };
|
5941 | /**
|
5942 | * Find in imports something like VAR.AVAR.BVAR.thestring
|
5943 | * @param {string} inputVariableName like VAR.AVAR.BVAR.thestring
|
5944 | * @return {[type]} thestring value
|
5945 | */
|
5946 | ImportsUtil.prototype.findPropertyValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
|
5947 | var variablesAttributes = inputVariableName.split('.'), metadataVariableName = variablesAttributes[0], searchedImport, aliasOriginalName = '', foundWithAlias = false;
|
5948 | var file = typeof ast$2.getSourceFile(sourceFile.fileName) !== 'undefined'
|
5949 | ? ast$2.getSourceFile(sourceFile.fileName)
|
5950 | : ast$2.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
|
5951 | var imports = file.getImportDeclarations();
|
5952 | /**
|
5953 | * Loop through all imports, and find one matching inputVariableName
|
5954 | */
|
5955 | imports.forEach(function (i) {
|
5956 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
5957 | if (namedImportsLength > 0) {
|
5958 | for (j; j < namedImportsLength; j++) {
|
5959 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
5960 | if (namedImports[j].getAliasNode()) {
|
5961 | importAlias = namedImports[j].getAliasNode().getText();
|
5962 | }
|
5963 | if (importName === metadataVariableName) {
|
5964 | searchedImport = i;
|
5965 | break;
|
5966 | }
|
5967 | if (importAlias === metadataVariableName) {
|
5968 | foundWithAlias = true;
|
5969 | aliasOriginalName = importName;
|
5970 | searchedImport = i;
|
5971 | break;
|
5972 | }
|
5973 | }
|
5974 | }
|
5975 | });
|
5976 | var fileToSearchIn, variableDeclaration;
|
5977 | if (typeof searchedImport !== 'undefined') {
|
5978 | var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
|
5979 | '/' +
|
5980 | searchedImport.getModuleSpecifierValue() +
|
5981 | '.ts');
|
5982 | var sourceFileImport = typeof ast$2.getSourceFile(importPath) !== 'undefined'
|
5983 | ? ast$2.getSourceFile(importPath)
|
5984 | : ast$2.addSourceFileAtPath(importPath); // tslint:disable-line
|
5985 | if (sourceFileImport) {
|
5986 | fileToSearchIn = sourceFileImport;
|
5987 | var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
|
5988 | variableDeclaration = fileToSearchIn.getVariableDeclaration(variableName);
|
5989 | }
|
5990 | }
|
5991 | else {
|
5992 | fileToSearchIn = file;
|
5993 | // Find in local variables of the file
|
5994 | variableDeclaration = fileToSearchIn.getVariableDeclaration(metadataVariableName);
|
5995 | }
|
5996 | if (variableDeclaration) {
|
5997 | return this.findInObjectVariableDeclaration(variableDeclaration, variablesAttributes);
|
5998 | }
|
5999 | // Try find it in enums
|
6000 | if (variablesAttributes.length > 0) {
|
6001 | if (typeof fileToSearchIn !== 'undefined') {
|
6002 | var val = this.findInEnums(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
|
6003 | if (val !== '') {
|
6004 | return val;
|
6005 | }
|
6006 | val = this.findInClasses(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
|
6007 | if (val !== '') {
|
6008 | return val;
|
6009 | }
|
6010 | }
|
6011 | }
|
6012 | };
|
6013 | return ImportsUtil;
|
6014 | }());
|
6015 | var ImportsUtil$1 = ImportsUtil.getInstance();
|
6016 |
|
6017 | var traverse$1 = require('traverse');
|
6018 | var ast$1 = new tsMorph.Project();
|
6019 | var RouterParserUtil = /** @class */ (function () {
|
6020 | function RouterParserUtil() {
|
6021 | this.routes = [];
|
6022 | this.incompleteRoutes = [];
|
6023 | this.modules = [];
|
6024 | this.modulesWithRoutes = [];
|
6025 | this.transformAngular8ImportSyntax = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>"import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)\.then\(\(?\w+?\)?=>\S+?\.([^)]+?)\)(\\'|'|")/g;
|
6026 | this.transformAngular8ImportSyntaxAsyncAwait = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>\("import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)"\)\.['"]([^)]+?)['"]/g;
|
6027 | }
|
6028 | RouterParserUtil.getInstance = function () {
|
6029 | if (!RouterParserUtil.instance) {
|
6030 | RouterParserUtil.instance = new RouterParserUtil();
|
6031 | }
|
6032 | return RouterParserUtil.instance;
|
6033 | };
|
6034 | RouterParserUtil.prototype.addRoute = function (route) {
|
6035 | this.routes.push(route);
|
6036 | this.routes = ___namespace.sortBy(___namespace.uniqWith(this.routes, ___namespace.isEqual), ['name']);
|
6037 | };
|
6038 | RouterParserUtil.prototype.addIncompleteRoute = function (route) {
|
6039 | this.incompleteRoutes.push(route);
|
6040 | this.incompleteRoutes = ___namespace.sortBy(___namespace.uniqWith(this.incompleteRoutes, ___namespace.isEqual), ['name']);
|
6041 | };
|
6042 | RouterParserUtil.prototype.addModuleWithRoutes = function (moduleName, moduleImports, filename) {
|
6043 | this.modulesWithRoutes.push({
|
6044 | name: moduleName,
|
6045 | importsNode: moduleImports,
|
6046 | filename: filename
|
6047 | });
|
6048 | this.modulesWithRoutes = ___namespace.sortBy(___namespace.uniqWith(this.modulesWithRoutes, ___namespace.isEqual), ['name']);
|
6049 | };
|
6050 | RouterParserUtil.prototype.addModule = function (moduleName, moduleImports) {
|
6051 | this.modules.push({
|
6052 | name: moduleName,
|
6053 | importsNode: moduleImports
|
6054 | });
|
6055 | this.modules = ___namespace.sortBy(___namespace.uniqWith(this.modules, ___namespace.isEqual), ['name']);
|
6056 | };
|
6057 | RouterParserUtil.prototype.cleanRawRouteParsed = function (route) {
|
6058 | var routesWithoutSpaces = route.replace(/ /gm, '');
|
6059 | var testTrailingComma = routesWithoutSpaces.indexOf('},]');
|
6060 | if (testTrailingComma !== -1) {
|
6061 | routesWithoutSpaces = routesWithoutSpaces.replace('},]', '}]');
|
6062 | }
|
6063 | routesWithoutSpaces = routesWithoutSpaces.replace(this.transformAngular8ImportSyntax, '$1"$4#$6"');
|
6064 | routesWithoutSpaces = routesWithoutSpaces.replace(this.transformAngular8ImportSyntaxAsyncAwait, '$1"$4#$6"');
|
6065 | return JSON5__namespace.parse(routesWithoutSpaces);
|
6066 | };
|
6067 | RouterParserUtil.prototype.cleanRawRoute = function (route) {
|
6068 | var routesWithoutSpaces = route.replace(/ /gm, '');
|
6069 | var testTrailingComma = routesWithoutSpaces.indexOf('},]');
|
6070 | if (testTrailingComma !== -1) {
|
6071 | routesWithoutSpaces = routesWithoutSpaces.replace('},]', '}]');
|
6072 | }
|
6073 | routesWithoutSpaces = routesWithoutSpaces.replace(this.transformAngular8ImportSyntax, '$1"$4#$6"');
|
6074 | routesWithoutSpaces = routesWithoutSpaces.replace(this.transformAngular8ImportSyntaxAsyncAwait, '$1"$4#$6"');
|
6075 | return routesWithoutSpaces;
|
6076 | };
|
6077 | RouterParserUtil.prototype.setRootModule = function (module) {
|
6078 | this.rootModule = module;
|
6079 | };
|
6080 | RouterParserUtil.prototype.hasRouterModuleInImports = function (imports) {
|
6081 | for (var i = 0; i < imports.length; i++) {
|
6082 | if (imports[i].name.indexOf('RouterModule.forChild') !== -1 ||
|
6083 | imports[i].name.indexOf('RouterModule.forRoot') !== -1 ||
|
6084 | imports[i].name.indexOf('RouterModule') !== -1) {
|
6085 | return true;
|
6086 | }
|
6087 | }
|
6088 | return false;
|
6089 | };
|
6090 | RouterParserUtil.prototype.fixIncompleteRoutes = function (miscellaneousVariables) {
|
6091 | var matchingVariables = [];
|
6092 | // For each incompleteRoute, scan if one misc variable is in code
|
6093 | // if ok, try recreating complete route
|
6094 | for (var i = 0; i < this.incompleteRoutes.length; i++) {
|
6095 | for (var j = 0; j < miscellaneousVariables.length; j++) {
|
6096 | if (this.incompleteRoutes[i].data.indexOf(miscellaneousVariables[j].name) !== -1) {
|
6097 | console.log('found one misc var inside incompleteRoute');
|
6098 | console.log(miscellaneousVariables[j].name);
|
6099 | matchingVariables.push(miscellaneousVariables[j]);
|
6100 | }
|
6101 | }
|
6102 | // Clean incompleteRoute
|
6103 | this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace('[', '');
|
6104 | this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace(']', '');
|
6105 | }
|
6106 | };
|
6107 | RouterParserUtil.prototype.linkModulesAndRoutes = function () {
|
6108 | var _this = this;
|
6109 | var i = 0;
|
6110 | var len = this.modulesWithRoutes.length;
|
6111 | for (i; i < len; i++) {
|
6112 | ___namespace.forEach(this.modulesWithRoutes[i].importsNode, function (node) {
|
6113 | var initializer = node.initializer;
|
6114 | if (initializer) {
|
6115 | if (initializer.elements) {
|
6116 | ___namespace.forEach(initializer.elements, function (element) {
|
6117 | // find element with arguments
|
6118 | if (element.arguments) {
|
6119 | ___namespace.forEach(element.arguments, function (argument) {
|
6120 | ___namespace.forEach(_this.routes, function (route) {
|
6121 | if (argument.text &&
|
6122 | route.name === argument.text &&
|
6123 | route.filename === _this.modulesWithRoutes[i].filename) {
|
6124 | route.module = _this.modulesWithRoutes[i].name;
|
6125 | }
|
6126 | else if (argument.text &&
|
6127 | route.name === argument.text &&
|
6128 | route.filename !== _this.modulesWithRoutes[i].filename) {
|
6129 | var argumentImportPath = ImportsUtil$1.findFilePathOfImportedVariable(argument.text, _this.modulesWithRoutes[i].filename);
|
6130 | argumentImportPath = argumentImportPath
|
6131 | .replace(process.cwd() + path__namespace.sep, '')
|
6132 | .replace(/\\/g, '/');
|
6133 | if (argument.text &&
|
6134 | route.name === argument.text &&
|
6135 | route.filename === argumentImportPath) {
|
6136 | route.module = _this.modulesWithRoutes[i].name;
|
6137 | }
|
6138 | }
|
6139 | });
|
6140 | });
|
6141 | }
|
6142 | });
|
6143 | }
|
6144 | }
|
6145 | /**
|
6146 | * direct support of for example
|
6147 | * export const HomeRoutingModule: ModuleWithProviders = RouterModule.forChild(HOME_ROUTES);
|
6148 | */
|
6149 | if (tsMorph.ts.isCallExpression(node)) {
|
6150 | if (node.arguments) {
|
6151 | ___namespace.forEach(node.arguments, function (argument) {
|
6152 | ___namespace.forEach(_this.routes, function (route) {
|
6153 | if (argument.text &&
|
6154 | route.name === argument.text &&
|
6155 | route.filename === _this.modulesWithRoutes[i].filename) {
|
6156 | route.module = _this.modulesWithRoutes[i].name;
|
6157 | }
|
6158 | });
|
6159 | });
|
6160 | }
|
6161 | }
|
6162 | });
|
6163 | }
|
6164 | };
|
6165 | RouterParserUtil.prototype.foundRouteWithModuleName = function (moduleName) {
|
6166 | return ___namespace.find(this.routes, { module: moduleName });
|
6167 | };
|
6168 | RouterParserUtil.prototype.foundLazyModuleWithPath = function (modulePath) {
|
6169 | // path is like app/customers/customers.module#CustomersModule
|
6170 | var split = modulePath.split('#');
|
6171 | split[0];
|
6172 | var lazyModuleName = split[1];
|
6173 | return lazyModuleName;
|
6174 | };
|
6175 | RouterParserUtil.prototype.constructRoutesTree = function () {
|
6176 | var _this = this;
|
6177 | // routes[] contains routes with module link
|
6178 | // modulesTree contains modules tree
|
6179 | // make a final routes tree with that
|
6180 | traverse$1(this.modulesTree).forEach(function (node) {
|
6181 | if (node) {
|
6182 | if (node.parent) {
|
6183 | delete node.parent;
|
6184 | }
|
6185 | if (node.initializer) {
|
6186 | delete node.initializer;
|
6187 | }
|
6188 | if (node.importsNode) {
|
6189 | delete node.importsNode;
|
6190 | }
|
6191 | }
|
6192 | });
|
6193 | this.cleanModulesTree = ___namespace.cloneDeep(this.modulesTree);
|
6194 | var routesTree = {
|
6195 | name: '<root>',
|
6196 | kind: 'module',
|
6197 | className: this.rootModule,
|
6198 | children: []
|
6199 | };
|
6200 | var loopModulesParser = function (node) {
|
6201 | if (node.children && node.children.length > 0) {
|
6202 | // If module has child modules
|
6203 | for (var i in node.children) {
|
6204 | var route = _this.foundRouteWithModuleName(node.children[i].name);
|
6205 | if (route && route.data) {
|
6206 | try {
|
6207 | route.children = JSON5__namespace.parse(route.data);
|
6208 | }
|
6209 | catch (e) {
|
6210 | logger.error('Error during generation of routes JSON file, maybe a trailing comma or an external variable inside one route.');
|
6211 | }
|
6212 | delete route.data;
|
6213 | route.kind = 'module';
|
6214 | routesTree.children.push(route);
|
6215 | }
|
6216 | if (node.children[i].children) {
|
6217 | loopModulesParser(node.children[i]);
|
6218 | }
|
6219 | }
|
6220 | }
|
6221 | else {
|
6222 | // else routes are directly inside the module
|
6223 | var rawRoutes = _this.foundRouteWithModuleName(node.name);
|
6224 | if (rawRoutes) {
|
6225 | var routes = JSON5__namespace.parse(rawRoutes.data);
|
6226 | if (routes) {
|
6227 | var i = 0;
|
6228 | var len = routes.length;
|
6229 | var routeAddedOnce = false;
|
6230 | for (i; i < len; i++) {
|
6231 | var route = routes[i];
|
6232 | if (routes[i].component) {
|
6233 | routeAddedOnce = true;
|
6234 | routesTree.children.push({
|
6235 | kind: 'component',
|
6236 | component: routes[i].component,
|
6237 | path: routes[i].path
|
6238 | });
|
6239 | }
|
6240 | }
|
6241 | if (!routeAddedOnce) {
|
6242 | routesTree.children = __spreadArray(__spreadArray([], __read(routesTree.children), false), __read(routes), false);
|
6243 | }
|
6244 | }
|
6245 | }
|
6246 | }
|
6247 | };
|
6248 | var startModule = ___namespace.find(this.cleanModulesTree, { name: this.rootModule });
|
6249 | if (startModule) {
|
6250 | loopModulesParser(startModule);
|
6251 | // Loop twice for routes with lazy loading
|
6252 | // loopModulesParser(routesTree);
|
6253 | }
|
6254 | var cleanedRoutesTree = undefined;
|
6255 | var cleanRoutesTree = function (route) {
|
6256 | for (var i in route.children) {
|
6257 | route.children[i].routes;
|
6258 | }
|
6259 | return route;
|
6260 | };
|
6261 | cleanedRoutesTree = cleanRoutesTree(routesTree);
|
6262 | // Try updating routes with lazy loading
|
6263 | var loopInsideModule = function (mod, _rawModule) {
|
6264 | if (mod.children) {
|
6265 | for (var z in mod.children) {
|
6266 | var route = _this.foundRouteWithModuleName(mod.children[z].name);
|
6267 | if (typeof route !== 'undefined') {
|
6268 | if (route.data) {
|
6269 | route.children = JSON5__namespace.parse(route.data);
|
6270 | delete route.data;
|
6271 | route.kind = 'module';
|
6272 | _rawModule.children.push(route);
|
6273 | }
|
6274 | }
|
6275 | }
|
6276 | }
|
6277 | else {
|
6278 | var route = _this.foundRouteWithModuleName(mod.name);
|
6279 | if (typeof route !== 'undefined') {
|
6280 | if (route.data) {
|
6281 | route.children = JSON5__namespace.parse(route.data);
|
6282 | delete route.data;
|
6283 | route.kind = 'module';
|
6284 | _rawModule.children.push(route);
|
6285 | }
|
6286 | }
|
6287 | }
|
6288 | };
|
6289 | var loopRoutesParser = function (route) {
|
6290 | if (route.children) {
|
6291 | for (var i in route.children) {
|
6292 | if (route.children[i].loadChildren) {
|
6293 | var child = _this.foundLazyModuleWithPath(route.children[i].loadChildren);
|
6294 | var module_1 = ___namespace.find(_this.cleanModulesTree, {
|
6295 | name: child
|
6296 | });
|
6297 | if (module_1) {
|
6298 | var _rawModule = {};
|
6299 | _rawModule.kind = 'module';
|
6300 | _rawModule.children = [];
|
6301 | _rawModule.module = module_1.name;
|
6302 | loopInsideModule(module_1, _rawModule);
|
6303 | route.children[i].children = [];
|
6304 | route.children[i].children.push(_rawModule);
|
6305 | }
|
6306 | }
|
6307 | loopRoutesParser(route.children[i]);
|
6308 | }
|
6309 | }
|
6310 | };
|
6311 | loopRoutesParser(cleanedRoutesTree);
|
6312 | return cleanedRoutesTree;
|
6313 | };
|
6314 | RouterParserUtil.prototype.constructModulesTree = function () {
|
6315 | var _this = this;
|
6316 | var getNestedChildren = function (arr, parent) {
|
6317 | var out = [];
|
6318 | for (var i in arr) {
|
6319 | if (arr[i].parent === parent) {
|
6320 | var children = getNestedChildren(arr, arr[i].name);
|
6321 | if (children.length) {
|
6322 | arr[i].children = children;
|
6323 | }
|
6324 | out.push(arr[i]);
|
6325 | }
|
6326 | }
|
6327 | return out;
|
6328 | };
|
6329 | // Scan each module and add parent property
|
6330 | ___namespace.forEach(this.modules, function (firstLoopModule) {
|
6331 | ___namespace.forEach(firstLoopModule.importsNode, function (importNode) {
|
6332 | ___namespace.forEach(_this.modules, function (module) {
|
6333 | if (module.name === importNode.name) {
|
6334 | module.parent = firstLoopModule.name;
|
6335 | }
|
6336 | });
|
6337 | });
|
6338 | });
|
6339 | this.modulesTree = getNestedChildren(this.modules);
|
6340 | };
|
6341 | RouterParserUtil.prototype.generateRoutesIndex = function (outputFolder, routes) {
|
6342 | return FileEngine$1.get(__dirname + '/../src/templates/partials/routes-index.hbs').then(function (data) {
|
6343 | var template = Handlebars__namespace.compile(data);
|
6344 | var result = template({
|
6345 | routes: JSON.stringify(routes)
|
6346 | });
|
6347 | var testOutputDir = outputFolder.match(process.cwd());
|
6348 | if (testOutputDir && testOutputDir.length > 0) {
|
6349 | outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
|
6350 | }
|
6351 | return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/routes/routes_index.js', result);
|
6352 | }, function (err) { return Promise.reject('Error during routes index generation'); });
|
6353 | };
|
6354 | RouterParserUtil.prototype.routesLength = function () {
|
6355 | var _n = 0;
|
6356 | var routesParser = function (route) {
|
6357 | if (typeof route.path !== 'undefined') {
|
6358 | _n += 1;
|
6359 | }
|
6360 | if (route.children) {
|
6361 | for (var j in route.children) {
|
6362 | routesParser(route.children[j]);
|
6363 | }
|
6364 | }
|
6365 | };
|
6366 | for (var i in this.routes) {
|
6367 | routesParser(this.routes[i]);
|
6368 | }
|
6369 | return _n;
|
6370 | };
|
6371 | RouterParserUtil.prototype.printRoutes = function () {
|
6372 | console.log('');
|
6373 | console.log('printRoutes: ');
|
6374 | console.log(this.routes);
|
6375 | };
|
6376 | RouterParserUtil.prototype.printModulesRoutes = function () {
|
6377 | console.log('');
|
6378 | console.log('printModulesRoutes: ');
|
6379 | console.log(this.modulesWithRoutes);
|
6380 | };
|
6381 | RouterParserUtil.prototype.isVariableRoutes = function (node) {
|
6382 | var result = false;
|
6383 | if (node.declarationList && node.declarationList.declarations) {
|
6384 | var i = 0;
|
6385 | var len = node.declarationList.declarations.length;
|
6386 | for (i; i < len; i++) {
|
6387 | if (node.declarationList.declarations[i].type) {
|
6388 | if (node.declarationList.declarations[i].type.typeName &&
|
6389 | node.declarationList.declarations[i].type.typeName.text === 'Routes') {
|
6390 | result = true;
|
6391 | }
|
6392 | }
|
6393 | }
|
6394 | }
|
6395 | return result;
|
6396 | };
|
6397 | RouterParserUtil.prototype.cleanFileIdentifiers = function (sourceFile) {
|
6398 | var e_1, _a, e_2, _b;
|
6399 | var _this = this;
|
6400 | var file = sourceFile;
|
6401 | var identifiers = file.getDescendantsOfKind(tsMorph.SyntaxKind.Identifier).filter(function (p) {
|
6402 | return (tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()) ||
|
6403 | tsMorph.Node.isPropertyAssignment(p.getParentOrThrow()));
|
6404 | });
|
6405 | var identifiersInRoutesVariableStatement = [];
|
6406 | var _loop_1 = function (identifier) {
|
6407 | // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
6408 | var foundParentVariableStatement = false;
|
6409 | identifier.getParentWhile(function (n) {
|
6410 | if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
|
6411 | if (_this.isVariableRoutes(n.compilerNode)) {
|
6412 | foundParentVariableStatement = true;
|
6413 | }
|
6414 | }
|
6415 | return true;
|
6416 | });
|
6417 | if (foundParentVariableStatement) {
|
6418 | identifiersInRoutesVariableStatement.push(identifier);
|
6419 | }
|
6420 | };
|
6421 | try {
|
6422 | for (var identifiers_1 = __values(identifiers), identifiers_1_1 = identifiers_1.next(); !identifiers_1_1.done; identifiers_1_1 = identifiers_1.next()) {
|
6423 | var identifier = identifiers_1_1.value;
|
6424 | _loop_1(identifier);
|
6425 | }
|
6426 | }
|
6427 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
6428 | finally {
|
6429 | try {
|
6430 | if (identifiers_1_1 && !identifiers_1_1.done && (_a = identifiers_1["return"])) _a.call(identifiers_1);
|
6431 | }
|
6432 | finally { if (e_1) throw e_1.error; }
|
6433 | }
|
6434 | try {
|
6435 | // inline the property access expressions
|
6436 | for (var identifiersInRoutesVariableStatement_1 = __values(identifiersInRoutesVariableStatement), identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next(); !identifiersInRoutesVariableStatement_1_1.done; identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next()) {
|
6437 | var identifier = identifiersInRoutesVariableStatement_1_1.value;
|
6438 | var identifierDeclaration = identifier
|
6439 | .getSymbolOrThrow()
|
6440 | .getValueDeclarationOrThrow();
|
6441 | if (!tsMorph.Node.isPropertyAssignment(identifierDeclaration) &&
|
6442 | tsMorph.Node.isVariableDeclaration(identifierDeclaration) &&
|
6443 | tsMorph.Node.isPropertyAssignment(identifierDeclaration) &&
|
6444 | !tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
|
6445 | throw new Error("Not implemented referenced declaration kind: " + identifierDeclaration.getKindName());
|
6446 | }
|
6447 | if (tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
|
6448 | identifier.replaceWithText(identifierDeclaration.getInitializerOrThrow().getText());
|
6449 | }
|
6450 | }
|
6451 | }
|
6452 | catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
6453 | finally {
|
6454 | try {
|
6455 | if (identifiersInRoutesVariableStatement_1_1 && !identifiersInRoutesVariableStatement_1_1.done && (_b = identifiersInRoutesVariableStatement_1["return"])) _b.call(identifiersInRoutesVariableStatement_1);
|
6456 | }
|
6457 | finally { if (e_2) throw e_2.error; }
|
6458 | }
|
6459 | return file;
|
6460 | };
|
6461 | RouterParserUtil.prototype.cleanFileSpreads = function (sourceFile) {
|
6462 | var e_3, _a, e_4, _b;
|
6463 | var _this = this;
|
6464 | var file = sourceFile;
|
6465 | var spreadElements = file
|
6466 | .getDescendantsOfKind(tsMorph.SyntaxKind.SpreadElement)
|
6467 | .filter(function (p) { return tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()); });
|
6468 | var spreadElementsInRoutesVariableStatement = [];
|
6469 | var _loop_2 = function (spreadElement) {
|
6470 | // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
6471 | var foundParentVariableStatement = false;
|
6472 | spreadElement.getParentWhile(function (n) {
|
6473 | if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
|
6474 | if (_this.isVariableRoutes(n.compilerNode)) {
|
6475 | foundParentVariableStatement = true;
|
6476 | }
|
6477 | }
|
6478 | return true;
|
6479 | });
|
6480 | if (foundParentVariableStatement) {
|
6481 | spreadElementsInRoutesVariableStatement.push(spreadElement);
|
6482 | }
|
6483 | };
|
6484 | try {
|
6485 | for (var spreadElements_1 = __values(spreadElements), spreadElements_1_1 = spreadElements_1.next(); !spreadElements_1_1.done; spreadElements_1_1 = spreadElements_1.next()) {
|
6486 | var spreadElement = spreadElements_1_1.value;
|
6487 | _loop_2(spreadElement);
|
6488 | }
|
6489 | }
|
6490 | catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
6491 | finally {
|
6492 | try {
|
6493 | if (spreadElements_1_1 && !spreadElements_1_1.done && (_a = spreadElements_1["return"])) _a.call(spreadElements_1);
|
6494 | }
|
6495 | finally { if (e_3) throw e_3.error; }
|
6496 | }
|
6497 | var _loop_3 = function (spreadElement) {
|
6498 | var spreadElementIdentifier = spreadElement.getExpression().getText(), searchedImport, aliasOriginalName = '', foundWithAliasInImports = false, foundWithAlias = false;
|
6499 | // Try to find it in imports
|
6500 | var imports = file.getImportDeclarations();
|
6501 | imports.forEach(function (i) {
|
6502 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
6503 | if (namedImportsLength > 0) {
|
6504 | for (j; j < namedImportsLength; j++) {
|
6505 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
6506 | if (namedImports[j].getAliasNode()) {
|
6507 | importAlias = namedImports[j].getAliasNode().getText();
|
6508 | }
|
6509 | if (importName === spreadElementIdentifier) {
|
6510 | foundWithAliasInImports = true;
|
6511 | searchedImport = i;
|
6512 | break;
|
6513 | }
|
6514 | if (importAlias === spreadElementIdentifier) {
|
6515 | foundWithAliasInImports = true;
|
6516 | foundWithAlias = true;
|
6517 | aliasOriginalName = importName;
|
6518 | searchedImport = i;
|
6519 | break;
|
6520 | }
|
6521 | }
|
6522 | }
|
6523 | });
|
6524 | var referencedDeclaration = void 0;
|
6525 | if (foundWithAliasInImports) {
|
6526 | if (typeof searchedImport !== 'undefined') {
|
6527 | var routePathIsBad = function (path) {
|
6528 | return typeof ast$1.getSourceFile(path) == 'undefined';
|
6529 | };
|
6530 | var getIndicesOf = function (searchStr, str, caseSensitive) {
|
6531 | var searchStrLen = searchStr.length;
|
6532 | if (searchStrLen == 0) {
|
6533 | return [];
|
6534 | }
|
6535 | var startIndex = 0, index, indices = [];
|
6536 | if (!caseSensitive) {
|
6537 | str = str.toLowerCase();
|
6538 | searchStr = searchStr.toLowerCase();
|
6539 | }
|
6540 | while ((index = str.indexOf(searchStr, startIndex)) > -1) {
|
6541 | indices.push(index);
|
6542 | startIndex = index + searchStrLen;
|
6543 | }
|
6544 | return indices;
|
6545 | };
|
6546 | var dirNamePath = path__namespace.dirname(file.getFilePath());
|
6547 | var searchedImportPath = searchedImport.getModuleSpecifierValue();
|
6548 | var leadingFilePath = searchedImportPath.split('/').shift();
|
6549 | var importPath = path__namespace.resolve(dirNamePath + '/' + searchedImport.getModuleSpecifierValue() + '.ts');
|
6550 | if (routePathIsBad(importPath)) {
|
6551 | var leadingIndices = getIndicesOf(leadingFilePath, importPath, true);
|
6552 | if (leadingIndices.length > 1) {
|
6553 | // Nested route fixes
|
6554 | var startIndex = leadingIndices[0];
|
6555 | var endIndex = leadingIndices[leadingIndices.length - 1];
|
6556 | importPath =
|
6557 | importPath.slice(0, startIndex) + importPath.slice(endIndex);
|
6558 | }
|
6559 | else {
|
6560 | // Top level route fixes
|
6561 | importPath =
|
6562 | path__namespace.dirname(dirNamePath) + '/' + searchedImportPath + '.ts';
|
6563 | }
|
6564 | }
|
6565 | var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
|
6566 | ? ast$1.getSourceFile(importPath)
|
6567 | : ast$1.addSourceFileAtPath(importPath);
|
6568 | if (sourceFileImport) {
|
6569 | var variableName = foundWithAlias
|
6570 | ? aliasOriginalName
|
6571 | : spreadElementIdentifier;
|
6572 | referencedDeclaration =
|
6573 | sourceFileImport.getVariableDeclaration(variableName);
|
6574 | }
|
6575 | }
|
6576 | }
|
6577 | else {
|
6578 | // if not, try directly in file
|
6579 | referencedDeclaration = spreadElement
|
6580 | .getExpression()
|
6581 | .getSymbolOrThrow()
|
6582 | .getValueDeclarationOrThrow();
|
6583 | }
|
6584 | if (!tsMorph.Node.isVariableDeclaration(referencedDeclaration)) {
|
6585 | throw new Error("Not implemented referenced declaration kind: " + referencedDeclaration.getKindName());
|
6586 | }
|
6587 | var referencedArray = referencedDeclaration.getInitializerIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
|
6588 | var spreadElementArray = spreadElement.getParentIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
|
6589 | var insertIndex = spreadElementArray.getElements().indexOf(spreadElement);
|
6590 | spreadElementArray.removeElement(spreadElement);
|
6591 | spreadElementArray.insertElements(insertIndex, referencedArray.getElements().map(function (e) { return e.getText(); }));
|
6592 | };
|
6593 | try {
|
6594 | // inline the ArrayLiteralExpression SpreadElements
|
6595 | for (var spreadElementsInRoutesVariableStatement_1 = __values(spreadElementsInRoutesVariableStatement), spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next(); !spreadElementsInRoutesVariableStatement_1_1.done; spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next()) {
|
6596 | var spreadElement = spreadElementsInRoutesVariableStatement_1_1.value;
|
6597 | _loop_3(spreadElement);
|
6598 | }
|
6599 | }
|
6600 | catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
6601 | finally {
|
6602 | try {
|
6603 | if (spreadElementsInRoutesVariableStatement_1_1 && !spreadElementsInRoutesVariableStatement_1_1.done && (_b = spreadElementsInRoutesVariableStatement_1["return"])) _b.call(spreadElementsInRoutesVariableStatement_1);
|
6604 | }
|
6605 | finally { if (e_4) throw e_4.error; }
|
6606 | }
|
6607 | return file;
|
6608 | };
|
6609 | RouterParserUtil.prototype.cleanFileDynamics = function (sourceFile) {
|
6610 | var e_5, _a, e_6, _b;
|
6611 | var _this = this;
|
6612 | var file = sourceFile;
|
6613 | var propertyAccessExpressions = file
|
6614 | .getDescendantsOfKind(tsMorph.SyntaxKind.PropertyAccessExpression)
|
6615 | .filter(function (p) { return !tsMorph.Node.isPropertyAccessExpression(p.getParentOrThrow()); });
|
6616 | var propertyAccessExpressionsInRoutesVariableStatement = [];
|
6617 | var _loop_4 = function (propertyAccessExpression) {
|
6618 | // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
6619 | var foundParentVariableStatement = false;
|
6620 | propertyAccessExpression.getParentWhile(function (n) {
|
6621 | if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
|
6622 | if (_this.isVariableRoutes(n.compilerNode)) {
|
6623 | foundParentVariableStatement = true;
|
6624 | }
|
6625 | }
|
6626 | return true;
|
6627 | });
|
6628 | if (foundParentVariableStatement) {
|
6629 | propertyAccessExpressionsInRoutesVariableStatement.push(propertyAccessExpression);
|
6630 | }
|
6631 | };
|
6632 | try {
|
6633 | for (var propertyAccessExpressions_1 = __values(propertyAccessExpressions), propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next(); !propertyAccessExpressions_1_1.done; propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next()) {
|
6634 | var propertyAccessExpression = propertyAccessExpressions_1_1.value;
|
6635 | _loop_4(propertyAccessExpression);
|
6636 | }
|
6637 | }
|
6638 | catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
6639 | finally {
|
6640 | try {
|
6641 | if (propertyAccessExpressions_1_1 && !propertyAccessExpressions_1_1.done && (_a = propertyAccessExpressions_1["return"])) _a.call(propertyAccessExpressions_1);
|
6642 | }
|
6643 | finally { if (e_5) throw e_5.error; }
|
6644 | }
|
6645 | try {
|
6646 | // inline the property access expressions
|
6647 | for (var propertyAccessExpressionsInRoutesVariableStatement_1 = __values(propertyAccessExpressionsInRoutesVariableStatement), propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next(); !propertyAccessExpressionsInRoutesVariableStatement_1_1.done; propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next()) {
|
6648 | var propertyAccessExpression = propertyAccessExpressionsInRoutesVariableStatement_1_1.value;
|
6649 | var propertyAccessExpressionNodeName = propertyAccessExpression.getNameNode();
|
6650 | if (propertyAccessExpressionNodeName) {
|
6651 | try {
|
6652 | var propertyAccessExpressionNodeNameSymbol = propertyAccessExpressionNodeName.getSymbolOrThrow();
|
6653 | if (propertyAccessExpressionNodeNameSymbol) {
|
6654 | var referencedDeclaration = propertyAccessExpressionNodeNameSymbol.getValueDeclarationOrThrow();
|
6655 | if (!tsMorph.Node.isPropertyAssignment(referencedDeclaration) &&
|
6656 | tsMorph.Node.isEnumMember(referencedDeclaration) &&
|
6657 | tsMorph.Node.isPropertyAssignment(referencedDeclaration) &&
|
6658 | !tsMorph.Node.isEnumMember(referencedDeclaration)) {
|
6659 | throw new Error("Not implemented referenced declaration kind: " + referencedDeclaration.getKindName());
|
6660 | }
|
6661 | if (typeof referencedDeclaration.getInitializerOrThrow !== 'undefined') {
|
6662 | propertyAccessExpression.replaceWithText(referencedDeclaration.getInitializerOrThrow().getText());
|
6663 | }
|
6664 | }
|
6665 | }
|
6666 | catch (e) { }
|
6667 | }
|
6668 | }
|
6669 | }
|
6670 | catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
6671 | finally {
|
6672 | try {
|
6673 | if (propertyAccessExpressionsInRoutesVariableStatement_1_1 && !propertyAccessExpressionsInRoutesVariableStatement_1_1.done && (_b = propertyAccessExpressionsInRoutesVariableStatement_1["return"])) _b.call(propertyAccessExpressionsInRoutesVariableStatement_1);
|
6674 | }
|
6675 | finally { if (e_6) throw e_6.error; }
|
6676 | }
|
6677 | return file;
|
6678 | };
|
6679 | /**
|
6680 | * replace callexpressions with string : utils.doWork() -> 'utils.doWork()' doWork() -> 'doWork()'
|
6681 | * @param sourceFile ts.SourceFile
|
6682 | */
|
6683 | RouterParserUtil.prototype.cleanCallExpressions = function (sourceFile) {
|
6684 | var e_7, _a;
|
6685 | var file = sourceFile;
|
6686 | var variableStatements = sourceFile.getVariableDeclaration(function (v) {
|
6687 | var result = false;
|
6688 | var type = v.compilerNode.type;
|
6689 | if (typeof type !== 'undefined' && typeof type.typeName !== 'undefined') {
|
6690 | result = type.typeName.text === 'Routes';
|
6691 | }
|
6692 | return result;
|
6693 | });
|
6694 | var initializer = variableStatements.getInitializer();
|
6695 | var _loop_5 = function (callExpr) {
|
6696 | if (callExpr.wasForgotten()) {
|
6697 | return "continue";
|
6698 | }
|
6699 | callExpr.replaceWithText(function (writer) { return writer.quote(callExpr.getText()); });
|
6700 | };
|
6701 | try {
|
6702 | for (var _b = __values(initializer.getDescendantsOfKind(tsMorph.SyntaxKind.CallExpression)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
6703 | var callExpr = _c.value;
|
6704 | _loop_5(callExpr);
|
6705 | }
|
6706 | }
|
6707 | catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
6708 | finally {
|
6709 | try {
|
6710 | if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
|
6711 | }
|
6712 | finally { if (e_7) throw e_7.error; }
|
6713 | }
|
6714 | return file;
|
6715 | };
|
6716 | /**
|
6717 | * Clean routes definition with imported data, for example path, children, or dynamic stuff inside data
|
6718 | *
|
6719 | * const MY_ROUTES: Routes = [
|
6720 | * {
|
6721 | * path: 'home',
|
6722 | * component: HomeComponent
|
6723 | * },
|
6724 | * {
|
6725 | * path: PATHS.home,
|
6726 | * component: HomeComponent
|
6727 | * }
|
6728 | * ];
|
6729 | *
|
6730 | * The initializer is an array (ArrayLiteralExpression - 177 ), it has elements, objects (ObjectLiteralExpression - 178)
|
6731 | * with properties (PropertyAssignment - 261)
|
6732 | *
|
6733 | * For each know property (https://angular.io/api/router/Routes#description), we try to see if we have what we want
|
6734 | *
|
6735 | * Ex: path and pathMatch want a string, component a component reference.
|
6736 | *
|
6737 | * It is an imperative approach, not a generic way, parsing all the tree
|
6738 | * and find something like this which willl break JSON.stringify : MYIMPORT.path
|
6739 | *
|
6740 | * @param {ts.Node} initializer The node of routes definition
|
6741 | * @return {ts.Node} The edited node
|
6742 | */
|
6743 | RouterParserUtil.prototype.cleanRoutesDefinitionWithImport = function (initializer, node, sourceFile) {
|
6744 | initializer.elements.forEach(function (element) {
|
6745 | element.properties.forEach(function (property) {
|
6746 | var propertyName = property.name.getText(), propertyInitializer = property.initializer;
|
6747 | switch (propertyName) {
|
6748 | case 'path':
|
6749 | case 'redirectTo':
|
6750 | case 'outlet':
|
6751 | case 'pathMatch':
|
6752 | if (propertyInitializer) {
|
6753 | if (propertyInitializer.kind !== tsMorph.SyntaxKind.StringLiteral) {
|
6754 | // Identifier(71) won't break parsing, but it will be better to retrive them
|
6755 | // PropertyAccessExpression(179) ex: MYIMPORT.path will break it, find it in import
|
6756 | if (propertyInitializer.kind === tsMorph.SyntaxKind.PropertyAccessExpression) {
|
6757 | var lastObjectLiteralAttributeName = propertyInitializer.name.getText(), firstObjectLiteralAttributeName = void 0;
|
6758 | if (propertyInitializer.expression) {
|
6759 | firstObjectLiteralAttributeName =
|
6760 | propertyInitializer.expression.getText();
|
6761 | var result = ImportsUtil$1.findPropertyValueInImportOrLocalVariables(firstObjectLiteralAttributeName +
|
6762 | '.' +
|
6763 | lastObjectLiteralAttributeName, sourceFile); // tslint:disable-line
|
6764 | if (result !== '') {
|
6765 | propertyInitializer.kind = 9;
|
6766 | propertyInitializer.text = result;
|
6767 | }
|
6768 | }
|
6769 | }
|
6770 | }
|
6771 | }
|
6772 | break;
|
6773 | }
|
6774 | });
|
6775 | });
|
6776 | return initializer;
|
6777 | };
|
6778 | return RouterParserUtil;
|
6779 | }());
|
6780 | var RouterParserUtil$1 = RouterParserUtil.getInstance();
|
6781 |
|
6782 | function isModuleWithProviders(node) {
|
6783 | var result = false;
|
6784 | if (node.declarationList) {
|
6785 | if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
|
6786 | var i = 0; node.declarationList.declarations; var len = node.declarationList.declarations.length;
|
6787 | for (i; i < len; i++) {
|
6788 | var declaration = node.declarationList.declarations[i];
|
6789 | if (declaration.type) {
|
6790 | var type = declaration.type;
|
6791 | if (type.typeName) {
|
6792 | var text = type.typeName.getText();
|
6793 | if (text === 'ModuleWithProviders') {
|
6794 | result = true;
|
6795 | }
|
6796 | }
|
6797 | }
|
6798 | }
|
6799 | }
|
6800 | }
|
6801 | return result;
|
6802 | }
|
6803 |
|
6804 | function getModuleWithProviders(node) {
|
6805 | var result;
|
6806 | if (node.declarationList) {
|
6807 | if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
|
6808 | var i = 0, len = node.declarationList.declarations.length;
|
6809 | for (i; i < len; i++) {
|
6810 | var declaration = node.declarationList.declarations[i];
|
6811 | if (declaration.type) {
|
6812 | var type = declaration.type;
|
6813 | if (type.typeName) {
|
6814 | var text = type.typeName.getText();
|
6815 | if (text === 'ModuleWithProviders') {
|
6816 | result = declaration.initializer;
|
6817 | }
|
6818 | }
|
6819 | }
|
6820 | }
|
6821 | }
|
6822 | }
|
6823 | return result;
|
6824 | }
|
6825 |
|
6826 | function StringifyArrowFunction(af) {
|
6827 | var i = 0, result = '(';
|
6828 | var len = af.parameters.length;
|
6829 | if (len === 1) {
|
6830 | result = '';
|
6831 | }
|
6832 | for (i; i < len; i++) {
|
6833 | if (af.parameters[i].name && af.parameters[i].name.escapedText) {
|
6834 | result += af.parameters[i].name.escapedText;
|
6835 | }
|
6836 | if (i < len - 1) {
|
6837 | result += ', ';
|
6838 | }
|
6839 | }
|
6840 | if (len > 1 || len === 0) {
|
6841 | result += ')';
|
6842 | }
|
6843 | // body
|
6844 | result += ' => ';
|
6845 | if (af.body) {
|
6846 | if (af.body.kind === tsMorph.SyntaxKind.Identifier && af.body.escapedText) {
|
6847 | result += af.body.escapedText;
|
6848 | }
|
6849 | else if (af.body.kind === tsMorph.SyntaxKind.PropertyAccessExpression &&
|
6850 | af.body.expression &&
|
6851 | af.body.name) {
|
6852 | result += af.body.expression.escapedText;
|
6853 | result += '.' + af.body.name.escapedText;
|
6854 | }
|
6855 | else if (af.body.kind === tsMorph.SyntaxKind.StringLiteral && af.body.text) {
|
6856 | result += af.body.text;
|
6857 | }
|
6858 | }
|
6859 | return result;
|
6860 | }
|
6861 |
|
6862 | function StringifyObjectLiteralExpression(ole) {
|
6863 | var returnedString = '{';
|
6864 | if (ole.properties && ole.properties.length > 0) {
|
6865 | ole.properties.forEach(function (property, index) {
|
6866 | if (property.name) {
|
6867 | returnedString += property.name.text + ': ';
|
6868 | }
|
6869 | if (property.initializer) {
|
6870 | if (property.initializer.kind === tsMorph.SyntaxKind.StringLiteral) {
|
6871 | returnedString += "'" + property.initializer.text + "'";
|
6872 | }
|
6873 | else if (property.initializer.kind === tsMorph.SyntaxKind.TrueKeyword) {
|
6874 | returnedString += "true";
|
6875 | }
|
6876 | else if (property.initializer.kind === tsMorph.SyntaxKind.FalseKeyword) {
|
6877 | returnedString += "false";
|
6878 | }
|
6879 | else if (property.initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
|
6880 | returnedString += StringifyArrowFunction(property.initializer);
|
6881 | }
|
6882 | else {
|
6883 | returnedString += property.initializer.text;
|
6884 | }
|
6885 | }
|
6886 | if (index < ole.properties.length - 1) {
|
6887 | returnedString += ', ';
|
6888 | }
|
6889 | });
|
6890 | }
|
6891 | returnedString += '}';
|
6892 | return returnedString;
|
6893 | }
|
6894 |
|
6895 | var crypto$7 = require('crypto');
|
6896 | var marked$2 = require('marked').marked;
|
6897 | var ClassHelper = /** @class */ (function () {
|
6898 | function ClassHelper(typeChecker) {
|
6899 | this.typeChecker = typeChecker;
|
6900 | this.jsdocParserUtil = new JsdocParserUtil();
|
6901 | }
|
6902 | /**
|
6903 | * HELPERS
|
6904 | */
|
6905 | ClassHelper.prototype.stringifyDefaultValue = function (node) {
|
6906 | /**
|
6907 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
6908 | */
|
6909 | if (node.getText()) {
|
6910 | return node.getText();
|
6911 | }
|
6912 | else if (node.kind === tsMorph.SyntaxKind.FalseKeyword) {
|
6913 | return 'false';
|
6914 | }
|
6915 | else if (node.kind === tsMorph.SyntaxKind.TrueKeyword) {
|
6916 | return 'true';
|
6917 | }
|
6918 | };
|
6919 | ClassHelper.prototype.checkForDeprecation = function (tags, result) {
|
6920 | ___namespace.forEach(tags, function (tag) {
|
6921 | if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
|
6922 | result.deprecated = true;
|
6923 | result.deprecationMessage = tag.comment || '';
|
6924 | }
|
6925 | });
|
6926 | };
|
6927 | ClassHelper.prototype.getDecoratorOfType = function (node, decoratorType) {
|
6928 | var decorators = node.decorators || [];
|
6929 | var result = [];
|
6930 | var len = decorators.length;
|
6931 | if (len > 1) {
|
6932 | for (var i = 0; i < decorators.length; i++) {
|
6933 | if (decorators[i].expression.expression) {
|
6934 | if (decorators[i].expression.expression.text === decoratorType) {
|
6935 | result.push(decorators[i]);
|
6936 | }
|
6937 | }
|
6938 | }
|
6939 | if (result.length > 0) {
|
6940 | return result;
|
6941 | }
|
6942 | }
|
6943 | else {
|
6944 | if (len === 1 && decorators[0].expression && decorators[0].expression.expression) {
|
6945 | if (decorators[0].expression.expression.text === decoratorType) {
|
6946 | result.push(decorators[0]);
|
6947 | return result;
|
6948 | }
|
6949 | }
|
6950 | }
|
6951 | return undefined;
|
6952 | };
|
6953 | ClassHelper.prototype.formatDecorators = function (decorators) {
|
6954 | var _this = this;
|
6955 | var _decorators = [];
|
6956 | ___namespace.forEach(decorators, function (decorator) {
|
6957 | if (decorator.expression) {
|
6958 | if (decorator.expression.text) {
|
6959 | _decorators.push({ name: decorator.expression.text });
|
6960 | }
|
6961 | if (decorator.expression.expression) {
|
6962 | var info = { name: decorator.expression.expression.text };
|
6963 | if (decorator.expression.arguments) {
|
6964 | info.stringifiedArguments = _this.stringifyArguments(decorator.expression.arguments);
|
6965 | }
|
6966 | _decorators.push(info);
|
6967 | }
|
6968 | }
|
6969 | });
|
6970 | return _decorators;
|
6971 | };
|
6972 | ClassHelper.prototype.handleFunction = function (arg) {
|
6973 | var _this = this;
|
6974 | if (arg["function"].length === 0) {
|
6975 | return "" + arg.name + this.getOptionalString(arg) + ": () => void";
|
6976 | }
|
6977 | var argums = arg["function"].map(function (argu) {
|
6978 | var _result = DependenciesEngine$1.find(argu.type);
|
6979 | if (_result) {
|
6980 | if (_result.source === 'internal') {
|
6981 | var path = _result.data.type;
|
6982 | if (_result.data.type === 'class') {
|
6983 | path = 'classe';
|
6984 | }
|
6985 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"../" + path + "s/" + _result.data.name + ".html\">" + argu.type + "</a>";
|
6986 | }
|
6987 | else {
|
6988 | var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
6989 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + argu.type + "</a>";
|
6990 | }
|
6991 | }
|
6992 | else if (BasicTypeUtil$1.isKnownType(argu.type)) {
|
6993 | var path = BasicTypeUtil$1.getTypeUrl(argu.type);
|
6994 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + argu.type + "</a>";
|
6995 | }
|
6996 | else {
|
6997 | if (argu.name && argu.type) {
|
6998 | return "" + argu.name + _this.getOptionalString(arg) + ": " + argu.type;
|
6999 | }
|
7000 | else {
|
7001 | if (argu.name) {
|
7002 | return "" + argu.name.text;
|
7003 | }
|
7004 | else {
|
7005 | return '';
|
7006 | }
|
7007 | }
|
7008 | }
|
7009 | });
|
7010 | return "" + arg.name + this.getOptionalString(arg) + ": (" + argums + ") => void";
|
7011 | };
|
7012 | ClassHelper.prototype.getOptionalString = function (arg) {
|
7013 | return arg.optional ? '?' : '';
|
7014 | };
|
7015 | ClassHelper.prototype.stringifyArguments = function (args) {
|
7016 | var _this = this;
|
7017 | var stringifyArgs = [];
|
7018 | stringifyArgs = args
|
7019 | .map(function (arg) {
|
7020 | var _result = DependenciesEngine$1.find(arg.type);
|
7021 | if (_result) {
|
7022 | if (_result.source === 'internal') {
|
7023 | var path = _result.data.type;
|
7024 | if (_result.data.type === 'class') {
|
7025 | path = 'classe';
|
7026 | }
|
7027 | return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"../" + path + "s/" + _result.data.name + ".html\">" + arg.type + "</a>";
|
7028 | }
|
7029 | else {
|
7030 | var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
7031 | return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + arg.type + "</a>";
|
7032 | }
|
7033 | }
|
7034 | else if (arg.dotDotDotToken) {
|
7035 | return "..." + arg.name + ": " + arg.type;
|
7036 | }
|
7037 | else if (arg["function"]) {
|
7038 | return _this.handleFunction(arg);
|
7039 | }
|
7040 | else if (arg.expression && arg.name) {
|
7041 | return arg.expression.text + '.' + arg.name.text;
|
7042 | }
|
7043 | else if (arg.expression && arg.kind === tsMorph.SyntaxKind.NewExpression) {
|
7044 | return 'new ' + arg.expression.text + '()';
|
7045 | }
|
7046 | else if (arg.kind && arg.kind === tsMorph.SyntaxKind.StringLiteral) {
|
7047 | return "'" + arg.text + "'";
|
7048 | }
|
7049 | else if (arg.kind &&
|
7050 | arg.kind === tsMorph.SyntaxKind.ArrayLiteralExpression &&
|
7051 | arg.elements &&
|
7052 | arg.elements.length > 0) {
|
7053 | var i = 0, len = arg.elements.length, result = '[';
|
7054 | for (i; i < len; i++) {
|
7055 | result += "'" + arg.elements[i].text + "'";
|
7056 | if (i < len - 1) {
|
7057 | result += ', ';
|
7058 | }
|
7059 | }
|
7060 | result += ']';
|
7061 | return result;
|
7062 | }
|
7063 | else if (arg.kind &&
|
7064 | arg.kind === tsMorph.SyntaxKind.ArrowFunction &&
|
7065 | arg.parameters &&
|
7066 | arg.parameters.length > 0) {
|
7067 | return StringifyArrowFunction(arg);
|
7068 | }
|
7069 | else if (arg.kind && arg.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
7070 | return StringifyObjectLiteralExpression(arg);
|
7071 | }
|
7072 | else if (BasicTypeUtil$1.isKnownType(arg.type)) {
|
7073 | var path = BasicTypeUtil$1.getTypeUrl(arg.type);
|
7074 | return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path + "\" target=\"_blank\">" + arg.type + "</a>";
|
7075 | }
|
7076 | else {
|
7077 | if (arg.type) {
|
7078 | var finalStringifiedArgument = '';
|
7079 | var separator = ':';
|
7080 | if (arg.name) {
|
7081 | finalStringifiedArgument += arg.name;
|
7082 | }
|
7083 | if (arg.kind === tsMorph.SyntaxKind.AsExpression &&
|
7084 | arg.expression &&
|
7085 | arg.expression.text) {
|
7086 | finalStringifiedArgument += arg.expression.text;
|
7087 | separator = ' as';
|
7088 | }
|
7089 | if (arg.optional) {
|
7090 | finalStringifiedArgument += _this.getOptionalString(arg);
|
7091 | }
|
7092 | if (arg.type) {
|
7093 | finalStringifiedArgument += separator + ' ' + _this.visitType(arg.type);
|
7094 | }
|
7095 | return finalStringifiedArgument;
|
7096 | }
|
7097 | else if (arg.text) {
|
7098 | return "" + arg.text;
|
7099 | }
|
7100 | else {
|
7101 | return "" + arg.name + _this.getOptionalString(arg);
|
7102 | }
|
7103 | }
|
7104 | })
|
7105 | .join(', ');
|
7106 | return stringifyArgs;
|
7107 | };
|
7108 | ClassHelper.prototype.getPosition = function (node, sourceFile) {
|
7109 | var position;
|
7110 | if (node.name && node.name.end) {
|
7111 | position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.name.end);
|
7112 | }
|
7113 | else {
|
7114 | position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.pos);
|
7115 | }
|
7116 | return position;
|
7117 | };
|
7118 | ClassHelper.prototype.addAccessor = function (accessors, nodeAccessor, sourceFile) {
|
7119 | var _this = this;
|
7120 | var nodeName = '';
|
7121 | if (nodeAccessor.name) {
|
7122 | nodeName = nodeAccessor.name.text;
|
7123 | var jsdoctags = this.jsdocParserUtil.getJSDocs(nodeAccessor);
|
7124 | if (!accessors[nodeName]) {
|
7125 | accessors[nodeName] = {
|
7126 | name: nodeName,
|
7127 | setSignature: undefined,
|
7128 | getSignature: undefined
|
7129 | };
|
7130 | }
|
7131 | if (nodeAccessor.kind === tsMorph.SyntaxKind.SetAccessor) {
|
7132 | var setSignature = {
|
7133 | name: nodeName,
|
7134 | type: 'void',
|
7135 | deprecated: false,
|
7136 | deprecationMessage: '',
|
7137 | args: nodeAccessor.parameters.map(function (param) { return _this.visitArgument(param); }),
|
7138 | returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : 'void',
|
7139 | line: this.getPosition(nodeAccessor, sourceFile).line + 1
|
7140 | };
|
7141 | if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
|
7142 | var comment = this.jsdocParserUtil.getMainCommentOfNode(nodeAccessor, sourceFile);
|
7143 | if (typeof comment !== 'undefined') {
|
7144 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
7145 | setSignature.rawdescription = cleanedDescription;
|
7146 | setSignature.description = marked$2(cleanedDescription);
|
7147 | }
|
7148 | }
|
7149 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
7150 | this.checkForDeprecation(jsdoctags[0].tags, setSignature);
|
7151 | setSignature.jsdoctags = markedtags(jsdoctags[0].tags);
|
7152 | }
|
7153 | if (setSignature.jsdoctags && setSignature.jsdoctags.length > 0) {
|
7154 | setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args, setSignature.jsdoctags);
|
7155 | }
|
7156 | else if (setSignature.args && setSignature.args.length > 0) {
|
7157 | setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args);
|
7158 | }
|
7159 | accessors[nodeName].setSignature = setSignature;
|
7160 | }
|
7161 | if (nodeAccessor.kind === tsMorph.SyntaxKind.GetAccessor) {
|
7162 | var getSignature = {
|
7163 | name: nodeName,
|
7164 | type: nodeAccessor.type ? kindToType(nodeAccessor.type.kind) : '',
|
7165 | returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : '',
|
7166 | line: this.getPosition(nodeAccessor, sourceFile).line + 1
|
7167 | };
|
7168 | if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
|
7169 | var comment = this.jsdocParserUtil.getMainCommentOfNode(nodeAccessor, sourceFile);
|
7170 | if (typeof comment !== 'undefined') {
|
7171 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
7172 | getSignature.rawdescription = cleanedDescription;
|
7173 | getSignature.description = marked$2(cleanedDescription);
|
7174 | }
|
7175 | }
|
7176 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
7177 | this.checkForDeprecation(jsdoctags[0].tags, getSignature);
|
7178 | getSignature.jsdoctags = markedtags(jsdoctags[0].tags);
|
7179 | }
|
7180 | accessors[nodeName].getSignature = getSignature;
|
7181 | }
|
7182 | }
|
7183 | };
|
7184 | ClassHelper.prototype.isDirectiveDecorator = function (decorator) {
|
7185 | if (decorator.expression.expression) {
|
7186 | var decoratorIdentifierText = decorator.expression.expression.text;
|
7187 | return (decoratorIdentifierText === 'Directive' || decoratorIdentifierText === 'Component');
|
7188 | }
|
7189 | else {
|
7190 | return false;
|
7191 | }
|
7192 | };
|
7193 | ClassHelper.prototype.isServiceDecorator = function (decorator) {
|
7194 | return decorator.expression.expression
|
7195 | ? decorator.expression.expression.text === 'Injectable'
|
7196 | : false;
|
7197 | };
|
7198 | ClassHelper.prototype.isPrivate = function (member) {
|
7199 | /**
|
7200 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
7201 | */
|
7202 | if (member.modifiers) {
|
7203 | var isPrivate = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PrivateKeyword; });
|
7204 | if (isPrivate) {
|
7205 | return true;
|
7206 | }
|
7207 | }
|
7208 | // Check for ECMAScript Private Fields
|
7209 | if (member.name && member.name.escapedText) {
|
7210 | var isPrivate = member.name.escapedText.indexOf('#') === 0;
|
7211 | if (isPrivate) {
|
7212 | return true;
|
7213 | }
|
7214 | }
|
7215 | return this.isHiddenMember(member);
|
7216 | };
|
7217 | ClassHelper.prototype.isProtected = function (member) {
|
7218 | if (member.modifiers) {
|
7219 | var isProtected = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.ProtectedKeyword; });
|
7220 | if (isProtected) {
|
7221 | return true;
|
7222 | }
|
7223 | }
|
7224 | return this.isHiddenMember(member);
|
7225 | };
|
7226 | ClassHelper.prototype.isInternal = function (member) {
|
7227 | var e_1, _a, e_2, _b;
|
7228 | /**
|
7229 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
7230 | */
|
7231 | var internalTags = ['internal'];
|
7232 | if (member.jsDoc) {
|
7233 | try {
|
7234 | for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
|
7235 | var doc = _d.value;
|
7236 | if (doc.tags) {
|
7237 | try {
|
7238 | for (var _e = (e_2 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
7239 | var tag = _f.value;
|
7240 | if (internalTags.indexOf(tag.tagName.text) > -1) {
|
7241 | return true;
|
7242 | }
|
7243 | }
|
7244 | }
|
7245 | catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
7246 | finally {
|
7247 | try {
|
7248 | if (_f && !_f.done && (_b = _e["return"])) _b.call(_e);
|
7249 | }
|
7250 | finally { if (e_2) throw e_2.error; }
|
7251 | }
|
7252 | }
|
7253 | }
|
7254 | }
|
7255 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
7256 | finally {
|
7257 | try {
|
7258 | if (_d && !_d.done && (_a = _c["return"])) _a.call(_c);
|
7259 | }
|
7260 | finally { if (e_1) throw e_1.error; }
|
7261 | }
|
7262 | }
|
7263 | return false;
|
7264 | };
|
7265 | ClassHelper.prototype.isPublic = function (member) {
|
7266 | if (member.modifiers) {
|
7267 | var isPublic = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PublicKeyword; });
|
7268 | if (isPublic) {
|
7269 | return true;
|
7270 | }
|
7271 | }
|
7272 | return this.isHiddenMember(member);
|
7273 | };
|
7274 | ClassHelper.prototype.isHiddenMember = function (member) {
|
7275 | var e_3, _a, e_4, _b;
|
7276 | /**
|
7277 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
7278 | */
|
7279 | var internalTags = ['hidden'];
|
7280 | if (member.jsDoc) {
|
7281 | try {
|
7282 | for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
|
7283 | var doc = _d.value;
|
7284 | if (doc.tags) {
|
7285 | try {
|
7286 | for (var _e = (e_4 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
7287 | var tag = _f.value;
|
7288 | if (internalTags.indexOf(tag.tagName.text) > -1) {
|
7289 | return true;
|
7290 | }
|
7291 | }
|
7292 | }
|
7293 | catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
7294 | finally {
|
7295 | try {
|
7296 | if (_f && !_f.done && (_b = _e["return"])) _b.call(_e);
|
7297 | }
|
7298 | finally { if (e_4) throw e_4.error; }
|
7299 | }
|
7300 | }
|
7301 | }
|
7302 | }
|
7303 | catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
7304 | finally {
|
7305 | try {
|
7306 | if (_d && !_d.done && (_a = _c["return"])) _a.call(_c);
|
7307 | }
|
7308 | finally { if (e_3) throw e_3.error; }
|
7309 | }
|
7310 | }
|
7311 | return false;
|
7312 | };
|
7313 | ClassHelper.prototype.isPipeDecorator = function (decorator) {
|
7314 | return decorator.expression.expression
|
7315 | ? decorator.expression.expression.text === 'Pipe'
|
7316 | : false;
|
7317 | };
|
7318 | ClassHelper.prototype.isControllerDecorator = function (decorator) {
|
7319 | return decorator.expression.expression
|
7320 | ? decorator.expression.expression.text === 'Controller'
|
7321 | : false;
|
7322 | };
|
7323 | ClassHelper.prototype.isModuleDecorator = function (decorator) {
|
7324 | return decorator.expression.expression
|
7325 | ? decorator.expression.expression.text === 'NgModule' ||
|
7326 | decorator.expression.expression.text === 'Module'
|
7327 | : false;
|
7328 | };
|
7329 | /**
|
7330 | * VISITERS
|
7331 | */
|
7332 | ClassHelper.prototype.visitClassDeclaration = function (fileName, classDeclaration, sourceFile) {
|
7333 | var symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
|
7334 | var rawdescription = '';
|
7335 | var deprecated = false;
|
7336 | var deprecationMessage = '';
|
7337 | var description = '';
|
7338 | var jsdoctags = [];
|
7339 | if (symbol) {
|
7340 | var comment = this.jsdocParserUtil.getMainCommentOfNode(classDeclaration, sourceFile);
|
7341 | rawdescription = this.jsdocParserUtil.parseComment(comment);
|
7342 | description = marked$2(rawdescription);
|
7343 | if (symbol.valueDeclaration && isIgnore(symbol.valueDeclaration)) {
|
7344 | return [{ ignore: true }];
|
7345 | }
|
7346 | if (symbol.declarations && symbol.declarations.length > 0) {
|
7347 | var declarationsjsdoctags = this.jsdocParserUtil.getJSDocs(symbol.declarations[0]);
|
7348 | if (declarationsjsdoctags &&
|
7349 | declarationsjsdoctags.length >= 1 &&
|
7350 | declarationsjsdoctags[0].tags) {
|
7351 | var deprecation = { deprecated: false, deprecationMessage: '' };
|
7352 | this.checkForDeprecation(declarationsjsdoctags[0].tags, deprecation);
|
7353 | deprecated = deprecation.deprecated;
|
7354 | deprecationMessage = deprecation.deprecationMessage;
|
7355 | }
|
7356 | if (isIgnore(symbol.declarations[0])) {
|
7357 | return [{ ignore: true }];
|
7358 | }
|
7359 | }
|
7360 | if (symbol.valueDeclaration) {
|
7361 | jsdoctags = this.jsdocParserUtil.getJSDocs(symbol.valueDeclaration);
|
7362 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
7363 | var deprecation = { deprecated: false, deprecationMessage: '' };
|
7364 | this.checkForDeprecation(jsdoctags[0].tags, deprecation);
|
7365 | deprecated = deprecation.deprecated;
|
7366 | deprecationMessage = deprecation.deprecationMessage;
|
7367 | jsdoctags = markedtags(jsdoctags[0].tags);
|
7368 | }
|
7369 | }
|
7370 | }
|
7371 | var className = classDeclaration.name.text;
|
7372 | var members;
|
7373 | var implementsElements = [];
|
7374 | var extendsElement;
|
7375 | if (typeof tsMorph.ts.getEffectiveImplementsTypeNodes !== 'undefined') {
|
7376 | var implementedTypes = tsMorph.ts.getEffectiveImplementsTypeNodes(classDeclaration);
|
7377 | if (implementedTypes) {
|
7378 | var i = 0;
|
7379 | var len = implementedTypes.length;
|
7380 | for (i; i < len; i++) {
|
7381 | if (implementedTypes[i].expression) {
|
7382 | implementsElements.push(implementedTypes[i].expression.text);
|
7383 | }
|
7384 | }
|
7385 | }
|
7386 | }
|
7387 | if (typeof tsMorph.ts.getClassExtendsHeritageElement !== 'undefined') {
|
7388 | var extendsTypes = tsMorph.ts.getClassExtendsHeritageElement(classDeclaration);
|
7389 | if (extendsTypes) {
|
7390 | if (extendsTypes.expression) {
|
7391 | extendsElement = extendsTypes.expression.text;
|
7392 | }
|
7393 | }
|
7394 | }
|
7395 | members = this.visitMembers(classDeclaration.members, sourceFile);
|
7396 | if (classDeclaration.decorators) {
|
7397 | // Loop and search for official decorators at top-level :
|
7398 | // Angular : @NgModule, @Component, @Directive, @Injectable, @Pipe
|
7399 | // Nestjs : @Controller, @Module, @Injectable
|
7400 | // Stencil : @Component
|
7401 | var isDirective = false;
|
7402 | var isService = false;
|
7403 | var isPipe = false;
|
7404 | var isModule = false;
|
7405 | var isController = false;
|
7406 | for (var a = 0; a < classDeclaration.decorators.length; a++) {
|
7407 | //console.log(classDeclaration.decorators[i].expression);
|
7408 | // RETURN TOO EARLY FOR MANY DECORATORS !!!!
|
7409 | // iterating through the decorators array we have to keep the flags `true` values from the previous loop iteration
|
7410 | isDirective =
|
7411 | isDirective || this.isDirectiveDecorator(classDeclaration.decorators[a]);
|
7412 | isService = isService || this.isServiceDecorator(classDeclaration.decorators[a]);
|
7413 | isPipe = isPipe || this.isPipeDecorator(classDeclaration.decorators[a]);
|
7414 | isModule = isModule || this.isModuleDecorator(classDeclaration.decorators[a]);
|
7415 | isController =
|
7416 | isController || this.isControllerDecorator(classDeclaration.decorators[a]);
|
7417 | }
|
7418 | if (isDirective) {
|
7419 | return {
|
7420 | deprecated: deprecated,
|
7421 | deprecationMessage: deprecationMessage,
|
7422 | description: description,
|
7423 | rawdescription: rawdescription,
|
7424 | inputs: members.inputs,
|
7425 | outputs: members.outputs,
|
7426 | hostBindings: members.hostBindings,
|
7427 | hostListeners: members.hostListeners,
|
7428 | properties: members.properties,
|
7429 | methods: members.methods,
|
7430 | indexSignatures: members.indexSignatures,
|
7431 | kind: members.kind,
|
7432 | constructor: members.constructor,
|
7433 | jsdoctags: jsdoctags,
|
7434 | "extends": extendsElement,
|
7435 | implements: implementsElements,
|
7436 | accessors: members.accessors
|
7437 | };
|
7438 | }
|
7439 | else if (isService) {
|
7440 | return [
|
7441 | {
|
7442 | fileName: fileName,
|
7443 | className: className,
|
7444 | deprecated: deprecated,
|
7445 | deprecationMessage: deprecationMessage,
|
7446 | description: description,
|
7447 | rawdescription: rawdescription,
|
7448 | methods: members.methods,
|
7449 | indexSignatures: members.indexSignatures,
|
7450 | properties: members.properties,
|
7451 | kind: members.kind,
|
7452 | constructor: members.constructor,
|
7453 | jsdoctags: jsdoctags,
|
7454 | "extends": extendsElement,
|
7455 | implements: implementsElements,
|
7456 | accessors: members.accessors
|
7457 | }
|
7458 | ];
|
7459 | }
|
7460 | else if (isPipe) {
|
7461 | return [
|
7462 | {
|
7463 | fileName: fileName,
|
7464 | className: className,
|
7465 | deprecated: deprecated,
|
7466 | deprecationMessage: deprecationMessage,
|
7467 | description: description,
|
7468 | rawdescription: rawdescription,
|
7469 | jsdoctags: jsdoctags,
|
7470 | properties: members.properties,
|
7471 | methods: members.methods
|
7472 | }
|
7473 | ];
|
7474 | }
|
7475 | else if (isModule) {
|
7476 | return [
|
7477 | {
|
7478 | fileName: fileName,
|
7479 | className: className,
|
7480 | deprecated: deprecated,
|
7481 | deprecationMessage: deprecationMessage,
|
7482 | description: description,
|
7483 | rawdescription: rawdescription,
|
7484 | jsdoctags: jsdoctags,
|
7485 | methods: members.methods
|
7486 | }
|
7487 | ];
|
7488 | }
|
7489 | else {
|
7490 | return [
|
7491 | {
|
7492 | deprecated: deprecated,
|
7493 | deprecationMessage: deprecationMessage,
|
7494 | description: description,
|
7495 | rawdescription: rawdescription,
|
7496 | methods: members.methods,
|
7497 | indexSignatures: members.indexSignatures,
|
7498 | properties: members.properties,
|
7499 | kind: members.kind,
|
7500 | constructor: members.constructor,
|
7501 | jsdoctags: jsdoctags,
|
7502 | "extends": extendsElement,
|
7503 | implements: implementsElements,
|
7504 | accessors: members.accessors
|
7505 | }
|
7506 | ];
|
7507 | }
|
7508 | }
|
7509 | else if (description) {
|
7510 | return [
|
7511 | {
|
7512 | deprecated: deprecated,
|
7513 | deprecationMessage: deprecationMessage,
|
7514 | description: description,
|
7515 | rawdescription: rawdescription,
|
7516 | inputs: members.inputs,
|
7517 | outputs: members.outputs,
|
7518 | hostBindings: members.hostBindings,
|
7519 | hostListeners: members.hostListeners,
|
7520 | methods: members.methods,
|
7521 | indexSignatures: members.indexSignatures,
|
7522 | properties: members.properties,
|
7523 | kind: members.kind,
|
7524 | constructor: members.constructor,
|
7525 | jsdoctags: jsdoctags,
|
7526 | "extends": extendsElement,
|
7527 | implements: implementsElements,
|
7528 | accessors: members.accessors
|
7529 | }
|
7530 | ];
|
7531 | }
|
7532 | else {
|
7533 | return [
|
7534 | {
|
7535 | deprecated: deprecated,
|
7536 | deprecationMessage: deprecationMessage,
|
7537 | methods: members.methods,
|
7538 | inputs: members.inputs,
|
7539 | outputs: members.outputs,
|
7540 | hostBindings: members.hostBindings,
|
7541 | hostListeners: members.hostListeners,
|
7542 | indexSignatures: members.indexSignatures,
|
7543 | properties: members.properties,
|
7544 | kind: members.kind,
|
7545 | constructor: members.constructor,
|
7546 | jsdoctags: jsdoctags,
|
7547 | "extends": extendsElement,
|
7548 | implements: implementsElements,
|
7549 | accessors: members.accessors
|
7550 | }
|
7551 | ];
|
7552 | }
|
7553 | };
|
7554 | ClassHelper.prototype.visitMembers = function (members, sourceFile) {
|
7555 | /**
|
7556 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
7557 | */
|
7558 | var inputs = [];
|
7559 | var outputs = [];
|
7560 | var methods = [];
|
7561 | var properties = [];
|
7562 | var indexSignatures = [];
|
7563 | var kind;
|
7564 | var inputDecorator;
|
7565 | var hostBindings = [];
|
7566 | var hostListeners = [];
|
7567 | var constructor;
|
7568 | var outputDecorator;
|
7569 | var accessors = {};
|
7570 | var result = {};
|
7571 | for (var i = 0; i < members.length; i++) {
|
7572 | // Allows typescript guess type when using ts.is*
|
7573 | var member = members[i];
|
7574 | inputDecorator = this.getDecoratorOfType(member, 'Input');
|
7575 | outputDecorator = this.getDecoratorOfType(member, 'Output');
|
7576 | var parsedHostBindings = this.getDecoratorOfType(member, 'HostBinding');
|
7577 | var parsedHostListeners = this.getDecoratorOfType(member, 'HostListener');
|
7578 | kind = member.kind;
|
7579 | if (isIgnore(member)) {
|
7580 | continue;
|
7581 | }
|
7582 | if (this.isInternal(member) && Configuration$1.mainData.disableInternal) {
|
7583 | continue;
|
7584 | }
|
7585 | if (inputDecorator && inputDecorator.length > 0) {
|
7586 | inputs.push(this.visitInputAndHostBinding(member, inputDecorator[0], sourceFile));
|
7587 | if (tsMorph.ts.isSetAccessorDeclaration(member)) {
|
7588 | this.addAccessor(accessors, members[i], sourceFile);
|
7589 | }
|
7590 | }
|
7591 | else if (outputDecorator && outputDecorator.length > 0) {
|
7592 | outputs.push(this.visitOutput(member, outputDecorator[0], sourceFile));
|
7593 | }
|
7594 | else if (parsedHostBindings && parsedHostBindings.length > 0) {
|
7595 | var k = 0, lenHB = parsedHostBindings.length;
|
7596 | for (k; k < lenHB; k++) {
|
7597 | hostBindings.push(this.visitInputAndHostBinding(member, parsedHostBindings[k], sourceFile));
|
7598 | }
|
7599 | }
|
7600 | else if (parsedHostListeners && parsedHostListeners.length > 0) {
|
7601 | var l = 0, lenHL = parsedHostListeners.length;
|
7602 | for (l; l < lenHL; l++) {
|
7603 | hostListeners.push(this.visitHostListener(member, parsedHostListeners[l], sourceFile));
|
7604 | }
|
7605 | }
|
7606 | if (!this.isHiddenMember(member)) {
|
7607 | if (!(this.isPrivate(member) && Configuration$1.mainData.disablePrivate)) {
|
7608 | if (!(this.isInternal(member) && Configuration$1.mainData.disableInternal)) {
|
7609 | if (!(this.isProtected(member) && Configuration$1.mainData.disableProtected)) {
|
7610 | if (tsMorph.ts.isMethodDeclaration(member) || tsMorph.ts.isMethodSignature(member)) {
|
7611 | methods.push(this.visitMethodDeclaration(member, sourceFile));
|
7612 | }
|
7613 | else if (tsMorph.ts.isPropertyDeclaration(member) ||
|
7614 | tsMorph.ts.isPropertySignature(member)) {
|
7615 | if (!inputDecorator && !outputDecorator) {
|
7616 | properties.push(this.visitProperty(member, sourceFile));
|
7617 | }
|
7618 | }
|
7619 | else if (tsMorph.ts.isCallSignatureDeclaration(member)) {
|
7620 | properties.push(this.visitCallDeclaration(member, sourceFile));
|
7621 | }
|
7622 | else if (tsMorph.ts.isGetAccessorDeclaration(member) ||
|
7623 | tsMorph.ts.isSetAccessorDeclaration(member)) {
|
7624 | this.addAccessor(accessors, members[i], sourceFile);
|
7625 | }
|
7626 | else if (tsMorph.ts.isIndexSignatureDeclaration(member)) {
|
7627 | indexSignatures.push(this.visitIndexDeclaration(member, sourceFile));
|
7628 | }
|
7629 | else if (tsMorph.ts.isConstructorDeclaration(member)) {
|
7630 | var _constructorProperties = this.visitConstructorProperties(member, sourceFile);
|
7631 | var j = 0;
|
7632 | var len = _constructorProperties.length;
|
7633 | for (j; j < len; j++) {
|
7634 | properties.push(_constructorProperties[j]);
|
7635 | }
|
7636 | constructor = this.visitConstructorDeclaration(member, sourceFile);
|
7637 | }
|
7638 | }
|
7639 | }
|
7640 | }
|
7641 | }
|
7642 | }
|
7643 | inputs.sort(getNamesCompareFn());
|
7644 | outputs.sort(getNamesCompareFn());
|
7645 | hostBindings.sort(getNamesCompareFn());
|
7646 | hostListeners.sort(getNamesCompareFn());
|
7647 | properties.sort(getNamesCompareFn());
|
7648 | methods.sort(getNamesCompareFn());
|
7649 | indexSignatures.sort(getNamesCompareFn());
|
7650 | result = {
|
7651 | inputs: inputs,
|
7652 | outputs: outputs,
|
7653 | hostBindings: hostBindings,
|
7654 | hostListeners: hostListeners,
|
7655 | methods: methods,
|
7656 | properties: properties,
|
7657 | indexSignatures: indexSignatures,
|
7658 | kind: kind,
|
7659 | constructor: constructor
|
7660 | };
|
7661 | if (Object.keys(accessors).length) {
|
7662 | result['accessors'] = accessors;
|
7663 | }
|
7664 | return result;
|
7665 | };
|
7666 | ClassHelper.prototype.visitTypeName = function (typeName) {
|
7667 | if (typeName.escapedText) {
|
7668 | return typeName.escapedText;
|
7669 | }
|
7670 | if (typeName.text) {
|
7671 | return typeName.text;
|
7672 | }
|
7673 | if (typeName.left && typeName.right) {
|
7674 | return this.visitTypeName(typeName.left) + '.' + this.visitTypeName(typeName.right);
|
7675 | }
|
7676 | return '';
|
7677 | };
|
7678 | ClassHelper.prototype.visitType = function (node) {
|
7679 | var e_5, _a;
|
7680 | var _this = this;
|
7681 | var _return = 'void';
|
7682 | if (!node) {
|
7683 | return _return;
|
7684 | }
|
7685 | if (node.typeName) {
|
7686 | _return = this.visitTypeName(node.typeName);
|
7687 | }
|
7688 | else if (node.type) {
|
7689 | if (node.type.kind) {
|
7690 | _return = kindToType(node.type.kind);
|
7691 | }
|
7692 | if (node.type.typeName) {
|
7693 | _return = this.visitTypeName(node.type.typeName);
|
7694 | }
|
7695 | if (node.type.typeArguments) {
|
7696 | _return += '<';
|
7697 | var typeArguments = [];
|
7698 | try {
|
7699 | for (var _b = __values(node.type.typeArguments), _c = _b.next(); !_c.done; _c = _b.next()) {
|
7700 | var argument = _c.value;
|
7701 | typeArguments.push(this.visitType(argument));
|
7702 | }
|
7703 | }
|
7704 | catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
7705 | finally {
|
7706 | try {
|
7707 | if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
|
7708 | }
|
7709 | finally { if (e_5) throw e_5.error; }
|
7710 | }
|
7711 | _return += typeArguments.join(' | ');
|
7712 | _return += '>';
|
7713 | }
|
7714 | if (node.type.elementType) {
|
7715 | var _firstPart = this.visitType(node.type.elementType);
|
7716 | _return = _firstPart + kindToType(node.type.kind);
|
7717 | if (node.type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
|
7718 | _return = '(' + _firstPart + ')' + kindToType(node.type.kind);
|
7719 | }
|
7720 | }
|
7721 | var parseTypesOrElements = function (arr, separator) {
|
7722 | var e_6, _a;
|
7723 | var i = 0;
|
7724 | var len = arr.length;
|
7725 | for (i; i < len; i++) {
|
7726 | var type = arr[i];
|
7727 | if (type.elementType) {
|
7728 | var _firstPart = _this.visitType(type.elementType);
|
7729 | if (type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
|
7730 | _return += '(' + _firstPart + ')' + kindToType(type.kind);
|
7731 | }
|
7732 | else {
|
7733 | _return += _firstPart + kindToType(type.kind);
|
7734 | }
|
7735 | }
|
7736 | else {
|
7737 | if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
|
7738 | if (type.literal.text) {
|
7739 | _return += '"' + type.literal.text + '"';
|
7740 | }
|
7741 | else {
|
7742 | _return += kindToType(type.literal.kind);
|
7743 | }
|
7744 | }
|
7745 | else {
|
7746 | _return += kindToType(type.kind);
|
7747 | }
|
7748 | if (type.typeName) {
|
7749 | _return += _this.visitTypeName(type.typeName);
|
7750 | }
|
7751 | if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
|
7752 | _return += '...' + _this.visitType(type.type);
|
7753 | }
|
7754 | if (type.typeArguments) {
|
7755 | _return += '<';
|
7756 | var typeArguments = [];
|
7757 | try {
|
7758 | for (var _b = (e_6 = void 0, __values(type.typeArguments)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
7759 | var argument = _c.value;
|
7760 | typeArguments.push(_this.visitType(argument));
|
7761 | }
|
7762 | }
|
7763 | catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
7764 | finally {
|
7765 | try {
|
7766 | if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
|
7767 | }
|
7768 | finally { if (e_6) throw e_6.error; }
|
7769 | }
|
7770 | _return += typeArguments.join(separator);
|
7771 | _return += '>';
|
7772 | }
|
7773 | }
|
7774 | if (i < len - 1) {
|
7775 | _return += separator;
|
7776 | }
|
7777 | }
|
7778 | };
|
7779 | if (node.type.elements && tsMorph.ts.isTupleTypeNode(node.type)) {
|
7780 | _return += '[';
|
7781 | parseTypesOrElements(node.type.elements, ', ');
|
7782 | _return += ']';
|
7783 | }
|
7784 | if (node.type.types && tsMorph.ts.isUnionTypeNode(node.type)) {
|
7785 | parseTypesOrElements(node.type.types, ' | ');
|
7786 | }
|
7787 | if (node.type.elementTypes) {
|
7788 | var elementTypes = node.type.elementTypes;
|
7789 | var i = 0;
|
7790 | var len = elementTypes.length;
|
7791 | if (len > 0) {
|
7792 | _return = '[';
|
7793 | for (i; i < len; i++) {
|
7794 | var type = elementTypes[i];
|
7795 | if (type.kind === tsMorph.SyntaxKind.ArrayType && type.elementType) {
|
7796 | _return += kindToType(type.elementType.kind);
|
7797 | _return += kindToType(type.kind);
|
7798 | }
|
7799 | else {
|
7800 | _return += kindToType(type.kind);
|
7801 | }
|
7802 | if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
|
7803 | if (type.literal.text) {
|
7804 | _return += '"' + type.literal.text + '"';
|
7805 | }
|
7806 | else {
|
7807 | _return += kindToType(type.literal.kind);
|
7808 | }
|
7809 | }
|
7810 | if (type.typeName) {
|
7811 | _return += this.visitTypeName(type.typeName);
|
7812 | }
|
7813 | if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
|
7814 | _return += '...' + this.visitType(type.type);
|
7815 | }
|
7816 | if (type.kind === tsMorph.SyntaxKind.TypeReference &&
|
7817 | type.typeName &&
|
7818 | typeof type.typeName.escapedText !== 'undefined' &&
|
7819 | type.typeName.escapedText === '') {
|
7820 | continue;
|
7821 | }
|
7822 | if (i < len - 1) {
|
7823 | _return += ', ';
|
7824 | }
|
7825 | }
|
7826 | _return += ']';
|
7827 | }
|
7828 | }
|
7829 | }
|
7830 | else if (node.elementType) {
|
7831 | _return = kindToType(node.elementType.kind) + kindToType(node.kind);
|
7832 | if (node.elementType.typeName) {
|
7833 | _return = this.visitTypeName(node.elementType.typeName) + kindToType(node.kind);
|
7834 | }
|
7835 | }
|
7836 | else if (node.types && tsMorph.ts.isUnionTypeNode(node)) {
|
7837 | _return = '';
|
7838 | var i = 0;
|
7839 | var len = node.types.length;
|
7840 | for (i; i < len; i++) {
|
7841 | var type = node.types[i];
|
7842 | _return += kindToType(type.kind);
|
7843 | if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
|
7844 | if (type.literal.text) {
|
7845 | _return += '"' + type.literal.text + '"';
|
7846 | }
|
7847 | else {
|
7848 | _return += kindToType(type.literal.kind);
|
7849 | }
|
7850 | }
|
7851 | if (type.typeName) {
|
7852 | _return += this.visitTypeName(type.typeName);
|
7853 | }
|
7854 | if (i < len - 1) {
|
7855 | _return += ' | ';
|
7856 | }
|
7857 | }
|
7858 | }
|
7859 | else if (node.dotDotDotToken) {
|
7860 | _return = 'any[]';
|
7861 | }
|
7862 | else {
|
7863 | _return = kindToType(node.kind);
|
7864 | if (_return === '' &&
|
7865 | node.initializer &&
|
7866 | node.initializer.kind &&
|
7867 | (node.kind === tsMorph.SyntaxKind.PropertyDeclaration || node.kind === tsMorph.SyntaxKind.Parameter)) {
|
7868 | _return = kindToType(node.initializer.kind);
|
7869 | }
|
7870 | if (node.kind === tsMorph.SyntaxKind.TypeParameter) {
|
7871 | _return = node.name.text;
|
7872 | }
|
7873 | if (node.kind === tsMorph.SyntaxKind.LiteralType) {
|
7874 | _return = node.literal.text;
|
7875 | }
|
7876 | }
|
7877 | if (node.typeArguments && node.typeArguments.length > 0) {
|
7878 | _return += '<';
|
7879 | var i = 0, len = node.typeArguments.length;
|
7880 | for (i; i < len; i++) {
|
7881 | var argument = node.typeArguments[i];
|
7882 | _return += this.visitType(argument);
|
7883 | if (i >= 0 && i < len - 1) {
|
7884 | _return += ', ';
|
7885 | }
|
7886 | }
|
7887 | _return += '>';
|
7888 | }
|
7889 | return _return;
|
7890 | };
|
7891 | ClassHelper.prototype.visitCallDeclaration = function (method, sourceFile) {
|
7892 | var _this = this;
|
7893 | var sourceCode = sourceFile.getText();
|
7894 | var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
|
7895 | var result = {
|
7896 | id: 'call-declaration-' + hash,
|
7897 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
7898 | returnType: this.visitType(method.type),
|
7899 | line: this.getPosition(method, sourceFile).line + 1,
|
7900 | deprecated: false,
|
7901 | deprecationMessage: ''
|
7902 | };
|
7903 | if (method.jsDoc) {
|
7904 | var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
|
7905 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
7906 | result.rawdescription = cleanedDescription;
|
7907 | result.description = marked$2(cleanedDescription);
|
7908 | }
|
7909 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
7910 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
7911 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
7912 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
7913 | }
|
7914 | return result;
|
7915 | };
|
7916 | ClassHelper.prototype.visitIndexDeclaration = function (method, sourceFile) {
|
7917 | var _this = this;
|
7918 | var sourceCode = sourceFile.getText();
|
7919 | var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
|
7920 | var result = {
|
7921 | id: 'index-declaration-' + hash,
|
7922 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
7923 | returnType: this.visitType(method.type),
|
7924 | line: this.getPosition(method, sourceFile).line + 1,
|
7925 | deprecated: false,
|
7926 | deprecationMessage: ''
|
7927 | };
|
7928 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
7929 | if (method.jsDoc) {
|
7930 | var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
|
7931 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
7932 | result.rawdescription = cleanedDescription;
|
7933 | result.description = marked$2(cleanedDescription);
|
7934 | }
|
7935 | if (jsdoctags && jsdoctags.length >= 1) {
|
7936 | if (jsdoctags[0].tags) {
|
7937 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
7938 | if (method.jsDoc) {
|
7939 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
7940 | }
|
7941 | }
|
7942 | }
|
7943 | return result;
|
7944 | };
|
7945 | ClassHelper.prototype.visitConstructorDeclaration = function (method, sourceFile) {
|
7946 | var _this = this;
|
7947 | /**
|
7948 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
7949 | */
|
7950 | var result = {
|
7951 | name: 'constructor',
|
7952 | description: '',
|
7953 | deprecated: false,
|
7954 | deprecationMessage: '',
|
7955 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
7956 | line: this.getPosition(method, sourceFile).line + 1
|
7957 | };
|
7958 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
7959 | if (method.jsDoc) {
|
7960 | var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
|
7961 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
7962 | result.rawdescription = cleanedDescription;
|
7963 | result.description = marked$2(cleanedDescription);
|
7964 | }
|
7965 | if (method.modifiers) {
|
7966 | if (method.modifiers.length > 0) {
|
7967 | var kinds = method.modifiers.map(function (modifier) {
|
7968 | return modifier.kind;
|
7969 | });
|
7970 | if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
|
7971 | ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
|
7972 | kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
|
7973 | }
|
7974 | result.modifierKind = kinds;
|
7975 | }
|
7976 | }
|
7977 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
7978 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
7979 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
7980 | }
|
7981 | if (result.jsdoctags && result.jsdoctags.length > 0) {
|
7982 | result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
7983 | }
|
7984 | else if (result.args.length > 0) {
|
7985 | result.jsdoctags = mergeTagsAndArgs(result.args);
|
7986 | }
|
7987 | return result;
|
7988 | };
|
7989 | ClassHelper.prototype.visitProperty = function (property, sourceFile) {
|
7990 | var result = {
|
7991 | name: property.name.text,
|
7992 | defaultValue: property.initializer
|
7993 | ? this.stringifyDefaultValue(property.initializer)
|
7994 | : undefined,
|
7995 | deprecated: false,
|
7996 | deprecationMessage: '',
|
7997 | type: this.visitType(property),
|
7998 | optional: typeof property.questionToken !== 'undefined',
|
7999 | description: '',
|
8000 | line: this.getPosition(property, sourceFile).line + 1
|
8001 | };
|
8002 | var jsdoctags;
|
8003 | if (property.initializer && property.initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
|
8004 | result.defaultValue = '() => {...}';
|
8005 | }
|
8006 | if (typeof result.name === 'undefined' && typeof property.name.expression !== 'undefined') {
|
8007 | result.name = property.name.expression.text;
|
8008 | }
|
8009 | jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
8010 | if (property.jsDoc) {
|
8011 | var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
|
8012 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
8013 | result.rawdescription = cleanedDescription;
|
8014 | result.description = marked$2(cleanedDescription);
|
8015 | }
|
8016 | if (property.decorators) {
|
8017 | result.decorators = this.formatDecorators(property.decorators);
|
8018 | }
|
8019 | if (property.modifiers) {
|
8020 | if (property.modifiers.length > 0) {
|
8021 | var kinds = property.modifiers.map(function (modifier) {
|
8022 | return modifier.kind;
|
8023 | });
|
8024 | if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
|
8025 | ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
|
8026 | kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
|
8027 | }
|
8028 | result.modifierKind = kinds;
|
8029 | }
|
8030 | }
|
8031 | // Check for ECMAScript Private Fields
|
8032 | if (this.isPrivate(property)) {
|
8033 | if (!result.modifierKind) {
|
8034 | result.modifierKind = [];
|
8035 | }
|
8036 | var hasAlreadyPrivateLeyword_1 = false;
|
8037 | result.modifierKind.forEach(function (modifierKind) {
|
8038 | if (modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
8039 | hasAlreadyPrivateLeyword_1 = true;
|
8040 | }
|
8041 | });
|
8042 | if (!hasAlreadyPrivateLeyword_1) {
|
8043 | result.modifierKind.push(tsMorph.SyntaxKind.PrivateKeyword);
|
8044 | }
|
8045 | }
|
8046 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
8047 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
8048 | if (property.jsDoc) {
|
8049 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
8050 | }
|
8051 | }
|
8052 | return result;
|
8053 | };
|
8054 | ClassHelper.prototype.visitConstructorProperties = function (constr, sourceFile) {
|
8055 | if (constr.parameters) {
|
8056 | var _parameters_1 = [];
|
8057 | var i = 0;
|
8058 | var len = constr.parameters.length;
|
8059 | for (i; i < len; i++) {
|
8060 | var parameterOfConstructor = constr.parameters[i];
|
8061 | if (isIgnore(parameterOfConstructor)) {
|
8062 | continue;
|
8063 | }
|
8064 | if (this.isInternal(parameterOfConstructor) &&
|
8065 | Configuration$1.mainData.disableInternal) {
|
8066 | continue;
|
8067 | }
|
8068 | if (this.isPublic(parameterOfConstructor)) {
|
8069 | _parameters_1.push(this.visitProperty(constr.parameters[i], sourceFile));
|
8070 | }
|
8071 | }
|
8072 | /**
|
8073 | * Merge JSDoc tags description from constructor with parameters
|
8074 | */
|
8075 | if (constr.jsDoc) {
|
8076 | if (constr.jsDoc.length > 0) {
|
8077 | var constrTags = constr.jsDoc[0].tags;
|
8078 | if (constrTags && constrTags.length > 0) {
|
8079 | constrTags.forEach(function (tag) {
|
8080 | _parameters_1.forEach(function (param) {
|
8081 | if (tag.tagName &&
|
8082 | tag.tagName.escapedText &&
|
8083 | tag.tagName.escapedText === 'param') {
|
8084 | if (tag.name &&
|
8085 | tag.name.escapedText &&
|
8086 | tag.name.escapedText === param.name) {
|
8087 | param.description = tag.comment;
|
8088 | }
|
8089 | }
|
8090 | });
|
8091 | });
|
8092 | }
|
8093 | }
|
8094 | }
|
8095 | return _parameters_1;
|
8096 | }
|
8097 | else {
|
8098 | return [];
|
8099 | }
|
8100 | };
|
8101 | ClassHelper.prototype.visitMethodDeclaration = function (method, sourceFile) {
|
8102 | var _this = this;
|
8103 | var result = {
|
8104 | name: method.name.text,
|
8105 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
8106 | optional: typeof method.questionToken !== 'undefined',
|
8107 | returnType: this.visitType(method.type),
|
8108 | typeParameters: [],
|
8109 | line: this.getPosition(method, sourceFile).line + 1,
|
8110 | deprecated: false,
|
8111 | deprecationMessage: ''
|
8112 | };
|
8113 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
8114 | if (typeof method.type === 'undefined') {
|
8115 | // Try to get inferred type
|
8116 | if (method.symbol) {
|
8117 | var symbol = method.symbol;
|
8118 | if (symbol.valueDeclaration) {
|
8119 | var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
|
8120 | if (symbolType) {
|
8121 | try {
|
8122 | var signature = this.typeChecker.getSignatureFromDeclaration(method);
|
8123 | var returnType = signature.getReturnType();
|
8124 | result.returnType = this.typeChecker.typeToString(returnType);
|
8125 | // tslint:disable-next-line:no-empty
|
8126 | }
|
8127 | catch (error) { }
|
8128 | }
|
8129 | }
|
8130 | }
|
8131 | }
|
8132 | if (method.typeParameters && method.typeParameters.length > 0) {
|
8133 | result.typeParameters = method.typeParameters.map(function (typeParameter) {
|
8134 | return _this.visitType(typeParameter);
|
8135 | });
|
8136 | }
|
8137 | if (method.jsDoc) {
|
8138 | var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
|
8139 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
8140 | result.rawdescription = cleanedDescription;
|
8141 | result.description = marked$2(cleanedDescription);
|
8142 | }
|
8143 | if (method.decorators) {
|
8144 | result.decorators = this.formatDecorators(method.decorators);
|
8145 | }
|
8146 | if (method.modifiers) {
|
8147 | if (method.modifiers.length > 0) {
|
8148 | var kinds = method.modifiers.map(function (modifier) {
|
8149 | return modifier.kind;
|
8150 | });
|
8151 | if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
|
8152 | ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
|
8153 | kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
|
8154 | }
|
8155 | result.modifierKind = kinds;
|
8156 | }
|
8157 | }
|
8158 | // Check for ECMAScript Private Fields
|
8159 | if (this.isPrivate(method)) {
|
8160 | if (!result.modifierKind) {
|
8161 | result.modifierKind = [];
|
8162 | }
|
8163 | var hasAlreadyPrivateLeyword_2 = false;
|
8164 | result.modifierKind.forEach(function (modifierKind) {
|
8165 | if (modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
8166 | hasAlreadyPrivateLeyword_2 = true;
|
8167 | }
|
8168 | });
|
8169 | if (!hasAlreadyPrivateLeyword_2) {
|
8170 | result.modifierKind.push(tsMorph.SyntaxKind.PrivateKeyword);
|
8171 | }
|
8172 | }
|
8173 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
8174 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
8175 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
8176 | }
|
8177 | if (result.jsdoctags && result.jsdoctags.length > 0) {
|
8178 | result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
8179 | }
|
8180 | else if (result.args.length > 0) {
|
8181 | result.jsdoctags = mergeTagsAndArgs(result.args);
|
8182 | }
|
8183 | return result;
|
8184 | };
|
8185 | ClassHelper.prototype.visitOutput = function (property, outDecorator, sourceFile) {
|
8186 | var inArgs = outDecorator.expression.arguments;
|
8187 | var _return = {
|
8188 | name: inArgs.length > 0 ? inArgs[0].text : property.name.text,
|
8189 | defaultValue: property.initializer
|
8190 | ? this.stringifyDefaultValue(property.initializer)
|
8191 | : undefined,
|
8192 | deprecated: false,
|
8193 | deprecationMessage: ''
|
8194 | };
|
8195 | if (property.jsDoc) {
|
8196 | var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
|
8197 | var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
8198 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
8199 | _return.rawdescription = cleanedDescription;
|
8200 | _return.description = marked$2(cleanedDescription);
|
8201 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
8202 | this.checkForDeprecation(jsdoctags[0].tags, _return);
|
8203 | _return.jsdoctags = markedtags(jsdoctags[0].tags);
|
8204 | }
|
8205 | }
|
8206 | if (!_return.description) {
|
8207 | if (property.jsDoc && property.jsDoc.length > 0) {
|
8208 | if (typeof property.jsDoc[0].comment !== 'undefined') {
|
8209 | var rawDescription = property.jsDoc[0].comment;
|
8210 | _return.rawdescription = rawDescription;
|
8211 | _return.description = marked$2(rawDescription);
|
8212 | }
|
8213 | }
|
8214 | }
|
8215 | _return.line = this.getPosition(property, sourceFile).line + 1;
|
8216 | if (property.type) {
|
8217 | _return.type = this.visitType(property);
|
8218 | }
|
8219 | else {
|
8220 | // handle NewExpression
|
8221 | if (property.initializer) {
|
8222 | if (tsMorph.ts.isNewExpression(property.initializer)) {
|
8223 | if (property.initializer.expression) {
|
8224 | _return.type = property.initializer.expression.text;
|
8225 | }
|
8226 | }
|
8227 | }
|
8228 | }
|
8229 | return _return;
|
8230 | };
|
8231 | ClassHelper.prototype.visitArgument = function (arg) {
|
8232 | var _this = this;
|
8233 | var _result = {
|
8234 | name: arg.name.text,
|
8235 | type: this.visitType(arg),
|
8236 | deprecated: false,
|
8237 | deprecationMessage: ''
|
8238 | };
|
8239 | if (arg.dotDotDotToken) {
|
8240 | _result.dotDotDotToken = true;
|
8241 | }
|
8242 | if (arg.questionToken) {
|
8243 | _result.optional = true;
|
8244 | }
|
8245 | if (arg.type) {
|
8246 | if (arg.type.kind) {
|
8247 | if (tsMorph.ts.isFunctionTypeNode(arg.type)) {
|
8248 | _result["function"] = arg.type.parameters
|
8249 | ? arg.type.parameters.map(function (prop) { return _this.visitArgument(prop); })
|
8250 | : [];
|
8251 | }
|
8252 | }
|
8253 | }
|
8254 | if (arg.initializer) {
|
8255 | _result.defaultValue = this.stringifyDefaultValue(arg.initializer);
|
8256 | }
|
8257 | var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
|
8258 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
8259 | this.checkForDeprecation(jsdoctags[0].tags, _result);
|
8260 | }
|
8261 | return _result;
|
8262 | };
|
8263 | ClassHelper.prototype.visitInputAndHostBinding = function (property, inDecorator, sourceFile) {
|
8264 | var inArgs = inDecorator.expression.arguments;
|
8265 | var _return = {};
|
8266 | _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
|
8267 | _return.defaultValue = property.initializer
|
8268 | ? this.stringifyDefaultValue(property.initializer)
|
8269 | : undefined;
|
8270 | _return.deprecated = false;
|
8271 | _return.deprecationMessage = '';
|
8272 | if (!_return.description) {
|
8273 | if (property.jsDoc) {
|
8274 | if (property.jsDoc.length > 0) {
|
8275 | var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
8276 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
8277 | this.checkForDeprecation(jsdoctags[0].tags, _return);
|
8278 | _return.jsdoctags = markedtags(jsdoctags[0].tags);
|
8279 | }
|
8280 | if (typeof property.jsDoc[0].comment !== 'undefined') {
|
8281 | var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
|
8282 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
8283 | _return.rawdescription = cleanedDescription;
|
8284 | _return.description = marked$2(cleanedDescription);
|
8285 | }
|
8286 | }
|
8287 | }
|
8288 | }
|
8289 | _return.line = this.getPosition(property, sourceFile).line + 1;
|
8290 | if (property.type) {
|
8291 | _return.type = this.visitType(property);
|
8292 | }
|
8293 | else {
|
8294 | // handle NewExpression
|
8295 | if (property.initializer) {
|
8296 | if (tsMorph.ts.isNewExpression(property.initializer)) {
|
8297 | if (property.initializer.expression) {
|
8298 | _return.type = property.initializer.expression.text;
|
8299 | }
|
8300 | }
|
8301 | }
|
8302 | // Try to get inferred type
|
8303 | if (property.symbol) {
|
8304 | var symbol = property.symbol;
|
8305 | if (symbol.valueDeclaration) {
|
8306 | var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
|
8307 | if (symbolType) {
|
8308 | _return.type = this.typeChecker.typeToString(symbolType);
|
8309 | }
|
8310 | }
|
8311 | }
|
8312 | }
|
8313 | if (property.kind === tsMorph.SyntaxKind.SetAccessor) {
|
8314 | // For setter accessor, find type in first parameter
|
8315 | if (property.parameters && property.parameters.length === 1) {
|
8316 | if (property.parameters[0].type) {
|
8317 | _return.type = this.visitType(property.parameters[0].type);
|
8318 | }
|
8319 | }
|
8320 | }
|
8321 | if (property.decorators) {
|
8322 | _return.decorators = this.formatDecorators(property.decorators).filter(function (item) { return item.name !== 'Input' && item.name !== 'HostBinding'; });
|
8323 | }
|
8324 | return _return;
|
8325 | };
|
8326 | ClassHelper.prototype.visitHostListener = function (property, hostListenerDecorator, sourceFile) {
|
8327 | var _this = this;
|
8328 | var inArgs = hostListenerDecorator.expression.arguments;
|
8329 | var _return = {};
|
8330 | _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
|
8331 | _return.args = property.parameters
|
8332 | ? property.parameters.map(function (prop) { return _this.visitArgument(prop); })
|
8333 | : [];
|
8334 | _return.argsDecorator =
|
8335 | inArgs.length > 1
|
8336 | ? inArgs[1].elements.map(function (prop) {
|
8337 | return prop.text;
|
8338 | })
|
8339 | : [];
|
8340 | _return.deprecated = false;
|
8341 | _return.deprecationMessage = '';
|
8342 | if (property.jsDoc) {
|
8343 | var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
|
8344 | var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
8345 | var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
8346 | _return.rawdescription = cleanedDescription;
|
8347 | _return.description = marked$2(cleanedDescription);
|
8348 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
8349 | this.checkForDeprecation(jsdoctags[0].tags, _return);
|
8350 | _return.jsdoctags = markedtags(jsdoctags[0].tags);
|
8351 | }
|
8352 | }
|
8353 | if (!_return.description) {
|
8354 | if (property.jsDoc) {
|
8355 | if (property.jsDoc.length > 0) {
|
8356 | if (typeof property.jsDoc[0].comment !== 'undefined') {
|
8357 | var rawDescription = property.jsDoc[0].comment;
|
8358 | _return.rawdescription = rawDescription;
|
8359 | _return.description = marked$2(rawDescription);
|
8360 | }
|
8361 | }
|
8362 | }
|
8363 | }
|
8364 | _return.line = this.getPosition(property, sourceFile).line + 1;
|
8365 | return _return;
|
8366 | };
|
8367 | return ClassHelper;
|
8368 | }());
|
8369 |
|
8370 | var TsPrinterUtil = /** @class */ (function () {
|
8371 | function TsPrinterUtil() {
|
8372 | this.printer = tsMorph.ts.createPrinter({
|
8373 | newLine: tsMorph.ts.NewLineKind.LineFeed
|
8374 | });
|
8375 | }
|
8376 | TsPrinterUtil.prototype.print = function (node) {
|
8377 | return this.printer.printNode(tsMorph.ts.EmitHint.Unspecified, node, tsMorph.ts.createSourceFile('', '', tsMorph.ts.ScriptTarget.Latest));
|
8378 | };
|
8379 | return TsPrinterUtil;
|
8380 | }());
|
8381 |
|
8382 | var SymbolHelper = /** @class */ (function () {
|
8383 | function SymbolHelper() {
|
8384 | this.unknown = '???';
|
8385 | }
|
8386 | SymbolHelper.prototype.parseDeepIndentifier = function (name, srcFile) {
|
8387 | var result = {
|
8388 | name: '',
|
8389 | type: ''
|
8390 | };
|
8391 | if (typeof name === 'undefined') {
|
8392 | return result;
|
8393 | }
|
8394 | var nsModule = name.split('.');
|
8395 | var type = this.getType(name);
|
8396 | if (nsModule.length > 1) {
|
8397 | result.ns = nsModule[0];
|
8398 | result.name = name;
|
8399 | result.type = type;
|
8400 | return result;
|
8401 | }
|
8402 | if (typeof srcFile !== 'undefined') {
|
8403 | result.file = ImportsUtil$1.getFileNameOfImport(name, srcFile);
|
8404 | }
|
8405 | result.name = name;
|
8406 | result.type = type;
|
8407 | return result;
|
8408 | };
|
8409 | SymbolHelper.prototype.getType = function (name) {
|
8410 | var type;
|
8411 | if (name.toLowerCase().indexOf('component') !== -1) {
|
8412 | type = 'component';
|
8413 | }
|
8414 | else if (name.toLowerCase().indexOf('pipe') !== -1) {
|
8415 | type = 'pipe';
|
8416 | }
|
8417 | else if (name.toLowerCase().indexOf('controller') !== -1) {
|
8418 | type = 'controller';
|
8419 | }
|
8420 | else if (name.toLowerCase().indexOf('module') !== -1) {
|
8421 | type = 'module';
|
8422 | }
|
8423 | else if (name.toLowerCase().indexOf('directive') !== -1) {
|
8424 | type = 'directive';
|
8425 | }
|
8426 | return type;
|
8427 | };
|
8428 | /**
|
8429 | * Output
|
8430 | * RouterModule.forRoot 179
|
8431 | */
|
8432 | SymbolHelper.prototype.buildIdentifierName = function (node, name) {
|
8433 | if (tsMorph.ts.isIdentifier(node) && !tsMorph.ts.isPropertyAccessExpression(node)) {
|
8434 | return node.text + "." + name;
|
8435 | }
|
8436 | name = name ? "." + name : '';
|
8437 | var nodeName = this.unknown;
|
8438 | if (node.name) {
|
8439 | nodeName = node.name.text;
|
8440 | }
|
8441 | else if (node.text) {
|
8442 | nodeName = node.text;
|
8443 | }
|
8444 | else if (node.expression) {
|
8445 | if (node.expression.text) {
|
8446 | nodeName = node.expression.text;
|
8447 | }
|
8448 | else if (node.expression.elements) {
|
8449 | if (tsMorph.ts.isArrayLiteralExpression(node.expression)) {
|
8450 | nodeName = node.expression.elements.map(function (el) { return el.text; }).join(', ');
|
8451 | nodeName = "[" + nodeName + "]";
|
8452 | }
|
8453 | }
|
8454 | }
|
8455 | if (tsMorph.ts.isSpreadElement(node)) {
|
8456 | return "..." + nodeName;
|
8457 | }
|
8458 | return "" + this.buildIdentifierName(node.expression, nodeName) + name;
|
8459 | };
|
8460 | /**
|
8461 | * parse expressions such as:
|
8462 | * { provide: APP_BASE_HREF, useValue: '/' }
|
8463 | * { provide: 'Date', useFactory: (d1, d2) => new Date(), deps: ['d1', 'd2'] }
|
8464 | */
|
8465 | SymbolHelper.prototype.parseProviderConfiguration = function (node) {
|
8466 | if (node.kind && node.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
8467 | // Search for provide: HTTP_INTERCEPTORS
|
8468 | // and if true, return type: 'interceptor' + name
|
8469 | var interceptorName_1, hasInterceptor_1;
|
8470 | if (node.properties) {
|
8471 | if (node.properties.length > 0) {
|
8472 | ___namespace.forEach(node.properties, function (property) {
|
8473 | if (property.kind && property.kind === tsMorph.SyntaxKind.PropertyAssignment) {
|
8474 | if (property.name.text === 'provide') {
|
8475 | if (property.initializer.text === 'HTTP_INTERCEPTORS') {
|
8476 | hasInterceptor_1 = true;
|
8477 | }
|
8478 | }
|
8479 | if (property.name.text === 'useClass' ||
|
8480 | property.name.text === 'useExisting') {
|
8481 | interceptorName_1 = property.initializer.text;
|
8482 | }
|
8483 | }
|
8484 | });
|
8485 | }
|
8486 | }
|
8487 | if (hasInterceptor_1) {
|
8488 | return interceptorName_1;
|
8489 | }
|
8490 | else {
|
8491 | return new TsPrinterUtil().print(node);
|
8492 | }
|
8493 | }
|
8494 | else {
|
8495 | return new TsPrinterUtil().print(node);
|
8496 | }
|
8497 | };
|
8498 | /**
|
8499 | * Kind
|
8500 | * 181 CallExpression => "RouterModule.forRoot(args)"
|
8501 | * 71 Identifier => "RouterModule" "TodoStore"
|
8502 | * 9 StringLiteral => "./app.component.css" "./tab.scss"
|
8503 | */
|
8504 | SymbolHelper.prototype.parseSymbolElements = function (node) {
|
8505 | // parse expressions such as: AngularFireModule.initializeApp(firebaseConfig)
|
8506 | // if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
|
8507 | if ((tsMorph.ts.isCallExpression(node) && tsMorph.ts.isPropertyAccessExpression(node.expression)) ||
|
8508 | (tsMorph.ts.isNewExpression(node) && tsMorph.ts.isElementAccessExpression(node.expression))) {
|
8509 | var className = this.buildIdentifierName(node.expression);
|
8510 | // function arguments could be really complex. There are so
|
8511 | // many use cases that we can't handle. Just print "args" to indicate
|
8512 | // that we have arguments.
|
8513 | var functionArgs = node.arguments.length > 0 ? 'args' : '';
|
8514 | var text = className + "(" + functionArgs + ")";
|
8515 | return text;
|
8516 | }
|
8517 | else if (tsMorph.ts.isPropertyAccessExpression(node)) {
|
8518 | // parse expressions such as: Shared.Module
|
8519 | return this.buildIdentifierName(node);
|
8520 | }
|
8521 | else if (tsMorph.ts.isIdentifier(node)) {
|
8522 | // parse expressions such as: MyComponent
|
8523 | if (node.text) {
|
8524 | return node.text;
|
8525 | }
|
8526 | if (node.escapedText) {
|
8527 | return node.escapedText;
|
8528 | }
|
8529 | }
|
8530 | else if (tsMorph.ts.isSpreadElement(node)) {
|
8531 | // parse expressions such as: ...MYARRAY
|
8532 | // Resolve MYARRAY in imports or local file variables after full scan, just return the name of the variable
|
8533 | if (node.expression && node.expression.text) {
|
8534 | return node.expression.text;
|
8535 | }
|
8536 | }
|
8537 | return node.text ? node.text : this.parseProviderConfiguration(node);
|
8538 | };
|
8539 | /**
|
8540 | * Kind
|
8541 | * 177 ArrayLiteralExpression
|
8542 | * 122 BooleanKeyword
|
8543 | * 9 StringLiteral
|
8544 | */
|
8545 | SymbolHelper.prototype.parseSymbols = function (node, srcFile, decoratorType) {
|
8546 | var _this = this;
|
8547 | var localNode = node;
|
8548 | if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType !== 'template') {
|
8549 | localNode = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
|
8550 | }
|
8551 | if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType === 'template') {
|
8552 | var data = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
|
8553 | return [data];
|
8554 | }
|
8555 | if (localNode.initializer && tsMorph.ts.isArrayLiteralExpression(localNode.initializer)) {
|
8556 | return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
|
8557 | }
|
8558 | else if ((localNode.initializer && tsMorph.ts.isStringLiteral(localNode.initializer)) ||
|
8559 | (localNode.initializer && tsMorph.ts.isTemplateLiteral(localNode.initializer)) ||
|
8560 | (localNode.initializer &&
|
8561 | tsMorph.ts.isPropertyAssignment(localNode) &&
|
8562 | localNode.initializer.text)) {
|
8563 | return [localNode.initializer.text];
|
8564 | }
|
8565 | else if (localNode.initializer &&
|
8566 | localNode.initializer.kind &&
|
8567 | (localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ||
|
8568 | localNode.initializer.kind === tsMorph.SyntaxKind.FalseKeyword)) {
|
8569 | return [localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ? true : false];
|
8570 | }
|
8571 | else if (localNode.initializer && tsMorph.ts.isPropertyAccessExpression(localNode.initializer)) {
|
8572 | var identifier = this.parseSymbolElements(localNode.initializer);
|
8573 | return [identifier];
|
8574 | }
|
8575 | else if (localNode.initializer &&
|
8576 | localNode.initializer.elements &&
|
8577 | localNode.initializer.elements.length > 0) {
|
8578 | // Node replaced by ts-simple-ast & kind = 265
|
8579 | return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
|
8580 | }
|
8581 | };
|
8582 | SymbolHelper.prototype.getSymbolDeps = function (props, decoratorType, srcFile, multiLine) {
|
8583 | var _this = this;
|
8584 | if (props.length === 0) {
|
8585 | return [];
|
8586 | }
|
8587 | var i = 0, len = props.length, filteredProps = [];
|
8588 | for (i; i < len; i++) {
|
8589 | if (props[i].name && props[i].name.text === decoratorType) {
|
8590 | filteredProps.push(props[i]);
|
8591 | }
|
8592 | }
|
8593 | return filteredProps.map(function (x) { return _this.parseSymbols(x, srcFile, decoratorType); }).pop() || [];
|
8594 | };
|
8595 | SymbolHelper.prototype.getSymbolDepsRaw = function (props, type, multiLine) {
|
8596 | return props.filter(function (node) { return node.name.text === type; });
|
8597 | };
|
8598 | return SymbolHelper;
|
8599 | }());
|
8600 |
|
8601 | var ComponentHelper = /** @class */ (function () {
|
8602 | function ComponentHelper(classHelper, symbolHelper) {
|
8603 | if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
|
8604 | this.classHelper = classHelper;
|
8605 | this.symbolHelper = symbolHelper;
|
8606 | }
|
8607 | ComponentHelper.prototype.getComponentChangeDetection = function (props, srcFile) {
|
8608 | return this.symbolHelper.getSymbolDeps(props, 'changeDetection', srcFile).pop();
|
8609 | };
|
8610 | ComponentHelper.prototype.getComponentEncapsulation = function (props, srcFile) {
|
8611 | return this.symbolHelper.getSymbolDeps(props, 'encapsulation', srcFile);
|
8612 | };
|
8613 | ComponentHelper.prototype.getComponentPure = function (props, srcFile) {
|
8614 | return this.symbolHelper.getSymbolDeps(props, 'pure', srcFile).pop();
|
8615 | };
|
8616 | ComponentHelper.prototype.getComponentName = function (props, srcFile) {
|
8617 | return this.symbolHelper.getSymbolDeps(props, 'name', srcFile).pop();
|
8618 | };
|
8619 | ComponentHelper.prototype.getComponentExportAs = function (props, srcFile) {
|
8620 | return this.symbolHelper.getSymbolDeps(props, 'exportAs', srcFile).pop();
|
8621 | };
|
8622 | ComponentHelper.prototype.getComponentHost = function (props) {
|
8623 | return this.getSymbolDepsObject(props, 'host');
|
8624 | };
|
8625 | ComponentHelper.prototype.getComponentTag = function (props, srcFile) {
|
8626 | return this.symbolHelper.getSymbolDeps(props, 'tag', srcFile).pop();
|
8627 | };
|
8628 | ComponentHelper.prototype.getComponentInputsMetadata = function (props, srcFile) {
|
8629 | return this.symbolHelper.getSymbolDeps(props, 'inputs', srcFile);
|
8630 | };
|
8631 | ComponentHelper.prototype.getComponentTemplate = function (props, srcFile) {
|
8632 | var t = this.symbolHelper.getSymbolDeps(props, 'template', srcFile, true).pop();
|
8633 | if (t) {
|
8634 | t = detectIndent(t, 0);
|
8635 | t = t.replace(/\n/, '');
|
8636 | t = t.replace(/ +$/gm, '');
|
8637 | }
|
8638 | return t;
|
8639 | };
|
8640 | ComponentHelper.prototype.getComponentStyleUrls = function (props, srcFile) {
|
8641 | return this.symbolHelper.getSymbolDeps(props, 'styleUrls', srcFile);
|
8642 | };
|
8643 | ComponentHelper.prototype.getComponentStyleUrl = function (props, srcFile) {
|
8644 | return this.symbolHelper.getSymbolDeps(props, 'styleUrl', srcFile).pop();
|
8645 | };
|
8646 | ComponentHelper.prototype.getComponentShadow = function (props, srcFile) {
|
8647 | return this.symbolHelper.getSymbolDeps(props, 'shadow', srcFile).pop();
|
8648 | };
|
8649 | ComponentHelper.prototype.getComponentScoped = function (props, srcFile) {
|
8650 | return this.symbolHelper.getSymbolDeps(props, 'scoped', srcFile).pop();
|
8651 | };
|
8652 | ComponentHelper.prototype.getComponentAssetsDir = function (props, srcFile) {
|
8653 | return this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile).pop();
|
8654 | };
|
8655 | ComponentHelper.prototype.getComponentAssetsDirs = function (props, srcFile) {
|
8656 | return this.sanitizeUrls(this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile));
|
8657 | };
|
8658 | ComponentHelper.prototype.getComponentStyles = function (props, srcFile) {
|
8659 | return this.symbolHelper.getSymbolDeps(props, 'styles', srcFile);
|
8660 | };
|
8661 | ComponentHelper.prototype.getComponentModuleId = function (props, srcFile) {
|
8662 | return this.symbolHelper.getSymbolDeps(props, 'moduleId', srcFile).pop();
|
8663 | };
|
8664 | ComponentHelper.prototype.getComponentOutputs = function (props, srcFile) {
|
8665 | return this.symbolHelper.getSymbolDeps(props, 'outputs', srcFile);
|
8666 | };
|
8667 | ComponentHelper.prototype.getComponentProviders = function (props, srcFile) {
|
8668 | var _this = this;
|
8669 | return this.symbolHelper
|
8670 | .getSymbolDeps(props, 'providers', srcFile)
|
8671 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
8672 | };
|
8673 | ComponentHelper.prototype.getComponentEntryComponents = function (props, srcFile) {
|
8674 | var _this = this;
|
8675 | return this.symbolHelper
|
8676 | .getSymbolDeps(props, 'entryComponents', srcFile)
|
8677 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
8678 | };
|
8679 | ComponentHelper.prototype.getComponentViewProviders = function (props, srcFile) {
|
8680 | var _this = this;
|
8681 | return this.symbolHelper
|
8682 | .getSymbolDeps(props, 'viewProviders', srcFile)
|
8683 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
8684 | };
|
8685 | ComponentHelper.prototype.getComponentTemplateUrl = function (props, srcFile) {
|
8686 | return this.symbolHelper.getSymbolDeps(props, 'templateUrl', srcFile);
|
8687 | };
|
8688 | ComponentHelper.prototype.getComponentExampleUrls = function (text) {
|
8689 | var exampleUrlsMatches = text.match(/<example-url>(.*?)<\/example-url>/g);
|
8690 | var exampleUrls = undefined;
|
8691 | if (exampleUrlsMatches && exampleUrlsMatches.length) {
|
8692 | exampleUrls = exampleUrlsMatches.map(function (val) {
|
8693 | return val.replace(/<\/?example-url>/g, '');
|
8694 | });
|
8695 | }
|
8696 | return exampleUrls;
|
8697 | };
|
8698 | ComponentHelper.prototype.getComponentPreserveWhitespaces = function (props, srcFile) {
|
8699 | return this.symbolHelper.getSymbolDeps(props, 'preserveWhitespaces', srcFile).pop();
|
8700 | };
|
8701 | ComponentHelper.prototype.getComponentSelector = function (props, srcFile) {
|
8702 | return this.symbolHelper.getSymbolDeps(props, 'selector', srcFile).pop();
|
8703 | };
|
8704 | ComponentHelper.prototype.parseProperties = function (node) {
|
8705 | var obj = new Map();
|
8706 | var properties = node.initializer.properties || [];
|
8707 | properties.forEach(function (prop) {
|
8708 | obj.set(prop.name.text, prop.initializer.text);
|
8709 | });
|
8710 | return obj;
|
8711 | };
|
8712 | ComponentHelper.prototype.getSymbolDepsObject = function (props, type, multiLine) {
|
8713 | var _this = this;
|
8714 | var i = 0, len = props.length, filteredProps = [];
|
8715 | for (i; i < len; i++) {
|
8716 | if (props[i].name && props[i].name.text === type) {
|
8717 | filteredProps.push(props[i]);
|
8718 | }
|
8719 | }
|
8720 | return filteredProps.map(function (x) { return _this.parseProperties(x); }).pop();
|
8721 | };
|
8722 | ComponentHelper.prototype.getComponentIO = function (filename, sourceFile, node, fileBody) {
|
8723 | var _this = this;
|
8724 | /**
|
8725 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
8726 | */
|
8727 | var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
8728 | var res = reducedSource.reduce(function (directive, statement) {
|
8729 | if (tsMorph.ts.isClassDeclaration(statement)) {
|
8730 | if (statement.pos === node.pos && statement.end === node.end) {
|
8731 | return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
|
8732 | }
|
8733 | }
|
8734 | return directive;
|
8735 | }, []);
|
8736 | return res[0] || {};
|
8737 | };
|
8738 | ComponentHelper.prototype.sanitizeUrls = function (urls) {
|
8739 | return urls.map(function (url) { return url.replace('./', ''); });
|
8740 | };
|
8741 | return ComponentHelper;
|
8742 | }());
|
8743 | var ComponentCache = /** @class */ (function () {
|
8744 | function ComponentCache() {
|
8745 | this.cache = new Map();
|
8746 | }
|
8747 | ComponentCache.prototype.get = function (key) {
|
8748 | return this.cache.get(key);
|
8749 | };
|
8750 | ComponentCache.prototype.set = function (key, value) {
|
8751 | this.cache.set(key, value);
|
8752 | };
|
8753 | return ComponentCache;
|
8754 | }());
|
8755 |
|
8756 | var FrameworkDependencies = /** @class */ (function () {
|
8757 | function FrameworkDependencies(files, options) {
|
8758 | this.files = files;
|
8759 | var transpileOptions = {
|
8760 | target: tsMorph.ts.ScriptTarget.ES5,
|
8761 | module: tsMorph.ts.ModuleKind.CommonJS,
|
8762 | tsconfigDirectory: options.tsconfigDirectory,
|
8763 | allowJs: true
|
8764 | };
|
8765 | this.program = tsMorph.ts.createProgram(this.files, transpileOptions, compilerHost(transpileOptions));
|
8766 | this.typeChecker = this.program.getTypeChecker();
|
8767 | this.classHelper = new ClassHelper(this.typeChecker);
|
8768 | this.componentHelper = new ComponentHelper(this.classHelper);
|
8769 | }
|
8770 | return FrameworkDependencies;
|
8771 | }());
|
8772 |
|
8773 | var ExtendsMerger = /** @class */ (function () {
|
8774 | function ExtendsMerger() {
|
8775 | }
|
8776 | ExtendsMerger.getInstance = function () {
|
8777 | if (!ExtendsMerger.instance) {
|
8778 | ExtendsMerger.instance = new ExtendsMerger();
|
8779 | }
|
8780 | return ExtendsMerger.instance;
|
8781 | };
|
8782 | ExtendsMerger.prototype.merge = function (deps) {
|
8783 | var _this = this;
|
8784 | this.components = deps.components;
|
8785 | this.classes = deps.classes;
|
8786 | this.injectables = deps.injectables;
|
8787 | this.directives = deps.directives;
|
8788 | this.controllers = deps.controllers;
|
8789 | var mergeExtendedProperties = function (component) {
|
8790 | var ext;
|
8791 | if (typeof component["extends"] !== 'undefined') {
|
8792 | ext = _this.findInDependencies(component["extends"]);
|
8793 | if (ext) {
|
8794 | var recursiveScanWithInheritance_1 = function (cls) {
|
8795 | // From class to component
|
8796 | if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
|
8797 | var newMethods = _.cloneDeep(cls.methods);
|
8798 | newMethods = _this.markInheritance(newMethods, cls);
|
8799 | if (typeof component.methodsClass !== 'undefined') {
|
8800 | _this.mergeInheritance(component, 'methodsClass', newMethods);
|
8801 | }
|
8802 | }
|
8803 | if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
|
8804 | var newProperties = _.cloneDeep(cls.properties);
|
8805 | newProperties = _this.markInheritance(newProperties, cls);
|
8806 | if (typeof component.propertiesClass !== 'undefined') {
|
8807 | _this.mergeInheritance(component, 'propertiesClass', newProperties);
|
8808 | }
|
8809 | }
|
8810 | // From component to component or directive to component
|
8811 | if (typeof cls.inputsClass !== 'undefined' && cls.inputsClass.length > 0) {
|
8812 | var newInputs = _.cloneDeep(cls.inputsClass);
|
8813 | newInputs = _this.markInheritance(newInputs, cls);
|
8814 | if (typeof component.inputsClass !== 'undefined') {
|
8815 | _this.mergeInheritance(component, 'inputsClass', newInputs);
|
8816 | }
|
8817 | }
|
8818 | if (typeof cls.outputsClass !== 'undefined' &&
|
8819 | cls.outputsClass.length > 0) {
|
8820 | var newOutputs = _.cloneDeep(cls.outputsClass);
|
8821 | newOutputs = _this.markInheritance(newOutputs, cls);
|
8822 | if (typeof component.outputsClass !== 'undefined') {
|
8823 | _this.mergeInheritance(component, 'outputsClass', newOutputs);
|
8824 | }
|
8825 | }
|
8826 | if (typeof cls.methodsClass !== 'undefined' &&
|
8827 | cls.methodsClass.length > 0) {
|
8828 | var newMethods = _.cloneDeep(cls.methodsClass);
|
8829 | newMethods = _this.markInheritance(newMethods, cls);
|
8830 | if (typeof component.methodsClass !== 'undefined') {
|
8831 | _this.mergeInheritance(component, 'methodsClass', newMethods);
|
8832 | }
|
8833 | }
|
8834 | if (typeof cls.propertiesClass !== 'undefined' &&
|
8835 | cls.propertiesClass.length > 0) {
|
8836 | var newProperties = _.cloneDeep(cls.propertiesClass);
|
8837 | newProperties = _this.markInheritance(newProperties, cls);
|
8838 | if (typeof component.propertiesClass !== 'undefined') {
|
8839 | _this.mergeInheritance(component, 'propertiesClass', newProperties);
|
8840 | }
|
8841 | }
|
8842 | if (typeof cls.hostBindings !== 'undefined' &&
|
8843 | cls.hostBindings.length > 0) {
|
8844 | var newHostBindings = _.cloneDeep(cls.hostBindings);
|
8845 | newHostBindings = _this.markInheritance(newHostBindings, cls);
|
8846 | if (typeof component.hostBindings !== 'undefined') {
|
8847 | _this.mergeInheritance(component, 'hostBindings', newHostBindings);
|
8848 | }
|
8849 | }
|
8850 | if (typeof cls.hostListeners !== 'undefined' &&
|
8851 | cls.hostListeners.length > 0) {
|
8852 | var newHostListeners = _.cloneDeep(cls.hostListeners);
|
8853 | newHostListeners = _this.markInheritance(newHostListeners, cls);
|
8854 | if (typeof component.hostListeners !== 'undefined') {
|
8855 | _this.mergeInheritance(component, 'hostListeners', newHostListeners);
|
8856 | }
|
8857 | }
|
8858 | if (Configuration$1.mainData.disableLifeCycleHooks) {
|
8859 | component.methodsClass = cleanLifecycleHooksFromMethods(component.methodsClass);
|
8860 | }
|
8861 | if (cls["extends"]) {
|
8862 | recursiveScanWithInheritance_1(_this.findInDependencies(cls["extends"]));
|
8863 | }
|
8864 | };
|
8865 | // From class to class
|
8866 | recursiveScanWithInheritance_1(ext);
|
8867 | }
|
8868 | }
|
8869 | };
|
8870 | this.components.forEach(mergeExtendedProperties);
|
8871 | this.directives.forEach(mergeExtendedProperties);
|
8872 | this.controllers.forEach(mergeExtendedProperties);
|
8873 | var mergeExtendedClasses = function (el) {
|
8874 | var ext;
|
8875 | if (typeof el["extends"] !== 'undefined') {
|
8876 | ext = _this.findInDependencies(el["extends"]);
|
8877 | if (ext) {
|
8878 | var recursiveScanWithInheritance_2 = function (cls) {
|
8879 | if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
|
8880 | var newMethods = _.cloneDeep(cls.methods);
|
8881 | newMethods = _this.markInheritance(newMethods, cls);
|
8882 | if (typeof el.methods !== 'undefined') {
|
8883 | _this.mergeInheritance(el, 'methods', newMethods);
|
8884 | }
|
8885 | }
|
8886 | if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
|
8887 | var newProperties = _.cloneDeep(cls.properties);
|
8888 | newProperties = _this.markInheritance(newProperties, cls);
|
8889 | if (typeof el.properties !== 'undefined') {
|
8890 | _this.mergeInheritance(el, 'properties', newProperties);
|
8891 | }
|
8892 | }
|
8893 | if (cls["extends"]) {
|
8894 | recursiveScanWithInheritance_2(_this.findInDependencies(cls["extends"]));
|
8895 | }
|
8896 | };
|
8897 | // From elss to elss
|
8898 | recursiveScanWithInheritance_2(ext);
|
8899 | }
|
8900 | }
|
8901 | };
|
8902 | this.classes.forEach(mergeExtendedClasses);
|
8903 | this.injectables.forEach(mergeExtendedClasses);
|
8904 | this.directives.forEach(mergeExtendedClasses);
|
8905 | this.controllers.forEach(mergeExtendedClasses);
|
8906 | return deps;
|
8907 | };
|
8908 | ExtendsMerger.prototype.markInheritance = function (data, originalource) {
|
8909 | return data.map(function (el) {
|
8910 | var newElement = el;
|
8911 | newElement.inheritance = {
|
8912 | file: originalource.name
|
8913 | };
|
8914 | return newElement;
|
8915 | });
|
8916 | };
|
8917 | ExtendsMerger.prototype.mergeInheritance = function (component, metaPropertyId, newMembers) {
|
8918 | newMembers.forEach(function (newMember) {
|
8919 | var overriddenMethod = component[metaPropertyId].find(function (componentMember) { return componentMember.name === newMember.name; });
|
8920 | if (overriddenMethod) {
|
8921 | overriddenMethod.inheritance = newMember.inheritance;
|
8922 | }
|
8923 | else {
|
8924 | component[metaPropertyId].push(newMember);
|
8925 | }
|
8926 | });
|
8927 | };
|
8928 | ExtendsMerger.prototype.findInDependencies = function (name) {
|
8929 | var mergedData = _.concat([], this.components, this.classes, this.injectables, this.directives, this.controllers);
|
8930 | var result = _.find(mergedData, { name: name });
|
8931 | return result || false;
|
8932 | };
|
8933 | return ExtendsMerger;
|
8934 | }());
|
8935 | var ExtendsMerger$1 = ExtendsMerger.getInstance();
|
8936 |
|
8937 | var CodeGenerator = /** @class */ (function () {
|
8938 | function CodeGenerator() {
|
8939 | }
|
8940 | CodeGenerator.prototype.generate = function (node) {
|
8941 | return this.visitAndRecognize(node, []).join('');
|
8942 | };
|
8943 | CodeGenerator.prototype.visitAndRecognize = function (node, code, depth) {
|
8944 | var _this = this;
|
8945 | if (depth === void 0) { depth = 0; }
|
8946 | this.recognize(node, code);
|
8947 | node.getChildren().forEach(function (c) { return _this.visitAndRecognize(c, code, depth + 1); });
|
8948 | return code;
|
8949 | };
|
8950 | CodeGenerator.prototype.recognize = function (node, code) {
|
8951 | var _this = this;
|
8952 | var conversion = TsKindConversion.find(function (x) { return x.kinds.some(function (z) { return z === node.kind; }); });
|
8953 | if (conversion) {
|
8954 | var result = conversion.output(node);
|
8955 | result.forEach(function (text) { return _this.gen(text, code); });
|
8956 | }
|
8957 | };
|
8958 | CodeGenerator.prototype.gen = function (token, code) {
|
8959 | if (!token) {
|
8960 | return;
|
8961 | }
|
8962 | if (token === '\n') {
|
8963 | code.push('');
|
8964 | }
|
8965 | else {
|
8966 | code.push(token);
|
8967 | }
|
8968 | };
|
8969 | return CodeGenerator;
|
8970 | }());
|
8971 | var TsKindsToText = /** @class */ (function () {
|
8972 | function TsKindsToText(output, kinds) {
|
8973 | this.output = output;
|
8974 | this.kinds = kinds;
|
8975 | }
|
8976 | return TsKindsToText;
|
8977 | }());
|
8978 | var TsKindConversion = [
|
8979 | new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.FirstLiteralToken, tsMorph.SyntaxKind.Identifier]),
|
8980 | new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.StringLiteral]),
|
8981 | new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.ArrayLiteralExpression]),
|
8982 | new TsKindsToText(function (node) { return ['import', ' ']; }, [tsMorph.SyntaxKind.ImportKeyword]),
|
8983 | new TsKindsToText(function (node) { return ['from', ' ']; }, [tsMorph.SyntaxKind.FromKeyword]),
|
8984 | new TsKindsToText(function (node) { return ['\n', 'export', ' ']; }, [tsMorph.SyntaxKind.ExportKeyword]),
|
8985 | new TsKindsToText(function (node) { return ['class', ' ']; }, [tsMorph.SyntaxKind.ClassKeyword]),
|
8986 | new TsKindsToText(function (node) { return ['this']; }, [tsMorph.SyntaxKind.ThisKeyword]),
|
8987 | new TsKindsToText(function (node) { return ['constructor']; }, [tsMorph.SyntaxKind.ConstructorKeyword]),
|
8988 | new TsKindsToText(function (node) { return ['false']; }, [tsMorph.SyntaxKind.FalseKeyword]),
|
8989 | new TsKindsToText(function (node) { return ['true']; }, [tsMorph.SyntaxKind.TrueKeyword]),
|
8990 | new TsKindsToText(function (node) { return ['null']; }, [tsMorph.SyntaxKind.NullKeyword]),
|
8991 | new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.AtToken]),
|
8992 | new TsKindsToText(function (node) { return ['+']; }, [tsMorph.SyntaxKind.PlusToken]),
|
8993 | new TsKindsToText(function (node) { return [' => ']; }, [tsMorph.SyntaxKind.EqualsGreaterThanToken]),
|
8994 | new TsKindsToText(function (node) { return ['(']; }, [tsMorph.SyntaxKind.OpenParenToken]),
|
8995 | new TsKindsToText(function (node) { return ['{', ' ']; }, [tsMorph.SyntaxKind.ImportClause, tsMorph.SyntaxKind.ObjectLiteralExpression]),
|
8996 | new TsKindsToText(function (node) { return ['{', '\n']; }, [tsMorph.SyntaxKind.Block]),
|
8997 | new TsKindsToText(function (node) { return ['}']; }, [tsMorph.SyntaxKind.CloseBraceToken]),
|
8998 | new TsKindsToText(function (node) { return [')']; }, [tsMorph.SyntaxKind.CloseParenToken]),
|
8999 | new TsKindsToText(function (node) { return ['[']; }, [tsMorph.SyntaxKind.OpenBracketToken]),
|
9000 | new TsKindsToText(function (node) { return [']']; }, [tsMorph.SyntaxKind.CloseBracketToken]),
|
9001 | new TsKindsToText(function (node) { return [';', '\n']; }, [tsMorph.SyntaxKind.SemicolonToken]),
|
9002 | new TsKindsToText(function (node) { return [',', ' ']; }, [tsMorph.SyntaxKind.CommaToken]),
|
9003 | new TsKindsToText(function (node) { return [' ', ':', ' ']; }, [tsMorph.SyntaxKind.ColonToken]),
|
9004 | new TsKindsToText(function (node) { return ['.']; }, [tsMorph.SyntaxKind.DotToken]),
|
9005 | new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.DoStatement]),
|
9006 | new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.Decorator]),
|
9007 | new TsKindsToText(function (node) { return [' = ']; }, [tsMorph.SyntaxKind.FirstAssignment]),
|
9008 | new TsKindsToText(function (node) { return [' ']; }, [tsMorph.SyntaxKind.FirstPunctuation]),
|
9009 | new TsKindsToText(function (node) { return ['private', ' ']; }, [tsMorph.SyntaxKind.PrivateKeyword]),
|
9010 | new TsKindsToText(function (node) { return ['public', ' ']; }, [tsMorph.SyntaxKind.PublicKeyword])
|
9011 | ];
|
9012 |
|
9013 | var crypto$6 = require('crypto');
|
9014 | var ComponentDepFactory = /** @class */ (function () {
|
9015 | function ComponentDepFactory(helper) {
|
9016 | this.helper = helper;
|
9017 | }
|
9018 | ComponentDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
|
9019 | // console.log(util.inspect(props, { showHidden: true, depth: 10 }));
|
9020 | var sourceCode = srcFile.getText();
|
9021 | var hash = crypto$6.createHash('sha512').update(sourceCode).digest('hex');
|
9022 | var componentDep = {
|
9023 | name: name,
|
9024 | id: 'component-' + name + '-' + hash,
|
9025 | file: file,
|
9026 | // animations?: string[]; // TODO
|
9027 | changeDetection: this.helper.getComponentChangeDetection(props, srcFile),
|
9028 | encapsulation: this.helper.getComponentEncapsulation(props, srcFile),
|
9029 | entryComponents: this.helper.getComponentEntryComponents(props, srcFile),
|
9030 | exportAs: this.helper.getComponentExportAs(props, srcFile),
|
9031 | host: this.helper.getComponentHost(props),
|
9032 | inputs: this.helper.getComponentInputsMetadata(props, srcFile),
|
9033 | // interpolation?: string; // TODO waiting doc infos
|
9034 | moduleId: this.helper.getComponentModuleId(props, srcFile),
|
9035 | outputs: this.helper.getComponentOutputs(props, srcFile),
|
9036 | providers: this.helper.getComponentProviders(props, srcFile),
|
9037 | // queries?: Deps[]; // TODO
|
9038 | selector: this.helper.getComponentSelector(props, srcFile),
|
9039 | styleUrls: this.helper.getComponentStyleUrls(props, srcFile),
|
9040 | styles: this.helper.getComponentStyles(props, srcFile),
|
9041 | template: this.helper.getComponentTemplate(props, srcFile),
|
9042 | templateUrl: this.helper.getComponentTemplateUrl(props, srcFile),
|
9043 | viewProviders: this.helper.getComponentViewProviders(props, srcFile),
|
9044 | inputsClass: IO.inputs,
|
9045 | outputsClass: IO.outputs,
|
9046 | propertiesClass: IO.properties,
|
9047 | methodsClass: IO.methods,
|
9048 | deprecated: IO.deprecated,
|
9049 | deprecationMessage: IO.deprecationMessage,
|
9050 | hostBindings: IO.hostBindings,
|
9051 | hostListeners: IO.hostListeners,
|
9052 | description: IO.description,
|
9053 | rawdescription: IO.rawdescription,
|
9054 | type: 'component',
|
9055 | sourceCode: srcFile.getText(),
|
9056 | exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText()),
|
9057 | tag: this.helper.getComponentTag(props, srcFile),
|
9058 | styleUrl: this.helper.getComponentStyleUrl(props, srcFile),
|
9059 | shadow: this.helper.getComponentShadow(props, srcFile),
|
9060 | scoped: this.helper.getComponentScoped(props, srcFile),
|
9061 | assetsDir: this.helper.getComponentAssetsDir(props, srcFile),
|
9062 | assetsDirs: this.helper.getComponentAssetsDirs(props, srcFile),
|
9063 | styleUrlsData: '',
|
9064 | stylesData: ''
|
9065 | };
|
9066 | if (typeof this.helper.getComponentPreserveWhitespaces(props, srcFile) !== 'undefined') {
|
9067 | componentDep.preserveWhitespaces = this.helper.getComponentPreserveWhitespaces(props, srcFile);
|
9068 | }
|
9069 | if (Configuration$1.mainData.disableLifeCycleHooks) {
|
9070 | componentDep.methodsClass = cleanLifecycleHooksFromMethods(componentDep.methodsClass);
|
9071 | }
|
9072 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
9073 | componentDep.jsdoctags = IO.jsdoctags[0].tags;
|
9074 | }
|
9075 | if (IO.constructor) {
|
9076 | componentDep.constructorObj = IO.constructor;
|
9077 | }
|
9078 | if (IO["extends"]) {
|
9079 | componentDep["extends"] = IO["extends"];
|
9080 | }
|
9081 | if (IO.implements && IO.implements.length > 0) {
|
9082 | componentDep.implements = IO.implements;
|
9083 | }
|
9084 | if (IO.accessors) {
|
9085 | componentDep.accessors = IO.accessors;
|
9086 | }
|
9087 | return componentDep;
|
9088 | };
|
9089 | return ComponentDepFactory;
|
9090 | }());
|
9091 |
|
9092 | var crypto$5 = require('crypto');
|
9093 | var ControllerDepFactory = /** @class */ (function () {
|
9094 | function ControllerDepFactory() {
|
9095 | }
|
9096 | ControllerDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
9097 | var sourceCode = srcFile.getText();
|
9098 | var hash = crypto$5.createHash('sha512').update(sourceCode).digest('hex');
|
9099 | var infos = {
|
9100 | name: name,
|
9101 | id: 'controller-' + name + '-' + hash,
|
9102 | file: file,
|
9103 | methodsClass: IO.methods,
|
9104 | type: 'controller',
|
9105 | description: IO.description,
|
9106 | rawdescription: IO.rawdescription,
|
9107 | sourceCode: srcFile.text,
|
9108 | deprecated: IO.deprecated,
|
9109 | deprecationMessage: IO.deprecationMessage
|
9110 | };
|
9111 | if (properties && properties.length === 1) {
|
9112 | if (properties[0].text) {
|
9113 | infos.prefix = properties[0].text;
|
9114 | }
|
9115 | }
|
9116 | if (IO["extends"]) {
|
9117 | infos["extends"] = IO["extends"];
|
9118 | }
|
9119 | return infos;
|
9120 | };
|
9121 | return ControllerDepFactory;
|
9122 | }());
|
9123 |
|
9124 | var crypto$4 = require('crypto');
|
9125 | var DirectiveDepFactory = /** @class */ (function () {
|
9126 | function DirectiveDepFactory(helper) {
|
9127 | this.helper = helper;
|
9128 | }
|
9129 | DirectiveDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
|
9130 | var sourceCode = srcFile.getText();
|
9131 | var hash = crypto$4.createHash('sha512').update(sourceCode).digest('hex');
|
9132 | var directiveDeps = {
|
9133 | name: name,
|
9134 | id: 'directive-' + name + '-' + hash,
|
9135 | file: file,
|
9136 | type: 'directive',
|
9137 | description: IO.description,
|
9138 | rawdescription: IO.rawdescription,
|
9139 | sourceCode: srcFile.getText(),
|
9140 | selector: this.helper.getComponentSelector(props, srcFile),
|
9141 | providers: this.helper.getComponentProviders(props, srcFile),
|
9142 | inputsClass: IO.inputs,
|
9143 | outputsClass: IO.outputs,
|
9144 | deprecated: IO.deprecated,
|
9145 | deprecationMessage: IO.deprecationMessage,
|
9146 | hostBindings: IO.hostBindings,
|
9147 | hostListeners: IO.hostListeners,
|
9148 | propertiesClass: IO.properties,
|
9149 | methodsClass: IO.methods,
|
9150 | exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
|
9151 | };
|
9152 | if (Configuration$1.mainData.disableLifeCycleHooks) {
|
9153 | directiveDeps.methodsClass = cleanLifecycleHooksFromMethods(directiveDeps.methodsClass);
|
9154 | }
|
9155 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
9156 | directiveDeps.jsdoctags = IO.jsdoctags[0].tags;
|
9157 | }
|
9158 | if (IO["extends"]) {
|
9159 | directiveDeps["extends"] = IO["extends"];
|
9160 | }
|
9161 | if (IO.implements && IO.implements.length > 0) {
|
9162 | directiveDeps.implements = IO.implements;
|
9163 | }
|
9164 | if (IO.constructor) {
|
9165 | directiveDeps.constructorObj = IO.constructor;
|
9166 | }
|
9167 | if (IO.accessors) {
|
9168 | directiveDeps.accessors = IO.accessors;
|
9169 | }
|
9170 | return directiveDeps;
|
9171 | };
|
9172 | return DirectiveDepFactory;
|
9173 | }());
|
9174 |
|
9175 | var JsDocHelper = /** @class */ (function () {
|
9176 | function JsDocHelper() {
|
9177 | }
|
9178 | JsDocHelper.prototype.hasJSDocInternalTag = function (filename, sourceFile, node) {
|
9179 | if (typeof sourceFile.statements !== 'undefined') {
|
9180 | return this.checkStatements(sourceFile.statements, node);
|
9181 | }
|
9182 | return false;
|
9183 | };
|
9184 | JsDocHelper.prototype.checkStatements = function (statements, node) {
|
9185 | var _this = this;
|
9186 | return statements.some(function (x) { return _this.checkStatement(x, node); });
|
9187 | };
|
9188 | JsDocHelper.prototype.checkStatement = function (statement, node) {
|
9189 | if (statement.pos === node.pos && statement.end === node.end) {
|
9190 | if (node.jsDoc && node.jsDoc.length > 0) {
|
9191 | return this.checkJsDocs(node.jsDoc);
|
9192 | }
|
9193 | }
|
9194 | return false;
|
9195 | };
|
9196 | JsDocHelper.prototype.checkJsDocs = function (jsDocs) {
|
9197 | var _this = this;
|
9198 | return jsDocs
|
9199 | .filter(function (x) { return x.tags && x.tags.length > 0; })
|
9200 | .some(function (x) { return _this.checkJsDocTags(x.tags); });
|
9201 | };
|
9202 | JsDocHelper.prototype.checkJsDocTags = function (tags) {
|
9203 | return tags.some(function (x) { return x.tagName && x.tagName.text === 'internal'; });
|
9204 | };
|
9205 | return JsDocHelper;
|
9206 | }());
|
9207 |
|
9208 | var ModuleHelper = /** @class */ (function () {
|
9209 | function ModuleHelper(cache, symbolHelper) {
|
9210 | if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
|
9211 | this.cache = cache;
|
9212 | this.symbolHelper = symbolHelper;
|
9213 | }
|
9214 | ModuleHelper.prototype.getModuleProviders = function (props, srcFile) {
|
9215 | var _this = this;
|
9216 | return this.symbolHelper
|
9217 | .getSymbolDeps(props, 'providers', srcFile)
|
9218 | .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
|
9219 | };
|
9220 | ModuleHelper.prototype.getModuleControllers = function (props, srcFile) {
|
9221 | var _this = this;
|
9222 | return this.symbolHelper
|
9223 | .getSymbolDeps(props, 'controllers', srcFile)
|
9224 | .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
|
9225 | };
|
9226 | ModuleHelper.prototype.getModuleDeclarations = function (props, srcFile) {
|
9227 | var _this = this;
|
9228 | return this.symbolHelper.getSymbolDeps(props, 'declarations', srcFile).map(function (name) {
|
9229 | var component = _this.cache.get(name);
|
9230 | if (component) {
|
9231 | return component;
|
9232 | }
|
9233 | return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
|
9234 | });
|
9235 | };
|
9236 | ModuleHelper.prototype.getModuleEntryComponents = function (props, srcFile) {
|
9237 | var _this = this;
|
9238 | return this.symbolHelper.getSymbolDeps(props, 'entryComponents', srcFile).map(function (name) {
|
9239 | var component = _this.cache.get(name);
|
9240 | if (component) {
|
9241 | return component;
|
9242 | }
|
9243 | return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
|
9244 | });
|
9245 | };
|
9246 | ModuleHelper.prototype.cleanImportForRootForChild = function (name) {
|
9247 | var nsModule = name.split('.');
|
9248 | if (nsModule.length > 0) {
|
9249 | name = nsModule[0];
|
9250 | }
|
9251 | return name;
|
9252 | };
|
9253 | ModuleHelper.prototype.getModuleImports = function (props, srcFile) {
|
9254 | var _this = this;
|
9255 | return this.symbolHelper
|
9256 | .getSymbolDeps(props, 'imports', srcFile)
|
9257 | .map(function (name) { return _this.cleanImportForRootForChild(name); })
|
9258 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
9259 | };
|
9260 | ModuleHelper.prototype.getModuleExports = function (props, srcFile) {
|
9261 | var _this = this;
|
9262 | return this.symbolHelper
|
9263 | .getSymbolDeps(props, 'exports', srcFile)
|
9264 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
|
9265 | };
|
9266 | ModuleHelper.prototype.getModuleImportsRaw = function (props, srcFile) {
|
9267 | return this.symbolHelper.getSymbolDepsRaw(props, 'imports');
|
9268 | };
|
9269 | ModuleHelper.prototype.getModuleId = function (props, srcFile) {
|
9270 | var _id = this.symbolHelper.getSymbolDeps(props, 'id', srcFile), id;
|
9271 | if (_id.length === 1) {
|
9272 | id = _id[0];
|
9273 | }
|
9274 | return id;
|
9275 | };
|
9276 | ModuleHelper.prototype.getModuleSchemas = function (props, srcFile) {
|
9277 | var schemas = this.symbolHelper.getSymbolDeps(props, 'schemas', srcFile);
|
9278 | return schemas;
|
9279 | };
|
9280 | ModuleHelper.prototype.getModuleBootstrap = function (props, srcFile) {
|
9281 | var _this = this;
|
9282 | return this.symbolHelper
|
9283 | .getSymbolDeps(props, 'bootstrap', srcFile)
|
9284 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
|
9285 | };
|
9286 | return ModuleHelper;
|
9287 | }());
|
9288 |
|
9289 | var crypto$3 = require('crypto');
|
9290 | var ModuleDepFactory = /** @class */ (function () {
|
9291 | function ModuleDepFactory(moduleHelper) {
|
9292 | this.moduleHelper = moduleHelper;
|
9293 | }
|
9294 | ModuleDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
9295 | var sourceCode = srcFile.getText();
|
9296 | var hash = crypto$3.createHash('sha512').update(sourceCode).digest('hex');
|
9297 | return {
|
9298 | name: name,
|
9299 | id: 'module-' + name + '-' + hash,
|
9300 | file: file,
|
9301 | ngid: this.moduleHelper.getModuleId(properties, srcFile),
|
9302 | providers: this.moduleHelper.getModuleProviders(properties, srcFile),
|
9303 | declarations: this.moduleHelper.getModuleDeclarations(properties, srcFile),
|
9304 | controllers: this.moduleHelper.getModuleControllers(properties, srcFile),
|
9305 | entryComponents: this.moduleHelper.getModuleEntryComponents(properties, srcFile),
|
9306 | imports: this.moduleHelper.getModuleImports(properties, srcFile),
|
9307 | exports: this.moduleHelper.getModuleExports(properties, srcFile),
|
9308 | schemas: this.moduleHelper.getModuleSchemas(properties, srcFile),
|
9309 | bootstrap: this.moduleHelper.getModuleBootstrap(properties, srcFile),
|
9310 | type: 'module',
|
9311 | rawdescription: IO.rawdescription,
|
9312 | methods: IO.methods,
|
9313 | description: IO.description,
|
9314 | sourceCode: srcFile.text,
|
9315 | deprecated: IO.deprecated,
|
9316 | deprecationMessage: IO.deprecationMessage
|
9317 | };
|
9318 | };
|
9319 | return ModuleDepFactory;
|
9320 | }());
|
9321 |
|
9322 | var crypto$2 = require('crypto');
|
9323 | var EntityDepFactory = /** @class */ (function () {
|
9324 | function EntityDepFactory() {
|
9325 | }
|
9326 | EntityDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
9327 | var sourceCode = srcFile.getText();
|
9328 | var hash = crypto$2.createHash('sha512').update(sourceCode).digest('hex');
|
9329 | var infos = {
|
9330 | name: name,
|
9331 | id: 'controller-' + name + '-' + hash,
|
9332 | file: file,
|
9333 | type: 'entity',
|
9334 | description: IO.description,
|
9335 | rawdescription: IO.rawdescription,
|
9336 | sourceCode: srcFile.text,
|
9337 | deprecated: IO.deprecated,
|
9338 | deprecationMessage: IO.deprecationMessage,
|
9339 | properties: IO.properties
|
9340 | };
|
9341 | return infos;
|
9342 | };
|
9343 | return EntityDepFactory;
|
9344 | }());
|
9345 |
|
9346 | var crypto$1 = require('crypto');
|
9347 | var marked$1 = require('marked').marked;
|
9348 | var ast = new tsMorph.Project();
|
9349 | // TypeScript reference : https://github.com/Microsoft/TypeScript/blob/master/lib/typescript.d.ts
|
9350 | var AngularDependencies = /** @class */ (function (_super) {
|
9351 | __extends(AngularDependencies, _super);
|
9352 | function AngularDependencies(files, options) {
|
9353 | var _this = _super.call(this, files, options) || this;
|
9354 | _this.cache = new ComponentCache();
|
9355 | _this.moduleHelper = new ModuleHelper(_this.cache);
|
9356 | _this.jsDocHelper = new JsDocHelper();
|
9357 | _this.symbolHelper = new SymbolHelper();
|
9358 | _this.jsdocParserUtil = new JsdocParserUtil();
|
9359 | return _this;
|
9360 | }
|
9361 | AngularDependencies.prototype.getDependencies = function () {
|
9362 | var _this = this;
|
9363 | var deps = {
|
9364 | modules: [],
|
9365 | modulesForGraph: [],
|
9366 | components: [],
|
9367 | controllers: [],
|
9368 | entities: [],
|
9369 | injectables: [],
|
9370 | interceptors: [],
|
9371 | guards: [],
|
9372 | pipes: [],
|
9373 | directives: [],
|
9374 | routes: [],
|
9375 | classes: [],
|
9376 | interfaces: [],
|
9377 | miscellaneous: {
|
9378 | variables: [],
|
9379 | functions: [],
|
9380 | typealiases: [],
|
9381 | enumerations: []
|
9382 | },
|
9383 | routesTree: undefined
|
9384 | };
|
9385 | var sourceFiles = this.program.getSourceFiles() || [];
|
9386 | sourceFiles.map(function (file) {
|
9387 | var filePath = file.fileName;
|
9388 | if (path__namespace.extname(filePath) === '.ts' || path__namespace.extname(filePath) === '.tsx') {
|
9389 | if (!Configuration$1.mainData.angularJSProject && path__namespace.extname(filePath) === '.js') {
|
9390 | logger.info('parsing', filePath);
|
9391 | _this.getSourceFileDecorators(file, deps);
|
9392 | }
|
9393 | else {
|
9394 | if (filePath.lastIndexOf('.d.ts') === -1 &&
|
9395 | filePath.lastIndexOf('spec.ts') === -1) {
|
9396 | logger.info('parsing', filePath);
|
9397 | _this.getSourceFileDecorators(file, deps);
|
9398 | }
|
9399 | }
|
9400 | }
|
9401 | return deps;
|
9402 | });
|
9403 | // End of file scanning
|
9404 | // Try merging inside the same file declarated variables & modules with imports | exports | declarations | providers
|
9405 | if (deps.miscellaneous.variables.length > 0) {
|
9406 | deps.miscellaneous.variables.forEach(function (_variable) {
|
9407 | var newVar = [];
|
9408 | // link ...VAR to VAR values, recursively
|
9409 | (function (_var, _newVar) {
|
9410 | // getType pr reconstruire....
|
9411 | var elementsMatcher = function (variabelToReplace) {
|
9412 | if (variabelToReplace.initializer) {
|
9413 | if (variabelToReplace.initializer.elements) {
|
9414 | if (variabelToReplace.initializer.elements.length > 0) {
|
9415 | variabelToReplace.initializer.elements.forEach(function (element) {
|
9416 | // Direct value -> Kind 79
|
9417 | if (element.text &&
|
9418 | element.kind === tsMorph.SyntaxKind.Identifier) {
|
9419 | newVar.push({
|
9420 | name: element.text,
|
9421 | type: _this.symbolHelper.getType(element.text)
|
9422 | });
|
9423 | }
|
9424 | // if _variable is ArrayLiteralExpression 203
|
9425 | // and has SpreadElements in his elements
|
9426 | // merge them
|
9427 | if (element.kind === tsMorph.SyntaxKind.SpreadElement &&
|
9428 | element.expression) {
|
9429 | var el = deps.miscellaneous.variables.find(function (variable) {
|
9430 | return variable.name === element.expression.text;
|
9431 | });
|
9432 | if (el) {
|
9433 | elementsMatcher(el);
|
9434 | }
|
9435 | }
|
9436 | });
|
9437 | }
|
9438 | }
|
9439 | }
|
9440 | };
|
9441 | elementsMatcher(_var);
|
9442 | })(_variable);
|
9443 | var onLink = function (mod) {
|
9444 | var process = function (initialArray, _var) {
|
9445 | var indexToClean = 0;
|
9446 | var found = false;
|
9447 | var findVariableInArray = function (el, index) {
|
9448 | if (el.name === _var.name) {
|
9449 | indexToClean = index;
|
9450 | found = true;
|
9451 | }
|
9452 | };
|
9453 | initialArray.forEach(findVariableInArray);
|
9454 | // Clean indexes to replace
|
9455 | if (found) {
|
9456 | initialArray.splice(indexToClean, 1);
|
9457 | // Add variable
|
9458 | newVar.forEach(function (newEle) {
|
9459 | if (typeof ___namespace.find(initialArray, { name: newEle.name }) ===
|
9460 | 'undefined') {
|
9461 | initialArray.push(newEle);
|
9462 | }
|
9463 | });
|
9464 | }
|
9465 | };
|
9466 | process(mod.imports, _variable);
|
9467 | process(mod.exports, _variable);
|
9468 | process(mod.controllers, _variable);
|
9469 | process(mod.declarations, _variable);
|
9470 | process(mod.providers, _variable);
|
9471 | };
|
9472 | deps.modules.forEach(onLink);
|
9473 | deps.modulesForGraph.forEach(onLink);
|
9474 | });
|
9475 | }
|
9476 | /**
|
9477 | * If one thing extends another, merge them, only for internal sources
|
9478 | * - classes
|
9479 | * - components
|
9480 | * - injectables
|
9481 | * - directives
|
9482 | * for
|
9483 | * - inputs
|
9484 | * - outputs
|
9485 | * - properties
|
9486 | * - methods
|
9487 | */
|
9488 | deps = ExtendsMerger$1.merge(deps);
|
9489 | // RouterParserUtil.printModulesRoutes();
|
9490 | // RouterParserUtil.printRoutes();
|
9491 | if (!Configuration$1.mainData.disableRoutesGraph) {
|
9492 | RouterParserUtil$1.linkModulesAndRoutes();
|
9493 | RouterParserUtil$1.constructModulesTree();
|
9494 | deps.routesTree = RouterParserUtil$1.constructRoutesTree();
|
9495 | }
|
9496 | return deps;
|
9497 | };
|
9498 | AngularDependencies.prototype.processClass = function (node, file, srcFile, outputSymbols, fileBody) {
|
9499 | var name = this.getSymboleName(node);
|
9500 | var IO = this.getClassIO(file, srcFile, node, fileBody);
|
9501 | var sourceCode = srcFile.getText();
|
9502 | var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
|
9503 | var deps = {
|
9504 | name: name,
|
9505 | id: 'class-' + name + '-' + hash,
|
9506 | file: file,
|
9507 | deprecated: IO.deprecated,
|
9508 | deprecationMessage: IO.deprecationMessage,
|
9509 | type: 'class',
|
9510 | sourceCode: srcFile.getText()
|
9511 | };
|
9512 | var excludeFromClassArray = false;
|
9513 | if (IO.constructor) {
|
9514 | deps.constructorObj = IO.constructor;
|
9515 | }
|
9516 | if (IO.properties) {
|
9517 | deps.properties = IO.properties;
|
9518 | }
|
9519 | if (IO.description) {
|
9520 | deps.description = IO.description;
|
9521 | }
|
9522 | if (IO.rawdescription) {
|
9523 | deps.rawdescription = IO.rawdescription;
|
9524 | }
|
9525 | if (IO.methods) {
|
9526 | deps.methods = IO.methods;
|
9527 | }
|
9528 | if (IO.indexSignatures) {
|
9529 | deps.indexSignatures = IO.indexSignatures;
|
9530 | }
|
9531 | if (IO["extends"]) {
|
9532 | deps["extends"] = IO["extends"];
|
9533 | }
|
9534 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
9535 | deps.jsdoctags = IO.jsdoctags[0].tags;
|
9536 | }
|
9537 | if (IO.accessors) {
|
9538 | deps.accessors = IO.accessors;
|
9539 | }
|
9540 | if (IO.inputs) {
|
9541 | deps.inputsClass = IO.inputs;
|
9542 | }
|
9543 | if (IO.outputs) {
|
9544 | deps.outputsClass = IO.outputs;
|
9545 | }
|
9546 | if (IO.hostBindings) {
|
9547 | deps.hostBindings = IO.hostBindings;
|
9548 | }
|
9549 | if (IO.hostListeners) {
|
9550 | deps.hostListeners = IO.hostListeners;
|
9551 | }
|
9552 | if (Configuration$1.mainData.disableLifeCycleHooks) {
|
9553 | deps.methods = cleanLifecycleHooksFromMethods(deps.methods);
|
9554 | }
|
9555 | if (IO.implements && IO.implements.length > 0) {
|
9556 | deps.implements = IO.implements;
|
9557 | if (this.isGuard(IO.implements)) {
|
9558 | // We don't want the Guard to show up in the Classes menu
|
9559 | excludeFromClassArray = true;
|
9560 | deps.type = 'guard';
|
9561 | outputSymbols.guards.push(deps);
|
9562 | }
|
9563 | }
|
9564 | if (typeof IO.ignore === 'undefined') {
|
9565 | this.debug(deps);
|
9566 | if (!excludeFromClassArray) {
|
9567 | outputSymbols.classes.push(deps);
|
9568 | }
|
9569 | }
|
9570 | else {
|
9571 | this.ignore(deps);
|
9572 | }
|
9573 | };
|
9574 | AngularDependencies.prototype.getSourceFileDecorators = function (initialSrcFile, outputSymbols) {
|
9575 | var _this = this;
|
9576 | var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
|
9577 | var fileName = initialSrcFile.fileName.replace(cleaner, '');
|
9578 | var scannedFile = initialSrcFile;
|
9579 | // Search in file for variable statement as routes definitions
|
9580 | var astFile = typeof ast.getSourceFile(initialSrcFile.fileName) !== 'undefined'
|
9581 | ? ast.getSourceFile(initialSrcFile.fileName)
|
9582 | : ast.addSourceFileAtPath(initialSrcFile.fileName);
|
9583 | var variableRoutesStatements = astFile.getVariableStatements();
|
9584 | var hasRoutesStatements = false;
|
9585 | if (variableRoutesStatements.length > 0) {
|
9586 | // Clean file for spread and dynamics inside routes definitions
|
9587 | variableRoutesStatements.forEach(function (s) {
|
9588 | var variableDeclarations = s.getDeclarations();
|
9589 | var len = variableDeclarations.length;
|
9590 | var i = 0;
|
9591 | for (i; i < len; i++) {
|
9592 | if (variableDeclarations[i].compilerNode.type) {
|
9593 | if (variableDeclarations[i].compilerNode.type.typeName &&
|
9594 | variableDeclarations[i].compilerNode.type.typeName.text === 'Routes') {
|
9595 | hasRoutesStatements = true;
|
9596 | }
|
9597 | }
|
9598 | }
|
9599 | });
|
9600 | }
|
9601 | if (hasRoutesStatements && !Configuration$1.mainData.disableRoutesGraph) {
|
9602 | // Clean file for spread and dynamics inside routes definitions
|
9603 | logger.info('Analysing routes definitions and clean them if necessary');
|
9604 | // scannedFile = RouterParserUtil.cleanFileIdentifiers(astFile).compilerNode;
|
9605 | RouterParserUtil$1.cleanFileSpreads(astFile);
|
9606 | scannedFile = RouterParserUtil$1.cleanCallExpressions(astFile).compilerNode;
|
9607 | scannedFile = RouterParserUtil$1.cleanFileDynamics(astFile).compilerNode;
|
9608 | scannedFile.kind = tsMorph.SyntaxKind.SourceFile;
|
9609 | }
|
9610 | tsMorph.ts.forEachChild(scannedFile, function (initialNode) {
|
9611 | if (_this.jsDocHelper.hasJSDocInternalTag(fileName, scannedFile, initialNode) &&
|
9612 | Configuration$1.mainData.disableInternal) {
|
9613 | return;
|
9614 | }
|
9615 | var parseNode = function (file, srcFile, node, fileBody) {
|
9616 | var sourceCode = srcFile.getText();
|
9617 | var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
|
9618 | if (node.decorators) {
|
9619 | var classWithCustomDecorator_1 = false;
|
9620 | var visitDecorator = function (visitedDecorator, index) {
|
9621 | var deps;
|
9622 | var name = _this.getSymboleName(node);
|
9623 | var props = _this.findProperties(visitedDecorator, srcFile);
|
9624 | var IO = _this.componentHelper.getComponentIO(file, srcFile, node, fileBody);
|
9625 | if (_this.isModule(visitedDecorator)) {
|
9626 | var moduleDep = new ModuleDepFactory(_this.moduleHelper).create(file, srcFile, name, props, IO);
|
9627 | if (RouterParserUtil$1.hasRouterModuleInImports(moduleDep.imports)) {
|
9628 | RouterParserUtil$1.addModuleWithRoutes(name, _this.moduleHelper.getModuleImportsRaw(props, srcFile), file);
|
9629 | }
|
9630 | deps = moduleDep;
|
9631 | if (typeof IO.ignore === 'undefined') {
|
9632 | RouterParserUtil$1.addModule(name, moduleDep.imports);
|
9633 | outputSymbols.modules.push(moduleDep);
|
9634 | outputSymbols.modulesForGraph.push(moduleDep);
|
9635 | }
|
9636 | }
|
9637 | else if (_this.isComponent(visitedDecorator)) {
|
9638 | if (props.length === 0) {
|
9639 | return;
|
9640 | }
|
9641 | var componentDep = new ComponentDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
|
9642 | deps = componentDep;
|
9643 | if (typeof IO.ignore === 'undefined') {
|
9644 | ComponentsTreeEngine$1.addComponent(componentDep);
|
9645 | outputSymbols.components.push(componentDep);
|
9646 | }
|
9647 | }
|
9648 | else if (_this.isController(visitedDecorator)) {
|
9649 | var controllerDep = new ControllerDepFactory().create(file, srcFile, name, props, IO);
|
9650 | deps = controllerDep;
|
9651 | if (typeof IO.ignore === 'undefined') {
|
9652 | outputSymbols.controllers.push(controllerDep);
|
9653 | }
|
9654 | }
|
9655 | else if (_this.isEntity(visitedDecorator)) {
|
9656 | var entityDep = new EntityDepFactory().create(file, srcFile, name, props, IO);
|
9657 | deps = entityDep;
|
9658 | if (deps.name === 'Comment') {
|
9659 | console.log(deps.properties[0]);
|
9660 | }
|
9661 | if (typeof IO.ignore === 'undefined') {
|
9662 | outputSymbols.entities.push(entityDep);
|
9663 | }
|
9664 | }
|
9665 | else if (_this.isInjectable(visitedDecorator)) {
|
9666 | var injectableDeps = {
|
9667 | name: name,
|
9668 | id: 'injectable-' + name + '-' + hash,
|
9669 | file: file,
|
9670 | properties: IO.properties,
|
9671 | methods: IO.methods,
|
9672 | deprecated: IO.deprecated,
|
9673 | deprecationMessage: IO.deprecationMessage,
|
9674 | description: IO.description,
|
9675 | rawdescription: IO.rawdescription,
|
9676 | sourceCode: srcFile.getText(),
|
9677 | exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
|
9678 | };
|
9679 | if (IO.constructor) {
|
9680 | injectableDeps.constructorObj = IO.constructor;
|
9681 | }
|
9682 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
9683 | injectableDeps.jsdoctags = IO.jsdoctags[0].tags;
|
9684 | }
|
9685 | if (IO.accessors) {
|
9686 | injectableDeps.accessors = IO.accessors;
|
9687 | }
|
9688 | if (IO["extends"]) {
|
9689 | injectableDeps["extends"] = IO["extends"];
|
9690 | }
|
9691 | deps = injectableDeps;
|
9692 | if (typeof IO.ignore === 'undefined') {
|
9693 | if (___namespace.includes(IO.implements, 'HttpInterceptor')) {
|
9694 | injectableDeps.type = 'interceptor';
|
9695 | outputSymbols.interceptors.push(injectableDeps);
|
9696 | }
|
9697 | else if (_this.isGuard(IO.implements)) {
|
9698 | injectableDeps.type = 'guard';
|
9699 | outputSymbols.guards.push(injectableDeps);
|
9700 | }
|
9701 | else {
|
9702 | injectableDeps.type = 'injectable';
|
9703 | _this.addNewEntityInStore(injectableDeps, outputSymbols.injectables);
|
9704 | }
|
9705 | }
|
9706 | }
|
9707 | else if (_this.isPipe(visitedDecorator)) {
|
9708 | var pipeDeps = {
|
9709 | name: name,
|
9710 | id: 'pipe-' + name + '-' + hash,
|
9711 | file: file,
|
9712 | type: 'pipe',
|
9713 | deprecated: IO.deprecated,
|
9714 | deprecationMessage: IO.deprecationMessage,
|
9715 | description: IO.description,
|
9716 | rawdescription: IO.rawdescription,
|
9717 | properties: IO.properties,
|
9718 | methods: IO.methods,
|
9719 | pure: _this.componentHelper.getComponentPure(props, srcFile),
|
9720 | ngname: _this.componentHelper.getComponentName(props, srcFile),
|
9721 | sourceCode: srcFile.getText(),
|
9722 | exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
|
9723 | };
|
9724 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
9725 | pipeDeps.jsdoctags = IO.jsdoctags[0].tags;
|
9726 | }
|
9727 | deps = pipeDeps;
|
9728 | if (typeof IO.ignore === 'undefined') {
|
9729 | outputSymbols.pipes.push(pipeDeps);
|
9730 | }
|
9731 | }
|
9732 | else if (_this.isDirective(visitedDecorator)) {
|
9733 | var directiveDeps = new DirectiveDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
|
9734 | deps = directiveDeps;
|
9735 | if (typeof IO.ignore === 'undefined') {
|
9736 | outputSymbols.directives.push(directiveDeps);
|
9737 | }
|
9738 | }
|
9739 | else {
|
9740 | var hasMultipleDecoratorsWithInternalOne = _this.hasInternalDecorator(node.decorators);
|
9741 | // Just a class
|
9742 | if (!classWithCustomDecorator_1 &&
|
9743 | !hasMultipleDecoratorsWithInternalOne) {
|
9744 | classWithCustomDecorator_1 = true;
|
9745 | _this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
9746 | }
|
9747 | }
|
9748 | _this.cache.set(name, deps);
|
9749 | if (typeof IO.ignore === 'undefined') {
|
9750 | _this.debug(deps);
|
9751 | }
|
9752 | else {
|
9753 | _this.ignore(deps);
|
9754 | }
|
9755 | };
|
9756 | var filterByDecorators = function (filteredNode) {
|
9757 | if (filteredNode.expression && filteredNode.expression.expression) {
|
9758 | var _test = /(NgModule|Component|Injectable|Pipe|Directive)/.test(filteredNode.expression.expression.text);
|
9759 | if (!_test && tsMorph.ts.isClassDeclaration(node)) {
|
9760 | _test = true;
|
9761 | }
|
9762 | return _test;
|
9763 | }
|
9764 | if (tsMorph.ts.isClassDeclaration(node)) {
|
9765 | return true;
|
9766 | }
|
9767 | return false;
|
9768 | };
|
9769 | node.decorators.filter(filterByDecorators).forEach(visitDecorator);
|
9770 | }
|
9771 | else if (node.symbol) {
|
9772 | if (node.symbol.flags === tsMorph.ts.SymbolFlags.Class) {
|
9773 | _this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
9774 | }
|
9775 | else if (node.symbol.flags === tsMorph.ts.SymbolFlags.Interface) {
|
9776 | var name = _this.getSymboleName(node);
|
9777 | var IO = _this.getInterfaceIO(file, srcFile, node, fileBody);
|
9778 | var interfaceDeps = {
|
9779 | name: name,
|
9780 | id: 'interface-' + name + '-' + hash,
|
9781 | file: file,
|
9782 | deprecated: IO.deprecated,
|
9783 | deprecationMessage: IO.deprecationMessage,
|
9784 | type: 'interface',
|
9785 | sourceCode: srcFile.getText()
|
9786 | };
|
9787 | if (IO.properties) {
|
9788 | interfaceDeps.properties = IO.properties;
|
9789 | }
|
9790 | if (IO.indexSignatures) {
|
9791 | interfaceDeps.indexSignatures = IO.indexSignatures;
|
9792 | }
|
9793 | if (IO.kind) {
|
9794 | interfaceDeps.kind = IO.kind;
|
9795 | }
|
9796 | if (IO.description) {
|
9797 | interfaceDeps.description = IO.description;
|
9798 | interfaceDeps.rawdescription = IO.rawdescription;
|
9799 | }
|
9800 | if (IO.methods) {
|
9801 | interfaceDeps.methods = IO.methods;
|
9802 | }
|
9803 | if (IO["extends"]) {
|
9804 | interfaceDeps["extends"] = IO["extends"];
|
9805 | }
|
9806 | if (typeof IO.ignore === 'undefined') {
|
9807 | _this.debug(interfaceDeps);
|
9808 | outputSymbols.interfaces.push(interfaceDeps);
|
9809 | }
|
9810 | else {
|
9811 | _this.ignore(interfaceDeps);
|
9812 | }
|
9813 | }
|
9814 | else if (tsMorph.ts.isFunctionDeclaration(node)) {
|
9815 | var infos = _this.visitFunctionDeclaration(node);
|
9816 | var name = infos.name;
|
9817 | var deprecated = infos.deprecated;
|
9818 | var deprecationMessage = infos.deprecationMessage;
|
9819 | var functionDep = {
|
9820 | name: name,
|
9821 | file: file,
|
9822 | ctype: 'miscellaneous',
|
9823 | subtype: 'function',
|
9824 | deprecated: deprecated,
|
9825 | deprecationMessage: deprecationMessage,
|
9826 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
9827 | };
|
9828 | if (infos.args) {
|
9829 | functionDep.args = infos.args;
|
9830 | }
|
9831 | if (infos.returnType) {
|
9832 | functionDep.returnType = infos.returnType;
|
9833 | }
|
9834 | if (infos.jsdoctags && infos.jsdoctags.length > 0) {
|
9835 | functionDep.jsdoctags = infos.jsdoctags;
|
9836 | }
|
9837 | if (typeof infos.ignore === 'undefined') {
|
9838 | if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
|
9839 | Configuration$1.mainData.disablePrivate)) {
|
9840 | _this.debug(functionDep);
|
9841 | outputSymbols.miscellaneous.functions.push(functionDep);
|
9842 | }
|
9843 | }
|
9844 | }
|
9845 | else if (tsMorph.ts.isEnumDeclaration(node)) {
|
9846 | var infos = _this.visitEnumDeclaration(node);
|
9847 | var name = infos.name;
|
9848 | var deprecated = infos.deprecated;
|
9849 | var deprecationMessage = infos.deprecationMessage;
|
9850 | var enumDeps = {
|
9851 | name: name,
|
9852 | childs: infos.members,
|
9853 | ctype: 'miscellaneous',
|
9854 | subtype: 'enum',
|
9855 | deprecated: deprecated,
|
9856 | deprecationMessage: deprecationMessage,
|
9857 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
|
9858 | file: file
|
9859 | };
|
9860 | if (!isIgnore(node)) {
|
9861 | _this.debug(enumDeps);
|
9862 | outputSymbols.miscellaneous.enumerations.push(enumDeps);
|
9863 | }
|
9864 | }
|
9865 | else if (tsMorph.ts.isTypeAliasDeclaration(node)) {
|
9866 | var infos = _this.visitTypeDeclaration(node);
|
9867 | var name = infos.name;
|
9868 | var deprecated = infos.deprecated;
|
9869 | var deprecationMessage = infos.deprecationMessage;
|
9870 | var typeAliasDeps = {
|
9871 | name: name,
|
9872 | ctype: 'miscellaneous',
|
9873 | subtype: 'typealias',
|
9874 | rawtype: _this.classHelper.visitType(node),
|
9875 | file: file,
|
9876 | deprecated: deprecated,
|
9877 | deprecationMessage: deprecationMessage,
|
9878 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
9879 | };
|
9880 | if (node.type) {
|
9881 | typeAliasDeps.kind = node.type.kind;
|
9882 | if (typeAliasDeps.rawtype === '') {
|
9883 | typeAliasDeps.rawtype = _this.classHelper.visitType(node);
|
9884 | }
|
9885 | }
|
9886 | if (typeAliasDeps.kind &&
|
9887 | typeAliasDeps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
|
9888 | node.type) {
|
9889 | typeAliasDeps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
|
9890 | }
|
9891 | if (!isIgnore(node)) {
|
9892 | outputSymbols.miscellaneous.typealiases.push(typeAliasDeps);
|
9893 | }
|
9894 | if (typeof infos.ignore === 'undefined') {
|
9895 | _this.debug(typeAliasDeps);
|
9896 | }
|
9897 | }
|
9898 | else if (tsMorph.ts.isModuleDeclaration(node)) {
|
9899 | if (node.body) {
|
9900 | if (node.body.statements && node.body.statements.length > 0) {
|
9901 | node.body.statements.forEach(function (statement) {
|
9902 | return parseNode(file, srcFile, statement, node.body);
|
9903 | });
|
9904 | }
|
9905 | }
|
9906 | }
|
9907 | }
|
9908 | else {
|
9909 | var IO = _this.getRouteIO(file, srcFile, node);
|
9910 | if (IO.routes) {
|
9911 | var newRoutes = void 0;
|
9912 | try {
|
9913 | newRoutes = RouterParserUtil$1.cleanRawRouteParsed(IO.routes);
|
9914 | }
|
9915 | catch (e) {
|
9916 | // tslint:disable-next-line:max-line-length
|
9917 | logger.error('Routes parsing error, maybe a trailing comma or an external variable, trying to fix that later after sources scanning.');
|
9918 | newRoutes = IO.routes.replace(/ /gm, '');
|
9919 | RouterParserUtil$1.addIncompleteRoute({
|
9920 | data: newRoutes,
|
9921 | file: file
|
9922 | });
|
9923 | return true;
|
9924 | }
|
9925 | outputSymbols.routes = __spreadArray(__spreadArray([], __read(outputSymbols.routes), false), __read(newRoutes), false);
|
9926 | }
|
9927 | if (tsMorph.ts.isClassDeclaration(node)) {
|
9928 | _this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
9929 | }
|
9930 | if (tsMorph.ts.isExpressionStatement(node) || tsMorph.ts.isIfStatement(node)) {
|
9931 | var bootstrapModuleReference = 'bootstrapModule';
|
9932 | // Find the root module with bootstrapModule call
|
9933 | // 1. find a simple call : platformBrowserDynamic().bootstrapModule(AppModule);
|
9934 | // 2. or inside a call :
|
9935 | // () => {
|
9936 | // platformBrowserDynamic().bootstrapModule(AppModule);
|
9937 | // });
|
9938 | // 3. with a catch : platformBrowserDynamic().bootstrapModule(AppModule).catch(error => console.error(error));
|
9939 | // 4. with parameters : platformBrowserDynamic().bootstrapModule(AppModule, {}).catch(error => console.error(error));
|
9940 | // Find recusively in expression nodes one with name 'bootstrapModule'
|
9941 | var rootModule_1;
|
9942 | var resultNode = void 0;
|
9943 | if (srcFile.text.indexOf(bootstrapModuleReference) !== -1) {
|
9944 | if (node.expression) {
|
9945 | resultNode = _this.findExpressionByNameInExpressions(node.expression, 'bootstrapModule');
|
9946 | }
|
9947 | if (typeof node.thenStatement !== 'undefined') {
|
9948 | if (node.thenStatement.statements &&
|
9949 | node.thenStatement.statements.length > 0) {
|
9950 | var firstStatement = node.thenStatement.statements[0];
|
9951 | resultNode = _this.findExpressionByNameInExpressions(firstStatement.expression, 'bootstrapModule');
|
9952 | }
|
9953 | }
|
9954 | if (!resultNode) {
|
9955 | if (node.expression &&
|
9956 | node.expression.arguments &&
|
9957 | node.expression.arguments.length > 0) {
|
9958 | resultNode = _this.findExpressionByNameInExpressionArguments(node.expression.arguments, 'bootstrapModule');
|
9959 | }
|
9960 | }
|
9961 | if (resultNode) {
|
9962 | if (resultNode.arguments.length > 0) {
|
9963 | ___namespace.forEach(resultNode.arguments, function (argument) {
|
9964 | if (argument.text) {
|
9965 | rootModule_1 = argument.text;
|
9966 | }
|
9967 | });
|
9968 | }
|
9969 | if (rootModule_1) {
|
9970 | RouterParserUtil$1.setRootModule(rootModule_1);
|
9971 | }
|
9972 | }
|
9973 | }
|
9974 | }
|
9975 | if (tsMorph.ts.isVariableStatement(node) && !RouterParserUtil$1.isVariableRoutes(node)) {
|
9976 | var isDestructured = false;
|
9977 | // Check for destructuring array
|
9978 | var nodeVariableDeclarations = node.declarationList.declarations;
|
9979 | if (nodeVariableDeclarations) {
|
9980 | if (nodeVariableDeclarations.length > 0) {
|
9981 | if (nodeVariableDeclarations[0].name &&
|
9982 | nodeVariableDeclarations[0].name.kind ===
|
9983 | tsMorph.SyntaxKind.ArrayBindingPattern) {
|
9984 | isDestructured = true;
|
9985 | }
|
9986 | }
|
9987 | }
|
9988 | var visitVariableNode = function (variableNode) {
|
9989 | var infos = _this.visitVariableDeclaration(variableNode);
|
9990 | if (infos) {
|
9991 | var name = infos.name;
|
9992 | var deprecated = infos.deprecated;
|
9993 | var deprecationMessage = infos.deprecationMessage;
|
9994 | var deps = {
|
9995 | name: name,
|
9996 | ctype: 'miscellaneous',
|
9997 | subtype: 'variable',
|
9998 | file: file,
|
9999 | deprecated: deprecated,
|
10000 | deprecationMessage: deprecationMessage
|
10001 | };
|
10002 | deps.type = infos.type ? infos.type : '';
|
10003 | if (infos.defaultValue) {
|
10004 | deps.defaultValue = infos.defaultValue;
|
10005 | }
|
10006 | if (infos.initializer) {
|
10007 | deps.initializer = infos.initializer;
|
10008 | }
|
10009 | if (variableNode.jsDoc &&
|
10010 | variableNode.jsDoc.length > 0 &&
|
10011 | variableNode.jsDoc[0].comment) {
|
10012 | var rawDescription = _this.jsdocParserUtil.parseJSDocNode(variableNode.jsDoc[0]);
|
10013 | deps.rawdescription = rawDescription;
|
10014 | deps.description = marked$1(rawDescription);
|
10015 | }
|
10016 | if (isModuleWithProviders(variableNode)) {
|
10017 | var routingInitializer = getModuleWithProviders(variableNode);
|
10018 | RouterParserUtil$1.addModuleWithRoutes(name, [routingInitializer], file);
|
10019 | RouterParserUtil$1.addModule(name, [routingInitializer]);
|
10020 | }
|
10021 | if (!isIgnore(variableNode)) {
|
10022 | _this.debug(deps);
|
10023 | outputSymbols.miscellaneous.variables.push(deps);
|
10024 | }
|
10025 | }
|
10026 | };
|
10027 | if (isDestructured) {
|
10028 | if (nodeVariableDeclarations[0].name.elements) {
|
10029 | var destructuredVariables = nodeVariableDeclarations[0].name.elements;
|
10030 | for (var i = 0; i < destructuredVariables.length; i++) {
|
10031 | var destructuredVariable = destructuredVariables[i];
|
10032 | var name = destructuredVariable.name
|
10033 | ? destructuredVariable.name.escapedText
|
10034 | : '';
|
10035 | var deps = {
|
10036 | name: name,
|
10037 | ctype: 'miscellaneous',
|
10038 | subtype: 'variable',
|
10039 | file: file
|
10040 | };
|
10041 | if (nodeVariableDeclarations[0].initializer) {
|
10042 | if (nodeVariableDeclarations[0].initializer.elements) {
|
10043 | deps.initializer =
|
10044 | nodeVariableDeclarations[0].initializer.elements[i];
|
10045 | }
|
10046 | deps.defaultValue = deps.initializer
|
10047 | ? _this.classHelper.stringifyDefaultValue(deps.initializer)
|
10048 | : undefined;
|
10049 | }
|
10050 | if (!isIgnore(destructuredVariables[i])) {
|
10051 | _this.debug(deps);
|
10052 | outputSymbols.miscellaneous.variables.push(deps);
|
10053 | }
|
10054 | }
|
10055 | }
|
10056 | }
|
10057 | else {
|
10058 | visitVariableNode(node);
|
10059 | }
|
10060 | }
|
10061 | if (tsMorph.ts.isTypeAliasDeclaration(node)) {
|
10062 | var infos = _this.visitTypeDeclaration(node);
|
10063 | var name = infos.name;
|
10064 | var deprecated = infos.deprecated;
|
10065 | var deprecationMessage = infos.deprecationMessage;
|
10066 | var deps = {
|
10067 | name: name,
|
10068 | ctype: 'miscellaneous',
|
10069 | subtype: 'typealias',
|
10070 | rawtype: _this.classHelper.visitType(node),
|
10071 | file: file,
|
10072 | deprecated: deprecated,
|
10073 | deprecationMessage: deprecationMessage,
|
10074 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
10075 | };
|
10076 | if (node.type) {
|
10077 | deps.kind = node.type.kind;
|
10078 | }
|
10079 | if (deps.kind &&
|
10080 | deps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
|
10081 | node.type) {
|
10082 | deps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
|
10083 | }
|
10084 | if (!isIgnore(node)) {
|
10085 | _this.debug(deps);
|
10086 | outputSymbols.miscellaneous.typealiases.push(deps);
|
10087 | }
|
10088 | }
|
10089 | if (tsMorph.ts.isFunctionDeclaration(node)) {
|
10090 | var infos = _this.visitFunctionDeclaration(node);
|
10091 | var name = infos.name;
|
10092 | var deprecated = infos.deprecated;
|
10093 | var deprecationMessage = infos.deprecationMessage;
|
10094 | var functionDep = {
|
10095 | name: name,
|
10096 | ctype: 'miscellaneous',
|
10097 | subtype: 'function',
|
10098 | file: file,
|
10099 | deprecated: deprecated,
|
10100 | deprecationMessage: deprecationMessage,
|
10101 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
10102 | };
|
10103 | if (infos.args) {
|
10104 | functionDep.args = infos.args;
|
10105 | }
|
10106 | if (infos.returnType) {
|
10107 | functionDep.returnType = infos.returnType;
|
10108 | }
|
10109 | if (infos.jsdoctags && infos.jsdoctags.length > 0) {
|
10110 | functionDep.jsdoctags = infos.jsdoctags;
|
10111 | }
|
10112 | if (typeof infos.ignore === 'undefined') {
|
10113 | if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
|
10114 | Configuration$1.mainData.disablePrivate)) {
|
10115 | _this.debug(functionDep);
|
10116 | outputSymbols.miscellaneous.functions.push(functionDep);
|
10117 | }
|
10118 | }
|
10119 | }
|
10120 | if (tsMorph.ts.isEnumDeclaration(node)) {
|
10121 | var infos = _this.visitEnumDeclaration(node);
|
10122 | var name = infos.name;
|
10123 | var deprecated = infos.deprecated;
|
10124 | var deprecationMessage = infos.deprecationMessage;
|
10125 | var enumDeps = {
|
10126 | name: name,
|
10127 | childs: infos.members,
|
10128 | ctype: 'miscellaneous',
|
10129 | subtype: 'enum',
|
10130 | deprecated: deprecated,
|
10131 | deprecationMessage: deprecationMessage,
|
10132 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
|
10133 | file: file
|
10134 | };
|
10135 | if (!isIgnore(node)) {
|
10136 | _this.debug(enumDeps);
|
10137 | outputSymbols.miscellaneous.enumerations.push(enumDeps);
|
10138 | }
|
10139 | }
|
10140 | }
|
10141 | };
|
10142 | parseNode(fileName, scannedFile, initialNode);
|
10143 | });
|
10144 | };
|
10145 | /**
|
10146 | * Function to in a specific store an entity, and check before is there is not the same one
|
10147 | * in that store : same name, id and file
|
10148 | * @param entity Entity to store
|
10149 | * @param store Store
|
10150 | */
|
10151 | AngularDependencies.prototype.addNewEntityInStore = function (entity, store) {
|
10152 | var findSameEntityInStore = ___namespace.filter(store, {
|
10153 | name: entity.name,
|
10154 | id: entity.id,
|
10155 | file: entity.file
|
10156 | });
|
10157 | if (findSameEntityInStore.length === 0) {
|
10158 | store.push(entity);
|
10159 | }
|
10160 | };
|
10161 | AngularDependencies.prototype.debug = function (deps) {
|
10162 | if (deps) {
|
10163 | logger.debug('found', "" + deps.name);
|
10164 | }
|
10165 | else {
|
10166 | return;
|
10167 | }
|
10168 | ['imports', 'exports', 'declarations', 'providers', 'bootstrap'].forEach(function (symbols) {
|
10169 | if (deps[symbols] && deps[symbols].length > 0) {
|
10170 | logger.debug('', "- " + symbols + ":");
|
10171 | deps[symbols]
|
10172 | .map(function (i) { return i.name; })
|
10173 | .forEach(function (d) {
|
10174 | logger.debug('', "\t- " + d);
|
10175 | });
|
10176 | }
|
10177 | });
|
10178 | };
|
10179 | AngularDependencies.prototype.ignore = function (deps) {
|
10180 | if (deps) {
|
10181 | logger.warn('ignore', "" + deps.name);
|
10182 | }
|
10183 | else {
|
10184 | return;
|
10185 | }
|
10186 | };
|
10187 | AngularDependencies.prototype.checkForDeprecation = function (tags, result) {
|
10188 | ___namespace.forEach(tags, function (tag) {
|
10189 | if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
|
10190 | result.deprecated = true;
|
10191 | result.deprecationMessage = tag.comment || '';
|
10192 | }
|
10193 | });
|
10194 | };
|
10195 | AngularDependencies.prototype.findExpressionByNameInExpressions = function (entryNode, name) {
|
10196 | var result;
|
10197 | var loop = function (node, z) {
|
10198 | if (node) {
|
10199 | if (node.expression && !node.expression.name) {
|
10200 | loop(node.expression, z);
|
10201 | }
|
10202 | if (node.expression && node.expression.name) {
|
10203 | if (node.expression.name.text === z) {
|
10204 | result = node;
|
10205 | }
|
10206 | else {
|
10207 | loop(node.expression, z);
|
10208 | }
|
10209 | }
|
10210 | }
|
10211 | };
|
10212 | loop(entryNode, name);
|
10213 | return result;
|
10214 | };
|
10215 | AngularDependencies.prototype.findExpressionByNameInExpressionArguments = function (arg, name) {
|
10216 | var result;
|
10217 | var that = this;
|
10218 | var i = 0;
|
10219 | var len = arg.length;
|
10220 | var loop = function (node, z) {
|
10221 | if (node.body) {
|
10222 | if (node.body.statements && node.body.statements.length > 0) {
|
10223 | var j = 0;
|
10224 | var leng = node.body.statements.length;
|
10225 | for (j; j < leng; j++) {
|
10226 | result = that.findExpressionByNameInExpressions(node.body.statements[j], z);
|
10227 | }
|
10228 | }
|
10229 | }
|
10230 | };
|
10231 | for (i; i < len; i++) {
|
10232 | loop(arg[i], name);
|
10233 | }
|
10234 | return result;
|
10235 | };
|
10236 | AngularDependencies.prototype.parseDecorators = function (decorators, type) {
|
10237 | var result = false;
|
10238 | if (decorators.length > 1) {
|
10239 | ___namespace.forEach(decorators, function (decorator) {
|
10240 | if (decorator.expression.expression) {
|
10241 | if (decorator.expression.expression.text === type) {
|
10242 | result = true;
|
10243 | }
|
10244 | }
|
10245 | });
|
10246 | }
|
10247 | else {
|
10248 | if (decorators[0].expression.expression) {
|
10249 | if (decorators[0].expression.expression.text === type) {
|
10250 | result = true;
|
10251 | }
|
10252 | }
|
10253 | }
|
10254 | return result;
|
10255 | };
|
10256 | AngularDependencies.prototype.parseDecorator = function (decorator, type) {
|
10257 | var result = false;
|
10258 | if (decorator.expression.expression) {
|
10259 | if (decorator.expression.expression.text === type) {
|
10260 | result = true;
|
10261 | }
|
10262 | }
|
10263 | return result;
|
10264 | };
|
10265 | AngularDependencies.prototype.isController = function (metadata) {
|
10266 | return this.parseDecorator(metadata, 'Controller');
|
10267 | };
|
10268 | AngularDependencies.prototype.isEntity = function (metadata) {
|
10269 | return this.parseDecorator(metadata, 'Entity');
|
10270 | };
|
10271 | AngularDependencies.prototype.isComponent = function (metadata) {
|
10272 | return this.parseDecorator(metadata, 'Component');
|
10273 | };
|
10274 | AngularDependencies.prototype.isPipe = function (metadata) {
|
10275 | return this.parseDecorator(metadata, 'Pipe');
|
10276 | };
|
10277 | AngularDependencies.prototype.isDirective = function (metadata) {
|
10278 | return this.parseDecorator(metadata, 'Directive');
|
10279 | };
|
10280 | AngularDependencies.prototype.isInjectable = function (metadata) {
|
10281 | return this.parseDecorator(metadata, 'Injectable');
|
10282 | };
|
10283 | AngularDependencies.prototype.isModule = function (metadata) {
|
10284 | return this.parseDecorator(metadata, 'NgModule') || this.parseDecorator(metadata, 'Module');
|
10285 | };
|
10286 | AngularDependencies.prototype.hasInternalDecorator = function (metadatas) {
|
10287 | return (this.parseDecorators(metadatas, 'Controller') ||
|
10288 | this.parseDecorators(metadatas, 'Component') ||
|
10289 | this.parseDecorators(metadatas, 'Pipe') ||
|
10290 | this.parseDecorators(metadatas, 'Directive') ||
|
10291 | this.parseDecorators(metadatas, 'Injectable') ||
|
10292 | this.parseDecorators(metadatas, 'NgModule') ||
|
10293 | this.parseDecorators(metadatas, 'Module'));
|
10294 | };
|
10295 | AngularDependencies.prototype.isGuard = function (ioImplements) {
|
10296 | return (___namespace.includes(ioImplements, 'CanActivate') ||
|
10297 | ___namespace.includes(ioImplements, 'CanActivateChild') ||
|
10298 | ___namespace.includes(ioImplements, 'CanDeactivate') ||
|
10299 | ___namespace.includes(ioImplements, 'Resolve') ||
|
10300 | ___namespace.includes(ioImplements, 'CanLoad'));
|
10301 | };
|
10302 | AngularDependencies.prototype.getSymboleName = function (node) {
|
10303 | return node.name.text;
|
10304 | };
|
10305 | AngularDependencies.prototype.findProperties = function (visitedNode, sourceFile) {
|
10306 | if (visitedNode.expression &&
|
10307 | visitedNode.expression.arguments &&
|
10308 | visitedNode.expression.arguments.length > 0) {
|
10309 | var pop = visitedNode.expression.arguments[0];
|
10310 | if (pop && pop.properties && pop.properties.length >= 0) {
|
10311 | return pop.properties;
|
10312 | }
|
10313 | else if (pop && pop.kind && pop.kind === tsMorph.SyntaxKind.StringLiteral) {
|
10314 | return [pop];
|
10315 | }
|
10316 | else {
|
10317 | logger.warn('Empty metadatas, trying to find it with imports.');
|
10318 | return ImportsUtil$1.findValueInImportOrLocalVariables(pop.text, sourceFile);
|
10319 | }
|
10320 | }
|
10321 | return [];
|
10322 | };
|
10323 | AngularDependencies.prototype.isAngularLifecycleHook = function (methodName) {
|
10324 | /**
|
10325 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
10326 | */
|
10327 | var ANGULAR_LIFECYCLE_METHODS = [
|
10328 | 'ngOnInit',
|
10329 | 'ngOnChanges',
|
10330 | 'ngDoCheck',
|
10331 | 'ngOnDestroy',
|
10332 | 'ngAfterContentInit',
|
10333 | 'ngAfterContentChecked',
|
10334 | 'ngAfterViewInit',
|
10335 | 'ngAfterViewChecked',
|
10336 | 'writeValue',
|
10337 | 'registerOnChange',
|
10338 | 'registerOnTouched',
|
10339 | 'setDisabledState'
|
10340 | ];
|
10341 | return ANGULAR_LIFECYCLE_METHODS.indexOf(methodName) >= 0;
|
10342 | };
|
10343 | AngularDependencies.prototype.visitTypeDeclaration = function (node) {
|
10344 | var result = {
|
10345 | deprecated: false,
|
10346 | deprecationMessage: '',
|
10347 | name: node.name.text,
|
10348 | kind: node.kind
|
10349 | };
|
10350 | var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
|
10351 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
10352 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
10353 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
10354 | }
|
10355 | return result;
|
10356 | };
|
10357 | AngularDependencies.prototype.visitArgument = function (arg) {
|
10358 | var _this = this;
|
10359 | if (arg.name && arg.name.kind == tsMorph.SyntaxKind.ObjectBindingPattern) {
|
10360 | var results = [];
|
10361 | var destrucuredGroupId_1 = uuid.v4();
|
10362 | results = arg.name.elements.map(function (element) { return _this.visitArgument(element); });
|
10363 | results = results.map(function (result) {
|
10364 | result.destrucuredGroupId = destrucuredGroupId_1;
|
10365 | return result;
|
10366 | });
|
10367 | if (arg.name.elements && arg.type && arg.type.members) {
|
10368 | if (arg.name.elements.length === arg.type.members.length) {
|
10369 | for (var i = 0; i < arg.name.elements.length; i++) {
|
10370 | results[i].type = this.classHelper.visitType(arg.type.members[i]);
|
10371 | }
|
10372 | }
|
10373 | }
|
10374 | if (arg.name.elements && arg.type && arg.type.typeName) {
|
10375 | results[0].type = this.classHelper.visitType(arg.type);
|
10376 | }
|
10377 | return results;
|
10378 | }
|
10379 | else {
|
10380 | var result = {
|
10381 | name: arg.name.text,
|
10382 | type: this.classHelper.visitType(arg),
|
10383 | deprecated: false,
|
10384 | deprecationMessage: ''
|
10385 | };
|
10386 | if (arg.dotDotDotToken) {
|
10387 | result.dotDotDotToken = true;
|
10388 | }
|
10389 | if (arg.questionToken) {
|
10390 | result.optional = true;
|
10391 | }
|
10392 | if (arg.initializer) {
|
10393 | result.defaultValue = arg.initializer
|
10394 | ? this.classHelper.stringifyDefaultValue(arg.initializer)
|
10395 | : undefined;
|
10396 | }
|
10397 | if (arg.type) {
|
10398 | result.type = this.mapType(arg.type.kind);
|
10399 | if (arg.type.kind === tsMorph.SyntaxKind.TypeReference) {
|
10400 | // try replace TypeReference with typeName
|
10401 | if (arg.type.typeName) {
|
10402 | result.type = arg.type.typeName.text;
|
10403 | }
|
10404 | }
|
10405 | }
|
10406 | var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
|
10407 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
10408 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
10409 | }
|
10410 | return result;
|
10411 | }
|
10412 | };
|
10413 | AngularDependencies.prototype.mapType = function (type) {
|
10414 | switch (type) {
|
10415 | case tsMorph.SyntaxKind.NullKeyword:
|
10416 | return 'null';
|
10417 | case tsMorph.SyntaxKind.AnyKeyword:
|
10418 | return 'any';
|
10419 | case tsMorph.SyntaxKind.BooleanKeyword:
|
10420 | return 'boolean';
|
10421 | case tsMorph.SyntaxKind.NeverKeyword:
|
10422 | return 'never';
|
10423 | case tsMorph.SyntaxKind.NumberKeyword:
|
10424 | return 'number';
|
10425 | case tsMorph.SyntaxKind.StringKeyword:
|
10426 | return 'string';
|
10427 | case tsMorph.SyntaxKind.UndefinedKeyword:
|
10428 | return 'undefined';
|
10429 | case tsMorph.SyntaxKind.TypeReference:
|
10430 | return 'typeReference';
|
10431 | }
|
10432 | };
|
10433 | AngularDependencies.prototype.hasPrivateJSDocTag = function (tags) {
|
10434 | var result = false;
|
10435 | if (tags) {
|
10436 | tags.forEach(function (tag) {
|
10437 | if (tag.tagName && tag.tagName.text && tag.tagName.text === 'private') {
|
10438 | result = true;
|
10439 | }
|
10440 | });
|
10441 | }
|
10442 | return result;
|
10443 | };
|
10444 | AngularDependencies.prototype.visitFunctionDeclaration = function (method) {
|
10445 | var methodName = method.name ? method.name.text : 'Unnamed function';
|
10446 | var resultArguments = [];
|
10447 | var result = {
|
10448 | deprecated: false,
|
10449 | deprecationMessage: '',
|
10450 | name: methodName
|
10451 | };
|
10452 | for (var i = 0; i < method.parameters.length; i++) {
|
10453 | var argument = method.parameters[i];
|
10454 | if (argument) {
|
10455 | var argumentParsed = this.visitArgument(argument);
|
10456 | if (argumentParsed.length > 0) {
|
10457 | for (var j = 0; j < argumentParsed.length; j++) {
|
10458 | var argumentParsedInside = argumentParsed[j];
|
10459 | argumentParsedInside.destructuredParameter = true;
|
10460 | resultArguments.push(argumentParsedInside);
|
10461 | }
|
10462 | }
|
10463 | else {
|
10464 | resultArguments.push(argumentParsed);
|
10465 | }
|
10466 | }
|
10467 | }
|
10468 | result.args = resultArguments;
|
10469 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
10470 | if (typeof method.type !== 'undefined') {
|
10471 | result.returnType = this.classHelper.visitType(method.type);
|
10472 | }
|
10473 | if (method.modifiers) {
|
10474 | if (method.modifiers.length > 0) {
|
10475 | var kinds = method.modifiers
|
10476 | .map(function (modifier) {
|
10477 | return modifier.kind;
|
10478 | })
|
10479 | .reverse();
|
10480 | if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
|
10481 | ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
|
10482 | kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
|
10483 | }
|
10484 | }
|
10485 | }
|
10486 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
10487 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
10488 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
10489 | ___namespace.forEach(jsdoctags[0].tags, function (tag) {
|
10490 | if (tag.tagName) {
|
10491 | if (tag.tagName.text) {
|
10492 | if (tag.tagName.text.indexOf('ignore') > -1) {
|
10493 | result.ignore = true;
|
10494 | }
|
10495 | }
|
10496 | }
|
10497 | });
|
10498 | }
|
10499 | if (result.jsdoctags && result.jsdoctags.length > 0) {
|
10500 | result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
10501 | }
|
10502 | else if (result.args.length > 0) {
|
10503 | result.jsdoctags = mergeTagsAndArgs(result.args);
|
10504 | }
|
10505 | return result;
|
10506 | };
|
10507 | AngularDependencies.prototype.visitVariableDeclaration = function (node) {
|
10508 | if (node.declarationList && node.declarationList.declarations) {
|
10509 | var i = 0;
|
10510 | var len = node.declarationList.declarations.length;
|
10511 | for (i; i < len; i++) {
|
10512 | var result = {
|
10513 | name: node.declarationList.declarations[i].name.text,
|
10514 | defaultValue: node.declarationList.declarations[i].initializer
|
10515 | ? this.classHelper.stringifyDefaultValue(node.declarationList.declarations[i].initializer)
|
10516 | : undefined,
|
10517 | deprecated: false,
|
10518 | deprecationMessage: ''
|
10519 | };
|
10520 | if (node.declarationList.declarations[i].initializer) {
|
10521 | result.initializer = node.declarationList.declarations[i].initializer;
|
10522 | }
|
10523 | if (node.declarationList.declarations[i].type) {
|
10524 | result.type = this.classHelper.visitType(node.declarationList.declarations[i].type);
|
10525 | }
|
10526 | if (typeof result.type === 'undefined' && result.initializer) {
|
10527 | result.type = kindToType(result.initializer.kind);
|
10528 | }
|
10529 | var jsdoctags = this.jsdocParserUtil.getJSDocs(node.declarationList.declarations[i]);
|
10530 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
10531 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
10532 | }
|
10533 | return result;
|
10534 | }
|
10535 | }
|
10536 | };
|
10537 | AngularDependencies.prototype.visitEnumTypeAliasFunctionDeclarationDescription = function (node) {
|
10538 | var description = '';
|
10539 | if (node.jsDoc) {
|
10540 | if (node.jsDoc.length > 0) {
|
10541 | if (typeof node.jsDoc[0].comment !== 'undefined') {
|
10542 | var rawDescription = this.jsdocParserUtil.parseJSDocNode(node.jsDoc[0]);
|
10543 | description = marked$1(rawDescription);
|
10544 | }
|
10545 | }
|
10546 | }
|
10547 | return description;
|
10548 | };
|
10549 | AngularDependencies.prototype.visitEnumDeclaration = function (node) {
|
10550 | var result = {
|
10551 | deprecated: false,
|
10552 | deprecationMessage: '',
|
10553 | name: node.name.text,
|
10554 | members: []
|
10555 | };
|
10556 | if (node.members) {
|
10557 | var i = 0;
|
10558 | var len = node.members.length;
|
10559 | var memberjsdoctags = [];
|
10560 | for (i; i < len; i++) {
|
10561 | var member = {
|
10562 | name: node.members[i].name.text,
|
10563 | deprecated: false,
|
10564 | deprecationMessage: ''
|
10565 | };
|
10566 | if (node.members[i].initializer) {
|
10567 | // if the initializer kind is a number do cast to the number type
|
10568 | member.value = IsKindType.NUMBER(node.members[i].initializer.kind)
|
10569 | ? Number(node.members[i].initializer.text)
|
10570 | : node.members[i].initializer.text;
|
10571 | }
|
10572 | memberjsdoctags = this.jsdocParserUtil.getJSDocs(node.members[i]);
|
10573 | if (memberjsdoctags && memberjsdoctags.length >= 1 && memberjsdoctags[0].tags) {
|
10574 | this.checkForDeprecation(memberjsdoctags[0].tags, member);
|
10575 | }
|
10576 | result.members.push(member);
|
10577 | }
|
10578 | }
|
10579 | var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
|
10580 | if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
10581 | this.checkForDeprecation(jsdoctags[0].tags, result);
|
10582 | }
|
10583 | return result;
|
10584 | };
|
10585 | AngularDependencies.prototype.visitEnumDeclarationForRoutes = function (fileName, node) {
|
10586 | if (node.declarationList.declarations) {
|
10587 | var i = 0;
|
10588 | var len = node.declarationList.declarations.length;
|
10589 | for (i; i < len; i++) {
|
10590 | var routesInitializer = node.declarationList.declarations[i].initializer;
|
10591 | var data = new CodeGenerator().generate(routesInitializer);
|
10592 | RouterParserUtil$1.addRoute({
|
10593 | name: node.declarationList.declarations[i].name.text,
|
10594 | data: RouterParserUtil$1.cleanRawRoute(data),
|
10595 | filename: fileName
|
10596 | });
|
10597 | return [
|
10598 | {
|
10599 | routes: data
|
10600 | }
|
10601 | ];
|
10602 | }
|
10603 | }
|
10604 | return [];
|
10605 | };
|
10606 | AngularDependencies.prototype.getRouteIO = function (filename, sourceFile, node) {
|
10607 | var _this = this;
|
10608 | var res;
|
10609 | if (sourceFile.statements) {
|
10610 | res = sourceFile.statements.reduce(function (directive, statement) {
|
10611 | if (RouterParserUtil$1.isVariableRoutes(statement)) {
|
10612 | if (statement.pos === node.pos && statement.end === node.end) {
|
10613 | return directive.concat(_this.visitEnumDeclarationForRoutes(filename, statement));
|
10614 | }
|
10615 | }
|
10616 | return directive;
|
10617 | }, []);
|
10618 | return res[0] || {};
|
10619 | }
|
10620 | else {
|
10621 | return {};
|
10622 | }
|
10623 | };
|
10624 | AngularDependencies.prototype.getClassIO = function (filename, sourceFile, node, fileBody) {
|
10625 | var _this = this;
|
10626 | /**
|
10627 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
10628 | */
|
10629 | var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
10630 | var res = reducedSource.reduce(function (directive, statement) {
|
10631 | if (tsMorph.ts.isClassDeclaration(statement)) {
|
10632 | if (statement.pos === node.pos && statement.end === node.end) {
|
10633 | return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
|
10634 | }
|
10635 | }
|
10636 | return directive;
|
10637 | }, []);
|
10638 | return res[0] || {};
|
10639 | };
|
10640 | AngularDependencies.prototype.getInterfaceIO = function (filename, sourceFile, node, fileBody) {
|
10641 | var _this = this;
|
10642 | /**
|
10643 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
10644 | */
|
10645 | var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
10646 | var res = reducedSource.reduce(function (directive, statement) {
|
10647 | if (tsMorph.ts.isInterfaceDeclaration(statement)) {
|
10648 | if (statement.pos === node.pos && statement.end === node.end) {
|
10649 | return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
|
10650 | }
|
10651 | }
|
10652 | return directive;
|
10653 | }, []);
|
10654 | return res[0] || {};
|
10655 | };
|
10656 | return AngularDependencies;
|
10657 | }(FrameworkDependencies));
|
10658 |
|
10659 | var AngularJSDependencies = /** @class */ (function (_super) {
|
10660 | __extends(AngularJSDependencies, _super);
|
10661 | function AngularJSDependencies(files, options) {
|
10662 | var _this = _super.call(this, files, options) || this;
|
10663 | _this.cache = new ComponentCache();
|
10664 | _this.moduleHelper = new ModuleHelper(_this.cache);
|
10665 | _this.jsDocHelper = new JsDocHelper();
|
10666 | _this.symbolHelper = new SymbolHelper();
|
10667 | return _this;
|
10668 | }
|
10669 | AngularJSDependencies.prototype.getDependencies = function () {
|
10670 | var deps = {
|
10671 | modules: [],
|
10672 | modulesForGraph: [],
|
10673 | components: [],
|
10674 | injectables: [],
|
10675 | interceptors: [],
|
10676 | pipes: [],
|
10677 | directives: [],
|
10678 | routes: [],
|
10679 | classes: [],
|
10680 | interfaces: [],
|
10681 | miscellaneous: {
|
10682 | variables: [],
|
10683 | functions: [],
|
10684 | typealiases: [],
|
10685 | enumerations: []
|
10686 | },
|
10687 | routesTree: undefined
|
10688 | };
|
10689 | return deps;
|
10690 | };
|
10691 | return AngularJSDependencies;
|
10692 | }(FrameworkDependencies));
|
10693 |
|
10694 | function promiseSequential(promises) {
|
10695 | if (!Array.isArray(promises)) {
|
10696 | throw new Error('First argument need to be an array of Promises');
|
10697 | }
|
10698 | return new Promise(function (resolve, reject) {
|
10699 | var count = 0;
|
10700 | var results = [];
|
10701 | var iterateeFunc = function (previousPromise, currentPromise) {
|
10702 | return previousPromise
|
10703 | .then(function (result) {
|
10704 | if (count++ !== 0) {
|
10705 | results = results.concat(result);
|
10706 | }
|
10707 | return currentPromise(result, results, count);
|
10708 | })["catch"](function (err) {
|
10709 | return reject(err);
|
10710 | });
|
10711 | };
|
10712 | promises = promises.concat(function () { return Promise.resolve(); });
|
10713 | promises.reduce(iterateeFunc, Promise.resolve(false)).then(function (res) {
|
10714 | resolve(results);
|
10715 | });
|
10716 | });
|
10717 | }
|
10718 |
|
10719 | var chokidar = require('chokidar');
|
10720 | var marked = require('marked').marked;
|
10721 | var traverse = require('traverse');
|
10722 | var crypto = require('crypto');
|
10723 | var babel = require('@babel/core');
|
10724 | var cwd$1 = process.cwd();
|
10725 | var startTime = new Date();
|
10726 | var generationPromiseResolve;
|
10727 | var generationPromiseReject;
|
10728 | var generationPromise = new Promise(function (resolve, reject) {
|
10729 | generationPromiseResolve = resolve;
|
10730 | generationPromiseReject = reject;
|
10731 | });
|
10732 | var Application = /** @class */ (function () {
|
10733 | /**
|
10734 | * Create a new compodoc application instance.
|
10735 | *
|
10736 | * @param options An object containing the options that should be used.
|
10737 | */
|
10738 | function Application(options) {
|
10739 | var _this = this;
|
10740 | /**
|
10741 | * Files changed during watch scanning
|
10742 | */
|
10743 | this.watchChangedFiles = [];
|
10744 | /**
|
10745 | * Boolean for watching status
|
10746 | * @type {boolean}
|
10747 | */
|
10748 | this.isWatching = false;
|
10749 | /**
|
10750 | * Store package.json data
|
10751 | */
|
10752 | this.packageJsonData = {};
|
10753 | this.preparePipes = function (somePipes) {
|
10754 | logger.info('Prepare pipes');
|
10755 | Configuration$1.mainData.pipes = somePipes ? somePipes : DependenciesEngine$1.getPipes();
|
10756 | return new Promise(function (resolve, reject) {
|
10757 | var i = 0;
|
10758 | var len = Configuration$1.mainData.pipes.length;
|
10759 | var loop = function () {
|
10760 | if (i < len) {
|
10761 | var pipe = Configuration$1.mainData.pipes[i];
|
10762 | if (MarkdownEngine$1.hasNeighbourReadmeFile(pipe.file)) {
|
10763 | logger.info(" " + pipe.name + " has a README file, include it");
|
10764 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(pipe.file);
|
10765 | pipe.readme = marked(readme);
|
10766 | }
|
10767 | var page = {
|
10768 | path: 'pipes',
|
10769 | name: pipe.name,
|
10770 | id: pipe.id,
|
10771 | navTabs: _this.getNavTabs(pipe),
|
10772 | context: 'pipe',
|
10773 | pipe: pipe,
|
10774 | depth: 1,
|
10775 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
10776 | };
|
10777 | if (pipe.isDuplicate) {
|
10778 | page.name += '-' + pipe.duplicateId;
|
10779 | }
|
10780 | Configuration$1.addPage(page);
|
10781 | i++;
|
10782 | loop();
|
10783 | }
|
10784 | else {
|
10785 | resolve();
|
10786 | }
|
10787 | };
|
10788 | loop();
|
10789 | });
|
10790 | };
|
10791 | this.prepareClasses = function (someClasses) {
|
10792 | logger.info('Prepare classes');
|
10793 | Configuration$1.mainData.classes = someClasses
|
10794 | ? someClasses
|
10795 | : DependenciesEngine$1.getClasses();
|
10796 | return new Promise(function (resolve, reject) {
|
10797 | var i = 0;
|
10798 | var len = Configuration$1.mainData.classes.length;
|
10799 | var loop = function () {
|
10800 | if (i < len) {
|
10801 | var classe = Configuration$1.mainData.classes[i];
|
10802 | if (MarkdownEngine$1.hasNeighbourReadmeFile(classe.file)) {
|
10803 | logger.info(" " + classe.name + " has a README file, include it");
|
10804 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(classe.file);
|
10805 | classe.readme = marked(readme);
|
10806 | }
|
10807 | var page = {
|
10808 | path: 'classes',
|
10809 | name: classe.name,
|
10810 | id: classe.id,
|
10811 | navTabs: _this.getNavTabs(classe),
|
10812 | context: 'class',
|
10813 | "class": classe,
|
10814 | depth: 1,
|
10815 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
10816 | };
|
10817 | if (classe.isDuplicate) {
|
10818 | page.name += '-' + classe.duplicateId;
|
10819 | }
|
10820 | Configuration$1.addPage(page);
|
10821 | i++;
|
10822 | loop();
|
10823 | }
|
10824 | else {
|
10825 | resolve();
|
10826 | }
|
10827 | };
|
10828 | loop();
|
10829 | });
|
10830 | };
|
10831 | for (var option in options) {
|
10832 | if (typeof Configuration$1.mainData[option] !== 'undefined') {
|
10833 | Configuration$1.mainData[option] = options[option];
|
10834 | }
|
10835 | // For documentationMainName, process it outside the loop, for handling conflict with pages name
|
10836 | if (option === 'name') {
|
10837 | Configuration$1.mainData.documentationMainName = options[option];
|
10838 | }
|
10839 | // For documentationMainName, process it outside the loop, for handling conflict with pages name
|
10840 | if (option === 'silent') {
|
10841 | logger.silent = false;
|
10842 | }
|
10843 | }
|
10844 | }
|
10845 | /**
|
10846 | * Start compodoc process
|
10847 | */
|
10848 | Application.prototype.generate = function () {
|
10849 | var _this = this;
|
10850 | process.on('unhandledRejection', this.unhandledRejectionListener);
|
10851 | process.on('uncaughtException', this.uncaughtExceptionListener);
|
10852 | I18nEngine$1.init(Configuration$1.mainData.language);
|
10853 | if (Configuration$1.mainData.output.charAt(Configuration$1.mainData.output.length - 1) !== '/') {
|
10854 | Configuration$1.mainData.output += '/';
|
10855 | }
|
10856 | if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
10857 | this.processPackageJson();
|
10858 | }
|
10859 | else {
|
10860 | HtmlEngine$1.init(Configuration$1.mainData.templates).then(function () { return _this.processPackageJson(); });
|
10861 | }
|
10862 | return generationPromise;
|
10863 | };
|
10864 | Application.prototype.endCallback = function () {
|
10865 | process.removeListener('unhandledRejection', this.unhandledRejectionListener);
|
10866 | process.removeListener('uncaughtException', this.uncaughtExceptionListener);
|
10867 | };
|
10868 | Application.prototype.unhandledRejectionListener = function (err, p) {
|
10869 | console.log('Unhandled Rejection at:', p, 'reason:', err);
|
10870 | logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
|
10871 | process.exit(1);
|
10872 | };
|
10873 | Application.prototype.uncaughtExceptionListener = function (err) {
|
10874 | logger.error(err);
|
10875 | logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
|
10876 | process.exit(1);
|
10877 | };
|
10878 | /**
|
10879 | * Start compodoc documentation coverage
|
10880 | */
|
10881 | Application.prototype.testCoverage = function () {
|
10882 | this.getDependenciesData();
|
10883 | };
|
10884 | /**
|
10885 | * Store files for initial processing
|
10886 | * @param {Array<string>} files Files found during source folder and tsconfig scan
|
10887 | */
|
10888 | Application.prototype.setFiles = function (files) {
|
10889 | this.files = files;
|
10890 | };
|
10891 | /**
|
10892 | * Store files for watch processing
|
10893 | * @param {Array<string>} files Files found during source folder and tsconfig scan
|
10894 | */
|
10895 | Application.prototype.setUpdatedFiles = function (files) {
|
10896 | this.updatedFiles = files;
|
10897 | };
|
10898 | /**
|
10899 | * Return a boolean indicating presence of one TypeScript file in updatedFiles list
|
10900 | * @return {boolean} Result of scan
|
10901 | */
|
10902 | Application.prototype.hasWatchedFilesTSFiles = function () {
|
10903 | var result = false;
|
10904 | ___namespace.forEach(this.updatedFiles, function (file) {
|
10905 | if (path__namespace.extname(file) === '.ts') {
|
10906 | result = true;
|
10907 | }
|
10908 | });
|
10909 | return result;
|
10910 | };
|
10911 | /**
|
10912 | * Return a boolean indicating presence of one root markdown files in updatedFiles list
|
10913 | * @return {boolean} Result of scan
|
10914 | */
|
10915 | Application.prototype.hasWatchedFilesRootMarkdownFiles = function () {
|
10916 | var result = false;
|
10917 | ___namespace.forEach(this.updatedFiles, function (file) {
|
10918 | if (path__namespace.extname(file) === '.md' && path__namespace.dirname(file) === cwd$1) {
|
10919 | result = true;
|
10920 | }
|
10921 | });
|
10922 | return result;
|
10923 | };
|
10924 | /**
|
10925 | * Clear files for watch processing
|
10926 | */
|
10927 | Application.prototype.clearUpdatedFiles = function () {
|
10928 | this.updatedFiles = [];
|
10929 | this.watchChangedFiles = [];
|
10930 | };
|
10931 | Application.prototype.processPackageJson = function () {
|
10932 | var _this = this;
|
10933 | logger.info('Searching package.json file');
|
10934 | FileEngine$1.get(cwd$1 + path__namespace.sep + 'package.json').then(function (packageData) {
|
10935 | var parsedData = JSON.parse(packageData);
|
10936 | _this.packageJsonData = parsedData;
|
10937 | if (typeof parsedData.name !== 'undefined' &&
|
10938 | Configuration$1.mainData.documentationMainName === COMPODOC_DEFAULTS.title) {
|
10939 | Configuration$1.mainData.documentationMainName =
|
10940 | parsedData.name + ' documentation';
|
10941 | }
|
10942 | if (typeof parsedData.description !== 'undefined') {
|
10943 | Configuration$1.mainData.documentationMainDescription = parsedData.description;
|
10944 | }
|
10945 | Configuration$1.mainData.angularVersion =
|
10946 | AngularVersionUtil$1.getAngularVersionOfProject(parsedData);
|
10947 | logger.info('package.json file found');
|
10948 | if (!Configuration$1.mainData.disableDependencies) {
|
10949 | if (typeof parsedData.dependencies !== 'undefined') {
|
10950 | _this.processPackageDependencies(parsedData.dependencies);
|
10951 | }
|
10952 | if (typeof parsedData.peerDependencies !== 'undefined') {
|
10953 | _this.processPackagePeerDependencies(parsedData.peerDependencies);
|
10954 | }
|
10955 | }
|
10956 | if (!Configuration$1.mainData.disableProperties) {
|
10957 | var propertiesToCheck = [
|
10958 | 'version',
|
10959 | 'description',
|
10960 | 'keywords',
|
10961 | 'homepage',
|
10962 | 'bugs',
|
10963 | 'license',
|
10964 | 'repository',
|
10965 | 'author'
|
10966 | ];
|
10967 | var hasOneOfCheckedProperties_1 = false;
|
10968 | propertiesToCheck.forEach(function (prop) {
|
10969 | if (prop in parsedData) {
|
10970 | hasOneOfCheckedProperties_1 = true;
|
10971 | Configuration$1.mainData.packageProperties[prop] = parsedData[prop];
|
10972 | }
|
10973 | });
|
10974 | if (hasOneOfCheckedProperties_1) {
|
10975 | Configuration$1.addPage({
|
10976 | name: 'properties',
|
10977 | id: 'packageProperties',
|
10978 | context: 'package-properties',
|
10979 | depth: 0,
|
10980 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
10981 | });
|
10982 | }
|
10983 | }
|
10984 | _this.processMarkdowns().then(function () {
|
10985 | _this.getDependenciesData();
|
10986 | }, function (errorMessage) {
|
10987 | logger.error(errorMessage);
|
10988 | process.exit(1);
|
10989 | });
|
10990 | }, function (errorMessage) {
|
10991 | logger.error(errorMessage);
|
10992 | logger.error('Continuing without package.json file');
|
10993 | _this.processMarkdowns().then(function () {
|
10994 | _this.getDependenciesData();
|
10995 | }, function (errorMessage1) {
|
10996 | logger.error(errorMessage1);
|
10997 | process.exit(1);
|
10998 | });
|
10999 | });
|
11000 | };
|
11001 | Application.prototype.processPackagePeerDependencies = function (dependencies) {
|
11002 | logger.info('Processing package.json peerDependencies');
|
11003 | Configuration$1.mainData.packagePeerDependencies = dependencies;
|
11004 | if (!Configuration$1.hasPage('dependencies')) {
|
11005 | Configuration$1.addPage({
|
11006 | name: 'dependencies',
|
11007 | id: 'packageDependencies',
|
11008 | context: 'package-dependencies',
|
11009 | depth: 0,
|
11010 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
11011 | });
|
11012 | }
|
11013 | };
|
11014 | Application.prototype.processPackageDependencies = function (dependencies) {
|
11015 | logger.info('Processing package.json dependencies');
|
11016 | Configuration$1.mainData.packageDependencies = dependencies;
|
11017 | Configuration$1.addPage({
|
11018 | name: 'dependencies',
|
11019 | id: 'packageDependencies',
|
11020 | context: 'package-dependencies',
|
11021 | depth: 0,
|
11022 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
11023 | });
|
11024 | };
|
11025 | Application.prototype.processMarkdowns = function () {
|
11026 | logger.info('Searching README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md files');
|
11027 | return new Promise(function (resolve, reject) {
|
11028 | var i = 0;
|
11029 | var markdowns = ['readme', 'changelog', 'contributing', 'license', 'todo'];
|
11030 | var numberOfMarkdowns = 5;
|
11031 | var loop = function () {
|
11032 | if (i < numberOfMarkdowns) {
|
11033 | MarkdownEngine$1.getTraditionalMarkdown(markdowns[i].toUpperCase()).then(function (readmeData) {
|
11034 | Configuration$1.addPage({
|
11035 | name: markdowns[i] === 'readme' ? 'index' : markdowns[i],
|
11036 | context: 'getting-started',
|
11037 | id: 'getting-started',
|
11038 | markdown: readmeData.markdown,
|
11039 | data: readmeData.rawData,
|
11040 | depth: 0,
|
11041 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
11042 | });
|
11043 | if (markdowns[i] === 'readme') {
|
11044 | Configuration$1.mainData.readme = true;
|
11045 | Configuration$1.addPage({
|
11046 | name: 'overview',
|
11047 | id: 'overview',
|
11048 | context: 'overview',
|
11049 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
11050 | });
|
11051 | }
|
11052 | else {
|
11053 | Configuration$1.mainData.markdowns.push({
|
11054 | name: markdowns[i],
|
11055 | uppername: markdowns[i].toUpperCase(),
|
11056 | depth: 0,
|
11057 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
11058 | });
|
11059 | }
|
11060 | logger.info(markdowns[i].toUpperCase() + ".md file found");
|
11061 | i++;
|
11062 | loop();
|
11063 | }, function (errorMessage) {
|
11064 | logger.warn(errorMessage);
|
11065 | logger.warn("Continuing without " + markdowns[i].toUpperCase() + ".md file");
|
11066 | if (markdowns[i] === 'readme') {
|
11067 | Configuration$1.addPage({
|
11068 | name: 'index',
|
11069 | id: 'index',
|
11070 | context: 'overview',
|
11071 | depth: 0,
|
11072 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
11073 | });
|
11074 | }
|
11075 | i++;
|
11076 | loop();
|
11077 | });
|
11078 | }
|
11079 | else {
|
11080 | resolve();
|
11081 | }
|
11082 | };
|
11083 | loop();
|
11084 | });
|
11085 | };
|
11086 | Application.prototype.rebuildRootMarkdowns = function () {
|
11087 | var _this = this;
|
11088 | logger.info('Regenerating README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md pages');
|
11089 | var actions = [];
|
11090 | Configuration$1.resetRootMarkdownPages();
|
11091 | actions.push(function () {
|
11092 | return _this.processMarkdowns();
|
11093 | });
|
11094 | promiseSequential(actions)
|
11095 | .then(function (res) {
|
11096 | _this.processPages();
|
11097 | _this.clearUpdatedFiles();
|
11098 | })["catch"](function (errorMessage) {
|
11099 | logger.error(errorMessage);
|
11100 | });
|
11101 | };
|
11102 | /**
|
11103 | * Get dependency data for small group of updated files during watch process
|
11104 | */
|
11105 | Application.prototype.getMicroDependenciesData = function () {
|
11106 | logger.info('Get diff dependencies data');
|
11107 | var dependenciesClass = AngularDependencies;
|
11108 | Configuration$1.mainData.angularProject = true;
|
11109 | if (this.detectAngularJSProjects()) {
|
11110 | logger.info('AngularJS project detected');
|
11111 | Configuration$1.mainData.angularProject = false;
|
11112 | Configuration$1.mainData.angularJSProject = true;
|
11113 | dependenciesClass = AngularJSDependencies;
|
11114 | }
|
11115 | var crawler = new dependenciesClass(this.updatedFiles, {
|
11116 | tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
|
11117 | }, Configuration$1, RouterParserUtil$1);
|
11118 | var dependenciesData = crawler.getDependencies();
|
11119 | DependenciesEngine$1.update(dependenciesData);
|
11120 | this.prepareJustAFewThings(dependenciesData);
|
11121 | };
|
11122 | /**
|
11123 | * Rebuild external documentation during watch process
|
11124 | */
|
11125 | Application.prototype.rebuildExternalDocumentation = function () {
|
11126 | var _this = this;
|
11127 | logger.info('Rebuild external documentation');
|
11128 | var actions = [];
|
11129 | Configuration$1.resetAdditionalPages();
|
11130 | if (Configuration$1.mainData.includes !== '') {
|
11131 | actions.push(function () {
|
11132 | return _this.prepareExternalIncludes();
|
11133 | });
|
11134 | }
|
11135 | promiseSequential(actions)
|
11136 | .then(function (res) {
|
11137 | _this.processPages();
|
11138 | _this.clearUpdatedFiles();
|
11139 | })["catch"](function (errorMessage) {
|
11140 | logger.error(errorMessage);
|
11141 | });
|
11142 | };
|
11143 | Application.prototype.detectAngularJSProjects = function () {
|
11144 | if (typeof this.packageJsonData.dependencies !== 'undefined') {
|
11145 | if (typeof this.packageJsonData.dependencies.angular !== 'undefined') ;
|
11146 | else {
|
11147 | var countJSFiles_1 = 0;
|
11148 | this.files.forEach(function (file) {
|
11149 | if (path__namespace.extname(file) === '.js') {
|
11150 | countJSFiles_1 += 1;
|
11151 | }
|
11152 | });
|
11153 | (countJSFiles_1 * 100) / this.files.length;
|
11154 | }
|
11155 | }
|
11156 | return false;
|
11157 | };
|
11158 | Application.prototype.getDependenciesData = function () {
|
11159 | logger.info('Get dependencies data');
|
11160 | /**
|
11161 | * AngularJS detection strategy :
|
11162 | * - if in package.json
|
11163 | * - if 75% of scanned files are *.js files
|
11164 | */
|
11165 | var dependenciesClass = AngularDependencies;
|
11166 | Configuration$1.mainData.angularProject = true;
|
11167 | if (this.detectAngularJSProjects()) {
|
11168 | logger.info('AngularJS project detected');
|
11169 | Configuration$1.mainData.angularProject = false;
|
11170 | Configuration$1.mainData.angularJSProject = true;
|
11171 | dependenciesClass = AngularJSDependencies;
|
11172 | }
|
11173 | var crawler = new dependenciesClass(this.files, {
|
11174 | tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
|
11175 | }, Configuration$1, RouterParserUtil$1);
|
11176 | var dependenciesData = crawler.getDependencies();
|
11177 | DependenciesEngine$1.init(dependenciesData);
|
11178 | Configuration$1.mainData.routesLength = RouterParserUtil$1.routesLength();
|
11179 | this.printStatistics();
|
11180 | this.prepareEverything();
|
11181 | };
|
11182 | Application.prototype.prepareJustAFewThings = function (diffCrawledData) {
|
11183 | var _this = this;
|
11184 | var actions = [];
|
11185 | Configuration$1.resetPages();
|
11186 | if (!Configuration$1.mainData.disableRoutesGraph) {
|
11187 | actions.push(function () { return _this.prepareRoutes(); });
|
11188 | }
|
11189 | if (diffCrawledData.components.length > 0) {
|
11190 | actions.push(function () { return _this.prepareComponents(); });
|
11191 | }
|
11192 | if (diffCrawledData.controllers.length > 0) {
|
11193 | actions.push(function () { return _this.prepareControllers(); });
|
11194 | }
|
11195 | if (diffCrawledData.entities.length > 0) {
|
11196 | actions.push(function () { return _this.prepareEntities(); });
|
11197 | }
|
11198 | if (diffCrawledData.modules.length > 0) {
|
11199 | actions.push(function () { return _this.prepareModules(); });
|
11200 | }
|
11201 | if (diffCrawledData.directives.length > 0) {
|
11202 | actions.push(function () { return _this.prepareDirectives(); });
|
11203 | }
|
11204 | if (diffCrawledData.injectables.length > 0) {
|
11205 | actions.push(function () { return _this.prepareInjectables(); });
|
11206 | }
|
11207 | if (diffCrawledData.interceptors.length > 0) {
|
11208 | actions.push(function () { return _this.prepareInterceptors(); });
|
11209 | }
|
11210 | if (diffCrawledData.guards.length > 0) {
|
11211 | actions.push(function () { return _this.prepareGuards(); });
|
11212 | }
|
11213 | if (diffCrawledData.pipes.length > 0) {
|
11214 | actions.push(function () { return _this.preparePipes(); });
|
11215 | }
|
11216 | if (diffCrawledData.classes.length > 0) {
|
11217 | actions.push(function () { return _this.prepareClasses(); });
|
11218 | }
|
11219 | if (diffCrawledData.interfaces.length > 0) {
|
11220 | actions.push(function () { return _this.prepareInterfaces(); });
|
11221 | }
|
11222 | if (diffCrawledData.miscellaneous.variables.length > 0 ||
|
11223 | diffCrawledData.miscellaneous.functions.length > 0 ||
|
11224 | diffCrawledData.miscellaneous.typealiases.length > 0 ||
|
11225 | diffCrawledData.miscellaneous.enumerations.length > 0) {
|
11226 | actions.push(function () { return _this.prepareMiscellaneous(); });
|
11227 | }
|
11228 | if (!Configuration$1.mainData.disableCoverage) {
|
11229 | actions.push(function () { return _this.prepareCoverage(); });
|
11230 | }
|
11231 | promiseSequential(actions)
|
11232 | .then(function (res) {
|
11233 | if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
11234 | if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
|
11235 | logger.info("Generating documentation in export format " + Configuration$1.mainData.exportFormat);
|
11236 | ExportEngine$1["export"](Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
|
11237 | generationPromiseResolve();
|
11238 | _this.endCallback();
|
11239 | logger.info('Documentation generated in ' +
|
11240 | Configuration$1.mainData.output +
|
11241 | ' in ' +
|
11242 | _this.getElapsedTime() +
|
11243 | ' seconds');
|
11244 | if (Configuration$1.mainData.serve) {
|
11245 | logger.info("Serving documentation from " + Configuration$1.mainData.output + " at http://" + Configuration$1.mainData.hostname + ":" + Configuration$1.mainData.port);
|
11246 | _this.runWebServer(Configuration$1.mainData.output);
|
11247 | }
|
11248 | });
|
11249 | }
|
11250 | else {
|
11251 | logger.warn("Exported format not supported");
|
11252 | }
|
11253 | }
|
11254 | else {
|
11255 | _this.processGraphs();
|
11256 | _this.clearUpdatedFiles();
|
11257 | }
|
11258 | })["catch"](function (errorMessage) {
|
11259 | logger.error(errorMessage);
|
11260 | });
|
11261 | };
|
11262 | Application.prototype.printStatistics = function () {
|
11263 | logger.info('-------------------');
|
11264 | logger.info('Project statistics ');
|
11265 | if (DependenciesEngine$1.modules.length > 0) {
|
11266 | logger.info("- files : " + this.files.length);
|
11267 | }
|
11268 | if (DependenciesEngine$1.modules.length > 0) {
|
11269 | logger.info("- module : " + DependenciesEngine$1.modules.length);
|
11270 | }
|
11271 | if (DependenciesEngine$1.components.length > 0) {
|
11272 | logger.info("- component : " + DependenciesEngine$1.components.length);
|
11273 | }
|
11274 | if (DependenciesEngine$1.controllers.length > 0) {
|
11275 | logger.info("- controller : " + DependenciesEngine$1.controllers.length);
|
11276 | }
|
11277 | if (DependenciesEngine$1.entities.length > 0) {
|
11278 | logger.info("- entity : " + DependenciesEngine$1.entities.length);
|
11279 | }
|
11280 | if (DependenciesEngine$1.directives.length > 0) {
|
11281 | logger.info("- directive : " + DependenciesEngine$1.directives.length);
|
11282 | }
|
11283 | if (DependenciesEngine$1.injectables.length > 0) {
|
11284 | logger.info("- injectable : " + DependenciesEngine$1.injectables.length);
|
11285 | }
|
11286 | if (DependenciesEngine$1.interceptors.length > 0) {
|
11287 | logger.info("- injector : " + DependenciesEngine$1.interceptors.length);
|
11288 | }
|
11289 | if (DependenciesEngine$1.guards.length > 0) {
|
11290 | logger.info("- guard : " + DependenciesEngine$1.guards.length);
|
11291 | }
|
11292 | if (DependenciesEngine$1.pipes.length > 0) {
|
11293 | logger.info("- pipe : " + DependenciesEngine$1.pipes.length);
|
11294 | }
|
11295 | if (DependenciesEngine$1.classes.length > 0) {
|
11296 | logger.info("- class : " + DependenciesEngine$1.classes.length);
|
11297 | }
|
11298 | if (DependenciesEngine$1.interfaces.length > 0) {
|
11299 | logger.info("- interface : " + DependenciesEngine$1.interfaces.length);
|
11300 | }
|
11301 | if (Configuration$1.mainData.routesLength > 0) {
|
11302 | logger.info("- route : " + Configuration$1.mainData.routesLength);
|
11303 | }
|
11304 | logger.info('-------------------');
|
11305 | };
|
11306 | Application.prototype.prepareEverything = function () {
|
11307 | var _this = this;
|
11308 | var actions = [];
|
11309 | actions.push(function () {
|
11310 | return _this.prepareComponents();
|
11311 | });
|
11312 | actions.push(function () {
|
11313 | return _this.prepareModules();
|
11314 | });
|
11315 | if (DependenciesEngine$1.directives.length > 0) {
|
11316 | actions.push(function () {
|
11317 | return _this.prepareDirectives();
|
11318 | });
|
11319 | }
|
11320 | if (DependenciesEngine$1.controllers.length > 0) {
|
11321 | actions.push(function () {
|
11322 | return _this.prepareControllers();
|
11323 | });
|
11324 | }
|
11325 | if (DependenciesEngine$1.entities.length > 0) {
|
11326 | actions.push(function () {
|
11327 | return _this.prepareEntities();
|
11328 | });
|
11329 | }
|
11330 | if (DependenciesEngine$1.injectables.length > 0) {
|
11331 | actions.push(function () {
|
11332 | return _this.prepareInjectables();
|
11333 | });
|
11334 | }
|
11335 | if (DependenciesEngine$1.interceptors.length > 0) {
|
11336 | actions.push(function () {
|
11337 | return _this.prepareInterceptors();
|
11338 | });
|
11339 | }
|
11340 | if (DependenciesEngine$1.guards.length > 0) {
|
11341 | actions.push(function () {
|
11342 | return _this.prepareGuards();
|
11343 | });
|
11344 | }
|
11345 | if (DependenciesEngine$1.routes &&
|
11346 | DependenciesEngine$1.routes.children.length > 0 &&
|
11347 | !Configuration$1.mainData.disableRoutesGraph) {
|
11348 | actions.push(function () {
|
11349 | return _this.prepareRoutes();
|
11350 | });
|
11351 | }
|
11352 | if (DependenciesEngine$1.pipes.length > 0) {
|
11353 | actions.push(function () {
|
11354 | return _this.preparePipes();
|
11355 | });
|
11356 | }
|
11357 | if (DependenciesEngine$1.classes.length > 0) {
|
11358 | actions.push(function () {
|
11359 | return _this.prepareClasses();
|
11360 | });
|
11361 | }
|
11362 | if (DependenciesEngine$1.interfaces.length > 0) {
|
11363 | actions.push(function () {
|
11364 | return _this.prepareInterfaces();
|
11365 | });
|
11366 | }
|
11367 | if (DependenciesEngine$1.miscellaneous.variables.length > 0 ||
|
11368 | DependenciesEngine$1.miscellaneous.functions.length > 0 ||
|
11369 | DependenciesEngine$1.miscellaneous.typealiases.length > 0 ||
|
11370 | DependenciesEngine$1.miscellaneous.enumerations.length > 0) {
|
11371 | actions.push(function () {
|
11372 | return _this.prepareMiscellaneous();
|
11373 | });
|
11374 | }
|
11375 | if (!Configuration$1.mainData.disableCoverage) {
|
11376 | actions.push(function () {
|
11377 | return _this.prepareCoverage();
|
11378 | });
|
11379 | }
|
11380 | if (Configuration$1.mainData.unitTestCoverage !== '') {
|
11381 | actions.push(function () {
|
11382 | return _this.prepareUnitTestCoverage();
|
11383 | });
|
11384 | }
|
11385 | if (Configuration$1.mainData.includes !== '') {
|
11386 | actions.push(function () {
|
11387 | return _this.prepareExternalIncludes();
|
11388 | });
|
11389 | }
|
11390 | promiseSequential(actions)
|
11391 | .then(function (res) {
|
11392 | if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
11393 | if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
|
11394 | logger.info("Generating documentation in export format " + Configuration$1.mainData.exportFormat);
|
11395 | ExportEngine$1["export"](Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
|
11396 | generationPromiseResolve();
|
11397 | _this.endCallback();
|
11398 | logger.info('Documentation generated in ' +
|
11399 | Configuration$1.mainData.output +
|
11400 | ' in ' +
|
11401 | _this.getElapsedTime() +
|
11402 | ' seconds');
|
11403 | if (Configuration$1.mainData.serve) {
|
11404 | logger.info("Serving documentation from " + Configuration$1.mainData.output + " at http://" + Configuration$1.mainData.hostname + ":" + Configuration$1.mainData.port);
|
11405 | _this.runWebServer(Configuration$1.mainData.output);
|
11406 | }
|
11407 | });
|
11408 | }
|
11409 | else {
|
11410 | logger.warn("Exported format not supported");
|
11411 | }
|
11412 | }
|
11413 | else {
|
11414 | _this.processGraphs();
|
11415 | }
|
11416 | })["catch"](function (errorMessage) {
|
11417 | logger.error(errorMessage);
|
11418 | process.exit(1);
|
11419 | });
|
11420 | };
|
11421 | Application.prototype.getIncludedPathForFile = function (file) {
|
11422 | return path__namespace.join(Configuration$1.mainData.includes, file);
|
11423 | };
|
11424 | Application.prototype.prepareExternalIncludes = function () {
|
11425 | var _this = this;
|
11426 | logger.info('Adding external markdown files');
|
11427 | // Scan include folder for files detailed in summary.json
|
11428 | // For each file, add to Configuration.mainData.additionalPages
|
11429 | // Each file will be converted to html page, inside COMPODOC_DEFAULTS.additionalEntryPath
|
11430 | return new Promise(function (resolve, reject) {
|
11431 | FileEngine$1.get(_this.getIncludedPathForFile('summary.json')).then(function (summaryData) {
|
11432 | logger.info('Additional documentation: summary.json file found');
|
11433 | var parsedSummaryData = JSON.parse(summaryData);
|
11434 | var that = _this;
|
11435 | var lastLevelOnePage = undefined;
|
11436 | traverse(parsedSummaryData).forEach(function () {
|
11437 | // tslint:disable-next-line:no-invalid-this
|
11438 | if (this.notRoot && typeof this.node === 'object') {
|
11439 | // tslint:disable-next-line:no-invalid-this
|
11440 | var rawPath = this.path;
|
11441 | // tslint:disable-next-line:no-invalid-this
|
11442 | var additionalNode = this.node;
|
11443 | var file = additionalNode.file;
|
11444 | var title = additionalNode.title;
|
11445 | var finalPath_1 = Configuration$1.mainData.includesFolder;
|
11446 | var finalDepth = rawPath.filter(function (el) {
|
11447 | return !isNaN(parseInt(el, 10));
|
11448 | });
|
11449 | if (typeof file !== 'undefined' && typeof title !== 'undefined') {
|
11450 | var url = cleanNameWithoutSpaceAndToLowerCase(title);
|
11451 | /**
|
11452 | * Id created with title + file path hash, seems to be hypothetically unique here
|
11453 | */
|
11454 | var id = crypto
|
11455 | .createHash('sha512')
|
11456 | .update(title + file)
|
11457 | .digest('hex');
|
11458 | // tslint:disable-next-line:no-invalid-this
|
11459 | this.node.id = id;
|
11460 | var lastElementRootTree_1 = undefined;
|
11461 | finalDepth.forEach(function (el) {
|
11462 | var elementTree = typeof lastElementRootTree_1 === 'undefined'
|
11463 | ? parsedSummaryData
|
11464 | : lastElementRootTree_1;
|
11465 | if (typeof elementTree.children !== 'undefined') {
|
11466 | elementTree = elementTree.children[el];
|
11467 | }
|
11468 | else {
|
11469 | elementTree = elementTree[el];
|
11470 | }
|
11471 | finalPath_1 +=
|
11472 | '/' +
|
11473 | cleanNameWithoutSpaceAndToLowerCase(elementTree.title);
|
11474 | lastElementRootTree_1 = elementTree;
|
11475 | });
|
11476 | finalPath_1 = finalPath_1.replace('/' + url, '');
|
11477 | var markdownFile = MarkdownEngine$1.getTraditionalMarkdownSync(that.getIncludedPathForFile(file));
|
11478 | if (finalDepth.length > 5) {
|
11479 | logger.error('Only 5 levels of depth are supported');
|
11480 | }
|
11481 | else {
|
11482 | var _page = {
|
11483 | name: title,
|
11484 | id: id,
|
11485 | filename: url,
|
11486 | context: 'additional-page',
|
11487 | path: finalPath_1,
|
11488 | additionalPage: markdownFile,
|
11489 | depth: finalDepth.length,
|
11490 | childrenLength: additionalNode.children
|
11491 | ? additionalNode.children.length
|
11492 | : 0,
|
11493 | children: [],
|
11494 | lastChild: false,
|
11495 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11496 | };
|
11497 | if (finalDepth.length === 1) {
|
11498 | lastLevelOnePage = _page;
|
11499 | }
|
11500 | if (finalDepth.length > 1) {
|
11501 | // store all child pages of the last root level 1 page inside it
|
11502 | lastLevelOnePage.children.push(_page);
|
11503 | }
|
11504 | else {
|
11505 | Configuration$1.addAdditionalPage(_page);
|
11506 | }
|
11507 | }
|
11508 | }
|
11509 | }
|
11510 | });
|
11511 | resolve();
|
11512 | }, function (errorMessage) {
|
11513 | logger.error(errorMessage);
|
11514 | reject('Error during Additional documentation generation');
|
11515 | });
|
11516 | });
|
11517 | };
|
11518 | Application.prototype.prepareModules = function (someModules) {
|
11519 | var _this = this;
|
11520 | logger.info('Prepare modules');
|
11521 | var i = 0;
|
11522 | var _modules = someModules ? someModules : DependenciesEngine$1.getModules();
|
11523 | return new Promise(function (resolve, reject) {
|
11524 | Configuration$1.mainData.modules = _modules.map(function (ngModule) {
|
11525 | ngModule.compodocLinks = {
|
11526 | components: [],
|
11527 | controllers: [],
|
11528 | directives: [],
|
11529 | injectables: [],
|
11530 | pipes: []
|
11531 | };
|
11532 | ['declarations', 'bootstrap', 'imports', 'exports', 'controllers'].forEach(function (metadataType) {
|
11533 | ngModule[metadataType] = ngModule[metadataType].filter(function (metaDataItem) {
|
11534 | switch (metaDataItem.type) {
|
11535 | case 'directive':
|
11536 | return DependenciesEngine$1.getDirectives().some(function (directive) {
|
11537 | var selectedDirective;
|
11538 | if (typeof metaDataItem.id !== 'undefined') {
|
11539 | selectedDirective =
|
11540 | directive.id === metaDataItem.id;
|
11541 | }
|
11542 | else {
|
11543 | selectedDirective =
|
11544 | directive.name === metaDataItem.name;
|
11545 | }
|
11546 | if (selectedDirective &&
|
11547 | !ngModule.compodocLinks.directives.includes(directive)) {
|
11548 | ngModule.compodocLinks.directives.push(directive);
|
11549 | }
|
11550 | return selectedDirective;
|
11551 | });
|
11552 | case 'component':
|
11553 | return DependenciesEngine$1.getComponents().some(function (component) {
|
11554 | var selectedComponent;
|
11555 | if (typeof metaDataItem.id !== 'undefined') {
|
11556 | selectedComponent =
|
11557 | component.id === metaDataItem.id;
|
11558 | }
|
11559 | else {
|
11560 | selectedComponent =
|
11561 | component.name === metaDataItem.name;
|
11562 | }
|
11563 | if (selectedComponent &&
|
11564 | !ngModule.compodocLinks.components.includes(component)) {
|
11565 | ngModule.compodocLinks.components.push(component);
|
11566 | }
|
11567 | return selectedComponent;
|
11568 | });
|
11569 | case 'controller':
|
11570 | return DependenciesEngine$1.getControllers().some(function (controller) {
|
11571 | var selectedController;
|
11572 | if (typeof metaDataItem.id !== 'undefined') {
|
11573 | selectedController =
|
11574 | controller.id === metaDataItem.id;
|
11575 | }
|
11576 | else {
|
11577 | selectedController =
|
11578 | controller.name === metaDataItem.name;
|
11579 | }
|
11580 | if (selectedController &&
|
11581 | !ngModule.compodocLinks.controllers.includes(controller)) {
|
11582 | ngModule.compodocLinks.controllers.push(controller);
|
11583 | }
|
11584 | return selectedController;
|
11585 | });
|
11586 | case 'module':
|
11587 | return DependenciesEngine$1.getModules().some(function (module) { return module.name === metaDataItem.name; });
|
11588 | case 'pipe':
|
11589 | return DependenciesEngine$1.getPipes().some(function (pipe) {
|
11590 | var selectedPipe;
|
11591 | if (typeof metaDataItem.id !== 'undefined') {
|
11592 | selectedPipe = pipe.id === metaDataItem.id;
|
11593 | }
|
11594 | else {
|
11595 | selectedPipe = pipe.name === metaDataItem.name;
|
11596 | }
|
11597 | if (selectedPipe &&
|
11598 | !ngModule.compodocLinks.pipes.includes(pipe)) {
|
11599 | ngModule.compodocLinks.pipes.push(pipe);
|
11600 | }
|
11601 | return selectedPipe;
|
11602 | });
|
11603 | default:
|
11604 | return true;
|
11605 | }
|
11606 | });
|
11607 | });
|
11608 | ngModule.providers = ngModule.providers.filter(function (provider) {
|
11609 | return (DependenciesEngine$1.getInjectables().some(function (injectable) {
|
11610 | var selectedInjectable = injectable.name === provider.name;
|
11611 | if (selectedInjectable &&
|
11612 | !ngModule.compodocLinks.injectables.includes(injectable)) {
|
11613 | ngModule.compodocLinks.injectables.push(injectable);
|
11614 | }
|
11615 | return selectedInjectable;
|
11616 | }) ||
|
11617 | DependenciesEngine$1.getInterceptors().some(function (interceptor) { return interceptor.name === provider.name; }));
|
11618 | });
|
11619 | // Try fixing type undefined for each providers
|
11620 | ___namespace.forEach(ngModule.providers, function (provider) {
|
11621 | if (DependenciesEngine$1.getInjectables().find(function (injectable) { return injectable.name === provider.name; })) {
|
11622 | provider.type = 'injectable';
|
11623 | }
|
11624 | if (DependenciesEngine$1.getInterceptors().find(function (interceptor) { return interceptor.name === provider.name; })) {
|
11625 | provider.type = 'interceptor';
|
11626 | }
|
11627 | });
|
11628 | // Order things
|
11629 | ngModule.compodocLinks.components = ___namespace.sortBy(ngModule.compodocLinks.components, [
|
11630 | 'name'
|
11631 | ]);
|
11632 | ngModule.compodocLinks.controllers = ___namespace.sortBy(ngModule.compodocLinks.controllers, [
|
11633 | 'name'
|
11634 | ]);
|
11635 | ngModule.compodocLinks.directives = ___namespace.sortBy(ngModule.compodocLinks.directives, [
|
11636 | 'name'
|
11637 | ]);
|
11638 | ngModule.compodocLinks.injectables = ___namespace.sortBy(ngModule.compodocLinks.injectables, [
|
11639 | 'name'
|
11640 | ]);
|
11641 | ngModule.compodocLinks.pipes = ___namespace.sortBy(ngModule.compodocLinks.pipes, ['name']);
|
11642 | ngModule.declarations = ___namespace.sortBy(ngModule.declarations, ['name']);
|
11643 | ngModule.entryComponents = ___namespace.sortBy(ngModule.entryComponents, ['name']);
|
11644 | ngModule.providers = ___namespace.sortBy(ngModule.providers, ['name']);
|
11645 | ngModule.imports = ___namespace.sortBy(ngModule.imports, ['name']);
|
11646 | ngModule.exports = ___namespace.sortBy(ngModule.exports, ['name']);
|
11647 | return ngModule;
|
11648 | });
|
11649 | Configuration$1.addPage({
|
11650 | name: 'modules',
|
11651 | id: 'modules',
|
11652 | context: 'modules',
|
11653 | depth: 0,
|
11654 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
11655 | });
|
11656 | var len = Configuration$1.mainData.modules.length;
|
11657 | var loop = function () {
|
11658 | if (i < len) {
|
11659 | if (MarkdownEngine$1.hasNeighbourReadmeFile(Configuration$1.mainData.modules[i].file)) {
|
11660 | logger.info(" " + Configuration$1.mainData.modules[i].name + " has a README file, include it");
|
11661 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(Configuration$1.mainData.modules[i].file);
|
11662 | Configuration$1.mainData.modules[i].readme = marked(readme);
|
11663 | }
|
11664 | Configuration$1.addPage({
|
11665 | path: 'modules',
|
11666 | name: Configuration$1.mainData.modules[i].name,
|
11667 | id: Configuration$1.mainData.modules[i].id,
|
11668 | navTabs: _this.getNavTabs(Configuration$1.mainData.modules[i]),
|
11669 | context: 'module',
|
11670 | module: Configuration$1.mainData.modules[i],
|
11671 | depth: 1,
|
11672 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11673 | });
|
11674 | i++;
|
11675 | loop();
|
11676 | }
|
11677 | else {
|
11678 | resolve();
|
11679 | }
|
11680 | };
|
11681 | loop();
|
11682 | });
|
11683 | };
|
11684 | Application.prototype.prepareInterfaces = function (someInterfaces) {
|
11685 | var _this = this;
|
11686 | logger.info('Prepare interfaces');
|
11687 | Configuration$1.mainData.interfaces = someInterfaces
|
11688 | ? someInterfaces
|
11689 | : DependenciesEngine$1.getInterfaces();
|
11690 | return new Promise(function (resolve, reject) {
|
11691 | var i = 0;
|
11692 | var len = Configuration$1.mainData.interfaces.length;
|
11693 | var loop = function () {
|
11694 | if (i < len) {
|
11695 | var interf = Configuration$1.mainData.interfaces[i];
|
11696 | if (MarkdownEngine$1.hasNeighbourReadmeFile(interf.file)) {
|
11697 | logger.info(" " + interf.name + " has a README file, include it");
|
11698 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(interf.file);
|
11699 | interf.readme = marked(readme);
|
11700 | }
|
11701 | var page = {
|
11702 | path: 'interfaces',
|
11703 | name: interf.name,
|
11704 | id: interf.id,
|
11705 | navTabs: _this.getNavTabs(interf),
|
11706 | context: 'interface',
|
11707 | interface: interf,
|
11708 | depth: 1,
|
11709 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11710 | };
|
11711 | if (interf.isDuplicate) {
|
11712 | page.name += '-' + interf.duplicateId;
|
11713 | }
|
11714 | Configuration$1.addPage(page);
|
11715 | i++;
|
11716 | loop();
|
11717 | }
|
11718 | else {
|
11719 | resolve();
|
11720 | }
|
11721 | };
|
11722 | loop();
|
11723 | });
|
11724 | };
|
11725 | Application.prototype.prepareMiscellaneous = function (someMisc) {
|
11726 | logger.info('Prepare miscellaneous');
|
11727 | Configuration$1.mainData.miscellaneous = someMisc
|
11728 | ? someMisc
|
11729 | : DependenciesEngine$1.getMiscellaneous();
|
11730 | return new Promise(function (resolve, reject) {
|
11731 | if (Configuration$1.mainData.miscellaneous.functions.length > 0) {
|
11732 | Configuration$1.addPage({
|
11733 | path: 'miscellaneous',
|
11734 | name: 'functions',
|
11735 | id: 'miscellaneous-functions',
|
11736 | context: 'miscellaneous-functions',
|
11737 | depth: 1,
|
11738 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11739 | });
|
11740 | }
|
11741 | if (Configuration$1.mainData.miscellaneous.variables.length > 0) {
|
11742 | Configuration$1.addPage({
|
11743 | path: 'miscellaneous',
|
11744 | name: 'variables',
|
11745 | id: 'miscellaneous-variables',
|
11746 | context: 'miscellaneous-variables',
|
11747 | depth: 1,
|
11748 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11749 | });
|
11750 | }
|
11751 | if (Configuration$1.mainData.miscellaneous.typealiases.length > 0) {
|
11752 | Configuration$1.addPage({
|
11753 | path: 'miscellaneous',
|
11754 | name: 'typealiases',
|
11755 | id: 'miscellaneous-typealiases',
|
11756 | context: 'miscellaneous-typealiases',
|
11757 | depth: 1,
|
11758 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11759 | });
|
11760 | }
|
11761 | if (Configuration$1.mainData.miscellaneous.enumerations.length > 0) {
|
11762 | Configuration$1.addPage({
|
11763 | path: 'miscellaneous',
|
11764 | name: 'enumerations',
|
11765 | id: 'miscellaneous-enumerations',
|
11766 | context: 'miscellaneous-enumerations',
|
11767 | depth: 1,
|
11768 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11769 | });
|
11770 | }
|
11771 | resolve();
|
11772 | });
|
11773 | };
|
11774 | Application.prototype.handleTemplateurl = function (component) {
|
11775 | var dirname = path__namespace.dirname(component.file);
|
11776 | var templatePath = path__namespace.resolve(dirname + path__namespace.sep + component.templateUrl);
|
11777 | if (!FileEngine$1.existsSync(templatePath)) {
|
11778 | var err = "Cannot read template for " + component.name;
|
11779 | logger.error(err);
|
11780 | return new Promise(function (resolve, reject) { });
|
11781 | }
|
11782 | return FileEngine$1.get(templatePath).then(function (data) { return (component.templateData = data); }, function (err) {
|
11783 | logger.error(err);
|
11784 | return Promise.reject('');
|
11785 | });
|
11786 | };
|
11787 | Application.prototype.handleStyles = function (component) {
|
11788 | var styles = component.styles;
|
11789 | component.stylesData = '';
|
11790 | return new Promise(function (resolveStyles, rejectStyles) {
|
11791 | styles.forEach(function (style) {
|
11792 | component.stylesData = component.stylesData + style + '\n';
|
11793 | });
|
11794 | resolveStyles();
|
11795 | });
|
11796 | };
|
11797 | Application.prototype.handleStyleurls = function (component) {
|
11798 | var dirname = path__namespace.dirname(component.file);
|
11799 | var styleDataPromise = component.styleUrls.map(function (styleUrl) {
|
11800 | var stylePath = path__namespace.resolve(dirname + path__namespace.sep + styleUrl);
|
11801 | if (!FileEngine$1.existsSync(stylePath)) {
|
11802 | var err = "Cannot read style url " + stylePath + " for " + component.name;
|
11803 | logger.error(err);
|
11804 | return new Promise(function (resolve, reject) { });
|
11805 | }
|
11806 | return new Promise(function (resolve, reject) {
|
11807 | FileEngine$1.get(stylePath).then(function (data) {
|
11808 | resolve({
|
11809 | data: data,
|
11810 | styleUrl: styleUrl
|
11811 | });
|
11812 | });
|
11813 | });
|
11814 | });
|
11815 | return Promise.all(styleDataPromise).then(function (data) { return (component.styleUrlsData = data); }, function (err) {
|
11816 | logger.error(err);
|
11817 | return Promise.reject('');
|
11818 | });
|
11819 | };
|
11820 | Application.prototype.getNavTabs = function (dependency) {
|
11821 | var navTabConfig = Configuration$1.mainData.navTabConfig;
|
11822 | var hasCustomNavTabConfig = navTabConfig.length !== 0;
|
11823 | navTabConfig =
|
11824 | navTabConfig.length === 0
|
11825 | ? ___namespace.cloneDeep(COMPODOC_CONSTANTS.navTabDefinitions)
|
11826 | : navTabConfig;
|
11827 | var matchDepType = function (depType) {
|
11828 | return depType === 'all' || depType === dependency.type;
|
11829 | };
|
11830 | var navTabs = [];
|
11831 | ___namespace.forEach(navTabConfig, function (customTab) {
|
11832 | var navTab = ___namespace.find(COMPODOC_CONSTANTS.navTabDefinitions, { id: customTab.id });
|
11833 | if (!navTab) {
|
11834 | throw new Error("Invalid tab ID '" + customTab.id + "' specified in tab configuration");
|
11835 | }
|
11836 | navTab.label = customTab.label;
|
11837 | if (hasCustomNavTabConfig) {
|
11838 | navTab.custom = true;
|
11839 | }
|
11840 | // is tab applicable to target dependency?
|
11841 | if (-1 === ___namespace.findIndex(navTab.depTypes, matchDepType)) {
|
11842 | return;
|
11843 | }
|
11844 | // global config
|
11845 | if (customTab.id === 'tree' && Configuration$1.mainData.disableDomTree) {
|
11846 | return;
|
11847 | }
|
11848 | if (customTab.id === 'source' && Configuration$1.mainData.disableSourceCode) {
|
11849 | return;
|
11850 | }
|
11851 | if (customTab.id === 'templateData' && Configuration$1.mainData.disableTemplateTab) {
|
11852 | return;
|
11853 | }
|
11854 | if (customTab.id === 'styleData' && Configuration$1.mainData.disableStyleTab) {
|
11855 | return;
|
11856 | }
|
11857 | // per dependency config
|
11858 | if (customTab.id === 'readme' && !dependency.readme) {
|
11859 | return;
|
11860 | }
|
11861 | if (customTab.id === 'example' && !dependency.exampleUrls) {
|
11862 | return;
|
11863 | }
|
11864 | if (customTab.id === 'templateData' &&
|
11865 | (!dependency.templateUrl || dependency.templateUrl.length === 0)) {
|
11866 | return;
|
11867 | }
|
11868 | if (customTab.id === 'styleData' &&
|
11869 | (!dependency.styleUrls || dependency.styleUrls.length === 0) &&
|
11870 | (!dependency.styles || dependency.styles.length === 0)) {
|
11871 | return;
|
11872 | }
|
11873 | navTabs.push(navTab);
|
11874 | });
|
11875 | if (navTabs.length === 0) {
|
11876 | throw new Error("No valid navigation tabs have been defined for dependency type '" + dependency.type + "'. Specify at least one config for the 'info' or 'source' tab in --navTabConfig.");
|
11877 | }
|
11878 | return navTabs;
|
11879 | };
|
11880 | Application.prototype.prepareControllers = function (someControllers) {
|
11881 | var _this = this;
|
11882 | logger.info('Prepare controllers');
|
11883 | Configuration$1.mainData.controllers = someControllers
|
11884 | ? someControllers
|
11885 | : DependenciesEngine$1.getControllers();
|
11886 | return new Promise(function (resolve, reject) {
|
11887 | var i = 0;
|
11888 | var len = Configuration$1.mainData.controllers.length;
|
11889 | var loop = function () {
|
11890 | if (i < len) {
|
11891 | var controller = Configuration$1.mainData.controllers[i];
|
11892 | var page = {
|
11893 | path: 'controllers',
|
11894 | name: controller.name,
|
11895 | id: controller.id,
|
11896 | navTabs: _this.getNavTabs(controller),
|
11897 | context: 'controller',
|
11898 | controller: controller,
|
11899 | depth: 1,
|
11900 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11901 | };
|
11902 | if (controller.isDuplicate) {
|
11903 | page.name += '-' + controller.duplicateId;
|
11904 | }
|
11905 | Configuration$1.addPage(page);
|
11906 | i++;
|
11907 | loop();
|
11908 | }
|
11909 | else {
|
11910 | resolve();
|
11911 | }
|
11912 | };
|
11913 | loop();
|
11914 | });
|
11915 | };
|
11916 | Application.prototype.prepareEntities = function (someEntities) {
|
11917 | var _this = this;
|
11918 | logger.info('Prepare entities');
|
11919 | Configuration$1.mainData.entities = someEntities
|
11920 | ? someEntities
|
11921 | : DependenciesEngine$1.getEntities();
|
11922 | return new Promise(function (resolve, reject) {
|
11923 | var i = 0;
|
11924 | var len = Configuration$1.mainData.entities.length;
|
11925 | var loop = function () {
|
11926 | if (i < len) {
|
11927 | var entity = Configuration$1.mainData.entities[i];
|
11928 | var page = {
|
11929 | path: 'entities',
|
11930 | name: entity.name,
|
11931 | id: entity.id,
|
11932 | navTabs: _this.getNavTabs(entity),
|
11933 | context: 'entity',
|
11934 | entity: entity,
|
11935 | depth: 1,
|
11936 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11937 | };
|
11938 | if (entity.isDuplicate) {
|
11939 | page.name += '-' + entity.duplicateId;
|
11940 | }
|
11941 | Configuration$1.addPage(page);
|
11942 | i++;
|
11943 | loop();
|
11944 | }
|
11945 | else {
|
11946 | resolve(true);
|
11947 | }
|
11948 | };
|
11949 | loop();
|
11950 | });
|
11951 | };
|
11952 | Application.prototype.prepareComponents = function (someComponents) {
|
11953 | var _this = this;
|
11954 | logger.info('Prepare components');
|
11955 | Configuration$1.mainData.components = someComponents
|
11956 | ? someComponents
|
11957 | : DependenciesEngine$1.getComponents();
|
11958 | return new Promise(function (mainPrepareComponentResolve, mainPrepareComponentReject) {
|
11959 | var i = 0;
|
11960 | var len = Configuration$1.mainData.components.length;
|
11961 | var loop = function () {
|
11962 | if (i <= len - 1) {
|
11963 | var component_1 = Configuration$1.mainData.components[i];
|
11964 | if (MarkdownEngine$1.hasNeighbourReadmeFile(component_1.file)) {
|
11965 | logger.info(" " + component_1.name + " has a README file, include it");
|
11966 | var readmeFile = MarkdownEngine$1.readNeighbourReadmeFile(component_1.file);
|
11967 | component_1.readme = marked(readmeFile);
|
11968 | }
|
11969 | var page = {
|
11970 | path: 'components',
|
11971 | name: component_1.name,
|
11972 | id: component_1.id,
|
11973 | navTabs: _this.getNavTabs(component_1),
|
11974 | context: 'component',
|
11975 | component: component_1,
|
11976 | depth: 1,
|
11977 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
11978 | };
|
11979 | if (component_1.isDuplicate) {
|
11980 | page.name += '-' + component_1.duplicateId;
|
11981 | }
|
11982 | Configuration$1.addPage(page);
|
11983 | var componentTemplateUrlPromise = new Promise(function (componentTemplateUrlResolve, componentTemplateUrlReject) {
|
11984 | if (component_1.templateUrl.length > 0) {
|
11985 | logger.info(" " + component_1.name + " has a templateUrl, include it");
|
11986 | _this.handleTemplateurl(component_1).then(function () {
|
11987 | componentTemplateUrlResolve();
|
11988 | }, function (e) {
|
11989 | logger.error(e);
|
11990 | componentTemplateUrlReject();
|
11991 | });
|
11992 | }
|
11993 | else {
|
11994 | componentTemplateUrlResolve();
|
11995 | }
|
11996 | });
|
11997 | var componentStyleUrlsPromise = new Promise(function (componentStyleUrlsResolve, componentStyleUrlsReject) {
|
11998 | if (component_1.styleUrls.length > 0) {
|
11999 | logger.info(" " + component_1.name + " has styleUrls, include them");
|
12000 | _this.handleStyleurls(component_1).then(function () {
|
12001 | componentStyleUrlsResolve();
|
12002 | }, function (e) {
|
12003 | logger.error(e);
|
12004 | componentStyleUrlsReject();
|
12005 | });
|
12006 | }
|
12007 | else {
|
12008 | componentStyleUrlsResolve();
|
12009 | }
|
12010 | });
|
12011 | var componentStylesPromise = new Promise(function (componentStylesResolve, componentStylesReject) {
|
12012 | if (component_1.styles.length > 0) {
|
12013 | logger.info(" " + component_1.name + " has styles, include them");
|
12014 | _this.handleStyles(component_1).then(function () {
|
12015 | componentStylesResolve();
|
12016 | }, function (e) {
|
12017 | logger.error(e);
|
12018 | componentStylesReject();
|
12019 | });
|
12020 | }
|
12021 | else {
|
12022 | componentStylesResolve();
|
12023 | }
|
12024 | });
|
12025 | Promise.all([
|
12026 | componentTemplateUrlPromise,
|
12027 | componentStyleUrlsPromise,
|
12028 | componentStylesPromise
|
12029 | ]).then(function () {
|
12030 | i++;
|
12031 | loop();
|
12032 | });
|
12033 | }
|
12034 | else {
|
12035 | mainPrepareComponentResolve();
|
12036 | }
|
12037 | };
|
12038 | loop();
|
12039 | });
|
12040 | };
|
12041 | Application.prototype.prepareDirectives = function (someDirectives) {
|
12042 | var _this = this;
|
12043 | logger.info('Prepare directives');
|
12044 | Configuration$1.mainData.directives = someDirectives
|
12045 | ? someDirectives
|
12046 | : DependenciesEngine$1.getDirectives();
|
12047 | return new Promise(function (resolve, reject) {
|
12048 | var i = 0;
|
12049 | var len = Configuration$1.mainData.directives.length;
|
12050 | var loop = function () {
|
12051 | if (i < len) {
|
12052 | var directive = Configuration$1.mainData.directives[i];
|
12053 | if (MarkdownEngine$1.hasNeighbourReadmeFile(directive.file)) {
|
12054 | logger.info(" " + directive.name + " has a README file, include it");
|
12055 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(directive.file);
|
12056 | directive.readme = marked(readme);
|
12057 | }
|
12058 | var page = {
|
12059 | path: 'directives',
|
12060 | name: directive.name,
|
12061 | id: directive.id,
|
12062 | navTabs: _this.getNavTabs(directive),
|
12063 | context: 'directive',
|
12064 | directive: directive,
|
12065 | depth: 1,
|
12066 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
12067 | };
|
12068 | if (directive.isDuplicate) {
|
12069 | page.name += '-' + directive.duplicateId;
|
12070 | }
|
12071 | Configuration$1.addPage(page);
|
12072 | i++;
|
12073 | loop();
|
12074 | }
|
12075 | else {
|
12076 | resolve();
|
12077 | }
|
12078 | };
|
12079 | loop();
|
12080 | });
|
12081 | };
|
12082 | Application.prototype.prepareInjectables = function (someInjectables) {
|
12083 | var _this = this;
|
12084 | logger.info('Prepare injectables');
|
12085 | Configuration$1.mainData.injectables = someInjectables
|
12086 | ? someInjectables
|
12087 | : DependenciesEngine$1.getInjectables();
|
12088 | return new Promise(function (resolve, reject) {
|
12089 | var i = 0;
|
12090 | var len = Configuration$1.mainData.injectables.length;
|
12091 | var loop = function () {
|
12092 | if (i < len) {
|
12093 | var injec = Configuration$1.mainData.injectables[i];
|
12094 | if (MarkdownEngine$1.hasNeighbourReadmeFile(injec.file)) {
|
12095 | logger.info(" " + injec.name + " has a README file, include it");
|
12096 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(injec.file);
|
12097 | injec.readme = marked(readme);
|
12098 | }
|
12099 | var page = {
|
12100 | path: 'injectables',
|
12101 | name: injec.name,
|
12102 | id: injec.id,
|
12103 | navTabs: _this.getNavTabs(injec),
|
12104 | context: 'injectable',
|
12105 | injectable: injec,
|
12106 | depth: 1,
|
12107 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
12108 | };
|
12109 | if (injec.isDuplicate) {
|
12110 | page.name += '-' + injec.duplicateId;
|
12111 | }
|
12112 | Configuration$1.addPage(page);
|
12113 | i++;
|
12114 | loop();
|
12115 | }
|
12116 | else {
|
12117 | resolve();
|
12118 | }
|
12119 | };
|
12120 | loop();
|
12121 | });
|
12122 | };
|
12123 | Application.prototype.prepareInterceptors = function (someInterceptors) {
|
12124 | var _this = this;
|
12125 | logger.info('Prepare interceptors');
|
12126 | Configuration$1.mainData.interceptors = someInterceptors
|
12127 | ? someInterceptors
|
12128 | : DependenciesEngine$1.getInterceptors();
|
12129 | return new Promise(function (resolve, reject) {
|
12130 | var i = 0;
|
12131 | var len = Configuration$1.mainData.interceptors.length;
|
12132 | var loop = function () {
|
12133 | if (i < len) {
|
12134 | var interceptor = Configuration$1.mainData.interceptors[i];
|
12135 | if (MarkdownEngine$1.hasNeighbourReadmeFile(interceptor.file)) {
|
12136 | logger.info(" " + interceptor.name + " has a README file, include it");
|
12137 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(interceptor.file);
|
12138 | interceptor.readme = marked(readme);
|
12139 | }
|
12140 | var page = {
|
12141 | path: 'interceptors',
|
12142 | name: interceptor.name,
|
12143 | id: interceptor.id,
|
12144 | navTabs: _this.getNavTabs(interceptor),
|
12145 | context: 'interceptor',
|
12146 | injectable: interceptor,
|
12147 | depth: 1,
|
12148 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
12149 | };
|
12150 | if (interceptor.isDuplicate) {
|
12151 | page.name += '-' + interceptor.duplicateId;
|
12152 | }
|
12153 | Configuration$1.addPage(page);
|
12154 | i++;
|
12155 | loop();
|
12156 | }
|
12157 | else {
|
12158 | resolve();
|
12159 | }
|
12160 | };
|
12161 | loop();
|
12162 | });
|
12163 | };
|
12164 | Application.prototype.prepareGuards = function (someGuards) {
|
12165 | var _this = this;
|
12166 | logger.info('Prepare guards');
|
12167 | Configuration$1.mainData.guards = someGuards ? someGuards : DependenciesEngine$1.getGuards();
|
12168 | return new Promise(function (resolve, reject) {
|
12169 | var i = 0;
|
12170 | var len = Configuration$1.mainData.guards.length;
|
12171 | var loop = function () {
|
12172 | if (i < len) {
|
12173 | var guard = Configuration$1.mainData.guards[i];
|
12174 | if (MarkdownEngine$1.hasNeighbourReadmeFile(guard.file)) {
|
12175 | logger.info(" " + guard.name + " has a README file, include it");
|
12176 | var readme = MarkdownEngine$1.readNeighbourReadmeFile(guard.file);
|
12177 | guard.readme = marked(readme);
|
12178 | }
|
12179 | var page = {
|
12180 | path: 'guards',
|
12181 | name: guard.name,
|
12182 | id: guard.id,
|
12183 | navTabs: _this.getNavTabs(guard),
|
12184 | context: 'guard',
|
12185 | injectable: guard,
|
12186 | depth: 1,
|
12187 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
12188 | };
|
12189 | if (guard.isDuplicate) {
|
12190 | page.name += '-' + guard.duplicateId;
|
12191 | }
|
12192 | Configuration$1.addPage(page);
|
12193 | i++;
|
12194 | loop();
|
12195 | }
|
12196 | else {
|
12197 | resolve();
|
12198 | }
|
12199 | };
|
12200 | loop();
|
12201 | });
|
12202 | };
|
12203 | Application.prototype.prepareRoutes = function () {
|
12204 | logger.info('Process routes');
|
12205 | Configuration$1.mainData.routes = DependenciesEngine$1.getRoutes();
|
12206 | return new Promise(function (resolve, reject) {
|
12207 | Configuration$1.addPage({
|
12208 | name: 'routes',
|
12209 | id: 'routes',
|
12210 | context: 'routes',
|
12211 | depth: 0,
|
12212 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
12213 | });
|
12214 | if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
12215 | RouterParserUtil$1.generateRoutesIndex(Configuration$1.mainData.output, Configuration$1.mainData.routes).then(function () {
|
12216 | logger.info(' Routes index generated');
|
12217 | resolve();
|
12218 | }, function (e) {
|
12219 | logger.error(e);
|
12220 | reject();
|
12221 | });
|
12222 | }
|
12223 | else {
|
12224 | resolve();
|
12225 | }
|
12226 | });
|
12227 | };
|
12228 | Application.prototype.prepareCoverage = function () {
|
12229 | logger.info('Process documentation coverage report');
|
12230 | return new Promise(function (resolve, reject) {
|
12231 | /*
|
12232 | * loop with components, directives, controllers, entities, classes, injectables, interfaces, pipes, guards, misc functions variables
|
12233 | */
|
12234 | var files = [];
|
12235 | var totalProjectStatementDocumented = 0;
|
12236 | var getStatus = function (percent) {
|
12237 | var status;
|
12238 | if (percent <= 25) {
|
12239 | status = 'low';
|
12240 | }
|
12241 | else if (percent > 25 && percent <= 50) {
|
12242 | status = 'medium';
|
12243 | }
|
12244 | else if (percent > 50 && percent <= 75) {
|
12245 | status = 'good';
|
12246 | }
|
12247 | else {
|
12248 | status = 'very-good';
|
12249 | }
|
12250 | return status;
|
12251 | };
|
12252 | var processComponentsAndDirectivesAndControllersAndEntities = function (list) {
|
12253 | ___namespace.forEach(list, function (el) {
|
12254 | var element = Object.assign({}, el);
|
12255 | if (!element.propertiesClass) {
|
12256 | element.propertiesClass = [];
|
12257 | }
|
12258 | if (!element.methodsClass) {
|
12259 | element.methodsClass = [];
|
12260 | }
|
12261 | if (!element.hostBindings) {
|
12262 | element.hostBindings = [];
|
12263 | }
|
12264 | if (!element.hostListeners) {
|
12265 | element.hostListeners = [];
|
12266 | }
|
12267 | if (!element.inputsClass) {
|
12268 | element.inputsClass = [];
|
12269 | }
|
12270 | if (!element.outputsClass) {
|
12271 | element.outputsClass = [];
|
12272 | }
|
12273 | var cl = {
|
12274 | filePath: element.file,
|
12275 | type: element.type,
|
12276 | linktype: element.type,
|
12277 | name: element.name
|
12278 | };
|
12279 | var totalStatementDocumented = 0;
|
12280 | var totalStatements = element.propertiesClass.length +
|
12281 | element.methodsClass.length +
|
12282 | element.inputsClass.length +
|
12283 | element.hostBindings.length +
|
12284 | element.hostListeners.length +
|
12285 | element.outputsClass.length +
|
12286 | 1; // +1 for element decorator comment
|
12287 | if (element.constructorObj) {
|
12288 | totalStatements += 1;
|
12289 | if (element.constructorObj &&
|
12290 | element.constructorObj.description &&
|
12291 | element.constructorObj.description !== '') {
|
12292 | totalStatementDocumented += 1;
|
12293 | }
|
12294 | }
|
12295 | if (element.description && element.description !== '') {
|
12296 | totalStatementDocumented += 1;
|
12297 | }
|
12298 | ___namespace.forEach(element.propertiesClass, function (property) {
|
12299 | if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12300 | // Doesn't handle private for coverage
|
12301 | totalStatements -= 1;
|
12302 | }
|
12303 | if (property.description &&
|
12304 | property.description !== '' &&
|
12305 | property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12306 | totalStatementDocumented += 1;
|
12307 | }
|
12308 | });
|
12309 | ___namespace.forEach(element.methodsClass, function (method) {
|
12310 | if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12311 | // Doesn't handle private for coverage
|
12312 | totalStatements -= 1;
|
12313 | }
|
12314 | if (method.description &&
|
12315 | method.description !== '' &&
|
12316 | method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12317 | totalStatementDocumented += 1;
|
12318 | }
|
12319 | });
|
12320 | ___namespace.forEach(element.hostBindings, function (property) {
|
12321 | if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12322 | // Doesn't handle private for coverage
|
12323 | totalStatements -= 1;
|
12324 | }
|
12325 | if (property.description &&
|
12326 | property.description !== '' &&
|
12327 | property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12328 | totalStatementDocumented += 1;
|
12329 | }
|
12330 | });
|
12331 | ___namespace.forEach(element.hostListeners, function (method) {
|
12332 | if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12333 | // Doesn't handle private for coverage
|
12334 | totalStatements -= 1;
|
12335 | }
|
12336 | if (method.description &&
|
12337 | method.description !== '' &&
|
12338 | method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12339 | totalStatementDocumented += 1;
|
12340 | }
|
12341 | });
|
12342 | ___namespace.forEach(element.inputsClass, function (input) {
|
12343 | if (input.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12344 | // Doesn't handle private for coverage
|
12345 | totalStatements -= 1;
|
12346 | }
|
12347 | if (input.description &&
|
12348 | input.description !== '' &&
|
12349 | input.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12350 | totalStatementDocumented += 1;
|
12351 | }
|
12352 | });
|
12353 | ___namespace.forEach(element.outputsClass, function (output) {
|
12354 | if (output.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12355 | // Doesn't handle private for coverage
|
12356 | totalStatements -= 1;
|
12357 | }
|
12358 | if (output.description &&
|
12359 | output.description !== '' &&
|
12360 | output.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12361 | totalStatementDocumented += 1;
|
12362 | }
|
12363 | });
|
12364 | cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
12365 | if (totalStatements === 0) {
|
12366 | cl.coveragePercent = 0;
|
12367 | }
|
12368 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
12369 | cl.status = getStatus(cl.coveragePercent);
|
12370 | totalProjectStatementDocumented += cl.coveragePercent;
|
12371 | files.push(cl);
|
12372 | });
|
12373 | };
|
12374 | var processCoveragePerFile = function () {
|
12375 | logger.info('Process documentation coverage per file');
|
12376 | logger.info('-------------------');
|
12377 | var overFiles = files.filter(function (f) {
|
12378 | var overTest = f.coveragePercent >= Configuration$1.mainData.coverageMinimumPerFile;
|
12379 | if (overTest && !Configuration$1.mainData.coverageTestShowOnlyFailed) {
|
12380 | logger.info(f.coveragePercent + " % for file " + f.filePath + " - " + f.name + " - over minimum per file");
|
12381 | }
|
12382 | return overTest;
|
12383 | });
|
12384 | var underFiles = files.filter(function (f) {
|
12385 | var underTest = f.coveragePercent < Configuration$1.mainData.coverageMinimumPerFile;
|
12386 | if (underTest) {
|
12387 | logger.error(f.coveragePercent + " % for file " + f.filePath + " - " + f.name + " - under minimum per file");
|
12388 | }
|
12389 | return underTest;
|
12390 | });
|
12391 | logger.info('-------------------');
|
12392 | return {
|
12393 | overFiles: overFiles,
|
12394 | underFiles: underFiles
|
12395 | };
|
12396 | };
|
12397 | var processFunctionsAndVariables = function (id, type) {
|
12398 | ___namespace.forEach(id, function (el) {
|
12399 | var cl = {
|
12400 | filePath: el.file,
|
12401 | type: type,
|
12402 | linktype: el.type,
|
12403 | linksubtype: el.subtype,
|
12404 | name: el.name
|
12405 | };
|
12406 | if (type === 'variable' || type === 'function') {
|
12407 | cl.linktype = 'miscellaneous';
|
12408 | }
|
12409 | var totalStatementDocumented = 0;
|
12410 | var totalStatements = 1;
|
12411 | if (el.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12412 | // Doesn't handle private for coverage
|
12413 | totalStatements -= 1;
|
12414 | }
|
12415 | if (el.description &&
|
12416 | el.description !== '' &&
|
12417 | el.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12418 | totalStatementDocumented += 1;
|
12419 | }
|
12420 | cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
12421 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
12422 | cl.status = getStatus(cl.coveragePercent);
|
12423 | totalProjectStatementDocumented += cl.coveragePercent;
|
12424 | files.push(cl);
|
12425 | });
|
12426 | };
|
12427 | var processClasses = function (list, type, linktype) {
|
12428 | ___namespace.forEach(list, function (cl) {
|
12429 | var element = Object.assign({}, cl);
|
12430 | if (!element.properties) {
|
12431 | element.properties = [];
|
12432 | }
|
12433 | if (!element.methods) {
|
12434 | element.methods = [];
|
12435 | }
|
12436 | var cla = {
|
12437 | filePath: element.file,
|
12438 | type: type,
|
12439 | linktype: linktype,
|
12440 | name: element.name
|
12441 | };
|
12442 | var totalStatementDocumented = 0;
|
12443 | var totalStatements = element.properties.length + element.methods.length + 1; // +1 for element itself
|
12444 | if (element.constructorObj) {
|
12445 | totalStatements += 1;
|
12446 | if (element.constructorObj &&
|
12447 | element.constructorObj.description &&
|
12448 | element.constructorObj.description !== '') {
|
12449 | totalStatementDocumented += 1;
|
12450 | }
|
12451 | }
|
12452 | if (element.description && element.description !== '') {
|
12453 | totalStatementDocumented += 1;
|
12454 | }
|
12455 | ___namespace.forEach(element.properties, function (property) {
|
12456 | if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12457 | // Doesn't handle private for coverage
|
12458 | totalStatements -= 1;
|
12459 | }
|
12460 | if (property.description &&
|
12461 | property.description !== '' &&
|
12462 | property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12463 | totalStatementDocumented += 1;
|
12464 | }
|
12465 | });
|
12466 | ___namespace.forEach(element.methods, function (method) {
|
12467 | if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
12468 | // Doesn't handle private for coverage
|
12469 | totalStatements -= 1;
|
12470 | }
|
12471 | if (method.description &&
|
12472 | method.description !== '' &&
|
12473 | method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
12474 | totalStatementDocumented += 1;
|
12475 | }
|
12476 | });
|
12477 | cla.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
12478 | if (totalStatements === 0) {
|
12479 | cla.coveragePercent = 0;
|
12480 | }
|
12481 | cla.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
12482 | cla.status = getStatus(cla.coveragePercent);
|
12483 | totalProjectStatementDocumented += cla.coveragePercent;
|
12484 | files.push(cla);
|
12485 | });
|
12486 | };
|
12487 | processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.components);
|
12488 | processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.directives);
|
12489 | processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.controllers);
|
12490 | processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.entities);
|
12491 | processClasses(Configuration$1.mainData.classes, 'class', 'classe');
|
12492 | processClasses(Configuration$1.mainData.injectables, 'injectable', 'injectable');
|
12493 | processClasses(Configuration$1.mainData.interfaces, 'interface', 'interface');
|
12494 | processClasses(Configuration$1.mainData.guards, 'guard', 'guard');
|
12495 | processClasses(Configuration$1.mainData.interceptors, 'interceptor', 'interceptor');
|
12496 | ___namespace.forEach(Configuration$1.mainData.pipes, function (pipe) {
|
12497 | var cl = {
|
12498 | filePath: pipe.file,
|
12499 | type: pipe.type,
|
12500 | linktype: pipe.type,
|
12501 | name: pipe.name
|
12502 | };
|
12503 | var totalStatementDocumented = 0;
|
12504 | var totalStatements = 1;
|
12505 | if (pipe.description && pipe.description !== '') {
|
12506 | totalStatementDocumented += 1;
|
12507 | }
|
12508 | cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
12509 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
12510 | cl.status = getStatus(cl.coveragePercent);
|
12511 | totalProjectStatementDocumented += cl.coveragePercent;
|
12512 | files.push(cl);
|
12513 | });
|
12514 | processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.functions, 'function');
|
12515 | processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.variables, 'variable');
|
12516 | files = ___namespace.sortBy(files, ['filePath']);
|
12517 | var coverageData = {
|
12518 | count: files.length > 0
|
12519 | ? Math.floor(totalProjectStatementDocumented / files.length)
|
12520 | : 0,
|
12521 | status: '',
|
12522 | files: files
|
12523 | };
|
12524 | coverageData.status = getStatus(coverageData.count);
|
12525 | Configuration$1.addPage({
|
12526 | name: 'coverage',
|
12527 | id: 'coverage',
|
12528 | context: 'coverage',
|
12529 | files: files,
|
12530 | data: coverageData,
|
12531 | depth: 0,
|
12532 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
12533 | });
|
12534 | coverageData.files = files;
|
12535 | Configuration$1.mainData.coverageData = coverageData;
|
12536 | if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
12537 | HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, 'documentation', coverageData);
|
12538 | }
|
12539 | files = ___namespace.sortBy(files, ['coveragePercent']);
|
12540 | var coverageTestPerFileResults;
|
12541 | if (Configuration$1.mainData.coverageTest &&
|
12542 | !Configuration$1.mainData.coverageTestPerFile) {
|
12543 | // Global coverage test and not per file
|
12544 | if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold) {
|
12545 | logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + Configuration$1.mainData.coverageTestThreshold + "%)");
|
12546 | generationPromiseResolve();
|
12547 | process.exit(0);
|
12548 | }
|
12549 | else {
|
12550 | var message = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + Configuration$1.mainData.coverageTestThreshold + "%)";
|
12551 | generationPromiseReject();
|
12552 | if (Configuration$1.mainData.coverageTestThresholdFail) {
|
12553 | logger.error(message);
|
12554 | process.exit(1);
|
12555 | }
|
12556 | else {
|
12557 | logger.warn(message);
|
12558 | process.exit(0);
|
12559 | }
|
12560 | }
|
12561 | }
|
12562 | else if (!Configuration$1.mainData.coverageTest &&
|
12563 | Configuration$1.mainData.coverageTestPerFile) {
|
12564 | coverageTestPerFileResults = processCoveragePerFile();
|
12565 | // Per file coverage test and not global
|
12566 | if (coverageTestPerFileResults.underFiles.length > 0) {
|
12567 | var message = "Documentation coverage per file is not over threshold (" + Configuration$1.mainData.coverageMinimumPerFile + "%)";
|
12568 | generationPromiseReject();
|
12569 | if (Configuration$1.mainData.coverageTestThresholdFail) {
|
12570 | logger.error(message);
|
12571 | process.exit(1);
|
12572 | }
|
12573 | else {
|
12574 | logger.warn(message);
|
12575 | process.exit(0);
|
12576 | }
|
12577 | }
|
12578 | else {
|
12579 | logger.info("Documentation coverage per file is over threshold (" + Configuration$1.mainData.coverageMinimumPerFile + "%)");
|
12580 | generationPromiseResolve();
|
12581 | process.exit(0);
|
12582 | }
|
12583 | }
|
12584 | else if (Configuration$1.mainData.coverageTest &&
|
12585 | Configuration$1.mainData.coverageTestPerFile) {
|
12586 | // Per file coverage test and global
|
12587 | coverageTestPerFileResults = processCoveragePerFile();
|
12588 | if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
|
12589 | coverageTestPerFileResults.underFiles.length === 0) {
|
12590 | logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + Configuration$1.mainData.coverageTestThreshold + "%)");
|
12591 | logger.info("Documentation coverage per file is over threshold (" + Configuration$1.mainData.coverageMinimumPerFile + "%)");
|
12592 | generationPromiseResolve();
|
12593 | process.exit(0);
|
12594 | }
|
12595 | else if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
|
12596 | coverageTestPerFileResults.underFiles.length > 0) {
|
12597 | logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + Configuration$1.mainData.coverageTestThreshold + "%)");
|
12598 | var message = "Documentation coverage per file is not over threshold (" + Configuration$1.mainData.coverageMinimumPerFile + "%)";
|
12599 | generationPromiseReject();
|
12600 | if (Configuration$1.mainData.coverageTestThresholdFail) {
|
12601 | logger.error(message);
|
12602 | process.exit(1);
|
12603 | }
|
12604 | else {
|
12605 | logger.warn(message);
|
12606 | process.exit(0);
|
12607 | }
|
12608 | }
|
12609 | else if (coverageData.count < Configuration$1.mainData.coverageTestThreshold &&
|
12610 | coverageTestPerFileResults.underFiles.length > 0) {
|
12611 | var messageGlobal = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + Configuration$1.mainData.coverageTestThreshold + "%)", messagePerFile = "Documentation coverage per file is not over threshold (" + Configuration$1.mainData.coverageMinimumPerFile + "%)";
|
12612 | generationPromiseReject();
|
12613 | if (Configuration$1.mainData.coverageTestThresholdFail) {
|
12614 | logger.error(messageGlobal);
|
12615 | logger.error(messagePerFile);
|
12616 | process.exit(1);
|
12617 | }
|
12618 | else {
|
12619 | logger.warn(messageGlobal);
|
12620 | logger.warn(messagePerFile);
|
12621 | process.exit(0);
|
12622 | }
|
12623 | }
|
12624 | else {
|
12625 | var message = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + Configuration$1.mainData.coverageTestThreshold + "%)", messagePerFile = "Documentation coverage per file is over threshold (" + Configuration$1.mainData.coverageMinimumPerFile + "%)";
|
12626 | generationPromiseReject();
|
12627 | if (Configuration$1.mainData.coverageTestThresholdFail) {
|
12628 | logger.error(message);
|
12629 | logger.info(messagePerFile);
|
12630 | process.exit(1);
|
12631 | }
|
12632 | else {
|
12633 | logger.warn(message);
|
12634 | logger.info(messagePerFile);
|
12635 | process.exit(0);
|
12636 | }
|
12637 | }
|
12638 | }
|
12639 | else {
|
12640 | resolve();
|
12641 | }
|
12642 | });
|
12643 | };
|
12644 | Application.prototype.prepareUnitTestCoverage = function () {
|
12645 | logger.info('Process unit test coverage report');
|
12646 | return new Promise(function (resolve, reject) {
|
12647 | var covDat, covFileNames;
|
12648 | var coverageData = Configuration$1.mainData.coverageData;
|
12649 | if (!coverageData.files) {
|
12650 | logger.warn('Missing documentation coverage data');
|
12651 | }
|
12652 | else {
|
12653 | covDat = {};
|
12654 | covFileNames = ___namespace.map(coverageData.files, function (el) {
|
12655 | var fileName = path__namespace.normalize(el.filePath);
|
12656 | covDat[fileName] = {
|
12657 | type: el.type,
|
12658 | linktype: el.linktype,
|
12659 | linksubtype: el.linksubtype,
|
12660 | name: el.name
|
12661 | };
|
12662 | return fileName;
|
12663 | });
|
12664 | }
|
12665 | // read coverage summary file and data
|
12666 | var unitTestSummary = {};
|
12667 | var fileDat = FileEngine$1.getSync(Configuration$1.mainData.unitTestCoverage);
|
12668 | if (fileDat) {
|
12669 | unitTestSummary = JSON.parse(fileDat);
|
12670 | }
|
12671 | else {
|
12672 | return Promise.reject('Error reading unit test coverage file');
|
12673 | }
|
12674 | var getCovStatus = function (percent, totalLines) {
|
12675 | var status;
|
12676 | if (totalLines === 0) {
|
12677 | status = 'uncovered';
|
12678 | }
|
12679 | else if (percent <= 25) {
|
12680 | status = 'low';
|
12681 | }
|
12682 | else if (percent > 25 && percent <= 50) {
|
12683 | status = 'medium';
|
12684 | }
|
12685 | else if (percent > 50 && percent <= 75) {
|
12686 | status = 'good';
|
12687 | }
|
12688 | else {
|
12689 | status = 'very-good';
|
12690 | }
|
12691 | return status;
|
12692 | };
|
12693 | var getCoverageData = function (data, fileName) {
|
12694 | var out = {};
|
12695 | if (fileName !== 'total') {
|
12696 | if (covDat === undefined) {
|
12697 | // need a name to include in output but this isn't visible
|
12698 | out = { name: fileName, filePath: fileName };
|
12699 | }
|
12700 | else {
|
12701 | var findMatch = ___namespace.filter(covFileNames, function (el) {
|
12702 | var normalizedFilename = path__namespace.normalize(fileName).replace(/\\/g, '/');
|
12703 | return el.includes(fileName) || normalizedFilename.includes(el);
|
12704 | });
|
12705 | if (findMatch.length > 0) {
|
12706 | out = ___namespace.clone(covDat[findMatch[0]]);
|
12707 | out['filePath'] = fileName;
|
12708 | }
|
12709 | }
|
12710 | }
|
12711 | var keysToGet = ['statements', 'branches', 'functions', 'lines'];
|
12712 | ___namespace.forEach(keysToGet, function (key) {
|
12713 | if (data[key]) {
|
12714 | var t = data[key];
|
12715 | out[key] = {
|
12716 | coveragePercent: Math.round(t.pct),
|
12717 | coverageCount: '' + t.covered + '/' + t.total,
|
12718 | status: getCovStatus(t.pct, t.total)
|
12719 | };
|
12720 | }
|
12721 | });
|
12722 | return out;
|
12723 | };
|
12724 | var unitTestData = {};
|
12725 | var files = [];
|
12726 | for (var file in unitTestSummary) {
|
12727 | var dat = getCoverageData(unitTestSummary[file], file);
|
12728 | if (file === 'total') {
|
12729 | unitTestData['total'] = dat;
|
12730 | }
|
12731 | else {
|
12732 | files.push(dat);
|
12733 | }
|
12734 | }
|
12735 | unitTestData['files'] = files;
|
12736 | unitTestData['idColumn'] = covDat !== undefined; // should we include the id column
|
12737 | Configuration$1.mainData.unitTestData = unitTestData;
|
12738 | Configuration$1.addPage({
|
12739 | name: 'unit-test',
|
12740 | id: 'unit-test',
|
12741 | context: 'unit-test',
|
12742 | files: files,
|
12743 | data: unitTestData,
|
12744 | depth: 0,
|
12745 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
12746 | });
|
12747 | if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
12748 | var keysToGet = ['statements', 'branches', 'functions', 'lines'];
|
12749 | ___namespace.forEach(keysToGet, function (key) {
|
12750 | if (unitTestData['total'][key]) {
|
12751 | HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, key, {
|
12752 | count: unitTestData['total'][key]['coveragePercent'],
|
12753 | status: unitTestData['total'][key]['status']
|
12754 | });
|
12755 | }
|
12756 | });
|
12757 | }
|
12758 | resolve();
|
12759 | });
|
12760 | };
|
12761 | Application.prototype.processPage = function (page) {
|
12762 | logger.info('Process page', page.name);
|
12763 | var htmlData = HtmlEngine$1.render(Configuration$1.mainData, page);
|
12764 | var finalPath = Configuration$1.mainData.output;
|
12765 | if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
|
12766 | finalPath += '/';
|
12767 | }
|
12768 | if (page.path) {
|
12769 | finalPath += page.path + '/';
|
12770 | }
|
12771 | if (page.filename) {
|
12772 | finalPath += page.filename + '.html';
|
12773 | }
|
12774 | else {
|
12775 | finalPath += page.name + '.html';
|
12776 | }
|
12777 | if (!Configuration$1.mainData.disableSearch) {
|
12778 | SearchEngine$1.indexPage({
|
12779 | infos: page,
|
12780 | rawData: htmlData,
|
12781 | url: finalPath
|
12782 | });
|
12783 | }
|
12784 | FileEngine$1.writeSync(finalPath, htmlData);
|
12785 | return Promise.resolve();
|
12786 | };
|
12787 | Application.prototype.processPages = function () {
|
12788 | var _this = this;
|
12789 | var pages = ___namespace.sortBy(Configuration$1.pages, ['name']);
|
12790 | logger.info('Process pages');
|
12791 | Promise.all(pages.map(function (page) { return _this.processPage(page); }))
|
12792 | .then(function () {
|
12793 | var callbacksAfterGenerateSearchIndexJson = function () {
|
12794 | if (Configuration$1.mainData.additionalPages.length > 0) {
|
12795 | _this.processAdditionalPages();
|
12796 | }
|
12797 | else {
|
12798 | if (Configuration$1.mainData.assetsFolder !== '') {
|
12799 | _this.processAssetsFolder();
|
12800 | }
|
12801 | _this.processResources();
|
12802 | }
|
12803 | };
|
12804 | if (!Configuration$1.mainData.disableSearch) {
|
12805 | SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
|
12806 | callbacksAfterGenerateSearchIndexJson();
|
12807 | }, function (e) {
|
12808 | logger.error(e);
|
12809 | });
|
12810 | }
|
12811 | else {
|
12812 | callbacksAfterGenerateSearchIndexJson();
|
12813 | }
|
12814 | })
|
12815 | .then(function () {
|
12816 | return _this.processMenu(Configuration$1.mainData);
|
12817 | })["catch"](function (e) {
|
12818 | logger.error(e);
|
12819 | });
|
12820 | };
|
12821 | Application.prototype.transpileMenuWCToES5 = function (es6Code) {
|
12822 | return babel.transformAsync(es6Code, {
|
12823 | cwd: __dirname,
|
12824 | filename: 'menu-wc_es5.js',
|
12825 | presets: [
|
12826 | [
|
12827 | '@babel/preset-env',
|
12828 | {
|
12829 | targets: {
|
12830 | ie: '11'
|
12831 | }
|
12832 | }
|
12833 | ]
|
12834 | ],
|
12835 | plugins: [
|
12836 | [
|
12837 | '@babel/plugin-proposal-private-methods',
|
12838 | {
|
12839 | loose: false
|
12840 | }
|
12841 | ]
|
12842 | ]
|
12843 | });
|
12844 | };
|
12845 | Application.prototype.processMenu = function (mainData) {
|
12846 | var _this = this;
|
12847 | logger.info('Process menu...');
|
12848 | return new Promise(function (resolveProcessMenu, rejectProcessMenu) {
|
12849 | var output = mainData.output.slice();
|
12850 | var outputLastCharacter = output.lastIndexOf('/');
|
12851 | if (outputLastCharacter !== -1) {
|
12852 | output = output.slice(0, -1);
|
12853 | }
|
12854 | var finalPathES6 = output + "/js/menu-wc.js";
|
12855 | var finalPathES5 = output + "/js/menu-wc_es5.js";
|
12856 | HtmlEngine$1.renderMenu(Configuration$1.mainData.templates, mainData)
|
12857 | .then(function (htmlData) {
|
12858 | FileEngine$1.write(finalPathES6, htmlData)
|
12859 | .then(function () {
|
12860 | _this.transpileMenuWCToES5(htmlData)
|
12861 | .then(function (es5Data) {
|
12862 | FileEngine$1.write(finalPathES5, es5Data.code)
|
12863 | .then(function () {
|
12864 | resolveProcessMenu();
|
12865 | })["catch"](function (err) {
|
12866 | logger.error('Error during ' + finalPathES5 + ' page generation');
|
12867 | logger.error(err);
|
12868 | return rejectProcessMenu('');
|
12869 | });
|
12870 | })["catch"](function (err) {
|
12871 | logger.error('Error during ' + finalPathES5 + ' page generation');
|
12872 | logger.error(err);
|
12873 | return rejectProcessMenu('');
|
12874 | });
|
12875 | })["catch"](function (err) {
|
12876 | logger.error('Error during ' + finalPathES6 + ' page generation');
|
12877 | logger.error(err);
|
12878 | return rejectProcessMenu('');
|
12879 | });
|
12880 | })["catch"](function (err) {
|
12881 | logger.error('Error during ' + finalPathES6 + ' page generation');
|
12882 | logger.error(err);
|
12883 | return rejectProcessMenu('');
|
12884 | });
|
12885 | });
|
12886 | };
|
12887 | Application.prototype.processAdditionalPages = function () {
|
12888 | var _this = this;
|
12889 | logger.info('Process additional pages');
|
12890 | var pages = Configuration$1.mainData.additionalPages;
|
12891 | Promise.all(pages.map(function (page) {
|
12892 | if (page.children.length > 0) {
|
12893 | return Promise.all(__spreadArray([
|
12894 | _this.processPage(page)
|
12895 | ], __read(page.children.map(function (childPage) { return _this.processPage(childPage); })), false));
|
12896 | }
|
12897 | else {
|
12898 | return _this.processPage(page);
|
12899 | }
|
12900 | }))
|
12901 | .then(function () {
|
12902 | SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
|
12903 | if (Configuration$1.mainData.assetsFolder !== '') {
|
12904 | _this.processAssetsFolder();
|
12905 | }
|
12906 | _this.processResources();
|
12907 | });
|
12908 | })["catch"](function (e) {
|
12909 | logger.error(e);
|
12910 | return Promise.reject(e);
|
12911 | });
|
12912 | };
|
12913 | Application.prototype.processAssetsFolder = function () {
|
12914 | logger.info('Copy assets folder');
|
12915 | if (!FileEngine$1.existsSync(Configuration$1.mainData.assetsFolder)) {
|
12916 | logger.error("Provided assets folder " + Configuration$1.mainData.assetsFolder + " did not exist");
|
12917 | }
|
12918 | else {
|
12919 | var finalOutput = Configuration$1.mainData.output;
|
12920 | var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
|
12921 | if (testOutputDir && testOutputDir.length > 0) {
|
12922 | finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
|
12923 | }
|
12924 | var destination = path__namespace.join(finalOutput, path__namespace.basename(Configuration$1.mainData.assetsFolder));
|
12925 | fs__namespace.copy(path__namespace.resolve(Configuration$1.mainData.assetsFolder), path__namespace.resolve(destination), function (err) {
|
12926 | if (err) {
|
12927 | logger.error('Error during resources copy ', err);
|
12928 | }
|
12929 | });
|
12930 | }
|
12931 | };
|
12932 | Application.prototype.processResources = function () {
|
12933 | var _this = this;
|
12934 | logger.info('Copy main resources');
|
12935 | var onComplete = function () {
|
12936 | logger.info('Documentation generated in ' +
|
12937 | Configuration$1.mainData.output +
|
12938 | ' in ' +
|
12939 | _this.getElapsedTime() +
|
12940 | ' seconds using ' +
|
12941 | Configuration$1.mainData.theme +
|
12942 | ' theme');
|
12943 | if (Configuration$1.mainData.serve) {
|
12944 | logger.info("Serving documentation from " + Configuration$1.mainData.output + " at http://" + Configuration$1.mainData.hostname + ":" + Configuration$1.mainData.port);
|
12945 | _this.runWebServer(Configuration$1.mainData.output);
|
12946 | }
|
12947 | else {
|
12948 | generationPromiseResolve();
|
12949 | _this.endCallback();
|
12950 | }
|
12951 | };
|
12952 | var finalOutput = Configuration$1.mainData.output;
|
12953 | var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
|
12954 | if (testOutputDir && testOutputDir.length > 0) {
|
12955 | finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
|
12956 | }
|
12957 | fs__namespace.copy(path__namespace.resolve(__dirname + '/../src/resources/'), path__namespace.resolve(finalOutput), function (errorCopy) {
|
12958 | if (errorCopy) {
|
12959 | logger.error('Error during resources copy ', errorCopy);
|
12960 | }
|
12961 | else {
|
12962 | var extThemePromise = new Promise(function (extThemeResolve, extThemeReject) {
|
12963 | if (Configuration$1.mainData.extTheme) {
|
12964 | fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.extTheme), path__namespace.resolve(finalOutput + '/styles/'), function (errorCopyTheme) {
|
12965 | if (errorCopyTheme) {
|
12966 | logger.error('Error during external styling theme copy ', errorCopyTheme);
|
12967 | extThemeReject();
|
12968 | }
|
12969 | else {
|
12970 | logger.info('External styling theme copy succeeded');
|
12971 | extThemeResolve();
|
12972 | }
|
12973 | });
|
12974 | }
|
12975 | else {
|
12976 | extThemeResolve();
|
12977 | }
|
12978 | });
|
12979 | var customFaviconPromise = new Promise(function (customFaviconResolve, customFaviconReject) {
|
12980 | if (Configuration$1.mainData.customFavicon !== '') {
|
12981 | logger.info("Custom favicon supplied");
|
12982 | fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customFavicon), path__namespace.resolve(finalOutput + '/images/favicon.ico'), function (errorCopyFavicon) {
|
12983 | // tslint:disable-line
|
12984 | if (errorCopyFavicon) {
|
12985 | logger.error('Error during resources copy of favicon', errorCopyFavicon);
|
12986 | customFaviconReject();
|
12987 | }
|
12988 | else {
|
12989 | logger.info('External custom favicon copy succeeded');
|
12990 | customFaviconResolve();
|
12991 | }
|
12992 | });
|
12993 | }
|
12994 | else {
|
12995 | customFaviconResolve();
|
12996 | }
|
12997 | });
|
12998 | var customLogoPromise = new Promise(function (customLogoResolve, customLogoReject) {
|
12999 | if (Configuration$1.mainData.customLogo !== '') {
|
13000 | logger.info("Custom logo supplied");
|
13001 | fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customLogo), path__namespace.resolve(finalOutput +
|
13002 | '/images/' +
|
13003 | Configuration$1.mainData.customLogo.split('/').pop()), function (errorCopyLogo) {
|
13004 | // tslint:disable-line
|
13005 | if (errorCopyLogo) {
|
13006 | logger.error('Error during resources copy of logo', errorCopyLogo);
|
13007 | customLogoReject();
|
13008 | }
|
13009 | else {
|
13010 | logger.info('External custom logo copy succeeded');
|
13011 | customLogoResolve();
|
13012 | }
|
13013 | });
|
13014 | }
|
13015 | else {
|
13016 | customLogoResolve();
|
13017 | }
|
13018 | });
|
13019 | Promise.all([extThemePromise, customFaviconPromise, customLogoPromise]).then(function () {
|
13020 | onComplete();
|
13021 | });
|
13022 | }
|
13023 | });
|
13024 | };
|
13025 | /**
|
13026 | * Calculates the elapsed time since the program was started.
|
13027 | *
|
13028 | * @returns {number}
|
13029 | */
|
13030 | Application.prototype.getElapsedTime = function () {
|
13031 | return (new Date().valueOf() - startTime.valueOf()) / 1000;
|
13032 | };
|
13033 | Application.prototype.processGraphs = function () {
|
13034 | var _this = this;
|
13035 | if (Configuration$1.mainData.disableGraph) {
|
13036 | logger.info('Graph generation disabled');
|
13037 | this.processPages();
|
13038 | }
|
13039 | else {
|
13040 | logger.info('Process main graph');
|
13041 | var modules_1 = Configuration$1.mainData.modules;
|
13042 | var i_1 = 0;
|
13043 | var len_1 = modules_1.length;
|
13044 | var loop_1 = function () {
|
13045 | if (i_1 <= len_1 - 1) {
|
13046 | logger.info('Process module graph ', modules_1[i_1].name);
|
13047 | var finalPath_2 = Configuration$1.mainData.output;
|
13048 | if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
|
13049 | finalPath_2 += '/';
|
13050 | }
|
13051 | finalPath_2 += 'modules/' + modules_1[i_1].name;
|
13052 | var _rawModule = DependenciesEngine$1.getRawModule(modules_1[i_1].name);
|
13053 | if (_rawModule.declarations.length > 0 ||
|
13054 | _rawModule.bootstrap.length > 0 ||
|
13055 | _rawModule.imports.length > 0 ||
|
13056 | _rawModule.exports.length > 0 ||
|
13057 | _rawModule.providers.length > 0) {
|
13058 | NgdEngine$1.renderGraph(modules_1[i_1].file, finalPath_2, 'f', modules_1[i_1].name).then(function () {
|
13059 | NgdEngine$1.readGraph(path__namespace.resolve(finalPath_2 + path__namespace.sep + 'dependencies.svg'), modules_1[i_1].name).then(function (data) {
|
13060 | modules_1[i_1].graph = data;
|
13061 | i_1++;
|
13062 | loop_1();
|
13063 | }, function (err) {
|
13064 | logger.error('Error during graph read: ', err);
|
13065 | });
|
13066 | }, function (errorMessage) {
|
13067 | logger.error(errorMessage);
|
13068 | });
|
13069 | }
|
13070 | else {
|
13071 | i_1++;
|
13072 | loop_1();
|
13073 | }
|
13074 | }
|
13075 | else {
|
13076 | _this.processPages();
|
13077 | }
|
13078 | };
|
13079 | var finalMainGraphPath_1 = Configuration$1.mainData.output;
|
13080 | if (finalMainGraphPath_1.lastIndexOf('/') === -1) {
|
13081 | finalMainGraphPath_1 += '/';
|
13082 | }
|
13083 | finalMainGraphPath_1 += 'graph';
|
13084 | NgdEngine$1.init(path__namespace.resolve(finalMainGraphPath_1));
|
13085 | NgdEngine$1.renderGraph(Configuration$1.mainData.tsconfig, path__namespace.resolve(finalMainGraphPath_1), 'p').then(function () {
|
13086 | NgdEngine$1.readGraph(path__namespace.resolve(finalMainGraphPath_1 + path__namespace.sep + 'dependencies.svg'), 'Main graph').then(function (data) {
|
13087 | Configuration$1.mainData.mainGraph = data;
|
13088 | loop_1();
|
13089 | }, function (err) {
|
13090 | logger.error('Error during main graph reading : ', err);
|
13091 | Configuration$1.mainData.disableMainGraph = true;
|
13092 | loop_1();
|
13093 | });
|
13094 | }, function (err) {
|
13095 | logger.error('Ooops error during main graph generation, moving on next part with main graph disabled : ', err);
|
13096 | Configuration$1.mainData.disableMainGraph = true;
|
13097 | loop_1();
|
13098 | });
|
13099 | }
|
13100 | };
|
13101 | Application.prototype.runWebServer = function (folder) {
|
13102 | if (!this.isWatching) {
|
13103 | var liveServerConfiguration = {
|
13104 | root: folder,
|
13105 | open: Configuration$1.mainData.open,
|
13106 | quiet: true,
|
13107 | logLevel: 0,
|
13108 | wait: 1000,
|
13109 | port: Configuration$1.mainData.port
|
13110 | };
|
13111 | if (Configuration$1.mainData.host !== '') {
|
13112 | liveServerConfiguration.host = Configuration$1.mainData.host;
|
13113 | }
|
13114 | LiveServer__namespace.start(liveServerConfiguration);
|
13115 | }
|
13116 | if (Configuration$1.mainData.watch && !this.isWatching) {
|
13117 | if (typeof this.files === 'undefined') {
|
13118 | logger.error('No sources files available, please use -p flag');
|
13119 | generationPromiseReject();
|
13120 | process.exit(1);
|
13121 | }
|
13122 | else {
|
13123 | this.runWatch();
|
13124 | }
|
13125 | }
|
13126 | else if (Configuration$1.mainData.watch && this.isWatching) {
|
13127 | var srcFolder = findMainSourceFolder(this.files);
|
13128 | logger.info("Already watching sources in " + srcFolder + " folder");
|
13129 | }
|
13130 | };
|
13131 | Application.prototype.runWatch = function () {
|
13132 | var _this = this;
|
13133 | var sources = [findMainSourceFolder(this.files)];
|
13134 | var watcherReady = false;
|
13135 | this.isWatching = true;
|
13136 | logger.info("Watching sources in " + findMainSourceFolder(this.files) + " folder");
|
13137 | if (MarkdownEngine$1.hasRootMarkdowns()) {
|
13138 | sources = sources.concat(MarkdownEngine$1.listRootMarkdowns());
|
13139 | }
|
13140 | if (Configuration$1.mainData.includes !== '') {
|
13141 | sources = sources.concat(Configuration$1.mainData.includes);
|
13142 | }
|
13143 | // Check all elements of sources list exist
|
13144 | sources = cleanSourcesForWatch(sources);
|
13145 | var watcher = chokidar.watch(sources, {
|
13146 | awaitWriteFinish: true,
|
13147 | ignoreInitial: true,
|
13148 | ignored: /(spec|\.d)\.ts/
|
13149 | });
|
13150 | var timerAddAndRemoveRef;
|
13151 | var timerChangeRef;
|
13152 | var runnerAddAndRemove = function () {
|
13153 | startTime = new Date();
|
13154 | _this.generate();
|
13155 | };
|
13156 | var waiterAddAndRemove = function () {
|
13157 | clearTimeout(timerAddAndRemoveRef);
|
13158 | timerAddAndRemoveRef = setTimeout(runnerAddAndRemove, 1000);
|
13159 | };
|
13160 | var runnerChange = function () {
|
13161 | startTime = new Date();
|
13162 | _this.setUpdatedFiles(_this.watchChangedFiles);
|
13163 | if (_this.hasWatchedFilesTSFiles()) {
|
13164 | _this.getMicroDependenciesData();
|
13165 | }
|
13166 | else if (_this.hasWatchedFilesRootMarkdownFiles()) {
|
13167 | _this.rebuildRootMarkdowns();
|
13168 | }
|
13169 | else {
|
13170 | _this.rebuildExternalDocumentation();
|
13171 | }
|
13172 | };
|
13173 | var waiterChange = function () {
|
13174 | clearTimeout(timerChangeRef);
|
13175 | timerChangeRef = setTimeout(runnerChange, 1000);
|
13176 | };
|
13177 | watcher.on('ready', function () {
|
13178 | if (!watcherReady) {
|
13179 | watcherReady = true;
|
13180 | watcher
|
13181 | .on('add', function (file) {
|
13182 | logger.debug("File " + file + " has been added");
|
13183 | // Test extension, if ts
|
13184 | // rescan everything
|
13185 | if (path__namespace.extname(file) === '.ts') {
|
13186 | waiterAddAndRemove();
|
13187 | }
|
13188 | })
|
13189 | .on('change', function (file) {
|
13190 | logger.debug("File " + file + " has been changed");
|
13191 | // Test extension, if ts
|
13192 | // rescan only file
|
13193 | if (path__namespace.extname(file) === '.ts' ||
|
13194 | path__namespace.extname(file) === '.md' ||
|
13195 | path__namespace.extname(file) === '.json') {
|
13196 | _this.watchChangedFiles.push(path__namespace.join(cwd$1 + path__namespace.sep + file));
|
13197 | waiterChange();
|
13198 | }
|
13199 | })
|
13200 | .on('unlink', function (file) {
|
13201 | logger.debug("File " + file + " has been removed");
|
13202 | // Test extension, if ts
|
13203 | // rescan everything
|
13204 | if (path__namespace.extname(file) === '.ts') {
|
13205 | waiterAddAndRemove();
|
13206 | }
|
13207 | });
|
13208 | }
|
13209 | });
|
13210 | };
|
13211 | Object.defineProperty(Application.prototype, "application", {
|
13212 | /**
|
13213 | * Return the application / root component instance.
|
13214 | */
|
13215 | get: function () {
|
13216 | return this;
|
13217 | },
|
13218 | enumerable: false,
|
13219 | configurable: true
|
13220 | });
|
13221 | Object.defineProperty(Application.prototype, "isCLI", {
|
13222 | get: function () {
|
13223 | return false;
|
13224 | },
|
13225 | enumerable: false,
|
13226 | configurable: true
|
13227 | });
|
13228 | return Application;
|
13229 | }());
|
13230 |
|
13231 | var glob = require('glob');
|
13232 | var ParserUtil = /** @class */ (function () {
|
13233 | function ParserUtil() {
|
13234 | this._globFiles = [];
|
13235 | }
|
13236 | ParserUtil.prototype.init = function (exclude, cwd) {
|
13237 | this._files = exclude;
|
13238 | this._cwd = cwd;
|
13239 | var i = 0;
|
13240 | var len = exclude.length;
|
13241 | for (i; i < len; i++) {
|
13242 | this._globFiles = __spreadArray(__spreadArray([], __read(this._globFiles), false), __read(glob.sync(exclude[i], { cwd: this._cwd })), false);
|
13243 | }
|
13244 | };
|
13245 | ParserUtil.prototype.testFilesWithCwdDepth = function () {
|
13246 | var i = 0;
|
13247 | var len = this._files.length;
|
13248 | var result = {
|
13249 | status: true,
|
13250 | level: 0
|
13251 | };
|
13252 | for (i; i < len; i++) {
|
13253 | var elementPath = path__namespace.resolve(this._cwd + path__namespace.sep, this._files[i]);
|
13254 | if (elementPath.indexOf(this._cwd) === -1) {
|
13255 | result.status = false;
|
13256 | var level = this._files[i].match(/\..\//g).length;
|
13257 | if (level > result.level) {
|
13258 | result.level = level;
|
13259 | }
|
13260 | }
|
13261 | }
|
13262 | return result;
|
13263 | };
|
13264 | ParserUtil.prototype.updateCwd = function (cwd, level) {
|
13265 | var _cwd = cwd, _rewind = '';
|
13266 | for (var i = 0; i < level; i++) {
|
13267 | _rewind += '../';
|
13268 | }
|
13269 | _cwd = path__namespace.resolve(_cwd, _rewind);
|
13270 | return _cwd;
|
13271 | };
|
13272 | ParserUtil.prototype.testFile = function (file) {
|
13273 | var _this = this;
|
13274 | var i = 0;
|
13275 | var len = this._files.length;
|
13276 | path__namespace.basename(file);
|
13277 | var fileNameInCwd = file.replace(this._cwd + path__namespace.sep, '');
|
13278 | var result = false;
|
13279 | if (path__namespace.sep === '\\') {
|
13280 | fileNameInCwd = fileNameInCwd.replace(new RegExp('\\' + path__namespace.sep, 'g'), '/');
|
13281 | }
|
13282 | for (i; i < len; i++) {
|
13283 | if (glob.hasMagic(this._files[i]) && this._globFiles.length > 0) {
|
13284 | var resultGlobSearch = this._globFiles.findIndex(function (element) {
|
13285 | var elementPath = path__namespace.resolve(_this._cwd + path__namespace.sep, element);
|
13286 | var elementPathInCwd = elementPath.replace(_this._cwd + path__namespace.sep, '');
|
13287 | elementPathInCwd = elementPathInCwd.replace(new RegExp('\\' + path__namespace.sep, 'g'), '/');
|
13288 | return elementPathInCwd === fileNameInCwd;
|
13289 | });
|
13290 | result = resultGlobSearch !== -1;
|
13291 | }
|
13292 | else {
|
13293 | result = fileNameInCwd === this._files[i];
|
13294 | }
|
13295 | if (result) {
|
13296 | break;
|
13297 | }
|
13298 | }
|
13299 | return result;
|
13300 | };
|
13301 | return ParserUtil;
|
13302 | }());
|
13303 |
|
13304 | var os = require('os');
|
13305 | var osName = require('os-name');
|
13306 | var pkg = require('../package.json');
|
13307 | var program = require('commander');
|
13308 | var cosmiconfigModuleName = 'compodoc';
|
13309 | var scannedFiles = [];
|
13310 | var excludeFiles;
|
13311 | var includeFiles;
|
13312 | var cwd = process.cwd();
|
13313 | process.setMaxListeners(0);
|
13314 | var CliApplication = /** @class */ (function (_super) {
|
13315 | __extends(CliApplication, _super);
|
13316 | function CliApplication() {
|
13317 | return _super !== null && _super.apply(this, arguments) || this;
|
13318 | }
|
13319 | /**
|
13320 | * Run compodoc from the command line.
|
13321 | */
|
13322 | CliApplication.prototype.start = function () {
|
13323 | var _this = this;
|
13324 | function list(val) {
|
13325 | return val.split(',');
|
13326 | }
|
13327 | program
|
13328 | .version(pkg.version)
|
13329 | .usage('<src> [options]')
|
13330 | .option('-c, --config [config]', 'A configuration file : .compodocrc, .compodocrc.json, .compodocrc.yaml or compodoc property in package.json')
|
13331 | .option('-p, --tsconfig [config]', 'A tsconfig.json file')
|
13332 | .option('-d, --output [folder]', 'Where to store the generated documentation', COMPODOC_DEFAULTS.folder)
|
13333 | .option('-y, --extTheme [file]', 'External styling theme file')
|
13334 | .option('-n, --name [name]', 'Title documentation', COMPODOC_DEFAULTS.title)
|
13335 | .option('-a, --assetsFolder [folder]', 'External assets folder to copy in generated documentation folder')
|
13336 | .option('-o, --open [value]', 'Open the generated documentation')
|
13337 | .option('-t, --silent', "In silent mode, log messages aren't logged in the console", false)
|
13338 | .option('-s, --serve', 'Serve generated documentation (default http://localhost:8080/)', false)
|
13339 | .option('--host [host]', 'Change default host address')
|
13340 | .option('-r, --port [port]', 'Change default serving port', COMPODOC_DEFAULTS.port)
|
13341 | .option('-w, --watch', 'Watch source files after serve and force documentation rebuild', false)
|
13342 | .option('-e, --exportFormat [format]', 'Export in specified format (json, html)', COMPODOC_DEFAULTS.exportFormat)
|
13343 | .option('--files [files]', 'Files provided by external tool, used for coverage test')
|
13344 | .option('--language [language]', 'Language used for the generated documentation (de-DE, en-US, es-ES, fr-FR, hu-HU, it-IT, ja-JP, ko-KR, nl-NL, pl-PL, pt-BR, sk-SK, zh-CN, zh-TW)', COMPODOC_DEFAULTS.language)
|
13345 | .option('--theme [theme]', "Choose one of available themes, default is 'gitbook' (laravel, original, material, postmark, readthedocs, stripe, vagrant)")
|
13346 | .option('--hideGenerator', 'Do not print the Compodoc link at the bottom of the page', false)
|
13347 | .option('--hideDarkModeToggle', 'Do not show dark mode toggle button at the top right position of the page', false)
|
13348 | .option('--toggleMenuItems <items>', "Close by default items in the menu values : ['all'] or one of these ['modules','components','directives','controllers','entities','classes','injectables','guards','interfaces','interceptors','pipes','miscellaneous','additionalPages']", list, COMPODOC_DEFAULTS.toggleMenuItems)
|
13349 | .option('--navTabConfig <tab configs>', "List navigation tab objects in the desired order with two string properties (\"id\" and \"label\"). Double-quotes must be escaped with '\\'. Available tab IDs are \"info\", \"readme\", \"source\", \"templateData\", \"styleData\", \"tree\", and \"example\". Note: Certain tabs will only be shown if applicable to a given dependency", list, JSON.stringify(COMPODOC_DEFAULTS.navTabConfig))
|
13350 | .option('--templates [folder]', 'Path to directory of Handlebars templates to override built-in templates')
|
13351 | .option('--includes [path]', 'Path of external markdown files to include')
|
13352 | .option('--includesName [name]', 'Name of item menu of externals markdown files', COMPODOC_DEFAULTS.additionalEntryName)
|
13353 | .option('--coverageTest [threshold]', 'Test command of documentation coverage with a threshold (default 70)')
|
13354 | .option('--coverageMinimumPerFile [minimum]', 'Test command of documentation coverage per file with a minimum (default 0)')
|
13355 | .option('--coverageTestThresholdFail [true|false]', 'Test command of documentation coverage (global or per file) will fail with error or just warn user (true: error, false: warn)', COMPODOC_DEFAULTS.coverageTestThresholdFail)
|
13356 | .option('--coverageTestShowOnlyFailed', 'Display only failed files for a coverage test')
|
13357 | .option('--unitTestCoverage [json-summary]', 'To include unit test coverage, specify istanbul JSON coverage summary file')
|
13358 | .option('--disableSourceCode', 'Do not add source code tab and links to source code', false)
|
13359 | .option('--disableDomTree', 'Do not add dom tree tab', false)
|
13360 | .option('--disableTemplateTab', 'Do not add template tab', false)
|
13361 | .option('--disableStyleTab', 'Do not add style tab', false)
|
13362 | .option('--disableGraph', 'Do not add the dependency graph', false)
|
13363 | .option('--disableCoverage', 'Do not add the documentation coverage report', false)
|
13364 | .option('--disablePrivate', 'Do not show private in generated documentation', false)
|
13365 | .option('--disableProtected', 'Do not show protected in generated documentation', false)
|
13366 | .option('--disableInternal', 'Do not show @internal in generated documentation', false)
|
13367 | .option('--disableLifeCycleHooks', 'Do not show Angular lifecycle hooks in generated documentation', false)
|
13368 | .option('--disableRoutesGraph', 'Do not add the routes graph', COMPODOC_DEFAULTS.disableRoutesGraph)
|
13369 | .option('--disableSearch', 'Do not add the search input', false)
|
13370 | .option('--disableDependencies', 'Do not add the dependencies list', COMPODOC_DEFAULTS.disableDependencies)
|
13371 | .option('--disableProperties', 'Do not add the properties list', COMPODOC_DEFAULTS.disableProperties)
|
13372 | .option('--minimal', 'Minimal mode with only documentation. No search, no graph, no coverage.', false)
|
13373 | .option('--customFavicon [path]', 'Use a custom favicon')
|
13374 | .option('--customLogo [path]', 'Use a custom logo')
|
13375 | .option('--gaID [id]', 'Google Analytics tracking ID')
|
13376 | .option('--gaSite [site]', 'Google Analytics site name', COMPODOC_DEFAULTS.gaSite)
|
13377 | .option('--maxSearchResults [maxSearchResults]', 'Max search results on the results page. To show all results, set to 0', COMPODOC_DEFAULTS.maxSearchResults)
|
13378 | .parse(process.argv);
|
13379 | var outputHelp = function () {
|
13380 | program.outputHelp();
|
13381 | process.exit(1);
|
13382 | };
|
13383 | var configExplorer = cosmiconfig.cosmiconfigSync(cosmiconfigModuleName);
|
13384 | var configExplorerResult;
|
13385 | var configFile = {};
|
13386 | var programOptions = program.opts();
|
13387 | if (programOptions.config) {
|
13388 | var configFilePath = programOptions.config;
|
13389 | var testConfigFilePath = configFilePath.match(process.cwd());
|
13390 | if (testConfigFilePath && testConfigFilePath.length > 0) {
|
13391 | configFilePath = configFilePath.replace(process.cwd() + path__namespace.sep, '');
|
13392 | }
|
13393 | configExplorerResult = configExplorer.load(path__namespace.resolve(configFilePath));
|
13394 | }
|
13395 | else {
|
13396 | configExplorerResult = configExplorer.search();
|
13397 | }
|
13398 | if (configExplorerResult) {
|
13399 | if (typeof configExplorerResult.config !== 'undefined') {
|
13400 | configFile = configExplorerResult.config;
|
13401 | }
|
13402 | }
|
13403 | if (configFile.output) {
|
13404 | Configuration$1.mainData.output = configFile.output;
|
13405 | }
|
13406 | if (programOptions.output && programOptions.output !== COMPODOC_DEFAULTS.folder) {
|
13407 | Configuration$1.mainData.output = programOptions.output;
|
13408 | }
|
13409 | if (configFile.extTheme) {
|
13410 | Configuration$1.mainData.extTheme = configFile.extTheme;
|
13411 | }
|
13412 | if (programOptions.extTheme) {
|
13413 | Configuration$1.mainData.extTheme = programOptions.extTheme;
|
13414 | }
|
13415 | if (configFile.language) {
|
13416 | Configuration$1.mainData.language = configFile.language;
|
13417 | }
|
13418 | if (programOptions.language) {
|
13419 | Configuration$1.mainData.language = programOptions.language;
|
13420 | }
|
13421 | if (configFile.theme) {
|
13422 | Configuration$1.mainData.theme = configFile.theme;
|
13423 | }
|
13424 | if (programOptions.theme) {
|
13425 | Configuration$1.mainData.theme = programOptions.theme;
|
13426 | }
|
13427 | if (configFile.name) {
|
13428 | Configuration$1.mainData.documentationMainName = configFile.name;
|
13429 | }
|
13430 | if (programOptions.name && programOptions.name !== COMPODOC_DEFAULTS.title) {
|
13431 | Configuration$1.mainData.documentationMainName = programOptions.name;
|
13432 | }
|
13433 | if (configFile.assetsFolder) {
|
13434 | Configuration$1.mainData.assetsFolder = configFile.assetsFolder;
|
13435 | }
|
13436 | if (programOptions.assetsFolder) {
|
13437 | Configuration$1.mainData.assetsFolder = programOptions.assetsFolder;
|
13438 | }
|
13439 | if (configFile.open) {
|
13440 | Configuration$1.mainData.open = configFile.open;
|
13441 | }
|
13442 | if (programOptions.open) {
|
13443 | Configuration$1.mainData.open = programOptions.open;
|
13444 | }
|
13445 | if (configFile.toggleMenuItems) {
|
13446 | Configuration$1.mainData.toggleMenuItems = configFile.toggleMenuItems;
|
13447 | }
|
13448 | if (programOptions.toggleMenuItems &&
|
13449 | programOptions.toggleMenuItems !== COMPODOC_DEFAULTS.toggleMenuItems) {
|
13450 | Configuration$1.mainData.toggleMenuItems = programOptions.toggleMenuItems;
|
13451 | }
|
13452 | if (configFile.templates) {
|
13453 | Configuration$1.mainData.templates = configFile.templates;
|
13454 | }
|
13455 | if (programOptions.templates) {
|
13456 | Configuration$1.mainData.templates = programOptions.templates;
|
13457 | }
|
13458 | if (configFile.navTabConfig) {
|
13459 | Configuration$1.mainData.navTabConfig = configFile.navTabConfig;
|
13460 | }
|
13461 | if (programOptions.navTabConfig &&
|
13462 | JSON.parse(programOptions.navTabConfig).length !== COMPODOC_DEFAULTS.navTabConfig.length) {
|
13463 | Configuration$1.mainData.navTabConfig = JSON.parse(programOptions.navTabConfig);
|
13464 | }
|
13465 | if (configFile.includes) {
|
13466 | Configuration$1.mainData.includes = configFile.includes;
|
13467 | }
|
13468 | if (programOptions.includes) {
|
13469 | Configuration$1.mainData.includes = programOptions.includes;
|
13470 | }
|
13471 | if (configFile.includesName) {
|
13472 | Configuration$1.mainData.includesName = configFile.includesName;
|
13473 | }
|
13474 | if (programOptions.includesName &&
|
13475 | programOptions.includesName !== COMPODOC_DEFAULTS.additionalEntryName) {
|
13476 | Configuration$1.mainData.includesName = programOptions.includesName;
|
13477 | }
|
13478 | if (configFile.silent) {
|
13479 | logger.silent = false;
|
13480 | }
|
13481 | if (programOptions.silent) {
|
13482 | logger.silent = false;
|
13483 | }
|
13484 | if (configFile.serve) {
|
13485 | Configuration$1.mainData.serve = configFile.serve;
|
13486 | }
|
13487 | if (programOptions.serve) {
|
13488 | Configuration$1.mainData.serve = programOptions.serve;
|
13489 | }
|
13490 | if (configFile.host) {
|
13491 | Configuration$1.mainData.host = configFile.host;
|
13492 | Configuration$1.mainData.hostname = configFile.host;
|
13493 | }
|
13494 | if (programOptions.host) {
|
13495 | Configuration$1.mainData.host = programOptions.host;
|
13496 | Configuration$1.mainData.hostname = programOptions.host;
|
13497 | }
|
13498 | if (configFile.port) {
|
13499 | Configuration$1.mainData.port = configFile.port;
|
13500 | }
|
13501 | if (programOptions.port && programOptions.port !== COMPODOC_DEFAULTS.port) {
|
13502 | Configuration$1.mainData.port = programOptions.port;
|
13503 | }
|
13504 | if (configFile.watch) {
|
13505 | Configuration$1.mainData.watch = configFile.watch;
|
13506 | }
|
13507 | if (programOptions.watch) {
|
13508 | Configuration$1.mainData.watch = programOptions.watch;
|
13509 | }
|
13510 | if (configFile.exportFormat) {
|
13511 | Configuration$1.mainData.exportFormat = configFile.exportFormat;
|
13512 | }
|
13513 | if (programOptions.exportFormat &&
|
13514 | programOptions.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
13515 | Configuration$1.mainData.exportFormat = programOptions.exportFormat;
|
13516 | }
|
13517 | if (configFile.hideGenerator) {
|
13518 | Configuration$1.mainData.hideGenerator = configFile.hideGenerator;
|
13519 | }
|
13520 | if (programOptions.hideGenerator) {
|
13521 | Configuration$1.mainData.hideGenerator = programOptions.hideGenerator;
|
13522 | }
|
13523 | if (configFile.hideDarkModeToggle) {
|
13524 | Configuration$1.mainData.hideDarkModeToggle = configFile.hideDarkModeToggle;
|
13525 | }
|
13526 | if (programOptions.hideDarkModeToggle) {
|
13527 | Configuration$1.mainData.hideDarkModeToggle = programOptions.hideDarkModeToggle;
|
13528 | }
|
13529 | if (configFile.coverageTest) {
|
13530 | Configuration$1.mainData.coverageTest = true;
|
13531 | Configuration$1.mainData.coverageTestThreshold =
|
13532 | typeof configFile.coverageTest === 'string'
|
13533 | ? parseInt(configFile.coverageTest, 10)
|
13534 | : COMPODOC_DEFAULTS.defaultCoverageThreshold;
|
13535 | }
|
13536 | if (programOptions.coverageTest) {
|
13537 | Configuration$1.mainData.coverageTest = true;
|
13538 | Configuration$1.mainData.coverageTestThreshold =
|
13539 | typeof programOptions.coverageTest === 'string'
|
13540 | ? parseInt(programOptions.coverageTest, 10)
|
13541 | : COMPODOC_DEFAULTS.defaultCoverageThreshold;
|
13542 | }
|
13543 | if (configFile.coverageMinimumPerFile) {
|
13544 | Configuration$1.mainData.coverageTestPerFile = true;
|
13545 | Configuration$1.mainData.coverageMinimumPerFile =
|
13546 | typeof configFile.coverageMinimumPerFile === 'string'
|
13547 | ? parseInt(configFile.coverageMinimumPerFile, 10)
|
13548 | : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
|
13549 | }
|
13550 | if (programOptions.coverageMinimumPerFile) {
|
13551 | Configuration$1.mainData.coverageTestPerFile = true;
|
13552 | Configuration$1.mainData.coverageMinimumPerFile =
|
13553 | typeof programOptions.coverageMinimumPerFile === 'string'
|
13554 | ? parseInt(programOptions.coverageMinimumPerFile, 10)
|
13555 | : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
|
13556 | }
|
13557 | if (configFile.coverageTestThresholdFail) {
|
13558 | Configuration$1.mainData.coverageTestThresholdFail =
|
13559 | configFile.coverageTestThresholdFail === 'false' ? false : true;
|
13560 | }
|
13561 | if (programOptions.coverageTestThresholdFail) {
|
13562 | Configuration$1.mainData.coverageTestThresholdFail =
|
13563 | programOptions.coverageTestThresholdFail === 'false' ? false : true;
|
13564 | }
|
13565 | if (configFile.coverageTestShowOnlyFailed) {
|
13566 | Configuration$1.mainData.coverageTestShowOnlyFailed =
|
13567 | configFile.coverageTestShowOnlyFailed;
|
13568 | }
|
13569 | if (programOptions.coverageTestShowOnlyFailed) {
|
13570 | Configuration$1.mainData.coverageTestShowOnlyFailed =
|
13571 | programOptions.coverageTestShowOnlyFailed;
|
13572 | }
|
13573 | if (configFile.unitTestCoverage) {
|
13574 | Configuration$1.mainData.unitTestCoverage = configFile.unitTestCoverage;
|
13575 | }
|
13576 | if (programOptions.unitTestCoverage) {
|
13577 | Configuration$1.mainData.unitTestCoverage = programOptions.unitTestCoverage;
|
13578 | }
|
13579 | if (configFile.disableSourceCode) {
|
13580 | Configuration$1.mainData.disableSourceCode = configFile.disableSourceCode;
|
13581 | }
|
13582 | if (programOptions.disableSourceCode) {
|
13583 | Configuration$1.mainData.disableSourceCode = programOptions.disableSourceCode;
|
13584 | }
|
13585 | if (configFile.disableDomTree) {
|
13586 | Configuration$1.mainData.disableDomTree = configFile.disableDomTree;
|
13587 | }
|
13588 | if (programOptions.disableDomTree) {
|
13589 | Configuration$1.mainData.disableDomTree = programOptions.disableDomTree;
|
13590 | }
|
13591 | if (configFile.disableTemplateTab) {
|
13592 | Configuration$1.mainData.disableTemplateTab = configFile.disableTemplateTab;
|
13593 | }
|
13594 | if (programOptions.disableTemplateTab) {
|
13595 | Configuration$1.mainData.disableTemplateTab = programOptions.disableTemplateTab;
|
13596 | }
|
13597 | if (configFile.disableStyleTab) {
|
13598 | Configuration$1.mainData.disableStyleTab = configFile.disableStyleTab;
|
13599 | }
|
13600 | if (programOptions.disableStyleTab) {
|
13601 | Configuration$1.mainData.disableStyleTab = programOptions.disableStyleTab;
|
13602 | }
|
13603 | if (configFile.disableGraph) {
|
13604 | Configuration$1.mainData.disableGraph = configFile.disableGraph;
|
13605 | }
|
13606 | if (programOptions.disableGraph) {
|
13607 | Configuration$1.mainData.disableGraph = programOptions.disableGraph;
|
13608 | }
|
13609 | if (configFile.disableCoverage) {
|
13610 | Configuration$1.mainData.disableCoverage = configFile.disableCoverage;
|
13611 | }
|
13612 | if (programOptions.disableCoverage) {
|
13613 | Configuration$1.mainData.disableCoverage = programOptions.disableCoverage;
|
13614 | }
|
13615 | if (configFile.disablePrivate) {
|
13616 | Configuration$1.mainData.disablePrivate = configFile.disablePrivate;
|
13617 | }
|
13618 | if (programOptions.disablePrivate) {
|
13619 | Configuration$1.mainData.disablePrivate = programOptions.disablePrivate;
|
13620 | }
|
13621 | if (configFile.disableProtected) {
|
13622 | Configuration$1.mainData.disableProtected = configFile.disableProtected;
|
13623 | }
|
13624 | if (programOptions.disableProtected) {
|
13625 | Configuration$1.mainData.disableProtected = programOptions.disableProtected;
|
13626 | }
|
13627 | if (configFile.disableInternal) {
|
13628 | Configuration$1.mainData.disableInternal = configFile.disableInternal;
|
13629 | }
|
13630 | if (programOptions.disableInternal) {
|
13631 | Configuration$1.mainData.disableInternal = programOptions.disableInternal;
|
13632 | }
|
13633 | if (configFile.disableLifeCycleHooks) {
|
13634 | Configuration$1.mainData.disableLifeCycleHooks = configFile.disableLifeCycleHooks;
|
13635 | }
|
13636 | if (programOptions.disableLifeCycleHooks) {
|
13637 | Configuration$1.mainData.disableLifeCycleHooks = programOptions.disableLifeCycleHooks;
|
13638 | }
|
13639 | if (configFile.disableRoutesGraph) {
|
13640 | Configuration$1.mainData.disableRoutesGraph = configFile.disableRoutesGraph;
|
13641 | }
|
13642 | if (programOptions.disableRoutesGraph) {
|
13643 | Configuration$1.mainData.disableRoutesGraph = programOptions.disableRoutesGraph;
|
13644 | }
|
13645 | if (configFile.disableSearch) {
|
13646 | Configuration$1.mainData.disableSearch = configFile.disableSearch;
|
13647 | }
|
13648 | if (programOptions.disableSearch) {
|
13649 | Configuration$1.mainData.disableSearch = programOptions.disableSearch;
|
13650 | }
|
13651 | if (configFile.disableDependencies) {
|
13652 | Configuration$1.mainData.disableDependencies = configFile.disableDependencies;
|
13653 | }
|
13654 | if (programOptions.disableDependencies) {
|
13655 | Configuration$1.mainData.disableDependencies = programOptions.disableDependencies;
|
13656 | }
|
13657 | if (configFile.disableProperties) {
|
13658 | Configuration$1.mainData.disableProperties = configFile.disableProperties;
|
13659 | }
|
13660 | if (programOptions.disableProperties) {
|
13661 | Configuration$1.mainData.disableProperties = programOptions.disableProperties;
|
13662 | }
|
13663 | if (configFile.minimal) {
|
13664 | Configuration$1.mainData.disableSearch = true;
|
13665 | Configuration$1.mainData.disableRoutesGraph = true;
|
13666 | Configuration$1.mainData.disableGraph = true;
|
13667 | Configuration$1.mainData.disableCoverage = true;
|
13668 | }
|
13669 | if (programOptions.minimal) {
|
13670 | Configuration$1.mainData.disableSearch = true;
|
13671 | Configuration$1.mainData.disableRoutesGraph = true;
|
13672 | Configuration$1.mainData.disableGraph = true;
|
13673 | Configuration$1.mainData.disableCoverage = true;
|
13674 | }
|
13675 | if (configFile.customFavicon) {
|
13676 | Configuration$1.mainData.customFavicon = configFile.customFavicon;
|
13677 | }
|
13678 | if (programOptions.customFavicon) {
|
13679 | Configuration$1.mainData.customFavicon = programOptions.customFavicon;
|
13680 | }
|
13681 | if (configFile.customLogo) {
|
13682 | Configuration$1.mainData.customLogo = configFile.customLogo;
|
13683 | }
|
13684 | if (programOptions.customLogo) {
|
13685 | Configuration$1.mainData.customLogo = programOptions.customLogo;
|
13686 | }
|
13687 | if (configFile.gaID) {
|
13688 | Configuration$1.mainData.gaID = configFile.gaID;
|
13689 | }
|
13690 | if (programOptions.gaID) {
|
13691 | Configuration$1.mainData.gaID = programOptions.gaID;
|
13692 | }
|
13693 | if (configFile.gaSite) {
|
13694 | Configuration$1.mainData.gaSite = configFile.gaSite;
|
13695 | }
|
13696 | if (programOptions.gaSite && programOptions.gaSite !== COMPODOC_DEFAULTS.gaSite) {
|
13697 | Configuration$1.mainData.gaSite = programOptions.gaSite;
|
13698 | }
|
13699 | if (!this.isWatching) {
|
13700 | if (!logger.silent) {
|
13701 | console.log("Compodoc v" + pkg.version);
|
13702 | }
|
13703 | else {
|
13704 | console.log(fs__namespace.readFileSync(path__namespace.join(__dirname, '../src/banner')).toString());
|
13705 | console.log(pkg.version);
|
13706 | console.log('');
|
13707 | console.log("TypeScript version used by Compodoc : " + tsMorph.ts.version);
|
13708 | console.log('');
|
13709 | if (FileEngine$1.existsSync(cwd + path__namespace.sep + 'package.json')) {
|
13710 | var packageData = FileEngine$1.getSync(cwd + path__namespace.sep + 'package.json');
|
13711 | if (packageData) {
|
13712 | var parsedData = JSON.parse(packageData);
|
13713 | var projectDevDependencies = parsedData.devDependencies;
|
13714 | if (projectDevDependencies && projectDevDependencies.typescript) {
|
13715 | var tsProjectVersion = AngularVersionUtil$1.cleanVersion(projectDevDependencies.typescript);
|
13716 | console.log("TypeScript version of current project : " + tsProjectVersion);
|
13717 | console.log('');
|
13718 | }
|
13719 | }
|
13720 | }
|
13721 | console.log("Node.js version : " + process.version);
|
13722 | console.log('');
|
13723 | console.log("Operating system : " + osName(os.platform(), os.release()));
|
13724 | console.log('');
|
13725 | }
|
13726 | }
|
13727 | if (configExplorerResult) {
|
13728 | if (typeof configExplorerResult.config !== 'undefined') {
|
13729 | logger.info("Using configuration file : " + configExplorerResult.filepath);
|
13730 | }
|
13731 | }
|
13732 | if (!configExplorerResult) {
|
13733 | logger.warn("No configuration file found, switching to CLI flags.");
|
13734 | }
|
13735 | if (programOptions.language && !I18nEngine$1.supportLanguage(programOptions.language)) {
|
13736 | logger.warn("The language " + programOptions.language + " is not available, falling back to " + I18nEngine$1.fallbackLanguage);
|
13737 | }
|
13738 | if (programOptions.tsconfig && typeof programOptions.tsconfig === 'boolean') {
|
13739 | logger.error("Please provide a tsconfig file.");
|
13740 | process.exit(1);
|
13741 | }
|
13742 | if (configFile.tsconfig) {
|
13743 | Configuration$1.mainData.tsconfig = configFile.tsconfig;
|
13744 | }
|
13745 | if (programOptions.tsconfig) {
|
13746 | Configuration$1.mainData.tsconfig = programOptions.tsconfig;
|
13747 | }
|
13748 | if (programOptions.maxSearchResults) {
|
13749 | Configuration$1.mainData.maxSearchResults = programOptions.maxSearchResults;
|
13750 | }
|
13751 | if (configFile.files) {
|
13752 | scannedFiles = configFile.files;
|
13753 | }
|
13754 | if (configFile.exclude) {
|
13755 | excludeFiles = configFile.exclude;
|
13756 | }
|
13757 | if (configFile.include) {
|
13758 | includeFiles = configFile.include;
|
13759 | }
|
13760 | /**
|
13761 | * Check --files argument call
|
13762 | */
|
13763 | var argv = require('minimist')(process.argv.slice(2));
|
13764 | if (argv && argv.files) {
|
13765 | Configuration$1.mainData.hasFilesToCoverage = true;
|
13766 | if (typeof argv.files === 'string') {
|
13767 | _super.prototype.setFiles.call(this, [argv.files]);
|
13768 | }
|
13769 | else {
|
13770 | _super.prototype.setFiles.call(this, argv.files);
|
13771 | }
|
13772 | }
|
13773 | if (programOptions.serve && !Configuration$1.mainData.tsconfig && programOptions.output) {
|
13774 | // if -s & -d, serve it
|
13775 | if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
|
13776 | logger.error(Configuration$1.mainData.output + " folder doesn't exist");
|
13777 | process.exit(1);
|
13778 | }
|
13779 | else {
|
13780 | logger.info("Serving documentation from " + Configuration$1.mainData.output + " at http://" + Configuration$1.mainData.hostname + ":" + programOptions.port);
|
13781 | _super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
|
13782 | }
|
13783 | }
|
13784 | else if (programOptions.serve &&
|
13785 | !Configuration$1.mainData.tsconfig &&
|
13786 | !programOptions.output) {
|
13787 | // if only -s find ./documentation, if ok serve, else error provide -d
|
13788 | if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
|
13789 | logger.error('Provide output generated folder with -d flag');
|
13790 | process.exit(1);
|
13791 | }
|
13792 | else {
|
13793 | logger.info("Serving documentation from " + Configuration$1.mainData.output + " at http://" + Configuration$1.mainData.hostname + ":" + programOptions.port);
|
13794 | _super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
|
13795 | }
|
13796 | }
|
13797 | else if (Configuration$1.mainData.hasFilesToCoverage) {
|
13798 | if (programOptions.coverageMinimumPerFile) {
|
13799 | logger.info('Run documentation coverage test for files');
|
13800 | _super.prototype.testCoverage.call(this);
|
13801 | }
|
13802 | else {
|
13803 | logger.error('Missing coverage configuration');
|
13804 | }
|
13805 | }
|
13806 | else {
|
13807 | if (programOptions.hideGenerator) {
|
13808 | Configuration$1.mainData.hideGenerator = true;
|
13809 | }
|
13810 | if (Configuration$1.mainData.tsconfig && program.args.length === 0) {
|
13811 | /**
|
13812 | * tsconfig file provided only
|
13813 | */
|
13814 | var testTsConfigPath = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
|
13815 | if (testTsConfigPath !== -1) {
|
13816 | Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
|
13817 | }
|
13818 | if (!FileEngine$1.existsSync(Configuration$1.mainData.tsconfig)) {
|
13819 | logger.error("\"" + Configuration$1.mainData.tsconfig + "\" file was not found in the current directory");
|
13820 | process.exit(1);
|
13821 | }
|
13822 | else {
|
13823 | var _file = path__namespace.join(path__namespace.join(process.cwd(), path__namespace.dirname(Configuration$1.mainData.tsconfig)), path__namespace.basename(Configuration$1.mainData.tsconfig));
|
13824 | // use the current directory of tsconfig.json as a working directory
|
13825 | cwd = _file.split(path__namespace.sep).slice(0, -1).join(path__namespace.sep);
|
13826 | logger.info('Using tsconfig file ', _file);
|
13827 | var tsConfigFile = readConfig(_file);
|
13828 | if (tsConfigFile.files) {
|
13829 | scannedFiles = tsConfigFile.files;
|
13830 | // Normalize path of these files
|
13831 | scannedFiles = scannedFiles.map(function (scannedFile) {
|
13832 | return cwd + path__namespace.sep + scannedFile;
|
13833 | });
|
13834 | }
|
13835 | // even if files are supplied with "files" attributes, enhance the array with includes
|
13836 | excludeFiles = tsConfigFile.exclude || [];
|
13837 | includeFiles = tsConfigFile.include || [];
|
13838 | if (scannedFiles.length > 0) {
|
13839 | includeFiles = __spreadArray(__spreadArray([], __read(includeFiles), false), __read(scannedFiles), false);
|
13840 | }
|
13841 | var excludeParser_1 = new ParserUtil(), includeParser_1 = new ParserUtil();
|
13842 | excludeParser_1.init(excludeFiles, cwd);
|
13843 | includeParser_1.init(includeFiles, cwd);
|
13844 | var startCwd = cwd;
|
13845 | var excludeParserTestFilesWithCwdDepth = excludeParser_1.testFilesWithCwdDepth();
|
13846 | if (!excludeParserTestFilesWithCwdDepth.status) {
|
13847 | startCwd = excludeParser_1.updateCwd(cwd, excludeParserTestFilesWithCwdDepth.level);
|
13848 | }
|
13849 | var includeParserTestFilesWithCwdDepth = includeParser_1.testFilesWithCwdDepth();
|
13850 | if (!includeParser_1.testFilesWithCwdDepth().status) {
|
13851 | startCwd = includeParser_1.updateCwd(cwd, includeParserTestFilesWithCwdDepth.level);
|
13852 | }
|
13853 | var finder = require('findit2')(startCwd || '.');
|
13854 | finder.on('directory', function (dir, stat, stop) {
|
13855 | if (ignoreDirectory(dir)) {
|
13856 | stop();
|
13857 | }
|
13858 | });
|
13859 | finder.on('file', function (file, stat) {
|
13860 | if (/(spec|\.d)\.ts/.test(file)) {
|
13861 | logger.warn('Ignoring', file);
|
13862 | }
|
13863 | else if (excludeParser_1.testFile(file) &&
|
13864 | (path__namespace.extname(file) === '.ts' || path__namespace.extname(file) === '.tsx')) {
|
13865 | logger.warn('Excluding', file);
|
13866 | }
|
13867 | else if (includeFiles.length > 0) {
|
13868 | /**
|
13869 | * If include provided in tsconfig, use only this source,
|
13870 | * and not files found with global findit scan in working directory
|
13871 | */
|
13872 | if ((path__namespace.extname(file) === '.ts' || path__namespace.extname(file) === '.tsx') &&
|
13873 | includeParser_1.testFile(file)) {
|
13874 | logger.debug('Including', file);
|
13875 | scannedFiles.push(file);
|
13876 | }
|
13877 | else {
|
13878 | if (path__namespace.extname(file) === '.ts' || path__namespace.extname(file) === '.tsx') {
|
13879 | logger.warn('Excluding', file);
|
13880 | }
|
13881 | }
|
13882 | }
|
13883 | else {
|
13884 | logger.debug('Including', file);
|
13885 | scannedFiles.push(file);
|
13886 | }
|
13887 | });
|
13888 | finder.on('end', function () {
|
13889 | _super.prototype.setFiles.call(_this, scannedFiles);
|
13890 | if (programOptions.coverageTest || programOptions.coverageTestPerFile) {
|
13891 | logger.info('Run documentation coverage test');
|
13892 | _super.prototype.testCoverage.call(_this);
|
13893 | }
|
13894 | else {
|
13895 | _super.prototype.generate.call(_this);
|
13896 | }
|
13897 | });
|
13898 | }
|
13899 | }
|
13900 | else if (Configuration$1.mainData.tsconfig && program.args.length > 0) {
|
13901 | /**
|
13902 | * tsconfig file provided with source folder in arg
|
13903 | */
|
13904 | var testTsConfigPath = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
|
13905 | if (testTsConfigPath !== -1) {
|
13906 | Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
|
13907 | }
|
13908 | var sourceFolder = program.args[0];
|
13909 | if (!FileEngine$1.existsSync(sourceFolder)) {
|
13910 | logger.error("Provided source folder " + sourceFolder + " was not found in the current directory");
|
13911 | process.exit(1);
|
13912 | }
|
13913 | else {
|
13914 | logger.info('Using provided source folder');
|
13915 | if (!FileEngine$1.existsSync(Configuration$1.mainData.tsconfig)) {
|
13916 | logger.error("\"" + Configuration$1.mainData.tsconfig + "\" file was not found in the current directory");
|
13917 | process.exit(1);
|
13918 | }
|
13919 | else {
|
13920 | var _file = path__namespace.join(path__namespace.join(process.cwd(), path__namespace.dirname(Configuration$1.mainData.tsconfig)), path__namespace.basename(Configuration$1.mainData.tsconfig));
|
13921 | // use the current directory of tsconfig.json as a working directory
|
13922 | cwd = _file.split(path__namespace.sep).slice(0, -1).join(path__namespace.sep);
|
13923 | logger.info('Using tsconfig file ', _file);
|
13924 | var tsConfigFile = readConfig(_file);
|
13925 | if (tsConfigFile.files) {
|
13926 | scannedFiles = tsConfigFile.files;
|
13927 | // Normalize path of these files
|
13928 | scannedFiles = scannedFiles.map(function (scannedFile) {
|
13929 | return cwd + path__namespace.sep + scannedFile;
|
13930 | });
|
13931 | }
|
13932 | // even if files are supplied with "files" attributes, enhance the array with includes
|
13933 | excludeFiles = tsConfigFile.exclude || [];
|
13934 | includeFiles = tsConfigFile.include || [];
|
13935 | if (scannedFiles.length > 0) {
|
13936 | includeFiles = __spreadArray(__spreadArray([], __read(includeFiles), false), __read(scannedFiles), false);
|
13937 | }
|
13938 | var excludeParser_2 = new ParserUtil(), includeParser_2 = new ParserUtil();
|
13939 | excludeParser_2.init(excludeFiles, cwd);
|
13940 | includeParser_2.init(includeFiles, cwd);
|
13941 | var startCwd = sourceFolder;
|
13942 | var excludeParserTestFilesWithCwdDepth = excludeParser_2.testFilesWithCwdDepth();
|
13943 | if (!excludeParserTestFilesWithCwdDepth.status) {
|
13944 | startCwd = excludeParser_2.updateCwd(cwd, excludeParserTestFilesWithCwdDepth.level);
|
13945 | }
|
13946 | var includeParserTestFilesWithCwdDepth = includeParser_2.testFilesWithCwdDepth();
|
13947 | if (!includeParser_2.testFilesWithCwdDepth().status) {
|
13948 | startCwd = includeParser_2.updateCwd(cwd, includeParserTestFilesWithCwdDepth.level);
|
13949 | }
|
13950 | var finder = require('findit2')(path__namespace.resolve(startCwd));
|
13951 | finder.on('directory', function (dir, stat, stop) {
|
13952 | if (ignoreDirectory(dir)) {
|
13953 | stop();
|
13954 | }
|
13955 | });
|
13956 | finder.on('file', function (file, stat) {
|
13957 | if (/(spec|\.d)\.ts/.test(file)) {
|
13958 | logger.warn('Ignoring', file);
|
13959 | }
|
13960 | else if (excludeParser_2.testFile(file)) {
|
13961 | logger.warn('Excluding', file);
|
13962 | }
|
13963 | else if (includeFiles.length > 0) {
|
13964 | /**
|
13965 | * If include provided in tsconfig, use only this source,
|
13966 | * and not files found with global findit scan in working directory
|
13967 | */
|
13968 | if (path__namespace.extname(file) === '.ts' && includeParser_2.testFile(file)) {
|
13969 | logger.debug('Including', file);
|
13970 | scannedFiles.push(file);
|
13971 | }
|
13972 | else {
|
13973 | if (path__namespace.extname(file) === '.ts') {
|
13974 | logger.warn('Excluding', file);
|
13975 | }
|
13976 | }
|
13977 | }
|
13978 | else {
|
13979 | logger.debug('Including', file);
|
13980 | scannedFiles.push(file);
|
13981 | }
|
13982 | });
|
13983 | finder.on('end', function () {
|
13984 | _super.prototype.setFiles.call(_this, scannedFiles);
|
13985 | if (programOptions.coverageTest || programOptions.coverageTestPerFile) {
|
13986 | logger.info('Run documentation coverage test');
|
13987 | _super.prototype.testCoverage.call(_this);
|
13988 | }
|
13989 | else {
|
13990 | _super.prototype.generate.call(_this);
|
13991 | }
|
13992 | });
|
13993 | }
|
13994 | }
|
13995 | }
|
13996 | else {
|
13997 | logger.error('tsconfig.json file was not found, please use -p flag');
|
13998 | outputHelp();
|
13999 | }
|
14000 | }
|
14001 | };
|
14002 | return CliApplication;
|
14003 | }(Application));
|
14004 |
|
14005 | exports.Application = Application;
|
14006 | exports.CliApplication = CliApplication;
|
14007 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtY2xpLWY3MzkzY2FjLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwiLi4vc3JjL3V0aWxzL2xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9kZWZhdWx0cy50cyIsIi4uL3NyYy9hcHAvY29uZmlndXJhdGlvbi50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLWFwaS51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2xpbmstcGFyc2VyLnRzIiwiLi4vc3JjL3V0aWxzL2FuZ3VsYXItbGlmZWN5Y2xlcy1ob29rcy50cyIsIi4uL3NyYy91dGlscy9raW5kLXRvLXR5cGUudHMiLCIuLi9zcmMvdXRpbHMvdHMtaW50ZXJuYWwudHMiLCIuLi9zcmMvdXRpbHMvanNkb2MtcGFyc2VyLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdXRpbHMudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9maWxlLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9leHBvcnQtanNvbi5lbmdpbmUudHMiLCIuLi9zcmMvbG9jYWxlcy9kZS1ERS50cyIsIi4uL3NyYy9sb2NhbGVzL2VuLVVTLnRzIiwiLi4vc3JjL2xvY2FsZXMvZXMtRVMudHMiLCIuLi9zcmMvbG9jYWxlcy9mci1GUi50cyIsIi4uL3NyYy9sb2NhbGVzL2h1LUhVLnRzIiwiLi4vc3JjL2xvY2FsZXMvaXQtSVQudHMiLCIuLi9zcmMvbG9jYWxlcy9qYS1KUC50cyIsIi4uL3NyYy9sb2NhbGVzL25sLU5MLnRzIiwiLi4vc3JjL2xvY2FsZXMvcGwtUEwudHMiLCIuLi9zcmMvbG9jYWxlcy9wdC1CUi50cyIsIi4uL3NyYy9sb2NhbGVzL3NrLVNLLnRzIiwiLi4vc3JjL2xvY2FsZXMvemgtQ04udHMiLCIuLi9zcmMvbG9jYWxlcy96aC1UVy50cyIsIi4uL3NyYy9sb2NhbGVzL2tvLUtSLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2kxOG4uZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL3BkZi1lbmdpbmUvbWFya2Rvd24tdG8tcGRmLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9wZGYtZW5naW5lL2V4cG9ydC1wZGYuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2V4cG9ydC5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1saW5lcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9jYXBpdGFsaXplLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2NsZWFuLXBhcmFncmFwaC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9jb21wYXJlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2RlYnVnLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2VsZW1lbnQtYWxvbmUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZXNjYXBlLXNpbXBsZS1xdW90ZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9maWx0ZXItYW5ndWxhcjItbW9kdWxlcy5oZWxwZXIudHMiLCIuLi9zcmMvdXRpbHMvYW5ndWxhci12ZXJzaW9uLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvYmFzaWMtdHlwZS51dGlsLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZnVuY3Rpb24tc2lnbmF0dXJlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2hhcy1vd24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaTE4bi5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pZi1zdHJpbmcuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaW5kZXhhYmxlLXNpZ25hdHVyZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pcy1pbml0aWFsLXRhYi5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pcy1ub3QtdG9nZ2xlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLXRhYi1lbmFibGVkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWNvZGUtZXhhbXBsZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWV4YW1wbGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtcGFyYW1zLXZhbGlkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1yZXR1cm5zLWNvbW1lbnQuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvbGluay10eXBlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWljb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvbW9kaWYta2luZC1oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9vYmplY3QtbGVuZ3RoLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29iamVjdC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9vbmUtcGFyYW1ldGVyLWhhcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9vci1sZW5ndGguaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb3IuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcGFyc2UtZGVzY3JpcHRpb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcGFyc2UtcHJvcGVydHkuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcmVsYXRpdmUtdXJsLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9zdHJpcC11cmwuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwuZW5naW5lLmhlbHBlcnMudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvbWFya2Rvd24uZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL25nZC5lbmdpbmUudHMiLCIuLi9zcmMvdXRpbHMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL3NlYXJjaC5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvY29tcG9uZW50cy10cmVlLmVuZ2luZS50cyIsIi4uL3NyYy91dGlscy9pbXBvcnRzLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvcm91dGVyLXBhcnNlci51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2lzLW1vZHVsZS13aXRoLXByb3ZpZGVycy50cyIsIi4uL3NyYy91dGlscy9nZXQtbW9kdWxlLXdpdGgtcHJvdmlkZXJzLnRzIiwiLi4vc3JjL3V0aWxzL2Fycm93LWZ1bmN0aW9uLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0LWxpdGVyYWwtZXhwcmVzc2lvbi51dGlsLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9jbGFzcy1oZWxwZXIudHMiLCIuLi9zcmMvdXRpbHMvdHMtcHJpbnRlci51dGlsLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9zeW1ib2wtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9mcmFtZXdvcmstZGVwZW5kZW5jaWVzLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuZHMtbWVyZ2VyLnV0aWwudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvY29kZS1nZW5lcmF0b3IudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb250cm9sbGVyLWRlcC5mYWN0b3J5LnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvZGlyZWN0aXZlLWRlcC5mYWN0b3J5LnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9qcy1kb2MtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9tb2R1bGUtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvbW9kdWxlLWRlcC5mYWN0b3J5LnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvZW50aXR5LWRlcC5mYWN0b3J5LnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyLWRlcGVuZGVuY2llcy50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhcmpzLWRlcGVuZGVuY2llcy50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlLXNlcXVlbnRpYWwudHMiLCIuLi9zcmMvYXBwL2FwcGxpY2F0aW9uLnRzIiwiLi4vc3JjL3V0aWxzL3BhcnNlci51dGlsLmNsYXNzLnRzIiwiLi4vc3JjL2luZGV4LWNsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcbiIsImxldCBsb2cgPSByZXF1aXJlKCdmYW5jeS1sb2cnKTtcbmxldCBjID0gcmVxdWlyZSgnY2hhbGsnKTtcblxuZW51bSBMRVZFTCB7XG4gICAgSU5GTyxcbiAgICBERUJVRyxcbiAgICBFUlJPUixcbiAgICBXQVJOXG59XG5cbmNsYXNzIExvZ2dlciB7XG4gICAgcHVibGljIGxvZ2dlcjtcbiAgICBwdWJsaWMgc2lsZW50O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nO1xuICAgICAgICB0aGlzLnNpbGVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGluZm8oLi4uYXJncykge1xuICAgICAgICBpZiAoIXRoaXMuc2lsZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIodGhpcy5mb3JtYXQoTEVWRUwuSU5GTywgLi4uYXJncykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvciguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyKHRoaXMuZm9ybWF0KExFVkVMLkVSUk9SLCAuLi5hcmdzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdhcm4oLi4uYXJncykge1xuICAgICAgICBpZiAoIXRoaXMuc2lsZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIodGhpcy5mb3JtYXQoTEVWRUwuV0FSTiwgLi4uYXJncykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5zaWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlcih0aGlzLmZvcm1hdChMRVZFTC5ERUJVRywgLi4uYXJncykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0KGxldmVsLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBwYWQgPSAocywgbCwgeiA9ICcnKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcyArIEFycmF5KE1hdGgubWF4KDAsIGwgLSBzLmxlbmd0aCArIDEpKS5qb2luKHopO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBtc2cgPSBhcmdzLmpvaW4oJyAnKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbXNnID0gYCR7cGFkKGFyZ3Muc2hpZnQoKSwgMTUsICcgJyl9OiAke2FyZ3Muam9pbignICcpfWA7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgICAgICBjYXNlIExFVkVMLklORk86XG4gICAgICAgICAgICAgICAgbXNnID0gYy5ncmVlbihtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExFVkVMLkRFQlVHOlxuICAgICAgICAgICAgICAgIG1zZyA9IGMuY3lhbihtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExFVkVMLldBUk46XG4gICAgICAgICAgICAgICAgbXNnID0gYy55ZWxsb3cobXNnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMRVZFTC5FUlJPUjpcbiAgICAgICAgICAgICAgICBtc2cgPSBjLnJlZChtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFttc2ddLmpvaW4oJycpO1xuICAgIH1cbn1cblxuZXhwb3J0IGxldCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJleHBvcnQgY29uc3QgQ09NUE9ET0NfREVGQVVMVFMgPSB7XG4gICAgdGl0bGU6ICdBcHBsaWNhdGlvbiBkb2N1bWVudGF0aW9uJyxcbiAgICBhZGRpdGlvbmFsRW50cnlOYW1lOiAnQWRkaXRpb25hbCBkb2N1bWVudGF0aW9uJyxcbiAgICBhZGRpdGlvbmFsRW50cnlQYXRoOiAnYWRkaXRpb25hbC1kb2N1bWVudGF0aW9uJyxcbiAgICBmb2xkZXI6ICcuL2RvY3VtZW50YXRpb24vJyxcbiAgICBob3N0bmFtZTogJzEyNy4wLjAuMScsXG4gICAgcG9ydDogODA4MCxcbiAgICB0aGVtZTogJ2dpdGJvb2snLFxuICAgIGV4cG9ydEZvcm1hdDogJ2h0bWwnLFxuICAgIGV4cG9ydEZvcm1hdHNTdXBwb3J0ZWQ6IFsnaHRtbCcsICdqc29uJywgJ3BkZiddLFxuICAgIGJhc2U6ICcvJyxcbiAgICBkZWZhdWx0Q292ZXJhZ2VUaHJlc2hvbGQ6IDcwLFxuICAgIGRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlOiAwLFxuICAgIGNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWw6IHRydWUsXG4gICAgdG9nZ2xlTWVudUl0ZW1zOiBbJ2FsbCddLFxuICAgIG5hdlRhYkNvbmZpZzogW10sXG4gICAgZGlzYWJsZVNvdXJjZUNvZGU6IGZhbHNlLFxuICAgIGRpc2FibGVEb21UcmVlOiBmYWxzZSxcbiAgICBkaXNhYmxlVGVtcGxhdGVUYWI6IGZhbHNlLFxuICAgIGRpc2FibGVTdHlsZVRhYjogZmFsc2UsXG4gICAgZGlzYWJsZUdyYXBoOiBmYWxzZSxcbiAgICBkaXNhYmxlTWFpbkdyYXBoOiBmYWxzZSxcbiAgICBkaXNhYmxlQ292ZXJhZ2U6IGZhbHNlLFxuICAgIGRpc2FibGVQcml2YXRlOiBmYWxzZSxcbiAgICBkaXNhYmxlUHJvdGVjdGVkOiBmYWxzZSxcbiAgICBkaXNhYmxlSW50ZXJuYWw6IGZhbHNlLFxuICAgIGRpc2FibGVMaWZlQ3ljbGVIb29rczogZmFsc2UsXG4gICAgZGlzYWJsZVJvdXRlc0dyYXBoOiBmYWxzZSxcbiAgICBkaXNhYmxlRGVwZW5kZW5jaWVzOiBmYWxzZSxcbiAgICBkaXNhYmxlUHJvcGVydGllczogZmFsc2UsXG4gICAgUEFHRV9UWVBFUzoge1xuICAgICAgICBST09UOiAncm9vdCcsXG4gICAgICAgIElOVEVSTkFMOiAnaW50ZXJuYWwnXG4gICAgfSxcbiAgICBnYVNpdGU6ICdhdXRvJyxcbiAgICBjb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZDogZmFsc2UsXG4gICAgbGFuZ3VhZ2U6ICdlbi1VUycsXG4gICAgbWF4U2VhcmNoUmVzdWx0czogMTVcbn07XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IENPTVBPRE9DX0RFRkFVTFRTIH0gZnJvbSAnLi4vdXRpbHMvZGVmYXVsdHMnO1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IENvdmVyYWdlRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb3ZlcmFnZURhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IE1haW5EYXRhSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL21haW4tZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGFnZUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wYWdlLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIGltcGxlbWVudHMgQ29uZmlndXJhdGlvbkludGVyZmFjZSB7XG4gICAgcHJpdmF0ZSBfcGFnZXM6IFBhZ2VJbnRlcmZhY2VbXSA9IFtdO1xuICAgIHByaXZhdGUgX21haW5EYXRhOiBNYWluRGF0YUludGVyZmFjZSA9IHtcbiAgICAgICAgb3V0cHV0OiBDT01QT0RPQ19ERUZBVUxUUy5mb2xkZXIsXG4gICAgICAgIHRoZW1lOiBDT01QT0RPQ19ERUZBVUxUUy50aGVtZSxcbiAgICAgICAgZXh0VGhlbWU6ICcnLFxuICAgICAgICBzZXJ2ZTogZmFsc2UsXG4gICAgICAgIGhvc3RuYW1lOiBDT01QT0RPQ19ERUZBVUxUUy5ob3N0bmFtZSxcbiAgICAgICAgaG9zdDogJycsXG4gICAgICAgIHBvcnQ6IENPTVBPRE9DX0RFRkFVTFRTLnBvcnQsXG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBhc3NldHNGb2xkZXI6ICcnLFxuICAgICAgICBkb2N1bWVudGF0aW9uTWFpbk5hbWU6IENPTVBPRE9DX0RFRkFVTFRTLnRpdGxlLFxuICAgICAgICBkb2N1bWVudGF0aW9uTWFpbkRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgYmFzZTogQ09NUE9ET0NfREVGQVVMVFMuYmFzZSxcbiAgICAgICAgaGlkZUdlbmVyYXRvcjogZmFsc2UsXG4gICAgICAgIGhpZGVEYXJrTW9kZVRvZ2dsZTogZmFsc2UsXG4gICAgICAgIGhhc0ZpbGVzVG9Db3ZlcmFnZTogZmFsc2UsXG4gICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICByZWFkbWU6IGZhbHNlLFxuICAgICAgICBjaGFuZ2Vsb2c6ICcnLFxuICAgICAgICBjb250cmlidXRpbmc6ICcnLFxuICAgICAgICBsaWNlbnNlOiAnJyxcbiAgICAgICAgdG9kbzogJycsXG4gICAgICAgIG1hcmtkb3duczogW10sXG4gICAgICAgIGFkZGl0aW9uYWxQYWdlczogW10sXG4gICAgICAgIHBpcGVzOiBbXSxcbiAgICAgICAgY2xhc3NlczogW10sXG4gICAgICAgIGludGVyZmFjZXM6IFtdLFxuICAgICAgICBjb21wb25lbnRzOiBbXSxcbiAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICBlbnRpdGllczogW10sXG4gICAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgICBpbmplY3RhYmxlczogW10sXG4gICAgICAgIGludGVyY2VwdG9yczogW10sXG4gICAgICAgIGd1YXJkczogW10sXG4gICAgICAgIG1pc2NlbGxhbmVvdXM6IFtdLFxuICAgICAgICByb3V0ZXM6IFtdLFxuICAgICAgICB0c2NvbmZpZzogJycsXG4gICAgICAgIHRvZ2dsZU1lbnVJdGVtczogQ09NUE9ET0NfREVGQVVMVFMudG9nZ2xlTWVudUl0ZW1zLFxuICAgICAgICBuYXZUYWJDb25maWc6IFtdLFxuICAgICAgICB0ZW1wbGF0ZXM6ICcnLFxuICAgICAgICBpbmNsdWRlczogJycsXG4gICAgICAgIGluY2x1ZGVzTmFtZTogQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5TmFtZSxcbiAgICAgICAgaW5jbHVkZXNGb2xkZXI6IENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeVBhdGgsXG4gICAgICAgIGRpc2FibGVTb3VyY2VDb2RlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlU291cmNlQ29kZSxcbiAgICAgICAgZGlzYWJsZURvbVRyZWU6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVEb21UcmVlLFxuICAgICAgICBkaXNhYmxlVGVtcGxhdGVUYWI6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVUZW1wbGF0ZVRhYixcbiAgICAgICAgZGlzYWJsZVN0eWxlVGFiOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlU3R5bGVUYWIsXG4gICAgICAgIGRpc2FibGVHcmFwaDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUdyYXBoLFxuICAgICAgICBkaXNhYmxlTWFpbkdyYXBoOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlTWFpbkdyYXBoLFxuICAgICAgICBkaXNhYmxlQ292ZXJhZ2U6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVDb3ZlcmFnZSxcbiAgICAgICAgZGlzYWJsZVByaXZhdGU6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcml2YXRlLFxuICAgICAgICBkaXNhYmxlSW50ZXJuYWw6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVJbnRlcm5hbCxcbiAgICAgICAgZGlzYWJsZVByb3RlY3RlZDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVByb3RlY3RlZCxcbiAgICAgICAgZGlzYWJsZUxpZmVDeWNsZUhvb2tzOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlTGlmZUN5Y2xlSG9va3MsXG4gICAgICAgIGRpc2FibGVSb3V0ZXNHcmFwaDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVJvdXRlc0dyYXBoLFxuICAgICAgICBkaXNhYmxlU2VhcmNoOiBmYWxzZSxcbiAgICAgICAgZGlzYWJsZURlcGVuZGVuY2llczogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZURlcGVuZGVuY2llcyxcbiAgICAgICAgZGlzYWJsZVByb3BlcnRpZXM6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcm9wZXJ0aWVzLFxuICAgICAgICB3YXRjaDogZmFsc2UsXG4gICAgICAgIG1haW5HcmFwaDogJycsXG4gICAgICAgIGNvdmVyYWdlVGVzdDogZmFsc2UsXG4gICAgICAgIGNvdmVyYWdlVGVzdFRocmVzaG9sZDogQ09NUE9ET0NfREVGQVVMVFMuZGVmYXVsdENvdmVyYWdlVGhyZXNob2xkLFxuICAgICAgICBjb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsOiBDT01QT0RPQ19ERUZBVUxUUy5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsLFxuICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlOiBmYWxzZSxcbiAgICAgICAgY292ZXJhZ2VNaW5pbXVtUGVyRmlsZTogQ09NUE9ET0NfREVGQVVMVFMuZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGUsXG4gICAgICAgIHVuaXRUZXN0Q292ZXJhZ2U6ICcnLFxuICAgICAgICB1bml0VGVzdERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQ6IENPTVBPRE9DX0RFRkFVTFRTLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkLFxuICAgICAgICByb3V0ZXNMZW5ndGg6IDAsXG4gICAgICAgIGFuZ3VsYXJWZXJzaW9uOiAnJyxcbiAgICAgICAgZXhwb3J0Rm9ybWF0OiBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQsXG4gICAgICAgIGNvdmVyYWdlRGF0YToge30gYXMgQ292ZXJhZ2VEYXRhLFxuICAgICAgICBjdXN0b21GYXZpY29uOiAnJyxcbiAgICAgICAgY3VzdG9tTG9nbzogJycsXG4gICAgICAgIHBhY2thZ2VEZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBwYWNrYWdlUGVlckRlcGVuZGVuY2llczogW10sXG4gICAgICAgIHBhY2thZ2VQcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgZ2FJRDogJycsXG4gICAgICAgIGdhU2l0ZTogJycsXG4gICAgICAgIGFuZ3VsYXJQcm9qZWN0OiBmYWxzZSxcbiAgICAgICAgYW5ndWxhckpTUHJvamVjdDogZmFsc2UsXG4gICAgICAgIGxhbmd1YWdlOiBDT01QT0RPQ19ERUZBVUxUUy5sYW5ndWFnZSxcbiAgICAgICAgbWF4U2VhcmNoUmVzdWx0czogMTVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbmZpZ3VyYXRpb247XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLmluc3RhbmNlID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbi5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlSW50ZXJmYWNlKSB7XG4gICAgICAgIGxldCBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiBwYWdlLm5hbWUgfSk7XG4gICAgICAgIGlmIChpbmRleFBhZ2UgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9wYWdlcy5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1BhZ2UobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiBuYW1lIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhQYWdlICE9PSAtMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQWRkaXRpb25hbFBhZ2UocGFnZTogUGFnZUludGVyZmFjZSkge1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXMucHVzaChwYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWRkaXRpb25hbFBhZ2VCeUlkKGlkKTogUGFnZUludGVyZmFjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXMuZmluZChwYWdlID0+IHBhZ2UuaWQgPT09IGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRQYWdlcygpIHtcbiAgICAgICAgdGhpcy5fcGFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRBZGRpdGlvbmFsUGFnZXMoKSB7XG4gICAgICAgIHRoaXMuX21haW5EYXRhLmFkZGl0aW9uYWxQYWdlcyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldFJvb3RNYXJrZG93blBhZ2VzKCkge1xuICAgICAgICBsZXQgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2luZGV4JyB9KTtcbiAgICAgICAgdGhpcy5fcGFnZXMuc3BsaWNlKGluZGV4UGFnZSwgMSk7XG4gICAgICAgIGluZGV4UGFnZSA9IF8uZmluZEluZGV4KHRoaXMuX3BhZ2VzLCB7IG5hbWU6ICdjaGFuZ2Vsb2cnIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2NvbnRyaWJ1dGluZycgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAnbGljZW5zZScgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAndG9kbycgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5tYXJrZG93bnMgPSBbXTtcbiAgICB9XG5cbiAgICBnZXQgcGFnZXMoKTogUGFnZUludGVyZmFjZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICAgIH1cbiAgICBzZXQgcGFnZXMocGFnZXM6IFBhZ2VJbnRlcmZhY2VbXSkge1xuICAgICAgICB0aGlzLl9wYWdlcyA9IFtdO1xuICAgIH1cblxuICAgIGdldCBtYXJrRG93blBhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZXMuZmlsdGVyKHBhZ2UgPT4gcGFnZS5tYXJrZG93bik7XG4gICAgfVxuXG4gICAgZ2V0IG1haW5EYXRhKCk6IE1haW5EYXRhSW50ZXJmYWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21haW5EYXRhO1xuICAgIH1cbiAgICBzZXQgbWFpbkRhdGEoZGF0YTogTWFpbkRhdGFJbnRlcmZhY2UpIHtcbiAgICAgICAgKE9iamVjdCBhcyBhbnkpLmFzc2lnbih0aGlzLl9tYWluRGF0YSwgZGF0YSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb25maWd1cmF0aW9uLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJQXBpU291cmNlUmVzdWx0IH0gZnJvbSAnLi9hcGktc291cmNlLXJlc3VsdC5pbnRlcmZhY2UnO1xuXG5jb25zdCBBbmd1bGFyQVBJczogQXJyYXk8SUFuZ3VsYXJNYWluQXBpPiA9IHJlcXVpcmUoJy4uL3NyYy9kYXRhL2FwaS1saXN0Lmpzb24nKTtcblxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJBcGlVdGlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQW5ndWxhckFwaVV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFBbmd1bGFyQXBpVXRpbC5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQW5ndWxhckFwaVV0aWwuaW5zdGFuY2UgPSBuZXcgQW5ndWxhckFwaVV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQW5ndWxhckFwaVV0aWwuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRBcGkodHlwZTogc3RyaW5nKTogSUFwaVNvdXJjZVJlc3VsdDxJQW5ndWxhck1haW5BcGk+IHtcbiAgICAgICAgbGV0IGZvdW5kZWRBcGk7XG4gICAgICAgIF8uZm9yRWFjaChBbmd1bGFyQVBJcywgbWFpbkFwaSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2gobWFpbkFwaS5pdGVtcywgYXBpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXBpLnRpdGxlID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kZWRBcGkgPSBhcGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc291cmNlOiAnZXh0ZXJuYWwnLFxuICAgICAgICAgICAgZGF0YTogZm91bmRlZEFwaVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5ndWxhckFwaVV0aWwuZ2V0SW5zdGFuY2UoKTtcblxuZXhwb3J0IGludGVyZmFjZSBJQW5ndWxhck1haW5BcGkge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGl0ZW1zOiBJQW5ndWxhckFwaVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbmd1bGFyQXBpIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBkb2NUeXBlOiBzdHJpbmc7XG4gICAgc3RhYmlsaXR5OiBzdHJpbmc7XG4gICAgc2VjdXJlOiBzdHJpbmc7XG4gICAgYmFycmVsOiBzdHJpbmc7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZXh0cmFjdExlYWRpbmdUZXh0KHN0cmluZywgY29tcGxldGVUYWcpIHtcbiAgICBsZXQgdGFnSW5kZXggPSBzdHJpbmcuaW5kZXhPZihjb21wbGV0ZVRhZyk7XG4gICAgbGV0IGxlYWRpbmdUZXh0ID0gdW5kZWZpbmVkO1xuICAgIGxldCBsZWFkaW5nVGV4dFJlZ0V4cCA9IC9cXFsoLis/KVxcXS9nO1xuICAgIGxldCBsZWFkaW5nVGV4dEluZm8gPSBsZWFkaW5nVGV4dFJlZ0V4cC5leGVjKHN0cmluZyk7XG5cbiAgICAvLyBkaWQgd2UgZmluZCBsZWFkaW5nIHRleHQsIGFuZCBpZiBzbywgZG9lcyBpdCBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZSB0YWc/XG4gICAgd2hpbGUgKGxlYWRpbmdUZXh0SW5mbyAmJiBsZWFkaW5nVGV4dEluZm8ubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsZWFkaW5nVGV4dEluZm8uaW5kZXggKyBsZWFkaW5nVGV4dEluZm9bMF0ubGVuZ3RoID09PSB0YWdJbmRleCkge1xuICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobGVhZGluZ1RleHRJbmZvWzBdLCAnJyk7XG4gICAgICAgICAgICBsZWFkaW5nVGV4dCA9IGxlYWRpbmdUZXh0SW5mb1sxXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVhZGluZ1RleHRJbmZvID0gbGVhZGluZ1RleHRSZWdFeHAuZXhlYyhzdHJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGxlYWRpbmdUZXh0OiBsZWFkaW5nVGV4dCxcbiAgICAgICAgc3RyaW5nOiBzdHJpbmdcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRMaW5rVGV4dCh0ZXh0KSB7XG4gICAgbGV0IGxpbmtUZXh0O1xuICAgIGxldCB0YXJnZXQ7XG4gICAgbGV0IHNwbGl0SW5kZXg7XG5cbiAgICAvLyBpZiBhIHBpcGUgaXMgbm90IHByZXNlbnQsIHdlIHNwbGl0IG9uIHRoZSBmaXJzdCBzcGFjZVxuICAgIHNwbGl0SW5kZXggPSB0ZXh0LmluZGV4T2YoJ3wnKTtcbiAgICBpZiAoc3BsaXRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgc3BsaXRJbmRleCA9IHRleHQuc2VhcmNoKC9cXHMvKTtcbiAgICB9XG5cbiAgICBpZiAoc3BsaXRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgbGlua1RleHQgPSB0ZXh0LnN1YnN0cihzcGxpdEluZGV4ICsgMSk7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBzdWJzZXF1ZW50IG5ld2xpbmVzIHRvIGEgc2luZ2xlIHNwYWNlLlxuICAgICAgICBsaW5rVGV4dCA9IGxpbmtUZXh0LnJlcGxhY2UoL1xcbisvLCAnICcpO1xuICAgICAgICB0YXJnZXQgPSB0ZXh0LnN1YnN0cigwLCBzcGxpdEluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogbGlua1RleHQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0IHx8IHRleHRcbiAgICB9O1xufVxuXG5leHBvcnQgbGV0IExpbmtQYXJzZXIgPSAoZnVuY3Rpb24oKSB7XG4gICAgbGV0IHByb2Nlc3NUaGVMaW5rID0gZnVuY3Rpb24oc3RyaW5nLCB0YWdJbmZvLCBsZWFkaW5nVGV4dCkge1xuICAgICAgICBsZXQgbGVhZGluZyA9IGV4dHJhY3RMZWFkaW5nVGV4dChzdHJpbmcsIHRhZ0luZm8uY29tcGxldGVUYWcpLFxuICAgICAgICAgICAgbGlua1RleHQsXG4gICAgICAgICAgICBzcGxpdCxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZTtcblxuICAgICAgICBsaW5rVGV4dCA9IGxlYWRpbmdUZXh0ID8gbGVhZGluZ1RleHQgOiBsZWFkaW5nLmxlYWRpbmdUZXh0IHx8ICcnO1xuXG4gICAgICAgIHNwbGl0ID0gc3BsaXRMaW5rVGV4dCh0YWdJbmZvLnRleHQpO1xuICAgICAgICB0YXJnZXQgPSBzcGxpdC50YXJnZXQ7XG5cbiAgICAgICAgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZy5sZWFkaW5nVGV4dCArICddJyArIHRhZ0luZm8uY29tcGxldGVUYWc7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gdGFnSW5mby5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgIGxpbmtUZXh0ID0gc3BsaXQubGlua1RleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0ID09PSAnJyB8fCBsaW5rVGV4dCA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgJ1snICsgbGlua1RleHQgKyAnXSgnICsgdGFyZ2V0ICsgJyknKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydFxuICAgICAqIHtAbGluayBodHRwOi8vd3d3Lmdvb2dsZS5jb218R29vZ2xlfSBvciB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tIEdpdEh1Yn0gb3IgW0dpdGh1Yl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tfSB0byBbR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20pXG4gICAgICovXG5cbiAgICBsZXQgcmVwbGFjZUxpbmtUYWcgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmV3U3RyaW5nOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5ldyBSZWdFeHAoJ1xcXFxbKCg/Oi58XFxuKSs/KV1cXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKS5leGVjKCdlZSBbVE8gRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJbVE8gRE9de0BsaW5rIFRvZG99XCIsIFwiVE8gRE9cIiwgXCJUb2RvXCJcbiAgICAgICAgLy8gbmV3IFJlZ0V4cCgnXFxcXHtAbGlua1xcXFxzKygoPzoufFxcbikrPylcXFxcfScsICdpJykuZXhlYygnZWUgW1RPRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJ7QGxpbmsgVG9kb31cIiwgXCJUb2RvXCJcblxuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBwcmV2aW91c1N0cmluZyxcbiAgICAgICAgICAgIHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBzdHIuaW5kZXhPZignXXsnKSAhPT0gLTEgPyB0YWdSZWdFeHBGdWxsIDogdGFnUmVnRXhwTGlnaHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZU1hdGNoKHJlcGxhY2VyLCB0YWcsIG1hdGNoLCB0ZXh0LCBsaW5rVGV4dD8pIHtcbiAgICAgICAgICAgIGxldCBtYXRjaGVkVGFnID0ge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlVGFnOiBtYXRjaCxcbiAgICAgICAgICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGFnSW5mby5wdXNoKG1hdGNoZWRUYWcpO1xuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKHN0ciwgbWF0Y2hlZFRhZywgbGlua1RleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZXIoc3RyLCBtYXRjaGVkVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG1hdGNoZXMgPSB0YWdSZWdFeHAuZXhlYyhzdHIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0cmluZyA9IHN0cjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMl0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobWF0Y2hlcyAmJiBwcmV2aW91c1N0cmluZyAhPT0gc3RyKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV3U3RyaW5nOiBzdHJcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgbGV0IF9yZXNvbHZlTGlua3MgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gcmVwbGFjZUxpbmtUYWcoc3RyKS5uZXdTdHJpbmc7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmVMaW5rczogX3Jlc29sdmVMaW5rc1xuICAgIH07XG59KSgpO1xuIiwiZXhwb3J0IGVudW0gQW5ndWxhckxpZmVjeWNsZUhvb2tzIHtcbiAgICBuZ09uQ2hhbmdlcyxcbiAgICBuZ09uSW5pdCxcbiAgICBuZ0RvQ2hlY2ssXG4gICAgbmdBZnRlckNvbnRlbnRJbml0LFxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgICBuZ0FmdGVyVmlld0luaXQsXG4gICAgbmdBZnRlclZpZXdDaGVja2VkLFxuICAgIG5nT25EZXN0cm95XG59XG4iLCJpbXBvcnQgeyBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgZW51bSBLaW5kVHlwZSB7XG4gICAgVU5LTk9XTiA9ICcnLFxuICAgIFNUUklORyA9ICdzdHJpbmcnLFxuICAgIE5VTUJFUiA9ICdudW1iZXInLFxuICAgIEFSUkFZID0gJ1tdJyxcbiAgICBWT0lEID0gJ3ZvaWQnLFxuICAgIEZVTkNUSU9OID0gJ2Z1bmN0aW9uJyxcbiAgICBURU1QTEFURV9MSVRFUkFMID0gJ3RlbXBsYXRlIGxpdGVyYWwgdHlwZScsXG4gICAgTElURVJBTCA9ICdsaXRlcmFsIHR5cGUnLFxuICAgIEJPT0xFQU4gPSAnYm9vbGVhbicsXG4gICAgQU5ZID0gJ2FueScsXG4gICAgTlVMTCA9ICdudWxsJyxcbiAgICBTWU1CT0wgPSAnc3ltYm9sJyxcbiAgICBORVZFUiA9ICduZXZlcicsXG4gICAgVU5ERUZJTkVEID0gJ3VuZGVmaW5lZCcsXG4gICAgT0JKRUNUID0gJ29iamVjdCdcbn1cblxuZXhwb3J0IHR5cGUgSXNLaW5kVHlwZU1ldGhvZHMgPSB7XG4gICAgW2tleSBpbiBrZXlvZiB0eXBlb2YgS2luZFR5cGVdOiAoa2luZDogbnVtYmVyKSA9PiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IElzS2luZFR5cGU6IElzS2luZFR5cGVNZXRob2RzID0ge1xuICAgIEFOWShraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkFOWTtcbiAgICB9LFxuICAgIEFSUkFZKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuQVJSQVk7XG4gICAgfSxcbiAgICBCT09MRUFOKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuQk9PTEVBTjtcbiAgICB9LFxuICAgIEZVTkNUSU9OKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuRlVOQ1RJT047XG4gICAgfSxcbiAgICBMSVRFUkFMKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuTElURVJBTDtcbiAgICB9LFxuICAgIE5FVkVSKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuTkVWRVI7XG4gICAgfSxcbiAgICBOVUxMKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuTlVMTDtcbiAgICB9LFxuICAgIE5VTUJFUihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLk5VTUJFUjtcbiAgICB9LFxuICAgIE9CSkVDVChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLk9CSkVDVDtcbiAgICB9LFxuICAgIFNUUklORyhraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLlNUUklORztcbiAgICB9LFxuICAgIFNZTUJPTChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLlNZTUJPTDtcbiAgICB9LFxuICAgIFRFTVBMQVRFX0xJVEVSQUwoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5URU1QTEFURV9MSVRFUkFMO1xuICAgIH0sXG4gICAgVU5ERUZJTkVEKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuVU5ERUZJTkVEO1xuICAgIH0sXG4gICAgVU5LTk9XTihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLlVOS05PV047XG4gICAgfSxcbiAgICBWT0lEKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuVk9JRDtcbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24ga2luZFRvVHlwZShraW5kOiBudW1iZXIpOiBLaW5kVHlwZSB7XG4gICAgbGV0IF90eXBlID0gS2luZFR5cGUuVU5LTk9XTjtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5TVFJJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk51bWJlcktleXdvcmQ6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5OdW1lcmljTGl0ZXJhbDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuTlVNQkVSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5BcnJheVR5cGU6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5BUlJBWTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuVm9pZEtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLlZPSUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLkZ1bmN0aW9uVHlwZTpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuRlVOQ1RJT047XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlRlbXBsYXRlTGl0ZXJhbFR5cGU6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLlRFTVBMQVRFX0xJVEVSQUw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlR5cGVMaXRlcmFsOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5MSVRFUkFMO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuQk9PTEVBTjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQW55S2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuQU5ZO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuTlVMTDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3ltYm9sS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuU1lNQk9MO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5OZXZlcktleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLk5FVkVSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5VTkRFRklORUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk9iamVjdEtleXdvcmQ6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuT0JKRUNUO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBfdHlwZTtcbn1cbiIsImltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuY29uc3QgdHNhbnkgPSB0cyBhcyBhbnk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL3YyLjEuNC9zcmMvY29tcGlsZXIvdXRpbGl0aWVzLnRzI0wxNTJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VGaWxlT2ZOb2RlKG5vZGU6IHRzLk5vZGUpOiB0cy5Tb3VyY2VGaWxlIHtcbiAgICByZXR1cm4gdHNhbnkuZ2V0U291cmNlRmlsZU9mTm9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi92Mi4xLjQvc3JjL2NvbXBpbGVyL3V0aWxpdGllcy50cyNMMTQyM1xuZXhwb3J0IGZ1bmN0aW9uIGdldEpTRG9jQ29tbWVudFJhbmdlcyhub2RlOiB0cy5Ob2RlLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdHNhbnkuZ2V0SlNEb2NDb21tZW50UmFuZ2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0ICogYXMgX3RzIGZyb20gJy4vdHMtaW50ZXJuYWwnO1xuXG5pbXBvcnQgeyBKU0RvY1BhcmFtZXRlclRhZ0V4dCB9IGZyb20gJy4uL2FwcC9ub2Rlcy9qc2RvYy1wYXJhbWV0ZXItdGFnLm5vZGUnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NQYXJzZXJVdGlsIHtcbiAgICBwdWJsaWMgaXNWYXJpYWJsZUxpa2Uobm9kZTogdHMuTm9kZSk6IG5vZGUgaXMgdHMuVmFyaWFibGVMaWtlRGVjbGFyYXRpb24ge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgc3dpdGNoIChub2RlLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuQmluZGluZ0VsZW1lbnQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkVudW1NZW1iZXI6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlBhcmFtZXRlcjpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHJvcGVydHlBc3NpZ25tZW50OlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm9wZXJ0eURlY2xhcmF0aW9uOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm9wZXJ0eVNpZ25hdHVyZTpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50OlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNUb3Btb3N0TW9kdWxlRGVjbGFyYXRpb24obm9kZTogdHMuTW9kdWxlRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG5vZGUubmV4dENvbnRhaW5lciAmJiBub2RlLm5leHRDb250YWluZXIua2luZCA9PT0gdHMuU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgbGV0IG5leHQgPSA8dHMuTW9kdWxlRGVjbGFyYXRpb24+bm9kZS5uZXh0Q29udGFpbmVyO1xuICAgICAgICAgICAgaWYgKG5vZGUubmFtZS5lbmQgKyAxID09PSBuZXh0Lm5hbWUucG9zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0Um9vdE1vZHVsZURlY2xhcmF0aW9uKG5vZGU6IHRzLk1vZHVsZURlY2xhcmF0aW9uKTogdHMuTm9kZSB7XG4gICAgICAgIHdoaWxlIChub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC5raW5kID09PSB0cy5TeW50YXhLaW5kLk1vZHVsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gPHRzLk1vZHVsZURlY2xhcmF0aW9uPm5vZGUucGFyZW50O1xuICAgICAgICAgICAgaWYgKG5vZGUubmFtZS5wb3MgPT09IHBhcmVudC5uYW1lLmVuZCArIDEpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNYWluQ29tbWVudE9mTm9kZShub2RlOiB0cy5Ob2RlLCBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG5cbiAgICAgICAgaWYgKG5vZGUucGFyZW50ICYmIG5vZGUucGFyZW50LmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudC5wYXJlbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLk1vZHVsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNUb3Btb3N0TW9kdWxlRGVjbGFyYXRpb24oPHRzLk1vZHVsZURlY2xhcmF0aW9uPm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLmdldFJvb3RNb2R1bGVEZWNsYXJhdGlvbig8dHMuTW9kdWxlRGVjbGFyYXRpb24+bm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tZW50cyA9IF90cy5nZXRKU0RvY0NvbW1lbnRSYW5nZXMobm9kZSwgc291cmNlRmlsZS50ZXh0KTtcbiAgICAgICAgaWYgKGNvbW1lbnRzICYmIGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNvbW1lbnQ6IHRzLkNvbW1lbnRSYW5nZTtcbiAgICAgICAgICAgIGlmIChub2RlLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuU291cmNlRmlsZSkge1xuICAgICAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50c1swXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2NvbW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHNvdXJjZUZpbGUudGV4dC5zdWJzdHJpbmcoY29tbWVudC5wb3MsIGNvbW1lbnQuZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlQ29tbWVudCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgICAgICBsZXQgc2hvcnRUZXh0ID0gMDtcblxuICAgICAgICBmdW5jdGlvbiByZWFkQmFyZUxpbmUobGluZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBjb21tZW50ICs9ICdcXG4nICsgbGluZTtcbiAgICAgICAgICAgIGlmIChsaW5lID09PSAnJyAmJiBzaG9ydFRleHQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZSA9PT0gJycgJiYgc2hvcnRUZXh0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgc2hvcnRUZXh0ID0gMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3J0VGV4dCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IChjb21tZW50ID09PSAnJyA/ICcnIDogJ1xcbicpICsgbGluZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBDT0RFX0ZFTkNFID0gL15cXHMqYGBgKD8hLipgYGApLztcbiAgICAgICAgbGV0IGluQ29kZSA9IGZhbHNlO1xuICAgICAgICBsZXQgaW5FeGFtcGxlID0gZmFsc2U7IC8vIGZpcnN0IGxpbmUgd2l0aCBAZXhhbXBsZSwgZW5kIGxpbmUgd2l0aCBlbXB0eSBzdHJpbmcgb3Igc3RyaW5nIG9yICovXG4gICAgICAgIGxldCBuYkxpbmVzID0gMDtcbiAgICAgICAgZnVuY3Rpb24gcmVhZExpbmUobGluZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKC9eXFxzKlxcKj8gPy8sICcnKTtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoL1xccyokLywgJycpO1xuXG4gICAgICAgICAgICBpZiAoQ09ERV9GRU5DRS50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgaW5Db2RlID0gIWluQ29kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZignQGV4YW1wbGUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbkV4YW1wbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxpbmUgPSAnYGBgaHRtbCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbkV4YW1wbGUgJiYgbGluZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpbkV4YW1wbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsaW5lID0gJ2BgYCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaW5Db2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnID0gL15AKFxcUyspLy5leGVjKGxpbmUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFNlZVRhZyA9IC9eQHNlZS8uZXhlYyhsaW5lKTtcblxuICAgICAgICAgICAgICAgIGlmIChTZWVUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgvXkBzZWUvLCAnU2VlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhZyAmJiAhU2VlVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlYWRCYXJlTGluZShsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXHMqXFwvXFwqKy8sICcnKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFwqK1xcL1xccyokLywgJycpO1xuXG4gICAgICAgIG5iTGluZXMgPSB0ZXh0LnNwbGl0KC9cXHJcXG4/fFxcbi8pLmxlbmd0aDtcblxuICAgICAgICB0ZXh0LnNwbGl0KC9cXHJcXG4/fFxcbi8pLmZvckVhY2gocmVhZExpbmUpO1xuXG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SlNEb2NUYWdzKG5vZGU6IHRzLk5vZGUsIGtpbmQ6IFN5bnRheEtpbmQpOiB0cy5KU0RvY1RhZ1tdIHtcbiAgICAgICAgY29uc3QgZG9jcyA9IHRoaXMuZ2V0SlNEb2NzKG5vZGUpO1xuICAgICAgICBpZiAoZG9jcykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB0cy5KU0RvY1RhZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzSlNEb2NQYXJhbWV0ZXJUYWcoZG9jKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jLmtpbmQgPT09IGtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRvYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSlNEb2MoZG9jKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5fLmZpbHRlcihkb2MudGFncywgdGFnID0+IHRhZy5raW5kID09PSBraW5kKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHR5cGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEpTRG9jcyhub2RlOiB0cy5Ob2RlKTogUmVhZG9ubHlBcnJheTx0cy5KU0RvYyB8IHRzLkpTRG9jVGFnPiB7XG4gICAgICAgIC8vIFRPRE86IGpzRG9jQ2FjaGUgaXMgaW50ZXJuYWwsIHNlZSBpZiB0aGVyZSdzIGEgd2F5IGFyb3VuZCBpdFxuICAgICAgICBsZXQgY2FjaGU6IFJlYWRvbmx5QXJyYXk8dHMuSlNEb2MgfCB0cy5KU0RvY1RhZz4gPSAobm9kZSBhcyBhbnkpLmpzRG9jQ2FjaGU7XG4gICAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgICAgIGNhY2hlID0gdGhpcy5nZXRKU0RvY3NXb3JrZXIobm9kZSwgW10pLmZpbHRlcih4ID0+IHgpO1xuICAgICAgICAgICAgKG5vZGUgYXMgYW55KS5qc0RvY0NhY2hlID0gY2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byByZWNvZ25pemUgdGhpcyBwYXR0ZXJuIHdoZW4gbm9kZSBpcyBpbml0aWFsaXplclxuICAgIC8vIG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGFuZCBKU0RvYyBjb21tZW50cyBhcmUgb24gY29udGFpbmluZyB2YXJpYWJsZSBzdGF0ZW1lbnQuXG4gICAgLy8gLyoqXG4gICAgLy8gICAqIEBwYXJhbSB7bnVtYmVyfSBuYW1lXG4gICAgLy8gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgLy8gICAqL1xuICAgIC8vIHZhciB4ID0gZnVuY3Rpb24obmFtZSkgeyByZXR1cm4gbmFtZS5sZW5ndGg7IH1cbiAgICBwcml2YXRlIGdldEpTRG9jc1dvcmtlcihub2RlOiB0cy5Ob2RlLCBjYWNoZSk6IFJlYWRvbmx5QXJyYXk8YW55PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuICAgICAgICBjb25zdCBpc0luaXRpYWxpemVyT2ZWYXJpYWJsZURlY2xhcmF0aW9uSW5TdGF0ZW1lbnQgPVxuICAgICAgICAgICAgdGhpcy5pc1ZhcmlhYmxlTGlrZShwYXJlbnQpICYmXG4gICAgICAgICAgICBwYXJlbnQuaW5pdGlhbGl6ZXIgPT09IG5vZGUgJiZcbiAgICAgICAgICAgIHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQocGFyZW50LnBhcmVudC5wYXJlbnQpO1xuICAgICAgICBjb25zdCBpc1ZhcmlhYmxlT2ZWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID1cbiAgICAgICAgICAgIHRoaXMuaXNWYXJpYWJsZUxpa2Uobm9kZSkgJiYgdHMuaXNWYXJpYWJsZVN0YXRlbWVudChwYXJlbnQucGFyZW50KTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVTdGF0ZW1lbnROb2RlID0gaXNJbml0aWFsaXplck9mVmFyaWFibGVEZWNsYXJhdGlvbkluU3RhdGVtZW50XG4gICAgICAgICAgICA/IHBhcmVudC5wYXJlbnQucGFyZW50XG4gICAgICAgICAgICA6IGlzVmFyaWFibGVPZlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRcbiAgICAgICAgICAgID8gcGFyZW50LnBhcmVudFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh2YXJpYWJsZVN0YXRlbWVudE5vZGUpIHtcbiAgICAgICAgICAgIGNhY2hlID0gdGhpcy5nZXRKU0RvY3NXb3JrZXIodmFyaWFibGVTdGF0ZW1lbnROb2RlLCBjYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbHNvIHJlY29nbml6ZSB3aGVuIHRoZSBub2RlIGlzIHRoZSBSSFMgb2YgYW4gYXNzaWdubWVudCBleHByZXNzaW9uXG4gICAgICAgIGNvbnN0IGlzU291cmNlT2ZBc3NpZ25tZW50RXhwcmVzc2lvblN0YXRlbWVudCA9XG4gICAgICAgICAgICBwYXJlbnQgJiZcbiAgICAgICAgICAgIHBhcmVudC5wYXJlbnQgJiZcbiAgICAgICAgICAgIHRzLmlzQmluYXJ5RXhwcmVzc2lvbihwYXJlbnQpICYmXG4gICAgICAgICAgICBwYXJlbnQub3BlcmF0b3JUb2tlbi5raW5kID09PSBTeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICAgICAgICB0cy5pc0V4cHJlc3Npb25TdGF0ZW1lbnQocGFyZW50LnBhcmVudCk7XG4gICAgICAgIGlmIChpc1NvdXJjZU9mQXNzaWdubWVudEV4cHJlc3Npb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGNhY2hlID0gdGhpcy5nZXRKU0RvY3NXb3JrZXIocGFyZW50LnBhcmVudCwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNNb2R1bGVEZWNsYXJhdGlvbiA9XG4gICAgICAgICAgICB0cy5pc01vZHVsZURlY2xhcmF0aW9uKG5vZGUpICYmIHBhcmVudCAmJiB0cy5pc01vZHVsZURlY2xhcmF0aW9uKHBhcmVudCk7XG4gICAgICAgIGNvbnN0IGlzUHJvcGVydHlBc3NpZ25tZW50RXhwcmVzc2lvbiA9IHBhcmVudCAmJiB0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwYXJlbnQpO1xuICAgICAgICBpZiAoaXNNb2R1bGVEZWNsYXJhdGlvbiB8fCBpc1Byb3BlcnR5QXNzaWdubWVudEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGNhY2hlID0gdGhpcy5nZXRKU0RvY3NXb3JrZXIocGFyZW50LCBjYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQdWxsIHBhcmFtZXRlciBjb21tZW50cyBmcm9tIGRlY2xhcmluZyBmdW5jdGlvbiBhcyB3ZWxsXG4gICAgICAgIGlmICh0cy5pc1BhcmFtZXRlcihub2RlKSkge1xuICAgICAgICAgICAgY2FjaGUgPSBfLmNvbmNhdChjYWNoZSwgdGhpcy5nZXRKU0RvY1BhcmFtZXRlclRhZ3Mobm9kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZUxpa2Uobm9kZSkgJiYgbm9kZS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgY2FjaGUgPSBfLmNvbmNhdChjYWNoZSwgbm9kZS5pbml0aWFsaXplci5qc0RvYyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWNoZSA9IF8uY29uY2F0KGNhY2hlLCBub2RlLmpzRG9jKTtcblxuICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRKU0RvY1BhcmFtZXRlclRhZ3MoXG4gICAgICAgIHBhcmFtOiB0cy5QYXJhbWV0ZXJEZWNsYXJhdGlvblxuICAgICk6IFJlYWRvbmx5QXJyYXk8dHMuSlNEb2NQYXJhbWV0ZXJUYWc+IHtcbiAgICAgICAgY29uc3QgZnVuYyA9IHBhcmFtLnBhcmVudCBhcyB0cy5GdW5jdGlvbkxpa2VEZWNsYXJhdGlvbjtcbiAgICAgICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0SlNEb2NUYWdzKFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIFN5bnRheEtpbmQuSlNEb2NQYXJhbWV0ZXJUYWdcbiAgICAgICAgKSBhcyB0cy5KU0RvY1BhcmFtZXRlclRhZ1tdO1xuXG4gICAgICAgIGlmICghcGFyYW0ubmFtZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBhbm9ueW1vdXMganNkb2MgcGFyYW0gZnJvbSBhIGBmdW5jdGlvbih0eXBlMSwgdHlwZTIpOiB0eXBlM2Agc3BlY2lmaWNhdGlvblxuICAgICAgICAgICAgY29uc3QgaSA9IGZ1bmMucGFyYW1ldGVycy5pbmRleE9mKHBhcmFtKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtVGFncyA9IF8uZmlsdGVyKHRhZ3MsIHRhZyA9PiB0cy5pc0pTRG9jUGFyYW1ldGVyVGFnKHRhZykpO1xuXG4gICAgICAgICAgICBpZiAocGFyYW1UYWdzICYmIDAgPD0gaSAmJiBpIDwgcGFyYW1UYWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbcGFyYW1UYWdzW2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc0lkZW50aWZpZXIocGFyYW0ubmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYXJhbS5uYW1lLnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gXy5maWx0ZXIodGFncywgdGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHMgJiYgdHMuaXNKU0RvY1BhcmFtZXRlclRhZyh0YWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0OiBKU0RvY1BhcmFtZXRlclRhZ0V4dCA9IHRhZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LnBhcmFtZXRlck5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wYXJhbWV0ZXJOYW1lLnRleHQgPT09IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHQubmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5uYW1lLmVzY2FwZWRUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm5hbWUuZXNjYXBlZFRleHQgPT09IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGl0J3MgYSBkZXN0cnVjdHVyZWQgcGFyYW1ldGVyLCBzbyBpdCBzaG91bGQgbG9vayB1cCBhbiBcIm9iamVjdCB0eXBlXCIgc2VyaWVzIG9mIG11bHRpcGxlIGxpbmVzXG4gICAgICAgICAgICAvLyBCdXQgbXVsdGktbGluZSBvYmplY3QgdHlwZXMgYXJlbid0IHN1cHBvcnRlZCB5ZXQgZWl0aGVyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlSlNEb2NOb2RlKG5vZGUpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmF3RGVzY3JpcHRpb24gPSAnJztcblxuICAgICAgICBpZiAodHlwZW9mIG5vZGUuY29tbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJhd0Rlc2NyaXB0aW9uICs9IG5vZGUuY29tbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBub2RlLmNvbW1lbnQubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBKU0RvY05vZGUgPSBub2RlLmNvbW1lbnRbaV07XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoSlNEb2NOb2RlLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5KU0RvY0NvbW1lbnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3RGVzY3JpcHRpb24gKz0gSlNEb2NOb2RlLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuSlNEb2NUZXh0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0Rlc2NyaXB0aW9uICs9IEpTRG9jTm9kZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkpTRG9jTGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlNEb2NOb2RlLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSBKU0RvY05vZGUubmFtZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0RvY05vZGUubmFtZS5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0RvY05vZGUubmFtZS5yaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRG9jTm9kZS5uYW1lLmxlZnQuZXNjYXBlZFRleHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNEb2NOb2RlLm5hbWUucmlnaHQuZXNjYXBlZFRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3RGVzY3JpcHRpb24gKz0gSlNEb2NOb2RlLnRleHQgKyAne0BsaW5rICcgKyB0ZXh0ICsgJ30nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmF3RGVzY3JpcHRpb247XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgeyBMaW5rUGFyc2VyIH0gZnJvbSAnLi9saW5rLXBhcnNlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuaW1wb3J0IHsgQW5ndWxhckxpZmVjeWNsZUhvb2tzIH0gZnJvbSAnLi9hbmd1bGFyLWxpZmVjeWNsZXMtaG9va3MnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4va2luZC10by10eXBlJztcbmltcG9ydCB7IEpzZG9jUGFyc2VyVXRpbCB9IGZyb20gJy4vanNkb2MtcGFyc2VyLnV0aWwnO1xuXG5jb25zdCBnZXRDdXJyZW50RGlyZWN0b3J5ID0gdHMuc3lzLmdldEN1cnJlbnREaXJlY3Rvcnk7XG5jb25zdCB1c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzID0gdHMuc3lzLnVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXM7XG5jb25zdCBuZXdMaW5lID0gdHMuc3lzLm5ld0xpbmU7XG5jb25zdCB7IG1hcmtlZCB9ID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdMaW5lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXMgPyBmaWxlTmFtZSA6IGZpbGVOYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREaWFnbm9zdGljc0hvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICBnZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgIGdldENhbm9uaWNhbEZpbGVOYW1lLFxuICAgIGdldE5ld0xpbmVcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWR0YWdzKHRhZ3M6IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCBqc2RvY1BhcnNlclV0aWwgPSBuZXcgSnNkb2NQYXJzZXJVdGlsKCk7XG4gICAgbGV0IG10YWdzID0gdGFncztcbiAgICBfLmZvckVhY2gobXRhZ3MsIHRhZyA9PiB7XG4gICAgICAgIGNvbnN0IHJhd0NvbW1lbnQgPSBqc2RvY1BhcnNlclV0aWwucGFyc2VKU0RvY05vZGUodGFnKTtcbiAgICAgICAgdGFnLmNvbW1lbnQgPSBtYXJrZWQoTGlua1BhcnNlci5yZXNvbHZlTGlua3MocmF3Q29tbWVudCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBtdGFncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVGFnc0FuZEFyZ3MoYXJnczogQXJyYXk8YW55PiwganNkb2N0YWdzPzogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIGxldCBtYXJncyA9IF8uY2xvbmVEZWVwKGFyZ3MpO1xuICAgIF8uZm9yRWFjaChtYXJncywgYXJnID0+IHtcbiAgICAgICAgYXJnLnRhZ05hbWUgPSB7XG4gICAgICAgICAgICB0ZXh0OiAncGFyYW0nXG4gICAgICAgIH07XG4gICAgICAgIGlmIChqc2RvY3RhZ3MpIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChqc2RvY3RhZ3MsIGpzZG9jdGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWcubmFtZSAmJiBqc2RvY3RhZy5uYW1lLnRleHQgPT09IGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50YWdOYW1lID0ganNkb2N0YWcudGFnTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXJnLm5hbWUgPSBqc2RvY3RhZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhcmcuY29tbWVudCA9IGpzZG9jdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50eXBlRXhwcmVzc2lvbiA9IGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gQWRkIGV4YW1wbGUgJiByZXR1cm5zICYgcHJpdmF0ZVxuICAgIGlmIChqc2RvY3RhZ3MpIHtcbiAgICAgICAgXy5mb3JFYWNoKGpzZG9jdGFncywganNkb2N0YWcgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGpzZG9jdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAoanNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAnZXhhbXBsZScgfHwganNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAncHJpdmF0ZScpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBtYXJncy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZToganNkb2N0YWcudGFnTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudDoganNkb2N0YWcuY29tbWVudFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGpzZG9jdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAoanNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAncmV0dXJucycgfHwganNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAncmV0dXJuJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCByZXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IGpzZG9jdGFnLnRhZ05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGpzZG9jdGFnLmNvbW1lbnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZy50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY3RhZy50eXBlRXhwcmVzc2lvbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldC5yZXR1cm5UeXBlID0ga2luZFRvVHlwZShqc2RvY3RhZy50eXBlRXhwcmVzc2lvbi50eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXJncy5wdXNoKHJldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWFyZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29uZmlnKGNvbmZpZ0ZpbGU6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IHJlc3VsdCA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRzLmZvcm1hdERpYWdub3N0aWNzKFtyZXN1bHQuZXJyb3JdLCBmb3JtYXREaWFnbm9zdGljc0hvc3QpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuY29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBCb20oc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzb3VyY2UuY2hhckNvZGVBdCgwKSA9PT0gMHhmZWZmKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNCb20oc291cmNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc291cmNlLmNoYXJDb2RlQXQoMCkgPT09IDB4ZmVmZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhdGgoZmlsZXM6IEFycmF5PHN0cmluZz4sIGN3ZDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgbGV0IF9maWxlcyA9IGZpbGVzO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuID0gZmlsZXMubGVuZ3RoO1xuXG4gICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGZpbGVzW2ldLmluZGV4T2YoY3dkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGZpbGVzW2ldID0gcGF0aC5yZXNvbHZlKGN3ZCArIHBhdGguc2VwICsgZmlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF9maWxlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyhtZXRob2RzOiBBcnJheTxhbnk+KTogQXJyYXk8YW55PiB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGlmICh0eXBlb2YgbWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gbWV0aG9kcy5sZW5ndGg7XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIShtZXRob2RzW2ldLm5hbWUgaW4gQW5ndWxhckxpZmVjeWNsZUhvb2tzKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1ldGhvZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblNvdXJjZXNGb3JXYXRjaChsaXN0KSB7XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVzQ29tcGFyZUZuKG5hbWU/KSB7XG4gICAgLyoqXG4gICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICovXG4gICAgbmFtZSA9IG5hbWUgfHwgJ25hbWUnO1xuICAgIGNvbnN0IHQgPSAoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYVtuYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFbbmFtZV0ubG9jYWxlQ29tcGFyZShiW25hbWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSWdub3JlKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgbWVtYmVyLmpzRG9jKSB7XG4gICAgICAgICAgICBpZiAoZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUudGV4dC5pbmRleE9mKCdpZ25vcmUnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuaWYgKCFBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnaW5jbHVkZXMnLCB7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4KSB7XG4gICAgICAgICAgICBpZiAodGhpcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ0aGlzXCIgaXMgbnVsbCBvciBub3QgZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAxLiBMZXQgTyBiZSA/IFRvT2JqZWN0KHRoaXMgdmFsdWUpLlxuICAgICAgICAgICAgbGV0IG8gPSBPYmplY3QodGhpcyk7XG5cbiAgICAgICAgICAgIC8vIDIuIExldCBsZW4gYmUgPyBUb0xlbmd0aCg/IEdldChPLCBcImxlbmd0aFwiKSkuXG4gICAgICAgICAgICBsZXQgbGVuID0gby5sZW5ndGggPj4+IDA7XG5cbiAgICAgICAgICAgIC8vIDMuIElmIGxlbiBpcyAwLCByZXR1cm4gZmFsc2UuXG4gICAgICAgICAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA0LiBMZXQgbiBiZSA/IFRvSW50ZWdlcihmcm9tSW5kZXgpLlxuICAgICAgICAgICAgLy8gICAgKElmIGZyb21JbmRleCBpcyB1bmRlZmluZWQsIHRoaXMgc3RlcCBwcm9kdWNlcyB0aGUgdmFsdWUgMC4pXG4gICAgICAgICAgICBsZXQgbiA9IGZyb21JbmRleCB8IDA7XG5cbiAgICAgICAgICAgIC8vIDUuIElmIG4g4omlIDAsIHRoZW5cbiAgICAgICAgICAgIC8vICBhLiBMZXQgayBiZSBuLlxuICAgICAgICAgICAgLy8gNi4gRWxzZSBuIDwgMCxcbiAgICAgICAgICAgIC8vICBhLiBMZXQgayBiZSBsZW4gKyBuLlxuICAgICAgICAgICAgLy8gIGIuIElmIGsgPCAwLCBsZXQgayBiZSAwLlxuICAgICAgICAgICAgbGV0IGsgPSBNYXRoLm1heChuID49IDAgPyBuIDogbGVuIC0gTWF0aC5hYnMobiksIDApO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBzYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICB4ID09PSB5IHx8XG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT09ICdudW1iZXInICYmIGlzTmFOKHgpICYmIGlzTmFOKHkpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDcuIFJlcGVhdCwgd2hpbGUgayA8IGxlblxuICAgICAgICAgICAgd2hpbGUgKGsgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBhLiBMZXQgZWxlbWVudEsgYmUgdGhlIHJlc3VsdCBvZiA/IEdldChPLCAhIFRvU3RyaW5nKGspKS5cbiAgICAgICAgICAgICAgICAvLyBiLiBJZiBTYW1lVmFsdWVaZXJvKHNlYXJjaEVsZW1lbnQsIGVsZW1lbnRLKSBpcyB0cnVlLCByZXR1cm4gdHJ1ZS5cbiAgICAgICAgICAgICAgICBpZiAoc2FtZVZhbHVlWmVybyhvW2tdLCBzZWFyY2hFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYy4gSW5jcmVhc2UgayBieSAxLlxuICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gOC4gUmV0dXJuIGZhbHNlXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNYWluU291cmNlRm9sZGVyKGZpbGVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBtYWluRm9sZGVyID0gJyc7XG4gICAgbGV0IG1haW5Gb2xkZXJDb3VudCA9IDA7XG4gICAgbGV0IHJhd0ZvbGRlcnMgPSBmaWxlcy5tYXAoZmlsZXBhdGggPT4ge1xuICAgICAgICBsZXQgc2hvcnRQYXRoID0gZmlsZXBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgcmV0dXJuIHBhdGguZGlybmFtZShzaG9ydFBhdGgpO1xuICAgIH0pO1xuICAgIGxldCBmb2xkZXJzID0ge307XG4gICAgcmF3Rm9sZGVycyA9IF8udW5pcShyYXdGb2xkZXJzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Rm9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc2VwID0gcmF3Rm9sZGVyc1tpXS5zcGxpdChwYXRoLnNlcCk7XG4gICAgICAgIHNlcC5mb3JFYWNoKGZvbGRlciA9PiB7XG4gICAgICAgICAgICBpZiAoZm9sZGVyc1tmb2xkZXJdKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyc1tmb2xkZXJdICs9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvbGRlcnNbZm9sZGVyXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBmIGluIGZvbGRlcnMpIHtcbiAgICAgICAgaWYgKGZvbGRlcnNbZl0gPiBtYWluRm9sZGVyQ291bnQpIHtcbiAgICAgICAgICAgIG1haW5Gb2xkZXJDb3VudCA9IGZvbGRlcnNbZl07XG4gICAgICAgICAgICBtYWluRm9sZGVyID0gZjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFpbkZvbGRlcjtcbn1cblxuLy8gQ3JlYXRlIGEgY29tcGlsZXJIb3N0IG9iamVjdCB0byBhbGxvdyB0aGUgY29tcGlsZXIgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXNcbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlckhvc3QodHJhbnNwaWxlT3B0aW9uczogYW55KTogdHMuQ29tcGlsZXJIb3N0IHtcbiAgICBjb25zdCBpbnB1dEZpbGVOYW1lID1cbiAgICAgICAgdHJhbnNwaWxlT3B0aW9ucy5maWxlTmFtZSB8fCAodHJhbnNwaWxlT3B0aW9ucy5qc3ggPyAnbW9kdWxlLnRzeCcgOiAnbW9kdWxlLnRzJyk7XG5cbiAgICBjb25zdCB0b1JldHVybjogdHMuQ29tcGlsZXJIb3N0ID0ge1xuICAgICAgICBnZXRTb3VyY2VGaWxlOiAoZmlsZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcudHMnKSAhPT0gLTEgfHwgZmlsZU5hbWUubGFzdEluZGV4T2YoJy5qcycpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSA9PT0gJ2xpYi5kLnRzJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUuc3Vic3RyKC01KSA9PT0gJy5kLnRzJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUoZmlsZU5hbWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHBhdGguam9pbih0cmFuc3BpbGVPcHRpb25zLnRzY29uZmlnRGlyZWN0b3J5LCBmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbGliU291cmNlID0gJyc7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsaWJTb3VyY2UgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZU5hbWUpLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JvbShsaWJTb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaWJTb3VyY2UgPSBzdHJpcEJvbShsaWJTb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoZSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0cy5jcmVhdGVTb3VyY2VGaWxlKGZpbGVOYW1lLCBsaWJTb3VyY2UsIHRyYW5zcGlsZU9wdGlvbnMudGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICB3cml0ZUZpbGU6IChuYW1lLCB0ZXh0KSA9PiB7fSxcbiAgICAgICAgZ2V0RGVmYXVsdExpYkZpbGVOYW1lOiAoKSA9PiAnbGliLmQudHMnLFxuICAgICAgICB1c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IGZpbGVOYW1lID0+IGZpbGVOYW1lLFxuICAgICAgICBnZXRDdXJyZW50RGlyZWN0b3J5OiAoKSA9PiAnJyxcbiAgICAgICAgZ2V0TmV3TGluZTogKCkgPT4gJ1xcbicsXG4gICAgICAgIGZpbGVFeGlzdHM6IChmaWxlTmFtZSk6IGJvb2xlYW4gPT4gZmlsZU5hbWUgPT09IGlucHV0RmlsZU5hbWUsXG4gICAgICAgIHJlYWRGaWxlOiAoKSA9PiAnJyxcbiAgICAgICAgZGlyZWN0b3J5RXhpc3RzOiAoKSA9PiB0cnVlLFxuICAgICAgICBnZXREaXJlY3RvcmllczogKCkgPT4gW11cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRvUmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0ciwgY291bnQpOiBzdHJpbmcge1xuICAgIGxldCBzdHJpcEluZGVudCA9IChzdHJpcGVkU3RyaW5nOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzdHJpcGVkU3RyaW5nLm1hdGNoKC9eWyBcXHRdKig/PVxcUykvZ20pO1xuXG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpcGVkU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogdXNlIHNwcmVhZCBvcGVyYXRvciB3aGVuIHRhcmdldGluZyBOb2RlLmpzIDZcbiAgICAgICAgY29uc3QgaW5kZW50ID0gTWF0aC5taW4uYXBwbHkoXG4gICAgICAgICAgICBNYXRoLFxuICAgICAgICAgICAgbWF0Y2gubWFwKHggPT4geC5sZW5ndGgpXG4gICAgICAgICk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBeWyBcXFxcdF17JHtpbmRlbnR9fWAsICdnbScpO1xuXG4gICAgICAgIHJldHVybiBpbmRlbnQgPiAwID8gc3RyaXBlZFN0cmluZy5yZXBsYWNlKHJlLCAnJykgOiBzdHJpcGVkU3RyaW5nO1xuICAgIH07XG5cbiAgICBsZXQgcmVwZWF0aW5nID0gKG4sIHJlcGVhdFN0cmluZykgPT4ge1xuICAgICAgICByZXBlYXRTdHJpbmcgPSByZXBlYXRTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IHJlcGVhdFN0cmluZztcblxuICAgICAgICBpZiAodHlwZW9mIHJlcGVhdFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIFxcYGlucHV0XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2YgcmVwZWF0U3RyaW5nfVxcYGBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGNvdW50XFxgIHRvIGJlIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlciwgZ290IFxcYCR7bn1cXGBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQgPSAnJztcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAobiAmIDEpIHtcbiAgICAgICAgICAgICAgICByZXQgKz0gcmVwZWF0U3RyaW5nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXBlYXRTdHJpbmcgKz0gcmVwZWF0U3RyaW5nO1xuICAgICAgICB9IHdoaWxlICgobiA+Pj0gMSkpO1xuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIGxldCBpbmRlbnRTdHJpbmcgPSAoaW5kZW50ZWRTdHJpbmcsIGluZGVudENvdW50KSA9PiB7XG4gICAgICAgIGxldCBpbmRlbnQgPSAnICc7XG4gICAgICAgIGluZGVudENvdW50ID0gaW5kZW50Q291bnQgPT09IHVuZGVmaW5lZCA/IDEgOiBpbmRlbnRDb3VudDtcblxuICAgICAgICBpZiAodHlwZW9mIGluZGVudGVkU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgXFxgaW5wdXRcXGAgdG8gYmUgYSBcXGBzdHJpbmdcXGAsIGdvdCBcXGAke3R5cGVvZiBpbmRlbnRlZFN0cmluZ31cXGBgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbmRlbnRDb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIFxcYGNvdW50XFxgIHRvIGJlIGEgXFxgbnVtYmVyXFxgLCBnb3QgXFxgJHt0eXBlb2YgaW5kZW50Q291bnR9XFxgYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5kZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW5kZW50XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2YgaW5kZW50fVxcYGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGVudENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZW50ZWRTdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRlbnQgPSBpbmRlbnRDb3VudCA+IDEgPyByZXBlYXRpbmcoaW5kZW50Q291bnQsIGluZGVudCkgOiBpbmRlbnQ7XG5cbiAgICAgICAgcmV0dXJuIGluZGVudGVkU3RyaW5nLnJlcGxhY2UoL14oPyFcXHMqJCkvZ20sIGluZGVudCk7XG4gICAgfTtcblxuICAgIHJldHVybiBpbmRlbnRTdHJpbmcoc3RyaXBJbmRlbnQoc3RyKSwgY291bnQgfHwgMCk7XG59XG5cbmNvbnN0IElHTk9SRURfRElSRUNUT1JJRVMgPSBbJy5naXQnLCAnbm9kZV9tb2R1bGVzJ107XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVEaXJlY3RvcnkoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgYmFzZSA9IHBhdGguYmFzZW5hbWUoZGlyKTtcblxuICAgIGlmIChJR05PUkVEX0RJUkVDVE9SSUVTLmluY2x1ZGVzKGJhc2UpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICAgIGZzLmFjY2Vzc1N5bmMoZGlyLCBmcy5jb25zdGFudHMuV19PSyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdJZ25vcmluZyBpbmFjY2Vzc2libGUgZm9sZGVyJywgZGlyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBNaXNjZWxsYW5lb3VzRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvbWlzY2VsbGFuZW91cy1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQYXJzZWREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wYXJzZWQtZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUm91dGVJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JvdXRlcy5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgQW5ndWxhckFwaVV0aWwgZnJvbSAnLi4vLi4vdXRpbHMvYW5ndWxhci1hcGkudXRpbCc7XG5pbXBvcnQgeyBJQXBpU291cmNlUmVzdWx0IH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLXNvdXJjZS1yZXN1bHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldE5hbWVzQ29tcGFyZUZuIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQge1xuICAgIElFbnVtRGVjRGVwLFxuICAgIElGdW5jdGlvbkRlY0RlcCxcbiAgICBJR3VhcmREZXAsXG4gICAgSUluamVjdGFibGVEZXAsXG4gICAgSUludGVyY2VwdG9yRGVwLFxuICAgIElJbnRlcmZhY2VEZXAsXG4gICAgSVBpcGVEZXAsXG4gICAgSVR5cGVBbGlhc0RlY0RlcFxufSBmcm9tICcuLi9jb21waWxlci9hbmd1bGFyL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgSUNvbXBvbmVudERlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSUNvbnRyb2xsZXJEZXAgfSBmcm9tICcuLi9jb21waWxlci9hbmd1bGFyL2RlcHMvY29udHJvbGxlci1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBJRGlyZWN0aXZlRGVwIH0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBzL2RpcmVjdGl2ZS1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBJTW9kdWxlRGVwIH0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBzL21vZHVsZS1kZXAuZmFjdG9yeSc7XG5cbmNvbnN0IHRyYXZlcnNlID0gcmVxdWlyZSgndHJhdmVyc2UnKTtcblxuZXhwb3J0IGNsYXNzIERlcGVuZGVuY2llc0VuZ2luZSB7XG4gICAgcHVibGljIHJhd0RhdGE6IFBhcnNlZERhdGE7XG4gICAgcHVibGljIG1vZHVsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyByYXdNb2R1bGVzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgcmF3TW9kdWxlc0Zvck92ZXJ2aWV3OiBPYmplY3RbXTtcbiAgICBwdWJsaWMgY29tcG9uZW50czogT2JqZWN0W107XG4gICAgcHVibGljIGNvbnRyb2xsZXJzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgZW50aXRpZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBkaXJlY3RpdmVzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgaW5qZWN0YWJsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbnRlcmNlcHRvcnM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBndWFyZHM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbnRlcmZhY2VzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgcm91dGVzOiBSb3V0ZUludGVyZmFjZTtcbiAgICBwdWJsaWMgcGlwZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBjbGFzc2VzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgbWlzY2VsbGFuZW91czogTWlzY2VsbGFuZW91c0RhdGEgPSB7XG4gICAgICAgIHZhcmlhYmxlczogW10sXG4gICAgICAgIGZ1bmN0aW9uczogW10sXG4gICAgICAgIHR5cGVhbGlhc2VzOiBbXSxcbiAgICAgICAgZW51bWVyYXRpb25zOiBbXSxcbiAgICAgICAgZ3JvdXBlZFZhcmlhYmxlczogW10sXG4gICAgICAgIGdyb3VwZWRGdW5jdGlvbnM6IFtdLFxuICAgICAgICBncm91cGVkRW51bWVyYXRpb25zOiBbXSxcbiAgICAgICAgZ3JvdXBlZFR5cGVBbGlhc2VzOiBbXVxuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRGVwZW5kZW5jaWVzRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghRGVwZW5kZW5jaWVzRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUuaW5zdGFuY2UgPSBuZXcgRGVwZW5kZW5jaWVzRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERlcGVuZGVuY2llc0VuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU1vZHVsZXNEZWNsYXJhdGlvbnNFeHBvcnRzVHlwZXMoKSB7XG4gICAgICAgIGxldCBtZXJnZVR5cGVzID0gZW50cnkgPT4ge1xuICAgICAgICAgICAgbGV0IGRpcmVjdGl2ZSA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAgICAgZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgZW50cnkuZmlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdkaXJlY3RpdmUnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gZGlyZWN0aXZlLmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKFxuICAgICAgICAgICAgICAgIGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLFxuICAgICAgICAgICAgICAgIGVudHJ5LmZpbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnR5cGUgPSAnY29tcG9uZW50JztcbiAgICAgICAgICAgICAgICBlbnRyeS5pZCA9IGNvbXBvbmVudC5kYXRhLmlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcGlwZSA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoZW50cnkubmFtZSwgdGhpcy5waXBlcywgZW50cnkuZmlsZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBpcGUuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50eXBlID0gJ3BpcGUnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gcGlwZS5kYXRhLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubW9kdWxlcy5mb3JFYWNoKG1vZHVsZSA9PiB7XG4gICAgICAgICAgICBtb2R1bGUuZGVjbGFyYXRpb25zLmZvckVhY2goZGVjbGFyYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIG1lcmdlVHlwZXMoZGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cy5mb3JFYWNoKGV4cHQgPT4ge1xuICAgICAgICAgICAgICAgIG1lcmdlVHlwZXMoZXhwdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZHVsZS5lbnRyeUNvbXBvbmVudHMuZm9yRWFjaChlbnQgPT4ge1xuICAgICAgICAgICAgICAgIG1lcmdlVHlwZXMoZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdChkYXRhOiBQYXJzZWREYXRhKSB7XG4gICAgICAgIHRyYXZlcnNlKGRhdGEpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yYXdEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5tb2R1bGVzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLm1vZHVsZXMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5yYXdNb2R1bGVzRm9yT3ZlcnZpZXcgPSBfLnNvcnRCeShkYXRhLm1vZHVsZXNGb3JHcmFwaCwgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLnJhd01vZHVsZXMgPSBfLnNvcnRCeShkYXRhLm1vZHVsZXNGb3JHcmFwaCwgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuY29tcG9uZW50cywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmNvbnRyb2xsZXJzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuZW50aXRpZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuZW50aXRpZXMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmRpcmVjdGl2ZXMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5pbmplY3RhYmxlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5pbmplY3RhYmxlcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmludGVyY2VwdG9ycyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5pbnRlcmNlcHRvcnMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5ndWFyZHMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuZ3VhcmRzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuaW50ZXJmYWNlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5pbnRlcmZhY2VzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMucGlwZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEucGlwZXMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmNsYXNzZXMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzID0gdGhpcy5yYXdEYXRhLm1pc2NlbGxhbmVvdXM7XG4gICAgICAgIHRoaXMucHJlcGFyZU1pc2NlbGxhbmVvdXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVNb2R1bGVzRGVjbGFyYXRpb25zRXhwb3J0c1R5cGVzKCk7XG4gICAgICAgIHRoaXMucm91dGVzID0gdGhpcy5yYXdEYXRhLnJvdXRlc1RyZWU7XG4gICAgICAgIHRoaXMubWFuYWdlRHVwbGljYXRlc05hbWUoKTtcbiAgICAgICAgdGhpcy5jbGVhblJhd01vZHVsZXNOYW1lcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW5SYXdNb2R1bGVzTmFtZXMoKSB7XG4gICAgICAgIHRoaXMucmF3TW9kdWxlc0Zvck92ZXJ2aWV3ID0gdGhpcy5yYXdNb2R1bGVzRm9yT3ZlcnZpZXcubWFwKG1vZHVsZSA9PiB7XG4gICAgICAgICAgICBtb2R1bGUubmFtZSA9IG1vZHVsZS5uYW1lLnJlcGxhY2UoJyQnLCAnJyk7XG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIGRhdGEsIGZpbGU/KTogSUFwaVNvdXJjZVJlc3VsdDxhbnk+IHtcbiAgICAgICAgbGV0IF9yZXN1bHQgPSB7XG4gICAgICAgICAgICBzb3VyY2U6ICdpbnRlcm5hbCcsXG4gICAgICAgICAgICBkYXRhOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IG5hbWVGb3VuZENvdW50ZXIgPSAwO1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuaW5kZXhPZihkYXRhW2ldLm5hbWUpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpLmluZGV4T2YoZGF0YVtpXS5maWxlKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGb3VuZENvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEgPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZihkYXRhW2ldLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGb3VuZENvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEgPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcmV2ZW50IHdyb25nIG1hdGNoaW5nIGxpa2UgTXVsdGlTZWxlY3RPcHRpb25EaXJlY3RpdmUgd2l0aCBTZWxlY3RPcHRpb25EaXJlY3RpdmUsIG9yIFF1ZXJ5UGFyYW1Hcm91cFNlcnZpY2Ugd2l0aCBRdWVyeVBhcmFtR3JvdXBcbiAgICAgICAgICAgIGlmIChuYW1lRm91bmRDb3VudGVyID4gMSkge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID09PSBkYXRhW2ldLm5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykuaW5kZXhPZihkYXRhW2ldLmZpbGUpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSA9IGRhdGFbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZGF0YVtpXS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaW50ZXJuYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFuYWdlRHVwbGljYXRlc05hbWUoKSB7XG4gICAgICAgIGxldCBwcm9jZXNzRHVwbGljYXRlcyA9IChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50c1dpdGhTYW1lTmFtZSA9IF8uZmlsdGVyKGFycmF5LCB7IG5hbWU6IGVsZW1lbnQubmFtZSB9KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgZWxlbWVudCBpcyB0aGUgcmVmZXJlbmNlIGZvciBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFRvRWRpdCA9IGVsZW1lbnRzV2l0aFNhbWVOYW1lW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRUb0VkaXQuaXNEdXBsaWNhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9FZGl0LmlzRHVwbGljYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuZHVwbGljYXRlSWQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9FZGl0Lm5hbWUgKyAnLScgKyBlbGVtZW50VG9FZGl0LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5pZCA9IGVsZW1lbnRUb0VkaXQuaWQgKyAnLScgKyBlbGVtZW50VG9FZGl0LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY2xhc3Nlcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLmludGVyZmFjZXMgPSB0aGlzLmludGVyZmFjZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5pbmplY3RhYmxlcyA9IHRoaXMuaW5qZWN0YWJsZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5waXBlcyA9IHRoaXMucGlwZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB0aGlzLmludGVyY2VwdG9ycy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLmd1YXJkcyA9IHRoaXMuZ3VhcmRzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IHRoaXMubW9kdWxlcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IHRoaXMuY29udHJvbGxlcnMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5lbnRpdGllcyA9IHRoaXMuZW50aXRpZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gdGhpcy5kaXJlY3RpdmVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmQobmFtZTogc3RyaW5nKTogSUFwaVNvdXJjZVJlc3VsdDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRnVuY3Rpb25zOiBBcnJheTwoKSA9PiBJQXBpU291cmNlUmVzdWx0PGFueT4+ID0gW1xuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmluamVjdGFibGVzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5pbnRlcmNlcHRvcnMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmd1YXJkcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuaW50ZXJmYWNlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuY2xhc3NlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuY29udHJvbGxlcnMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmVudGl0aWVzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5kaXJlY3RpdmVzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zKSxcbiAgICAgICAgICAgICgpID0+IEFuZ3VsYXJBcGlVdGlsLmZpbmRBcGkobmFtZSlcbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGxldCBzZWFyY2hGdW5jdGlvbiBvZiBzZWFyY2hGdW5jdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBzZWFyY2hGdW5jdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKHVwZGF0ZWREYXRhKTogdm9pZCB7XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5tb2R1bGVzLCAobW9kdWxlOiBJTW9kdWxlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5tb2R1bGVzLCB7IG5hbWU6IG1vZHVsZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1tfaW5kZXhdID0gbW9kdWxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmNvbXBvbmVudHMsIChjb21wb25lbnQ6IElDb21wb25lbnREZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmNvbXBvbmVudHMsIHsgbmFtZTogY29tcG9uZW50Lm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW19pbmRleF0gPSBjb21wb25lbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmNvbnRyb2xsZXJzLCAoY29udHJvbGxlcjogSUNvbnRyb2xsZXJEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmNvbnRyb2xsZXJzLCB7IG5hbWU6IGNvbnRyb2xsZXIubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW19pbmRleF0gPSBjb250cm9sbGVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5lbnRpdGllcywgKGVudGl0eTogSUNvbnRyb2xsZXJEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmVudGl0aWVzLCB7IG5hbWU6IGVudGl0eS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZW50aXRpZXNbX2luZGV4XSA9IGVudGl0eTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5kaXJlY3RpdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5kaXJlY3RpdmVzLCAoZGlyZWN0aXZlOiBJRGlyZWN0aXZlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5kaXJlY3RpdmVzLCB7IG5hbWU6IGRpcmVjdGl2ZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlc1tfaW5kZXhdID0gZGlyZWN0aXZlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbmplY3RhYmxlcywgKGluamVjdGFibGU6IElJbmplY3RhYmxlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5pbmplY3RhYmxlcywgeyBuYW1lOiBpbmplY3RhYmxlLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlc1tfaW5kZXhdID0gaW5qZWN0YWJsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmludGVyY2VwdG9ycywgKGludGVyY2VwdG9yOiBJSW50ZXJjZXB0b3JEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmludGVyY2VwdG9ycywgeyBuYW1lOiBpbnRlcmNlcHRvci5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzW19pbmRleF0gPSBpbnRlcmNlcHRvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5ndWFyZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmd1YXJkcywgKGd1YXJkOiBJR3VhcmREZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmd1YXJkcywgeyBuYW1lOiBndWFyZC5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VhcmRzW19pbmRleF0gPSBndWFyZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5pbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbnRlcmZhY2VzLCAoaW50OiBJSW50ZXJmYWNlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5pbnRlcmZhY2VzLCB7IG5hbWU6IGludC5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJmYWNlc1tfaW5kZXhdID0gaW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5waXBlcywgKHBpcGU6IElQaXBlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5waXBlcywgeyBuYW1lOiBwaXBlLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5waXBlc1tfaW5kZXhdID0gcGlwZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5jbGFzc2VzLCAoY2xhc3NlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmNsYXNzZXMsIHsgbmFtZTogY2xhc3NlLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc2VzW19pbmRleF0gPSBjbGFzc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogTWlzY2VsbGFuZW91cyB1cGRhdGVcbiAgICAgICAgICovXG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsICh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiB2YXJpYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlOiB2YXJpYWJsZS5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlc1tfaW5kZXhdID0gdmFyaWFibGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLCAoZnVuYzogSUZ1bmN0aW9uRGVjRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmdW5jLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGZ1bmMuZmlsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnNbX2luZGV4XSA9IGZ1bmM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcywgKHR5cGVhbGlhczogSVR5cGVBbGlhc0RlY0RlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0eXBlYWxpYXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogdHlwZWFsaWFzLmZpbGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXNbX2luZGV4XSA9IHR5cGVhbGlhcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMsIChlbnVtZXJhdGlvbjogSUVudW1EZWNEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGVudW1lcmF0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGVudW1lcmF0aW9uLmZpbGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zW19pbmRleF0gPSBlbnVtZXJhdGlvbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcGFyZU1pc2NlbGxhbmVvdXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZEluQ29tcG9kb2MobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtZXJnZWREYXRhID0gXy5jb25jYXQoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHRoaXMubW9kdWxlcyxcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnMsXG4gICAgICAgICAgICB0aGlzLmVudGl0aWVzLFxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLFxuICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlcyxcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgdGhpcy5ndWFyZHMsXG4gICAgICAgICAgICB0aGlzLmludGVyZmFjZXMsXG4gICAgICAgICAgICB0aGlzLnBpcGVzLFxuICAgICAgICAgICAgdGhpcy5jbGFzc2VzLFxuICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsXG4gICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZXN1bHQgPSBfLmZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBuYW1lIH0gYXMgYW55KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVNaXNjZWxsYW5lb3VzKCkge1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgLy8gZ3JvdXAgZWFjaCBzdWJnb3VwIGJ5IGZpbGVcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRWYXJpYWJsZXMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRGdW5jdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRFbnVtZXJhdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRUeXBlQWxpYXNlcyA9IF8uZ3JvdXBCeSh0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsICdmaWxlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIF8uZmluZCh0aGlzLm1vZHVsZXMsIFsnbmFtZScsIG5hbWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmF3TW9kdWxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiBfLmZpbmQodGhpcy5yYXdNb2R1bGVzLCBbJ25hbWUnLCBuYW1lXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW50aXRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREaXJlY3RpdmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbmplY3RhYmxlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0YWJsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEludGVyY2VwdG9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0b3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHdWFyZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1YXJkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW50ZXJmYWNlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJmYWNlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Um91dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBpcGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXBlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWlzY2VsbGFuZW91cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlzY2VsbGFuZW91cztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGNsYXNzIEZpbGVFbmdpbmUge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBGaWxlRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghRmlsZUVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgRmlsZUVuZ2luZS5pbnN0YW5jZSA9IG5ldyBGaWxlRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChmaWxlcGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShmaWxlcGF0aCksICd1dGY4JywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdFcnJvciBkdXJpbmcgJyArIGZpbGVwYXRoICsgJyByZWFkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGZpbGVwYXRoOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGZzLm91dHB1dEZpbGUocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgY29udGVudHMsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN5bmMoZmlsZXBhdGg6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBmcy5vdXRwdXRGaWxlU3luYyhmaWxlcGF0aCwgY29udGVudHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW5jKGZpbGVwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShmaWxlcGF0aCksICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpc3RzU3luYyhmaWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuaW1wb3J0IHsgRXhwb3J0RGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXhwb3J0LWRhdGEuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgQW5ndWxhck5nTW9kdWxlTm9kZSB9IGZyb20gJy4uL25vZGVzL2FuZ3VsYXItbmdtb2R1bGUtbm9kZSc7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCd0cmF2ZXJzZScpO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0SnNvbkVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEV4cG9ydEpzb25FbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFFeHBvcnRKc29uRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBFeHBvcnRKc29uRW5naW5lLmluc3RhbmNlID0gbmV3IEV4cG9ydEpzb25FbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXhwb3J0SnNvbkVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSkge1xuICAgICAgICBsZXQgZXhwb3J0RGF0YTogRXhwb3J0RGF0YSA9IHt9O1xuXG4gICAgICAgIHRyYXZlcnNlKGRhdGEpLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuc291cmNlQ29kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cG9ydERhdGEucGlwZXMgPSBkYXRhLnBpcGVzO1xuICAgICAgICBleHBvcnREYXRhLmludGVyZmFjZXMgPSBkYXRhLmludGVyZmFjZXM7XG4gICAgICAgIGV4cG9ydERhdGEuaW5qZWN0YWJsZXMgPSBkYXRhLmluamVjdGFibGVzO1xuICAgICAgICBleHBvcnREYXRhLmd1YXJkcyA9IGRhdGEuZ3VhcmRzO1xuICAgICAgICBleHBvcnREYXRhLmludGVyY2VwdG9ycyA9IGRhdGEuaW50ZXJjZXB0b3JzO1xuICAgICAgICBleHBvcnREYXRhLmNsYXNzZXMgPSBkYXRhLmNsYXNzZXM7XG4gICAgICAgIGV4cG9ydERhdGEuZGlyZWN0aXZlcyA9IGRhdGEuZGlyZWN0aXZlcztcbiAgICAgICAgZXhwb3J0RGF0YS5jb21wb25lbnRzID0gZGF0YS5jb21wb25lbnRzO1xuICAgICAgICBleHBvcnREYXRhLm1vZHVsZXMgPSB0aGlzLnByb2Nlc3NNb2R1bGVzKCk7XG4gICAgICAgIGV4cG9ydERhdGEubWlzY2VsbGFuZW91cyA9IGRhdGEubWlzY2VsbGFuZW91cztcbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgZXhwb3J0RGF0YS5yb3V0ZXMgPSBkYXRhLnJvdXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICBleHBvcnREYXRhLmNvdmVyYWdlID0gZGF0YS5jb3ZlcmFnZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS53cml0ZShcbiAgICAgICAgICAgIG91dHB1dEZvbGRlciArIHBhdGguc2VwICsgJy9kb2N1bWVudGF0aW9uLmpzb24nLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXhwb3J0RGF0YSwgdW5kZWZpbmVkLCA0KVxuICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBleHBvcnQgZmlsZSBnZW5lcmF0aW9uICcsIGVycik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NNb2R1bGVzKCkge1xuICAgICAgICBjb25zdCBtb2R1bGVzOiBBbmd1bGFyTmdNb2R1bGVOb2RlW10gPSBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0TW9kdWxlcygpO1xuXG4gICAgICAgIGxldCBfcmVzdWx0ZWRNb2R1bGVzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTnIgPSAwOyBtb2R1bGVOciA8IG1vZHVsZXMubGVuZ3RoOyBtb2R1bGVOcisrKSB7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVzW21vZHVsZU5yXTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZUVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogbW9kdWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgaWQ6IG1vZHVsZS5pZCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogbW9kdWxlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHJhd0Rlc2NyaXB0aW9uOiBtb2R1bGUucmF3RGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBtb2R1bGUuZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IG1vZHVsZS5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgIGZpbGU6IG1vZHVsZS5maWxlLFxuICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1vZHVsZS5tZXRob2RzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvZGU6IG1vZHVsZS5zb3VyY2VDb2RlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm92aWRlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWNsYXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbXBvcnRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXhwb3J0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogW11cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb3RzdHJhcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogW11cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NsYXNzZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZS5wcm92aWRlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm92aWRlckVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5wcm92aWRlcnNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblswXS5lbGVtZW50cy5wdXNoKHByb3ZpZGVyRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5kZWNsYXJhdGlvbnNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblsxXS5lbGVtZW50cy5wdXNoKGRlY2xhcmF0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZS5pbXBvcnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0RWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbW9kdWxlLmltcG9ydHNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblsyXS5lbGVtZW50cy5wdXNoKGltcG9ydEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGUuZXhwb3J0cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydEVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5leHBvcnRzW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bM10uZWxlbWVudHMucHVzaChleHBvcnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kdWxlLmJvb3RzdHJhcC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvb3RzdHJhcEVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5ib290c3RyYXBba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlbls0XS5lbGVtZW50cy5wdXNoKGJvb3RzdHJhcEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfcmVzdWx0ZWRNb2R1bGVzLnB1c2gobW9kdWxlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3Jlc3VsdGVkTW9kdWxlcztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV4cG9ydEpzb25FbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9ERV9ERSA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NvcnMnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50ZScsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdEdXJjaHN1Y2hlJyxcbiAgICBjbGFzc2U6ICdLbGFzc2UnLFxuICAgIGNsYXNzZXM6ICdLbGFzc2VuJyxcbiAgICBjb21wb25lbnQ6ICdLb21wb25lbnRlJyxcbiAgICBjb21wb25lbnRzOiAnS29tcG9uZW50ZW4nLFxuICAgIGNvbnN0cnVjdG9yOiAnS29uc3RydWt0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdEb2t1bWVudGF0aW9uIEFiZGVja3VuZycsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYXRpb25zJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVjb3JhdG9ycycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnU3RhbmRhcmR3ZXJ0JyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbmllcnQgaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0FiaMOkbmdpZ2tlaXRlbicsXG4gICAgZGVwcmVjYXRlZDogJ1ZlcmFsdGV0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0Jlc2NocmVpYnVuZycsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWt0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWt0aXZlbicsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBiYXVtJyxcbiAgICBlbnRpdGllczogJ0VudGl0aWVzJyxcbiAgICBlbnRpdHk6ICdFbnRpdHknLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYXRpb25zJyxcbiAgICBlbnVtczogJ0VudW1zJyxcbiAgICBleGFtcGxlOiAnQmVpc3BpZWwnLFxuICAgIGV4YW1wbGVzOiAnQmVpc3BpZWxlJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0aWVydCcsXG4gICAgZXh0ZW5kczogJ0Vyd2VpdGVydCcsXG4gICAgZmlsZTogJ0RhdGVpJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5rdGlvbmVuJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0Rva3VtZW50YXRpb24gZ2VuZXJpZXJ0IG1pdCcsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6IFwiTG9zIGdlaHQnc1wiLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogJ0d1YXJkcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIEVsZW1lbnQnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbC1FbGVtZW50IG1pdCBEaXJla3RpdmUnLFxuICAgIGlkZW50aWZpZXI6ICdLZW5udW5nJyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbGVtZW50aWVydCcsXG4gICAgaW1wb3J0czogJ0ltcG9ydGllcnQnLFxuICAgIGluZGV4OiAnSW5kZXgnLFxuICAgIGluZGV4YWJsZTogJ0luZGl6aWVyYmFyJyxcbiAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdHZWVyYnQgdm9uJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAnSW5wdXRzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnMnLFxuICAgIGludGVyZmFjZTogJ0ludGVyZmFjZScsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmFjZXMnLFxuICAgIGxlZ2VuZDogJ0xlZ2VuZGUnLFxuICAgIGxpY2Vuc2U6ICdMaXplbnonLFxuICAgIGxpbmVzOiAnTGluaWVuJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYXRhJyxcbiAgICBtZXRob2RzOiAnTWV0aG9kZW4nLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdWZXJzY2hpZWRlbmVzJyxcbiAgICBtb2R1bGU6ICdNb2R1bCcsXG4gICAgbW9kdWxlczogJ01vZHVsZScsXG4gICAgbmFtZTogJ05hbWUnLFxuICAgIG5vOiAnTmVpbicsXG4gICAgJ25vLWdyYXBoJzogJ0tlaW4gR3JhcGggdmVyZsO8Z2Jhci4nLFxuICAgICduby1pZnJhbWUnOiAnRGVpbiBCcm93c2VyIHVudGVyc3TDvHR6dCBrZWluZSBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdLZWluIHBhc3NlbmRlcyBFcmdlYm5pcycsXG4gICAgJ25vLXN2Zyc6ICdEZWluIEJyb3dzZXIgdW50ZXJzdMO8dHp0IGtlaW4gU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wdGlvbmFsJyxcbiAgICBvdXRwdXRzOiAnQXVzZ2FiZW4nLFxuICAgIG92ZXJ2aWV3OiAnw5xiZXJzaWNodCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRlcicsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXItQWJow6RuZ2lna2VpdGVuJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHLDpGZpeCcsXG4gICAgcHJvcGVydGllczogJ0VpZ2Vuc2NoYWZ0ZW4nLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVzZXQ6ICdadXLDvGNrc2V0emVuJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICfDvGJlcmVpbnN0aW1tZW5kZSBFcmdlYm5pc3NlJyxcbiAgICByZXR1cm5zOiAnUmV0dXJucycsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVuJyxcbiAgICBzY2hlbWFzOiAnU2NoZW1hdGEnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnRWluZ2ViZW4genVyIFN1Y2hlJyxcbiAgICBzZWxlY3RvcjogJ1NlbGVrdG9yJyxcbiAgICBzaWduYXR1cmU6ICdVbnRlcnNjaHJpZnQnLFxuICAgIHNvdXJjZTogJ1F1ZWxsZScsXG4gICAgc3RhdGVtZW50czogJ1N0YXRlbWVudHMnLFxuICAgIHN0eWxlczogJ1N0aWxlJyxcbiAgICB0ZW1wbGF0ZTogJ1ZvcmxhZ2UnLFxuICAgIHR5cGU6ICdUeXAnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwIEFsaWFzZScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdUeXAgUGFyYW1ldGVyJyxcbiAgICB0eXBlczogJ1R5cGVuJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1VuYmVuYW5udGUgRWlnZW5zY2hhZnQnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdC1UZXN0LUFiZGVja3VuZycsXG4gICAgdmFsdWU6ICdXZXJ0JyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpYWJsZW4nLFxuICAgIHllczogJ0phJyxcbiAgICB6b29taW46ICdWZXJncsO2w59lcm4nLFxuICAgIHpvb21vdXQ6ICdWZXJrbGVpbmVybidcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fRU5fVVMgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWNjZXNzb3JzJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHMnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlcycsXG4gICAgYnJvd3NlOiAnQnJvd3NlJyxcbiAgICBjbGFzc2U6ICdDbGFzcycsXG4gICAgY2xhc3NlczogJ0NsYXNzZXMnLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvbmVudCcsXG4gICAgY29tcG9uZW50czogJ0NvbXBvbmVudHMnLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydWN0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdEb2N1bWVudGF0aW9uIGNvdmVyYWdlJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWNsYXJhdGlvbnMnLFxuICAgIGRlY29yYXRvcnM6ICdEZWNvcmF0b3JzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdEZWZhdWx0IHZhbHVlJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbmVkIGluJyxcbiAgICBkZXBlbmRlbmNpZXM6ICdEZXBlbmRlbmNpZXMnLFxuICAgIGRlcHJlY2F0ZWQ6ICdEZXByZWNhdGVkJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJlY3RpdmUnLFxuICAgIGRpcmVjdGl2ZXM6ICdEaXJlY3RpdmVzJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIHRyZWUnLFxuICAgIGVudGl0aWVzOiAnRW50aXRpZXMnLFxuICAgIGVudGl0eTogJ0VudGl0eScsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtZXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFeGFtcGxlJyxcbiAgICBleGFtcGxlczogJ0V4YW1wbGVzJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V4dGVuZHMnLFxuICAgIGZpbGU6ICdGaWxlJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5jdGlvbnMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgdXNpbmcnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnR2V0dGluZyBzdGFydGVkJyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6ICdHdWFyZHMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0h0bWwgZWxlbWVudCB3aXRoIGRpcmVjdGl2ZScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRzJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdJbmhlcml0ZWQgZnJvbScsXG4gICAgaW5qZWN0YWJsZTogJ0luamVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ0lucHV0cycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmQnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbnNlJyxcbiAgICBsaW5lczogJ0xpbmVzJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYXRhJyxcbiAgICBtZXRob2RzOiAnTWV0aG9kcycsXG4gICAgbWlzY2VsbGFuZW91czogJ01pc2NlbGxhbmVvdXMnLFxuICAgIG1vZHVsZTogJ01vZHVsZScsXG4gICAgbW9kdWxlczogJ01vZHVsZXMnLFxuICAgIG5hbWU6ICdOYW1lJyxcbiAgICBubzogJ05vJyxcbiAgICAnbm8tZ3JhcGgnOiAnTm8gZ3JhcGggYXZhaWxhYmxlLicsXG4gICAgJ25vLWlmcmFtZSc6ICdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdObyByZXN1bHRzIG1hdGNoaW5nJyxcbiAgICAnbm8tc3ZnJzogJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcHRpb25hbCcsXG4gICAgb3V0cHV0czogJ091dHB1dHMnLFxuICAgIG92ZXJ2aWV3OiAnT3ZlcnZpZXcnLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbWV0ZXJzJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlciBkZXBlbmRlbmNpZXMnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdQcmVmaXgnLFxuICAgIHByb3BlcnRpZXM6ICdQcm9wZXJ0aWVzJyxcbiAgICBwcm92aWRlcnM6ICdQcm92aWRlcnMnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlc2V0OiAnUmVzZXQnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3Jlc3VsdHMgbWF0Y2hpbmcnLFxuICAgIHJldHVybnM6ICdSZXR1cm5zJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6ICdTY2hlbWFzJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ1R5cGUgdG8gc2VhcmNoJyxcbiAgICBzZWxlY3RvcjogJ1NlbGVjdG9yJyxcbiAgICBzaWduYXR1cmU6ICdTaWduYXR1cmUnLFxuICAgIHNvdXJjZTogJ1NvdXJjZScsXG4gICAgc3RhdGVtZW50czogJ1N0YXRlbWVudHMnLFxuICAgIHN0eWxlczogJ1N0eWxlcycsXG4gICAgdGVtcGxhdGU6ICdUZW1wbGF0ZScsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc2VzJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1R5cGUgcGFyYW1ldGVycycsXG4gICAgdHlwZXM6ICdUeXBlcycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdVbmFtZWQgcHJvcGVydHknLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdCB0ZXN0IGNvdmVyYWdlJyxcbiAgICB2YWx1ZTogJ1ZhbHVlJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpYWJsZXMnLFxuICAgIHllczogJ1llcycsXG4gICAgem9vbWluOiAnWm9vbSBpbicsXG4gICAgem9vbW91dDogJ1pvb20gb3V0J1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9FU19FUyA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc29yaW9zJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudG9zJyxcbiAgICBib290c3RyYXA6ICdBcnJhbnF1ZScsXG4gICAgYnJhbmNoZXM6ICdSYW1hcycsXG4gICAgYnJvd3NlOiAnTmF2ZWdhcicsXG4gICAgY2xhc3NlOiAnQ2xhc2UnLFxuICAgIGNsYXNzZXM6ICdDbGFzZXMnLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvbmVudGUnLFxuICAgIGNvbXBvbmVudHM6ICdDb21wb25lbnRlcycsXG4gICAgY29uc3RydWN0b3I6ICdDb25zdHJ1Y3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sYWRvcmVzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGFkb3InLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0NvYmVydHVyYSBkZSBsYSBkb2N1bWVudGFjacOzbicsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYWNpb25lcycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYWRvcmVzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdWYWxvciBwb3IgZGVmZWN0bycsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5pZG8gZW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZGVuY2lhcycsXG4gICAgZGVwcmVjYXRlZDogJ09ic29sZXRhJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXBjacOzbicsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZhcycsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBhcmJvbCcsXG4gICAgZW50aXRpZXM6ICdFbnRpZGFkZXMnLFxuICAgIGVudGl0eTogJ0VudGlkYWQnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0NvbXBvbmVudGVzIGRlIGVudHJhZGEnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmFjaW9uZXMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFamVtcGxvJyxcbiAgICBleGFtcGxlczogJ0VqZW1wbG9zJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0YScsXG4gICAgZXh0ZW5kczogJ0V4dGllbmRlJyxcbiAgICBmaWxlOiAnRmljaGVybycsXG4gICAgZnVuY3Rpb25zOiAnRnVuY2lvbmVzJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YWNpw7NuIGdlbmVyYWRhIHV0aWxpemFuZG8nLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnQ29tZW56YW5kbycsXG4gICAgZ3VhcmQ6ICdHdWFyZGlhJyxcbiAgICBndWFyZHM6ICdHdWFyZGlhcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnRmlqYWNpb25lcyBkZSBIb3N0JyxcbiAgICBob3N0bGlzdGVuZXJzOiAnRXNjdWNoYWRvcmVzIGRlIEhvc3QnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnRWxlbWVudG8gSHRtbCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdFbGVtZW50byBIdG1sIGNvbiBkaXJlY3RpdmEnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWNhZG9yJyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbGVtZW50YScsXG4gICAgaW1wb3J0czogJ0ltcG9ydGEnLFxuICAgIGluZGV4OiAnw41uZGljZScsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICBpbmZvOiAnSW5mb3JtYWNpw7NuJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSGVyZWRhZG8gZGVzZGUnLFxuICAgIGluamVjdGFibGU6ICdJbnllY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0lueWVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdFbnRyYWRhcycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JlcycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYXonLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMZXllbmRhJyxcbiAgICBsaWNlbnNlOiAnTGljZW5jaWEnLFxuICAgIGxpbmVzOiAnTMOtbmVhcycsXG4gICAgbWV0YWRhdGE6ICdNZXRhIGRhdG9zJyxcbiAgICBtZXRob2RzOiAnTcOpdG9kb3MnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdNaXNjZWzDoW5lYScsXG4gICAgbW9kdWxlOiAnTcOzZHVsbycsXG4gICAgbW9kdWxlczogJ03Ds2R1bG9zJyxcbiAgICBuYW1lOiAnTm9tYnJlJyxcbiAgICBubzogJ05vJyxcbiAgICAnbm8tZ3JhcGgnOiAnTm8gaGF5IGdyw6FmaWNhIGRpc3BvbmlibGUuJyxcbiAgICAnbm8taWZyYW1lJzogJ1R1IG5hdmVnYWRvciBubyBzb3BvcnRhIGlmcmFtZXMuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05vIGhheSByZXN1bHRhZG9zIHF1ZSBjb2luY2lkYW4nLFxuICAgICduby1zdmcnOiAnVHUgbmF2ZWdhZG9yIG5vIHNvcG9ydGEgU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wY2lvbmFsJyxcbiAgICBvdXRwdXRzOiAnU2FsaWRhcycsXG4gICAgb3ZlcnZpZXc6ICdEZXNjcmlwY2nDs24gZ2VuZXJhbCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcsOhbWV0cm9zJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnRGVwZW5kZW5jaWFzIGVudHJlIHBhcmVzJyxcbiAgICBwaXBlOiAnVHViZXLDrWEnLFxuICAgIHBpcGVzOiAnVHViZXLDrWFzJyxcbiAgICBwcmVmaXg6ICdQcmVmaWpvJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcGllZGFkZXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZlZWRvcmVzJyxcbiAgICBwdXJlOiAnUHVybycsXG4gICAgcmVhZG1lOiAnTMOpZW1lJyxcbiAgICByZXNldDogJ1Jlc3RhYmxlY2VyJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdjb21wYXJhY2nDs24gZGUgcmVzdWx0YWRvcycsXG4gICAgcmV0dXJuczogJ0RldnVlbHZlJyxcbiAgICByb3V0ZTogJ1J1dGEnLFxuICAgIHJvdXRlczogJ1J1dGFzJyxcbiAgICBzY2hlbWFzOiAnRXNxdWVtYXMnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnRXNjcmliZSBwYXJhIGJ1c2NhcicsXG4gICAgc2VsZWN0b3I6ICdTZWxlY3RvcicsXG4gICAgc2lnbmF0dXJlOiAnRmlybWEnLFxuICAgIHNvdXJjZTogJ0Z1ZW50ZScsXG4gICAgc3RhdGVtZW50czogJ0RlY2xhcmFjaW9uZXMnLFxuICAgIHN0eWxlczogJ0VzdGlsb3MnLFxuICAgIHRlbXBsYXRlOiAnUGxhbnRpbGxhJyxcbiAgICB0eXBlOiAnVGlwbycsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdBbGlhcyBkZSB0aXBvJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1BhcsOhbWV0cm9zIGRlIHRpcG8nLFxuICAgIHR5cGVzOiAnVGlwb3MnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnUHJvcGllZGFkIHNpbiBub21icmUnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnQ29iZXJ0dXJhIGRlIGxhcyBwcnVlYmFzIHVuaXRhcmlhcycsXG4gICAgdmFsdWU6ICdWYWxvcicsXG4gICAgdmFyaWFibGVzOiAnVmFyaWFibGVzJyxcbiAgICB5ZXM6ICdTaScsXG4gICAgem9vbWluOiAnQW1wbGlhcicsXG4gICAgem9vbW91dDogJ0FsZWphcidcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fRlJfRlIgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWNjZXNzZXVycycsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnRzJyxcbiAgICBib290c3RyYXA6ICdCb290c3RyYXAnLFxuICAgIGJyYW5jaGVzOiAnQnJhbmNoZXMnLFxuICAgIGJyb3dzZTogJ1BhcmNvdXJpcicsXG4gICAgY2xhc3NlOiAnQ2xhc3MnLFxuICAgIGNsYXNzZXM6ICdDbGFzc2VzJyxcbiAgICBjb21wb25lbnQ6ICdDb21wb3NhbnQnLFxuICAgIGNvbXBvbmVudHM6ICdDb21wb3NhbnRzJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0NvbnN0cnVjdGV1cicsXG4gICAgY29udHJvbGxlcnM6ICdDb250csO0bGV1cnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250csO0bGV1cicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAnQ291dmVydHVyZSBkZSBkb2N1bWVudGF0aW9uJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEw6ljbGFyYXRpb25zJyxcbiAgICBkZWNvcmF0b3JzOiAnRMOpY29yYXRldXJzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdWYWxldXIgcGFyIGTDqWZhdXQnLFxuICAgICdkZWZpbmVkLWluJzogJ0TDqWZpbmkgZGFucycsXG4gICAgZGVwZW5kZW5jaWVzOiAnRMOpcGVuZGFuY2VzJyxcbiAgICBkZXByZWNhdGVkOiAnT2Jzb2zDqHRlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJlY3RpdmUnLFxuICAgIGRpcmVjdGl2ZXM6ICdEaXJlY3RpdmVzJyxcbiAgICAnZG9tIHRyZWUnOiAnQXJicmUgRE9NJyxcbiAgICBlbnRpdGllczogJ0VudGl0w6lzJyxcbiAgICBlbnRpdHk6ICdFbnRpdMOpJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6IFwiQ29tcG9zYW50cyBkJ2VudHLDqWVcIixcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtw6lyYXRpb25zJyxcbiAgICBlbnVtczogJ0VudW3DqXJhdGlvbnMnLFxuICAgIGV4YW1wbGU6ICdFeGFtcGxlJyxcbiAgICBleGFtcGxlczogJ0V4YW1wbGVzJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V0ZW5kJyxcbiAgICBmaWxlOiAnRmljaGllcicsXG4gICAgZnVuY3Rpb25zOiAnRm9uY3Rpb25zJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YXRpb24gZ8OpbsOpcsOpZSBhdmVjJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ0TDqW1hcnJhZ2UnLFxuICAgIGd1YXJkOiAnR2FyZGUnLFxuICAgIGd1YXJkczogJ0dhcmRlcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdFbMOpbWVudCBIdG1sJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0Vsw6ltZW50IEh0bWwgYXZlYyB1bmUgZGlyZWN0aXZlJyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmlhbnQnLFxuICAgIGltcGxlbWVudHM6ICdJbXBsw6ltZW50ZScsXG4gICAgaW1wb3J0czogJ0ltcG9ydHMnLFxuICAgIGluZGV4OiAnSW5kZXgnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4YWJsZScsXG4gICAgaW5mbzogJ0luZm9ybWF0aW9uJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSMOpcml0w6kgZGUnLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdFbnRyw6llcycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0ZXVycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTMOpZ2VuZGUnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbnNlJyxcbiAgICBsaW5lczogJ0xpZ25lcycsXG4gICAgbWV0YWRhdGE6ICdNw6l0YWRvbm7DqWVzJyxcbiAgICBtZXRob2RzOiAnTcOpdGhvZGVzJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnRGl2ZXJzJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTm9tJyxcbiAgICBubzogJ05vbicsXG4gICAgJ25vLWdyYXBoJzogJ0F1Y3VuIGdyYXBoaXF1ZSBkaXNwb25pYmxlLicsXG4gICAgJ25vLWlmcmFtZSc6ICdWb3RyZSBuYXZpZ2F0ZXVyIG5lIHN1cHBvcnRlIHBhcyBsZXMgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnQXVjdW4gcsOpc3VsdGF0IG1hdGNoYW50JyxcbiAgICAnbm8tc3ZnJzogJ1ZvdHJlIG5hdmlnYXRldXIgbmUgc3VwcG9ydGUgcGFzIGxlIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcHRpb25uZWwnLFxuICAgIG91dHB1dHM6ICdTb3J0aWVzJyxcbiAgICBvdmVydmlldzogXCJWdWUgZCdlbnNlbWJsZVwiLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbcOodHJlcycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ0TDqXBlbmRhbmNlcyBkZSBwYWlyJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHLDqWZpeGUnLFxuICAgIHByb3BlcnRpZXM6ICdQcm9wcmnDqXTDqXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVzZXQ6ICdSZW1pc2Ugw6AgesOpcm8nLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3LDqXN1bHRhdHMgbWF0Y2hhbnQnLFxuICAgIHJldHVybnM6ICdSZW52b2llJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6ICdTY2jDqW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdTYWlzaXNzZXogdW4gdGV4dGUnLFxuICAgIHNlbGVjdG9yOiAnU8OpbGVjdGV1cicsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzb3VyY2U6ICdTb3VyY2UnLFxuICAgIHN0YXRlbWVudHM6ICdEw6ljbGFyYXRpb25zJyxcbiAgICBzdHlsZXM6ICdTdHlsZXMnLFxuICAgIHRlbXBsYXRlOiAnVGVtcGxhdGUnLFxuICAgICd0YWJsZS1vZi1jb250ZW50cyc6ICdUYWJsZSBkZXMgbWF0acOocmVzJyxcbiAgICB0eXBlOiAnVHlwZScsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdBbGlhcyBkZSB0eXBlJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1BhcmFtw6h0cmVzIGRlIHR5cGUnLFxuICAgIHR5cGVzOiAnVHlwZXMnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnUHJvcHJpw6l0w6kgbm9uIG5vbW3DqWUnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnQ291dmVydHVyZSBkZSB0ZXN0IHVuaXRhaXJlJyxcbiAgICB2YWx1ZTogJ1ZhbGV1cicsXG4gICAgdmFyaWFibGVzOiAnVmFyaWFibGVzJyxcbiAgICB5ZXM6ICdPdWknLFxuICAgIHpvb21pbjogJ1pvb20gYXZhbnQnLFxuICAgIHpvb21vdXQ6ICdab29tIGFycmnDqHJlJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9IVV9IVSA9IHtcbiAgICBhY2Nlc3NvcnM6ICdHZXR0ZXIvc2V0dGVyIG1ldMOzZHVzb2snLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50dW1vaycsXG4gICAgYm9vdHN0cmFwOiAnQmV0w7ZsdMOpcycsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlaycsXG4gICAgYnJvd3NlOiAnQsO2bmfDqXN6w6lzJyxcbiAgICBjbGFzc2U6ICdPc3p0w6FseScsXG4gICAgY2xhc3NlczogJ09zenTDoWx5b2snLFxuICAgIGNvbXBvbmVudDogJ0tvbXBvbmVucycsXG4gICAgY29tcG9uZW50czogJ0tvbXBvbmVuc2VrJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0tvbnN0cnVrdG9yJyxcbiAgICBjb250cm9sbGVyczogJ0tvbnRyb2xsZXJlaycsXG4gICAgY29udHJvbGxlcjogJ0tvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0Rva3VtZW50w6FjacOzIGxlZmVkZXR0c8OpZycsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVrbGFyw6FjacOzaycsXG4gICAgZGVjb3JhdG9yczogJ0Rla29yw6F0b3JvaycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnQWxhcMOpcnRlbG1lemV0dCDDqXJ0w6lrJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbsOtY2nDsyBoZWx5ZTonLFxuICAgIGRlcGVuZGVuY2llczogJ0bDvGdnxZFzw6lnZWsnLFxuICAgIGRlcHJlY2F0ZWQ6ICdFbGF2dWx0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0xlw61yw6FzJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJla3TDrXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWt0w612w6FrJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIGZhJyxcbiAgICBlbnRpdGllczogJ0VudGl0w6Fzb2snLFxuICAgIGVudGl0eTogJ0VudGl0w6FzJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeSBrb21wb25lbnNlaycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyw6FjacOzaycsXG4gICAgZW51bXM6ICdFbnVtb2snLFxuICAgIGV4YW1wbGU6ICdQw6lsZGEnLFxuICAgIGV4YW1wbGVzOiAnUMOpbGTDoWsnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRvaycsXG4gICAgZXh0ZW5kczogJ8WQc29zenTDoWx5JyxcbiAgICBmaWxlOiAnRmlsZScsXG4gICAgZnVuY3Rpb25zOiAnRsO8Z2d2w6lueWVrJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0EgZG9rdW1lbnTDoWNpw7N0IGdlbmVyw6FsdGE6JyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ0JldmV6ZXTFkScsXG4gICAgZ3VhcmQ6ICdHdWFyZCcsXG4gICAgZ3VhcmRzOiAnR3VhcmRvaycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdvaycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcmVrJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwgZWxlbScsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdIdG1sIGVsZW0gZGlyZWt0w612w6F2YWwnLFxuICAgIGlkZW50aWZpZXI6ICdBem9ub3PDrXTDsycsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudMOhbHQgaW50ZXJmw6lzemVrJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0b2snLFxuICAgIGluZGV4OiAnVGFydGFsb21qZWd5esOpaycsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhlbGhldMWRJyxcbiAgICBpbmZvOiAnSW5mb3Jtw6FjacOzJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnw5Zyw7Zrw7ZsdmUgaW5uZW46JyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWt0w6FsaGF0w7MnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWt0w6FsaGF0w7NrJyxcbiAgICBpbnB1dHM6ICdCZW1lbmV0ZWsnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9yb2snLFxuICAgIGludGVyZmFjZTogJ0ludGVyZsOpc3onLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmbDqXN6ZWsnLFxuICAgIGxlZ2VuZDogJ0plbG1hZ3lhcsOhemF0JyxcbiAgICBsaWNlbnNlOiAnTGljZW5jJyxcbiAgICBsaW5lczogJ1Nvcm9rJyxcbiAgICBtZXRhZGF0YTogJ01ldGFhZGF0b2snLFxuICAgIG1ldGhvZHM6ICdNZXTDs2R1c29rJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnRWd5w6liJyxcbiAgICBtb2R1bGU6ICdNb2R1bCcsXG4gICAgbW9kdWxlczogJ01vZHVsb2snLFxuICAgIG5hbWU6ICdOw6l2JyxcbiAgICBubzogJ05lbScsXG4gICAgJ25vLWdyYXBoJzogJ0dyYWZpa29uIG5lbSBlbMOpcmhldMWRLicsXG4gICAgJ25vLWlmcmFtZSc6ICdBIGLDtm5nw6lzesWRamUgbmVtIHTDoW1vZ2F0amEgYXogaWZyYW1lLWVrZXQuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05pbmNzIHRhbMOhbGF0JyxcbiAgICAnbm8tc3ZnJzogJ0EgYsO2bmfDqXN6xZFqZSBuZW0gdMOhbW9nYXRqYSBheiBTVkcgZm9ybcOhdHVtb3QuJyxcbiAgICBvcHRpb25hbDogJ09wY2lvbsOhbGlzJyxcbiAgICBvdXRwdXRzOiAnS2ltZW5ldGVrJyxcbiAgICBvdmVydmlldzogJ8OBdHRla2ludMOpcycsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtw6l0ZXJlaycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZsO8Z2fFkXPDqWdlaycsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiAnUGlwZS1vaycsXG4gICAgcHJlZml4OiAnRWzFkXRhZycsXG4gICAgcHJvcGVydGllczogJ1RhZ3bDoWx0b3rDs2snLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVyZWsnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlc2V0OiAnVmlzc3phw6FsbMOtdCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAndGFsw6FsYXQnLFxuICAgIHJldHVybnM6ICdWaXNzemF0w6lyw6lzaSDDqXJ0w6lrJyxcbiAgICByb3V0ZTogJ8OadHZvbmFsJyxcbiAgICByb3V0ZXM6ICfDmnR2b25hbGFrJyxcbiAgICBzY2hlbWFzOiAnU8OpbcOhaycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdLZXJlc2VuZMWRIGtpZmVqZXrDqXMnLFxuICAgIHNlbGVjdG9yOiAnU3plbGVrdG9yJyxcbiAgICBzaWduYXR1cmU6ICdBbMOhw61yw6FzJyxcbiAgICBzb3VyY2U6ICdGb3Jyw6FzJyxcbiAgICBzdGF0ZW1lbnRzOiAnVXRhc8OtdMOhc29rJyxcbiAgICBzdHlsZXM6ICdTdMOtbHVzb2snLFxuICAgIHRlbXBsYXRlOiAnU2FibG9uJyxcbiAgICB0eXBlOiAnVMOtcHVzJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ1TDrXB1cyDDoWxuw6l2JyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1TDrXB1cyBwYXJhbcOpdGVyZWsnLFxuICAgIHR5cGVzOiAnVMOtcHVzb2snLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnTsOpdnRlbGVuIHByb3BlcnR5JyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ1VuaXQgdGVzenQgbGVmZWRldHRzw6lnJyxcbiAgICB2YWx1ZTogJ8OJcnTDqWsnLFxuICAgIHZhcmlhYmxlczogJ1bDoWx0b3rDs2snLFxuICAgIHllczogJ0lnZW4nLFxuICAgIHpvb21pbjogJ05hZ3nDrXTDoXMnLFxuICAgIHpvb21vdXQ6ICdLaWNzaW55w610w6lzJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9JVF9JVCA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NvcmknLFxuICAgIGFyZ3VtZW50czogJ0FyZ29tZW50aScsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ1JhbWknLFxuICAgIGJyb3dzZTogJ0NlcmNhJyxcbiAgICBjbGFzc2U6ICdDbGFzc2UnLFxuICAgIGNsYXNzZXM6ICdDbGFzc2knLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvbmVudGUnLFxuICAgIGNvbXBvbmVudHM6ICdDb21wb25lbnRpJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0Nvc3RydXR0b3JlJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xsZXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGxlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAnQ29wZXJ0dXJhIGNvZGljZScsXG4gICAgZGVjbGFyYXRpb25zOiAnRGljaGlhcmF6aW9uaScsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYXRvcnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ1ZhbG9yZSBwcmVkZWZpbml0bycsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5pdG8gaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZGVuY2llcycsXG4gICAgZGVwcmVjYXRlZDogJ0RlcHJlY2F0YScsXG4gICAgZGVzY3JpcHRpb246ICdEZXNjcml6aW9uZScsXG4gICAgZGlyZWN0aXZlOiAnRGlyZXR0aXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZXR0aXZlJyxcbiAgICAnZG9tIHRyZWUnOiAnQWxiZXJvIERPTScsXG4gICAgZW50aXRpZXM6ICdFbnRpdMOgJyxcbiAgICBlbnRpdHk6ICdFbnRpdMOgJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmF0aW9ucycsXG4gICAgZW51bXM6ICdFbnVtcycsXG4gICAgZXhhbXBsZTogJ0VzZW1waW8nLFxuICAgIGV4YW1wbGVzOiAnRXNlbXBpJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V4dGVuZHMnLFxuICAgIGZpbGU6ICdGaWxlJyxcbiAgICBmdW5jdGlvbnM6ICdGdW56aW9uaScsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICdEb2N1bWVudGF6aW9uZSBnZW5lcmF0YSB1c2FuZG8nLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnSW5pemlhbW8nLFxuICAgIGd1YXJkOiAnR3VhcmRpYScsXG4gICAgZ3VhcmRzOiAnR3VhcmRpZScsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdFbGVtZW50byBIdG1sJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0VsZW1lbnRvIGh0bWwgY29uIGRpcmV0dGl2ZScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpY2F0b3JlJyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbGVtZW50YScsXG4gICAgaW1wb3J0czogJ0ltcG9ydGEnLFxuICAgIGluZGV4OiAnSW5kaWNlJyxcbiAgICBpbmRleGFibGU6ICdJbmRpY2l6emFiaWxlJyxcbiAgICBpbmZvOiAnSW5mb3JtYXppb25lJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnZXJlZGl0YXRvIGRhJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAnSW5wdXQnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNjaWEnLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2NlJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmRhJyxcbiAgICBsaWNlbnNlOiAnTGljZW56YScsXG4gICAgbGluZXM6ICdMaW5lZScsXG4gICAgbWV0YWRhdGE6ICdNZXRhZGF0aScsXG4gICAgbWV0aG9kczogJ01ldG9kaScsXG4gICAgbWlzY2VsbGFuZW91czogJ1ZhcmllJyxcbiAgICBtb2R1bGU6ICdNb2R1bG8nLFxuICAgIG1vZHVsZXM6ICdNb2R1bGknLFxuICAgIG5hbWU6ICdOb21lJyxcbiAgICBubzogJ05vJyxcbiAgICAnbm8tZ3JhcGgnOiAnR3JhZmljbyBub24gZGlzcG9uaWJpbGUuJyxcbiAgICAnbm8taWZyYW1lJzogJ0lsIHR1byBicm93c2VyIG5vbiBzdXBwb3J0YSBpZnJhbWUuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05lc3N1biByaXN1bHRhdG8gY29ycmlzcG9uZGVudGUnLFxuICAgICduby1zdmcnOiAnSWwgdHVvIGJyb3dzZXIgbm9uIHN1cHBvcnRhIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcHppb25hbGUnLFxuICAgIG91dHB1dHM6ICdPdXRwdXQnLFxuICAgIG92ZXJ2aWV3OiAnU29tbWFyaW8nLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbWV0cmknLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIGRlcGVuZGVuY2llcycsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiAnUGlwZXMnLFxuICAgIHByZWZpeDogJ1ByZWZpc3NvJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcHJpZXTDoCcsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXNldDogJ1Jlc2V0JyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdjb3JyaXNwb25kZW56YScsXG4gICAgcmV0dXJuczogJ1JldHVybnMnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlcycsXG4gICAgc2NoZW1hczogJ1NjaGVtYXMnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnRGlnaXRhIHBlciBhdnZpYXJlIGxhIHJpY2VyY2EnLFxuICAgIHNlbGVjdG9yOiAnU2VsZWN0b3InLFxuICAgIHNpZ25hdHVyZTogJ1NpZ25hdHVyZScsXG4gICAgc291cmNlOiAnRm9udGUnLFxuICAgIHN0YXRlbWVudHM6ICdTdGF0ZW1lbnRzJyxcbiAgICBzdHlsZXM6ICdTdGlsaScsXG4gICAgdGVtcGxhdGU6ICdNb2RlbGxvJyxcbiAgICB0eXBlOiAnVGlwbycsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdUeXBlIGFsaWFzZXMnLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnVHlwZSBwYXJhbWV0ZXJzJyxcbiAgICB0eXBlczogJ1RpcGknLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnUHJvcHJpZXTDoCBzZW56YSBub21lJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ0NvcGVydHVyYSB1bml0IHRlc3QnLFxuICAgIHZhbHVlOiAnVmFsb3JpJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpYWJpbGknLFxuICAgIHllczogJ1NpJyxcbiAgICB6b29taW46ICdJbmdyYW5kaXNjaScsXG4gICAgem9vbW91dDogJ1JpbXBvY2Npb2xpc2NpJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9KQV9KUCA9IHtcbiAgICBhY2Nlc3NvcnM6ICfjgqLjgq/jgrvjgrUnLFxuICAgIGFyZ3VtZW50czogJ+W8leaVsCcsXG4gICAgYm9vdHN0cmFwOiAn44OW44O844OI44K544OI44Op44OD44OXJyxcbiAgICBicmFuY2hlczogJ+ODluODqeODs+ODgScsXG4gICAgYnJvd3NlOiAn44OW44Op44Km44K6JyxcbiAgICBjbGFzc2U6ICfjgq/jg6njgrknLFxuICAgIGNsYXNzZXM6ICfjgq/jg6njgrknLFxuICAgIGNvbXBvbmVudDogJ+OCs+ODs+ODneODvOODjeODs+ODiCcsXG4gICAgY29tcG9uZW50czogJ+OCs+ODs+ODneODvOODjeODs+ODiCcsXG4gICAgY29uc3RydWN0b3I6ICfjgrPjg7Pjgrnjg4jjg6njgq/jgr8nLFxuICAgIGNvbnRyb2xsZXJzOiAn44Kz44Oz44OI44Ot44O844Op44O8JyxcbiAgICBjb250cm9sbGVyOiAn44Kz44Oz44OI44Ot44O844Op44O8JyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICfjgqvjg5Djg6zjg4PjgrgnLFxuICAgIGRlY2xhcmF0aW9uczogJ+Wuo+iogCcsXG4gICAgZGVjb3JhdG9yczogJ+ODh+OCs+ODrOODvOOCv+ODvCcsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAn5Yid5pyf5YCkJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbmVkIGluJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfkvp3lrZjplqLkv4InLFxuICAgIGRlcHJlY2F0ZWQ6ICfpnZ7mjqjlpagnLFxuICAgIGRlc2NyaXB0aW9uOiAn6Kqs5piOJyxcbiAgICBkaXJlY3RpdmU6ICfjg4fjgqPjg6zjgq/jg4bjgqPjg5YnLFxuICAgIGRpcmVjdGl2ZXM6ICfjg4fjgqPjg6zjgq/jg4bjgqPjg5YnLFxuICAgICdkb20gdHJlZSc6ICdET00g44OE44Oq44O8JyxcbiAgICBlbnRpdGllczogJ+OCqOODs+ODhuOCo+ODhuOCoycsXG4gICAgZW50aXR5OiAn5a6f5Zyo54mpJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICfjgqjjg7Pjg4jjg6rjg7zjgrPjg7Pjg53jg7zjg43jg7Pjg4gnLFxuICAgIGVudW1lcmF0aW9uczogJ+WIl+aMmeWeiycsXG4gICAgZW51bXM6ICdFbnVtcycsXG4gICAgZXhhbXBsZTogJ+S+iycsXG4gICAgZXhhbXBsZXM6ICfkvosnLFxuICAgIGV4cG9ydHM6ICfjgqjjgq/jgrnjg53jg7zjg4gnLFxuICAgIGV4dGVuZHM6ICfntpnmib8nLFxuICAgIGZpbGU6ICfjg5XjgqHjgqTjg6snLFxuICAgIGZ1bmN0aW9uczogJ+mWouaVsCcsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICfjgZPjga7jg4njgq3jg6Xjg6Hjg7Pjg4jjga/ku6XkuIvjgpLkvb/nlKjjgZfjgabnlJ/miJDjgZXjgozjgabjgYTjgb7jgZknLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAn44Gv44GY44KB44GrJyxcbiAgICBndWFyZDogJ+OCrOODvOODiScsXG4gICAgZ3VhcmRzOiAn44Ks44O844OJJyxcbiAgICBob3N0YmluZGluZ3M6ICfjg5vjgrnjg4jjg5DjgqTjg7Pjg4fjgqPjg7PjgrAnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICfjg5vjgrnjg4jjg6rjgrnjg4rjg7wnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbOimgee0oCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICfjg4fjgqPjg6zjgq/jg4bjgqPjg5ZIdG1s6KaB57SgJyxcbiAgICBpZGVudGlmaWVyOiAn6K2Y5Yil5a2QJyxcbiAgICBpbXBsZW1lbnRzOiAn5a6f6KOFJyxcbiAgICBpbXBvcnRzOiAn44Kk44Oz44Od44O844OIJyxcbiAgICBpbmRleDogJ+e0ouW8lScsXG4gICAgaW5kZXhhYmxlOiAn44Kk44Oz44OH44Kv44K144OW44OrJyxcbiAgICBpbmZvOiAn5oOF5aCxJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSW5oZXJpdGVkIGZyb20nLFxuICAgIGluamVjdGFibGU6ICfjgqTjg7Pjgrjjgqfjgq/jgr/jg5bjg6snLFxuICAgIGluamVjdGFibGVzOiAn44Kk44Oz44K444Kn44Kv44K/44OW44OrJyxcbiAgICBpbnB1dHM6ICflhaXlipsnLFxuICAgIGludGVyY2VwdG9yczogJ+OCpOODs+OCv+ODvOOCu+ODl+OCv+ODvCcsXG4gICAgaW50ZXJmYWNlOiAn44Kk44Oz44K/44O844OV44Kn44Kk44K5JyxcbiAgICBpbnRlcmZhY2VzOiAn44Kk44Oz44K/44O844OV44Kn44Kk44K5JyxcbiAgICBsZWdlbmQ6ICflh6HkvosnLFxuICAgIGxpY2Vuc2U6ICfjg6njgqTjgrvjg7PjgrknLFxuICAgIGxpbmVzOiAn6KGM5pWwJyxcbiAgICBtZXRhZGF0YTogJ+ODoeOCv+ODh+ODvOOCvycsXG4gICAgbWV0aG9kczogJ+ODoeOCveODg+ODiScsXG4gICAgbWlzY2VsbGFuZW91czogJ+OBneOBruS7licsXG4gICAgbW9kdWxlOiAn44Oi44K444Ol44O844OrJyxcbiAgICBtb2R1bGVzOiAn44Oi44K444Ol44O844OrJyxcbiAgICBuYW1lOiAn5ZCN5YmNJyxcbiAgICBubzogJ+OBhOOBhOOBiCcsXG4gICAgJ25vLWdyYXBoJzogJ+S9v+eUqOOBp+OBjeOCi+OCsOODqeODleOBjOOBguOCiuOBvuOBm+OCkycsXG4gICAgJ25vLWlmcmFtZSc6ICfjg5bjg6njgqbjgrbjgYxpZnJhbWXjgpLlr77lv5zjgZfjgabjgYTjgb7jgZvjgpMnLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAn6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44GfJyxcbiAgICAnbm8tc3ZnJzogJ+ODluODqeOCpuOCtuOBjFNWR+OBq+WvvuW/nOOBl+OBpuOBvuOBm+OCkycsXG4gICAgb3B0aW9uYWw6ICfjgqrjg5fjgrfjg6fjg7MnLFxuICAgIG91dHB1dHM6ICflh7rlipsnLFxuICAgIG92ZXJ2aWV3OiAn5qaC6KaBJyxcbiAgICBwYXJhbWV0ZXJzOiAn44OR44Op44Oh44O844K/JyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlciBkZXBlbmRlbmNpZXMnLFxuICAgIHBpcGU6ICfjg5HjgqTjg5cnLFxuICAgIHBpcGVzOiAn44OR44Kk44OXJyxcbiAgICBwcmVmaXg6ICfmjqXpoK3ovp4nLFxuICAgIHByb3BlcnRpZXM6ICfjg5fjg63jg5Hjg4bjgqMnLFxuICAgIHByb3ZpZGVyczogJ+ODl+ODreODkOOCpOODgOODvCcsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVzZXQ6ICfjg6rjgrvjg4Pjg4gnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ+S7tuOBrue1kOaenOOBjOS4gOiHtOOBl+OBvuOBl+OBnycsXG4gICAgcmV0dXJuczogJ+aIu+OCiuWApCcsXG4gICAgcm91dGU6ICfjg6vjg7zjg4gnLFxuICAgIHJvdXRlczogJ+ODq+ODvOODiCcsXG4gICAgc2NoZW1hczogJ+OCueOCreODvOODnicsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICflhaXlipvjgZfjgabmpJzntKInLFxuICAgIHNlbGVjdG9yOiAn44K744Os44Kv44K/JyxcbiAgICBzaWduYXR1cmU6ICfjgrfjgrDjg43jg4Hjg6MnLFxuICAgIHNvdXJjZTogJ+OCveODvOOCuScsXG4gICAgc3RhdGVtZW50czogJ+aWhycsXG4gICAgc3R5bGVzOiAn44K544K/44Kk44OrJyxcbiAgICB0ZW1wbGF0ZTogJ+ODhuODs+ODl+ODrOODvOODiCcsXG4gICAgdHlwZTogJ+WeiycsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICfjgr/jgqTjg5fjgqjjgqTjg6rjgqLjgrknLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAn5Z6L44OR44Op44Oh44O844K/44O8JyxcbiAgICB0eXBlczogJ+WeiycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICfljL/lkI3jg5fjg63jg5Hjg4bjgqMnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAn44Om44OL44OD44OI44OG44K544OI44Kr44OQ44Os44OD44K4JyxcbiAgICB2YWx1ZTogJ+WApCcsXG4gICAgdmFyaWFibGVzOiAn5aSJ5pWwJyxcbiAgICB5ZXM6ICfjga/jgYQnLFxuICAgIHpvb21pbjogJ+aLoeWkpycsXG4gICAgem9vbW91dDogJ+e4ruWwjydcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fTkxfTkwgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWNjZXNzb3JzJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudGVuJyxcbiAgICBib290c3RyYXA6ICdCb290c3RyYXAnLFxuICAgIGJyYW5jaGVzOiAnQnJhbmNoZXMnLFxuICAgIGJyb3dzZTogJ0Jyb3dzZScsXG4gICAgY2xhc3NlOiAnS2xhc3NlJyxcbiAgICBjbGFzc2VzOiAnS2xhc3NlbicsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50ZW4nLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydWN0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdEb2N1bWVudGF0aWUgY292ZXJhZ2UnLFxuICAgIGRlY2xhcmF0aW9uczogJ0RlY2xhcmF0aWVzJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVjb3JhdG9ycycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnRGVmYXVsdCB3YWFyZGUnLFxuICAgICdkZWZpbmVkLWluJzogJ0dlZGVmaW5pZWVyZCBpbicsXG4gICAgZGVwZW5kZW5jaWVzOiAnRGVwZW5kZW5jaWVzJyxcbiAgICBkZXByZWNhdGVkOiAnVmVyb3VkZXJkJyxcbiAgICBkZXNjcmlwdGlvbjogJ09tc2NocmlqdmluZycsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZlcycsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBib29tJyxcbiAgICBlbnRpdGllczogJ0VudGl0ZWl0ZW4nLFxuICAgIGVudGl0eTogJ0VudGl0ZWl0JyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmF0aW9ucycsXG4gICAgZW51bXM6ICdFbnVtcycsXG4gICAgZXhhbXBsZTogJ1Zvb3JiZWVsZCcsXG4gICAgZXhhbXBsZXM6ICdWb29yYmVlbGRlbicsXG4gICAgZXhwb3J0czogJ0V4cG9ydHMnLFxuICAgIGV4dGVuZHM6ICdFeHRlbmRzJyxcbiAgICBmaWxlOiAnQmVzdGFuZCcsXG4gICAgZnVuY3Rpb25zOiAnRnVuY3RpZXMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGllIGdlZ2VuZXJlZWQgbWV0JyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ0FhbiBkZSBzbGFnJyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6ICdHdWFyZHMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0h0bWwgZWxlbWVudCBtZXQgZGlyZWN0aXZlJyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudGVlcnQnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRzJyxcbiAgICBpbmRleDogJ0luZGV4JyxcbiAgICBpbmRleGFibGU6ICdJbmRleGVlcmJhYXInLFxuICAgIGluZm86ICdJbmZvcm1hdGllJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSW5oZXJpdGVkIHZhbicsXG4gICAgaW5qZWN0YWJsZTogJ0luamVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ0lucHV0cycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmRhJyxcbiAgICBsaWNlbnNlOiAnTGljZW50aWUnLFxuICAgIGxpbmVzOiAnUmVnZWxzJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYXRhJyxcbiAgICBtZXRob2RzOiAnTWV0aG9kcycsXG4gICAgbWlzY2VsbGFuZW91czogJ0RpdmVyc2VuJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTmFhbScsXG4gICAgbm86ICdOZWUnLFxuICAgICduby1ncmFwaCc6ICdHZWVuIGRpYWdyYW0gYmVzY2hpa2JhYXIuJyxcbiAgICAnbm8taWZyYW1lJzogJ1V3IGJyb3dzZXIgb25kZXJzdGV1bmQgZ2VlbiBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdHZWVuIG92ZXJlZW5rb21lbmRlIHJlc3VsdGF0ZW4nLFxuICAgICduby1zdmcnOiAnVXcgYnJvd3NlciBvbmRlcnN0ZXVuZCBnZWVuIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcHRpb25lZWwnLFxuICAgIG91dHB1dHM6ICdPdXRwdXRzJyxcbiAgICBvdmVydmlldzogJ092ZXJ6aWNodCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRlcnMnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIGRlcGVuZGVuY2llcycsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiAnUGlwZXMnLFxuICAgIHByZWZpeDogJ1Zvb3J2b2Vnc2VsJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcGVydGllcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHV1cicsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXNldDogJ1Jlc2V0JyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdvdmVyZWVua29tZW5kZSByZXN1bHRhdGVuJyxcbiAgICByZXR1cm5zOiAnUmV0dXJucycsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVzJyxcbiAgICBzY2hlbWFzOiBcIlNjaGVtYSdzXCIsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdUeXBlIG9tIHRlIHpvZWtlbicsXG4gICAgc2VsZWN0b3I6ICdTZWxlY3RvcicsXG4gICAgc2lnbmF0dXJlOiAnSGFuZHRla2VuaW5nJyxcbiAgICBzb3VyY2U6ICdCcm9uJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnU3RpamxlbicsXG4gICAgdGVtcGxhdGU6ICdTamFibG9vbicsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc3NlbicsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdUeXBlIHBhcmFtZXRlcnMnLFxuICAgIHR5cGVzOiAnVHlwZXMnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnTmFhbWxvemUgcHJvcGVydHknLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdCB0ZXN0IGNvdmVyYWdlJyxcbiAgICB2YWx1ZTogJ1dhYXJkZScsXG4gICAgdmFyaWFibGVzOiAnVmFyaWFiZWxlbicsXG4gICAgeWVzOiAnSmEnLFxuICAgIHpvb21pbjogJ1pvb20gaW4nLFxuICAgIHpvb21vdXQ6ICdab29tIHVpdCdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fUExfUEwgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWtjZXNvcicsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnR5JyxcbiAgICBib290c3RyYXA6ICdVcnVjaG9taWVuaWUnLFxuICAgIGJyYW5jaGVzOiAnR2HFgsSZemllJyxcbiAgICBicm93c2U6ICdQcnplZ2zEhWRhaicsXG4gICAgY2xhc3NlOiAnS2xhc2EnLFxuICAgIGNsYXNzZXM6ICdLbGFzeScsXG4gICAgY29tcG9uZW50OiAnS29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnS29tcG9uZW50eScsXG4gICAgY29uc3RydWN0b3I6ICdLb25zdHJ1a3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdLb250cm9sZXJ5JyxcbiAgICBjb250cm9sbGVyOiAnS29udHJvbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdQb2tyeWNpZSBkb2t1bWVudGFjasSFJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWtsYXJhY2plJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVrb3JhdG9yeScsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnRG9tecWbbG5hIHdhcnRvxZvEhycsXG4gICAgJ2RlZmluZWQtaW4nOiAnWmRlZmluaW93YW5lIHcnLFxuICAgIGRlcGVuZGVuY2llczogJ0JpYmxpb3Rla2knLFxuICAgIGRlcHJlY2F0ZWQ6ICdQcnplc3RhcnphxYJlJyxcbiAgICBkZXNjcmlwdGlvbjogJ09waXMnLFxuICAgIGRpcmVjdGl2ZTogJ0R5cmVrdHl3YScsXG4gICAgZGlyZWN0aXZlczogJ0R5cmVrdHl3eScsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBkcnpld28nLFxuICAgIGVudGl0aWVzOiAnUG9kbWlvdHknLFxuICAgIGVudGl0eTogJ1BvZG1pb3QnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYWNqZScsXG4gICAgZW51bXM6ICdFbnVteScsXG4gICAgZXhhbXBsZTogJ1ByenlrxYJhZCcsXG4gICAgZXhhbXBsZXM6ICdQcnp5a8WCYWR5JyxcbiAgICBleHBvcnRzOiAnRXhwb3J0eScsXG4gICAgZXh0ZW5kczogJ1JvenN6ZXJ6YScsXG4gICAgZmlsZTogJ1BsaWsnLFxuICAgIGZ1bmN0aW9uczogJ0Z1bmtjamUnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9rdW1lbnRhY2phIHd5Z2VuZXJvd2FuYSBwcnp5IHXFvHljaXUnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnU3RhcnQnLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogXCJHdWFyZCd5XCIsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdpJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVyeScsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIGVsZW1lbnQnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbCBlbGVtZW50IHogZHlyZWt0eXfEhScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50eWZpa2F0b3InLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnR1amUnLFxuICAgIGltcG9ydHM6ICdJbXBvcnR1amUnLFxuICAgIGluZGV4OiAnSW5kZWtzJyxcbiAgICBpbmRleGFibGU6ICdJbmRla3Nvd2FueScsXG4gICAgaW5mbzogJ0luZm9ybWF0aWUnLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdEemllZHppY3p5IHonLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHknLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9yeScsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmZWpzJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmZWpzeScsXG4gICAgbGVnZW5kOiAnTGVnZW5kYScsXG4gICAgbGljZW5zZTogJ0xpY2VuY2phJyxcbiAgICBsaW5lczogJ0xpbmllJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYW5lJyxcbiAgICBtZXRob2RzOiAnTWV0b2R5JyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnUsOzxbxuZScsXG4gICAgbW9kdWxlOiAnTW9kdcWCJyxcbiAgICBtb2R1bGVzOiAnTW9kdcWCeScsXG4gICAgbmFtZTogJ05hendhJyxcbiAgICBubzogJ05pZScsXG4gICAgJ25vLWdyYXBoJzogJ0dyYWYgbmllZG9zdMSZcG55LicsXG4gICAgJ25vLWlmcmFtZSc6IFwiVHdvamEgcHJ6ZWdsxIVkYXJrYSBuaWUgd3NwaWVyYSBpZnJhbWUnw7N3LlwiLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnQnJhayBwYXN1asSFY3ljaCB3eW5pa8OzdycsXG4gICAgJ25vLXN2Zyc6ICdUd29qYSBwcnplZ2zEhWRhcmthIG5pZSB3c3BpZXJhIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcGNqb25hbG5lJyxcbiAgICBvdXRwdXRzOiAnT3V0cHV0eScsXG4gICAgb3ZlcnZpZXc6ICdQcnplZ2zEhWQnLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbWV0cnknLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdCaWJsaW90ZWtpIHphbGXFvG5lJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6IFwiUGlwZSd5XCIsXG4gICAgcHJlZml4OiAnUHJlZmlrcycsXG4gICAgcHJvcGVydGllczogJ1fFgsSFxZtjaXdvxZtjaScsXG4gICAgcHJvdmlkZXJzOiAnRG9zdGFyY3p5Y2llbGUnLFxuICAgIHB1cmU6ICdDenlzdHknLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVzZXQ6ICdSZXNldCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAncGFzdWrEhWN5Y2ggd3luaWvDs3cnLFxuICAgIHJldHVybnM6ICdad3JhY2EnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogXCJSb3V0ZSd5XCIsXG4gICAgc2NoZW1hczogJ1NjaGVtYXR5JyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ1dwcm93YWTFuiB0ZWtzdCB3eXN6dWtpd2FuaWEnLFxuICAgIHNlbGVjdG9yOiAnU2VsZWt0b3InLFxuICAgIHNpZ25hdHVyZTogJ1BvZHBpcycsXG4gICAgc3RhdGVtZW50czogJ0luc3RydWtjamUnLFxuICAgIHN0eWxlczogJ0VzdGlsb3MnLFxuICAgIHRlbXBsYXRlOiAnTW9kZWxvJyxcbiAgICB0eXBlOiAnVHlwJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ0FsaWFzeSB0eXDDs3cnLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnUGFyYW1ldHJ5IHR5cMOzdycsXG4gICAgdHlwZXM6ICdUeXB5JyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ05pZW5hendhbmEgd8WCYcWbbm/Fm8SHJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ1Bva3J5Y2llIHRlc3RhbWkgamVkbm9zdGtvd3ltaScsXG4gICAgdmFsdWU6ICdXYXJ0b8WbxIcnLFxuICAgIHZhcmlhYmxlczogJ1ptaWVubmUnLFxuICAgIHllczogJ1RhaycsXG4gICAgem9vbWluOiAnUHJ6eWJsacW8JyxcbiAgICB6b29tb3V0OiAnT2RkYWwnXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX1BUX0JSID0ge1xuICAgIGFjY2Vzc29yczogJ0FjZXNzb3JlcycsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnRvcycsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdOYXZlZ2FyJyxcbiAgICBjbGFzc2U6ICdDbGFzc2UnLFxuICAgIGNsYXNzZXM6ICdDbGFzc2VzJyxcbiAgICBjb21wb25lbnQ6ICdDb21wb25lbnRlJyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50ZXMnLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydXRvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sYWRvcmVzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGFkb3InLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0NvYmVydHVyYSBkYSBkb2N1bWVudGHDp8OjbycsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYcOnw7VlcycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYWRvcmVzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdWYWxvciBwYWRyw6NvJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbmlkbyBlbScsXG4gICAgZGVwZW5kZW5jaWVzOiAnRGVwZW5kw6puY2lhcycsXG4gICAgZGVwcmVjYXRlZDogJ0Rlc2NvbnRpbnVhZGEnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3Jpw6fDo28nLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmV0aXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZXRpdmFzJyxcbiAgICAnZG9tIHRyZWUnOiAnQXJ2b3JlIERPTScsXG4gICAgZW50aXRpZXM6ICdFbnRpZGFkZXMnLFxuICAgIGVudGl0eTogJ0VudGlkYWRlJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmHDp8O1ZXMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFeGVtcGxvJyxcbiAgICBleGFtcGxlczogJ0V4ZW1wbG9zJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V4dGVuZGUnLFxuICAgIGZpbGU6ICdBcnF1aXZvJyxcbiAgICBmdW5jdGlvbnM6ICdGdW7Dp8O1ZXMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhw6fDo28gZ2VyYWRhIHVzYW5kbycsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdDb21lw6dhbmRvJyxcbiAgICBndWFyZDogJ0d1YXJkYScsXG4gICAgZ3VhcmRzOiAnR3VhcmRhcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdFbGVtZW50byBIVE1MJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0VsZW1lbnRvIEhUTUwgY29tIGRpcmV0aXZhJyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmljYWRvcicsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudGEnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRzJyxcbiAgICBpbmRleDogJ0luZGV4JyxcbiAgICBpbmRleGFibGU6ICdJbmRleMOhdmVsJyxcbiAgICBpbmZvOiAnSW5mb3JtYcOnw6NvJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSGVyZGFkbyBkZScsXG4gICAgaW5qZWN0YWJsZTogJ0luamV0w6F2ZWwnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZXTDoXZlaXMnLFxuICAgIGlucHV0czogJ0lucHV0cycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmQnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbsOnYScsXG4gICAgbGluZXM6ICdMaW5oYXMnLFxuICAgIG1ldGFkYXRhOiAnTWV0YWRhdGEnLFxuICAgIG1ldGhvZHM6ICdNw6l0b2RvcycsXG4gICAgbWlzY2VsbGFuZW91czogJ01pc2NlbMOibmVhJyxcbiAgICBtb2R1bGU6ICdNw7NkdWxvJyxcbiAgICBtb2R1bGVzOiAnTcOzZHVsb3MnLFxuICAgIG5hbWU6ICdOb21lJyxcbiAgICBubzogJ07Do28nLFxuICAgICduby1ncmFwaCc6ICdTZW0gZ3LDoWZpY28gZGlzcG9uw612ZWwuJyxcbiAgICAnbm8taWZyYW1lJzogJ1NldSBicm93c2VyIG7Do28gdGVtIHN1cG9ydGUgYSBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdOZW5odW0gcmVzdWx0YWRvIGNvcnJlc3BvbmRlbnRlJyxcbiAgICAnbm8tc3ZnJzogJ1NldSBicm93c2VyIG7Do28gdGVtIHN1cG9ydGUgYSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3BjaW9uYWwnLFxuICAgIG91dHB1dHM6ICdPdXRwdXRzJyxcbiAgICBvdmVydmlldzogJ1Zpc8OjbyBnZXJhbCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcsOibWV0cm9zJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlciBkZXBlbmRlbmNpZXMnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdQcmVmaXhvJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcHJpZWRhZGVzJyxcbiAgICBwcm92aWRlcnM6ICdQcm92aWRlcnMnLFxuICAgIHB1cmU6ICdQdXJvJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlc2V0OiAnUmVzZXRhcicsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAncmVzdWx0YWRvcyBjb3JyZXNwb25kZW50ZXMnLFxuICAgIHJldHVybnM6ICdSZXRvcm5hJyxcbiAgICByb3V0ZTogJ1JvdGEnLFxuICAgIHJvdXRlczogJ1JvdGFzJyxcbiAgICBzY2hlbWFzOiAnRXNxdWVtYXMnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnRGlnaXRlIHBhcmEgcGVzcXVpc2FyJyxcbiAgICBzZWxlY3RvcjogJ1NlbGV0b3InLFxuICAgIHNpZ25hdHVyZTogJ0Fzc2luYXR1cmEnLFxuICAgIHNvdXJjZTogJ0ZvbnRlJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnRXN0aWxvcycsXG4gICAgdGVtcGxhdGU6ICdNb2RlbG8nLFxuICAgIHR5cGU6ICdUaXBvJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ0FsaWFzZXMgZGUgdGlwbycsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdQYXLDom1ldHJvcyBkZSB0aXBvJyxcbiAgICB0eXBlczogJ1RpcG9zJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1Byb3ByaWVkYWRlIG7Do28tbm9tZWFkYScsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdDb2JlcnR1cmEgZGUgdGVzdGUgdW5pdMOhcmlvJyxcbiAgICB2YWx1ZTogJ1ZhbG9yJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpw6F2ZWlzJyxcbiAgICB5ZXM6ICdTaW0nLFxuICAgIHpvb21pbjogJ1pvb20gaW4nLFxuICAgIHpvb21vdXQ6ICdab29tIG91dCdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fU0tfU0sgPSB7XG4gICAgYWNjZXNzb3JzOiAnTW9kaWZpa8OhdG9yeSBwcsOtc3R1cHUnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50eScsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ1ZldHZ5JyxcbiAgICBicm93c2U6ICdQcmV6ZXJhxaUnLFxuICAgIGNsYXNzZTogJ1RyaWVkYScsXG4gICAgY2xhc3NlczogJ1RyaWVkeScsXG4gICAgY29tcG9uZW50OiAnS29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnS29tcG9uZW50eScsXG4gICAgY29uc3RydWN0b3I6ICdLb27FoXRydWt0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdQb2tyeXRpZSBkb2t1bWVudMOhY2lvdScsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVrbGFyw6FjaWUnLFxuICAgIGRlY29yYXRvcnM6ICdEZWtvcsOhdG9yeScsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnUHJlZHZvbGVuw6EgaG9kbm90YScsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5vdmFuw6kgdicsXG4gICAgZGVwZW5kZW5jaWVzOiAnWsOhdmlzbG9zdGknLFxuICAgIGRlcHJlY2F0ZWQ6ICdaYXN0YXJlbCcsXG4gICAgZGVzY3JpcHRpb246ICdQb3BpcycsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWt0w612YScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVrdMOtdnknLFxuICAgICdkb20gdHJlZSc6ICdET00gc3Ryb20nLFxuICAgIGVudGl0aWVzOiAnU3ViamVrdG92JyxcbiAgICBlbnRpdHk6ICdTdWJqZWt0JyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcsOhdG9yeScsXG4gICAgZW51bXM6ICdFbnVtZXLDoXRvcnknLFxuICAgIGV4YW1wbGU6ICdQcsOta2xhZCcsXG4gICAgZXhhbXBsZXM6ICdQcsOta2xhZHknLFxuICAgIGV4cG9ydHM6ICdFeHBvcnR5JyxcbiAgICBleHRlbmRzOiAnUm96xaFpcnVqZScsXG4gICAgZmlsZTogJ1PDumJvcicsXG4gICAgZnVuY3Rpb25zOiAnRnVua2NpZScsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICdEb2t1bWVudMOhY2lhIHZ5dHZvcmVuw6EgcG9tb2NvdScsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdaYcSNw61uYW1lJyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6ICdHdWFyZHMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSFRNTCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0hUTUwgZWxlbWVudCBzIGRpcmVrdMOtdm91JyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmlrw6F0b3InLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnR1amUnLFxuICAgIGltcG9ydHM6ICdJbXBvcnR1amUnLFxuICAgIGluZGV4OiAnSW5kZXgnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4b3ZhdGXEvm7DvScsXG4gICAgaW5mbzogJ0luZm9ybcOhY2llJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnWmRlZGVuw6kgb2QnLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdWc3R1cHknLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnUm96aHJhbmllJyxcbiAgICBpbnRlcmZhY2VzOiAnUm96aHJhbmlhJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmRhJyxcbiAgICBsaWNlbnNlOiAnTGljZW5jaWEnLFxuICAgIGxpbmVzOiAnUmlhZGt5JyxcbiAgICBtZXRhZGF0YTogJ01ldGFkw6F0YScsXG4gICAgbWV0aG9kczogJ01ldMOzZHknLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdSw7R6bmUnLFxuICAgIG1vZHVsZTogJ01vZHVsJyxcbiAgICBtb2R1bGVzOiAnTW9kdWx5JyxcbiAgICBuYW1lOiAnTsOhem92JyxcbiAgICBubzogJ05pZScsXG4gICAgJ25vLWdyYXBoJzogJ05pZSBqZSBrIGRpc3BvesOtY2lpIMW+aWFkbnkgZ3JhZi4nLFxuICAgICduby1pZnJhbWUnOiAnVsOhxaEgcHJlaGxpYWRhxI0gbmVwb2Rwb3J1amUgaWZyYW1lJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05lbsOhamRlbsOpIMW+aWFkbmUgdsO9c2xlZGt5IHByZScsXG4gICAgJ25vLXN2Zyc6ICdWw6HFoSBwcmVobGlhZGHEjSBuZXBvZHBvcnVqZSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnVm9saXRlxL5uw70nLFxuICAgIG91dHB1dHM6ICdWw71zdHVweScsXG4gICAgb3ZlcnZpZXc6ICdQcmVoxL5hZCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRyZScsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHJlZml4JyxcbiAgICBwcm9wZXJ0aWVzOiAnVmxhc3Rub3N0aScsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXNldDogJ1Jlc2V0b3ZhxaUnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3bDvXNsZWRrb3YgcHJlJyxcbiAgICByZXR1cm5zOiAnTsOhdnJhdG92w6EgaG9kbm90YScsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVzJyxcbiAgICBzY2hlbWFzOiAnU2Now6lteScsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdaYWRhanRlIGjEvmFkYW7DvSB0ZXh0JyxcbiAgICBzZWxlY3RvcjogJ1NlbGVrdG9yJyxcbiAgICBzaWduYXR1cmU6ICdQb2RwaXMnLFxuICAgIHNvdXJjZTogJ1pkcm9qJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnxaB0w71seScsXG4gICAgdGVtcGxhdGU6ICfFoGFibMOzbmEnLFxuICAgIHR5cGU6ICdUeXAnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc2VzJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1R5cGUgcGFyYW1ldGVycycsXG4gICAgdHlwZXM6ICdUeXB5JyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ05lcG9tZW5vdmFuw70gYXRyaWLDunQnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnUG9rcnl0aWUgdW5pdCB0ZXN0YW1pJyxcbiAgICB2YWx1ZTogJ0hvZG5vdGEnLFxuICAgIHZhcmlhYmxlczogJ1ByZW1lbm7DqScsXG4gICAgeWVzOiAnw4FubycsXG4gICAgem9vbWluOiAnUHJpYmzDrcW+acWlJyxcbiAgICB6b29tb3V0OiAnT2RkaWFsacWlJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9aSF9DTiA9IHtcbiAgICBhY2Nlc3NvcnM6ICflrZjlj5blmagnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50cycsXG4gICAgYm9vdHN0cmFwOiAn5qC557uE5Lu2JyxcbiAgICBicmFuY2hlczogJ+WIhuaUrycsXG4gICAgYnJvd3NlOiAn5p+l55yLJyxcbiAgICBjbGFzc2U6ICfnsbsnLFxuICAgIGNsYXNzZXM6ICfnsbvliJfooagnLFxuICAgIGNvbXBvbmVudDogJ+e7hOS7ticsXG4gICAgY29tcG9uZW50czogJ+e7hOS7tuWIl+ihqCcsXG4gICAgY29uc3RydWN0b3I6ICfmnoTpgKDmlrnms5UnLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICfmlofmoaPmpoLop4gnLFxuICAgIGRlY2xhcmF0aW9uczogJ+WPr+WjsOaYjuWvueixoeWIl+ihqCcsXG4gICAgZGVjb3JhdG9yczogJ+ijhemlsOWZqOWIl+ihqCcsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAn57y655yB5YC8JyxcbiAgICAnZGVmaW5lZC1pbic6ICfooqvlrprkuYnlnKgnLFxuICAgIGRlcGVuZGVuY2llczogJ+S+nei1lumhuScsXG4gICAgZGVwcmVjYXRlZDogJ+W3suW8g+eUqCcsXG4gICAgZGVzY3JpcHRpb246ICfmj4/ov7AnLFxuICAgIGRpcmVjdGl2ZTogJ+aMh+S7pCcsXG4gICAgZGlyZWN0aXZlczogJ+aMh+S7pOWIl+ihqCcsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSDmoJEnLFxuICAgIGVudGl0aWVzOiAn5a6e5L2TJyxcbiAgICBlbnRpdHk6ICflrp7kvZMnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ+WFpeWPo+e7hOS7tuWIl+ihqCcsXG4gICAgZW51bWVyYXRpb25zOiAn5YiX5Li+JyxcbiAgICBlbnVtczogJ+aemuS4vuWIl+ihqCcsXG4gICAgZXhhbXBsZTogJ+S+i+WtkCcsXG4gICAgZXhhbXBsZXM6ICfkvovlrZAnLFxuICAgIGV4cG9ydHM6ICflr7zlh7onLFxuICAgIGV4dGVuZHM6ICfnu6fmib8nLFxuICAgIGZpbGU6ICfmlofku7YnLFxuICAgIGZ1bmN0aW9uczogJ+WHveaVsCcsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICfmlofmoaPnlJ/miJDkvb/nlKgnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAn5YWl6Zeo5oyH5Y2XJyxcbiAgICBndWFyZDogJ+i3r+eUseWuiOWNqycsXG4gICAgZ3VhcmRzOiAn6Lev55Sx5a6I5Y2r5YiX6KGoJyxcbiAgICBob3N0YmluZGluZ3M6ICflrr/kuLvnu5HlrponLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICflrr/kuLvnm5HlkKwnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCDlhYPntKAnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAn5bim5oyH5Luk55qESHRtbOWFg+e0oCcsXG4gICAgaWRlbnRpZmllcjogJ+agh+ivhuespicsXG4gICAgaW1wbGVtZW50czogJ+WunueOsCcsXG4gICAgaW1wb3J0czogJ+W8leWFpScsXG4gICAgaW5kZXg6ICfntKLlvJUnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4YWJsZScsXG4gICAgaW5mbzogJ+S/oeaBrycsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ+e7p+aJv+iHqicsXG4gICAgaW5qZWN0YWJsZTogJ+WPr+azqOWFpeeahCcsXG4gICAgaW5qZWN0YWJsZXM6ICflj6/ms6jlhaXnmoQnLFxuICAgIGlucHV0czogJ+i+k+WFpeWxnuaApycsXG4gICAgaW50ZXJjZXB0b3JzOiAn5oum5oiq5ZmoJyxcbiAgICBpbnRlcmZhY2U6ICfmjqXlj6MnLFxuICAgIGludGVyZmFjZXM6ICfmjqXlj6MnLFxuICAgIGxlZ2VuZDogJ+WbvuS+iycsXG4gICAgbGljZW5zZTogJ+iuuOWPr+WNj+iuricsXG4gICAgbGluZXM6ICdMaW5lcycsXG4gICAgbWV0YWRhdGE6ICflhYPmlbDmja4nLFxuICAgIG1ldGhvZHM6ICfmlrnms5UnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICflhbbku5YnLFxuICAgIG1vZHVsZTogJ+aooeWdlycsXG4gICAgbW9kdWxlczogJ+aooeWdl+WIl+ihqCcsXG4gICAgbmFtZTogJ+WQjeensCcsXG4gICAgbm86ICflkKYnLFxuICAgICduby1ncmFwaCc6ICfml6DmlbDmja7mmL7npLonLFxuICAgICduby1pZnJhbWUnOiAn5L2g55qE5rWP6KeI5Zmo5LiN5pSv5oyBaWZyYW1lcycsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICfml6DljLnphY3nmoTnu5PmnpwnLFxuICAgICduby1zdmcnOiAn5L2g55qE5rWP6KeI5Zmo5LiN5pSv5oyBU1ZHJyxcbiAgICBvcHRpb25hbDogJ+WPr+mAieeahCcsXG4gICAgb3V0cHV0czogJ+i+k+WHuuWxnuaApycsXG4gICAgb3ZlcnZpZXc6ICfmpoLov7AnLFxuICAgIHBhcmFtZXRlcnM6ICflj4LmlbDliJfooagnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICflkIznuqfkvp3otZYnLFxuICAgIHBpcGU6ICfnrqHpgZMnLFxuICAgIHBpcGVzOiAn566h6YGT5YiX6KGoJyxcbiAgICBwcmVmaXg6ICflrZfpppYnLFxuICAgIHByb3BlcnRpZXM6ICflsZ7mgKfliJfooagnLFxuICAgIHByb3ZpZGVyczogJ+aPkOS+m+WVhuWIl+ihqCcsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ+aJi+WGjCcsXG4gICAgcmVzZXQ6ICfph43nva4nLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ+WMuemFjeeahOe7k+aenCcsXG4gICAgcmV0dXJuczogJ+i/lOWbnicsXG4gICAgcm91dGU6ICfot6/nlLEnLFxuICAgIHJvdXRlczogJ+i3r+eUseWIl+ihqCcsXG4gICAgc2NoZW1hczogJ+aooeW8jycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfor7fovpPlhaXmn6Xor6LlhbPplK7lrZcnLFxuICAgIHNlbGVjdG9yOiAn6YCJ5oup5ZmoJyxcbiAgICBzaWduYXR1cmU6ICfnrb7lkI0nLFxuICAgIHNvdXJjZTogJ+adpea6kCcsXG4gICAgc3RhdGVtZW50czogJ+azqOmHiicsXG4gICAgc3R5bGVzOiAn5qC35byPJyxcbiAgICB0ZW1wbGF0ZTogJ+aooeadvycsXG4gICAgdHlwZTogJ+exu+WeiycsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICfnsbvlnovliKvlkI0nLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAn57G75Z6L5Y+C5pWwJyxcbiAgICB0eXBlczogJ+exu+WeiycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICfmnKrlkb3lkI3lsZ7mgKcnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAn5Y2V5YWD5rWL6K+V5qaC6KeIJyxcbiAgICB2YWx1ZTogJ+WAvCcsXG4gICAgdmFyaWFibGVzOiAn5Y+Y6YePJyxcbiAgICB5ZXM6ICfmmK8nLFxuICAgIHpvb21pbjogJ+aUvuWkpycsXG4gICAgem9vbW91dDogJ+e8qeWwjydcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fWkhfVFcgPSB7XG4gICAgYWNjZXNzb3JzOiAn5a2Y5Y+W5ZmoJyxcbiAgICBhcmd1bWVudHM6ICflj4PmlbgnLFxuICAgIGJvb3RzdHJhcDogJ+agueWFg+S7ticsXG4gICAgYnJhbmNoZXM6ICfliIbmlK8nLFxuICAgIGJyb3dzZTogJ+eAj+imvScsXG4gICAgY2xhc3NlOiAn6aGe5YilJyxcbiAgICBjbGFzc2VzOiAn6aGe5YilJyxcbiAgICBjb21wb25lbnQ6ICflhYPku7YnLFxuICAgIGNvbXBvbmVudHM6ICflhYPku7bliJfooagnLFxuICAgIGNvbnN0cnVjdG9yOiAn5bu65qeL5byP5pa55rOVJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xsZXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGxlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn6KaG6JOL546H6aCB6Z2i5qiZ6aGMJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWNsYXJhdGlvbnMnLFxuICAgIGRlY29yYXRvcnM6ICfoo53po77lmajliJfooagnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ+mgkOioreWAvCcsXG4gICAgJ2RlZmluZWQtaW4nOiAn6KKr5a6a576p5ZyoJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfkvp3os7TpoIUnLFxuICAgIGRlcHJlY2F0ZWQ6ICflt7Lmo4TnlKgnLFxuICAgIGRlc2NyaXB0aW9uOiAn5o+P6L+wJyxcbiAgICBkaXJlY3RpdmU6ICfmjIfku6QgKERpcmVjdGl2ZSknLFxuICAgIGRpcmVjdGl2ZXM6ICfmjIfku6QgKERpcmVjdGl2ZXMpJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIOaouScsXG4gICAgZW50aXRpZXM6ICflr6bpq5QnLFxuICAgIGVudGl0eTogJ+WvpumrlCcsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnljb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICfliJfoiIknLFxuICAgIGVudW1zOiAn5p6a6IiJ5YiX6KGoJyxcbiAgICBleGFtcGxlOiAn56+E5L6LJyxcbiAgICBleGFtcGxlczogJ+evhOS+iycsXG4gICAgZXhwb3J0czogJ+WMr+WHuicsXG4gICAgZXh0ZW5kczogJ+e5vOaJvycsXG4gICAgZmlsZTogJ+aqlOahiCcsXG4gICAgZnVuY3Rpb25zOiAn5Ye95pW4JyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ+eUoueUn+aWh+S7tuS9v+eUqCcsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICflv6vpgJ/kuIrmiYsnLFxuICAgIGd1YXJkOiAn6Lev55Sx5a6I6KGbJyxcbiAgICBndWFyZHM6ICfot6/nlLHlrojooZvliJfooagnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3QgQmluZGluZ3MnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0IExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIVE1MIOWFg+e0oCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICfluLbmjIfku6TnmoQgSFRNTCDlhYPntKAnLFxuICAgIGlkZW50aWZpZXI6ICforZjliKXnrKbomZ8nLFxuICAgIGltcGxlbWVudHM6ICflr6bkvZwnLFxuICAgIGltcG9ydHM6ICfljK/lhaUnLFxuICAgIGluZGV4OiAn57Si5byVJyxcbiAgICBpbmRleGFibGU6ICdJbmRleGFibGUnLFxuICAgIGluZm86ICfos4foqIonLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICfnubzmib/oh6onLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICfovLjlhaXlsazmgKcnLFxuICAgIGludGVyY2VwdG9yczogJ+aUlOaIquWZqCcsXG4gICAgaW50ZXJmYWNlOiAn5LuL6Z2iJyxcbiAgICBpbnRlcmZhY2VzOiAn5LuL6Z2iJyxcbiAgICBsZWdlbmQ6ICflnJbkvosnLFxuICAgIGxpY2Vuc2U6ICfmjojmrIrljZTorbAnLFxuICAgIGxpbmVzOiAnTGluZXMnLFxuICAgIG1ldGFkYXRhOiAn5YWD5pW45pOaJyxcbiAgICBtZXRob2RzOiAn5pa55rOVJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAn5YW25LuWJyxcbiAgICBtb2R1bGU6ICfmqKHntYQnLFxuICAgIG1vZHVsZXM6ICfmqKHntYTliJfooagnLFxuICAgIG5hbWU6ICflkI3nqLEnLFxuICAgIG5vOiAn5ZCmJyxcbiAgICAnbm8tZ3JhcGgnOiAn54Sh5pW45pOa6aGv56S6JyxcbiAgICAnbm8taWZyYW1lJzogJ+S9oOeahOeAj+imveWZqOS4jeaUr+aPtCBpZnJhbWVzJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+eEoeWMuemFjeeahOe1kOaenCcsXG4gICAgJ25vLXN2Zyc6ICfkvaDnmoTngI/opr3lmajkuI3mlK/mj7QgU1ZHJyxcbiAgICBvcHRpb25hbDogJ+WPr+mBuOeahCcsXG4gICAgb3V0cHV0czogJ+i8uOWHuuWxrOaApycsXG4gICAgb3ZlcnZpZXc6ICfmpoLov7AnLFxuICAgIHBhcmFtZXRlcnM6ICflj4PmlbjliJfooagnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIERlcGVuZGVuY2llcycsXG4gICAgcGlwZTogJ+euoemBkycsXG4gICAgcGlwZXM6ICfnrqHpgZPliJfooagnLFxuICAgIHByZWZpeDogJ+WJjee9ruipnicsXG4gICAgcHJvcGVydGllczogJ+WxrOaAp+WIl+ihqCcsXG4gICAgcHJvdmlkZXJzOiAn5o+Q5L6b6ICF5YiX6KGoJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXNldDogJ+mHjeiorScsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAn5Yy56YWN55qE57WQ5p6cJyxcbiAgICByZXR1cm5zOiAn5Zue5YKz5YC8JyxcbiAgICByb3V0ZTogJ+i3r+eUsScsXG4gICAgcm91dGVzOiAn6Lev55Sx5YiX6KGoJyxcbiAgICBzY2hlbWFzOiAnU2NoZW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfoq4vovLjlhaXmn6XoqaLpl5zpjbXlrZcnLFxuICAgIHNlbGVjdG9yOiAn6YG45pOH5ZmoJyxcbiAgICBzaWduYXR1cmU6ICfnsL3lkI0nLFxuICAgIHNvdXJjZTogJ+S+hua6kCcsXG4gICAgc3RhdGVtZW50czogJ+mZs+i/sOW8jycsXG4gICAgc3R5bGVzOiAn5qij5byPJyxcbiAgICB0ZW1wbGF0ZTogJ+evhOacrCcsXG4gICAgdHlwZTogJ+Wei+WIpScsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICflnovliKXliKXlkI0nLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAn5Z6L5Yil5Y+D5pW4JyxcbiAgICB0eXBlczogJ+Wei+WIpScsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICfmnKrlkb3lkI3lsazmgKcnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAn5Zau5YWD5ris6Kmm6KaG6JOL546HJyxcbiAgICB2YWx1ZTogJ+WAvCcsXG4gICAgdmFyaWFibGVzOiAn6K6K5pW4JyxcbiAgICB5ZXM6ICfmmK8nLFxuICAgIHpvb21pbjogJ+aUvuWkpycsXG4gICAgem9vbW91dDogJ+e4ruWwjydcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fS09fS1IgPSB7XG4gICAgYWNjZXNzb3JzOiAn7KCR6re87J6QJyxcbiAgICBhcmd1bWVudHM6ICfsnbjsiJgnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICfruIzrnpzsuZgnLFxuICAgIGJyb3dzZTogJ+2DkOyDiScsXG4gICAgY2xhc3NlOiAn7YG0656Y7IqkJyxcbiAgICBjbGFzc2VzOiAn7YG0656Y7IqkJyxcbiAgICBjb21wb25lbnQ6ICfsu7Ttj6zrhIztirgnLFxuICAgIGNvbXBvbmVudHM6ICfsu7Ttj6zrhIztirgnLFxuICAgIGNvbnN0cnVjdG9yOiAn7IOd7ISx7J6QJyxcbiAgICBjb250cm9sbGVyczogJ+y7qO2KuOuhpOufrCcsXG4gICAgY29udHJvbGxlcjogJ+y7qO2KuOuhpOufrCcsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn66y47IScIOy7pOuyhOumrOyngCcsXG4gICAgZGVjbGFyYXRpb25zOiAn7ISg7Ja4JyxcbiAgICBkZWNvcmF0b3JzOiAn642w7L2U66CI7J207YSwJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICfquLDrs7gg6rCSJyxcbiAgICAnZGVmaW5lZC1pbic6ICfri6TsnYzsl5Ag7KCV7J2Y65CoJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfsnZjsobTshLEnLFxuICAgIGRlcHJlY2F0ZWQ6ICfruYTstpTsspwnLFxuICAgIGRlc2NyaXB0aW9uOiAn7ISk66qFJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJlY3RpdmUnLFxuICAgIGRpcmVjdGl2ZXM6ICdEaXJlY3RpdmVzJyxcbiAgICAnZG9tIHRyZWUnOiAn64+UIO2KuOumrCcsXG4gICAgZW50aXRpZXM6ICfsl5Tti7Dti7AnLFxuICAgIGVudGl0eTogJ+yLpOyerCcsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICfsl7TqsbAnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICfsmIjsi5wnLFxuICAgIGV4YW1wbGVzOiAn7JiIJyxcbiAgICBleHBvcnRzOiAn64K067O064K06riwJyxcbiAgICBleHRlbmRzOiAnRXh0ZW5kcycsXG4gICAgZmlsZTogJ+2MjOydvCcsXG4gICAgZnVuY3Rpb25zOiAn7ZWo7IiYJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ+ydtCDrrLjshJzripQg64uk7J2M7J2EIOydtOyaqe2VmOyXrCDsg53shLHrkJjsl4jsirXri4jri6QnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAn7Iuc7J6R7ZWY6riwJyxcbiAgICBndWFyZDogJ+qwgOuTnCcsXG4gICAgZ3VhcmRzOiAn6rCA65OcJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0hUTUwg7JqU7IaMJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ+yngOyLnOyWtOqwgCDsnojripQgSFRNTCDsmpTshownLFxuICAgIGlkZW50aWZpZXI6ICfsi53rs4TsnpAnLFxuICAgIGltcGxlbWVudHM6ICfqtaztmIQnLFxuICAgIGltcG9ydHM6ICfqsIDsoLjsmKTquLAnLFxuICAgIGluZGV4OiAn7IOJ7J24JyxcbiAgICBpbmRleGFibGU6ICdJbmRleGFibGUnLFxuICAgIGluZm86ICfsoJXrs7QnLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICfri6TsnYzsl5DshJwg7IOB7IaN65CoJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAn7J6F66ClJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnMnLFxuICAgIGludGVyZmFjZTogJ+yduO2EsO2OmOydtOyKpCcsXG4gICAgaW50ZXJmYWNlczogJ+yduO2EsO2OmOydtOyKpCcsXG4gICAgbGVnZW5kOiAn67KU66GAJyxcbiAgICBsaWNlbnNlOiAn65287J207ISg7IqkJyxcbiAgICBsaW5lczogJ+ykhCcsXG4gICAgbWV0YWRhdGE6ICfrqZTtg4DrjbDsnbTthLAnLFxuICAgIG1ldGhvZHM6ICfrqZTshozrk5wnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICfquLDtg4AnLFxuICAgIG1vZHVsZTogJ+uqqOuTiCcsXG4gICAgbW9kdWxlczogJ+uqqOuTiCcsXG4gICAgbmFtZTogJ+ydtOumhCcsXG4gICAgbm86ICfslYTri4jsmKQnLFxuICAgICduby1ncmFwaCc6ICfsgqzsmqntlaAg7IiYIOyeiOuKlCDqt7jrnpjtlITqsIAg7JeG7Iq164uI64ukLicsXG4gICAgJ25vLWlmcmFtZSc6ICfsgqzsmqnspJHsnbgg67iM65287Jqw7KCA6rCAIGlmcmFtZeydhCDsp4Dsm5DtlZjsp4Ag7JWK7Iq164uI64ukJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+qygOyDiSDqsrDqs7zqsIAg7JeG7Iq164uI64ukJyxcbiAgICAnbm8tc3ZnJzogJ+u4jOudvOyasOyggOqwgCBTVkfrpbwg7KeA7JuQ7ZWY7KeAIOyViuyKteuLiOuLpCcsXG4gICAgb3B0aW9uYWw6ICfshKDtg53soIEnLFxuICAgIG91dHB1dHM6ICfqsrDqs7zrrLwnLFxuICAgIG92ZXJ2aWV3OiAn6rCc7JqUJyxcbiAgICBwYXJhbWV0ZXJzOiAn66ek6rCc67OA7IiYJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAn7IOB7Zi4IOydmOyhtOyEsScsXG4gICAgcGlwZTogJ+2MjOydtO2UhCcsXG4gICAgcGlwZXM6ICftjIzsnbTtlIQnLFxuICAgIHByZWZpeDogJ+ygkeuRkOyWtCcsXG4gICAgcHJvcGVydGllczogJ+yGjeyEsScsXG4gICAgcHJvdmlkZXJzOiAn7KCc6rO17J6QJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXNldDogJ+y0iOq4sO2ZlCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAn6rCc7J2YIOqysOqzvOqwgCDsnbzsuZjtlojsirXri4jri6QnLFxuICAgIHJldHVybnM6ICfrsJjtmZgnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlcycsXG4gICAgc2NoZW1hczogJ+yKpO2CpOuniCcsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfqsoDsg4nslrQg7J6F66ClJyxcbiAgICBzZWxlY3RvcjogJ+yEoO2DneyekCcsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzb3VyY2U6ICfstpzsspgnLFxuICAgIHN0YXRlbWVudHM6ICdTdGF0ZW1lbnRzJyxcbiAgICBzdHlsZXM6ICfsiqTtg4DsnbwnLFxuICAgIHRlbXBsYXRlOiAn7KO87ZiVJyxcbiAgICB0eXBlOiAn7YOA7J6FJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ+2DgOyehSDrs4Tsua0nLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAn7YOA7J6FIOunpOqwnCDrs4DsiJgnLFxuICAgIHR5cGVzOiAn7YOA7J6FJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ+ydteuqhSDsho3shLEnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAn64uo7JyEIO2FjOyKpO2KuCDsu6TrsoTrpqzsp4AnLFxuICAgIHZhbHVlOiAn6rCSJyxcbiAgICB2YXJpYWJsZXM6ICfrs4DsiJgnLFxuICAgIHllczogJ+uEpCcsXG4gICAgem9vbWluOiAn7ZmV64yAJyxcbiAgICB6b29tb3V0OiAn7LaV7IaMJ1xufTtcbiIsImltcG9ydCBpMThuZXh0IGZyb20gJ2kxOG5leHQnO1xuXG5pbXBvcnQge1xuICAgIFRSQU5TTEFUSU9OX0RFX0RFLFxuICAgIFRSQU5TTEFUSU9OX0VOX1VTLFxuICAgIFRSQU5TTEFUSU9OX0VTX0VTLFxuICAgIFRSQU5TTEFUSU9OX0ZSX0ZSLFxuICAgIFRSQU5TTEFUSU9OX0hVX0hVLFxuICAgIFRSQU5TTEFUSU9OX0lUX0lULFxuICAgIFRSQU5TTEFUSU9OX0pBX0pQLFxuICAgIFRSQU5TTEFUSU9OX0tPX0tSLFxuICAgIFRSQU5TTEFUSU9OX05MX05MLFxuICAgIFRSQU5TTEFUSU9OX1BMX1BMLFxuICAgIFRSQU5TTEFUSU9OX1BUX0JSLFxuICAgIFRSQU5TTEFUSU9OX1NLX1NLLFxuICAgIFRSQU5TTEFUSU9OX1pIX0NOLFxuICAgIFRSQU5TTEFUSU9OX1pIX1RXXG59IGZyb20gJy4uLy4uL2xvY2FsZXMnO1xuXG5jbGFzcyBJMThuRW5naW5lIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogSTE4bkVuZ2luZTtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUkxOG5FbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEkxOG5FbmdpbmUuaW5zdGFuY2UgPSBuZXcgSTE4bkVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJMThuRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXZhaWxhYmxlc0xhbmd1YWdlcyA9IHtcbiAgICAgICAgJ2RlLURFJzogJ2RlLURFJyxcbiAgICAgICAgJ2VuLVVTJzogJ2VuLVVTJyxcbiAgICAgICAgJ2VzLUVTJzogJ2VzLUVTJyxcbiAgICAgICAgJ2ZyLUZSJzogJ2ZyLUZSJyxcbiAgICAgICAgJ2h1LUhVJzogJ2h1LUhVJyxcbiAgICAgICAgJ2l0LUlUJzogJ2l0LUlUJyxcbiAgICAgICAgJ2phLUpQJzogJ2phLUpQJyxcbiAgICAgICAgJ2tvLUtSJzogJ2tvLUtSJyxcbiAgICAgICAgJ25sLU5MJzogJ25sLU5MJyxcbiAgICAgICAgJ3BsLVBMJzogJ3BsLVBMJyxcbiAgICAgICAgJ3B0LUJSJzogJ3B0LUJSJyxcbiAgICAgICAgJ3NrLVNLJzogJ3NrLVNLJyxcbiAgICAgICAgJ3poLUNOJzogJ3poLUNOJyxcbiAgICAgICAgJ3poLVRXJzogJ3poLVRXJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tMYW5ndWFnZSA9ICdlbi1VUyc7XG5cbiAgICBwdWJsaWMgaW5pdChsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIGkxOG5leHQuaW5pdCh7XG4gICAgICAgICAgICBsbmc6IGxhbmd1YWdlLFxuICAgICAgICAgICAgZmFsbGJhY2tMbmc6IHRoaXMuZmFsbGJhY2tMYW5ndWFnZSxcbiAgICAgICAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgICAgICAgICBza2lwT25WYXJpYWJsZXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZGUtREUnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9ERV9ERSk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdlbi1VUycsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0VOX1VTKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2VzLUVTJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fRVNfRVMpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZnItRlInLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9GUl9GUik7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdodS1IVScsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0hVX0hVKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2l0LUlUJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fSVRfSVQpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnamEtSlAnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9KQV9KUCk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdrby1LUicsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0tPX0tSKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ25sLU5MJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fTkxfTkwpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygncGwtUEwnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9QTF9QTCk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdwdC1CUicsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1BUX0JSKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ3NrLVNLJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fU0tfU0spO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnemgtQ04nLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9aSF9DTik7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCd6aC1UVycsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1pIX1RXKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNsYXRlKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGkxOG5leHQudChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleGlzdHMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGkxOG5leHQuZXhpc3RzKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN1cHBvcnRMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5hdmFpbGFibGVzTGFuZ3VhZ2VzW2xhbmd1YWdlXSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJMThuRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IGRlY2FjaGUgPSByZXF1aXJlKCdkZWNhY2hlJyk7XG5cbmV4cG9ydCBjbGFzcyBNYXJrZG93blRvUERGRW5naW5lIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogTWFya2Rvd25Ub1BERkVuZ2luZTtcblxuICAgIHByaXZhdGUgbWFya2VkSW5zdGFuY2U7XG5cbiAgICBwcml2YXRlIGNvbnZlcnRlZFRva2VucyA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZGVjYWNoZSgnbWFya2VkJyk7XG4gICAgICAgIGNvbnN0IHsgbWFya2VkIH0gPSByZXF1aXJlKCdtYXJrZWQnKTtcbiAgICAgICAgdGhpcy5tYXJrZWRJbnN0YW5jZSA9IG1hcmtlZDtcblxuICAgICAgICBjb25zdCByZW5kZXJlciA9IG5ldyB0aGlzLm1hcmtlZEluc3RhbmNlLlJlbmRlcmVyKCk7XG5cbiAgICAgICAgcmVuZGVyZXIuc3Ryb25nID0gdGV4dCA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnTWFya2Rvd25Ub1BERkVuZ2luZSBzdHJvbmc6ICcsIHRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgYm9sZDogdHJ1ZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlbmRlcmVyLmVtID0gdGV4dCA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnTWFya2Rvd25Ub1BERkVuZ2luZSBlbTogJywgdGV4dCk7XG4gICAgICAgICAgICB0aGlzLmNvbnZlcnRlZFRva2Vucy5wdXNoKHsgdGV4dDogdGV4dCwgaXRhbGljczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlbmRlcmVyLnBhcmFncmFwaCA9IHRleHQgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ01hcmtkb3duVG9QREZFbmdpbmUgcGFyYWdyYXBoOiAnLCB0ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRPRE8gQWRkIGN1c3RvbSBwYXJzZXIuLi4gLT4gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC9pc3N1ZXMvNTA0XG5cbiAgICAgICAgdGhpcy5tYXJrZWRJbnN0YW5jZS5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgIHJlbmRlcmVyOiByZW5kZXJlcixcbiAgICAgICAgICAgIGdmbTogdHJ1ZSxcbiAgICAgICAgICAgIGJyZWFrczogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghTWFya2Rvd25Ub1BERkVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgTWFya2Rvd25Ub1BERkVuZ2luZS5pbnN0YW5jZSA9IG5ldyBNYXJrZG93blRvUERGRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hcmtkb3duVG9QREZFbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnZlcnQoc3RyaW5nVG9Db252ZXJ0OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jb252ZXJ0ZWRUb2tlbnMgPSBbXTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ01hcmtkb3duVG9QREZFbmdpbmUgY29udmVydDogJywgc3RyaW5nVG9Db252ZXJ0KTtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy5tYXJrZWRJbnN0YW5jZS5sZXhlcihzdHJpbmdUb0NvbnZlcnQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0b2tlbnMpO1xuICAgICAgICBjb25zdCBwZGZtYWtlRGF0YSA9IHRoaXMubWFya2VkSW5zdGFuY2UuUGFyc2VyLnBhcnNlKHRva2Vucyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuY29udmVydGVkVG9rZW5zKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgdGV4dDogdGhpcy5jb252ZXJ0ZWRUb2tlbnNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcmtkb3duVG9QREZFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IEkxOG5FbmdpbmUgZnJvbSAnLi4vaTE4bi5lbmdpbmUnO1xuaW1wb3J0IE1hcmtkb3duVG9QZGZFbmdpbmUgZnJvbSAnLi9tYXJrZG93bi10by1wZGYuZW5naW5lJztcblxuY29uc3QgUGRmUHJpbnRlciA9IHJlcXVpcmUoJ3BkZm1ha2UnKTtcblxuZXhwb3J0IGNsYXNzIEV4cG9ydFBkZkVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEV4cG9ydFBkZkVuZ2luZTtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUV4cG9ydFBkZkVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgRXhwb3J0UGRmRW5naW5lLmluc3RhbmNlID0gbmV3IEV4cG9ydFBkZkVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFeHBvcnRQZGZFbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGV4cG9ydChvdXRwdXRGb2xkZXIpIHtcbiAgICAgICAgbGV0IGZvbnRzID0ge1xuICAgICAgICAgICAgUm9ib3RvOiB7XG4gICAgICAgICAgICAgICAgbm9ybWFsOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vc3JjL3Jlc291cmNlcy9mb250cy9yb2JvdG8tdjE1LWxhdGluLXJlZ3VsYXIudHRmJyksXG4gICAgICAgICAgICAgICAgYm9sZDogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3NyYy9yZXNvdXJjZXMvZm9udHMvcm9ib3RvLXYxNS1sYXRpbi03MDAudHRmJyksXG4gICAgICAgICAgICAgICAgaXRhbGljczogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3NyYy9yZXNvdXJjZXMvZm9udHMvcm9ib3RvLXYxNS1sYXRpbi1pdGFsaWMudHRmJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcHJpbnRlciA9IG5ldyBQZGZQcmludGVyKGZvbnRzKTtcblxuICAgICAgICBsZXQgZG9jRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgIGluZm86IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcbiAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICAgIGhlYWRlcjoge1xuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogMTgsXG4gICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzAwOGNmZicsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogWzAsIDAsIDAsIDE1XVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3ViaGVhZGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxNSxcbiAgICAgICAgICAgICAgICAgICAgYm9sZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkb2NEZWZpbml0aW9uLmNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSxcbiAgICAgICAgICAgIGFsaWdubWVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICBib2xkOiB0cnVlLFxuICAgICAgICAgICAgZm9udFNpemU6IDIyLFxuICAgICAgICAgICAgbWFyZ2luOiBbMTAsIDM1MCwgMTAsIDI3MF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oaWRlRGFya01vZGVUb2dnbGUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICBkb2NEZWZpbml0aW9uLmNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogSTE4bkVuZ2luZS50cmFuc2xhdGUoJ2dlbmVyYXRlZC11c2luZycpLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogJ2NlbnRlcidcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9jRGVmaW5pdGlvbi5jb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICAgIGltYWdlOiBgZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQWdBQVpBQmtBQUQvN0FBUlJIVmphM2tBQVFBRUFBQUFVZ0FBLys0QUprRmtiMkpsQUdUQUFBQUFBUU1BRlFRREJnb05BQUFFcUFBQUIrMEFBQXI3QUFBUExmL2JBSVFBQWdFQkFRSUJBZ0lDQWdNQ0FnSURCQU1DQWdNRUJBTURCQU1EQkFVRUJRVUZCUVFGQlFZSEJ3Y0dCUWtKQ1FrSkNRd01EQXdNREF3TURBd01EQXdNREFFQ0FnSUVCQVFJQlFVSURBa0lDUXdPRGc0T0RnNE9EQXdNREF3T0Rnd01EQXdNREE0TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TS84SUFFUWdBUmdCR0F3RVJBQUlSQVFNUkFmL0VBT29BQUFJREFRRUJBUUFBQUFBQUFBQUFBQUFJQkFZSEJRSUJDUUVCQUFJREFRRUJBQUFBQUFBQUFBQUFBQVFIQWdVR0F3Z0JFQUFCQkFJQkFnVURCUUFBQUFBQUFBQUVBUUlEQlFBR0J5QVRFQkVTRkJWQU1TSWhNelVXQ0JFQUFRSURBd2NHQ3djRkFBQUFBQUFBQVFJREVSTUVBQklGSVRGQlVTSXlGQkFnWVVJekZYR0JrYUhCVW1JamN5UUc4TEZ5a2tNME5kR0M0bE1XRWdBQkF3TUNBd2dEQUFBQUFBQUFBQUFCQUJFQ0VERVNJRUh3SVFNd1FGQlJZWUdoSXJFeUV4TUJBQUVEQXdNRUF3RUJBUUFBQUFBQUFSRUFJVEZCVVdFUWNZRWc4Skdoc2NIaDBVRHgvOW9BREFNQkFBSVJBeEVBQUFGL2dBRG40U3ZUOG5aeGdBT05sQ2hmdmhac05vcldXOHBlcjdsayt1b3UrNmJkeWNQVGpaUXNCbFYvdThYdmJCanNFUjViNk5ZSG9xWDd2VDF0anZUOG8wRmYyUGtmengxMTl1ams3anVQYWp4dWpWV3NicWRtMWZuZVRsNUxudHM2TjJWWXRqVE5yWlhRblg2dGYvSHF6SXNQM0cyN2E3dW04c2c5cmd1c3M1dE43UmZaOUlITDBNdU5GOWZ6MWszaTUrNnBUV1BYVTVUQjdmU1puSVRjbzRBRlg4TnhaL2ZUL1NJU3dBUzBnRllPbWFVZE0wbzA0QUE1Wk1KQUFCLy8yZ0FJQVFFQUFRVUM2TE8wQUNDcjdPdUtnNkx5OENBQzFyWmhMRVhQOUliMjBLUGdKWXJQYjluNUpxSzJ6RUxHbkd5OHZBZ0FwWmJtNnVkZTE0T3ZEemtXMFd5MkxnblVRNjdVdVFPUDRiS0hTOTBQcFQvbDZ6NHphWVRwVHRMQnFZYXJPUmIzNC9VUWlvckJ3Z3NNQW1jMHlheXdpcmwySCtsMnRVTVdNaTJWWlpWbG1NVU4vb0xlNitPODREcUlTcnZPUnVSaHFnYlNkSnRkZ3RmNi9UZkRaYTFReFkxUlVEQWlidUl5ejJQaGJVRXA5QnpiK0thbTB1Syt2REZENkx2VE5Yc2NSRThzQk5GSkM4YkdIZjhBMjN3MjZrV1ZsWDhqMW1yd1E4aVNoNmJCc2FLTUpmUTZ0cVg4ejBYWHd2eEFudGZhOUgvLzJnQUlBUUlBQVFVQzZGWHl4RjZVVEZUdzl2M0VhSzVqaHdYUGE1cW91SW1mYkZYd2ZQOEFuRzl5dENOOUdGQ3BLbmJkNmlqeW9DZ3JCaERNbGQ1TmhBZjNrOEJyTHRMSStMMTJGZXdoaUxNRE1DY3doazdWWEIyZnJrc3Zsa2NmcXowcDVaWVY3Q0dWbFkwWm5mWEcvYkh3SXFvblM2TkYrby8vMmdBSUFRTUFBUVVDNklZWFNPbGhjeGVpZWRJMEdKU1JNcjdCQnBMRzdobWdJc0d4dWE1RlRKNTBqUlZmTThjZEkwd0FScklMYU9KazV3UGN3UXRZbDdyZlM0T0thSmdQWThLa2J1enl0N1dQZXJseGRia0xaSEJQNllabFl2NHl0bGlWaTBFc2NXYkFZbmF5cHFWbld4c1dDczl5L3VaRE1yRm1tV1JXVTdHc08vZHdDN2ZDeVdWejNkQTU4MFgxSC8vYUFBZ0JBZ0lHUHdMdHVhZE1kWElybW1OazR1c2QxbEsvd3l5alY2NHlzb3k0Wll5WERFTEtLNWFXcGpKZXUvZ1gvOW9BQ0FFREFnWS9BdEdNYnBwQnRMbXVaaTZhRjB5Y1VjNkIwNWU2STZZWk9McGpaWmJMRk5RQkhxSFpPYUdjTGo1VXVtM3Q2dlZpaktlNkVZbTlNcGZyK1ZqRyt3WDlIKzJnQ0pZb2p5cGhmeVdVcjZmckx2SC8yZ0FJQVFFQkJqOEM1aTZpcWNEVEtJWGxuMmpBWnJUS1o5RDZQV1FvS0htNXBlZVB3MjlLamFLZGg1SGFzNnVrZEhKUVlZRTM1OFg2aUJoQktkbEhsTWZKWXZ0TFdsdWliSzNrNVU1VmJLUVlmYkpacW1LUytxUHpOMzlOSjlQUlpEekt3NDA0SW9XTXhISVhuajhOdlNvMjlaYXQxUFVRaTB0dmFjVjJydWxSNUt1cEtiOU9wY3Rna1JRVU41QjVjOWxWS0dnMjdpUzVpdmhvMlVlaytPeHFhWUJGY2dlQU9BYUQwNmpaVlBVSlVhVXFnK3dkNUN0WXR4azVQQzNiODdxM2JMVFY1LzA0YnQzMmJEaDlwdy91RkhldmYwNUt0NEdEcmlaVFA0M01ubUdXMVBoclNET3FWSWF6YktZNXo0ck5NdGlEYktRaHNleWtRSEl6RCtUUGFCR2FWN2ZUcXRpZDMrTTkzTUtzMHlhamM5TnJpOGhHNHZTRGJVb2ZsVW0weHY4QXVUcEJ0UzRVdFNrQmxFNXhjTmlZNWtBanJBSG5zL2lVUXR1a1JkYVVNb211L3dDTWVTUXhCekVIQnNwemhzSHJLOUFzdW9xRnE0YTlHcXFqdktWNnFlbjdyZDM4T25nN2x5Um9oOXRQSmNYa0kzRjZRYkhTdUVYWFBCYXR4Q1k0dzlWdUVxeXhGMFpFaFNUcUF0U3RLQ1o5VkdwcUZKRnlLbmQzSitBRGthcXdzMDZpZm5BbnJwR3JVYk4wOU8yR21XaEJDQnpZMWRHMjR2OEEyN3EvekpnZVZtb1lYTVpxRUpjWlhyUXNSQnk5SE0rcGkyemovd0QwNWZxK0NlUVgrN3VDdkFvbFpaTVpXNURhdldacDZCR1BzZlRqMkw0Y2lGVXFyYnJFdHFwbnhWbUtqTlMxRXBpVGtqbXNtc0wyTW9MdEhqYldJTGZjcVNodHFsQUZHZHZJZ3czVHBzNjdoNCtvRGdiM2RoeGVieFBIdVJ2R3FOTGY5NUF4RWJuaXlXSXhOdkdSOU84WFc5Mk5MNHcxd1I4dnc4MlY4eGM3VzdlNkk5V3pEQlp4TkdKdDRWUk40RWxzVk1sRlFsZ0NEc3YzWUlkN1NaMWJWUEdJcis4NTlURmErSzRQaDV5cFYwL3Q0UzdzQm56Nlk4Mm83eGs4QkxQRjhUZGtTdE4rL3N3OE5tNUYyVGRFbTVDNWNoa3V3eVFoemYvYUFBZ0JBUU1CUHlIMFo2cnNoQmlMbG9VNzg1YU1tSGoweUlGc0hpbjdhZkZyQmwvSVhSTmNsMkxNNXVQQ3NwWVNHenhsVmlhUlZEbXl5KzlYQ2o4cVpsSFNSQXRnOFUvYlFjREhDUVQ5Qjk5NlBoWUxuOG9hSFRqWHBBVkpHSHlxd2dGenFCK0Nuc1FFZC93TnNQV2lBaDJFM0NhbXRmSTYrVCtabTJhSUNEMkdoNGUycGcyTmtQYTdiUDhBWjZlUk9QVm5NbmhVYXVtUmNCWmNDOWNVYWRFWHdkRXB4RGFOaXovN0k0aW9sY1JTNFdIZDhJNWluQjVSKzBibGVjQTkrS05KZkQrRTFPdlltdVZZbkpkcUVpWENMaVNKc0pkem9nZi9BTi9xUFpHUXJUbktycU9WcS80SDROcm43ek45VTN6MGNIbEg3UnVVbXpOWU5Mb0RZcUxacU9DVU1JamlwbmlDUkF3WVFLYjlBVHJpVEd6Mk1UNXlYME9FZkQ5cnErbHpob2ZuRHkwQUFRRmdNUjBOb0tvZ2ZHZzNYb0JGQ21MT3JTRUE0Sml1ZjdJZW01Q0ZkYTVidFJTa0NiTHBXa0pGT29iN1poTHNiMFBJcmJIZ1NCMmJLNlZBRDBFU01yaERObHlTcEJZaitTSE9saFdOeDZmOVRtM2p1Y0svVHZXK3FJOVAvOW9BQ0FFQ0F3RS9JZlFZbG9YSHBrcVBvdFFZaXBKaFM3SGJtc0NFNlNWWVZQMEJXVDdva3VhUi93RG5yeDNPOWFSMlUvOEFHMTdUajdubXZrVWFqNzExNlREV2Mybno3M29RUjBNcmkrdWY1VndMM1o3SFBGYWdOSFVmZVN0aXA3SEg0NzE4OXpVZmZ6VnAwVTk3cDB4ek5JNWNWMkRwcUEwZFI5NUtpaGQ1ZjV4VE5jbW5NdWt5b0FnOU9UUCtqLy9hQUFnQkF3TUJQeUgwREJsVkprdWJlbjJVYXQ2enFkSlVpa2JSMjNhVDVDV1M1ck8zRm1pbWUvRkdra2Vuc28xeUw2Q282WjFlaFdDeEliM2IzT01WR0VHZSt2OEFsQVAvQUgxNS9qYXRRN3EySzMxR3U0NzcrOXVrajRMdlkvM0htbURMU2UvSG1tT1paK2VnUnhnblh0L2NhZHIwY2haZXhZTjk2a0JTZS9icGdBa0dJeGFOYjkveFYrU2VteC9ZK09tQ2g5Zy9iUVVDM3Njdkg1cnZoTSsvY1c2U0Fyak9sSUFndkZ4ZVJ6UzBES0xFREhIUmZEOUQvbElrbGVuS1FiWlBoLzZQLzlvQURBTUJBQUlSQXhFQUFCQUFESUFBRVVCQUpCaXFCQ25BdFNRaERCT0lDQUFZaUFBQ0FTQUFBQUFmLzlvQUNBRUJBd0UvRVBRMFZ5ZCt6a0pNc2ZWUWRlc29pWk9RS0UxOU4reW1RT1NHNERzQjRFZ0F3dkFzSkJzR0xOblNhelBxeEppUWhSaGlGTzJBOHBycVNRd0VaVHNya094YUZrUytYRGNpbGFhYUx3RWRFd2pjYk4rbCt5bVFPU0c0RHNCNEYvS2xhNVJXOTFkeXQwRkdnQUpBRHpkTnkzS3Ewc0pkY1NuY3lEaHVxeG9FODRkVkFpdzBwYjg3YkFMSllBRUo5QnBiL2tlRVpxalRBYncxOGZYeDZzek5yTmhoVjZ1czEwekg1YXJPVmFWQk1JWUJZTHhHSXZmb1o0UXhDTWlXaEZxcEFGeGxGRTQ0S2pTN04vandBNkxoUkZNa0w0akMyNlU2S29aaEllOCtydEhrZFMrZ0FBdE1tNjhuZUVmaWMzVlBpVkZuSTdKVWZrUXNXdndiT0VvdHA4SXVJRnJ3QWI3VDVIYVFMS0RFREowcEI0RWdKWTlWbE01YUUvN1dYNFFvSjFBTXQ2QUR1VWsyZTZaN3UzZVhTK2dBQXRNbTY4bmVFWTh3bmxSWUtVS1lDN1FNVnNHTWNVc2JGQ1pqUG4zcGdvbG9OaWVnQ1d3N0pKTFdUaWlYRFFPKzRtRDNWV1ZDcUtxcXF2cHZxR1pkdUlsUld3aHhSOWpnMEFXQURvRndnM2hRQUtnZzN1ZWk3ekNqU1VXRWlMbXloSHZCY1JNQUdZdVVhR0JBUlRuSXJxMHlHblc0YjdqM0VzQTRUaFVYVkZ2Z0VaUmgyb29vYzIyQjMzRS9SRm1BMWd2T20wd1NwV0lrMzBmdVVuK2E5cG0xZXg5Z21pMG9pTGVuLzlvQUNBRUNBd0UvRVBSTEdBb3VVSng2WGNGSStPZ0lVaDNudnNVWkV5aEd6KytibENoaEdXcjlITzlPQVVRajBkd1VGQkhMMGlTRG9OaHZhNVQ0bGVKMm9Fa3IyVGpjOGw4Z2tMT0FiUEd6cFdzYm8zVDcxeEY4VTRjQ3hmZFczRnZoY3dHaTZ4Rmw4Si9XQThoVzdEWTgwSUkzV1JaVHZiblZ2UWdNSFJxRlhkbitHL2tYc3k2YlFDUmRTc1dZZmkwMG5DQmMvS054N0NiSUpIM2RGN3I3V2psYkNqQ1h3bmhQNmNEeUVOQTVKTi9pakkwNWJ2OEFPaG5JL3FucWNuZXRJd2lPaWNJRno4bzNIc0pzZ2k1clYzWTBHZzAxY3V4T3hDYlRaT3lWRVhFazNaKytoS2NiOC8yalFRSHB4MHYzL3dCSC85b0FDQUVEQXdFL0VQUXhXWkFSZUJYTUdCcmd0SVY5NU9TM3BldjJOVnNmdDBxVTJQZzVOem9LYWFZN0NzaElMUkpaemVuUFV4aERscTBYSTNweWs1dzBmdDFqYnhRSmdTSjBldjJOVnNmdDByZjZ3ZXdCOTk2eUxYY1gvTmo5OUhDNkFHcFNUcTBhVVY4NEFtSE5BdG9rZ1FTTnFmZ0FQQjJlZG53MncvQnY1RnVjN212ZXRQMnpzajNwbWJacVZTVmY3WHZ4aExZb1RiS3UrK3dmRDdhaHBMZmN3OEtLQ0JSNWIyTWR5dDVwSEpjbmRVdjMwTllSbFlCcGNTR0hZd21MMGhITFVzWnJMN0Q1dkZhSDlUUlBlR3R3RDhyL0FIODlxK0Nqb2xUTHNGcTFnRFZoT2hDOU9QWHlvUzJ4YmRRN3Vob0Z0M0NqNlBnd1h4alRBTURBQmdhR1ZZMVRYZmtaL0VSYU1hRVc2YUg5VFJQZUdnNUVTZ2Q5K1dqSjRpVm11eWdMZUxGRENRU1lURUxDeExPTGJkRU1DRGU1dEhmTml6TnBoczRsc3E2L3pRQ3dXTGVrbU9ZUHlBZHdtbFZsL3dDZi85az1gLFxuICAgICAgICAgICAgICAgIHdpZHRoOiA3MCxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIHBhZ2VCcmVhazogJ2FmdGVyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkb2NEZWZpbml0aW9uLmNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0b2M6IHtcbiAgICAgICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBJMThuRW5naW5lLnRyYW5zbGF0ZSgndGFibGUtb2YtY29udGVudHMnKSxcbiAgICAgICAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDE4LFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IFsxMCwgMTAsIDEwLCA1MF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG51bWJlclN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFnZUJyZWFrOiAnYWZ0ZXInXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBSRUFETUUgcGFnZSBpZiBhdmFpbGFibGVcblxuICAgICAgICBkb2NEZWZpbml0aW9uLmNvbnRlbnQucHVzaCh0aGlzLmdlbmVyYXRlTWFya2Rvd25Db250ZW50KCkpO1xuXG4gICAgICAgIC8vIEFkZCBDSEFOR0VMT0cgcGFnZSBpZiBhdmFpbGFibGVcblxuICAgICAgICAvLyBBZGQgQ09OVFJJQlVUSU5HIHBhZ2UgaWYgYXZhaWxhYmxlXG5cbiAgICAgICAgLy8gQWRkIExJQ0VOU0UgcGFnZSBpZiBhdmFpbGFibGVcblxuICAgICAgICAvLyBBZGQgVE9ETyBwYWdlIGlmIGF2YWlsYWJsZVxuXG4gICAgICAgIC8vIEFkZCBEZXBlbmRlbmNpZXMgcGFnZSBpZiBhdmFpbGFibGVcblxuICAgICAgICAvLyBBZGQgQWRkaXRpb25hbCBwYWdlcyBpZiBhdmFpbGFibGVcblxuICAgICAgICBkb2NEZWZpbml0aW9uLmNvbnRlbnQucHVzaCh0aGlzLmdlbmVyYXRlTW9kdWxlc0NvbnRlbnQoKSk7XG5cbiAgICAgICAgZG9jRGVmaW5pdGlvbi5jb250ZW50LnB1c2godGhpcy5nZW5lcmF0ZUNvbXBvbmVudHNDb250ZW50KCkpO1xuXG4gICAgICAgIC8vIENsYXNzZXNcblxuICAgICAgICAvLyBJbmplY3RhYmxlc1xuXG4gICAgICAgIC8vIEludGVyY2VwdG9yc1xuXG4gICAgICAgIC8vIEd1YXJkc1xuXG4gICAgICAgIC8vIEludGVyZmFjZXNcblxuICAgICAgICAvLyBQaXBlc1xuXG4gICAgICAgIC8vIE1pc2NlbGxhbmVvdXNcblxuICAgICAgICAvLyBSb3V0ZXNcblxuICAgICAgICAvLyBDb3ZlcmFnZSAtIGRvY0RlZmluaXRpb24uY29udGVudC5wdXNoKC4uLnRoaXMuY292ZXJhZ2VFbmdpbmUuY2FsY3VsYXRlVGFibGUoKSk7XG5cbiAgICAgICAgbGV0IHBkZkRvYyA9IHByaW50ZXIuY3JlYXRlUGRmS2l0RG9jdW1lbnQoZG9jRGVmaW5pdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGZzLmVuc3VyZUZpbGUob3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnZG9jdW1lbnRhdGlvbi5wZGYnLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGBFcnJvciBkdXJpbmcgcGRmIGdlbmVyYXRpb246ICR7ZXJyfWApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBkZkRvYy5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZnMuY3JlYXRlV3JpdGVTdHJlYW0ob3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnZG9jdW1lbnRhdGlvbi5wZGYnKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwZGZEb2MuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaXJzdENoYXJhY3RlclVwcGVyQ2FzZShzZW50ZW5jZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHNlbnRlbmNlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2VudGVuY2Uuc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZU1hcmtkb3duQ29udGVudCgpIHtcbiAgICAgICAgbGV0IHBhZ2VzID0gQ29uZmlndXJhdGlvbi5tYXJrRG93blBhZ2VzO1xuXG4gICAgICAgIGxldCBkYXRhID0gW107XG5cbiAgICAgICAgcGFnZXMuZm9yRWFjaChwYWdlID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5maXJzdENoYXJhY3RlclVwcGVyQ2FzZShwYWdlLm5hbWUpfWAsXG4gICAgICAgICAgICAgICAgdG9jSXRlbTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2hlYWRlcidcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgY29udmVydGVkTWFya2Rvd25PYmplY3QgPSBNYXJrZG93blRvUGRmRW5naW5lLmNvbnZlcnQocGFnZS5kYXRhKTtcbiAgICAgICAgICAgIGNvbnZlcnRlZE1hcmtkb3duT2JqZWN0Lm1hcmdpbiA9IFswLCAxMF07XG5cbiAgICAgICAgICAgIGRhdGEucHVzaChjb252ZXJ0ZWRNYXJrZG93bk9iamVjdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5zZXJ0UGFnZVJldHVybihkYXRhKTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluc2VydFBhZ2VSZXR1cm4oZGF0YSkge1xuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogYCBgLFxuICAgICAgICAgICAgbWFyZ2luOiBbMCwgMCwgMCwgMjBdLFxuICAgICAgICAgICAgcGFnZUJyZWFrOiAnYWZ0ZXInXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVNb2R1bGVzQ29udGVudCgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBbXTtcblxuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogJ01vZHVsZXMnLFxuICAgICAgICAgICAgdG9jSXRlbTogdHJ1ZSxcbiAgICAgICAgICAgIHN0eWxlOiAnaGVhZGVyJ1xuICAgICAgICB9KTtcblxuICAgICAgICBfLmZvckVhY2goQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzLCBtb2R1bGUgPT4ge1xuICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHttb2R1bGUubmFtZX1gLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnc3ViaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBtYXJnaW46IFswLCAxNSwgMCwgMTVdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGBGaWxlbmFtZSA6IGAsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2xkOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IG1vZHVsZS5maWxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogWzAsIDEwXVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGUucmF3ZGVzY3JpcHRpb24gIT0gJycpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgRGVzY3JpcHRpb24gOmAsXG4gICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogWzAsIDEwXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYCR7bW9kdWxlLnJhd2Rlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogWzAsIDVdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGUuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgRGVjbGFyYXRpb25zIDpgLFxuICAgICAgICAgICAgICAgICAgICBib2xkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IFswLCAxMF1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0geyB1bDogW10gfTtcblxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChtb2R1bGUuZGVjbGFyYXRpb25zLCBkZWNsYXJhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QudWwucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgJHtkZWNsYXJhdGlvbi5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBkYXRhLnB1c2gobGlzdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGUucHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgUHJvdmlkZXJzIDpgLFxuICAgICAgICAgICAgICAgICAgICBib2xkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IFswLCAxMF1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0geyB1bDogW10gfTtcblxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChtb2R1bGUucHJvdmlkZXJzLCBwcm92aWRlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QudWwucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgJHtwcm92aWRlci5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBkYXRhLnB1c2gobGlzdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGUuaW1wb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYEltcG9ydHMgOmAsXG4gICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogWzAsIDEwXVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGxpc3QgPSB7IHVsOiBbXSB9O1xuXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKG1vZHVsZS5pbXBvcnRzLCBpbXBvcnRSZWYgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsaXN0LnVsLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogYCR7aW1wb3J0UmVmLm5hbWV9YFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGRhdGEucHVzaChsaXN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vZHVsZS5leHBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgRXhwb3J0cyA6YCxcbiAgICAgICAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBbMCwgMTBdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHsgdWw6IFtdIH07XG5cbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobW9kdWxlLmV4cG9ydHMsIGV4cG9ydFJlZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QudWwucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgJHtleHBvcnRSZWYubmFtZX1gXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKGxpc3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IGAgYCxcbiAgICAgICAgICAgICAgICBtYXJnaW46IFswLCAwLCAwLCAyMF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmluc2VydFBhZ2VSZXR1cm4oZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUNvbXBvbmVudHNDb250ZW50KCkge1xuICAgICAgICBsZXQgZGF0YSA9IFtdO1xuXG4gICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiAnQ29tcG9uZW50cycsXG4gICAgICAgICAgICB0b2NJdGVtOiB0cnVlLFxuICAgICAgICAgICAgc3R5bGU6ICdoZWFkZXInXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF8uZm9yRWFjaChDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHMsIGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IGAke2NvbXBvbmVudC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgc3R5bGU6ICdzdWJoZWFkZXInLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogWzAsIDE1LCAwLCAxNV1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogYEZpbGVuYW1lIDogYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY29tcG9uZW50LmZpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBbMCwgMTBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5yYXdkZXNjcmlwdGlvbiAhPSAnJykge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGBEZXNjcmlwdGlvbiA6YCxcbiAgICAgICAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBbMCwgMTBdXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgJHtjb21wb25lbnQucmF3ZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBbMCwgNV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBgIGAsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBbMCwgMCwgMCwgMjBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pbnNlcnRQYWdlUmV0dXJuKGRhdGEpO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXhwb3J0UGRmRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IEV4cG9ydEpzb25FbmdpbmUgZnJvbSAnLi9leHBvcnQtanNvbi5lbmdpbmUnO1xuaW1wb3J0IEV4cG9ydFBkZkVuZ2luZSBmcm9tICcuL3BkZi1lbmdpbmUvZXhwb3J0LXBkZi5lbmdpbmUnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0RW5naW5lIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRXhwb3J0RW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghRXhwb3J0RW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBFeHBvcnRFbmdpbmUuaW5zdGFuY2UgPSBuZXcgRXhwb3J0RW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV4cG9ydEVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSkge1xuICAgICAgICBzd2l0Y2ggKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gRXhwb3J0SnNvbkVuZ2luZS5leHBvcnQob3V0cHV0Rm9sZGVyLCBkYXRhKTtcbiAgICAgICAgICAgIGNhc2UgJ3BkZic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEV4cG9ydFBkZkVuZ2luZS5leHBvcnQob3V0cHV0Rm9sZGVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXhwb3J0RW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuXG5leHBvcnQgY2xhc3MgQnJlYWtDb21tYUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhcnMpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICB0ZXh0ID0gdGhpcy5iYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24odGV4dCk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLywvZywgJyw8YnI+Jyk7XG4gICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmV4cG9ydCBjbGFzcyBCcmVha0xpbmVzSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYmFycykge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbih0ZXh0KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJzxicj4nKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvIC9nbSwgJyZuYnNwOycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cdC9nbSwgJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOycpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuXG5leHBvcnQgY2xhc3MgQ2FwaXRhbGl6ZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleHQuc2xpY2UoMSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuZXhwb3J0IGNsYXNzIENsZWFuUGFyYWdyYXBoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxwPi9nbSwgJycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88XFwvcD4vZ20sICcnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wYXJlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKFxuICAgICAgICBjb250ZXh0OiBhbnksXG4gICAgICAgIGE6IGFueSxcbiAgICAgICAgb3BlcmF0b3I6IHN0cmluZyxcbiAgICAgICAgYjogYW55LFxuICAgICAgICBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnNcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGFuZGxlYmFycyBIZWxwZXIge3tjb21wYXJlfX0gZXhwZWN0cyA0IGFyZ3VtZW50cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSAnaW5kZXhvZic6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYi5pbmRleE9mKGEpICE9PSAtMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSA9PT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSAhPT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGEgPiBiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGVscGVyIHt7Y29tcGFyZX19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIERlYnVnSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgb3B0aW9uYWxWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDdXJyZW50IENvbnRleHQnKTtcbiAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChvcHRpb25hbFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnT3B0aW9uYWxWYWx1ZScpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhvcHRpb25hbFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRBbG9uZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGVsZW1lbnRzLCBlbGVtZW50VHlwZTogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGFsb25lcyA9IFtdO1xuICAgICAgICBsZXQgbW9kdWxlcyA9IERlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBsZXQgZm91bmRJbk9uZU1vZHVsZSA9IGZhbHNlO1xuICAgICAgICAgICAgbW9kdWxlcy5mb3JFYWNoKG1vZHVsZSA9PiB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2xhcmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uZmlsZSA9PT0gZWxlbWVudC5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5ib290c3RyYXAuZm9yRWFjaChib29zdHJhcGVkRWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChib29zdHJhcGVkRWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvb3N0cmFwZWRFbGVtZW50LmZpbGUgPT09IGVsZW1lbnQuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMuZm9yRWFjaChjb250cm9sbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuaWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmZpbGUgPT09IGVsZW1lbnQuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBtb2R1bGUucHJvdmlkZXJzLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuaWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZm91bmRJbk9uZU1vZHVsZSkge1xuICAgICAgICAgICAgICAgIGFsb25lcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYWxvbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBvbmVudHMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RpcmVjdGl2ZSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlyZWN0aXZlcyA9IGFsb25lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29udHJvbGxlcic6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY29udHJvbGxlcnMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2luamVjdGFibGUnOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmluamVjdGFibGVzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwaXBlJzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5waXBlcyA9IGFsb25lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEVzY2FwZVNpbXBsZVF1b3RlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJycpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlckFuZ3VsYXIyTW9kdWxlc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZywgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IE5HMl9NT0RVTEVTOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdCcm93c2VyTW9kdWxlJyxcbiAgICAgICAgICAgICdGb3Jtc01vZHVsZScsXG4gICAgICAgICAgICAnSHR0cE1vZHVsZScsXG4gICAgICAgICAgICAnUm91dGVyTW9kdWxlJ1xuICAgICAgICBdO1xuICAgICAgICBsZXQgbGVuID0gTkcyX01PRFVMRVMubGVuZ3RoO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0ZXh0LmluZGV4T2YoTkcyX01PRFVMRVNbaV0pID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgSUFuZ3VsYXJBcGkgfSBmcm9tICcuL2FuZ3VsYXItYXBpLnV0aWwnO1xuXG5leHBvcnQgY2xhc3MgQW5ndWxhclZlcnNpb25VdGlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDb3JlUGFja2FnZSA9ICdAYW5ndWxhci9jb3JlJztcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBBbmd1bGFyVmVyc2lvblV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFBbmd1bGFyVmVyc2lvblV0aWwuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEFuZ3VsYXJWZXJzaW9uVXRpbC5pbnN0YW5jZSA9IG5ldyBBbmd1bGFyVmVyc2lvblV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQW5ndWxhclZlcnNpb25VdGlsLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhblZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgICAgICAgIC5yZXBsYWNlKCd+JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnXicsICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJz0nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCc8JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnPicsICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW5ndWxhclZlcnNpb25PZlByb2plY3QocGFja2FnZURhdGEpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9ICcnO1xuXG4gICAgICAgIGlmIChwYWNrYWdlRGF0YS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGxldCBhbmd1bGFyQ29yZSA9IHBhY2thZ2VEYXRhLmRlcGVuZGVuY2llc1tBbmd1bGFyVmVyc2lvblV0aWwuQ29yZVBhY2thZ2VdO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXJDb3JlKSB7XG4gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IHRoaXMuY2xlYW5WZXJzaW9uKGFuZ3VsYXJDb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBbmd1bGFyVmVyc2lvbkFyY2hpdmVkKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzZW12ZXIuY29tcGFyZSh2ZXJzaW9uLCAnMi40LjEwJykgPD0gMDtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVmaXhPZmZpY2lhbERvYyh2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FuZ3VsYXJWZXJzaW9uQXJjaGl2ZWQodmVyc2lvbikgPyAndjIuJyA6ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBcGlMaW5rKGFwaTogSUFuZ3VsYXJBcGksIGFuZ3VsYXJWZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYW5ndWxhckRvY1ByZWZpeCA9IHRoaXMucHJlZml4T2ZmaWNpYWxEb2MoYW5ndWxhclZlcnNpb24pO1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vJHthbmd1bGFyRG9jUHJlZml4fWFuZ3VsYXIuaW8vJHthcGkucGF0aH1gO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5ndWxhclZlcnNpb25VdGlsLmdldEluc3RhbmNlKCk7XG4iLCJlbnVtIEJhc2ljVHlwZXMge1xuICAgIG51bWJlcixcbiAgICBib29sZWFuLFxuICAgIHN0cmluZyxcbiAgICBvYmplY3QsXG4gICAgZGF0ZSxcbiAgICBmdW5jdGlvblxufVxuXG5lbnVtIEJhc2ljVHlwZVNjcmlwdFR5cGVzIHtcbiAgICBhbnksXG4gICAgdm9pZFxufVxuXG5leHBvcnQgY2xhc3MgQmFzaWNUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEJhc2ljVHlwZVV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFCYXNpY1R5cGVVdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBCYXNpY1R5cGVVdGlsLmluc3RhbmNlID0gbmV3IEJhc2ljVHlwZVV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmFzaWNUeXBlVXRpbC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlcyBpcyBhIGJhc2ljIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNKYXZhc2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlLnRvTG93ZXJDYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpIGluIEJhc2ljVHlwZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlIGlzIGEgdHlwZXNjcmlwdCB0eXBlIChUaGF0IGlzIG5vdCBhIGphdmFzY3JpcHQgdHlwZSlcbiAgICAgKiBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9iYXNpYy10eXBlcy5odG1sXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUeXBlU2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlLnRvTG93ZXJDYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpIGluIEJhc2ljVHlwZVNjcmlwdFR5cGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHR5cGUgaXMgYSB0eXBlc2NyaXB0IG9yIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIGNoZWNrXG4gICAgICovXG4gICAgcHVibGljIGlzS25vd25UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0phdmFzY3JpcHRUeXBlKHR5cGUpIHx8IHRoaXMuaXNUeXBlU2NyaXB0VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBsaW5rIHRvIGVpdGhlciB0aGUgamF2YXNjcmlwdCBvciB0eXBlc2NyaXB0IHR5cGVcbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRoZSBkb2N1bWVudGF0aW9uIGxpbmsgb3IgdW5kZWZpbmVkIGlmIHR5cGUgbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIGdldFR5cGVVcmwodHlwZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNKYXZhc2NyaXB0VHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy8ke3R5cGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVHlwZVNjcmlwdFR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYmFzaWMtdHlwZXMuaHRtbGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFzaWNUeXBlVXRpbC5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCBBbmd1bGFyVmVyc2lvblV0aWwgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYW5ndWxhci12ZXJzaW9uLnV0aWwnO1xuaW1wb3J0IEJhc2ljVHlwZVV0aWwgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYmFzaWMtdHlwZS51dGlsJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25TaWduYXR1cmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVGdW5jdGlvbihhcmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXJnLmZ1bmN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogKCkgPT4gdm9pZGA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJndW1zID0gYXJnLmZ1bmN0aW9uLm1hcChhcmd1ID0+IHtcbiAgICAgICAgICAgIGxldCBfcmVzdWx0ID0gRGVwZW5kZW5jaWVzRW5naW5lLmZpbmQoYXJndS50eXBlKTtcbiAgICAgICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuc291cmNlID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gX3Jlc3VsdC5kYXRhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICdjbGFzc2UnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiA8YSBocmVmPVwiLi4vJHtwYXRofXMvJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YS5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH0uaHRtbFwiPiR7YXJndS50eXBlfTwvYT5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gQW5ndWxhclZlcnNpb25VdGlsLmdldEFwaUxpbmsoXG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJndS50eXBlfTwvYT5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQmFzaWNUeXBlVXRpbC5pc0tub3duVHlwZShhcmd1LnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBCYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJndS50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1Lm5hbWUgJiYgYXJndS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAke2FyZ3UudHlwZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmd1Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWUudGV4dH1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogKCR7YXJndW1zfSkgPT4gdm9pZGA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25hbFN0cmluZyhhcmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYXJnLm9wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgfVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBtZXRob2QpIHtcbiAgICAgICAgbGV0IGFyZ3MgPSAnJztcblxuICAgICAgICBsZXQgYXJnRGVzdHJ1Y3R1cmVkQ291bnRlckluaXRpYWwgPSAwO1xuICAgICAgICBsZXQgYXJnRGVzdHJ1Y3R1cmVkQ291bnRlclJlYWwgPSAwO1xuXG4gICAgICAgIGlmIChtZXRob2QuYXJncykge1xuICAgICAgICAgICAgbWV0aG9kLmFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcmcuZGVzdHJ1Y3R1cmVkUGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ0Rlc3RydWN0dXJlZENvdW50ZXJJbml0aWFsICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG1ldGhvZC5hcmdzLmZvckVhY2goKGFyZywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcmVzdWx0ID0gRGVwZW5kZW5jaWVzRW5naW5lLmZpbmQoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChhcmcuZGVzdHJ1Y3R1cmVkUGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdEZXN0cnVjdHVyZWRDb3VudGVyUmVhbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSAnX19uYW1lZFBhcmFtZXRlcnM6IHsnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ0Rlc3RydWN0dXJlZENvdW50ZXJSZWFsICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBfcmVzdWx0LmRhdGEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiA8YSBocmVmPVwiLi4vJHtwYXRofXMvJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfS5odG1sXCIgdGFyZ2V0PVwiX3NlbGZcIj4ke0hhbmRsZWJhcnMuZXNjYXBlRXhwcmVzc2lvbihhcmcudHlwZSl9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBcGlMaW5rKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke0hhbmRsZWJhcnMuZXNjYXBlRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgKX08L2E+YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYC4uLiR7YXJnLm5hbWV9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncyArPSB0aGlzLmhhbmRsZUZ1bmN0aW9uKGFyZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCYXNpY1R5cGVVdGlsLmlzS25vd25UeXBlKGFyZy50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gQmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKGFyZy50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgYXJncyArPSBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtIYW5kbGViYXJzLmVzY2FwZUV4cHJlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcudHlwZVxuICAgICAgICAgICAgICAgICAgICApfTwvYT5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICR7YXJnLnR5cGV9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnLmRlc3RydWN0dXJlZFBhcmFtZXRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnRGVzdHJ1Y3R1cmVkQ291bnRlclJlYWwgPT09IGFyZ0Rlc3RydWN0dXJlZENvdW50ZXJJbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9ICd9JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBtZXRob2QuYXJncy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gJywgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke21ldGhvZC5uYW1lfSgke2FyZ3N9KWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCgke2FyZ3N9KWA7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEhhc093bkhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGVudGl0eSwga2V5OiBhbnksIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgSTE4bkVuZ2luZSBmcm9tICcuLi9pMThuLmVuZ2luZSc7XG5cbmV4cG9ydCBjbGFzcyBJMThuSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgaTE4bl9rZXk6IHN0cmluZykge1xuICAgICAgICBpZiAoSTE4bkVuZ2luZS5leGlzdHMoaTE4bl9rZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gSTE4bkVuZ2luZS50cmFuc2xhdGUoaTE4bl9rZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaTE4bl9rZXk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIElmU3RyaW5nSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgYTogYW55LCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIG1ldGhvZCkge1xuICAgICAgICBjb25zdCBhcmdzID0gbWV0aG9kLmFyZ3MubWFwKGFyZyA9PiBgJHthcmcubmFtZX06ICR7YXJnLnR5cGV9YCkuam9pbignLCAnKTtcbiAgICAgICAgaWYgKG1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7bWV0aG9kLm5hbWV9WyR7YXJnc31dYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7YXJnc31dYDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSXNJbml0aWFsVGFiSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGFiczogQXJyYXk8YW55PiwgdGFiSWQ6IFN0cmluZywgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0YWJzWzBdLmlkID09PSB0YWJJZCA/IG9wdGlvbnMuZm4oY29udGV4dCkgOiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBJc05vdFRvZ2dsZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHR5cGUsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zLmluZGV4T2YodHlwZSk7XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zLmluZGV4T2YoJ2FsbCcpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIElzVGFiRW5hYmxlZEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRhYnM6IEFycmF5PGFueT4sIHRhYklkOiBTdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaXNUYWJFbmFibGVkID0gLTEgIT09IF8uZmluZEluZGV4KHRhYnMsIHsgaWQ6IHRhYklkIH0pO1xuICAgICAgICByZXR1cm4gaXNUYWJFbmFibGVkID8gb3B0aW9ucy5mbihjb250ZXh0KSA6IG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jQ29kZUV4YW1wbGVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHJpdmF0ZSBjbGVhblRhZyhjb21tZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoY29tbWVudC5jaGFyQXQoMCkgPT09ICcqJykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDEsIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudC5jaGFyQXQoMCkgPT09ICcgJykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDEsIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudC5pbmRleE9mKCc8cD4nKSA9PT0gMCkge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDMsIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudC5zdWJzdHIoLTEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDAsIGNvbW1lbnQubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuc3Vic3RyKC00KSA9PT0gJzwvcD4nKSB7XG4gICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMCwgY29tbWVudC5sZW5ndGggLSA0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEh0bWxFbnRpdGllcyhzdHIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHN0cilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwganNkb2NUYWdzOiBKc2RvY1RhZ0ludGVyZmFjZVtdLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0ganNkb2NUYWdzLmxlbmd0aDtcbiAgICAgICAgbGV0IHRhZ3MgPSBbXTtcbiAgICAgICAgbGV0IHR5cGUgPSAnaHRtbCc7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaGFzaC50eXBlKSB7XG4gICAgICAgICAgICB0eXBlID0gb3B0aW9ucy5oYXNoLnR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdleGFtcGxlJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnID0ge30gYXMgSnNkb2NUYWdJbnRlcmZhY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50LmluZGV4T2YoJzxjYXB0aW9uPicpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID0ganNkb2NUYWdzW2ldLmNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxjYXB0aW9uPi9nLCAnPGI+PGk+JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcL2NhcHRpb24+L2csICcvYj48L2k+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDxwcmUgY2xhc3M9XCJsaW5lLW51bWJlcnNcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSR7dHlwZX1cIj5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRIdG1sRW50aXRpZXModGhpcy5jbGVhblRhZyhqc2RvY1RhZ3NbaV0uY29tbWVudCkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDwvY29kZT48L3ByZT5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jRGVmYXVsdEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGpzZG9jVGFnczogSnNkb2NUYWdJbnRlcmZhY2VbXSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGlmIChqc2RvY1RhZ3MpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHRhZyA9IHt9IGFzIEpzZG9jVGFnSW50ZXJmYWNlO1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnR5cGUgPSBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgPSBqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQudGFnID0gdGFnO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY0V4YW1wbGVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxjYXB0aW9uPi9nLCAnPGI+PGk+JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwvY2FwdGlvbj4vZywgJy9iPjwvaT4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29udGV4dC50YWdzID0gdGFncztcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBKc2RvY1RhZ0ludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvanNkb2MtdGFnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1BhcmFtc1ZhbGlkSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwganNkb2NUYWdzOiBKc2RvY1RhZ0ludGVyZmFjZVtdLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0ganNkb2NUYWdzLmxlbmd0aDtcbiAgICAgICAgbGV0IHRhZ3MgPSBbXTtcbiAgICAgICAgbGV0IHZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncGFyYW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IGtpbmRUb1R5cGUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9raW5kLXRvLXR5cGUnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NQYXJhbXNIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoXG4gICAgICAgIGNvbnRleHQ6IGFueSxcbiAgICAgICAganNkb2NUYWdzOiBBcnJheTxKc2RvY1RhZ0ludGVyZmFjZSB8IGFueT4sXG4gICAgICAgIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9uc1xuICAgICkge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ3BhcmFtJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnID0ge30gYXMgSnNkb2NUYWdJbnRlcmZhY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24gJiYganNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnR5cGUgPSBraW5kVG9UeXBlKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24gJiYganNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnR5cGUgPSBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGpzZG9jVGFnc1tpXS50eXBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmNvbW1lbnQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmRlZmF1bHRWYWx1ZSA9IGpzZG9jVGFnc1tpXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLm5hbWUudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lID0ganNkb2NUYWdzW2ldLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgPSBqc2RvY1RhZ3NbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAodGFnIGFzIGFueSkub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRhZ3MucHVzaCh0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgY29udGV4dC50YWdzID0gdGFncztcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1JldHVybnNDb21tZW50SGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwganNkb2NUYWdzOiBBcnJheTxhbnk+LCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0ganNkb2NUYWdzLmxlbmd0aDtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAganNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ3JldHVybnMnIHx8XG4gICAgICAgICAgICAgICAgICAgIGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdyZXR1cm4nXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpzZG9jVGFnc1tpXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgQW5ndWxhclZlcnNpb25VdGlsIGZyb20gJy4uLy4uLy4uL3V0aWxzL2FuZ3VsYXItdmVyc2lvbi51dGlsJztcbmltcG9ydCBCYXNpY1R5cGVVdGlsIGZyb20gJy4uLy4uLy4uL3V0aWxzL2Jhc2ljLXR5cGUudXRpbCc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIExpbmtUeXBlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgbmFtZTogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IF9yZXN1bHQgPSBEZXBlbmRlbmNpZXNFbmdpbmUuZmluZChuYW1lKTtcbiAgICAgICAgbGV0IGFuZ3VsYXJEb2NQcmVmaXggPSBBbmd1bGFyVmVyc2lvblV0aWwucHJlZml4T2ZmaWNpYWxEb2MoXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICk7XG4gICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUgPSB7XG4gICAgICAgICAgICAgICAgcmF3OiBuYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKF9yZXN1bHQuc291cmNlID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuZGF0YS50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YS50eXBlID0gJ2NsYXNzZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmID0gJy4uLycgKyBfcmVzdWx0LmRhdGEudHlwZSArICdzLycgKyBfcmVzdWx0LmRhdGEubmFtZSArICcuaHRtbCc7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnIHx8XG4gICAgICAgICAgICAgICAgICAgIChfcmVzdWx0LmRhdGEuY3R5cGUgJiYgX3Jlc3VsdC5kYXRhLmN0eXBlID09PSAnbWlzY2VsbGFuZW91cycpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYWlucGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9yZXN1bHQuZGF0YS5zdWJ0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICdlbnVtZXJhdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ2Z1bmN0aW9ucyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0eXBlYWxpYXMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ3R5cGVhbGlhc2VzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhcmlhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICd2YXJpYWJsZXMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmID1cbiAgICAgICAgICAgICAgICAgICAgICAgICcuLi8nICsgX3Jlc3VsdC5kYXRhLmN0eXBlICsgJy8nICsgbWFpbnBhZ2UgKyAnLmh0bWwjJyArIF9yZXN1bHQuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUudGFyZ2V0ID0gJ19zZWxmJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSBgaHR0cHM6Ly8ke2FuZ3VsYXJEb2NQcmVmaXh9YW5ndWxhci5pby8ke19yZXN1bHQuZGF0YS5wYXRofWA7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChCYXNpY1R5cGVVdGlsLmlzS25vd25UeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUgPSB7XG4gICAgICAgICAgICAgICAgcmF3OiBuYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29udGV4dC50eXBlLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSBCYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwobmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgY2xhc3MgTW9kaWZJY29uSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwga2luZDogU3ludGF4S2luZCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBfa2luZFRleHQgPSAnJztcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2xvY2snOyAvLyBwcml2YXRlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnbG9jayc7IC8vIHByb3RlY3RlZFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ3Jlc2V0JzsgLy8gc3RhdGljXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnZXhwb3J0JzsgLy8gZXhwb3J0XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdyZXNldCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9raW5kVGV4dDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuXG5pbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIE1vZGlmS2luZEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gU3ludGF4S2luZCBpbnRvIHN0cmluZ1xuICAgICAqIEBwYXJhbSAge2FueX0gICAgICAgICAgIGNvbnRleHQgSGFuZGxlYmFycyBjb250ZXh0XG4gICAgICogQHBhcmFtICB7U3ludGF4S2luZFtdfSBraW5kICBTeW50YXhLaW5kIGNvbmNhdGVuYXRlZFxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgUGFyc2VkIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwga2luZDogU3ludGF4S2luZFtdKSB7XG4gICAgICAgIGxldCBfa2luZFRleHQgPSAnJztcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1ByaXZhdGUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnUmVhZG9ubHknO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1Byb3RlY3RlZCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHVibGljS2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnUHVibGljJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdTdGF0aWMnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkFzeW5jS2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnQXN5bmMnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkFic3RyYWN0S2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnQWJzdHJhY3QnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKF9raW5kVGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RMZW5ndGhIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBvYmo6IE9iamVjdCwgb3BlcmF0b3I6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zID0gYXJndW1lbnRzW2xlbl07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNpemUgPSAwLFxuICAgICAgICAgICAga2V5O1xuICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHNpemUrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSA9PT0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnIT09JzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBzaXplICE9PSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBzaXplID4gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGVscGVyIHt7b2JqZWN0TGVuZ3RofX06IGludmFsaWQgb3BlcmF0b3I6IGAnICsgb3BlcmF0b3IgKyAnYCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuZXhwb3J0IGNsYXNzIE9iamVjdEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICB0ZXh0ID0gSlNPTi5zdHJpbmdpZnkodGV4dCk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL3tcIi8sICd7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wiJyk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyxcIi8sICcsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wiJyk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL30kLywgJzxicj59Jyk7XG4gICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgT25lUGFyYW1ldGVySGFzSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGFncywgdHlwZVRvQ2hlY2spOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGxldCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyA9IGFyZ3VtZW50c1tsZW5dO1xuXG4gICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgIGxlbmcgPSB0YWdzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW5nOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFnc1tpXVt0eXBlVG9DaGVja10gIT09ICd1bmRlZmluZWQnICYmIHRhZ3NbaV1bdHlwZVRvQ2hlY2tdICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9yTGVuZ3RoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSAvKiBhbnksIGFueSwgLi4uLCBvcHRpb25zICovKSB7XG4gICAgICAgIGxldCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyA9IGFyZ3VtZW50c1tsZW5dO1xuXG4gICAgICAgIC8vIFdlIHN0YXJ0IGF0IDEgYmVjYXVzZSBvZiBvcHRpb25zXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhhcmd1bWVudHNbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9ySGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSAvKiBhbnksIGFueSwgLi4uLCBvcHRpb25zICovKSB7XG4gICAgICAgIGxldCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyA9IGFyZ3VtZW50c1tsZW5dO1xuXG4gICAgICAgIC8vIFdlIHN0YXJ0IGF0IDEgYmVjYXVzZSBvZiBvcHRpb25zXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZXh0cmFjdExlYWRpbmdUZXh0LCBzcGxpdExpbmtUZXh0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbGluay1wYXJzZXInO1xuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIFBhcnNlRGVzY3JpcHRpb25IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBkZXNjcmlwdGlvbjogc3RyaW5nLCBkZXB0aDogbnVtYmVyKSB7XG4gICAgICAgIGxldCB0YWdSZWdFeHBMaWdodCA9IG5ldyBSZWdFeHAoJ1xcXFx7QGxpbmtcXFxccysoKD86LnxcXG4pKz8pXFxcXH0nLCAnaScpO1xuICAgICAgICBsZXQgdGFnUmVnRXhwRnVsbCA9IG5ldyBSZWdFeHAoJ1xcXFx7QGxpbmtcXFxccysoKD86LnxcXG4pKz8pXFxcXH0nLCAnaScpO1xuICAgICAgICBsZXQgdGFnUmVnRXhwO1xuICAgICAgICBsZXQgbWF0Y2hlcztcbiAgICAgICAgbGV0IHByZXZpb3VzU3RyaW5nO1xuICAgICAgICBsZXQgdGFnSW5mbyA9IFtdO1xuXG4gICAgICAgIHRhZ1JlZ0V4cCA9IGRlc2NyaXB0aW9uLmluZGV4T2YoJ117JykgIT09IC0xID8gdGFnUmVnRXhwRnVsbCA6IHRhZ1JlZ0V4cExpZ2h0O1xuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NUaGVMaW5rID0gKG9yaWdpbmFsRGVzY3JpcHRpb24sIG1hdGNoZWRUYWcsIGxlYWRpbmdUZXh0KSA9PiB7XG4gICAgICAgICAgICBsZXQgbGVhZGluZyA9IGV4dHJhY3RMZWFkaW5nVGV4dChvcmlnaW5hbERlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnKTtcbiAgICAgICAgICAgIGxldCBzcGxpdDtcbiAgICAgICAgICAgIGxldCByZXN1bHRJbkNvbXBvZG9jO1xuICAgICAgICAgICAgbGV0IG5ld0xpbms7XG4gICAgICAgICAgICBsZXQgcm9vdFBhdGg7XG4gICAgICAgICAgICBsZXQgc3RyaW5ndG9SZXBsYWNlO1xuICAgICAgICAgICAgbGV0IGFuY2hvciA9ICcnO1xuICAgICAgICAgICAgbGV0IGxhYmVsO1xuICAgICAgICAgICAgbGV0IHBhZ2VOYW1lO1xuXG4gICAgICAgICAgICBzcGxpdCA9IHNwbGl0TGlua1RleHQobWF0Y2hlZFRhZy50ZXh0KTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jID0gRGVwZW5kZW5jaWVzRW5naW5lLmZpbmRJbkNvbXBvZG9jKHNwbGl0LnRhcmdldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gbWF0Y2hlZFRhZy50ZXh0O1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkVGFnLnRleHQuaW5kZXhPZignIycpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBtYXRjaGVkVGFnLnRleHQuc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRhZy50ZXh0LmluZGV4T2YoJyMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUYWcudGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IG1hdGNoZWRUYWcudGV4dC5zdWJzdHIoMCwgbWF0Y2hlZFRhZy50ZXh0LmluZGV4T2YoJyMnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdEluQ29tcG9kb2MgPSBEZXBlbmRlbmNpZXNFbmdpbmUuZmluZEluQ29tcG9kb2MoaW5mbyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHRJbkNvbXBvZG9jKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSByZXN1bHRJbkNvbXBvZG9jLm5hbWU7XG4gICAgICAgICAgICAgICAgcGFnZU5hbWUgPSByZXN1bHRJbkNvbXBvZG9jLm5hbWU7XG5cbiAgICAgICAgICAgICAgICBpZiAobGVhZGluZ1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZ1RleHQgKyAnXScgKyBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVhZGluZy5sZWFkaW5nVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmcubGVhZGluZ1RleHQgKyAnXScgKyBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdEluQ29tcG9kb2MudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGUgPSAnY2xhc3Nlcyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID09PSAnbWlzY2VsbGFuZW91cycgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdEluQ29tcG9kb2MuY3R5cGUgJiYgcmVzdWx0SW5Db21wb2RvYy5jdHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGUgPSAnbWlzY2VsbGFuZW91cyc7IC8vIE5vdCBhIHR5cG8sIGl0IGlzIGZvciBtYXRjaGluZyBvdGhlciBzaW5nbGUgdHlwZXMgOiBjb21wb25lbnQsIG1vZHVsZSBldGNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXN1bHRJbkNvbXBvZG9jLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvciA9ICcjJyArIHJlc3VsdEluQ29tcG9kb2MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICdlbnVtZXJhdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAnZnVuY3Rpb25zJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRJbkNvbXBvZG9jLnN1YnR5cGUgPT09ICd0eXBlYWxpYXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICd0eXBlYWxpYXNlcyc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0SW5Db21wb2RvYy5zdWJ0eXBlID09PSAndmFyaWFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICd2YXJpYWJsZXMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnJztcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnLi8nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnLi4vJy5yZXBlYXQoZGVwdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGxlYWRpbmcubGVhZGluZ1RleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gc3BsaXQubGlua1RleHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGUgPT09ICdtaXNjZWxsYW5lb3VzJyB8fFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGUgPT09ICdjbGFzc2VzJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBuZXdMaW5rID0gYDxhIGhyZWY9XCIke3Jvb3RQYXRofSR7cmVzdWx0SW5Db21wb2RvYy50eXBlfS8ke3BhZ2VOYW1lfS5odG1sJHthbmNob3J9XCI+JHtsYWJlbH08L2E+YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdMaW5rID0gYDxhIGhyZWY9XCIke3Jvb3RQYXRofSR7cmVzdWx0SW5Db21wb2RvYy50eXBlfXMvJHtwYWdlTmFtZX0uaHRtbCR7YW5jaG9yfVwiPiR7bGFiZWx9PC9hPmA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGVzY3JpcHRpb24ucmVwbGFjZShzdHJpbmd0b1JlcGxhY2UsIG5ld0xpbmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzdWx0SW5Db21wb2RvYyAmJiB0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtzcGxpdC5saW5rVGV4dH08L2E+YDtcbiAgICAgICAgICAgICAgICBpZiAobGVhZGluZ1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZ1RleHQgKyAnXScgKyBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVhZGluZy5sZWFkaW5nVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmcubGVhZGluZ1RleHQgKyAnXScgKyBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uLnJlcGxhY2Uoc3RyaW5ndG9SZXBsYWNlLCBuZXdMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdEluQ29tcG9kb2MgJiYgbGVhZGluZyAmJiB0eXBlb2YgbGVhZGluZy5sZWFkaW5nVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBuZXdMaW5rID0gYDxhIGhyZWY9XCIke3NwbGl0LnRhcmdldH1cIj4ke2xlYWRpbmcubGVhZGluZ1RleHR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHRJbkNvbXBvZG9jICYmIHR5cGVvZiBzcGxpdC5saW5rVGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBuZXdMaW5rID0gYDxhIGhyZWY9XCIke3NwbGl0LnRhcmdldH1cIj4ke3NwbGl0LnRhcmdldH08L2E+YDtcbiAgICAgICAgICAgICAgICBpZiAobGVhZGluZ1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZ1RleHQgKyAnXScgKyBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVhZGluZy5sZWFkaW5nVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmcubGVhZGluZ1RleHQgKyAnXScgKyBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uLnJlcGxhY2Uoc3RyaW5ndG9SZXBsYWNlLCBuZXdMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGVzY3JpcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZU1hdGNoKHJlcGxhY2VyLCB0YWcsIG1hdGNoLCB0ZXh0LCBsaW5rVGV4dD8pIHtcbiAgICAgICAgICAgIGxldCBtYXRjaGVkVGFnID0ge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlVGFnOiBtYXRjaCxcbiAgICAgICAgICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGFnSW5mby5wdXNoKG1hdGNoZWRUYWcpO1xuXG4gICAgICAgICAgICBpZiAobGlua1RleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZXIoZGVzY3JpcHRpb24sIG1hdGNoZWRUYWcsIGxpbmtUZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGRlc2NyaXB0aW9uLCBtYXRjaGVkVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuIGRlc2NyaXB0aW9uIGZvciBtYXJrZWQgYSB0YWcgcGFyc2VkIHRvbyBlYXJseVxuXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbi5pbmRleE9mKCdocmVmPScpICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IGluc2lkZU1hcmtlZEFUYWdSZXN1bHRzID0gZGVzY3JpcHRpb24ubWF0Y2goLzxhIFtePl0rPihbXjxdKyk8XFwvYT4vZyk7XG5cbiAgICAgICAgICAgIGlmIChpbnNpZGVNYXJrZWRBVGFnUmVzdWx0cyAmJiBpbnNpZGVNYXJrZWRBVGFnUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnNpZGVNYXJrZWRBVGFnUmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2VkQVRhZ1JlZ0V4cCA9IG5ldyBSZWdFeHAoJzxhIFtePl0rPihbXjxdKyk8L2E+JywgJ2dtJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWRBVGFnID0gbWFya2VkQVRhZ1JlZ0V4cC5leGVjKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZEFUYWcgJiYgcGFyc2VkQVRhZy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnNpZGVNYXJrZWRBVGFnID0gcGFyc2VkQVRhZ1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBge0BsaW5rIDxhIGhyZWY9XCIke2VuY29kZVVSSShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlTWFya2VkQVRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XCI+JHtpbnNpZGVNYXJrZWRBVGFnfTwvYT5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB7QGxpbmsgJHtpbnNpZGVNYXJrZWRBVGFnfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBtYXRjaGVzID0gdGFnUmVnRXhwLmV4ZWMoZGVzY3JpcHRpb24pO1xuXG4gICAgICAgICAgICAvLyBEaWQgd2UgaGF2ZSB7QGxpbmsgP1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0cmluZyA9IGRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHJlcGxhY2VNYXRjaChwcm9jZXNzVGhlTGluaywgJ2xpbmsnLCBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcmVwbGFjZU1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RoZUxpbmssXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGluaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1syXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbMV1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG1hdGNoZXMgJiYgcHJldmlvdXNTdHJpbmcgIT09IGRlc2NyaXB0aW9uKTtcblxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuZXhwb3J0IGNsYXNzIFBhcnNlUHJvcGVydHlIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHByb3A6IGFueSA9IHRleHQ7XG5cbiAgICAgICAgaWYgKCEhdGV4dCAmJiB0ZXh0LmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgdGV4dFsndXJsJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcHJvcCA9IHRleHRbJ3VybCddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEhdGV4dCAmJiB0ZXh0LmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgdGV4dFsnbmFtZSddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHByb3AgPSB0ZXh0WyduYW1lJ107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISF0ZXh0ICYmIHRleHQuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJiBPYmplY3Qua2V5cyh0ZXh0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHByb3AgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgU3RyaW5nICYmIHByb3AgIT09ICcnICYmIHByb3AuaW5kZXhPZignaHR0cHMnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBgPGEgaHJlZj1cIiR7cHJvcH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke3Byb3B9PC9hPmA7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcCAhPT0gJycgJiYgcHJvcCBpbnN0YW5jZW9mIEFycmF5ICYmIHByb3AubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcHJvcCA9IEpTT04uc3RyaW5naWZ5KHByb3ApO1xuICAgICAgICAgICAgcHJvcCA9IHByb3AucmVwbGFjZSgvXCIsXCIvZywgJywgJyk7XG4gICAgICAgICAgICBwcm9wID0gcHJvcC5yZXBsYWNlKC9cXFtcIi9nLCAnJyk7XG4gICAgICAgICAgICBwcm9wID0gcHJvcC5yZXBsYWNlKC9cIl0vZywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlVVJMSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgY3VycmVudERlcHRoOiBudW1iZXIsIG9wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnREZXB0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiAnLi8nO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHJldHVybiAnLi4vJy5yZXBlYXQoY3VycmVudERlcHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBTaG9ydFVSTEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHVybDogc3RyaW5nLCBvcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG5ld1VybCA9IHVybDtcbiAgICAgICAgbGV0IGZpcnN0SW5kZXhPZlNsYXNoID0gbmV3VXJsLmluZGV4T2YoJy8nKTtcbiAgICAgICAgbGV0IGxhc3RJbmRleE9mU2xhc2ggPSBuZXdVcmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0SW5kZXhPZlNsYXNoICE9PSAtMSB8fCBsYXN0SW5kZXhPZlNsYXNoICE9PSAtMSkge1xuICAgICAgICAgICAgbmV3VXJsID1cbiAgICAgICAgICAgICAgICBuZXdVcmwuc3Vic3RyKDAsIGZpcnN0SW5kZXhPZlNsYXNoICsgMSkgK1xuICAgICAgICAgICAgICAgICcuLi4nICtcbiAgICAgICAgICAgICAgICBuZXdVcmwuc3Vic3RyKGxhc3RJbmRleE9mU2xhc2gsIG5ld1VybC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdVcmw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgU3RyaXBVUkxIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBwcmVmaXg6IHN0cmluZywgdXJsOiBzdHJpbmcsIG9wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgdXJsLnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICB9XG59IiwiaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQnJlYWtDb21tYUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtMaW5lc0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1saW5lcy5oZWxwZXInO1xuaW1wb3J0IHsgQ2FwaXRhbGl6ZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jYXBpdGFsaXplLmhlbHBlcic7XG5pbXBvcnQgeyBDbGVhblBhcmFncmFwaEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jbGVhbi1wYXJhZ3JhcGguaGVscGVyJztcbmltcG9ydCB7IENvbXBhcmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvY29tcGFyZS5oZWxwZXInO1xuaW1wb3J0IHsgRGVidWdIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZGVidWcuaGVscGVyJztcbmltcG9ydCB7IEVsZW1lbnRBbG9uZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9lbGVtZW50LWFsb25lLmhlbHBlcic7XG5pbXBvcnQgeyBFc2NhcGVTaW1wbGVRdW90ZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9lc2NhcGUtc2ltcGxlLXF1b3RlLmhlbHBlcic7XG5pbXBvcnQgeyBGaWx0ZXJBbmd1bGFyMk1vZHVsZXNIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZmlsdGVyLWFuZ3VsYXIyLW1vZHVsZXMuaGVscGVyJztcbmltcG9ydCB7IEZ1bmN0aW9uU2lnbmF0dXJlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2Z1bmN0aW9uLXNpZ25hdHVyZS5oZWxwZXInO1xuaW1wb3J0IHsgSGFzT3duSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2hhcy1vd24uaGVscGVyJztcbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSTE4bkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pMThuLmhlbHBlcic7XG5pbXBvcnQgeyBJZlN0cmluZ0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pZi1zdHJpbmcuaGVscGVyJztcbmltcG9ydCB7IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pbmRleGFibGUtc2lnbmF0dXJlLmhlbHBlcic7XG5pbXBvcnQgeyBJc0luaXRpYWxUYWJIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtaW5pdGlhbC10YWIuaGVscGVyJztcbmltcG9ydCB7IElzTm90VG9nZ2xlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLW5vdC10b2dnbGUuaGVscGVyJztcbmltcG9ydCB7IElzVGFiRW5hYmxlZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pcy10YWItZW5hYmxlZC5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NDb2RlRXhhbXBsZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1jb2RlLWV4YW1wbGUuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jRGVmYXVsdEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlcic7XG5pbXBvcnQgeyBKc2RvY0V4YW1wbGVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtZXhhbXBsZS5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NQYXJhbXNWYWxpZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1wYXJhbXMtdmFsaWQuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jUGFyYW1zSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NSZXR1cm5zQ29tbWVudEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1yZXR1cm5zLWNvbW1lbnQuaGVscGVyJztcbmltcG9ydCB7IExpbmtUeXBlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2xpbmstdHlwZS5oZWxwZXInO1xuaW1wb3J0IHsgTW9kaWZJY29uSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWljb24uaGVscGVyJztcbmltcG9ydCB7IE1vZGlmS2luZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1raW5kLWhlbHBlcic7XG5pbXBvcnQgeyBPYmplY3RMZW5ndGhIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LWxlbmd0aC5oZWxwZXInO1xuaW1wb3J0IHsgT2JqZWN0SGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29iamVjdC5oZWxwZXInO1xuaW1wb3J0IHsgT25lUGFyYW1ldGVySGFzSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29uZS1wYXJhbWV0ZXItaGFzLmhlbHBlcic7XG5pbXBvcnQgeyBPckxlbmd0aEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9vci1sZW5ndGguaGVscGVyJztcbmltcG9ydCB7IE9ySGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29yLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJzZURlc2NyaXB0aW9uSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLWRlc2NyaXB0aW9uLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJzZVByb3BlcnR5SGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLXByb3BlcnR5LmhlbHBlcic7XG5pbXBvcnQgeyBSZWxhdGl2ZVVSTEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9yZWxhdGl2ZS11cmwuaGVscGVyJztcbmltcG9ydCB7IFNob3J0VVJMSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXInO1xuaW1wb3J0IHsgU3RyaXBVUkxIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvc3RyaXAtdXJsLmhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBIdG1sRW5naW5lSGVscGVycyB7XG4gICAgcHVibGljIHJlZ2lzdGVySGVscGVycyhiYXJzKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2NvbXBhcmUnLCBuZXcgQ29tcGFyZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb3InLCBuZXcgT3JIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2Z1bmN0aW9uU2lnbmF0dXJlJywgbmV3IEZ1bmN0aW9uU2lnbmF0dXJlSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpc05vdFRvZ2dsZScsIG5ldyBJc05vdFRvZ2dsZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaXNJbml0aWFsVGFiJywgbmV3IElzSW5pdGlhbFRhYkhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaXNUYWJFbmFibGVkJywgbmV3IElzVGFiRW5hYmxlZEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaWZTdHJpbmcnLCBuZXcgSWZTdHJpbmdIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29yTGVuZ3RoJywgbmV3IE9yTGVuZ3RoSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdmaWx0ZXJBbmd1bGFyMk1vZHVsZXMnLCBuZXcgRmlsdGVyQW5ndWxhcjJNb2R1bGVzSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdkZWJ1ZycsIG5ldyBEZWJ1Z0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnYnJlYWtsaW5lcycsIG5ldyBCcmVha0xpbmVzSGVscGVyKGJhcnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnY2xlYW4tcGFyYWdyYXBoJywgbmV3IENsZWFuUGFyYWdyYXBoSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdlc2NhcGVTaW1wbGVRdW90ZScsIG5ldyBFc2NhcGVTaW1wbGVRdW90ZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnYnJlYWtDb21tYScsIG5ldyBCcmVha0NvbW1hSGVscGVyKGJhcnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnbW9kaWZLaW5kJywgbmV3IE1vZGlmS2luZEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnbW9kaWZJY29uJywgbmV3IE1vZGlmSWNvbkhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAncmVsYXRpdmVVUkwnLCBuZXcgUmVsYXRpdmVVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLXJldHVybnMtY29tbWVudCcsIG5ldyBKc2RvY1JldHVybnNDb21tZW50SGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdqc2RvYy1jb2RlLWV4YW1wbGUnLCBuZXcgSnNkb2NDb2RlRXhhbXBsZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtZXhhbXBsZScsIG5ldyBKc2RvY0V4YW1wbGVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLXBhcmFtcycsIG5ldyBKc2RvY1BhcmFtc0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtcGFyYW1zLXZhbGlkJywgbmV3IEpzZG9jUGFyYW1zVmFsaWRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLWRlZmF1bHQnLCBuZXcgSnNkb2NEZWZhdWx0SGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdsaW5rVHlwZScsIG5ldyBMaW5rVHlwZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaW5kZXhhYmxlU2lnbmF0dXJlJywgbmV3IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb2JqZWN0JywgbmV3IE9iamVjdEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb2JqZWN0TGVuZ3RoJywgbmV3IE9iamVjdExlbmd0aEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAncGFyc2VEZXNjcmlwdGlvbicsIG5ldyBQYXJzZURlc2NyaXB0aW9uSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdvbmUtcGFyYW1ldGVyLWhhcycsIG5ldyBPbmVQYXJhbWV0ZXJIYXNIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2VsZW1lbnQtYWxvbmUnLCBuZXcgRWxlbWVudEFsb25lSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdoYXNPd24nLCBuZXcgSGFzT3duSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdzaG9ydC11cmwnLCBuZXcgU2hvcnRVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3N0cmlwLXVybCcsIG5ldyBTdHJpcFVSTEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAndCcsIG5ldyBJMThuSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdjYXBpdGFsaXplJywgbmV3IENhcGl0YWxpemVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3BhcnNlLXByb3BlcnR5JywgbmV3IFBhcnNlUHJvcGVydHlIZWxwZXIoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlckhlbHBlcihiYXJzLCBrZXk6IHN0cmluZywgaGVscGVyOiBJSHRtbEVuZ2luZUhlbHBlcikge1xuICAgICAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKGtleSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5oZWxwZXJGdW5jLmFwcGx5KGhlbHBlciwgW3RoaXMsIC4uLl8uc2xpY2UoYXJndW1lbnRzIGFzIGFueSldKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcbmltcG9ydCB7IEh0bWxFbmdpbmVIZWxwZXJzIH0gZnJvbSAnLi9odG1sLmVuZ2luZS5oZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEh0bWxFbmdpbmUge1xuICAgIHByaXZhdGUgY2FjaGU6IHsgcGFnZTogc3RyaW5nIH0gPSB7fSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBjb21waWxlZFBhZ2U7XG5cbiAgICBwcml2YXRlIHByZWNvbXBpbGVkTWVudTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBIdG1sRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGhlbHBlciA9IG5ldyBIdG1sRW5naW5lSGVscGVycygpO1xuICAgICAgICBoZWxwZXIucmVnaXN0ZXJIZWxwZXJzKEhhbmRsZWJhcnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUh0bWxFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEh0bWxFbmdpbmUuaW5zdGFuY2UgPSBuZXcgSHRtbEVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIdG1sRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KHRlbXBsYXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxzID0gW1xuICAgICAgICAgICAgJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICdtYXJrZG93bicsXG4gICAgICAgICAgICAnbW9kdWxlcycsXG4gICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICdjb21wb25lbnQnLFxuICAgICAgICAgICAgJ2NvbnRyb2xsZXInLFxuICAgICAgICAgICAgJ2VudGl0eScsXG4gICAgICAgICAgICAnY29tcG9uZW50LWRldGFpbCcsXG4gICAgICAgICAgICAnZGlyZWN0aXZlJyxcbiAgICAgICAgICAgICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICdpbnRlcmNlcHRvcicsXG4gICAgICAgICAgICAnZ3VhcmQnLFxuICAgICAgICAgICAgJ3BpcGUnLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdpbnRlcmZhY2UnLFxuICAgICAgICAgICAgJ3JvdXRlcycsXG4gICAgICAgICAgICAnaW5kZXgnLFxuICAgICAgICAgICAgJ2luZGV4LW1pc2MnLFxuICAgICAgICAgICAgJ3NlYXJjaC1yZXN1bHRzJyxcbiAgICAgICAgICAgICdzZWFyY2gtaW5wdXQnLFxuICAgICAgICAgICAgJ2xpbmstdHlwZScsXG4gICAgICAgICAgICAnYmxvY2stbWV0aG9kJyxcbiAgICAgICAgICAgICdibG9jay1ob3N0LWxpc3RlbmVyJyxcbiAgICAgICAgICAgICdibG9jay1lbnVtJyxcbiAgICAgICAgICAgICdibG9jay1wcm9wZXJ0eScsXG4gICAgICAgICAgICAnYmxvY2staW5kZXgnLFxuICAgICAgICAgICAgJ2Jsb2NrLWNvbnN0cnVjdG9yJyxcbiAgICAgICAgICAgICdibG9jay10eXBlYWxpYXMnLFxuICAgICAgICAgICAgJ2Jsb2NrLWFjY2Vzc29ycycsXG4gICAgICAgICAgICAnYmxvY2staW5wdXQnLFxuICAgICAgICAgICAgJ2Jsb2NrLW91dHB1dCcsXG4gICAgICAgICAgICAnY292ZXJhZ2UtcmVwb3J0JyxcbiAgICAgICAgICAgICd1bml0LXRlc3QtcmVwb3J0JyxcbiAgICAgICAgICAgICdtaXNjZWxsYW5lb3VzLWZ1bmN0aW9ucycsXG4gICAgICAgICAgICAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtdHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtZW51bWVyYXRpb25zJyxcbiAgICAgICAgICAgICdhZGRpdGlvbmFsLXBhZ2UnLFxuICAgICAgICAgICAgJ3BhY2thZ2UtZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICdwYWNrYWdlLXByb3BlcnRpZXMnXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZW1wbGF0ZVBhdGgpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBGaWxlRW5naW5lLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIHRlbXBsYXRlUGF0aCkpID09PVxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlIHBhdGggc3BlY2lmaWNlZCBidXQgZG9lcyBub3QgZXhpc3QuLi51c2luZyBkZWZhdWx0IHRlbXBsYXRlcydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgcGFydGlhbHMubWFwKHBhcnRpYWwgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0aWFsUGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICdwYXJ0aWFscy8nICsgcGFydGlhbCArICcuaGJzJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KHBhcnRpYWxQYXRoKS50aGVuKGRhdGEgPT5cbiAgICAgICAgICAgICAgICAgICAgSGFuZGxlYmFycy5yZWdpc3RlclBhcnRpYWwocGFydGlhbCwgZGF0YSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYWdlUGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhZ2UuaGJzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KHBhZ2VQYXRoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlLnBhZ2UgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBpbGVkUGFnZSA9IEhhbmRsZWJhcnMuY29tcGlsZSh0aGlzLmNhY2hlLnBhZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRJbmRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBtZW51UGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhcnRpYWxzL21lbnUuaGJzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KG1lbnVQYXRoKS50aGVuKG1lbnVUZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlY29tcGlsZWRNZW51ID0gSGFuZGxlYmFycy5jb21waWxlKG1lbnVUZW1wbGF0ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudEluZGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXJNZW51KHRlbXBsYXRlUGF0aCwgZGF0YSkge1xuICAgICAgICBsZXQgbWVudVBhdGggPSB0aGlzLmRldGVybWluZVRlbXBsYXRlUGF0aCh0ZW1wbGF0ZVBhdGgsICdwYXJ0aWFscy9tZW51LmhicycpO1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQobWVudVBhdGgpLnRoZW4obWVudVRlbXBsYXRlID0+IHtcbiAgICAgICAgICAgIGRhdGEubWVudSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMuY29tcGlsZShtZW51VGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50SW5kZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZVxuICAgICAgICAgICAgfSkoeyAuLi5kYXRhIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKG1haW5EYXRhOiBhbnksIHBhZ2U6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBvID0gbWFpbkRhdGE7XG4gICAgICAgIChPYmplY3QgYXMgYW55KS5hc3NpZ24obywgcGFnZSk7XG5cbiAgICAgICAgLy8gbGV0IG1lbSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYGhlYXBUb3RhbDogJHttZW0uaGVhcFRvdGFsfSB8IGhlYXBVc2VkOiAke21lbS5oZWFwVXNlZH1gKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlZFBhZ2Uoe1xuICAgICAgICAgICAgZGF0YTogb1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBkZXRlcm1pbmVUZW1wbGF0ZVBhdGgodGVtcGxhdGVQYXRoOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgb3V0UGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUgKyAnLy4uL3NyYy90ZW1wbGF0ZXMvJyArIGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKHRlbXBsYXRlUGF0aCkge1xuICAgICAgICAgICAgbGV0IHRlc3RQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIHRlbXBsYXRlUGF0aCArIHBhdGguc2VwICsgZmlsZVBhdGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvdXRQYXRoID0gRmlsZUVuZ2luZS5leGlzdHNTeW5jKHRlc3RQYXRoKSA/IHRlc3RQYXRoIDogb3V0UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0UGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVDb3ZlcmFnZUJhZGdlKG91dHB1dEZvbGRlciwgbGFiZWwsIGNvdmVyYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQoXG4gICAgICAgICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzL3BhcnRpYWxzL2NvdmVyYWdlLWJhZGdlLmhicycpXG4gICAgICAgICkudGhlbihcbiAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZTogYW55ID0gSGFuZGxlYmFycy5jb21waWxlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5sYWJlbCA9IGxhYmVsO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0ZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGNvdmVyYWdlRGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgPSBvdXRwdXRGb2xkZXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS53cml0ZShcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnL2ltYWdlcy9jb3ZlcmFnZS1iYWRnZS0nICsgbGFiZWwgKyAnLnN2ZycsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgY292ZXJhZ2UgYmFkZ2UgJyArIGxhYmVsICsgJyBmaWxlIGdlbmVyYXRpb24gJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyID0+IFByb21pc2UucmVqZWN0KCdFcnJvciBkdXJpbmcgY292ZXJhZ2UgYmFkZ2UgZ2VuZXJhdGlvbicpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIdG1sRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgZGVjYWNoZSA9IHJlcXVpcmUoJ2RlY2FjaGUnKTtcblxuZXhwb3J0IGludGVyZmFjZSBtYXJrZG93blJlYWRlZERhdGFzIHtcbiAgICBtYXJrZG93bjogc3RyaW5nO1xuICAgIHJhd0RhdGE6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hcmtkb3duRW5naW5lIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIG1hcmtkb3duIGZpbGVzIHdpdGhvdXQgLm1kIGV4dGVuc2lvblxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFya2Rvd25GaWxlcyA9IFsnUkVBRE1FJywgJ0NIQU5HRUxPRycsICdMSUNFTlNFJywgJ0NPTlRSSUJVVElORycsICdUT0RPJ107XG5cbiAgICBwcml2YXRlIG1hcmtlZEluc3RhbmNlO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE1hcmtkb3duRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGRlY2FjaGUoJ21hcmtlZCcpO1xuICAgICAgICBjb25zdCB7IG1hcmtlZCB9ID0gcmVxdWlyZSgnbWFya2VkJyk7XG4gICAgICAgIHRoaXMubWFya2VkSW5zdGFuY2UgPSBtYXJrZWQ7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgdGhpcy5tYXJrZWRJbnN0YW5jZS5SZW5kZXJlcigpO1xuICAgICAgICByZW5kZXJlci5jb2RlID0gKGNvZGUsIGxhbmd1YWdlKSA9PiB7XG4gICAgICAgICAgICBsZXQgaGlnaGxpZ2h0ZWQgPSBjb2RlO1xuICAgICAgICAgICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoaWdobGlnaHRlZCA9IHRoaXMuZXNjYXBlKGNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIGA8ZGl2PjxwcmUgY2xhc3M9XCJsaW5lLW51bWJlcnNcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSR7bGFuZ3VhZ2V9XCI+JHtoaWdobGlnaHRlZH08L2NvZGU+PC9wcmU+PC9kaXY+YDtcbiAgICAgICAgfTtcblxuICAgICAgICByZW5kZXJlci50YWJsZSA9IChoZWFkZXIsIGJvZHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgJzx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIGNvbXBvZG9jLXRhYmxlXCI+XFxuJyArXG4gICAgICAgICAgICAgICAgJzx0aGVhZD5cXG4nICtcbiAgICAgICAgICAgICAgICBoZWFkZXIgK1xuICAgICAgICAgICAgICAgICc8L3RoZWFkPlxcbicgK1xuICAgICAgICAgICAgICAgICc8dGJvZHk+XFxuJyArXG4gICAgICAgICAgICAgICAgYm9keSArXG4gICAgICAgICAgICAgICAgJzwvdGJvZHk+XFxuJyArXG4gICAgICAgICAgICAgICAgJzwvdGFibGU+XFxuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZW5kZXJlci5pbWFnZSA9IGZ1bmN0aW9uIChocmVmOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgICAgICAgICAgbGV0IG91dCA9ICc8aW1nIHNyYz1cIicgKyBocmVmICsgJ1wiIGFsdD1cIicgKyB0ZXh0ICsgJ1wiIGNsYXNzPVwiaW1nLXJlc3BvbnNpdmVcIic7XG4gICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB0aXRsZT1cIicgKyB0aXRsZSArICdcIic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJz4nO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm1hcmtlZEluc3RhbmNlLnNldE9wdGlvbnMoe1xuICAgICAgICAgICAgcmVuZGVyZXI6IHJlbmRlcmVyLFxuICAgICAgICAgICAgZ2ZtOiB0cnVlLFxuICAgICAgICAgICAgYnJlYWtzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFNYXJrZG93bkVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgTWFya2Rvd25FbmdpbmUuaW5zdGFuY2UgPSBuZXcgTWFya2Rvd25FbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWFya2Rvd25FbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyYWRpdGlvbmFsTWFya2Rvd24oZmlsZXBhdGg6IHN0cmluZyk6IFByb21pc2U8bWFya2Rvd25SZWFkZWREYXRhcz4ge1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZmlsZXBhdGggKyAnLm1kJylcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gRmlsZUVuZ2luZS5nZXQocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZmlsZXBhdGgpLnRoZW4oKSlcbiAgICAgICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVybmVkRGF0YTogbWFya2Rvd25SZWFkZWREYXRhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2Rvd246IHRoaXMubWFya2VkSW5zdGFuY2UoZGF0YSksXG4gICAgICAgICAgICAgICAgICAgIHJhd0RhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lZERhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhZGl0aW9uYWxNYXJrZG93blN5bmMoZmlsZXBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcmtlZEluc3RhbmNlKEZpbGVFbmdpbmUuZ2V0U3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhZG1lRmlsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgJ1JFQURNRS5tZCcpLnRoZW4oZGF0YSA9PlxuICAgICAgICAgICAgdGhpcy5tYXJrZWRJbnN0YW5jZShkYXRhKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlKTtcbiAgICAgICAgbGV0IHJlYWRtZUZpbGUgPSBkaXJuYW1lICsgcGF0aC5zZXAgKyBwYXRoLmJhc2VuYW1lKGZpbGUsICcudHMnKSArICcubWQnO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHJlYWRtZUZpbGUsICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05laWdoYm91clJlYWRtZUZpbGUoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IGRpcm5hbWUgKyBwYXRoLnNlcCArIHBhdGguYmFzZW5hbWUoZmlsZSwgJy50cycpICsgJy5tZCc7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmV4aXN0c1N5bmMocmVhZG1lRmlsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wb25lbnRSZWFkbWVGaWxlKGZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IGRpcm5hbWUgKyBwYXRoLnNlcCArICdSRUFETUUubWQnO1xuICAgICAgICBsZXQgcmVhZG1lQWx0ZXJuYXRpdmVGaWxlID0gZGlybmFtZSArIHBhdGguc2VwICsgcGF0aC5iYXNlbmFtZShmaWxlLCAnLnRzJykgKyAnLm1kJztcbiAgICAgICAgbGV0IGZpbmFsUGF0aCA9ICcnO1xuICAgICAgICBpZiAoRmlsZUVuZ2luZS5leGlzdHNTeW5jKHJlYWRtZUZpbGUpKSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggPSByZWFkbWVGaWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxQYXRoID0gcmVhZG1lQWx0ZXJuYXRpdmVGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFueSBvZiB0aGUgbWFya2Rvd24gZmlsZXMgaXMgZXhpc3RzIHdpdGggb3Igd2l0aG91dCBlbmRpbmdzXG4gICAgICovXG4gICAgcHVibGljIGhhc1Jvb3RNYXJrZG93bnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEVuZGluZ3ModGhpcy5tYXJrZG93bkZpbGVzKS5zb21lKHggPT5cbiAgICAgICAgICAgIEZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0Um9vdE1hcmtkb3ducygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBmb3VuZEZpbGVzID0gdGhpcy5tYXJrZG93bkZpbGVzLmZpbHRlcihcbiAgICAgICAgICAgIHggPT5cbiAgICAgICAgICAgICAgICBGaWxlRW5naW5lLmV4aXN0c1N5bmMocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgeCArICcubWQnKSB8fFxuICAgICAgICAgICAgICAgIEZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4KVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEVuZGluZ3MoZm91bmRGaWxlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlc2NhcGUoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGh0bWxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvJy9nLCAnJiMzOTsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL0AvZywgJyYjNjQ7Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWydSRUFETUUnXSA9PiBbJ1JFQURNRScsICdSRUFETUUubWQnXVxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkRW5kaW5ncyhmaWxlczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gXy5mbGF0TWFwKGZpbGVzLCB4ID0+IFt4LCB4ICsgJy5tZCddKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcmtkb3duRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgRGVwZW5kZW5jaWVzRW5naW5lIGZyb20gJy4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgbmdkVCA9IHJlcXVpcmUoJ0Bjb21wb2RvYy9uZ2QtdHJhbnNmb3JtZXInKTtcblxuZXhwb3J0IGNsYXNzIE5nZEVuZ2luZSB7XG4gICAgcHVibGljIGVuZ2luZTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBOZ2RFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFOZ2RFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIE5nZEVuZ2luZS5pbnN0YW5jZSA9IG5ldyBOZ2RFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTmdkRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KG91dHB1dHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBuZ2RULkRvdEVuZ2luZSh7XG4gICAgICAgICAgICBvdXRwdXQ6IG91dHB1dHBhdGgsXG4gICAgICAgICAgICBkaXNwbGF5TGVnZW5kOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0Rm9ybWF0czogJ3N2ZycsXG4gICAgICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlckdyYXBoKGZpbGVwYXRoOiBzdHJpbmcsIG91dHB1dHBhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZU91dHB1dChvdXRwdXRwYXRoKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2YnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2VuZXJhdGVHcmFwaChbRGVwZW5kZW5jaWVzRW5naW5lLmdldFJhd01vZHVsZShuYW1lKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLmdlbmVyYXRlR3JhcGgoRGVwZW5kZW5jaWVzRW5naW5lLnJhd01vZHVsZXNGb3JPdmVydmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEdyYXBoKGZpbGVwYXRoOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChmaWxlcGF0aCkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIGdyYXBoIHJlYWQgJyArIG5hbWUpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBOZ2RFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImV4cG9ydCBjb25zdCBDT01QT0RPQ19DT05TVEFOVFMgPSB7XG4gICAgbmF2VGFiRGVmaW5pdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdpbmZvJyxcbiAgICAgICAgICAgIGhyZWY6ICcjaW5mbycsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ2luZm8nLFxuICAgICAgICAgICAgbGFiZWw6ICdJbmZvJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAncmVhZG1lJyxcbiAgICAgICAgICAgIGhyZWY6ICcjcmVhZG1lJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAncmVhZG1lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUkVBRE1FJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnc291cmNlJyxcbiAgICAgICAgICAgIGhyZWY6ICcjc291cmNlJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnc291cmNlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnU291cmNlJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndGVtcGxhdGVEYXRhJyxcbiAgICAgICAgICAgIGhyZWY6ICcjdGVtcGxhdGVEYXRhJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAndGVtcGxhdGUnLFxuICAgICAgICAgICAgbGFiZWw6ICdUZW1wbGF0ZScsXG4gICAgICAgICAgICBkZXBUeXBlczogWydjb21wb25lbnQnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3N0eWxlRGF0YScsXG4gICAgICAgICAgICBocmVmOiAnI3N0eWxlRGF0YScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ3N0eWxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnU3R5bGVzJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2NvbXBvbmVudCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndHJlZScsXG4gICAgICAgICAgICBocmVmOiAnI3RyZWUnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICdkb20tdHJlZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RPTSBUcmVlJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2NvbXBvbmVudCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnZXhhbXBsZScsXG4gICAgICAgICAgICBocmVmOiAnI2V4YW1wbGUnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICdleGFtcGxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRXhhbXBsZXMnLFxuICAgICAgICAgICAgZGVwVHlwZXM6IFsnY29tcG9uZW50JywgJ2RpcmVjdGl2ZScsICdpbmplY3RhYmxlJywgJ3BpcGUnXVxuICAgICAgICB9XG4gICAgXVxufTtcblxuLyoqXG4gKiBNYXggbGVuZ3RoIGZvciB0aGUgc3RyaW5nIG9mIGEgZmlsZSBkdXJpbmcgTHVuciBzZWFyY2ggZW5naW5lIGluZGV4aW5nLlxuICogUHJldmVudCBzdGFjayBzaXplIGV4Y2VlZGVkXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0laRV9GSUxFX1NFQVJDSF9JTkRFWCA9IDUwMDAwO1xuXG4vKipcbiAqIE1heCBsZW5ndGggZm9yIHRoZSBzdHJpbmcgb2YgYSBmaWxlIGR1cmluZyBjaGVlcmlvIHBhcnNpbmcuXG4gKiBQcmV2ZW50IHN0YWNrIHNpemUgZXhjZWVkZWRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HID0gNDAwMDAwMDAwO1xuIiwiaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2h0bWwtZW50aXRpZXMnO1xuXG5pbXBvcnQgeyBNQVhfU0laRV9GSUxFX0NIRUVSSU9fUEFSU0lORywgTUFYX1NJWkVfRklMRV9TRUFSQ0hfSU5ERVggfSBmcm9tICcuLi8uLi91dGlscy9jb25zdGFudHMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgbHVucjogYW55ID0gcmVxdWlyZSgnbHVucicpO1xuY29uc3QgY2hlZXJpbzogYW55ID0gcmVxdWlyZSgnY2hlZXJpbycpO1xuXG5leHBvcnQgY2xhc3MgU2VhcmNoRW5naW5lIHtcbiAgICBwdWJsaWMgc2VhcmNoSW5kZXg6IGFueTtcbiAgICBwcml2YXRlIHNlYXJjaERvY3VtZW50cyA9IFtdO1xuICAgIHB1YmxpYyBkb2N1bWVudHNTdG9yZTogT2JqZWN0ID0ge307XG4gICAgcHVibGljIGluZGV4U2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyBhbW91bnRPZk1lbW9yeSA9IDA7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogU2VhcmNoRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghU2VhcmNoRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBTZWFyY2hFbmdpbmUuaW5zdGFuY2UgPSBuZXcgU2VhcmNoRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlYXJjaEVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5kZXhQYWdlKHBhZ2UpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIHRoaXMuYW1vdW50T2ZNZW1vcnkgKz0gcGFnZS5yYXdEYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuYW1vdW50T2ZNZW1vcnkgPCBNQVhfU0laRV9GSUxFX0NIRUVSSU9fUEFSU0lORykge1xuICAgICAgICAgICAgbGV0IGluZGV4U3RhcnRDb250ZW50ID0gcGFnZS5yYXdEYXRhLmluZGV4T2YoJzwhLS0gU1RBUlQgQ09OVEVOVCAtLT4nKTtcbiAgICAgICAgICAgIGxldCBpbmRleEVuZENvbnRlbnQgPSBwYWdlLnJhd0RhdGEuaW5kZXhPZignPCEtLSBFTkQgQ09OVEVOVCAtLT4nKTtcblxuICAgICAgICAgICAgbGV0ICQgPSBjaGVlcmlvLmxvYWQocGFnZS5yYXdEYXRhLnN1YnN0cmluZyhpbmRleFN0YXJ0Q29udGVudCArIDEsIGluZGV4RW5kQ29udGVudCkpO1xuXG4gICAgICAgICAgICB0ZXh0ID0gJCgnLmNvbnRlbnQnKS5odG1sKCk7XG4gICAgICAgICAgICB0ZXh0ID0gZGVjb2RlKHRleHQpO1xuICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKDwoW14+XSspPikvZ2ksICcnKTtcblxuICAgICAgICAgICAgcGFnZS51cmwgPSBwYWdlLnVybC5yZXBsYWNlKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LCAnJyk7XG5cbiAgICAgICAgICAgIGxldCBkb2MgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiBwYWdlLnVybCxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGFnZS5pbmZvcy5jb250ZXh0ICsgJyAtICcgKyBwYWdlLmluZm9zLm5hbWUsXG4gICAgICAgICAgICAgICAgYm9keTogdGV4dFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0aGlzLmRvY3VtZW50c1N0b3JlLmhhc093blByb3BlcnR5KGRvYy51cmwpICYmXG4gICAgICAgICAgICAgICAgZG9jLmJvZHkubGVuZ3RoIDwgTUFYX1NJWkVfRklMRV9TRUFSQ0hfSU5ERVhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzU3RvcmVbZG9jLnVybF0gPSBkb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hEb2N1bWVudHMucHVzaChkb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlU2VhcmNoSW5kZXhKc29uKG91dHB1dEZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcbiAgICAgICAgbGV0IHNlYXJjaEluZGV4ID0gbHVucihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1pbnZhbGlkLXRoaXMgKi9cbiAgICAgICAgICAgIHRoaXMucmVmKCd1cmwnKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJyk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB0aGlzLnBpcGVsaW5lLnJlbW92ZShsdW5yLnN0ZW1tZXIpO1xuXG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhhdC5zZWFyY2hEb2N1bWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZCh0aGF0LnNlYXJjaERvY3VtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzL3BhcnRpYWxzL3NlYXJjaC1pbmRleC5oYnMnKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IEpTT04uc3RyaW5naWZ5KHNlYXJjaEluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmU6IEpTT04uc3RyaW5naWZ5KHRoaXMuZG9jdW1lbnRzU3RvcmUpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSBvdXRwdXRGb2xkZXIubWF0Y2gocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RPdXRwdXREaXIgJiYgdGVzdE91dHB1dERpci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlci5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5naW5lLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvanMvc2VhcmNoL3NlYXJjaF9pbmRleC5qcycsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgc2VhcmNoIGluZGV4IGZpbGUgZ2VuZXJhdGlvbiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnIgPT4gUHJvbWlzZS5yZWplY3QoJ0Vycm9yIGR1cmluZyBzZWFyY2ggaW5kZXggZ2VuZXJhdGlvbicpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWFyY2hFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgJDogYW55ID0gcmVxdWlyZSgnY2hlZXJpbycpO1xuXG5jbGFzcyBDb21wb25lbnRzVHJlZUVuZ2luZSB7XG4gICAgcHJpdmF0ZSBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgY29tcG9uZW50c0ZvclRyZWU6IGFueVtdID0gW107XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29tcG9uZW50c1RyZWVFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFDb21wb25lbnRzVHJlZUVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQ29tcG9uZW50c1RyZWVFbmdpbmUuaW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50c1RyZWVFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ29tcG9uZW50c1RyZWVFbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUZW1wbGF0ZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb21wb25lbnRzRm9yVHJlZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZVBhdGggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguc2VwICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUodGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS5maWxlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zZXAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWVbaV0udGVtcGxhdGVVcmw7XG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLmdldChmaWxlUGF0aCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZURhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlRGF0YSA9IHRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZURhdGEgPSB0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZENoaWxkcmVuQW5kUGFyZW50cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbXBvbmVudHNGb3JUcmVlLCBjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCAkY29tcG9uZW50ID0gJChjb21wb25lbnQudGVtcGxhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzRm9yVHJlZSwgY29tcG9uZW50VG9GaW5kID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRjb21wb25lbnQuZmluZChjb21wb25lbnRUb0ZpbmQuc2VsZWN0b3IpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvbXBvbmVudFRvRmluZC5uYW1lICsgJyBmb3VuZCBpbiAnICsgY29tcG9uZW50Lm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmNoaWxkcmVuLnB1c2goY29tcG9uZW50VG9GaW5kLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUcmVlc0ZvckNvbXBvbmVudHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzLCBjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfY29tcG9uZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogY29tcG9uZW50LmZpbGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBjb21wb25lbnQuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICcnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnRlbXBsYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LnRlbXBsYXRlID0gY29tcG9uZW50LnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnRlbXBsYXRlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC50ZW1wbGF0ZVVybCA9IGNvbXBvbmVudC50ZW1wbGF0ZVVybFswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzRm9yVHJlZS5wdXNoKF9jb21wb25lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlYWRUZW1wbGF0ZXMoKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kQ2hpbGRyZW5BbmRQYXJlbnRzKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5jb21wb25lbnRzRm9yVHJlZTogJywgdGhpcy5jb21wb25lbnRzRm9yVHJlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnRzVHJlZUVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgUHJvamVjdCwgdHMsIFByb3BlcnR5RGVjbGFyYXRpb24sIFN5bnRheEtpbmQsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICd0cy1tb3JwaCc7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuLi9hcHAvZW5naW5lcy9maWxlLmVuZ2luZSc7XG5cbmNvbnN0IGFzdCA9IG5ldyBQcm9qZWN0KCk7XG5cbmV4cG9ydCBjbGFzcyBJbXBvcnRzVXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEltcG9ydHNVdGlsO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghSW1wb3J0c1V0aWwuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEltcG9ydHNVdGlsLmluc3RhbmNlID0gbmV3IEltcG9ydHNVdGlsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEltcG9ydHNVdGlsLmluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kIGZvciBhIHNvdXJjZUZpbGUgYSB2YXJpYWJsZSB2YWx1ZSBpbiBhIGxvY2FsIGVudW1cbiAgICAgKiBAcGFyYW0gc3JjRmlsZVxuICAgICAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVWYWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEluRW51bXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0RW51bShlID0+IHtcbiAgICAgICAgICAgIGlmIChlLmdldE5hbWUoKSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgZS5nZXRNZW1iZXIobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLmdldE5hbWUoKSA9PT0gdmFyaWFibGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gbS5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgZm9yIGEgc291cmNlRmlsZSBhIHZhcmlhYmxlIHZhbHVlIGluIGEgbG9jYWwgc3RhdGljIGNsYXNzXG4gICAgICogQHBhcmFtIHNyY0ZpbGVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lXG4gICAgICogQHBhcmFtIHZhcmlhYmxlVmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbkNsYXNzZXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0Q2xhc3MoYyA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdGljUHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBjLmdldFN0YXRpY1Byb3BlcnR5KHZhcmlhYmxlVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5LmdldEluaXRpYWxpemVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RhdGljUHJvcGVydHkuZ2V0SW5pdGlhbGl6ZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgdmFsdWUgaW4gYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBsaWtlIGFuIG9iamVjdFxuICAgICAqIEBwYXJhbSB2YXJpYWJsZURlY2xhcmF0aW9uXG4gICAgICogQHBhcmFtIHZhcmlhYmxlc0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbk9iamVjdFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVEZWNsYXJhdGlvbiwgdmFyaWFibGVzQXR0cmlidXRlcykge1xuICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG4gICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyS2luZCAmJiBpbml0aWFsaXplcktpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGVzdHJpbmcgZnJvbSBBVkFSLkJWQVIudGhlc3RyaW5nIGluc2lkZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29wUHJvcGVydGllcyA9IHByb3BlcnRpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZS5nZXRUZXh0KCkgPT09IHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wUHJvcGVydGllcyhwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9IHByb3AuaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBwcm9wLmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxvb3BQcm9wZXJ0aWVzKGNvbXBpbGVyTm9kZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBpbiBpbXBvcnRzIHNvbWV0aGluZyBsaWtlIG15dmFyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgICAgICAgICAgICAgbGlrZSBteXZhclxuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15dmFyIHZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhcbiAgICAgICAgaW5wdXRWYXJpYWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgZGVjb3JhdG9yVHlwZT86IHN0cmluZ1xuICAgICkge1xuICAgICAgICBsZXQgbWV0YWRhdGFWYXJpYWJsZU5hbWUgPSBpbnB1dFZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSAnJyxcbiAgICAgICAgICAgIGZvdW5kV2l0aE5hbWVkSW1wb3J0ID0gZmFsc2UsXG4gICAgICAgICAgICBmb3VuZFdpdGhEZWZhdWx0SW1wb3J0ID0gZmFsc2UsXG4gICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZpbGUgPVxuICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICA6IGFzdC5hZGRTb3VyY2VGaWxlQXRQYXRoSWZFeGlzdHMoc291cmNlRmlsZS5maWxlTmFtZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aE5hbWVkSW1wb3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aE5hbWVkSW1wb3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0ID0gaS5nZXROYW1lc3BhY2VJbXBvcnQoKTtcbiAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2VJbXBvcnRMb2NhbE5hbWUgPSBuYW1lc3BhY2VJbXBvcnQuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJbXBvcnRMb2NhbE5hbWUgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZm91bmRXaXRoTmFtZWRJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0SW1wb3J0ID0gaS5nZXREZWZhdWx0SW1wb3J0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEltcG9ydFRleHQgPSBkZWZhdWx0SW1wb3J0LmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJbXBvcnRUZXh0ID09PSBtZXRhZGF0YVZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoRGVmYXVsdEltcG9ydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhc0ZvdW5kVmFsdWVzKHZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGxldCB2YXJpYWJsZUtpbmQgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEtpbmQoKTtcblxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlS2luZCAmJiB2YXJpYWJsZUtpbmQgPT09IFN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluaXRpYWxpemVyS2luZCA9IGluaXRpYWxpemVyLmdldEtpbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyS2luZCAmJiBpbml0aWFsaXplcktpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21waWxlck5vZGUgPSBpbml0aWFsaXplci5jb21waWxlck5vZGUgYXMgdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJOb2RlLnByb3BlcnRpZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGhSZWZlcmVuY2UgPSBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJTb3VyY2VGaWxlKCk7XG4gICAgICAgICAgICBsZXQgaW1wb3J0UGF0aDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0UGF0aFJlZmVyZW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRQYXRoID0gaW1wb3J0UGF0aFJlZmVyZW5jZS5jb21waWxlck5vZGUuZmlsZU5hbWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlSW1wb3J0ID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aElmRXhpc3RzKGltcG9ydFBhdGgpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG5cbiAgICAgICAgICAgICAgICBpZiAoc291cmNlRmlsZUltcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFyaWFibGVOYW1lID0gZm91bmRXaXRoQWxpYXMgPyBhbGlhc09yaWdpbmFsTmFtZSA6IG1ldGFkYXRhVmFyaWFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFyaWFibGVEZWNsYXJhdGlvbiA9IHNvdXJjZUZpbGVJbXBvcnQuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm91bmRWYWx1ZXModmFyaWFibGVEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgd2l0aCBleHBvcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBvcnREZWNsYXJhdGlvbnMgPSBzb3VyY2VGaWxlSW1wb3J0LmdldEV4cG9ydGVkRGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBvcnREZWNsYXJhdGlvbnMgJiYgZXhwb3J0RGVjbGFyYXRpb25zLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvblZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gb2YgZXhwb3J0RGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uVmFsdWVzLmZvckVhY2goZXhwb3J0RGVjbGFyYXRpb25WYWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb25WYWx1ZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvblZhbHVlLmdldE5hbWUoKSA9PT0gdmFyaWFibGVOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm91bmRWYWx1ZXMoZXhwb3J0RGVjbGFyYXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhaW1wb3J0UGF0aFJlZmVyZW5jZSAmJlxuICAgICAgICAgICAgICAgIGRlY29yYXRvclR5cGUgPT09ICd0ZW1wbGF0ZScgJiZcbiAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpLmluZGV4T2YoJy5odG1sJykgIT09IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFNvdXJjZUZpbGVQYXRoID0gc291cmNlRmlsZS5wYXRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU291cmNlRmlsZVBhdGhGb2xkZXIgPSBvcmlnaW5hbFNvdXJjZUZpbGVQYXRoLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTb3VyY2VGaWxlUGF0aC5sYXN0SW5kZXhPZignLycpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbEltcG9ydGVkUGF0aCA9XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU291cmNlRmlsZVBhdGhGb2xkZXIgKyAnLycgKyBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsSW1wb3J0ZWRQYXRoRGF0YSA9IEZpbGVFbmdpbmUuZ2V0U3luYyhmaW5hbEltcG9ydGVkUGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsSW1wb3J0ZWRQYXRoRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpbmQgaW4gbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmaWxlXG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZURlY2xhcmF0aW9uID0gZmlsZS5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKG1ldGFkYXRhVmFyaWFibGVOYW1lKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlS2luZCA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0S2luZCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlS2luZCAmJiB2YXJpYWJsZUtpbmQgPT09IFN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluaXRpYWxpemVyS2luZCA9IGluaXRpYWxpemVyLmdldEtpbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcktpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcktpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21waWxlck5vZGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplci5jb21waWxlck5vZGUgYXMgdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyTm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcktpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLk5vU3Vic3RpdHV0aW9uVGVtcGxhdGVMaXRlcmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvclR5cGUgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxpemVyLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbi5jb21waWxlck5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplcktpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbi5jb21waWxlck5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbGVOYW1lT2ZJbXBvcnQodmFyaWFibGVOYW1lOiBzdHJpbmcsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZS5maWxlTmFtZSkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKVxuICAgICAgICAgICAgICAgIDogYXN0LmFkZFNvdXJjZUZpbGVBdFBhdGgoc291cmNlRmlsZS5maWxlTmFtZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG4gICAgICAgIGxldCBzZWFyY2hlZEltcG9ydCxcbiAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gJycsXG4gICAgICAgICAgICBmaW5hbFBhdGggPSAnJyxcbiAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gZmFsc2U7XG4gICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGxldCBuYW1lZEltcG9ydHMgPSBpLmdldE5hbWVkSW1wb3J0cygpLFxuICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0c0xlbmd0aCA9IG5hbWVkSW1wb3J0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbmFtZWRJbXBvcnRzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc05vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09PSB2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9IGltcG9ydE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZWRJbXBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgaW1wb3J0UGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoc291cmNlRmlsZS5maWxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICAnLycgK1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpICtcbiAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgY2xlYW5lciA9IChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXApLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgICAgIGZpbmFsUGF0aCA9IGltcG9ydFBhdGgucmVwbGFjZShjbGVhbmVyLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBmaWxlIHBhdGggb2YgaW1wb3J0ZWQgdmFyaWFibGVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlucHV0VmFyaWFibGVOYW1lICBsaWtlIHRoZXN0cmluZ1xuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICAgICAgICAgIHRoZXN0cmluZyBkZXN0aW5hdGlvbiBwYXRoXG4gICAgICovXG4gICAgcHVibGljIGZpbmRGaWxlUGF0aE9mSW1wb3J0ZWRWYXJpYWJsZShpbnB1dFZhcmlhYmxlTmFtZSwgc291cmNlRmlsZVBhdGg6IHN0cmluZykge1xuICAgICAgICBsZXQgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBmaW5hbFBhdGggPSAnJyxcbiAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gJycsXG4gICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlUGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlUGF0aClcbiAgICAgICAgICAgICAgICA6IGFzdC5hZGRTb3VyY2VGaWxlQXRQYXRoKHNvdXJjZUZpbGVQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCBpbXBvcnRzID0gZmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9vcCB0aHJvdWdoIGFsbCBpbXBvcnRzLCBhbmQgZmluZCBvbmUgbWF0Y2hpbmcgaW5wdXRWYXJpYWJsZU5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGxldCBuYW1lZEltcG9ydHMgPSBpLmdldE5hbWVkSW1wb3J0cygpLFxuICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0c0xlbmd0aCA9IG5hbWVkSW1wb3J0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbmFtZWRJbXBvcnRzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc05vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09PSBpbnB1dFZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydEFsaWFzID09PSBpbnB1dFZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZmluYWxQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShzb3VyY2VGaWxlUGF0aCkgK1xuICAgICAgICAgICAgICAgICAgICAnLycgK1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpICtcbiAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGluIGltcG9ydHMgc29tZXRoaW5nIGxpa2UgVkFSLkFWQVIuQlZBUi50aGVzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlucHV0VmFyaWFibGVOYW1lICAgICAgICAgICAgICAgICAgIGxpa2UgVkFSLkFWQVIuQlZBUi50aGVzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVzdHJpbmcgdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZFByb3BlcnR5VmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMoaW5wdXRWYXJpYWJsZU5hbWUsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHZhcmlhYmxlc0F0dHJpYnV0ZXMgPSBpbnB1dFZhcmlhYmxlTmFtZS5zcGxpdCgnLicpLFxuICAgICAgICAgICAgbWV0YWRhdGFWYXJpYWJsZU5hbWUgPSB2YXJpYWJsZXNBdHRyaWJ1dGVzWzBdLFxuICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChzb3VyY2VGaWxlLmZpbGVOYW1lKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCBpbXBvcnRzID0gZmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9vcCB0aHJvdWdoIGFsbCBpbXBvcnRzLCBhbmQgZmluZCBvbmUgbWF0Y2hpbmcgaW5wdXRWYXJpYWJsZU5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGxldCBuYW1lZEltcG9ydHMgPSBpLmdldE5hbWVkSW1wb3J0cygpLFxuICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0c0xlbmd0aCA9IG5hbWVkSW1wb3J0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbmFtZWRJbXBvcnRzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc05vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09PSBtZXRhZGF0YVZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydEFsaWFzID09PSBtZXRhZGF0YVZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBmaWxlVG9TZWFyY2hJbiwgdmFyaWFibGVEZWNsYXJhdGlvbjtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2hlZEltcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKSArXG4gICAgICAgICAgICAgICAgICAgICcvJyArXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgK1xuICAgICAgICAgICAgICAgICAgICAnLnRzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVJbXBvcnQgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKVxuICAgICAgICAgICAgICAgICAgICA6IGFzdC5hZGRTb3VyY2VGaWxlQXRQYXRoKGltcG9ydFBhdGgpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBpZiAoc291cmNlRmlsZUltcG9ydCkge1xuICAgICAgICAgICAgICAgIGZpbGVUb1NlYXJjaEluID0gc291cmNlRmlsZUltcG9ydDtcbiAgICAgICAgICAgICAgICBsZXQgdmFyaWFibGVOYW1lID0gZm91bmRXaXRoQWxpYXMgPyBhbGlhc09yaWdpbmFsTmFtZSA6IG1ldGFkYXRhVmFyaWFibGVOYW1lO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb24gPSBmaWxlVG9TZWFyY2hJbi5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWxlVG9TZWFyY2hJbiA9IGZpbGU7XG4gICAgICAgICAgICAvLyBGaW5kIGluIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZmlsZVxuICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbiA9IGZpbGVUb1NlYXJjaEluLmdldFZhcmlhYmxlRGVjbGFyYXRpb24obWV0YWRhdGFWYXJpYWJsZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRJbk9iamVjdFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVEZWNsYXJhdGlvbiwgdmFyaWFibGVzQXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ5IGZpbmQgaXQgaW4gZW51bXNcbiAgICAgICAgaWYgKHZhcmlhYmxlc0F0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWxlVG9TZWFyY2hJbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5maW5kSW5FbnVtcyhcbiAgICAgICAgICAgICAgICAgICAgZmlsZVRvU2VhcmNoSW4sXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhVmFyaWFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNBdHRyaWJ1dGVzWzFdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLmZpbmRJbkNsYXNzZXMoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVUb1NlYXJjaEluLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzQXR0cmlidXRlc1sxXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEltcG9ydHNVdGlsLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuaW1wb3J0ICogYXMgSlNPTjUgZnJvbSAnanNvbjUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFByb2plY3QsIHRzLCBTb3VyY2VGaWxlLCBTeW50YXhLaW5kLCBOb2RlIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuLi9hcHAvZW5naW5lcy9maWxlLmVuZ2luZSc7XG5pbXBvcnQgeyBSb3V0aW5nR3JhcGhOb2RlIH0gZnJvbSAnLi4vYXBwL25vZGVzL3JvdXRpbmctZ3JhcGgtbm9kZSc7XG5cbmltcG9ydCBJbXBvcnRzVXRpbCBmcm9tICcuL2ltcG9ydHMudXRpbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbmNvbnN0IHRyYXZlcnNlID0gcmVxdWlyZSgndHJhdmVyc2UnKTtcblxuY29uc3QgYXN0ID0gbmV3IFByb2plY3QoKTtcblxuZXhwb3J0IGNsYXNzIFJvdXRlclBhcnNlclV0aWwge1xuICAgIHByaXZhdGUgcm91dGVzOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgaW5jb21wbGV0ZVJvdXRlcyA9IFtdO1xuICAgIHByaXZhdGUgbW9kdWxlcyA9IFtdO1xuICAgIHByaXZhdGUgbW9kdWxlc1RyZWU7XG4gICAgcHJpdmF0ZSByb290TW9kdWxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjbGVhbk1vZHVsZXNUcmVlO1xuICAgIHByaXZhdGUgbW9kdWxlc1dpdGhSb3V0ZXMgPSBbXTtcbiAgICBwcml2YXRlIHRyYW5zZm9ybUFuZ3VsYXI4SW1wb3J0U3ludGF4ID1cbiAgICAgICAgLyhbJ1wiXWxvYWRDaGlsZHJlblsnXCJdOilcXChcXCkoOlteKV0rPyk/PT5cImltcG9ydFxcKChcXFxcJ3wnfFwifGApKFteJ1wiXSs/KShcXFxcJ3wnfFwifGApXFwpXFwudGhlblxcKFxcKD9cXHcrP1xcKT89PlxcUys/XFwuKFteKV0rPylcXCkoXFxcXCd8J3xcIikvZztcbiAgICBwcml2YXRlIHRyYW5zZm9ybUFuZ3VsYXI4SW1wb3J0U3ludGF4QXN5bmNBd2FpdCA9XG4gICAgICAgIC8oWydcIl1sb2FkQ2hpbGRyZW5bJ1wiXTopXFwoXFwpKDpbXildKz8pPz0+XFwoXCJpbXBvcnRcXCgoXFxcXCd8J3xcInxgKShbXidcIl0rPykoXFxcXCd8J3xcInxgKVxcKVwiXFwpXFwuWydcIl0oW14pXSs/KVsnXCJdL2c7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUm91dGVyUGFyc2VyVXRpbDtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIVJvdXRlclBhcnNlclV0aWwuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuaW5zdGFuY2UgPSBuZXcgUm91dGVyUGFyc2VyVXRpbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSb3V0ZXJQYXJzZXJVdGlsLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRSb3V0ZShyb3V0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKHJvdXRlKTtcbiAgICAgICAgdGhpcy5yb3V0ZXMgPSBfLnNvcnRCeShfLnVuaXFXaXRoKHRoaXMucm91dGVzLCBfLmlzRXF1YWwpLCBbJ25hbWUnXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEluY29tcGxldGVSb3V0ZShyb3V0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmluY29tcGxldGVSb3V0ZXMucHVzaChyb3V0ZSk7XG4gICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlcyA9IF8uc29ydEJ5KF8udW5pcVdpdGgodGhpcy5pbmNvbXBsZXRlUm91dGVzLCBfLmlzRXF1YWwpLCBbJ25hbWUnXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZE1vZHVsZVdpdGhSb3V0ZXMobW9kdWxlTmFtZSwgbW9kdWxlSW1wb3J0cywgZmlsZW5hbWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2R1bGVzV2l0aFJvdXRlcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgICBpbXBvcnRzTm9kZTogbW9kdWxlSW1wb3J0cyxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tb2R1bGVzV2l0aFJvdXRlcyA9IF8uc29ydEJ5KF8udW5pcVdpdGgodGhpcy5tb2R1bGVzV2l0aFJvdXRlcywgXy5pc0VxdWFsKSwgWyduYW1lJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRNb2R1bGUobW9kdWxlTmFtZTogc3RyaW5nLCBtb2R1bGVJbXBvcnRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgICBpbXBvcnRzTm9kZTogbW9kdWxlSW1wb3J0c1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tb2R1bGVzID0gXy5zb3J0QnkoXy51bmlxV2l0aCh0aGlzLm1vZHVsZXMsIF8uaXNFcXVhbCksIFsnbmFtZSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5SYXdSb3V0ZVBhcnNlZChyb3V0ZTogc3RyaW5nKTogb2JqZWN0IHtcbiAgICAgICAgbGV0IHJvdXRlc1dpdGhvdXRTcGFjZXMgPSByb3V0ZS5yZXBsYWNlKC8gL2dtLCAnJyk7XG4gICAgICAgIGNvbnN0IHRlc3RUcmFpbGluZ0NvbW1hID0gcm91dGVzV2l0aG91dFNwYWNlcy5pbmRleE9mKCd9LF0nKTtcbiAgICAgICAgaWYgKHRlc3RUcmFpbGluZ0NvbW1hICE9PSAtMSkge1xuICAgICAgICAgICAgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlc1dpdGhvdXRTcGFjZXMucmVwbGFjZSgnfSxdJywgJ31dJyk7XG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZXNXaXRob3V0U3BhY2VzID0gcm91dGVzV2l0aG91dFNwYWNlcy5yZXBsYWNlKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheCxcbiAgICAgICAgICAgICckMVwiJDQjJDZcIidcbiAgICAgICAgKTtcblxuICAgICAgICByb3V0ZXNXaXRob3V0U3BhY2VzID0gcm91dGVzV2l0aG91dFNwYWNlcy5yZXBsYWNlKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheEFzeW5jQXdhaXQsXG4gICAgICAgICAgICAnJDFcIiQ0IyQ2XCInXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIEpTT041LnBhcnNlKHJvdXRlc1dpdGhvdXRTcGFjZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhblJhd1JvdXRlKHJvdXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlLnJlcGxhY2UoLyAvZ20sICcnKTtcbiAgICAgICAgbGV0IHRlc3RUcmFpbGluZ0NvbW1hID0gcm91dGVzV2l0aG91dFNwYWNlcy5pbmRleE9mKCd9LF0nKTtcbiAgICAgICAgaWYgKHRlc3RUcmFpbGluZ0NvbW1hICE9PSAtMSkge1xuICAgICAgICAgICAgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlc1dpdGhvdXRTcGFjZXMucmVwbGFjZSgnfSxdJywgJ31dJyk7XG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZXNXaXRob3V0U3BhY2VzID0gcm91dGVzV2l0aG91dFNwYWNlcy5yZXBsYWNlKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheCxcbiAgICAgICAgICAgICckMVwiJDQjJDZcIidcbiAgICAgICAgKTtcblxuICAgICAgICByb3V0ZXNXaXRob3V0U3BhY2VzID0gcm91dGVzV2l0aG91dFNwYWNlcy5yZXBsYWNlKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheEFzeW5jQXdhaXQsXG4gICAgICAgICAgICAnJDFcIiQ0IyQ2XCInXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHJvdXRlc1dpdGhvdXRTcGFjZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvb3RNb2R1bGUobW9kdWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb290TW9kdWxlID0gbW9kdWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNSb3V0ZXJNb2R1bGVJbkltcG9ydHMoaW1wb3J0czogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbXBvcnRzW2ldLm5hbWUuaW5kZXhPZignUm91dGVyTW9kdWxlLmZvckNoaWxkJykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZS5mb3JSb290JykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZScpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGZpeEluY29tcGxldGVSb3V0ZXMobWlzY2VsbGFuZW91c1ZhcmlhYmxlczogQXJyYXk8YW55Pik6IHZvaWQge1xuICAgICAgICBsZXQgbWF0Y2hpbmdWYXJpYWJsZXMgPSBbXTtcbiAgICAgICAgLy8gRm9yIGVhY2ggaW5jb21wbGV0ZVJvdXRlLCBzY2FuIGlmIG9uZSBtaXNjIHZhcmlhYmxlIGlzIGluIGNvZGVcbiAgICAgICAgLy8gaWYgb2ssIHRyeSByZWNyZWF0aW5nIGNvbXBsZXRlIHJvdXRlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmNvbXBsZXRlUm91dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1pc2NlbGxhbmVvdXNWYXJpYWJsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEuaW5kZXhPZihtaXNjZWxsYW5lb3VzVmFyaWFibGVzW2pdLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZm91bmQgb25lIG1pc2MgdmFyIGluc2lkZSBpbmNvbXBsZXRlUm91dGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobWlzY2VsbGFuZW91c1ZhcmlhYmxlc1tqXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdWYXJpYWJsZXMucHVzaChtaXNjZWxsYW5lb3VzVmFyaWFibGVzW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhbiBpbmNvbXBsZXRlUm91dGVcbiAgICAgICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhID0gdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEucmVwbGFjZSgnWycsICcnKTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhID0gdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEucmVwbGFjZSgnXScsICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsaW5rTW9kdWxlc0FuZFJvdXRlcygpOiB2b2lkIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlcy5sZW5ndGg7XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5pbXBvcnRzTm9kZSwgKG5vZGU6IHRzLlByb3BlcnR5RGVjbGFyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSBub2RlLmluaXRpYWxpemVyIGFzIHRzLkFycmF5TGl0ZXJhbEV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplci5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGluaXRpYWxpemVyLmVsZW1lbnRzLCAoZWxlbWVudDogdHMuQ2FsbEV4cHJlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGVsZW1lbnQgd2l0aCBhcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQuYXJndW1lbnRzLCAoYXJndW1lbnQ6IHRzLklkZW50aWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnJvdXRlcywgcm91dGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmZpbGVuYW1lID09PSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1vZHVsZSA9IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuZmlsZW5hbWUgIT09IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyZ3VtZW50SW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRzVXRpbC5maW5kRmlsZVBhdGhPZkltcG9ydGVkVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50SW1wb3J0UGF0aCA9IGFyZ3VtZW50SW1wb3J0UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubmFtZSA9PT0gYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuZmlsZW5hbWUgPT09IGFyZ3VtZW50SW1wb3J0UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1vZHVsZSA9IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBkaXJlY3Qgc3VwcG9ydCBvZiBmb3IgZXhhbXBsZVxuICAgICAgICAgICAgICAgICAqIGV4cG9ydCBjb25zdCBIb21lUm91dGluZ01vZHVsZTogTW9kdWxlV2l0aFByb3ZpZGVycyA9IFJvdXRlck1vZHVsZS5mb3JDaGlsZChIT01FX1JPVVRFUyk7XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuYXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZS5hcmd1bWVudHMsIChhcmd1bWVudDogdHMuSWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnJvdXRlcywgcm91dGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5maWxlbmFtZSA9PT0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5maWxlbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1vZHVsZSA9IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBmb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobW9kdWxlTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIF8uZmluZCh0aGlzLnJvdXRlcywgeyBtb2R1bGU6IG1vZHVsZU5hbWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZvdW5kTGF6eU1vZHVsZVdpdGhQYXRoKG1vZHVsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIHBhdGggaXMgbGlrZSBhcHAvY3VzdG9tZXJzL2N1c3RvbWVycy5tb2R1bGUjQ3VzdG9tZXJzTW9kdWxlXG4gICAgICAgIGxldCBzcGxpdCA9IG1vZHVsZVBhdGguc3BsaXQoJyMnKTtcbiAgICAgICAgbGV0IGxhenlNb2R1bGVQYXRoID0gc3BsaXRbMF07XG4gICAgICAgIGxldCBsYXp5TW9kdWxlTmFtZSA9IHNwbGl0WzFdO1xuICAgICAgICByZXR1cm4gbGF6eU1vZHVsZU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdFJvdXRlc1RyZWUoKSB7XG4gICAgICAgIC8vIHJvdXRlc1tdIGNvbnRhaW5zIHJvdXRlcyB3aXRoIG1vZHVsZSBsaW5rXG4gICAgICAgIC8vIG1vZHVsZXNUcmVlIGNvbnRhaW5zIG1vZHVsZXMgdHJlZVxuICAgICAgICAvLyBtYWtlIGEgZmluYWwgcm91dGVzIHRyZWUgd2l0aCB0aGF0XG4gICAgICAgIHRyYXZlcnNlKHRoaXMubW9kdWxlc1RyZWUpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmltcG9ydHNOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmltcG9ydHNOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbGVhbk1vZHVsZXNUcmVlID0gXy5jbG9uZURlZXAodGhpcy5tb2R1bGVzVHJlZSk7XG5cbiAgICAgICAgbGV0IHJvdXRlc1RyZWUgPSB7XG4gICAgICAgICAgICBuYW1lOiAnPHJvb3Q+JyxcbiAgICAgICAgICAgIGtpbmQ6ICdtb2R1bGUnLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnJvb3RNb2R1bGUsXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgbG9vcE1vZHVsZXNQYXJzZXIgPSBub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIG1vZHVsZSBoYXMgY2hpbGQgbW9kdWxlc1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGUgPSB0aGlzLmZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShub2RlLmNoaWxkcmVuW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgJiYgcm91dGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IEpTT041LnBhcnNlKHJvdXRlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyBnZW5lcmF0aW9uIG9mIHJvdXRlcyBKU09OIGZpbGUsIG1heWJlIGEgdHJhaWxpbmcgY29tbWEgb3IgYW4gZXh0ZXJuYWwgdmFyaWFibGUgaW5zaWRlIG9uZSByb3V0ZS4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb3V0ZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzVHJlZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbltpXS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcE1vZHVsZXNQYXJzZXIobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVsc2Ugcm91dGVzIGFyZSBkaXJlY3RseSBpbnNpZGUgdGhlIG1vZHVsZVxuICAgICAgICAgICAgICAgIGxldCByYXdSb3V0ZXMgPSB0aGlzLmZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShub2RlLm5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJhd1JvdXRlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVzID0gSlNPTjUucGFyc2UocmF3Um91dGVzLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGVuID0gcm91dGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0ZUFkZGVkT25jZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGUgPSByb3V0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlc1tpXS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVBZGRlZE9uY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXNUcmVlLmNoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHJvdXRlc1tpXS5jb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiByb3V0ZXNbaV0ucGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdXRlQWRkZWRPbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzVHJlZS5jaGlsZHJlbiA9IFsuLi5yb3V0ZXNUcmVlLmNoaWxkcmVuLCAuLi5yb3V0ZXNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBzdGFydE1vZHVsZSA9IF8uZmluZCh0aGlzLmNsZWFuTW9kdWxlc1RyZWUsIHsgbmFtZTogdGhpcy5yb290TW9kdWxlIH0pO1xuXG4gICAgICAgIGlmIChzdGFydE1vZHVsZSkge1xuICAgICAgICAgICAgbG9vcE1vZHVsZXNQYXJzZXIoc3RhcnRNb2R1bGUpO1xuICAgICAgICAgICAgLy8gTG9vcCB0d2ljZSBmb3Igcm91dGVzIHdpdGggbGF6eSBsb2FkaW5nXG4gICAgICAgICAgICAvLyBsb29wTW9kdWxlc1BhcnNlcihyb3V0ZXNUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbGVhbmVkUm91dGVzVHJlZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgY2xlYW5Sb3V0ZXNUcmVlID0gcm91dGUgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiByb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGxldCByb3V0ZXMgPSByb3V0ZS5jaGlsZHJlbltpXS5yb3V0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcm91dGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xlYW5lZFJvdXRlc1RyZWUgPSBjbGVhblJvdXRlc1RyZWUocm91dGVzVHJlZSk7XG5cbiAgICAgICAgLy8gVHJ5IHVwZGF0aW5nIHJvdXRlcyB3aXRoIGxhenkgbG9hZGluZ1xuXG4gICAgICAgIGxldCBsb29wSW5zaWRlTW9kdWxlID0gKG1vZCwgX3Jhd01vZHVsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1vZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHogaW4gbW9kLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb3V0ZSA9IHRoaXMuZm91bmRSb3V0ZVdpdGhNb2R1bGVOYW1lKG1vZC5jaGlsZHJlblt6XS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm91dGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5raW5kID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlID0gdGhpcy5mb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobW9kLm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IEpTT041LnBhcnNlKHJvdXRlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvdXRlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5raW5kID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmNoaWxkcmVuLnB1c2gocm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBsb29wUm91dGVzUGFyc2VyID0gcm91dGUgPT4ge1xuICAgICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiByb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUuY2hpbGRyZW5baV0ubG9hZENoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmZvdW5kTGF6eU1vZHVsZVdpdGhQYXRoKHJvdXRlLmNoaWxkcmVuW2ldLmxvYWRDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kdWxlOiBSb3V0aW5nR3JhcGhOb2RlID0gXy5maW5kKHRoaXMuY2xlYW5Nb2R1bGVzVHJlZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgX3Jhd01vZHVsZTogUm91dGluZ0dyYXBoTm9kZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLm1vZHVsZSA9IG1vZHVsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJbnNpZGVNb2R1bGUobW9kdWxlLCBfcmF3TW9kdWxlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuW2ldLmNoaWxkcmVuID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW5baV0uY2hpbGRyZW4ucHVzaChfcmF3TW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsb29wUm91dGVzUGFyc2VyKHJvdXRlLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxvb3BSb3V0ZXNQYXJzZXIoY2xlYW5lZFJvdXRlc1RyZWUpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbmVkUm91dGVzVHJlZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3RydWN0TW9kdWxlc1RyZWUoKTogdm9pZCB7XG4gICAgICAgIGxldCBnZXROZXN0ZWRDaGlsZHJlbiA9IChhcnIsIHBhcmVudD8pID0+IHtcbiAgICAgICAgICAgIGxldCBvdXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gYXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFycltpXS5wYXJlbnQgPT09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXROZXN0ZWRDaGlsZHJlbihhcnIsIGFycltpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2ldLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goYXJyW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNjYW4gZWFjaCBtb2R1bGUgYW5kIGFkZCBwYXJlbnQgcHJvcGVydHlcbiAgICAgICAgXy5mb3JFYWNoKHRoaXMubW9kdWxlcywgZmlyc3RMb29wTW9kdWxlID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChmaXJzdExvb3BNb2R1bGUuaW1wb3J0c05vZGUsIGltcG9ydE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLm1vZHVsZXMsIG1vZHVsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUubmFtZSA9PT0gaW1wb3J0Tm9kZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUucGFyZW50ID0gZmlyc3RMb29wTW9kdWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tb2R1bGVzVHJlZSA9IGdldE5lc3RlZENoaWxkcmVuKHRoaXMubW9kdWxlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlUm91dGVzSW5kZXgob3V0cHV0Rm9sZGVyOiBzdHJpbmcsIHJvdXRlczogQXJyYXk8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzL3BhcnRpYWxzL3JvdXRlcy1pbmRleC5oYnMnKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVzOiBKU09OLnN0cmluZ2lmeShyb3V0ZXMpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSBvdXRwdXRGb2xkZXIubWF0Y2gocHJvY2Vzcy5jd2QoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyID0gb3V0cHV0Rm9sZGVyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUud3JpdGUoXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciArIHBhdGguc2VwICsgJy9qcy9yb3V0ZXMvcm91dGVzX2luZGV4LmpzJyxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnIgPT4gUHJvbWlzZS5yZWplY3QoJ0Vycm9yIGR1cmluZyByb3V0ZXMgaW5kZXggZ2VuZXJhdGlvbicpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJvdXRlc0xlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgX24gPSAwO1xuICAgICAgICBsZXQgcm91dGVzUGFyc2VyID0gcm91dGUgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZS5wYXRoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIF9uICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqIGluIHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlc1BhcnNlcihyb3V0ZS5jaGlsZHJlbltqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5yb3V0ZXMpIHtcbiAgICAgICAgICAgIHJvdXRlc1BhcnNlcih0aGlzLnJvdXRlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX247XG4gICAgfVxuXG4gICAgcHVibGljIHByaW50Um91dGVzKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdwcmludFJvdXRlczogJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMucm91dGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJpbnRNb2R1bGVzUm91dGVzKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdwcmludE1vZHVsZXNSb3V0ZXM6ICcpO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLm1vZHVsZXNXaXRoUm91dGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYXJpYWJsZVJvdXRlcyhub2RlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0ICYmIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZS50eXBlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLnR5cGUudHlwZU5hbWUudGV4dCA9PT0gJ1JvdXRlcydcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuRmlsZUlkZW50aWZpZXJzKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgbGV0IGZpbGUgPSBzb3VyY2VGaWxlO1xuICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IGZpbGUuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5JZGVudGlmaWVyKS5maWx0ZXIocCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIE5vZGUuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKHAuZ2V0UGFyZW50T3JUaHJvdygpKSB8fFxuICAgICAgICAgICAgICAgIE5vZGUuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocC5nZXRQYXJlbnRPclRocm93KCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgaWRlbnRpZmllcnNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50ID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzKSB7XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlaXIgcGFyZW50cyBub2RlcywgYW5kIGlmIG9uZSBpcyBhIHZhcmlhYmxlU3RhdGVtZW50IGFuZCA9PT0gJ3JvdXRlcydcbiAgICAgICAgICAgIGxldCBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gaWRlbnRpZmllci5nZXRQYXJlbnRXaGlsZShuID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobi5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVJvdXRlcyhuLmNvbXBpbGVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudC5wdXNoKGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgZXhwcmVzc2lvbnNcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllckRlY2xhcmF0aW9uID0gaWRlbnRpZmllclxuICAgICAgICAgICAgICAgIC5nZXRTeW1ib2xPclRocm93KClcbiAgICAgICAgICAgICAgICAuZ2V0VmFsdWVEZWNsYXJhdGlvbk9yVGhyb3coKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhTm9kZS5pc1Byb3BlcnR5QXNzaWdubWVudChpZGVudGlmaWVyRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgTm9kZS5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oaWRlbnRpZmllckRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgIE5vZGUuaXNQcm9wZXJ0eUFzc2lnbm1lbnQoaWRlbnRpZmllckRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICFOb2RlLmlzVmFyaWFibGVEZWNsYXJhdGlvbihpZGVudGlmaWVyRGVjbGFyYXRpb24pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBOb3QgaW1wbGVtZW50ZWQgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbiBraW5kOiAke2lkZW50aWZpZXJEZWNsYXJhdGlvbi5nZXRLaW5kTmFtZSgpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE5vZGUuaXNWYXJpYWJsZURlY2xhcmF0aW9uKGlkZW50aWZpZXJEZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLnJlcGxhY2VXaXRoVGV4dChpZGVudGlmaWVyRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJPclRocm93KCkuZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkZpbGVTcHJlYWRzKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgbGV0IGZpbGUgPSBzb3VyY2VGaWxlO1xuICAgICAgICBjb25zdCBzcHJlYWRFbGVtZW50cyA9IGZpbGVcbiAgICAgICAgICAgIC5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLlNwcmVhZEVsZW1lbnQpXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gTm9kZS5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpKTtcblxuICAgICAgICBsZXQgc3ByZWFkRWxlbWVudHNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50ID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzcHJlYWRFbGVtZW50IG9mIHNwcmVhZEVsZW1lbnRzKSB7XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlaXIgcGFyZW50cyBub2RlcywgYW5kIGlmIG9uZSBpcyBhIHZhcmlhYmxlU3RhdGVtZW50IGFuZCA9PT0gJ3JvdXRlcydcbiAgICAgICAgICAgIGxldCBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gc3ByZWFkRWxlbWVudC5nZXRQYXJlbnRXaGlsZShuID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobi5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVJvdXRlcyhuLmNvbXBpbGVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudC5wdXNoKHNwcmVhZEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBBcnJheUxpdGVyYWxFeHByZXNzaW9uIFNwcmVhZEVsZW1lbnRzXG4gICAgICAgIGZvciAoY29uc3Qgc3ByZWFkRWxlbWVudCBvZiBzcHJlYWRFbGVtZW50c0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBzcHJlYWRFbGVtZW50SWRlbnRpZmllciA9IHNwcmVhZEVsZW1lbnQuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCxcbiAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgaXQgaW4gaW1wb3J0c1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZWRJbXBvcnRzTGVuZ3RoID0gbmFtZWRJbXBvcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBuYW1lZEltcG9ydHNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gc3ByZWFkRWxlbWVudElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhc0luSW1wb3J0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydEFsaWFzID09PSBzcHJlYWRFbGVtZW50SWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgcmVmZXJlbmNlZERlY2xhcmF0aW9uO1xuXG4gICAgICAgICAgICBpZiAoZm91bmRXaXRoQWxpYXNJbkltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZVBhdGhJc0JhZCA9IHBhdGggPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShwYXRoKSA9PSAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRJbmRpY2VzT2YgPSAoc2VhcmNoU3RyLCBzdHIsIGNhc2VTZW5zaXRpdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hTdHJMZW4gPSBzZWFyY2hTdHIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFN0ckxlbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0ciwgc3RhcnRJbmRleCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIHNlYXJjaFN0ckxlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRpY2VzO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpck5hbWVQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGUuZ2V0RmlsZVBhdGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaGVkSW1wb3J0UGF0aCA9IHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlYWRpbmdGaWxlUGF0aCA9IHNlYXJjaGVkSW1wb3J0UGF0aC5zcGxpdCgnLycpLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJOYW1lUGF0aCArICcvJyArIHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgKyAnLnRzJ1xuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVBhdGhJc0JhZChpbXBvcnRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlYWRpbmdJbmRpY2VzID0gZ2V0SW5kaWNlc09mKGxlYWRpbmdGaWxlUGF0aCwgaW1wb3J0UGF0aCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVhZGluZ0luZGljZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCByb3V0ZSBmaXhlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gbGVhZGluZ0luZGljZXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gbGVhZGluZ0luZGljZXNbbGVhZGluZ0luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFBhdGguc2xpY2UoMCwgc3RhcnRJbmRleCkgKyBpbXBvcnRQYXRoLnNsaWNlKGVuZEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9wIGxldmVsIHJvdXRlIGZpeGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShkaXJOYW1lUGF0aCkgKyAnLycgKyBzZWFyY2hlZEltcG9ydFBhdGggKyAnLnRzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlSW1wb3J0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChpbXBvcnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YXJpYWJsZU5hbWUgPSBmb3VuZFdpdGhBbGlhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWxpYXNPcmlnaW5hbE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNwcmVhZEVsZW1lbnRJZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlSW1wb3J0LmdldFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbm90LCB0cnkgZGlyZWN0bHkgaW4gZmlsZVxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWREZWNsYXJhdGlvbiA9IHNwcmVhZEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0U3ltYm9sT3JUaHJvdygpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIU5vZGUuaXNWYXJpYWJsZURlY2xhcmF0aW9uKHJlZmVyZW5jZWREZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBOb3QgaW1wbGVtZW50ZWQgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbiBraW5kOiAke3JlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRLaW5kTmFtZSgpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkQXJyYXkgPSByZWZlcmVuY2VkRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJJZktpbmRPclRocm93KFxuICAgICAgICAgICAgICAgIFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRBcnJheSA9IHNwcmVhZEVsZW1lbnQuZ2V0UGFyZW50SWZLaW5kT3JUaHJvdyhcbiAgICAgICAgICAgICAgICBTeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHNwcmVhZEVsZW1lbnRBcnJheS5nZXRFbGVtZW50cygpLmluZGV4T2Yoc3ByZWFkRWxlbWVudCk7XG4gICAgICAgICAgICBzcHJlYWRFbGVtZW50QXJyYXkucmVtb3ZlRWxlbWVudChzcHJlYWRFbGVtZW50KTtcbiAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRBcnJheS5pbnNlcnRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQXJyYXkuZ2V0RWxlbWVudHMoKS5tYXAoZSA9PiBlLmdldFRleHQoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5GaWxlRHluYW1pY3Moc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbnMgPSBmaWxlXG4gICAgICAgICAgICAuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gIU5vZGUuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpKTtcblxuICAgICAgICBsZXQgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiBvZiBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlaXIgcGFyZW50cyBub2RlcywgYW5kIGlmIG9uZSBpcyBhIHZhcmlhYmxlU3RhdGVtZW50IGFuZCA9PT0gJ3JvdXRlcydcbiAgICAgICAgICAgIGxldCBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmdldFBhcmVudFdoaWxlKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlUm91dGVzKG4uY29tcGlsZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQucHVzaChwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgZXhwcmVzc2lvbnNcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24gb2YgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmdldE5hbWVOb2RlKCk7XG4gICAgICAgICAgICBpZiAocHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uTm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Ob2RlTmFtZVN5bWJvbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Ob2RlTmFtZS5nZXRTeW1ib2xPclRocm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Ob2RlTmFtZVN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlZERlY2xhcmF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Ob2RlTmFtZVN5bWJvbC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFOb2RlLmlzUHJvcGVydHlBc3NpZ25tZW50KHJlZmVyZW5jZWREZWNsYXJhdGlvbikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLmlzRW51bU1lbWJlcihyZWZlcmVuY2VkRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5pc1Byb3BlcnR5QXNzaWdubWVudChyZWZlcmVuY2VkRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIU5vZGUuaXNFbnVtTWVtYmVyKHJlZmVyZW5jZWREZWNsYXJhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBpbXBsZW1lbnRlZCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uIGtpbmQ6ICR7cmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEtpbmROYW1lKCl9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplck9yVGhyb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLnJlcGxhY2VXaXRoVGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyT3JUaHJvdygpLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVwbGFjZSBjYWxsZXhwcmVzc2lvbnMgd2l0aCBzdHJpbmcgOiB1dGlscy5kb1dvcmsoKSAtPiAndXRpbHMuZG9Xb3JrKCknIGRvV29yaygpIC0+ICdkb1dvcmsoKSdcbiAgICAgKiBAcGFyYW0gc291cmNlRmlsZSB0cy5Tb3VyY2VGaWxlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFuQ2FsbEV4cHJlc3Npb25zKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgbGV0IGZpbGUgPSBzb3VyY2VGaWxlO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlU3RhdGVtZW50cyA9IHNvdXJjZUZpbGUuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2LmNvbXBpbGVyTm9kZS50eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdHlwZS50eXBlTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0eXBlLnR5cGVOYW1lLnRleHQgPT09ICdSb3V0ZXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZVN0YXRlbWVudHMuZ2V0SW5pdGlhbGl6ZXIoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxFeHByIG9mIGluaXRpYWxpemVyLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuQ2FsbEV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICBpZiAoY2FsbEV4cHIud2FzRm9yZ290dGVuKCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxFeHByLnJlcGxhY2VXaXRoVGV4dCh3cml0ZXIgPT4gd3JpdGVyLnF1b3RlKGNhbGxFeHByLmdldFRleHQoKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYW4gcm91dGVzIGRlZmluaXRpb24gd2l0aCBpbXBvcnRlZCBkYXRhLCBmb3IgZXhhbXBsZSBwYXRoLCBjaGlsZHJlbiwgb3IgZHluYW1pYyBzdHVmZiBpbnNpZGUgZGF0YVxuICAgICAqXG4gICAgICogY29uc3QgTVlfUk9VVEVTOiBSb3V0ZXMgPSBbXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIHBhdGg6ICdob21lJyxcbiAgICAgKiAgICAgICAgIGNvbXBvbmVudDogSG9tZUNvbXBvbmVudFxuICAgICAqICAgICB9LFxuICAgICAqICAgICB7XG4gICAgICogICAgICAgICBwYXRoOiBQQVRIUy5ob21lLFxuICAgICAqICAgICAgICAgY29tcG9uZW50OiBIb21lQ29tcG9uZW50XG4gICAgICogICAgIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogVGhlIGluaXRpYWxpemVyIGlzIGFuIGFycmF5IChBcnJheUxpdGVyYWxFeHByZXNzaW9uIC0gMTc3ICksIGl0IGhhcyBlbGVtZW50cywgb2JqZWN0cyAoT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gLSAxNzgpXG4gICAgICogd2l0aCBwcm9wZXJ0aWVzIChQcm9wZXJ0eUFzc2lnbm1lbnQgLSAyNjEpXG4gICAgICpcbiAgICAgKiBGb3IgZWFjaCBrbm93IHByb3BlcnR5IChodHRwczovL2FuZ3VsYXIuaW8vYXBpL3JvdXRlci9Sb3V0ZXMjZGVzY3JpcHRpb24pLCB3ZSB0cnkgdG8gc2VlIGlmIHdlIGhhdmUgd2hhdCB3ZSB3YW50XG4gICAgICpcbiAgICAgKiBFeDogcGF0aCBhbmQgcGF0aE1hdGNoIHdhbnQgYSBzdHJpbmcsIGNvbXBvbmVudCBhIGNvbXBvbmVudCByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBJdCBpcyBhbiBpbXBlcmF0aXZlIGFwcHJvYWNoLCBub3QgYSBnZW5lcmljIHdheSwgcGFyc2luZyBhbGwgdGhlIHRyZWVcbiAgICAgKiBhbmQgZmluZCBzb21ldGhpbmcgbGlrZSB0aGlzIHdoaWNoIHdpbGxsIGJyZWFrIEpTT04uc3RyaW5naWZ5IDogTVlJTVBPUlQucGF0aFxuICAgICAqXG4gICAgICogQHBhcmFtICB7dHMuTm9kZX0gaW5pdGlhbGl6ZXIgVGhlIG5vZGUgb2Ygcm91dGVzIGRlZmluaXRpb25cbiAgICAgKiBAcmV0dXJuIHt0cy5Ob2RlfSAgICAgICAgICAgICBUaGUgZWRpdGVkIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYW5Sb3V0ZXNEZWZpbml0aW9uV2l0aEltcG9ydChcbiAgICAgICAgaW5pdGlhbGl6ZXI6IHRzLkFycmF5TGl0ZXJhbEV4cHJlc3Npb24sXG4gICAgICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiB0cy5Ob2RlIHtcbiAgICAgICAgaW5pdGlhbGl6ZXIuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogdHMuUHJvcGVydHlBc3NpZ25tZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluaXRpYWxpemVyID0gcHJvcGVydHkuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGF0aCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlZGlyZWN0VG8nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvdXRsZXQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXRoTWF0Y2gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbml0aWFsaXplci5raW5kICE9PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZmllcig3MSkgd29uJ3QgYnJlYWsgcGFyc2luZywgYnV0IGl0IHdpbGwgYmUgYmV0dGVyIHRvIHJldHJpdmUgdGhlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24oMTc5KSBleDogTVlJTVBPUlQucGF0aCB3aWxsIGJyZWFrIGl0LCBmaW5kIGl0IGluIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RPYmplY3RMaXRlcmFsQXR0cmlidXRlTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIubmFtZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RPYmplY3RMaXRlcmFsQXR0cmlidXRlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluaXRpYWxpemVyLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci5leHByZXNzaW9uLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0c1V0aWwuZmluZFByb3BlcnR5VmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RPYmplY3RMaXRlcmFsQXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIua2luZCA9IDk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIudGV4dCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbml0aWFsaXplcjtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlclBhcnNlclV0aWwuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2R1bGVXaXRoUHJvdmlkZXJzKG5vZGU6IHRzLlZhcmlhYmxlU3RhdGVtZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdCkge1xuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zICYmIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLFxuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGU6IHRzLlR5cGVSZWZlcmVuY2VOb2RlID0gZGVjbGFyYXRpb24udHlwZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gdHlwZS50eXBlTmFtZS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gJ01vZHVsZVdpdGhQcm92aWRlcnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVXaXRoUHJvdmlkZXJzKG5vZGU6IHRzLlZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QpIHtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucyAmJiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGU6IHRzLlR5cGVSZWZlcmVuY2VOb2RlID0gZGVjbGFyYXRpb24udHlwZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gdHlwZS50eXBlTmFtZS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCA9PT0gJ01vZHVsZVdpdGhQcm92aWRlcnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCB7IFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBTdHJpbmdpZnlBcnJvd0Z1bmN0aW9uKGFmKSB7XG4gICAgbGV0IGkgPSAwLFxuICAgICAgICByZXN1bHQgPSAnKCc7XG4gICAgY29uc3QgbGVuID0gYWYucGFyYW1ldGVycy5sZW5ndGg7XG4gICAgaWYgKGxlbiA9PT0gMSkge1xuICAgICAgICByZXN1bHQgPSAnJztcbiAgICB9XG4gICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGFmLnBhcmFtZXRlcnNbaV0ubmFtZSAmJiBhZi5wYXJhbWV0ZXJzW2ldLm5hbWUuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBhZi5wYXJhbWV0ZXJzW2ldLm5hbWUuZXNjYXBlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJywgJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobGVuID4gMSB8fCBsZW4gPT09IDApIHtcbiAgICAgICAgcmVzdWx0ICs9ICcpJztcbiAgICB9XG4gICAgLy8gYm9keVxuICAgIHJlc3VsdCArPSAnID0+ICc7XG4gICAgaWYgKGFmLmJvZHkpIHtcbiAgICAgICAgaWYgKGFmLmJvZHkua2luZCA9PT0gU3ludGF4S2luZC5JZGVudGlmaWVyICYmIGFmLmJvZHkuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBhZi5ib2R5LmVzY2FwZWRUZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgYWYuYm9keS5raW5kID09PSBTeW50YXhLaW5kLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgYWYuYm9keS5leHByZXNzaW9uICYmXG4gICAgICAgICAgICBhZi5ib2R5Lm5hbWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYWYuYm9keS5leHByZXNzaW9uLmVzY2FwZWRUZXh0O1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcuJyArIGFmLmJvZHkubmFtZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChhZi5ib2R5LmtpbmQgPT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCAmJiBhZi5ib2R5LnRleHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBhZi5ib2R5LnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCB7IFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5pbXBvcnQgeyBTdHJpbmdpZnlBcnJvd0Z1bmN0aW9uIH0gZnJvbSAnLi9hcnJvdy1mdW5jdGlvbi51dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIFN0cmluZ2lmeU9iamVjdExpdGVyYWxFeHByZXNzaW9uKG9sZSkge1xuICAgIGxldCByZXR1cm5lZFN0cmluZyA9ICd7JztcblxuICAgIGlmIChvbGUucHJvcGVydGllcyAmJiBvbGUucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9sZS5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBwcm9wZXJ0eS5uYW1lLnRleHQgKyAnOiAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBgJ2AgKyBwcm9wZXJ0eS5pbml0aWFsaXplci50ZXh0ICsgYCdgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5UcnVlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBgdHJ1ZWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplci5raW5kID09PSBTeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBgZmFsc2VgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IFN0cmluZ2lmeUFycm93RnVuY3Rpb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IHByb3BlcnR5LmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4IDwgb2xlLnByb3BlcnRpZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9ICcsICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybmVkU3RyaW5nICs9ICd9JztcblxuICAgIHJldHVybiByZXR1cm5lZFN0cmluZztcbn1cbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IGdldE5hbWVzQ29tcGFyZUZuLCBtZXJnZVRhZ3NBbmRBcmdzLCBtYXJrZWR0YWdzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyBKc2RvY1BhcnNlclV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9qc2RvYy1wYXJzZXIudXRpbCc7XG5pbXBvcnQgeyBpc0lnbm9yZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCBBbmd1bGFyVmVyc2lvblV0aWwgZnJvbSAnLi4vLi4vLi4vLi4vLi4vL3V0aWxzL2FuZ3VsYXItdmVyc2lvbi51dGlsJztcbmltcG9ydCBCYXNpY1R5cGVVdGlsIGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2Jhc2ljLXR5cGUudXRpbCc7XG5pbXBvcnQgeyBTdHJpbmdpZnlPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL29iamVjdC1saXRlcmFsLWV4cHJlc3Npb24udXRpbCc7XG5cbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi4vLi4vLi4vLi4vZW5naW5lcy9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgU3RyaW5naWZ5QXJyb3dGdW5jdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2Fycm93LWZ1bmN0aW9uLnV0aWwnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IHsgbWFya2VkIH0gPSByZXF1aXJlKCdtYXJrZWQnKTtcblxuZXhwb3J0IGNsYXNzIENsYXNzSGVscGVyIHtcbiAgICBwcml2YXRlIGpzZG9jUGFyc2VyVXRpbCA9IG5ldyBKc2RvY1BhcnNlclV0aWwoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKSB7fVxuXG4gICAgLyoqXG4gICAgICogSEVMUEVSU1xuICAgICAqL1xuXG4gICAgcHVibGljIHN0cmluZ2lmeURlZmF1bHRWYWx1ZShub2RlOiB0cy5Ob2RlKTogc3RyaW5nIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG5vZGUuZ2V0VGV4dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXh0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgICAgcmV0dXJuICdmYWxzZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLlRydWVLZXl3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RydWUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0ZvckRlcHJlY2F0aW9uKHRhZ3M6IGFueVtdLCByZXN1bHQ6IHsgW2tleSBpbiBzdHJpbmcgfCBudW1iZXJdOiBhbnkgfSkge1xuICAgICAgICBfLmZvckVhY2godGFncywgdGFnID0+IHtcbiAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZSAmJiB0YWcudGFnTmFtZS50ZXh0ICYmIHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignZGVwcmVjYXRlZCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVwcmVjYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlcHJlY2F0aW9uTWVzc2FnZSA9IHRhZy5jb21tZW50IHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlY29yYXRvck9mVHlwZShub2RlLCBkZWNvcmF0b3JUeXBlKSB7XG4gICAgICAgIGxldCBkZWNvcmF0b3JzID0gbm9kZS5kZWNvcmF0b3JzIHx8IFtdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGNvbnN0IGxlbiA9IGRlY29yYXRvcnMubGVuZ3RoO1xuXG4gICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29yYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXS5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0uZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09IGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29yYXRvcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsZW4gPT09IDEgJiYgZGVjb3JhdG9yc1swXS5leHByZXNzaW9uICYmIGRlY29yYXRvcnNbMF0uZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnNbMF0uZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09IGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb3JhdG9yc1swXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdERlY29yYXRvcnMoZGVjb3JhdG9ycykge1xuICAgICAgICBsZXQgX2RlY29yYXRvcnMgPSBbXTtcblxuICAgICAgICBfLmZvckVhY2goZGVjb3JhdG9ycywgKGRlY29yYXRvcjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBfZGVjb3JhdG9ycy5wdXNoKHsgbmFtZTogZGVjb3JhdG9yLmV4cHJlc3Npb24udGV4dCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm86IGFueSA9IHsgbmFtZTogZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0IH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc3RyaW5naWZpZWRBcmd1bWVudHMgPSB0aGlzLnN0cmluZ2lmeUFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2RlY29yYXRvcnMucHVzaChpbmZvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBfZGVjb3JhdG9ycztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUZ1bmN0aW9uKGFyZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhcmcuZnVuY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAoKSA9PiB2b2lkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhcmd1bXMgPSBhcmcuZnVuY3Rpb24ubWFwKGFyZ3UgPT4ge1xuICAgICAgICAgICAgbGV0IF9yZXN1bHQgPSBEZXBlbmRlbmNpZXNFbmdpbmUuZmluZChhcmd1LnR5cGUpO1xuICAgICAgICAgICAgaWYgKF9yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5zb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBfcmVzdWx0LmRhdGEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuZGF0YS50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gJ2NsYXNzZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06IDxhIGhyZWY9XCIuLi8ke3BhdGh9cy8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfS5odG1sXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBBbmd1bGFyVmVyc2lvblV0aWwuZ2V0QXBpTGluayhcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChCYXNpY1R5cGVVdGlsLmlzS25vd25UeXBlKGFyZ3UudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IEJhc2ljVHlwZVV0aWwuZ2V0VHlwZVVybChhcmd1LnR5cGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3UubmFtZSAmJiBhcmd1LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICR7YXJndS50eXBlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3UubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZS50ZXh0fWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAoJHthcmd1bXN9KSA9PiB2b2lkYDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9wdGlvbmFsU3RyaW5nKGFyZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBhcmcub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0cmluZ2lmeUFyZ3VtZW50cyhhcmdzKSB7XG4gICAgICAgIGxldCBzdHJpbmdpZnlBcmdzID0gW107XG5cbiAgICAgICAgc3RyaW5naWZ5QXJncyA9IGFyZ3NcbiAgICAgICAgICAgIC5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcmVzdWx0ID0gRGVwZW5kZW5jaWVzRW5naW5lLmZpbmQoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBfcmVzdWx0LmRhdGEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06IDxhIGhyZWY9XCIuLi8ke3BhdGh9cy8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9Lmh0bWxcIj4ke2FyZy50eXBlfTwvYT5gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBBbmd1bGFyVmVyc2lvblV0aWwuZ2V0QXBpTGluayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyVmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2FyZy50eXBlfTwvYT5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZG90RG90RG90VG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAuLi4ke2FyZy5uYW1lfTogJHthcmcudHlwZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZ1bmN0aW9uKGFyZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXhwcmVzc2lvbiAmJiBhcmcubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnLmV4cHJlc3Npb24udGV4dCArICcuJyArIGFyZy5uYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXhwcmVzc2lvbiAmJiBhcmcua2luZCA9PT0gU3ludGF4S2luZC5OZXdFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbmV3ICcgKyBhcmcuZXhwcmVzc2lvbi50ZXh0ICsgJygpJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5raW5kICYmIGFyZy5raW5kID09PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAnYCArIGFyZy50ZXh0ICsgYCdgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGFyZy5raW5kICYmXG4gICAgICAgICAgICAgICAgICAgIGFyZy5raW5kID09PSBTeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLmVsZW1lbnRzICYmXG4gICAgICAgICAgICAgICAgICAgIGFyZy5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGFyZy5lbGVtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnWyc7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYCdgICsgYXJnLmVsZW1lbnRzW2ldLnRleHQgKyBgJ2A7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ10nO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGFyZy5raW5kICYmXG4gICAgICAgICAgICAgICAgICAgIGFyZy5raW5kID09PSBTeW50YXhLaW5kLkFycm93RnVuY3Rpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLnBhcmFtZXRlcnMgJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLnBhcmFtZXRlcnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5naWZ5QXJyb3dGdW5jdGlvbihhcmcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmtpbmQgJiYgYXJnLmtpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ2lmeU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGFyZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCYXNpY1R5cGVVdGlsLmlzS25vd25UeXBlKGFyZy50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gQmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKGFyZy50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2FyZy50eXBlfTwvYT5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsU3RyaW5naWZpZWRBcmd1bWVudCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlcGFyYXRvciA9ICc6JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyaW5naWZpZWRBcmd1bWVudCArPSBhcmcubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcua2luZCA9PT0gU3ludGF4S2luZC5Bc0V4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuZXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyaW5naWZpZWRBcmd1bWVudCArPSBhcmcuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgYXMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyaW5naWZpZWRBcmd1bWVudCArPSB0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFN0cmluZ2lmaWVkQXJndW1lbnQgKz0gc2VwYXJhdG9yICsgJyAnICsgdGhpcy52aXNpdFR5cGUoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsU3RyaW5naWZpZWRBcmd1bWVudDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy50ZXh0fWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5QXJncztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBvc2l0aW9uKG5vZGU6IHRzLk5vZGUsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiB0cy5MaW5lQW5kQ2hhcmFjdGVyIHtcbiAgICAgICAgbGV0IHBvc2l0aW9uOiB0cy5MaW5lQW5kQ2hhcmFjdGVyO1xuICAgICAgICBpZiAobm9kZS5uYW1lICYmIG5vZGUubmFtZS5lbmQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdHMuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oc291cmNlRmlsZSwgbm9kZS5uYW1lLmVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRzLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKHNvdXJjZUZpbGUsIG5vZGUucG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRBY2Nlc3NvcihhY2Nlc3NvcnMsIG5vZGVBY2Nlc3Nvciwgc291cmNlRmlsZSkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSAnJztcbiAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5uYW1lKSB7XG4gICAgICAgICAgICBub2RlTmFtZSA9IG5vZGVBY2Nlc3Nvci5uYW1lLnRleHQ7XG4gICAgICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG5vZGVBY2Nlc3Nvcik7XG5cbiAgICAgICAgICAgIGlmICghYWNjZXNzb3JzW25vZGVOYW1lXSkge1xuICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tub2RlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmF0dXJlOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZUFjY2Vzc29yLmtpbmQgPT09IFN5bnRheEtpbmQuU2V0QWNjZXNzb3IpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2V0U2lnbmF0dXJlID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBub2RlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZvaWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogbm9kZUFjY2Vzc29yLnBhcmFtZXRlcnMubWFwKHBhcmFtID0+IHRoaXMudmlzaXRBcmd1bWVudChwYXJhbSkpLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlOiBub2RlQWNjZXNzb3IudHlwZSA/IHRoaXMudmlzaXRUeXBlKG5vZGVBY2Nlc3Nvci50eXBlKSA6ICd2b2lkJyxcbiAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUpLmxpbmUgKyAxXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3IuanNEb2MgJiYgbm9kZUFjY2Vzc29yLmpzRG9jLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVBY2Nlc3NvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLnJhd2Rlc2NyaXB0aW9uID0gY2xlYW5lZERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmRlc2NyaXB0aW9uID0gbWFya2VkKGNsZWFuZWREZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHNldFNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgJiYgc2V0U2lnbmF0dXJlLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuanNkb2N0YWdzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRTaWduYXR1cmUuYXJncyAmJiBzZXRTaWduYXR1cmUuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHNldFNpZ25hdHVyZS5hcmdzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbbm9kZU5hbWVdLnNldFNpZ25hdHVyZSA9IHNldFNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3Iua2luZCA9PT0gU3ludGF4S2luZC5HZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIGxldCBnZXRTaWduYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBub2RlQWNjZXNzb3IudHlwZSA/IGtpbmRUb1R5cGUobm9kZUFjY2Vzc29yLnR5cGUua2luZCkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZTogbm9kZUFjY2Vzc29yLnR5cGUgPyB0aGlzLnZpc2l0VHlwZShub2RlQWNjZXNzb3IudHlwZSkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUpLmxpbmUgKyAxXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3IuanNEb2MgJiYgbm9kZUFjY2Vzc29yLmpzRG9jLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVBY2Nlc3NvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmF0dXJlLnJhd2Rlc2NyaXB0aW9uID0gY2xlYW5lZERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmF0dXJlLmRlc2NyaXB0aW9uID0gbWFya2VkKGNsZWFuZWREZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIGdldFNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIGdldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbbm9kZU5hbWVdLmdldFNpZ25hdHVyZSA9IGdldFNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNEaXJlY3RpdmVEZWNvcmF0b3IoZGVjb3JhdG9yOiB0cy5EZWNvcmF0b3IpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGxldCBkZWNvcmF0b3JJZGVudGlmaWVyVGV4dCA9IGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9ySWRlbnRpZmllclRleHQgPT09ICdEaXJlY3RpdmUnIHx8IGRlY29yYXRvcklkZW50aWZpZXJUZXh0ID09PSAnQ29tcG9uZW50J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNTZXJ2aWNlRGVjb3JhdG9yKGRlY29yYXRvcikge1xuICAgICAgICByZXR1cm4gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvblxuICAgICAgICAgICAgPyBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09ICdJbmplY3RhYmxlJ1xuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHJpdmF0ZShtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG1lbWJlci5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHJpdmF0ZTogYm9vbGVhbiA9IG1lbWJlci5tb2RpZmllcnMuc29tZShcbiAgICAgICAgICAgICAgICBtb2RpZmllciA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBFQ01BU2NyaXB0IFByaXZhdGUgRmllbGRzXG4gICAgICAgIGlmIChtZW1iZXIubmFtZSAmJiBtZW1iZXIubmFtZS5lc2NhcGVkVGV4dCkge1xuICAgICAgICAgICAgY29uc3QgaXNQcml2YXRlOiBib29sZWFuID0gbWVtYmVyLm5hbWUuZXNjYXBlZFRleHQuaW5kZXhPZignIycpID09PSAwO1xuICAgICAgICAgICAgaWYgKGlzUHJpdmF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGlkZGVuTWVtYmVyKG1lbWJlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1Byb3RlY3RlZChtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1lbWJlci5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHJvdGVjdGVkOiBib29sZWFuID0gbWVtYmVyLm1vZGlmaWVycy5zb21lKFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc1Byb3RlY3RlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGlkZGVuTWVtYmVyKG1lbWJlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0ludGVybmFsKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBpbnRlcm5hbFRhZ3M6IHN0cmluZ1tdID0gWydpbnRlcm5hbCddO1xuICAgICAgICBpZiAobWVtYmVyLmpzRG9jKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvYyBvZiBtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFRhZ3MuaW5kZXhPZih0YWcudGFnTmFtZS50ZXh0KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQdWJsaWMobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZW1iZXIubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBpc1B1YmxpYzogYm9vbGVhbiA9IG1lbWJlci5tb2RpZmllcnMuc29tZShcbiAgICAgICAgICAgICAgICBtb2RpZmllciA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNIaWRkZW5NZW1iZXIobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGludGVybmFsVGFnczogc3RyaW5nW10gPSBbJ2hpZGRlbiddO1xuICAgICAgICBpZiAobWVtYmVyLmpzRG9jKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvYyBvZiBtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFRhZ3MuaW5kZXhPZih0YWcudGFnTmFtZS50ZXh0KSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQaXBlRGVjb3JhdG9yKGRlY29yYXRvcikge1xuICAgICAgICByZXR1cm4gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvblxuICAgICAgICAgICAgPyBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09ICdQaXBlJ1xuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29udHJvbGxlckRlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnQ29udHJvbGxlcidcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01vZHVsZURlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnTmdNb2R1bGUnIHx8XG4gICAgICAgICAgICAgICAgICBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09ICdNb2R1bGUnXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZJU0lURVJTXG4gICAgICovXG5cbiAgICBwdWJsaWMgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgICAgICBjbGFzc0RlY2xhcmF0aW9uOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGU/OiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogYW55IHtcbiAgICAgICAgbGV0IHN5bWJvbCA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihjbGFzc0RlY2xhcmF0aW9uLm5hbWUpO1xuICAgICAgICBsZXQgcmF3ZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgbGV0IGRlcHJlY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlcHJlY2F0aW9uTWVzc2FnZSA9ICcnO1xuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IFtdO1xuICAgICAgICBpZiAoc3ltYm9sKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUoY2xhc3NEZWNsYXJhdGlvbiwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICByYXdkZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbWFya2VkKHJhd2Rlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIGlmIChzeW1ib2wudmFsdWVEZWNsYXJhdGlvbiAmJiBpc0lnbm9yZShzeW1ib2wudmFsdWVEZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3sgaWdub3JlOiB0cnVlIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN5bWJvbC5kZWNsYXJhdGlvbnMgJiYgc3ltYm9sLmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlY2xhcmF0aW9uc2pzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhzeW1ib2wuZGVjbGFyYXRpb25zWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uc2pzZG9jdGFncyAmJlxuICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnNqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zanNkb2N0YWdzWzBdLnRhZ3NcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb24gPSB7IGRlcHJlY2F0ZWQ6IGZhbHNlLCBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihkZWNsYXJhdGlvbnNqc2RvY3RhZ3NbMF0udGFncywgZGVwcmVjYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkID0gZGVwcmVjYXRpb24uZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlID0gZGVwcmVjYXRpb24uZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmUoc3ltYm9sLmRlY2xhcmF0aW9uc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt7IGlnbm9yZTogdHJ1ZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Moc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uID0geyBkZXByZWNhdGVkOiBmYWxzZSwgZGVwcmVjYXRpb25NZXNzYWdlOiAnJyB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIGRlcHJlY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCA9IGRlcHJlY2F0aW9uLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSA9IGRlcHJlY2F0aW9uLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBjbGFzc0RlY2xhcmF0aW9uLm5hbWUudGV4dDtcbiAgICAgICAgbGV0IG1lbWJlcnM7XG4gICAgICAgIGxldCBpbXBsZW1lbnRzRWxlbWVudHMgPSBbXTtcbiAgICAgICAgbGV0IGV4dGVuZHNFbGVtZW50O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHMuZ2V0RWZmZWN0aXZlSW1wbGVtZW50c1R5cGVOb2RlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBpbXBsZW1lbnRlZFR5cGVzID0gdHMuZ2V0RWZmZWN0aXZlSW1wbGVtZW50c1R5cGVOb2RlcyhjbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGlmIChpbXBsZW1lbnRlZFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBpbXBsZW1lbnRlZFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRUeXBlc1tpXS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzRWxlbWVudHMucHVzaChpbXBsZW1lbnRlZFR5cGVzW2ldLmV4cHJlc3Npb24udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRzLmdldENsYXNzRXh0ZW5kc0hlcml0YWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBleHRlbmRzVHlwZXMgPSB0cy5nZXRDbGFzc0V4dGVuZHNIZXJpdGFnZUVsZW1lbnQoY2xhc3NEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICBpZiAoZXh0ZW5kc1R5cGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuZHNUeXBlcy5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHNFbGVtZW50ID0gZXh0ZW5kc1R5cGVzLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVycyA9IHRoaXMudmlzaXRNZW1iZXJzKGNsYXNzRGVjbGFyYXRpb24ubWVtYmVycywgc291cmNlRmlsZSk7XG5cbiAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgLy8gTG9vcCBhbmQgc2VhcmNoIGZvciBvZmZpY2lhbCBkZWNvcmF0b3JzIGF0IHRvcC1sZXZlbCA6XG4gICAgICAgICAgICAvLyBBbmd1bGFyIDogQE5nTW9kdWxlLCBAQ29tcG9uZW50LCBARGlyZWN0aXZlLCBASW5qZWN0YWJsZSwgQFBpcGVcbiAgICAgICAgICAgIC8vIE5lc3RqcyA6IEBDb250cm9sbGVyLCBATW9kdWxlLCBASW5qZWN0YWJsZVxuICAgICAgICAgICAgLy8gU3RlbmNpbCA6IEBDb21wb25lbnRcbiAgICAgICAgICAgIGxldCBpc0RpcmVjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGlzU2VydmljZSA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGlzUGlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGlzTW9kdWxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXNDb250cm9sbGVyID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBhID0gMDsgYSA8IGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9ycy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2ldLmV4cHJlc3Npb24pO1xuXG4gICAgICAgICAgICAgICAgLy8gUkVUVVJOIFRPTyBFQVJMWSBGT1IgTUFOWSBERUNPUkFUT1JTICEhISFcbiAgICAgICAgICAgICAgICAvLyBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZGVjb3JhdG9ycyBhcnJheSB3ZSBoYXZlIHRvIGtlZXAgdGhlIGZsYWdzIGB0cnVlYCB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgbG9vcCBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICBpc0RpcmVjdGl2ZSA9XG4gICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0aXZlIHx8IHRoaXMuaXNEaXJlY3RpdmVEZWNvcmF0b3IoY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2FdKTtcbiAgICAgICAgICAgICAgICBpc1NlcnZpY2UgPSBpc1NlcnZpY2UgfHwgdGhpcy5pc1NlcnZpY2VEZWNvcmF0b3IoY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2FdKTtcbiAgICAgICAgICAgICAgICBpc1BpcGUgPSBpc1BpcGUgfHwgdGhpcy5pc1BpcGVEZWNvcmF0b3IoY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2FdKTtcbiAgICAgICAgICAgICAgICBpc01vZHVsZSA9IGlzTW9kdWxlIHx8IHRoaXMuaXNNb2R1bGVEZWNvcmF0b3IoY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2FdKTtcbiAgICAgICAgICAgICAgICBpc0NvbnRyb2xsZXIgPVxuICAgICAgICAgICAgICAgICAgICBpc0NvbnRyb2xsZXIgfHwgdGhpcy5pc0NvbnRyb2xsZXJEZWNvcmF0b3IoY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2FdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0RpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHJhd2Rlc2NyaXB0aW9uOiByYXdkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBtZW1iZXJzLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogbWVtYmVycy5vdXRwdXRzLFxuICAgICAgICAgICAgICAgICAgICBob3N0QmluZGluZ3M6IG1lbWJlcnMuaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBtZW1iZXJzLmhvc3RMaXN0ZW5lcnMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXM6IG1lbWJlcnMuaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU2VydmljZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IHJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IHJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBtZW1iZXJzLm1ldGhvZHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IHJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogbWVtYmVycy5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IG1lbWJlcnMub3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBtZW1iZXJzLmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWVtYmVycy5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBtZW1iZXJzLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlczogbWVtYmVycy5pbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAga2luZDogbWVtYmVycy5raW5kLFxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogbWVtYmVycy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IG1lbWJlcnMuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBtZW1iZXJzLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RCaW5kaW5nczogbWVtYmVycy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IG1lbWJlcnMuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdE1lbWJlcnMobWVtYmVycywgc291cmNlRmlsZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgaW5wdXRzID0gW107XG4gICAgICAgIGxldCBvdXRwdXRzID0gW107XG4gICAgICAgIGxldCBtZXRob2RzID0gW107XG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0gW107XG4gICAgICAgIGxldCBpbmRleFNpZ25hdHVyZXMgPSBbXTtcbiAgICAgICAgbGV0IGtpbmQ7XG4gICAgICAgIGxldCBpbnB1dERlY29yYXRvcjtcbiAgICAgICAgbGV0IGhvc3RCaW5kaW5ncyA9IFtdO1xuICAgICAgICBsZXQgaG9zdExpc3RlbmVycyA9IFtdO1xuICAgICAgICBsZXQgY29uc3RydWN0b3I7XG4gICAgICAgIGxldCBvdXRwdXREZWNvcmF0b3I7XG4gICAgICAgIGxldCBhY2Nlc3NvcnMgPSB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gQWxsb3dzIHR5cGVzY3JpcHQgZ3Vlc3MgdHlwZSB3aGVuIHVzaW5nIHRzLmlzKlxuICAgICAgICAgICAgbGV0IG1lbWJlciA9IG1lbWJlcnNbaV07XG5cbiAgICAgICAgICAgIGlucHV0RGVjb3JhdG9yID0gdGhpcy5nZXREZWNvcmF0b3JPZlR5cGUobWVtYmVyLCAnSW5wdXQnKTtcbiAgICAgICAgICAgIG91dHB1dERlY29yYXRvciA9IHRoaXMuZ2V0RGVjb3JhdG9yT2ZUeXBlKG1lbWJlciwgJ091dHB1dCcpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkSG9zdEJpbmRpbmdzID0gdGhpcy5nZXREZWNvcmF0b3JPZlR5cGUobWVtYmVyLCAnSG9zdEJpbmRpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEhvc3RMaXN0ZW5lcnMgPSB0aGlzLmdldERlY29yYXRvck9mVHlwZShtZW1iZXIsICdIb3N0TGlzdGVuZXInKTtcblxuICAgICAgICAgICAga2luZCA9IG1lbWJlci5raW5kO1xuXG4gICAgICAgICAgICBpZiAoaXNJZ25vcmUobWVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ludGVybmFsKG1lbWJlcikgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlucHV0RGVjb3JhdG9yICYmIGlucHV0RGVjb3JhdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpbnB1dHMucHVzaCh0aGlzLnZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhtZW1iZXIsIGlucHV0RGVjb3JhdG9yWzBdLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBtZW1iZXJzW2ldLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dERlY29yYXRvciAmJiBvdXRwdXREZWNvcmF0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG91dHB1dHMucHVzaCh0aGlzLnZpc2l0T3V0cHV0KG1lbWJlciwgb3V0cHV0RGVjb3JhdG9yWzBdLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEhvc3RCaW5kaW5ncyAmJiBwYXJzZWRIb3N0QmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBrID0gMCxcbiAgICAgICAgICAgICAgICAgICAgbGVuSEIgPSBwYXJzZWRIb3N0QmluZGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoazsgayA8IGxlbkhCOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhtZW1iZXIsIHBhcnNlZEhvc3RCaW5kaW5nc1trXSwgc291cmNlRmlsZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEhvc3RMaXN0ZW5lcnMgJiYgcGFyc2VkSG9zdExpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGwgPSAwLFxuICAgICAgICAgICAgICAgICAgICBsZW5ITCA9IHBhcnNlZEhvc3RMaXN0ZW5lcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAobDsgbCA8IGxlbkhMOyBsKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEhvc3RMaXN0ZW5lcihtZW1iZXIsIHBhcnNlZEhvc3RMaXN0ZW5lcnNbbF0sIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNIaWRkZW5NZW1iZXIobWVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMuaXNQcml2YXRlKG1lbWJlcikgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJpdmF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5pc0ludGVybmFsKG1lbWJlcikgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgISh0aGlzLmlzUHJvdGVjdGVkKG1lbWJlcikgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obWVtYmVyKSB8fCB0cy5pc01ldGhvZFNpZ25hdHVyZShtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMucHVzaCh0aGlzLnZpc2l0TWV0aG9kRGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG1lbWJlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eVNpZ25hdHVyZShtZW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXREZWNvcmF0b3IgJiYgIW91dHB1dERlY29yYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHRoaXMudmlzaXRQcm9wZXJ0eShtZW1iZXIsIHNvdXJjZUZpbGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godGhpcy52aXNpdENhbGxEZWNsYXJhdGlvbihtZW1iZXIsIHNvdXJjZUZpbGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5pc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obWVtYmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5pc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obWVtYmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEFjY2Vzc29yKGFjY2Vzc29ycywgbWVtYmVyc1tpXSwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0luZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXRJbmRleERlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzQ29uc3RydWN0b3JEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfY29uc3RydWN0b3JQcm9wZXJ0aWVzID0gdGhpcy52aXNpdENvbnN0cnVjdG9yUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGVuID0gX2NvbnN0cnVjdG9yUHJvcGVydGllcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goX2NvbnN0cnVjdG9yUHJvcGVydGllc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSB0aGlzLnZpc2l0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihtZW1iZXIsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0cy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBvdXRwdXRzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIGhvc3RCaW5kaW5ncy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBob3N0TGlzdGVuZXJzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIHByb3BlcnRpZXMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgbWV0aG9kcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBpbmRleFNpZ25hdHVyZXMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcblxuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgIG1ldGhvZHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFjY2Vzc29ycykubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHRbJ2FjY2Vzc29ycyddID0gYWNjZXNzb3JzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0VHlwZU5hbWUodHlwZU5hbWU6IHRzLklkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKHR5cGVOYW1lLmVzY2FwZWRUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZU5hbWUuZXNjYXBlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVOYW1lLnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlTmFtZS50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlTmFtZS5sZWZ0ICYmIHR5cGVOYW1lLnJpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdFR5cGVOYW1lKHR5cGVOYW1lLmxlZnQpICsgJy4nICsgdGhpcy52aXNpdFR5cGVOYW1lKHR5cGVOYW1lLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHVibGljIHZpc2l0VHlwZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IF9yZXR1cm4gPSAndm9pZCc7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUudHlwZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS50eXBlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS50eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIG5vZGUudHlwZS50eXBlQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMucHVzaCh0aGlzLnZpc2l0VHlwZShhcmd1bWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHR5cGVBcmd1bWVudHMuam9pbignIHwgJyk7XG4gICAgICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZpcnN0UGFydCA9IHRoaXMudmlzaXRUeXBlKG5vZGUudHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlLmtpbmQgPT09IFN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiA9ICcoJyArIF9maXJzdFBhcnQgKyAnKScgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlVHlwZXNPckVsZW1lbnRzID0gKGFyciwgc2VwYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gYXJyW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfZmlyc3RQYXJ0ID0gdGhpcy52aXNpdFR5cGUodHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lbGVtZW50VHlwZS5raW5kID09PSBTeW50YXhLaW5kLlBhcmVudGhlc2l6ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnKCcgKyBfZmlyc3RQYXJ0ICsgJyknICsga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUubGl0ZXJhbC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ1wiJyArIHR5cGUubGl0ZXJhbC50ZXh0ICsgJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5saXRlcmFsLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKHR5cGUudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gU3ludGF4S2luZC5SZXN0VHlwZSAmJiB0eXBlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcuLi4nICsgdGhpcy52aXNpdFR5cGUodHlwZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICc8JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiB0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5wdXNoKHRoaXMudmlzaXRUeXBlKGFyZ3VtZW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdHlwZUFyZ3VtZW50cy5qb2luKHNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuZWxlbWVudHMgJiYgdHMuaXNUdXBsZVR5cGVOb2RlKG5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdbJztcbiAgICAgICAgICAgICAgICBwYXJzZVR5cGVzT3JFbGVtZW50cyhub2RlLnR5cGUuZWxlbWVudHMsICcsICcpO1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ10nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS50eXBlcyAmJiB0cy5pc1VuaW9uVHlwZU5vZGUobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIHBhcnNlVHlwZXNPckVsZW1lbnRzKG5vZGUudHlwZS50eXBlcywgJyB8ICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5lbGVtZW50VHlwZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFR5cGVzID0gbm9kZS50eXBlLmVsZW1lbnRUeXBlcztcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IGVsZW1lbnRUeXBlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiA9ICdbJztcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtZW50VHlwZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5raW5kID09PSBTeW50YXhLaW5kLkFycmF5VHlwZSAmJiB0eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUuZWxlbWVudFR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0ga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKHR5cGUpICYmIHR5cGUubGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmxpdGVyYWwudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdcIicgKyB0eXBlLmxpdGVyYWwudGV4dCArICdcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUubGl0ZXJhbC5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKHR5cGUudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gU3ludGF4S2luZC5SZXN0VHlwZSAmJiB0eXBlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcuLi4nICsgdGhpcy52aXNpdFR5cGUodHlwZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUua2luZCA9PT0gU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS50eXBlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0eXBlLnR5cGVOYW1lLmVzY2FwZWRUZXh0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUudHlwZU5hbWUuZXNjYXBlZFRleHQgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICddJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS5lbGVtZW50VHlwZS5raW5kKSArIGtpbmRUb1R5cGUobm9kZS5raW5kKTtcbiAgICAgICAgICAgIGlmIChub2RlLmVsZW1lbnRUeXBlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IHRoaXMudmlzaXRUeXBlTmFtZShub2RlLmVsZW1lbnRUeXBlLnR5cGVOYW1lKSArIGtpbmRUb1R5cGUobm9kZS5raW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGVzICYmIHRzLmlzVW5pb25UeXBlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgX3JldHVybiA9ICcnO1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG5vZGUudHlwZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG5vZGUudHlwZXNbaV07XG4gICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKHR5cGUpICYmIHR5cGUubGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5saXRlcmFsLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ1wiJyArIHR5cGUubGl0ZXJhbC50ZXh0ICsgJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0ga2luZFRvVHlwZSh0eXBlLmxpdGVyYWwua2luZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSB0aGlzLnZpc2l0VHlwZU5hbWUodHlwZS50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcgfCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gJ2FueVtdJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9yZXR1cm4gPSBraW5kVG9UeXBlKG5vZGUua2luZCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgX3JldHVybiA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICBub2RlLmluaXRpYWxpemVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5pbml0aWFsaXplci5raW5kICYmXG4gICAgICAgICAgICAgICAgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5Qcm9wZXJ0eURlY2xhcmF0aW9uIHx8IG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5QYXJhbWV0ZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0ga2luZFRvVHlwZShub2RlLmluaXRpYWxpemVyLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5UeXBlUGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IG5vZGUubmFtZS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5MaXRlcmFsVHlwZSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSBub2RlLmxpdGVyYWwudGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzICYmIG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfcmV0dXJuICs9ICc8JztcbiAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICBsZW4gPSBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJndW1lbnQgPSBub2RlLnR5cGVBcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgICAgX3JldHVybiArPSB0aGlzLnZpc2l0VHlwZShhcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gMCAmJiBpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcsICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdENhbGxEZWNsYXJhdGlvbihtZXRob2Q6IHRzLkNhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSkge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNvdXJjZUZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgaWQ6ICdjYWxsLWRlY2xhcmF0aW9uLScgKyBoYXNoLFxuICAgICAgICAgICAgYXJnczogbWV0aG9kLnBhcmFtZXRlcnMgPyBtZXRob2QucGFyYW1ldGVycy5tYXAocHJvcCA9PiB0aGlzLnZpc2l0QXJndW1lbnQocHJvcCkpIDogW10sXG4gICAgICAgICAgICByZXR1cm5UeXBlOiB0aGlzLnZpc2l0VHlwZShtZXRob2QudHlwZSksXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG1ldGhvZCwgc291cmNlRmlsZSkubGluZSArIDEsXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJydcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1ldGhvZC5qc0RvYykge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKG1ldGhvZCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICBjb25zdCBjbGVhbmVkRGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICByZXN1bHQucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQoY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG1ldGhvZCk7XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHJlc3VsdCk7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SW5kZXhEZWNsYXJhdGlvbihcbiAgICAgICAgbWV0aG9kOiB0cy5JbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uLFxuICAgICAgICBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNvdXJjZUZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGlkOiAnaW5kZXgtZGVjbGFyYXRpb24tJyArIGhhc2gsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcbiAgICAgICAgaWYgKG1ldGhvZC5qc0RvYykge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKG1ldGhvZCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICBjb25zdCBjbGVhbmVkRGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICByZXN1bHQucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQoY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBpZiAoanNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5qc0RvYykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihcbiAgICAgICAgbWV0aG9kOiB0cy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLFxuICAgICAgICBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiAnY29uc3RydWN0b3InLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgYXJnczogbWV0aG9kLnBhcmFtZXRlcnMgPyBtZXRob2QucGFyYW1ldGVycy5tYXAocHJvcCA9PiB0aGlzLnZpc2l0QXJndW1lbnQocHJvcCkpIDogW10sXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG1ldGhvZCwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuXG4gICAgICAgIGlmIChtZXRob2QuanNEb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShtZXRob2QsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgcmVzdWx0LnJhd2Rlc2NyaXB0aW9uID0gY2xlYW5lZERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gbWFya2VkKGNsZWFuZWREZXNjcmlwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycykge1xuICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBraW5kcyA9IG1ldGhvZC5tb2RpZmllcnMubWFwKG1vZGlmaWVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVyLmtpbmQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZCkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSAhPT0gLTFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAga2luZHMgPSBraW5kcy5maWx0ZXIoa2luZCA9PiBraW5kICE9PSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0ga2luZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmpzZG9jdGFncyAmJiByZXN1bHQuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzLCByZXN1bHQuanNkb2N0YWdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWVyZ2VUYWdzQW5kQXJncyhyZXN1bHQuYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0UHJvcGVydHkocHJvcGVydHk6IHRzLlByb3BlcnR5RGVjbGFyYXRpb24sIHNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogcHJvcGVydHkubmFtZS50ZXh0LFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wZXJ0eS5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJpbmdpZnlEZWZhdWx0VmFsdWUocHJvcGVydHkuaW5pdGlhbGl6ZXIpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJycsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnZpc2l0VHlwZShwcm9wZXJ0eSksXG4gICAgICAgICAgICBvcHRpb25hbDogdHlwZW9mIHByb3BlcnR5LnF1ZXN0aW9uVG9rZW4gIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGpzZG9jdGFncztcblxuICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIgJiYgcHJvcGVydHkuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVmYXVsdFZhbHVlID0gJygpID0+IHsuLi59JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0Lm5hbWUgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9wZXJ0eS5uYW1lLmV4cHJlc3Npb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQubmFtZSA9IHByb3BlcnR5Lm5hbWUuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKHByb3BlcnR5KTtcblxuICAgICAgICBpZiAocHJvcGVydHkuanNEb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShwcm9wZXJ0eSwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICBjb25zdCBjbGVhbmVkRGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICByZXN1bHQucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQoY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eS5kZWNvcmF0b3JzKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVjb3JhdG9ycyA9IHRoaXMuZm9ybWF0RGVjb3JhdG9ycyhwcm9wZXJ0eS5kZWNvcmF0b3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBraW5kcyA9IHByb3BlcnR5Lm1vZGlmaWVycy5tYXAobW9kaWZpZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQgPSBraW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBmb3IgRUNNQVNjcmlwdCBQcml2YXRlIEZpZWxkc1xuICAgICAgICBpZiAodGhpcy5pc1ByaXZhdGUocHJvcGVydHkpKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5tb2RpZmllcktpbmQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzQWxyZWFkeVByaXZhdGVMZXl3b3JkID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kLmZvckVhY2gobW9kaWZpZXJLaW5kID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FscmVhZHlQcml2YXRlTGV5d29yZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWhhc0FscmVhZHlQcml2YXRlTGV5d29yZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQucHVzaChTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q29uc3RydWN0b3JQcm9wZXJ0aWVzKGNvbnN0ciwgc291cmNlRmlsZSkge1xuICAgICAgICBpZiAoY29uc3RyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGxldCBfcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IGNvbnN0ci5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyT2ZDb25zdHJ1Y3RvciA9IGNvbnN0ci5wYXJhbWV0ZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc0lnbm9yZShwYXJhbWV0ZXJPZkNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSW50ZXJuYWwocGFyYW1ldGVyT2ZDb25zdHJ1Y3RvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUHVibGljKHBhcmFtZXRlck9mQ29uc3RydWN0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wYXJhbWV0ZXJzLnB1c2godGhpcy52aXNpdFByb3BlcnR5KGNvbnN0ci5wYXJhbWV0ZXJzW2ldLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBNZXJnZSBKU0RvYyB0YWdzIGRlc2NyaXB0aW9uIGZyb20gY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChjb25zdHIuanNEb2MpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3RyLmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnN0clRhZ3MgPSBjb25zdHIuanNEb2NbMF0udGFncztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN0clRhZ3MgJiYgY29uc3RyVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJUYWdzLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50YWdOYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcudGFnTmFtZS5lc2NhcGVkVGV4dCA9PT0gJ3BhcmFtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUuZXNjYXBlZFRleHQgPT09IHBhcmFtLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlc2NyaXB0aW9uID0gdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9wYXJhbWV0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZDogdHMuTWV0aG9kRGVjbGFyYXRpb24sIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kLm5hbWUudGV4dCxcbiAgICAgICAgICAgIGFyZ3M6IG1ldGhvZC5wYXJhbWV0ZXJzID8gbWV0aG9kLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKSA6IFtdLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHR5cGVvZiBtZXRob2QucXVlc3Rpb25Ub2tlbiAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICByZXR1cm5UeXBlOiB0aGlzLnZpc2l0VHlwZShtZXRob2QudHlwZSksXG4gICAgICAgICAgICB0eXBlUGFyYW1ldGVyczogW10sXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG1ldGhvZCwgc291cmNlRmlsZSkubGluZSArIDEsXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJydcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IGluZmVycmVkIHR5cGVcbiAgICAgICAgICAgIGlmIChtZXRob2Quc3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN5bWJvbDogdHMuU3ltYm9sID0gbWV0aG9kLnN5bWJvbDtcbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN5bWJvbFR5cGUgPSB0aGlzLnR5cGVDaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wudmFsdWVEZWNsYXJhdGlvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLnR5cGVDaGVja2VyLmdldFNpZ25hdHVyZUZyb21EZWNsYXJhdGlvbihtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblR5cGUgPSBzaWduYXR1cmUuZ2V0UmV0dXJuVHlwZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXR1cm5UeXBlID0gdGhpcy50eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcocmV0dXJuVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QudHlwZVBhcmFtZXRlcnMgJiYgbWV0aG9kLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC50eXBlUGFyYW1ldGVycyA9IG1ldGhvZC50eXBlUGFyYW1ldGVycy5tYXAodHlwZVBhcmFtZXRlciA9PlxuICAgICAgICAgICAgICAgIHRoaXMudmlzaXRUeXBlKHR5cGVQYXJhbWV0ZXIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC5qc0RvYykge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKG1ldGhvZCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICBjb25zdCBjbGVhbmVkRGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICByZXN1bHQucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQoY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QuZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgcmVzdWx0LmRlY29yYXRvcnMgPSB0aGlzLmZvcm1hdERlY29yYXRvcnMobWV0aG9kLmRlY29yYXRvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQga2luZHMgPSBtZXRob2QubW9kaWZpZXJzLm1hcChtb2RpZmllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RpZmllci5raW5kO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgIT09IC0xXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmRzID0ga2luZHMuZmlsdGVyKGtpbmQgPT4ga2luZCAhPT0gU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm1vZGlmaWVyS2luZCA9IGtpbmRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBFQ01BU2NyaXB0IFByaXZhdGUgRmllbGRzXG4gICAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZShtZXRob2QpKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5tb2RpZmllcktpbmQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzQWxyZWFkeVByaXZhdGVMZXl3b3JkID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kLmZvckVhY2gobW9kaWZpZXJLaW5kID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FscmVhZHlQcml2YXRlTGV5d29yZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWhhc0FscmVhZHlQcml2YXRlTGV5d29yZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQucHVzaChTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRPdXRwdXQoXG4gICAgICAgIHByb3BlcnR5OiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgICAgICBvdXREZWNvcmF0b3I6IHRzLkRlY29yYXRvcixcbiAgICAgICAgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGVcbiAgICApIHtcbiAgICAgICAgbGV0IGluQXJncyA9IG91dERlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICAgICAgbGV0IF9yZXR1cm46IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGluQXJncy5sZW5ndGggPiAwID8gaW5BcmdzWzBdLnRleHQgOiBwcm9wZXJ0eS5uYW1lLnRleHQsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAocHJvcGVydHkuanNEb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShwcm9wZXJ0eSwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MocHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgX3JldHVybi5yYXdkZXNjcmlwdGlvbiA9IGNsZWFuZWREZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQoY2xlYW5lZERlc2NyaXB0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIF9yZXR1cm4pO1xuICAgICAgICAgICAgICAgIF9yZXR1cm4uanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfcmV0dXJuLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkuanNEb2MgJiYgcHJvcGVydHkuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3RGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLnJhd2Rlc2NyaXB0aW9uID0gcmF3RGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQocmF3RGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmV0dXJuLmxpbmUgPSB0aGlzLmdldFBvc2l0aW9uKHByb3BlcnR5LCBzb3VyY2VGaWxlKS5saW5lICsgMTtcblxuICAgICAgICBpZiAocHJvcGVydHkudHlwZSkge1xuICAgICAgICAgICAgX3JldHVybi50eXBlID0gdGhpcy52aXNpdFR5cGUocHJvcGVydHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaGFuZGxlIE5ld0V4cHJlc3Npb25cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc05ld0V4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplci5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLnR5cGUgPSBwcm9wZXJ0eS5pbml0aWFsaXplci5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEFyZ3VtZW50KGFyZzogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb24pIHtcbiAgICAgICAgbGV0IF9yZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGFyZy5uYW1lLnRleHQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnZpc2l0VHlwZShhcmcpLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhcmcuZG90RG90RG90VG9rZW4pIHtcbiAgICAgICAgICAgIF9yZXN1bHQuZG90RG90RG90VG9rZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcucXVlc3Rpb25Ub2tlbikge1xuICAgICAgICAgICAgX3Jlc3VsdC5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZy50eXBlKSB7XG4gICAgICAgICAgICBpZiAoYXJnLnR5cGUua2luZCkge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0Z1bmN0aW9uVHlwZU5vZGUoYXJnLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZnVuY3Rpb24gPSBhcmcudHlwZS5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFyZy50eXBlLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZy5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgX3Jlc3VsdC5kZWZhdWx0VmFsdWUgPSB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShhcmcuaW5pdGlhbGl6ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhhcmcpO1xuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCBfcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhwcm9wZXJ0eSwgaW5EZWNvcmF0b3IsIHNvdXJjZUZpbGU/KSB7XG4gICAgICAgIGxldCBpbkFyZ3MgPSBpbkRlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICAgICAgbGV0IF9yZXR1cm46IGFueSA9IHt9O1xuICAgICAgICBfcmV0dXJuLm5hbWUgPSBpbkFyZ3MubGVuZ3RoID4gMCA/IGluQXJnc1swXS50ZXh0IDogcHJvcGVydHkubmFtZS50ZXh0O1xuICAgICAgICBfcmV0dXJuLmRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICA/IHRoaXMuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKHByb3BlcnR5LmluaXRpYWxpemVyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIF9yZXR1cm4uZGVwcmVjYXRlZCA9IGZhbHNlO1xuICAgICAgICBfcmV0dXJuLmRlcHJlY2F0aW9uTWVzc2FnZSA9ICcnO1xuICAgICAgICBpZiAoIV9yZXR1cm4uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhwcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgX3JldHVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi5yYXdkZXNjcmlwdGlvbiA9IGNsZWFuZWREZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQoY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmV0dXJuLmxpbmUgPSB0aGlzLmdldFBvc2l0aW9uKHByb3BlcnR5LCBzb3VyY2VGaWxlKS5saW5lICsgMTtcbiAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBOZXdFeHByZXNzaW9uXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNOZXdFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCBpbmZlcnJlZCB0eXBlXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuc3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN5bWJvbDogdHMuU3ltYm9sID0gcHJvcGVydHkuc3ltYm9sO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2wudmFsdWVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3ltYm9sVHlwZSA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2xUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLnR5cGUgPSB0aGlzLnR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhzeW1ib2xUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHkua2luZCA9PT0gU3ludGF4S2luZC5TZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgLy8gRm9yIHNldHRlciBhY2Nlc3NvciwgZmluZCB0eXBlIGluIGZpcnN0IHBhcmFtZXRlclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnBhcmFtZXRlcnMgJiYgcHJvcGVydHkucGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkucGFyYW1ldGVyc1swXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5LnBhcmFtZXRlcnNbMF0udHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eS5kZWNvcmF0b3JzKSB7XG4gICAgICAgICAgICBfcmV0dXJuLmRlY29yYXRvcnMgPSB0aGlzLmZvcm1hdERlY29yYXRvcnMocHJvcGVydHkuZGVjb3JhdG9ycykuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5uYW1lICE9PSAnSW5wdXQnICYmIGl0ZW0ubmFtZSAhPT0gJ0hvc3RCaW5kaW5nJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SG9zdExpc3RlbmVyKHByb3BlcnR5LCBob3N0TGlzdGVuZXJEZWNvcmF0b3IsIHNvdXJjZUZpbGU/KSB7XG4gICAgICAgIGxldCBpbkFyZ3MgPSBob3N0TGlzdGVuZXJEZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcbiAgICAgICAgX3JldHVybi5uYW1lID0gaW5BcmdzLmxlbmd0aCA+IDAgPyBpbkFyZ3NbMF0udGV4dCA6IHByb3BlcnR5Lm5hbWUudGV4dDtcbiAgICAgICAgX3JldHVybi5hcmdzID0gcHJvcGVydHkucGFyYW1ldGVyc1xuICAgICAgICAgICAgPyBwcm9wZXJ0eS5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIF9yZXR1cm4uYXJnc0RlY29yYXRvciA9XG4gICAgICAgICAgICBpbkFyZ3MubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgID8gaW5BcmdzWzFdLmVsZW1lbnRzLm1hcChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcC50ZXh0O1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICBfcmV0dXJuLmRlcHJlY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgX3JldHVybi5kZXByZWNhdGlvbk1lc3NhZ2UgPSAnJztcbiAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUocHJvcGVydHksIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgY29uc3QganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKHByb3BlcnR5KTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuZWREZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgIF9yZXR1cm4ucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICBfcmV0dXJuLmRlc2NyaXB0aW9uID0gbWFya2VkKGNsZWFuZWREZXNjcmlwdGlvbik7XG5cbiAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCBfcmV0dXJuKTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghX3JldHVybi5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3RGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi5yYXdkZXNjcmlwdGlvbiA9IHJhd0Rlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi5kZXNjcmlwdGlvbiA9IG1hcmtlZChyYXdEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgY2xhc3MgVHNQcmludGVyVXRpbCB7XG4gICAgcHJpdmF0ZSBwcmludGVyOiB0cy5QcmludGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoe1xuICAgICAgICAgICAgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByaW50KG5vZGU6IHRzLk5vZGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmludGVyLnByaW50Tm9kZShcbiAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHRzLmNyZWF0ZVNvdXJjZUZpbGUoJycsICcnLCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0KVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IFRzUHJpbnRlclV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy90cy1wcmludGVyLnV0aWwnO1xuXG5pbXBvcnQgSW1wb3J0c1V0aWwgZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvaW1wb3J0cy51dGlsJztcblxuZXhwb3J0IGNsYXNzIFN5bWJvbEhlbHBlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1bmtub3duID0gJz8/Pyc7XG5cbiAgICBwdWJsaWMgcGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZTogc3RyaW5nLCBzcmNGaWxlPzogdHMuU291cmNlRmlsZSk6IElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgdHlwZTogJydcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBuc01vZHVsZSA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLmdldFR5cGUobmFtZSk7XG5cbiAgICAgICAgaWYgKG5zTW9kdWxlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5ucyA9IG5zTW9kdWxlWzBdO1xuICAgICAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNyY0ZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQuZmlsZSA9IEltcG9ydHNVdGlsLmdldEZpbGVOYW1lT2ZJbXBvcnQobmFtZSwgc3JjRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lO1xuICAgICAgICByZXN1bHQudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFR5cGUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHR5cGU7XG4gICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY29tcG9uZW50JykgIT09IC0xKSB7XG4gICAgICAgICAgICB0eXBlID0gJ2NvbXBvbmVudCc7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3BpcGUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAncGlwZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2NvbnRyb2xsZXInKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnY29udHJvbGxlcic7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ21vZHVsZScpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdkaXJlY3RpdmUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnZGlyZWN0aXZlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXRcbiAgICAgKiBSb3V0ZXJNb2R1bGUuZm9yUm9vdCAxNzlcbiAgICAgKi9cbiAgICBwdWJsaWMgYnVpbGRJZGVudGlmaWVyTmFtZShcbiAgICAgICAgbm9kZTogdHMuSWRlbnRpZmllciB8IHRzLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiB8IHRzLlNwcmVhZEVsZW1lbnQsXG4gICAgICAgIG5hbWVcbiAgICApIHtcbiAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlKSAmJiAhdHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtub2RlLnRleHR9LiR7bmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgbmFtZSA9IG5hbWUgPyBgLiR7bmFtZX1gIDogJyc7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gdGhpcy51bmtub3duO1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUubmFtZS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudGV4dCkge1xuICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uLnRleHQpIHtcbiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmV4cHJlc3Npb24uZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlLmV4cHJlc3Npb24uZWxlbWVudHMubWFwKGVsID0+IGVsLnRleHQpLmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gYFske25vZGVOYW1lfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cy5pc1NwcmVhZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgLi4uJHtub2RlTmFtZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkSWRlbnRpZmllck5hbWUobm9kZS5leHByZXNzaW9uLCBub2RlTmFtZSl9JHtuYW1lfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcGFyc2UgZXhwcmVzc2lvbnMgc3VjaCBhczpcbiAgICAgKiB7IHByb3ZpZGU6IEFQUF9CQVNFX0hSRUYsIHVzZVZhbHVlOiAnLycgfVxuICAgICAqIHsgcHJvdmlkZTogJ0RhdGUnLCB1c2VGYWN0b3J5OiAoZDEsIGQyKSA9PiBuZXcgRGF0ZSgpLCBkZXBzOiBbJ2QxJywgJ2QyJ10gfVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJzZVByb3ZpZGVyQ29uZmlndXJhdGlvbihub2RlOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbik6IHN0cmluZyB7XG4gICAgICAgIGlmIChub2RlLmtpbmQgJiYgbm9kZS5raW5kID09PSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTXG4gICAgICAgICAgICAvLyBhbmQgaWYgdHJ1ZSwgcmV0dXJuIHR5cGU6ICdpbnRlcmNlcHRvcicgKyBuYW1lXG4gICAgICAgICAgICBsZXQgaW50ZXJjZXB0b3JOYW1lLCBoYXNJbnRlcmNlcHRvcjtcbiAgICAgICAgICAgIGlmIChub2RlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKG5vZGUucHJvcGVydGllcywgcHJvcGVydHkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmtpbmQgJiYgcHJvcGVydHkua2luZCA9PT0gU3ludGF4S2luZC5Qcm9wZXJ0eUFzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubmFtZS50ZXh0ID09PSAncHJvdmlkZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyLnRleHQgPT09ICdIVFRQX0lOVEVSQ0VQVE9SUycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ludGVyY2VwdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ3VzZUNsYXNzJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICd1c2VFeGlzdGluZydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3JOYW1lID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNJbnRlcmNlcHRvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmNlcHRvck5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHNQcmludGVyVXRpbCgpLnByaW50KG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUc1ByaW50ZXJVdGlsKCkucHJpbnQobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLaW5kXG4gICAgICogIDE4MSBDYWxsRXhwcmVzc2lvbiA9PiBcIlJvdXRlck1vZHVsZS5mb3JSb290KGFyZ3MpXCJcbiAgICAgKiAgIDcxIElkZW50aWZpZXIgICAgID0+IFwiUm91dGVyTW9kdWxlXCIgXCJUb2RvU3RvcmVcIlxuICAgICAqICAgIDkgU3RyaW5nTGl0ZXJhbCAgPT4gXCIuL2FwcC5jb21wb25lbnQuY3NzXCIgXCIuL3RhYi5zY3NzXCJcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VTeW1ib2xFbGVtZW50cyhcbiAgICAgICAgbm9kZTpcbiAgICAgICAgICAgIHwgdHMuQ2FsbEV4cHJlc3Npb25cbiAgICAgICAgICAgIHwgdHMuSWRlbnRpZmllclxuICAgICAgICAgICAgfCB0cy5TdHJpbmdMaXRlcmFsXG4gICAgICAgICAgICB8IHRzLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvblxuICAgICAgICAgICAgfCB0cy5TcHJlYWRFbGVtZW50XG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgLy8gcGFyc2UgZXhwcmVzc2lvbnMgc3VjaCBhczogQW5ndWxhckZpcmVNb2R1bGUuaW5pdGlhbGl6ZUFwcChmaXJlYmFzZUNvbmZpZylcbiAgICAgICAgLy8gaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgdHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiB0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB8fFxuICAgICAgICAgICAgKHRzLmlzTmV3RXhwcmVzc2lvbihub2RlKSAmJiB0cy5pc0VsZW1lbnRBY2Nlc3NFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRoaXMuYnVpbGRJZGVudGlmaWVyTmFtZShub2RlLmV4cHJlc3Npb24pO1xuXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBhcmd1bWVudHMgY291bGQgYmUgcmVhbGx5IGNvbXBsZXguIFRoZXJlIGFyZSBzb1xuICAgICAgICAgICAgLy8gbWFueSB1c2UgY2FzZXMgdGhhdCB3ZSBjYW4ndCBoYW5kbGUuIEp1c3QgcHJpbnQgXCJhcmdzXCIgdG8gaW5kaWNhdGVcbiAgICAgICAgICAgIC8vIHRoYXQgd2UgaGF2ZSBhcmd1bWVudHMuXG5cbiAgICAgICAgICAgIGxldCBmdW5jdGlvbkFyZ3MgPSBub2RlLmFyZ3VtZW50cy5sZW5ndGggPiAwID8gJ2FyZ3MnIDogJyc7XG4gICAgICAgICAgICBsZXQgdGV4dCA9IGAke2NsYXNzTmFtZX0oJHtmdW5jdGlvbkFyZ3N9KWA7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgLy8gcGFyc2UgZXhwcmVzc2lvbnMgc3VjaCBhczogU2hhcmVkLk1vZHVsZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRJZGVudGlmaWVyTmFtZShub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlIGV4cHJlc3Npb25zIHN1Y2ggYXM6IE15Q29tcG9uZW50XG4gICAgICAgICAgICBpZiAobm9kZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUudGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmVzY2FwZWRUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZXNjYXBlZFRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNTcHJlYWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiAuLi5NWUFSUkFZXG4gICAgICAgICAgICAvLyBSZXNvbHZlIE1ZQVJSQVkgaW4gaW1wb3J0cyBvciBsb2NhbCBmaWxlIHZhcmlhYmxlcyBhZnRlciBmdWxsIHNjYW4sIGp1c3QgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZVxuICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbiAmJiBub2RlLmV4cHJlc3Npb24udGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlLnRleHQgPyBub2RlLnRleHQgOiB0aGlzLnBhcnNlUHJvdmlkZXJDb25maWd1cmF0aW9uKG5vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEtpbmRcbiAgICAgKiAgMTc3IEFycmF5TGl0ZXJhbEV4cHJlc3Npb25cbiAgICAgKiAgMTIyIEJvb2xlYW5LZXl3b3JkXG4gICAgICogICAgOSBTdHJpbmdMaXRlcmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVN5bWJvbHMoXG4gICAgICAgIG5vZGU6IHRzLk9iamVjdExpdGVyYWxFbGVtZW50LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBkZWNvcmF0b3JUeXBlOiBzdHJpbmdcbiAgICApOiBBcnJheTxzdHJpbmcgfCBib29sZWFuPiB7XG4gICAgICAgIGxldCBsb2NhbE5vZGUgPSBub2RlO1xuXG4gICAgICAgIGlmICh0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChsb2NhbE5vZGUpICYmIGRlY29yYXRvclR5cGUgIT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgIGxvY2FsTm9kZSA9IEltcG9ydHNVdGlsLmZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICBub2RlLm5hbWUudGV4dCxcbiAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgIGRlY29yYXRvclR5cGVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KGxvY2FsTm9kZSkgJiYgZGVjb3JhdG9yVHlwZSA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEltcG9ydHNVdGlsLmZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICBub2RlLm5hbWUudGV4dCxcbiAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgIGRlY29yYXRvclR5cGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gW2RhdGFdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvY2FsTm9kZS5pbml0aWFsaXplciAmJiB0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obG9jYWxOb2RlLmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsTm9kZS5pbml0aWFsaXplci5lbGVtZW50cy5tYXAoeCA9PiB0aGlzLnBhcnNlU3ltYm9sRWxlbWVudHMoeCkpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgKGxvY2FsTm9kZS5pbml0aWFsaXplciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobG9jYWxOb2RlLmluaXRpYWxpemVyKSkgfHxcbiAgICAgICAgICAgIChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIgJiYgdHMuaXNUZW1wbGF0ZUxpdGVyYWwobG9jYWxOb2RlLmluaXRpYWxpemVyKSkgfHxcbiAgICAgICAgICAgIChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIgJiZcbiAgICAgICAgICAgICAgICB0cy5pc1Byb3BlcnR5QXNzaWdubWVudChsb2NhbE5vZGUpICYmXG4gICAgICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyLnRleHQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtsb2NhbE5vZGUuaW5pdGlhbGl6ZXIudGV4dF07XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIgJiZcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplci5raW5kICYmXG4gICAgICAgICAgICAobG9jYWxOb2RlLmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuVHJ1ZUtleXdvcmQgfHxcbiAgICAgICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5GYWxzZUtleXdvcmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5UcnVlS2V5d29yZCA/IHRydWUgOiBmYWxzZV07XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxOb2RlLmluaXRpYWxpemVyICYmIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgIGxldCBpZGVudGlmaWVyID0gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKGxvY2FsTm9kZS5pbml0aWFsaXplcik7XG4gICAgICAgICAgICByZXR1cm4gW2lkZW50aWZpZXJdO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyICYmXG4gICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMgJiZcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gTm9kZSByZXBsYWNlZCBieSB0cy1zaW1wbGUtYXN0ICYga2luZCA9IDI2NVxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsTm9kZS5pbml0aWFsaXplci5lbGVtZW50cy5tYXAoeCA9PiB0aGlzLnBhcnNlU3ltYm9sRWxlbWVudHMoeCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bWJvbERlcHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIGRlY29yYXRvclR5cGU6IHN0cmluZyxcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbXVsdGlMaW5lPzogYm9vbGVhblxuICAgICk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICBsZW4gPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgICBmaWx0ZXJlZFByb3BzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwcm9wc1tpXS5uYW1lICYmIHByb3BzW2ldLm5hbWUudGV4dCA9PT0gZGVjb3JhdG9yVHlwZSkge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkUHJvcHMucHVzaChwcm9wc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsdGVyZWRQcm9wcy5tYXAoeCA9PiB0aGlzLnBhcnNlU3ltYm9scyh4LCBzcmNGaWxlLCBkZWNvcmF0b3JUeXBlKSkucG9wKCkgfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bWJvbERlcHNSYXcoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgbXVsdGlMaW5lPzogYm9vbGVhblxuICAgICk6IEFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuZmlsdGVyKG5vZGUgPT4gbm9kZS5uYW1lLnRleHQgPT09IHR5cGUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdCB7XG4gICAgbnM/OiBhbnk7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGZpbGU/OiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5pbXBvcnQgeyBkZXRlY3RJbmRlbnQgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDbGFzc0hlbHBlciB9IGZyb20gJy4vY2xhc3MtaGVscGVyJztcbmltcG9ydCB7IElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0LCBTeW1ib2xIZWxwZXIgfSBmcm9tICcuL3N5bWJvbC1oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50SGVscGVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjbGFzc0hlbHBlcjogQ2xhc3NIZWxwZXIsXG4gICAgICAgIHByaXZhdGUgc3ltYm9sSGVscGVyOiBTeW1ib2xIZWxwZXIgPSBuZXcgU3ltYm9sSGVscGVyKClcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50Q2hhbmdlRGV0ZWN0aW9uKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdjaGFuZ2VEZXRlY3Rpb24nLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50RW5jYXBzdWxhdGlvbihcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2VuY2Fwc3VsYXRpb24nLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UHVyZShcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAncHVyZScsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnROYW1lKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICduYW1lJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEV4cG9ydEFzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdleHBvcnRBcycsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRIb3N0KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+XG4gICAgKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbERlcHNPYmplY3QocHJvcHMsICdob3N0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFRhZyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAndGFnJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudElucHV0c01ldGFkYXRhKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnaW5wdXRzJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFRlbXBsYXRlKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAndGVtcGxhdGUnLCBzcmNGaWxlLCB0cnVlKS5wb3AoKTtcbiAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgIHQgPSBkZXRlY3RJbmRlbnQodCwgMCk7XG4gICAgICAgICAgICB0ID0gdC5yZXBsYWNlKC9cXG4vLCAnJyk7XG4gICAgICAgICAgICB0ID0gdC5yZXBsYWNlKC8gKyQvZ20sICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U3R5bGVVcmxzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3N0eWxlVXJscycsIHNyY0ZpbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdHlsZVVybChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3R5bGVVcmwnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U2hhZG93KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzaGFkb3cnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U2NvcGVkKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzY29wZWQnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50QXNzZXRzRGlyKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdhc3NldHNEaXInLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50QXNzZXRzRGlycyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVVcmxzKHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdhc3NldHNEaXInLCBzcmNGaWxlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFN0eWxlcyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzdHlsZXMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50TW9kdWxlSWQoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ21vZHVsZUlkJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudE91dHB1dHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnb3V0cHV0cycsIHNyY0ZpbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRQcm92aWRlcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAncHJvdmlkZXJzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEVudHJ5Q29tcG9uZW50cyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdlbnRyeUNvbXBvbmVudHMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50Vmlld1Byb3ZpZGVycyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICd2aWV3UHJvdmlkZXJzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFRlbXBsYXRlVXJsKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAndGVtcGxhdGVVcmwnLCBzcmNGaWxlKTtcbiAgICB9XG4gICAgcHVibGljIGdldENvbXBvbmVudEV4YW1wbGVVcmxzKHRleHQ6IHN0cmluZyk6IEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgZXhhbXBsZVVybHNNYXRjaGVzID0gdGV4dC5tYXRjaCgvPGV4YW1wbGUtdXJsPiguKj8pPFxcL2V4YW1wbGUtdXJsPi9nKTtcbiAgICAgICAgbGV0IGV4YW1wbGVVcmxzID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZXhhbXBsZVVybHNNYXRjaGVzICYmIGV4YW1wbGVVcmxzTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV4YW1wbGVVcmxzID0gZXhhbXBsZVVybHNNYXRjaGVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbC5yZXBsYWNlKC88XFwvP2V4YW1wbGUtdXJsPi9nLCAnJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhhbXBsZVVybHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFByZXNlcnZlV2hpdGVzcGFjZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3ByZXNlcnZlV2hpdGVzcGFjZXMnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U2VsZWN0b3IoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3NlbGVjdG9yJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVByb3BlcnRpZXMobm9kZTogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+KTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGxldCBvYmogPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IG5vZGUuaW5pdGlhbGl6ZXIucHJvcGVydGllcyB8fCBbXTtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgb2JqLnNldChwcm9wLm5hbWUudGV4dCwgcHJvcC5pbml0aWFsaXplci50ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bWJvbERlcHNPYmplY3QoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgbXVsdGlMaW5lPzogYm9vbGVhblxuICAgICk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICBsZW4gPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgICBmaWx0ZXJlZFByb3BzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwcm9wc1tpXS5uYW1lICYmIHByb3BzW2ldLm5hbWUudGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkUHJvcHMucHVzaChwcm9wc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkUHJvcHMubWFwKHggPT4gdGhpcy5wYXJzZVByb3BlcnRpZXMoeCkpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRJTyhcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbm9kZTogdHMuTm9kZSxcbiAgICAgICAgZmlsZUJvZHlcbiAgICApOiBhbnkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgcmVkdWNlZFNvdXJjZSA9IGZpbGVCb2R5ID8gZmlsZUJvZHkuc3RhdGVtZW50cyA6IHNvdXJjZUZpbGUuc3RhdGVtZW50cztcbiAgICAgICAgbGV0IHJlcyA9IHJlZHVjZWRTb3VyY2UucmVkdWNlKChkaXJlY3RpdmUsIHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5wb3MgPT09IG5vZGUucG9zICYmIHN0YXRlbWVudC5lbmQgPT09IG5vZGUuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmUuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc0hlbHBlci52aXNpdENsYXNzRGVjbGFyYXRpb24oZmlsZW5hbWUsIHN0YXRlbWVudCwgc291cmNlRmlsZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2FuaXRpemVVcmxzKHVybHM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHVybHMubWFwKHVybCA9PiB1cmwucmVwbGFjZSgnLi8nLCAnJykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENhY2hlIHtcbiAgICBwcml2YXRlIGNhY2hlOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IENsYXNzSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9jbGFzcy1oZWxwZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyJztcblxuaW1wb3J0IHsgY29tcGlsZXJIb3N0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwdWJsaWMgZmlsZXM6IHN0cmluZ1tdO1xuICAgIHB1YmxpYyBwcm9ncmFtOiB0cy5Qcm9ncmFtO1xuICAgIHB1YmxpYyB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXI7XG4gICAgcHVibGljIGNsYXNzSGVscGVyOiBDbGFzc0hlbHBlcjtcbiAgICBwdWJsaWMgY29tcG9uZW50SGVscGVyOiBDb21wb25lbnRIZWxwZXI7XG4gICAgcHVibGljIHJvdXRlclBhcnNlcjtcblxuICAgIGNvbnN0cnVjdG9yKGZpbGVzOiBzdHJpbmdbXSwgb3B0aW9uczogYW55KSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlcztcblxuICAgICAgICBjb25zdCB0cmFuc3BpbGVPcHRpb25zID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0cy5TY3JpcHRUYXJnZXQuRVM1LFxuICAgICAgICAgICAgbW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkNvbW1vbkpTLFxuICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IG9wdGlvbnMudHNjb25maWdEaXJlY3RvcnksXG4gICAgICAgICAgICBhbGxvd0pzOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgdHJhbnNwaWxlT3B0aW9ucyxcbiAgICAgICAgICAgIGNvbXBpbGVySG9zdCh0cmFuc3BpbGVPcHRpb25zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnR5cGVDaGVja2VyID0gdGhpcy5wcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gICAgICAgIHRoaXMuY2xhc3NIZWxwZXIgPSBuZXcgQ2xhc3NIZWxwZXIodGhpcy50eXBlQ2hlY2tlcik7XG4gICAgICAgIHRoaXMuY29tcG9uZW50SGVscGVyID0gbmV3IENvbXBvbmVudEhlbHBlcih0aGlzLmNsYXNzSGVscGVyKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjbG9uZURlZXAsIGNvbmNhdCwgZmluZCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyB9IGZyb20gJy4nO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi4vYXBwL2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5kc01lcmdlciB7XG4gICAgcHJpdmF0ZSBjb21wb25lbnRzO1xuICAgIHByaXZhdGUgY2xhc3NlcztcbiAgICBwcml2YXRlIGluamVjdGFibGVzO1xuICAgIHByaXZhdGUgZGlyZWN0aXZlcztcbiAgICBwcml2YXRlIGNvbnRyb2xsZXJzO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEV4dGVuZHNNZXJnZXI7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFFeHRlbmRzTWVyZ2VyLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBFeHRlbmRzTWVyZ2VyLmluc3RhbmNlID0gbmV3IEV4dGVuZHNNZXJnZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXh0ZW5kc01lcmdlci5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWVyZ2UoZGVwcykge1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBkZXBzLmNvbXBvbmVudHM7XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IGRlcHMuY2xhc3NlcztcbiAgICAgICAgdGhpcy5pbmplY3RhYmxlcyA9IGRlcHMuaW5qZWN0YWJsZXM7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRlcHMuZGlyZWN0aXZlcztcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IGRlcHMuY29udHJvbGxlcnM7XG5cbiAgICAgICAgY29uc3QgbWVyZ2VFeHRlbmRlZFByb3BlcnRpZXMgPSBjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmV4dGVuZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZXh0ID0gdGhpcy5maW5kSW5EZXBlbmRlbmNpZXMoY29tcG9uZW50LmV4dGVuZHMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN1cnNpdmVTY2FuV2l0aEluaGVyaXRhbmNlID0gY2xzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZyb20gY2xhc3MgdG8gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5tZXRob2RzICE9PSAndW5kZWZpbmVkJyAmJiBjbHMubWV0aG9kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld01ldGhvZHMgPSBjbG9uZURlZXAoY2xzLm1ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGhvZHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdNZXRob2RzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lm1ldGhvZHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ21ldGhvZHNDbGFzcycsIG5ld01ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2xzLnByb3BlcnRpZXMgIT09ICd1bmRlZmluZWQnICYmIGNscy5wcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGNsb25lRGVlcChjbHMucHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld1Byb3BlcnRpZXMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucHJvcGVydGllc0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAncHJvcGVydGllc0NsYXNzJywgbmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSBjb21wb25lbnQgdG8gY29tcG9uZW50IG9yIGRpcmVjdGl2ZSB0byBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2xzLmlucHV0c0NsYXNzICE9PSAndW5kZWZpbmVkJyAmJiBjbHMuaW5wdXRzQ2xhc3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdJbnB1dHMgPSBjbG9uZURlZXAoY2xzLmlucHV0c0NsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdJbnB1dHMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuaW5wdXRzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VJbmhlcml0YW5jZShjb21wb25lbnQsICdpbnB1dHNDbGFzcycsIG5ld0lucHV0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjbHMub3V0cHV0c0NsYXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5vdXRwdXRzQ2xhc3MubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld091dHB1dHMgPSBjbG9uZURlZXAoY2xzLm91dHB1dHNDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3V0cHV0cyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld091dHB1dHMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3V0cHV0c0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAnb3V0cHV0c0NsYXNzJywgbmV3T3V0cHV0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjbHMubWV0aG9kc0NsYXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5tZXRob2RzQ2xhc3MubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld01ldGhvZHMgPSBjbG9uZURlZXAoY2xzLm1ldGhvZHNDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWV0aG9kcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld01ldGhvZHMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQubWV0aG9kc0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAnbWV0aG9kc0NsYXNzJywgbmV3TWV0aG9kcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjbHMucHJvcGVydGllc0NsYXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5wcm9wZXJ0aWVzQ2xhc3MubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1Byb3BlcnRpZXMgPSBjbG9uZURlZXAoY2xzLnByb3BlcnRpZXNDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld1Byb3BlcnRpZXMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucHJvcGVydGllc0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAncHJvcGVydGllc0NsYXNzJywgbmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjbHMuaG9zdEJpbmRpbmdzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5ob3N0QmluZGluZ3MubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0hvc3RCaW5kaW5ncyA9IGNsb25lRGVlcChjbHMuaG9zdEJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIb3N0QmluZGluZ3MgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdIb3N0QmluZGluZ3MsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuaG9zdEJpbmRpbmdzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAnaG9zdEJpbmRpbmdzJywgbmV3SG9zdEJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNscy5ob3N0TGlzdGVuZXJzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5ob3N0TGlzdGVuZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdIb3N0TGlzdGVuZXJzID0gY2xvbmVEZWVwKGNscy5ob3N0TGlzdGVuZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIb3N0TGlzdGVuZXJzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3SG9zdExpc3RlbmVycywgY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5ob3N0TGlzdGVuZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAnaG9zdExpc3RlbmVycycsIG5ld0hvc3RMaXN0ZW5lcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgPSBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5tZXRob2RzQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNscy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlU2NhbldpdGhJbmhlcml0YW5jZSh0aGlzLmZpbmRJbkRlcGVuZGVuY2llcyhjbHMuZXh0ZW5kcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGNsYXNzIHRvIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5XaXRoSW5oZXJpdGFuY2UoZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2gobWVyZ2VFeHRlbmRlZFByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMuZm9yRWFjaChtZXJnZUV4dGVuZGVkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMuZm9yRWFjaChtZXJnZUV4dGVuZGVkUHJvcGVydGllcyk7XG5cbiAgICAgICAgY29uc3QgbWVyZ2VFeHRlbmRlZENsYXNzZXMgPSBlbCA9PiB7XG4gICAgICAgICAgICBsZXQgZXh0O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbC5leHRlbmRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGV4dCA9IHRoaXMuZmluZEluRGVwZW5kZW5jaWVzKGVsLmV4dGVuZHMpO1xuICAgICAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdXJzaXZlU2NhbldpdGhJbmhlcml0YW5jZSA9IGNscyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5tZXRob2RzICE9PSAndW5kZWZpbmVkJyAmJiBjbHMubWV0aG9kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld01ldGhvZHMgPSBjbG9uZURlZXAoY2xzLm1ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGhvZHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdNZXRob2RzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWwubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGVsLCAnbWV0aG9kcycsIG5ld01ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2xzLnByb3BlcnRpZXMgIT09ICd1bmRlZmluZWQnICYmIGNscy5wcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGNsb25lRGVlcChjbHMucHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld1Byb3BlcnRpZXMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbC5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoZWwsICdwcm9wZXJ0aWVzJywgbmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNscy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlU2NhbldpdGhJbmhlcml0YW5jZSh0aGlzLmZpbmRJbkRlcGVuZGVuY2llcyhjbHMuZXh0ZW5kcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGVsc3MgdG8gZWxzc1xuICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuV2l0aEluaGVyaXRhbmNlKGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY2xhc3Nlcy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRDbGFzc2VzKTtcbiAgICAgICAgdGhpcy5pbmplY3RhYmxlcy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRDbGFzc2VzKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzLmZvckVhY2gobWVyZ2VFeHRlbmRlZENsYXNzZXMpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzLmZvckVhY2gobWVyZ2VFeHRlbmRlZENsYXNzZXMpO1xuXG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFya0luaGVyaXRhbmNlKGRhdGEsIG9yaWdpbmFsb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEubWFwKGVsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBlbDtcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5oZXJpdGFuY2UgPSB7XG4gICAgICAgICAgICAgICAgZmlsZTogb3JpZ2luYWxvdXJjZS5uYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVyZ2VJbmhlcml0YW5jZShjb21wb25lbnQ6IGFueSwgbWV0YVByb3BlcnR5SWQ6IHN0cmluZywgbmV3TWVtYmVyczogYW55KSB7XG4gICAgICAgIG5ld01lbWJlcnMuZm9yRWFjaChuZXdNZW1iZXIgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGRlbk1ldGhvZCA9IGNvbXBvbmVudFttZXRhUHJvcGVydHlJZF0uZmluZChcbiAgICAgICAgICAgICAgICBjb21wb25lbnRNZW1iZXIgPT4gY29tcG9uZW50TWVtYmVyLm5hbWUgPT09IG5ld01lbWJlci5uYW1lXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAob3ZlcnJpZGRlbk1ldGhvZCkge1xuICAgICAgICAgICAgICAgIG92ZXJyaWRkZW5NZXRob2QuaW5oZXJpdGFuY2UgPSBuZXdNZW1iZXIuaW5oZXJpdGFuY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudFttZXRhUHJvcGVydHlJZF0ucHVzaChuZXdNZW1iZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRJbkRlcGVuZGVuY2llcyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkRGF0YSA9IGNvbmNhdChcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLFxuICAgICAgICAgICAgdGhpcy5jbGFzc2VzLFxuICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlcyxcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmluZChtZXJnZWREYXRhLCB7IG5hbWU6IG5hbWUgfSBhcyBhbnkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXh0ZW5kc01lcmdlci5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBjbGFzcyBDb2RlR2VuZXJhdG9yIHtcbiAgICBwdWJsaWMgZ2VuZXJhdGUobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0QW5kUmVjb2duaXplKG5vZGUsIFtdKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0QW5kUmVjb2duaXplKG5vZGU6IHRzLk5vZGUsIGNvZGU6IEFycmF5PHN0cmluZz4sIGRlcHRoID0gMCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB0aGlzLnJlY29nbml6ZShub2RlLCBjb2RlKTtcbiAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpLmZvckVhY2goYyA9PiB0aGlzLnZpc2l0QW5kUmVjb2duaXplKGMsIGNvZGUsIGRlcHRoICsgMSkpO1xuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY29nbml6ZShub2RlOiB0cy5Ob2RlLCBjb2RlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb24gPSBUc0tpbmRDb252ZXJzaW9uLmZpbmQoeCA9PiB4LmtpbmRzLnNvbWUoeiA9PiB6ID09PSBub2RlLmtpbmQpKTtcblxuICAgICAgICBpZiAoY29udmVyc2lvbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVyc2lvbi5vdXRwdXQobm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCh0ZXh0ID0+IHRoaXMuZ2VuKHRleHQsIGNvZGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvZGU6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSAnXFxuJykge1xuICAgICAgICAgICAgY29kZS5wdXNoKCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvZGUucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFRzS2luZHNUb1RleHQge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBvdXRwdXQ6IChub2RlOiB0cy5Ob2RlKSA9PiBBcnJheTxzdHJpbmc+LCBwdWJsaWMga2luZHM6IEFycmF5PFN5bnRheEtpbmQ+KSB7fVxufVxuXG5jb25zdCBUc0tpbmRDb252ZXJzaW9uOiBBcnJheTxUc0tpbmRzVG9UZXh0PiA9IFtcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChcbiAgICAgICAgbm9kZSA9PiBbJ1wiJywgbm9kZS50ZXh0LCAnXCInXSxcbiAgICAgICAgW1N5bnRheEtpbmQuRmlyc3RMaXRlcmFsVG9rZW4sIFN5bnRheEtpbmQuSWRlbnRpZmllcl1cbiAgICApLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydcIicsIG5vZGUudGV4dCwgJ1wiJ10sIFtTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWxdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2ltcG9ydCcsICcgJ10sIFtTeW50YXhLaW5kLkltcG9ydEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnZnJvbScsICcgJ10sIFtTeW50YXhLaW5kLkZyb21LZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1xcbicsICdleHBvcnQnLCAnICddLCBbU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2NsYXNzJywgJyAnXSwgW1N5bnRheEtpbmQuQ2xhc3NLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3RoaXMnXSwgW1N5bnRheEtpbmQuVGhpc0tleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnY29uc3RydWN0b3InXSwgW1N5bnRheEtpbmQuQ29uc3RydWN0b3JLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2ZhbHNlJ10sIFtTeW50YXhLaW5kLkZhbHNlS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWyd0cnVlJ10sIFtTeW50YXhLaW5kLlRydWVLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ251bGwnXSwgW1N5bnRheEtpbmQuTnVsbEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5BdFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJysnXSwgW1N5bnRheEtpbmQuUGx1c1Rva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyA9PiAnXSwgW1N5bnRheEtpbmQuRXF1YWxzR3JlYXRlclRoYW5Ub2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWycoJ10sIFtTeW50YXhLaW5kLk9wZW5QYXJlblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQoXG4gICAgICAgIG5vZGUgPT4gWyd7JywgJyAnXSxcbiAgICAgICAgW1N5bnRheEtpbmQuSW1wb3J0Q2xhdXNlLCBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uXVxuICAgICksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3snLCAnXFxuJ10sIFtTeW50YXhLaW5kLkJsb2NrXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ30nXSwgW1N5bnRheEtpbmQuQ2xvc2VCcmFjZVRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyknXSwgW1N5bnRheEtpbmQuQ2xvc2VQYXJlblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1snXSwgW1N5bnRheEtpbmQuT3BlbkJyYWNrZXRUb2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWyddJ10sIFtTeW50YXhLaW5kLkNsb3NlQnJhY2tldFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJzsnLCAnXFxuJ10sIFtTeW50YXhLaW5kLlNlbWljb2xvblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJywnLCAnICddLCBbU3ludGF4S2luZC5Db21tYVRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyAnLCAnOicsICcgJ10sIFtTeW50YXhLaW5kLkNvbG9uVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnLiddLCBbU3ludGF4S2luZC5Eb3RUb2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gW10sIFtTeW50YXhLaW5kLkRvU3RhdGVtZW50XSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbXSwgW1N5bnRheEtpbmQuRGVjb3JhdG9yXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyA9ICddLCBbU3ludGF4S2luZC5GaXJzdEFzc2lnbm1lbnRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnICddLCBbU3ludGF4S2luZC5GaXJzdFB1bmN0dWF0aW9uXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3ByaXZhdGUnLCAnICddLCBbU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydwdWJsaWMnLCAnICddLCBbU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSlcbl07XG4iLCJpbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi8uLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlcic7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50RGVwRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBoZWxwZXI6IENvbXBvbmVudEhlbHBlcikge31cblxuICAgIHB1YmxpYyBjcmVhdGUoZmlsZTogYW55LCBzcmNGaWxlOiBhbnksIG5hbWU6IGFueSwgcHJvcHM6IGFueSwgSU86IGFueSk6IElDb21wb25lbnREZXAge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh1dGlsLmluc3BlY3QocHJvcHMsIHsgc2hvd0hpZGRlbjogdHJ1ZSwgZGVwdGg6IDEwIH0pKTtcbiAgICAgICAgbGV0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgbGV0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGxldCBjb21wb25lbnREZXA6IElDb21wb25lbnREZXAgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdjb21wb25lbnQtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIC8vIGFuaW1hdGlvbnM/OiBzdHJpbmdbXTsgLy8gVE9ET1xuICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRDaGFuZ2VEZXRlY3Rpb24ocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RW5jYXBzdWxhdGlvbihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEVudHJ5Q29tcG9uZW50cyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBleHBvcnRBczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RXhwb3J0QXMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgaG9zdDogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SG9zdChwcm9wcyksXG4gICAgICAgICAgICBpbnB1dHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudElucHV0c01ldGFkYXRhKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIC8vIGludGVycG9sYXRpb24/OiBzdHJpbmc7IC8vIFRPRE8gd2FpdGluZyBkb2MgaW5mb3NcbiAgICAgICAgICAgIG1vZHVsZUlkOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRNb2R1bGVJZChwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBvdXRwdXRzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRPdXRwdXRzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50UHJvdmlkZXJzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIC8vIHF1ZXJpZXM/OiBEZXBzW107IC8vIFRPRE9cbiAgICAgICAgICAgIHNlbGVjdG9yOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRTZWxlY3Rvcihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBzdHlsZVVybHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFN0eWxlVXJscyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBzdHlsZXM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFN0eWxlcyhwcm9wcywgc3JjRmlsZSksIC8vIFRPRE8gZml4IGFyZ3NcbiAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRUZW1wbGF0ZShwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50VGVtcGxhdGVVcmwocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgdmlld1Byb3ZpZGVyczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50Vmlld1Byb3ZpZGVycyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBpbnB1dHNDbGFzczogSU8uaW5wdXRzLFxuICAgICAgICAgICAgb3V0cHV0c0NsYXNzOiBJTy5vdXRwdXRzLFxuICAgICAgICAgICAgcHJvcGVydGllc0NsYXNzOiBJTy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgbWV0aG9kc0NsYXNzOiBJTy5tZXRob2RzLFxuXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBJTy5kZXByZWNhdGlvbk1lc3NhZ2UsXG5cbiAgICAgICAgICAgIGhvc3RCaW5kaW5nczogSU8uaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgaG9zdExpc3RlbmVyczogSU8uaG9zdExpc3RlbmVycyxcblxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKSxcbiAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhzcmNGaWxlLmdldFRleHQoKSksXG5cbiAgICAgICAgICAgIHRhZzogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50VGFnKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlVXJsOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRTdHlsZVVybChwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBzaGFkb3c6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFNoYWRvdyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBzY29wZWQ6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFNjb3BlZChwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBhc3NldHNEaXI6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEFzc2V0c0Rpcihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBhc3NldHNEaXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRBc3NldHNEaXJzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlVXJsc0RhdGE6ICcnLFxuICAgICAgICAgICAgc3R5bGVzRGF0YTogJydcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcmVzZXJ2ZVdoaXRlc3BhY2VzKHByb3BzLCBzcmNGaWxlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5wcmVzZXJ2ZVdoaXRlc3BhY2VzID0gdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50UHJlc2VydmVXaGl0ZXNwYWNlcyhcbiAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICBzcmNGaWxlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLm1ldGhvZHNDbGFzcyA9IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyhjb21wb25lbnREZXAubWV0aG9kc0NsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuanNkb2N0YWdzID0gSU8uanNkb2N0YWdzWzBdLnRhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uZXh0ZW5kcykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLmV4dGVuZHMgPSBJTy5leHRlbmRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5pbXBsZW1lbnRzICYmIElPLmltcGxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLmltcGxlbWVudHMgPSBJTy5pbXBsZW1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5hY2Nlc3NvcnMpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5hY2Nlc3NvcnMgPSBJTy5hY2Nlc3NvcnM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcG9uZW50RGVwO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIGNoYW5nZURldGVjdGlvbjogYW55O1xuICAgIGVuY2Fwc3VsYXRpb246IGFueTtcbiAgICBleHBvcnRBczogYW55O1xuICAgIGhvc3Q6IGFueTtcbiAgICBpbnB1dHM6IEFycmF5PGFueT47XG4gICAgb3V0cHV0czogQXJyYXk8YW55PjtcbiAgICBwcm92aWRlcnM6IEFycmF5PGFueT47XG4gICAgbW9kdWxlSWQ6IHN0cmluZztcbiAgICBzZWxlY3Rvcjogc3RyaW5nO1xuICAgIHN0eWxlVXJsczogQXJyYXk8c3RyaW5nPjtcbiAgICBzdHlsZVVybHNEYXRhOiBzdHJpbmc7XG4gICAgc3R5bGVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0eWxlc0RhdGE6IHN0cmluZztcbiAgICB0ZW1wbGF0ZTogc3RyaW5nO1xuICAgIHRlbXBsYXRlVXJsOiBBcnJheTxzdHJpbmc+O1xuICAgIHZpZXdQcm92aWRlcnM6IEFycmF5PGFueT47XG4gICAgaW5wdXRzQ2xhc3M6IEFycmF5PGFueT47XG4gICAgb3V0cHV0c0NsYXNzOiBBcnJheTxhbnk+O1xuICAgIHByb3BlcnRpZXNDbGFzczogQXJyYXk8YW55PjtcbiAgICBtZXRob2RzQ2xhc3M6IEFycmF5PGFueT47XG5cbiAgICBkZXByZWNhdGVkOiBib29sZWFuO1xuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogc3RyaW5nO1xuXG4gICAgZW50cnlDb21wb25lbnRzOiBBcnJheTxhbnk+O1xuXG4gICAgaG9zdEJpbmRpbmdzOiBBcnJheTxhbnk+O1xuICAgIGhvc3RMaXN0ZW5lcnM6IEFycmF5PGFueT47XG5cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJhd2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuICAgIGV4YW1wbGVVcmxzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3JPYmo/OiBPYmplY3Q7XG4gICAganNkb2N0YWdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBleHRlbmRzPzogYW55O1xuICAgIGltcGxlbWVudHM/OiBhbnk7XG4gICAgYWNjZXNzb3JzPzogT2JqZWN0O1xuXG4gICAgdGFnPzogc3RyaW5nO1xuICAgIHN0eWxlVXJsPzogc3RyaW5nO1xuICAgIHNoYWRvdz86IHN0cmluZztcbiAgICBzY29wZWQ/OiBzdHJpbmc7XG4gICAgYXNzZXRzRGlyPzogc3RyaW5nO1xuICAgIGFzc2V0c0RpcnM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlcz86IGFueTtcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBDb250cm9sbGVyRGVwRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShcbiAgICAgICAgZmlsZTogYW55LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByb3BlcnRpZXM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgSU86IGFueVxuICAgICk6IElDb250cm9sbGVyRGVwIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzb3VyY2VDb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBjb25zdCBpbmZvczogSUNvbnRyb2xsZXJEZXAgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdjb250cm9sbGVyLScgKyBuYW1lICsgJy0nICsgaGFzaCxcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICB0eXBlOiAnY29udHJvbGxlcicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogSU8ucmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLnRleHQsXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBJTy5kZXByZWNhdGlvbk1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzWzBdLnRleHQpIHtcbiAgICAgICAgICAgICAgICBpbmZvcy5wcmVmaXggPSBwcm9wZXJ0aWVzWzBdLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmV4dGVuZHMpIHtcbiAgICAgICAgICAgIGluZm9zLmV4dGVuZHMgPSBJTy5leHRlbmRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvcztcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRyb2xsZXJEZXAgZXh0ZW5kcyBJRGVwIHtcbiAgICBmaWxlOiBhbnk7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmF3ZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgbWV0aG9kc0NsYXNzOiBBcnJheTxhbnk+O1xuICAgIGRlcHJlY2F0ZWQ6IGJvb2xlYW47XG4gICAgZGVwcmVjYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gICAgZXh0ZW5kcz86IGFueTtcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi8uLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RpdmVEZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGhlbHBlcjogQ29tcG9uZW50SGVscGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShmaWxlOiBhbnksIHNyY0ZpbGU6IGFueSwgbmFtZTogYW55LCBwcm9wczogYW55LCBJTzogYW55KTogSURpcmVjdGl2ZURlcCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVwczogSURpcmVjdGl2ZURlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2RpcmVjdGl2ZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgdHlwZTogJ2RpcmVjdGl2ZScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogSU8ucmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKSxcbiAgICAgICAgICAgIHNlbGVjdG9yOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRTZWxlY3Rvcihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBwcm92aWRlcnM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFByb3ZpZGVycyhwcm9wcywgc3JjRmlsZSksXG5cbiAgICAgICAgICAgIGlucHV0c0NsYXNzOiBJTy5pbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzQ2xhc3M6IElPLm91dHB1dHMsXG5cbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcblxuICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBJTy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBJTy5ob3N0TGlzdGVuZXJzLFxuXG4gICAgICAgICAgICBwcm9wZXJ0aWVzQ2xhc3M6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICBleGFtcGxlVXJsczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RXhhbXBsZVVybHMoc3JjRmlsZS5nZXRUZXh0KCkpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5tZXRob2RzQ2xhc3MgPSBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMoZGlyZWN0aXZlRGVwcy5tZXRob2RzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuanNkb2N0YWdzID0gSU8uanNkb2N0YWdzWzBdLnRhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmV4dGVuZHMpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuZXh0ZW5kcyA9IElPLmV4dGVuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmltcGxlbWVudHMgJiYgSU8uaW1wbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLmltcGxlbWVudHMgPSBJTy5pbXBsZW1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5jb25zdHJ1Y3Rvck9iaiA9IElPLmNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5hY2Nlc3NvcnMpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuYWNjZXNzb3JzID0gSU8uYWNjZXNzb3JzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmVEZXBzO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGlyZWN0aXZlRGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmF3ZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBzb3VyY2VDb2RlOiBzdHJpbmc7XG5cbiAgICBzZWxlY3Rvcjogc3RyaW5nO1xuICAgIHByb3ZpZGVyczogQXJyYXk8YW55PjtcblxuICAgIGlucHV0c0NsYXNzOiBhbnk7XG4gICAgb3V0cHV0c0NsYXNzOiBhbnk7XG5cbiAgICBkZXByZWNhdGVkOiBib29sZWFuO1xuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogc3RyaW5nO1xuXG4gICAgaG9zdEJpbmRpbmdzOiBhbnk7XG4gICAgaG9zdExpc3RlbmVyczogYW55O1xuXG4gICAgcHJvcGVydGllc0NsYXNzOiBhbnk7XG4gICAgbWV0aG9kc0NsYXNzOiBhbnk7XG4gICAgZXhhbXBsZVVybHM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvck9iaj86IE9iamVjdDtcbiAgICBqc2RvY3RhZ3M/OiBBcnJheTxzdHJpbmc+O1xuICAgIGltcGxlbWVudHM/OiBhbnk7XG4gICAgYWNjZXNzb3JzPzogT2JqZWN0O1xuICAgIGV4dGVuZHM/OiBhbnk7XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIEpzRG9jSGVscGVyIHtcbiAgICBwdWJsaWMgaGFzSlNEb2NJbnRlcm5hbFRhZyhcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbm9kZTogdHMuTm9kZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrU3RhdGVtZW50cyhzb3VyY2VGaWxlLnN0YXRlbWVudHMsIG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tTdGF0ZW1lbnRzKHN0YXRlbWVudHM6IFJlYWRvbmx5QXJyYXk8dHMuU3RhdGVtZW50Piwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50cy5zb21lKHggPT4gdGhpcy5jaGVja1N0YXRlbWVudCh4LCBub2RlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1N0YXRlbWVudChzdGF0ZW1lbnQ6IHRzLlN0YXRlbWVudCwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoc3RhdGVtZW50LnBvcyA9PT0gbm9kZS5wb3MgJiYgc3RhdGVtZW50LmVuZCA9PT0gbm9kZS5lbmQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmpzRG9jICYmIG5vZGUuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrSnNEb2NzKG5vZGUuanNEb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY3MoanNEb2NzOiBSZWFkb25seUFycmF5PHRzLkpTRG9jPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ganNEb2NzXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geC50YWdzICYmIHgudGFncy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLnNvbWUoeCA9PiB0aGlzLmNoZWNrSnNEb2NUYWdzKHgudGFncykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY1RhZ3ModGFnczogUmVhZG9ubHlBcnJheTx0cy5KU0RvY1RhZz4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRhZ3Muc29tZSh4ID0+IHgudGFnTmFtZSAmJiB4LnRhZ05hbWUudGV4dCA9PT0gJ2ludGVybmFsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU3ltYm9sSGVscGVyLCBJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdCB9IGZyb20gJy4vc3ltYm9sLWhlbHBlcic7XG5pbXBvcnQgeyBDb21wb25lbnRDYWNoZSB9IGZyb20gJy4vY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBEZXBzIH0gZnJvbSAnLi4vLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNhY2hlOiBDb21wb25lbnRDYWNoZSxcbiAgICAgICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXI6IFN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKVxuICAgICkge31cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVQcm92aWRlcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAncHJvdmlkZXJzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAocHJvdmlkZXJOYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKHByb3ZpZGVyTmFtZSwgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVDb250cm9sbGVycyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdjb250cm9sbGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKHByb3ZpZGVyTmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihwcm92aWRlck5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlRGVjbGFyYXRpb25zKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogRGVwc1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdkZWNsYXJhdGlvbnMnLCBzcmNGaWxlKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5jYWNoZS5nZXQobmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSwgc3JjRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVFbnRyeUNvbXBvbmVudHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBEZXBzW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2VudHJ5Q29tcG9uZW50cycsIHNyY0ZpbGUpLm1hcChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLmNhY2hlLmdldChuYW1lKTtcblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lLCBzcmNGaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbkltcG9ydEZvclJvb3RGb3JDaGlsZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbnNNb2R1bGUgPSBuYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmIChuc01vZHVsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuYW1lID0gbnNNb2R1bGVbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUltcG9ydHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnaW1wb3J0cycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5jbGVhbkltcG9ydEZvclJvb3RGb3JDaGlsZChuYW1lKSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUV4cG9ydHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZXhwb3J0cycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSwgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVJbXBvcnRzUmF3KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzUmF3KHByb3BzLCAnaW1wb3J0cycpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVJZChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIGxldCBfaWQgPSB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnaWQnLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGlkO1xuICAgICAgICBpZiAoX2lkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWQgPSBfaWRbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVTY2hlbWFzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKSB7XG4gICAgICAgIGxldCBzY2hlbWFzID0gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3NjaGVtYXMnLCBzcmNGaWxlKTtcbiAgICAgICAgcmV0dXJuIHNjaGVtYXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUJvb3RzdHJhcChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdib290c3RyYXAnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgSURlcCB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1vZHVsZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9tb2R1bGUtaGVscGVyJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVEZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZHVsZUhlbHBlcjogTW9kdWxlSGVscGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShcbiAgICAgICAgZmlsZTogYW55LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByb3BlcnRpZXM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgSU86IGFueVxuICAgICk6IElNb2R1bGVEZXAge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ21vZHVsZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgbmdpZDogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlSWQocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBwcm92aWRlcnM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZVByb3ZpZGVycyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlRGVjbGFyYXRpb25zKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgY29udHJvbGxlcnM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUNvbnRyb2xsZXJzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVFbnRyeUNvbXBvbmVudHMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBpbXBvcnRzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVJbXBvcnRzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZXhwb3J0czogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlRXhwb3J0cyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHNjaGVtYXM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZVNjaGVtYXMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBib290c3RyYXA6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUJvb3RzdHJhcChwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgbWV0aG9kczogSU8ubWV0aG9kcyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBJTy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUudGV4dCxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZVxuICAgICAgICB9IGFzIElNb2R1bGVEZXA7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNb2R1bGVEZXAgZXh0ZW5kcyBJRGVwIHtcbiAgICBmaWxlOiBhbnk7XG4gICAgcHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuICAgIGRlY2xhcmF0aW9uczogQXJyYXk8YW55PjtcbiAgICBjb250cm9sbGVyczogQXJyYXk8YW55PjtcbiAgICBlbnRyeUNvbXBvbmVudHM6IEFycmF5PGFueT47XG4gICAgaW1wb3J0czogQXJyYXk8YW55PjtcbiAgICBleHBvcnRzOiBBcnJheTxhbnk+O1xuICAgIGJvb3RzdHJhcDogYW55O1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmF3ZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBzb3VyY2VDb2RlOiBzdHJpbmc7XG4gICAgbWV0aG9kczogYW55O1xufVxuIiwiaW1wb3J0IHsgSURlcCB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIEVudGl0eURlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBjcmVhdGUoXG4gICAgICAgIGZpbGU6IGFueSxcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9wZXJ0aWVzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIElPOiBhbnlcbiAgICApOiBJRW50aXR5RGVwIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzb3VyY2VDb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBjb25zdCBpbmZvczogSUVudGl0eURlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbnRyb2xsZXItJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIHR5cGU6ICdlbnRpdHknLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS50ZXh0LFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogSU8uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgcHJvcGVydGllczogSU8ucHJvcGVydGllc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaW5mb3M7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnRpdHlEZXAgZXh0ZW5kcyBJRGVwIHtcbiAgICBmaWxlOiBhbnk7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmF3ZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBkZXByZWNhdGVkOiBib29sZWFuO1xuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT47XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBQcm9qZWN0LCB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgSXNLaW5kVHlwZSwga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzLCBtYXJrZWR0YWdzLCBtZXJnZVRhZ3NBbmRBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IENvbXBvbmVudHNUcmVlRW5naW5lIGZyb20gJy4uL2VuZ2luZXMvY29tcG9uZW50cy10cmVlLmVuZ2luZSc7XG5cbmltcG9ydCB7IEZyYW1ld29ya0RlcGVuZGVuY2llcyB9IGZyb20gJy4vZnJhbWV3b3JrLWRlcGVuZGVuY2llcyc7XG5cbmltcG9ydCBJbXBvcnRzVXRpbCBmcm9tICcuLi8uLi91dGlscy9pbXBvcnRzLnV0aWwnO1xuXG5pbXBvcnQge1xuICAgIGdldE1vZHVsZVdpdGhQcm92aWRlcnMsXG4gICAgaXNJZ25vcmUsXG4gICAgaXNNb2R1bGVXaXRoUHJvdmlkZXJzLFxuICAgIEpzZG9jUGFyc2VyVXRpbFxufSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmltcG9ydCBFeHRlbmRzTWVyZ2VyIGZyb20gJy4uLy4uL3V0aWxzL2V4dGVuZHMtbWVyZ2VyLnV0aWwnO1xuXG5pbXBvcnQgUm91dGVyUGFyc2VyVXRpbCBmcm9tICcuLi8uLi91dGlscy9yb3V0ZXItcGFyc2VyLnV0aWwnO1xuXG5pbXBvcnQgeyBDb2RlR2VuZXJhdG9yIH0gZnJvbSAnLi9hbmd1bGFyL2NvZGUtZ2VuZXJhdG9yJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2NvbXBvbmVudC1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBDb250cm9sbGVyRGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2NvbnRyb2xsZXItZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgRGlyZWN0aXZlRGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2RpcmVjdGl2ZS1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnRDYWNoZSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBKc0RvY0hlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvanMtZG9jLWhlbHBlcic7XG5pbXBvcnQgeyBNb2R1bGVIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL21vZHVsZS1oZWxwZXInO1xuaW1wb3J0IHsgU3ltYm9sSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IE1vZHVsZURlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgRW50aXR5RGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2VudGl0eS1kZXAuZmFjdG9yeSc7XG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5pbXBvcnQge1xuICAgIElEZXAsXG4gICAgSUVudW1EZWNEZXAsXG4gICAgSUZ1bmN0aW9uRGVjRGVwLFxuICAgIElJbmplY3RhYmxlRGVwLFxuICAgIElJbnRlcmZhY2VEZXAsXG4gICAgSVBpcGVEZXAsXG4gICAgSVR5cGVBbGlhc0RlY0RlcFxufSBmcm9tICcuL2FuZ3VsYXIvZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB7IG1hcmtlZCB9ID0gcmVxdWlyZSgnbWFya2VkJyk7XG5jb25zdCBhc3QgPSBuZXcgUHJvamVjdCgpO1xuXG4vLyBUeXBlU2NyaXB0IHJlZmVyZW5jZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21hc3Rlci9saWIvdHlwZXNjcmlwdC5kLnRzXG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyRGVwZW5kZW5jaWVzIGV4dGVuZHMgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwcml2YXRlIGVuZ2luZTogYW55O1xuICAgIHByaXZhdGUgY2FjaGU6IENvbXBvbmVudENhY2hlID0gbmV3IENvbXBvbmVudENhY2hlKCk7XG4gICAgcHJpdmF0ZSBtb2R1bGVIZWxwZXIgPSBuZXcgTW9kdWxlSGVscGVyKHRoaXMuY2FjaGUpO1xuICAgIHByaXZhdGUganNEb2NIZWxwZXIgPSBuZXcgSnNEb2NIZWxwZXIoKTtcbiAgICBwcml2YXRlIHN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKTtcbiAgICBwcml2YXRlIGpzZG9jUGFyc2VyVXRpbCA9IG5ldyBKc2RvY1BhcnNlclV0aWwoKTtcblxuICAgIGNvbnN0cnVjdG9yKGZpbGVzOiBzdHJpbmdbXSwgb3B0aW9uczogYW55KSB7XG4gICAgICAgIHN1cGVyKGZpbGVzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICBsZXQgZGVwcyA9IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICAgICAgZW50aXRpZXM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIGd1YXJkczogW10sXG4gICAgICAgICAgICBwaXBlczogW10sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICBjbGFzc2VzOiBbXSxcbiAgICAgICAgICAgIGludGVyZmFjZXM6IFtdLFxuICAgICAgICAgICAgbWlzY2VsbGFuZW91czoge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgICAgICAgICB0eXBlYWxpYXNlczogW10sXG4gICAgICAgICAgICAgICAgZW51bWVyYXRpb25zOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvdXRlc1RyZWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gdGhpcy5wcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkgfHwgW107XG5cbiAgICAgICAgc291cmNlRmlsZXMubWFwKChmaWxlOiB0cy5Tb3VyY2VGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUuZmlsZU5hbWU7XG5cbiAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZVBhdGgpID09PSAnLnRzJyB8fCBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpID09PSAnLnRzeCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhckpTUHJvamVjdCAmJiBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpID09PSAnLmpzJykge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygncGFyc2luZycsIGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTb3VyY2VGaWxlRGVjb3JhdG9ycyhmaWxlLCBkZXBzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5sYXN0SW5kZXhPZignLmQudHMnKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLmxhc3RJbmRleE9mKCdzcGVjLnRzJykgPT09IC0xXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ3BhcnNpbmcnLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNvdXJjZUZpbGVEZWNvcmF0b3JzKGZpbGUsIGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVwcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5kIG9mIGZpbGUgc2Nhbm5pbmdcbiAgICAgICAgLy8gVHJ5IG1lcmdpbmcgaW5zaWRlIHRoZSBzYW1lIGZpbGUgZGVjbGFyYXRlZCB2YXJpYWJsZXMgJiBtb2R1bGVzIHdpdGggaW1wb3J0cyB8IGV4cG9ydHMgfCBkZWNsYXJhdGlvbnMgfCBwcm92aWRlcnNcblxuICAgICAgICBpZiAoZGVwcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLmZvckVhY2goX3ZhcmlhYmxlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFyID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBsaW5rIC4uLlZBUiB0byBWQVIgdmFsdWVzLCByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICgoX3ZhciwgX25ld1ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXRUeXBlIHByIHJlY29uc3RydWlyZS4uLi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHNNYXRjaGVyID0gdmFyaWFiZWxUb1JlcGxhY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmVsVG9SZXBsYWNlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmVsVG9SZXBsYWNlLmluaXRpYWxpemVyLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJlbFRvUmVwbGFjZS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJlbFRvUmVwbGFjZS5pbml0aWFsaXplci5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCB2YWx1ZSAtPiBLaW5kIDc5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5raW5kID09PSBTeW50YXhLaW5kLklkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5zeW1ib2xIZWxwZXIuZ2V0VHlwZShlbGVtZW50LnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBfdmFyaWFibGUgaXMgQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiAyMDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaGFzIFNwcmVhZEVsZW1lbnRzIGluIGhpcyBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQua2luZCA9PT0gU3ludGF4S2luZC5TcHJlYWRFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRlcHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9PT0gZWxlbWVudC5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50c01hdGNoZXIoZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzTWF0Y2hlcihfdmFyKTtcbiAgICAgICAgICAgICAgICB9KShfdmFyaWFibGUsIG5ld1Zhcik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbkxpbmsgPSBtb2QgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzID0gKGluaXRpYWxBcnJheSwgX3ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4VG9DbGVhbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRWYXJpYWJsZUluQXJyYXkgPSAoZWwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5hbWUgPT09IF92YXIubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFRvQ2xlYW4gPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJyYXkuZm9yRWFjaChmaW5kVmFyaWFibGVJbkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIGluZGV4ZXMgdG8gcmVwbGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFycmF5LnNwbGljZShpbmRleFRvQ2xlYW4sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB2YXJpYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Zhci5mb3JFYWNoKG5ld0VsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBfLmZpbmQoaW5pdGlhbEFycmF5LCB7IG5hbWU6IG5ld0VsZS5uYW1lIH0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJyYXkucHVzaChuZXdFbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmltcG9ydHMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmV4cG9ydHMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmNvbnRyb2xsZXJzLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5kZWNsYXJhdGlvbnMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLnByb3ZpZGVycywgX3ZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZGVwcy5tb2R1bGVzLmZvckVhY2gob25MaW5rKTtcbiAgICAgICAgICAgICAgICBkZXBzLm1vZHVsZXNGb3JHcmFwaC5mb3JFYWNoKG9uTGluayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBvbmUgdGhpbmcgZXh0ZW5kcyBhbm90aGVyLCBtZXJnZSB0aGVtLCBvbmx5IGZvciBpbnRlcm5hbCBzb3VyY2VzXG4gICAgICAgICAqIC0gY2xhc3Nlc1xuICAgICAgICAgKiAtIGNvbXBvbmVudHNcbiAgICAgICAgICogLSBpbmplY3RhYmxlc1xuICAgICAgICAgKiAtIGRpcmVjdGl2ZXNcbiAgICAgICAgICogZm9yXG4gICAgICAgICAqIC0gaW5wdXRzXG4gICAgICAgICAqIC0gb3V0cHV0c1xuICAgICAgICAgKiAtIHByb3BlcnRpZXNcbiAgICAgICAgICogLSBtZXRob2RzXG4gICAgICAgICAqL1xuICAgICAgICBkZXBzID0gRXh0ZW5kc01lcmdlci5tZXJnZShkZXBzKTtcblxuICAgICAgICAvLyBSb3V0ZXJQYXJzZXJVdGlsLnByaW50TW9kdWxlc1JvdXRlcygpO1xuICAgICAgICAvLyBSb3V0ZXJQYXJzZXJVdGlsLnByaW50Um91dGVzKCk7XG5cbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5saW5rTW9kdWxlc0FuZFJvdXRlcygpO1xuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5jb25zdHJ1Y3RNb2R1bGVzVHJlZSgpO1xuXG4gICAgICAgICAgICBkZXBzLnJvdXRlc1RyZWUgPSBSb3V0ZXJQYXJzZXJVdGlsLmNvbnN0cnVjdFJvdXRlc1RyZWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc0NsYXNzKG5vZGUsIGZpbGUsIHNyY0ZpbGUsIG91dHB1dFN5bWJvbHMsIGZpbGVCb2R5KSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFN5bWJvbGVOYW1lKG5vZGUpO1xuICAgICAgICBjb25zdCBJTyA9IHRoaXMuZ2V0Q2xhc3NJTyhmaWxlLCBzcmNGaWxlLCBub2RlLCBmaWxlQm9keSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgY29uc3QgZGVwczogYW55ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkOiAnY2xhc3MtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgIHR5cGU6ICdjbGFzcycsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICB9O1xuICAgICAgICBsZXQgZXhjbHVkZUZyb21DbGFzc0FycmF5ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKElPLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBkZXBzLmNvbnN0cnVjdG9yT2JqID0gSU8uY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGRlcHMucHJvcGVydGllcyA9IElPLnByb3BlcnRpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBkZXBzLmRlc2NyaXB0aW9uID0gSU8uZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLnJhd2Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBkZXBzLnJhd2Rlc2NyaXB0aW9uID0gSU8ucmF3ZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLm1ldGhvZHMpIHtcbiAgICAgICAgICAgIGRlcHMubWV0aG9kcyA9IElPLm1ldGhvZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmluZGV4U2lnbmF0dXJlcykge1xuICAgICAgICAgICAgZGVwcy5pbmRleFNpZ25hdHVyZXMgPSBJTy5pbmRleFNpZ25hdHVyZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmV4dGVuZHMpIHtcbiAgICAgICAgICAgIGRlcHMuZXh0ZW5kcyA9IElPLmV4dGVuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmpzZG9jdGFncyAmJiBJTy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGVwcy5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBkZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW5wdXRzKSB7XG4gICAgICAgICAgICBkZXBzLmlucHV0c0NsYXNzID0gSU8uaW5wdXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5vdXRwdXRzKSB7XG4gICAgICAgICAgICBkZXBzLm91dHB1dHNDbGFzcyA9IElPLm91dHB1dHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmhvc3RCaW5kaW5ncykge1xuICAgICAgICAgICAgZGVwcy5ob3N0QmluZGluZ3MgPSBJTy5ob3N0QmluZGluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmhvc3RMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGRlcHMuaG9zdExpc3RlbmVycyA9IElPLmhvc3RMaXN0ZW5lcnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBkZXBzLm1ldGhvZHMgPSBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMoZGVwcy5tZXRob2RzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW1wbGVtZW50cyAmJiBJTy5pbXBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlcHMuaW1wbGVtZW50cyA9IElPLmltcGxlbWVudHM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzR3VhcmQoSU8uaW1wbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRoZSBHdWFyZCB0byBzaG93IHVwIGluIHRoZSBDbGFzc2VzIG1lbnVcbiAgICAgICAgICAgICAgICBleGNsdWRlRnJvbUNsYXNzQXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRlcHMudHlwZSA9ICdndWFyZCc7XG5cbiAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmd1YXJkcy5wdXNoKGRlcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhkZXBzKTtcblxuICAgICAgICAgICAgaWYgKCFleGNsdWRlRnJvbUNsYXNzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmNsYXNzZXMucHVzaChkZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlKGRlcHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3VyY2VGaWxlRGVjb3JhdG9ycyhpbml0aWFsU3JjRmlsZTogdHMuU291cmNlRmlsZSwgb3V0cHV0U3ltYm9sczogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUucmVwbGFjZShjbGVhbmVyLCAnJyk7XG4gICAgICAgIGxldCBzY2FubmVkRmlsZSA9IGluaXRpYWxTcmNGaWxlO1xuXG4gICAgICAgIC8vIFNlYXJjaCBpbiBmaWxlIGZvciB2YXJpYWJsZSBzdGF0ZW1lbnQgYXMgcm91dGVzIGRlZmluaXRpb25zXG5cbiAgICAgICAgY29uc3QgYXN0RmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChpbml0aWFsU3JjRmlsZS5maWxlTmFtZSk7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVSb3V0ZXNTdGF0ZW1lbnRzID0gYXN0RmlsZS5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKTtcbiAgICAgICAgbGV0IGhhc1JvdXRlc1N0YXRlbWVudHMgPSBmYWxzZTtcblxuICAgICAgICBpZiAodmFyaWFibGVSb3V0ZXNTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENsZWFuIGZpbGUgZm9yIHNwcmVhZCBhbmQgZHluYW1pY3MgaW5zaWRlIHJvdXRlcyBkZWZpbml0aW9uc1xuICAgICAgICAgICAgdmFyaWFibGVSb3V0ZXNTdGF0ZW1lbnRzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSBzLmdldERlY2xhcmF0aW9ucygpO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSB2YXJpYWJsZURlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uc1tpXS5jb21waWxlck5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25zW2ldLmNvbXBpbGVyTm9kZS50eXBlLnR5cGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbnNbaV0uY29tcGlsZXJOb2RlLnR5cGUudHlwZU5hbWUudGV4dCA9PT0gJ1JvdXRlcydcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JvdXRlc1N0YXRlbWVudHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzUm91dGVzU3RhdGVtZW50cyAmJiAhQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGgpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIGZpbGUgZm9yIHNwcmVhZCBhbmQgZHluYW1pY3MgaW5zaWRlIHJvdXRlcyBkZWZpbml0aW9uc1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0FuYWx5c2luZyByb3V0ZXMgZGVmaW5pdGlvbnMgYW5kIGNsZWFuIHRoZW0gaWYgbmVjZXNzYXJ5Jyk7XG5cbiAgICAgICAgICAgIC8vIHNjYW5uZWRGaWxlID0gUm91dGVyUGFyc2VyVXRpbC5jbGVhbkZpbGVJZGVudGlmaWVycyhhc3RGaWxlKS5jb21waWxlck5vZGU7XG4gICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmNsZWFuRmlsZVNwcmVhZHMoYXN0RmlsZSk7XG5cbiAgICAgICAgICAgIHNjYW5uZWRGaWxlID0gUm91dGVyUGFyc2VyVXRpbC5jbGVhbkNhbGxFeHByZXNzaW9ucyhhc3RGaWxlKS5jb21waWxlck5vZGU7XG4gICAgICAgICAgICBzY2FubmVkRmlsZSA9IFJvdXRlclBhcnNlclV0aWwuY2xlYW5GaWxlRHluYW1pY3MoYXN0RmlsZSkuY29tcGlsZXJOb2RlO1xuXG4gICAgICAgICAgICBzY2FubmVkRmlsZS5raW5kID0gU3ludGF4S2luZC5Tb3VyY2VGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHMuZm9yRWFjaENoaWxkKHNjYW5uZWRGaWxlLCAoaW5pdGlhbE5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmpzRG9jSGVscGVyLmhhc0pTRG9jSW50ZXJuYWxUYWcoZmlsZU5hbWUsIHNjYW5uZWRGaWxlLCBpbml0aWFsTm9kZSkgJiZcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVJbnRlcm5hbFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VOb2RlID0gKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWNvcmF0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbGFzc1dpdGhDdXN0b21EZWNvcmF0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaXREZWNvcmF0b3IgPSAodmlzaXRlZERlY29yYXRvciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXBzOiBJRGVwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRTeW1ib2xlTmFtZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5maW5kUHJvcGVydGllcyh2aXNpdGVkRGVjb3JhdG9yLCBzcmNGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElPID0gdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SU8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9kdWxlKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlRGVwID0gbmV3IE1vZHVsZURlcEZhY3RvcnkodGhpcy5tb2R1bGVIZWxwZXIpLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUm91dGVyUGFyc2VyVXRpbC5oYXNSb3V0ZXJNb2R1bGVJbkltcG9ydHMobW9kdWxlRGVwLmltcG9ydHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuYWRkTW9kdWxlV2l0aFJvdXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVJbXBvcnRzUmF3KHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IG1vZHVsZURlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRNb2R1bGUobmFtZSwgbW9kdWxlRGVwLmltcG9ydHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1vZHVsZXMucHVzaChtb2R1bGVEZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1vZHVsZXNGb3JHcmFwaC5wdXNoKG1vZHVsZURlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ29tcG9uZW50KHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERlcCA9IG5ldyBDb21wb25lbnREZXBGYWN0b3J5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEhlbHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY3JlYXRlKGZpbGUsIHNyY0ZpbGUsIG5hbWUsIHByb3BzLCBJTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGNvbXBvbmVudERlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50c1RyZWVFbmdpbmUuYWRkQ29tcG9uZW50KGNvbXBvbmVudERlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudERlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ29udHJvbGxlcih2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXJEZXAgPSBuZXcgQ29udHJvbGxlckRlcEZhY3RvcnkoKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGNvbnRyb2xsZXJEZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuY29udHJvbGxlcnMucHVzaChjb250cm9sbGVyRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNFbnRpdHkodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlEZXAgPSBuZXcgRW50aXR5RGVwRmFjdG9yeSgpLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gZW50aXR5RGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBzLm5hbWUgPT09ICdDb21tZW50Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkZXBzLnByb3BlcnRpZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmVudGl0aWVzLnB1c2goZW50aXR5RGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbmplY3RhYmxlKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5qZWN0YWJsZURlcHM6IElJbmplY3RhYmxlRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2luamVjdGFibGUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBJTy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBJTy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogSU8ucmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlVXJsczogdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50RXhhbXBsZVVybHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmpzZG9jdGFncyAmJiBJTy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmFjY2Vzc29ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5hY2Nlc3NvcnMgPSBJTy5hY2Nlc3NvcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmV4dGVuZHMgPSBJTy5leHRlbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gaW5qZWN0YWJsZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKElPLmltcGxlbWVudHMsICdIdHRwSW50ZXJjZXB0b3InKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMudHlwZSA9ICdpbnRlcmNlcHRvcic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmludGVyY2VwdG9ycy5wdXNoKGluamVjdGFibGVEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzR3VhcmQoSU8uaW1wbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLnR5cGUgPSAnZ3VhcmQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5ndWFyZHMucHVzaChpbmplY3RhYmxlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy50eXBlID0gJ2luamVjdGFibGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGROZXdFbnRpdHlJblN0b3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuaW5qZWN0YWJsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQaXBlKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlwZURlcHM6IElQaXBlRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3BpcGUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncGlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd2Rlc2NyaXB0aW9uOiBJTy5yYXdkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogSU8ucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogSU8ubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZTogdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50UHVyZShwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nbmFtZTogdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50TmFtZShwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlVXJsczogdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50RXhhbXBsZVVybHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVEZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gcGlwZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMucGlwZXMucHVzaChwaXBlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRGlyZWN0aXZlKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVwcyA9IG5ldyBEaXJlY3RpdmVEZXBGYWN0b3J5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEhlbHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY3JlYXRlKGZpbGUsIHNyY0ZpbGUsIG5hbWUsIHByb3BzLCBJTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGRpcmVjdGl2ZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzTXVsdGlwbGVEZWNvcmF0b3JzV2l0aEludGVybmFsT25lID0gdGhpcy5oYXNJbnRlcm5hbERlY29yYXRvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNvcmF0b3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGEgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjbGFzc1dpdGhDdXN0b21EZWNvcmF0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc011bHRpcGxlRGVjb3JhdG9yc1dpdGhJbnRlcm5hbE9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1dpdGhDdXN0b21EZWNvcmF0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDbGFzcyhub2RlLCBmaWxlLCBzcmNGaWxlLCBvdXRwdXRTeW1ib2xzLCBmaWxlQm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQobmFtZSwgZGVwcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckJ5RGVjb3JhdG9ycyA9IGZpbHRlcmVkTm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWROb2RlLmV4cHJlc3Npb24gJiYgZmlsdGVyZWROb2RlLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfdGVzdCA9IC8oTmdNb2R1bGV8Q29tcG9uZW50fEluamVjdGFibGV8UGlwZXxEaXJlY3RpdmUpLy50ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZE5vZGUuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX3Rlc3QgJiYgdHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90ZXN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjb3JhdG9ycy5maWx0ZXIoZmlsdGVyQnlEZWNvcmF0b3JzKS5mb3JFYWNoKHZpc2l0RGVjb3JhdG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnN5bWJvbC5mbGFncyA9PT0gdHMuU3ltYm9sRmxhZ3MuQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NsYXNzKG5vZGUsIGZpbGUsIHNyY0ZpbGUsIG91dHB1dFN5bWJvbHMsIGZpbGVCb2R5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLnN5bWJvbC5mbGFncyA9PT0gdHMuU3ltYm9sRmxhZ3MuSW50ZXJmYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRTeW1ib2xlTmFtZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElPID0gdGhpcy5nZXRJbnRlcmZhY2VJTyhmaWxlLCBzcmNGaWxlLCBub2RlLCBmaWxlQm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmZhY2VEZXBzOiBJSW50ZXJmYWNlRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbnRlcmZhY2UtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogSU8uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5wcm9wZXJ0aWVzID0gSU8ucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5pbmRleFNpZ25hdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLmluZGV4U2lnbmF0dXJlcyA9IElPLmluZGV4U2lnbmF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5raW5kID0gSU8ua2luZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMuZGVzY3JpcHRpb24gPSBJTy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLnJhd2Rlc2NyaXB0aW9uID0gSU8ucmF3ZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8ubWV0aG9kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMubWV0aG9kcyA9IElPLm1ldGhvZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uZXh0ZW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMuZXh0ZW5kcyA9IElPLmV4dGVuZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGludGVyZmFjZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZShpbnRlcmZhY2VEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zID0gdGhpcy52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWQgPSBpbmZvcy5kZXByZWNhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25EZXA6IElGdW5jdGlvbkRlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25EZXAuYXJncyA9IGluZm9zLmFyZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MucmV0dXJuVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLnJldHVyblR5cGUgPSBpbmZvcy5yZXR1cm5UeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmpzZG9jdGFncyAmJiBpbmZvcy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmpzZG9jdGFncyA9IGluZm9zLmpzZG9jdGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzUHJpdmF0ZUpTRG9jVGFnKGZ1bmN0aW9uRGVwLmpzZG9jdGFncykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGZ1bmN0aW9uRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNFbnVtRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zID0gdGhpcy52aXNpdEVudW1EZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZCA9IGluZm9zLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGlvbk1lc3NhZ2UgPSBpbmZvcy5kZXByZWNhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtRGVwczogSUVudW1EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHM6IGluZm9zLm1lbWJlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAnZW51bScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXRFbnVtVHlwZUFsaWFzRnVuY3Rpb25EZWNsYXJhdGlvbkRlc2NyaXB0aW9uKG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGVudW1EZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLnB1c2goZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zID0gdGhpcy52aXNpdFR5cGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZCA9IGluZm9zLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGlvbk1lc3NhZ2UgPSBpbmZvcy5kZXByZWNhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlQWxpYXNEZXBzOiBJVHlwZUFsaWFzRGVjRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndHlwZWFsaWFzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXd0eXBlOiB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShub2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLmtpbmQgPSBub2RlLnR5cGUua2luZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUFsaWFzRGVwcy5yYXd0eXBlID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLnJhd3R5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLmtpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLmtpbmQgPT09IFN5bnRheEtpbmQuVGVtcGxhdGVMaXRlcmFsVHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFsaWFzRGVwcy5yYXd0eXBlID0gc3JjRmlsZS50ZXh0LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlLnBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlLmVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMucHVzaCh0eXBlQWxpYXNEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbmZvcy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zyh0eXBlQWxpYXNEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc01vZHVsZURlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keS5zdGF0ZW1lbnRzICYmIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ib2R5LnN0YXRlbWVudHMuZm9yRWFjaChzdGF0ZW1lbnQgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTm9kZShmaWxlLCBzcmNGaWxlLCBzdGF0ZW1lbnQsIG5vZGUuYm9keSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBJTyA9IHRoaXMuZ2V0Um91dGVJTyhmaWxlLCBzcmNGaWxlLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElPLnJvdXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1JvdXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVzID0gUm91dGVyUGFyc2VyVXRpbC5jbGVhblJhd1JvdXRlUGFyc2VkKElPLnJvdXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JvdXRlcyBwYXJzaW5nIGVycm9yLCBtYXliZSBhIHRyYWlsaW5nIGNvbW1hIG9yIGFuIGV4dGVybmFsIHZhcmlhYmxlLCB0cnlpbmcgdG8gZml4IHRoYXQgbGF0ZXIgYWZ0ZXIgc291cmNlcyBzY2FubmluZy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZXMgPSBJTy5yb3V0ZXMucmVwbGFjZSgvIC9nbSwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuYWRkSW5jb21wbGV0ZVJvdXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbmV3Um91dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLnJvdXRlcyA9IFsuLi5vdXRwdXRTeW1ib2xzLnJvdXRlcywgLi4ubmV3Um91dGVzXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDbGFzcyhub2RlLCBmaWxlLCBzcmNGaWxlLCBvdXRwdXRTeW1ib2xzLCBmaWxlQm9keSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzRXhwcmVzc2lvblN0YXRlbWVudChub2RlKSB8fCB0cy5pc0lmU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib290c3RyYXBNb2R1bGVSZWZlcmVuY2UgPSAnYm9vdHN0cmFwTW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHJvb3QgbW9kdWxlIHdpdGggYm9vdHN0cmFwTW9kdWxlIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIGZpbmQgYSBzaW1wbGUgY2FsbCA6IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIG9yIGluc2lkZSBhIGNhbGwgOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gd2l0aCBhIGNhdGNoIDogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQuIHdpdGggcGFyYW1ldGVycyA6IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7fSkuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5lcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCByZWN1c2l2ZWx5IGluIGV4cHJlc3Npb24gbm9kZXMgb25lIHdpdGggbmFtZSAnYm9vdHN0cmFwTW9kdWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvb3RNb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNGaWxlLnRleHQuaW5kZXhPZihib290c3RyYXBNb2R1bGVSZWZlcmVuY2UpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Tm9kZSA9IHRoaXMuZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb3RzdHJhcE1vZHVsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLnRoZW5TdGF0ZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudGhlblN0YXRlbWVudC5zdGF0ZW1lbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRoZW5TdGF0ZW1lbnQuc3RhdGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0U3RhdGVtZW50ID0gbm9kZS50aGVuU3RhdGVtZW50LnN0YXRlbWVudHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHROb2RlID0gdGhpcy5maW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTdGF0ZW1lbnQuZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vdHN0cmFwTW9kdWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24uYXJndW1lbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHROb2RlID0gdGhpcy5maW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbkFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24uYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHROb2RlLmFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gocmVzdWx0Tm9kZS5hcmd1bWVudHMsIChhcmd1bWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50LnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE1vZHVsZSA9IGFyZ3VtZW50LnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3RNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuc2V0Um9vdE1vZHVsZShyb290TW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKSAmJiAhUm91dGVyUGFyc2VyVXRpbC5pc1ZhcmlhYmxlUm91dGVzKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNEZXN0cnVjdHVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBkZXN0cnVjdHVyaW5nIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlVmFyaWFibGVEZWNsYXJhdGlvbnMgPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYXJpYWJsZURlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5uYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVmFyaWFibGVEZWNsYXJhdGlvbnNbMF0ubmFtZS5raW5kID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEtpbmQuQXJyYXlCaW5kaW5nUGF0dGVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVzdHJ1Y3R1cmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaXRWYXJpYWJsZU5vZGUgPSB2YXJpYWJsZU5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zOiBhbnkgPSB0aGlzLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZCA9IGluZm9zLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwczogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy50eXBlID0gaW5mb3MudHlwZSA/IGluZm9zLnR5cGUgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZWZhdWx0VmFsdWUgPSBpbmZvcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmluaXRpYWxpemVyID0gaW5mb3MuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOb2RlLmpzRG9jICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5vZGUuanNEb2MubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOb2RlLmpzRG9jWzBdLmNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdEZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlSlNEb2NOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTm9kZS5qc0RvY1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucmF3ZGVzY3JpcHRpb24gPSByYXdEZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMuZGVzY3JpcHRpb24gPSBtYXJrZWQocmF3RGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vZHVsZVdpdGhQcm92aWRlcnModmFyaWFibGVOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGluZ0luaXRpYWxpemVyID0gZ2V0TW9kdWxlV2l0aFByb3ZpZGVycyh2YXJpYWJsZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRNb2R1bGVXaXRoUm91dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRpbmdJbml0aWFsaXplcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuYWRkTW9kdWxlKG5hbWUsIFtyb3V0aW5nSW5pdGlhbGl6ZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKHZhcmlhYmxlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLnB1c2goZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXN0cnVjdHVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zWzBdLm5hbWUuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdHJ1Y3R1cmVkVmFyaWFibGVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5uYW1lLmVsZW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJ1Y3R1cmVkVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0cnVjdHVyZWRWYXJpYWJsZSA9IGRlc3RydWN0dXJlZFZhcmlhYmxlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZXN0cnVjdHVyZWRWYXJpYWJsZS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXN0cnVjdHVyZWRWYXJpYWJsZS5uYW1lLmVzY2FwZWRUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHM6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ3ZhcmlhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFyaWFibGVEZWNsYXJhdGlvbnNbMF0uaW5pdGlhbGl6ZXIuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5pbml0aWFsaXplciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVmFyaWFibGVEZWNsYXJhdGlvbnNbMF0uaW5pdGlhbGl6ZXIuZWxlbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMuZGVmYXVsdFZhbHVlID0gZGVwcy5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhc3NIZWxwZXIuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShkZXN0cnVjdHVyZWRWYXJpYWJsZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLnB1c2goZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0VmFyaWFibGVOb2RlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvcyA9IHRoaXMudmlzaXRUeXBlRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWQgPSBpbmZvcy5kZXByZWNhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwczogSVR5cGVBbGlhc0RlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ3R5cGVhbGlhcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3dHlwZTogdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUobm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5raW5kID0gbm9kZS50eXBlLmtpbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5raW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5raW5kID09PSBTeW50YXhLaW5kLlRlbXBsYXRlTGl0ZXJhbFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucmF3dHlwZSA9IHNyY0ZpbGUudGV4dC5zdWJzdHJpbmcobm9kZS50eXBlLnBvcywgbm9kZS50eXBlLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMucHVzaChkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvcyA9IHRoaXMudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGluZm9zLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uRGVwOiBJRnVuY3Rpb25EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmFyZ3MgPSBpbmZvcy5hcmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLnJldHVyblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkRlcC5yZXR1cm5UeXBlID0gaW5mb3MucmV0dXJuVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcy5qc2RvY3RhZ3MgJiYgaW5mb3MuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkRlcC5qc2RvY3RhZ3MgPSBpbmZvcy5qc2RvY3RhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluZm9zLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1ByaXZhdGVKU0RvY1RhZyhmdW5jdGlvbkRlcC5qc2RvY3RhZ3MpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMucHVzaChmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0VudW1EZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3MgPSB0aGlzLnZpc2l0RW51bURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGluZm9zLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1EZXBzOiBJRW51bURlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkczogaW5mb3MubWVtYmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdlbnVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGVudW1EZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLnB1c2goZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcGFyc2VOb2RlKGZpbGVOYW1lLCBzY2FubmVkRmlsZSwgaW5pdGlhbE5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBpbiBhIHNwZWNpZmljIHN0b3JlIGFuIGVudGl0eSwgYW5kIGNoZWNrIGJlZm9yZSBpcyB0aGVyZSBpcyBub3QgdGhlIHNhbWUgb25lXG4gICAgICogaW4gdGhhdCBzdG9yZSA6IHNhbWUgbmFtZSwgaWQgYW5kIGZpbGVcbiAgICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eSB0byBzdG9yZVxuICAgICAqIEBwYXJhbSBzdG9yZSBTdG9yZVxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkTmV3RW50aXR5SW5TdG9yZShlbnRpdHksIHN0b3JlKSB7XG4gICAgICAgIGNvbnN0IGZpbmRTYW1lRW50aXR5SW5TdG9yZSA9IF8uZmlsdGVyKHN0b3JlLCB7XG4gICAgICAgICAgICBuYW1lOiBlbnRpdHkubmFtZSxcbiAgICAgICAgICAgIGlkOiBlbnRpdHkuaWQsXG4gICAgICAgICAgICBmaWxlOiBlbnRpdHkuZmlsZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpbmRTYW1lRW50aXR5SW5TdG9yZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHN0b3JlLnB1c2goZW50aXR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVidWcoZGVwczogSURlcCkge1xuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdmb3VuZCcsIGAke2RlcHMubmFtZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBbJ2ltcG9ydHMnLCAnZXhwb3J0cycsICdkZWNsYXJhdGlvbnMnLCAncHJvdmlkZXJzJywgJ2Jvb3RzdHJhcCddLmZvckVhY2goc3ltYm9scyA9PiB7XG4gICAgICAgICAgICBpZiAoZGVwc1tzeW1ib2xzXSAmJiBkZXBzW3N5bWJvbHNdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJycsIGAtICR7c3ltYm9sc306YCk7XG4gICAgICAgICAgICAgICAgZGVwc1tzeW1ib2xzXVxuICAgICAgICAgICAgICAgICAgICAubWFwKGkgPT4gaS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJywgYFxcdC0gJHtkfWApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZ25vcmUoZGVwczogSURlcCkge1xuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lnbm9yZScsIGAke2RlcHMubmFtZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tGb3JEZXByZWNhdGlvbih0YWdzOiBhbnlbXSwgcmVzdWx0OiB7IFtrZXkgaW4gc3RyaW5nIHwgbnVtYmVyXTogYW55IH0pIHtcbiAgICAgICAgXy5mb3JFYWNoKHRhZ3MsIHRhZyA9PiB7XG4gICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUgJiYgdGFnLnRhZ05hbWUudGV4dCAmJiB0YWcudGFnTmFtZS50ZXh0LmluZGV4T2YoJ2RlcHJlY2F0ZWQnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlcHJlY2F0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZXByZWNhdGlvbk1lc3NhZ2UgPSB0YWcuY29tbWVudCB8fCAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbnMoZW50cnlOb2RlLCBuYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGxvb3AgPSBmdW5jdGlvbiAobm9kZSwgeikge1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uICYmICFub2RlLmV4cHJlc3Npb24ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wKG5vZGUuZXhwcmVzc2lvbiwgeik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24gJiYgbm9kZS5leHByZXNzaW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbi5uYW1lLnRleHQgPT09IHopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wKG5vZGUuZXhwcmVzc2lvbiwgeik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxvb3AoZW50cnlOb2RlLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9uQXJndW1lbnRzKGFyZywgbmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gYXJnLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbG9vcCA9IGZ1bmN0aW9uIChub2RlLCB6KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ib2R5KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keS5zdGF0ZW1lbnRzICYmIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5nID0gbm9kZS5ib2R5LnN0YXRlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBsZW5nOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoYXQuZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25zKG5vZGUuYm9keS5zdGF0ZW1lbnRzW2pdLCB6KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxvb3AoYXJnW2ldLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZWNvcmF0b3JzKGRlY29yYXRvcnMsIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChkZWNvcmF0b3JzLCBmdW5jdGlvbiAoZGVjb3JhdG9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZWNvcmF0b3IoZGVjb3JhdG9yLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29udHJvbGxlcihtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0NvbnRyb2xsZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRW50aXR5KG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnRW50aXR5Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0NvbXBvbmVudChtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0NvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQaXBlKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnUGlwZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEaXJlY3RpdmUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdEaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5qZWN0YWJsZShtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0luamVjdGFibGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTW9kdWxlKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnTmdNb2R1bGUnKSB8fCB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnTW9kdWxlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNJbnRlcm5hbERlY29yYXRvcihtZXRhZGF0YXMpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMucGFyc2VEZWNvcmF0b3JzKG1ldGFkYXRhcywgJ0NvbnRyb2xsZXInKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnQ29tcG9uZW50JykgfHxcbiAgICAgICAgICAgIHRoaXMucGFyc2VEZWNvcmF0b3JzKG1ldGFkYXRhcywgJ1BpcGUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnRGlyZWN0aXZlJykgfHxcbiAgICAgICAgICAgIHRoaXMucGFyc2VEZWNvcmF0b3JzKG1ldGFkYXRhcywgJ0luamVjdGFibGUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnTmdNb2R1bGUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnTW9kdWxlJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzR3VhcmQoaW9JbXBsZW1lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgXy5pbmNsdWRlcyhpb0ltcGxlbWVudHMsICdDYW5BY3RpdmF0ZScpIHx8XG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkFjdGl2YXRlQ2hpbGQnKSB8fFxuICAgICAgICAgICAgXy5pbmNsdWRlcyhpb0ltcGxlbWVudHMsICdDYW5EZWFjdGl2YXRlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnUmVzb2x2ZScpIHx8XG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkxvYWQnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3ltYm9sZU5hbWUobm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5hbWUudGV4dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQcm9wZXJ0aWVzKFxuICAgICAgICB2aXNpdGVkTm9kZTogdHMuRGVjb3JhdG9yLFxuICAgICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmlzaXRlZE5vZGUuZXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgdmlzaXRlZE5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMgJiZcbiAgICAgICAgICAgIHZpc2l0ZWROb2RlLmV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBwb3AgPSB2aXNpdGVkTm9kZS5leHByZXNzaW9uLmFyZ3VtZW50c1swXTtcblxuICAgICAgICAgICAgaWYgKHBvcCAmJiBwb3AucHJvcGVydGllcyAmJiBwb3AucHJvcGVydGllcy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3AucHJvcGVydGllcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9wICYmIHBvcC5raW5kICYmIHBvcC5raW5kID09PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BvcF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFbXB0eSBtZXRhZGF0YXMsIHRyeWluZyB0byBmaW5kIGl0IHdpdGggaW1wb3J0cy4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW1wb3J0c1V0aWwuZmluZFZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKHBvcC50ZXh0LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW5ndWxhckxpZmVjeWNsZUhvb2sobWV0aG9kTmFtZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBBTkdVTEFSX0xJRkVDWUNMRV9NRVRIT0RTID0gW1xuICAgICAgICAgICAgJ25nT25Jbml0JyxcbiAgICAgICAgICAgICduZ09uQ2hhbmdlcycsXG4gICAgICAgICAgICAnbmdEb0NoZWNrJyxcbiAgICAgICAgICAgICduZ09uRGVzdHJveScsXG4gICAgICAgICAgICAnbmdBZnRlckNvbnRlbnRJbml0JyxcbiAgICAgICAgICAgICduZ0FmdGVyQ29udGVudENoZWNrZWQnLFxuICAgICAgICAgICAgJ25nQWZ0ZXJWaWV3SW5pdCcsXG4gICAgICAgICAgICAnbmdBZnRlclZpZXdDaGVja2VkJyxcbiAgICAgICAgICAgICd3cml0ZVZhbHVlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uQ2hhbmdlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uVG91Y2hlZCcsXG4gICAgICAgICAgICAnc2V0RGlzYWJsZWRTdGF0ZSdcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIEFOR1VMQVJfTElGRUNZQ0xFX01FVEhPRFMuaW5kZXhPZihtZXRob2ROYW1lKSA+PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRUeXBlRGVjbGFyYXRpb24obm9kZTogdHMuVHlwZUFsaWFzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJycsXG4gICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUudGV4dCxcbiAgICAgICAgICAgIGtpbmQ6IG5vZGUua2luZFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZSk7XG5cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRBcmd1bWVudChhcmcpIHtcbiAgICAgICAgaWYgKGFyZy5uYW1lICYmIGFyZy5uYW1lLmtpbmQgPT0gU3ludGF4S2luZC5PYmplY3RCaW5kaW5nUGF0dGVybikge1xuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgZGVzdHJ1Y3VyZWRHcm91cElkID0gdXVpZHY0KCk7XG5cbiAgICAgICAgICAgIHJlc3VsdHMgPSBhcmcubmFtZS5lbGVtZW50cy5tYXAoZWxlbWVudCA9PiB0aGlzLnZpc2l0QXJndW1lbnQoZWxlbWVudCkpO1xuXG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5tYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVzdHJ1Y3VyZWRHcm91cElkID0gZGVzdHJ1Y3VyZWRHcm91cElkO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFyZy5uYW1lLmVsZW1lbnRzICYmIGFyZy50eXBlICYmIGFyZy50eXBlLm1lbWJlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLm5hbWUuZWxlbWVudHMubGVuZ3RoID09PSBhcmcudHlwZS5tZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5uYW1lLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLnR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShhcmcudHlwZS5tZW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFyZy5uYW1lLmVsZW1lbnRzICYmIGFyZy50eXBlICYmIGFyZy50eXBlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1swXS50eXBlID0gdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoYXJnLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGFyZy5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoYXJnKSxcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRvdERvdERvdFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmcucXVlc3Rpb25Ub2tlbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJnLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlZmF1bHRWYWx1ZSA9IGFyZy5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhc3NIZWxwZXIuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKGFyZy5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJnLnR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IHRoaXMubWFwVHlwZShhcmcudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUua2luZCA9PT0gU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRyeSByZXBsYWNlIFR5cGVSZWZlcmVuY2Ugd2l0aCB0eXBlTmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gYXJnLnR5cGUudHlwZU5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhhcmcpO1xuXG4gICAgICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcFR5cGUodHlwZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuQW55S2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FueSc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5OZXZlcktleXdvcmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICduZXZlcic7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVSZWZlcmVuY2UnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNQcml2YXRlSlNEb2NUYWcodGFncyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0YWdzKSB7XG4gICAgICAgICAgICB0YWdzLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUgJiYgdGFnLnRhZ05hbWUudGV4dCAmJiB0YWcudGFnTmFtZS50ZXh0ID09PSAncHJpdmF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKG1ldGhvZDogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbikge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kLm5hbWUgPyBtZXRob2QubmFtZS50ZXh0IDogJ1VubmFtZWQgZnVuY3Rpb24nO1xuICAgICAgICBjb25zdCByZXN1bHRBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJycsXG4gICAgICAgICAgICBuYW1lOiBtZXRob2ROYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJndW1lbnQgPSBtZXRob2QucGFyYW1ldGVyc1tpXTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3VtZW50UGFyc2VkID0gdGhpcy52aXNpdEFyZ3VtZW50KGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRQYXJzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFyZ3VtZW50UGFyc2VkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmd1bWVudFBhcnNlZEluc2lkZSA9IGFyZ3VtZW50UGFyc2VkW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRQYXJzZWRJbnNpZGUuZGVzdHJ1Y3R1cmVkUGFyYW1ldGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50UGFyc2VkSW5zaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50UGFyc2VkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQuYXJncyA9IHJlc3VsdEFyZ3VtZW50cztcblxuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShtZXRob2QudHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycykge1xuICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBraW5kcyA9IG1ldGhvZC5tb2RpZmllcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChtb2RpZmllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHJlc3VsdCk7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICBfLmZvckVhY2goanNkb2N0YWdzWzBdLnRhZ3MsIHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUudGV4dC5pbmRleE9mKCdpZ25vcmUnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmlnbm9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmpzZG9jdGFncyAmJiByZXN1bHQuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzLCByZXN1bHQuanNkb2N0YWdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWVyZ2VUYWdzQW5kQXJncyhyZXN1bHQuYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdCAmJiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0ubmFtZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYXNzSGVscGVyLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0uaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmluaXRpYWxpemVyID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0LnR5cGUgPT09ICd1bmRlZmluZWQnICYmIHJlc3VsdC5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IGtpbmRUb1R5cGUocmVzdWx0LmluaXRpYWxpemVyLmtpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChub2RlLmpzRG9jKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmpzRG9jWzBdLmNvbW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd0Rlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VKU0RvY05vZGUobm9kZS5qc0RvY1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbWFya2VkKHJhd0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRFbnVtRGVjbGFyYXRpb24obm9kZTogdHMuRW51bURlY2xhcmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgbmFtZTogbm9kZS5uYW1lLnRleHQsXG4gICAgICAgICAgICBtZW1iZXJzOiBbXVxuICAgICAgICB9O1xuICAgICAgICBpZiAobm9kZS5tZW1iZXJzKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbm9kZS5tZW1iZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBtZW1iZXJqc2RvY3RhZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVtYmVyOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUubWVtYmVyc1tpXS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5tZW1iZXJzW2ldLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbml0aWFsaXplciBraW5kIGlzIGEgbnVtYmVyIGRvIGNhc3QgdG8gdGhlIG51bWJlciB0eXBlXG4gICAgICAgICAgICAgICAgICAgIG1lbWJlci52YWx1ZSA9IElzS2luZFR5cGUuTlVNQkVSKG5vZGUubWVtYmVyc1tpXS5pbml0aWFsaXplci5raW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBOdW1iZXIobm9kZS5tZW1iZXJzW2ldLmluaXRpYWxpemVyLnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5vZGUubWVtYmVyc1tpXS5pbml0aWFsaXplci50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZW1iZXJqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZS5tZW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAobWVtYmVyanNkb2N0YWdzICYmIG1lbWJlcmpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBtZW1iZXJqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24obWVtYmVyanNkb2N0YWdzWzBdLnRhZ3MsIG1lbWJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZSk7XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0RW51bURlY2xhcmF0aW9uRm9yUm91dGVzKGZpbGVOYW1lLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZXNJbml0aWFsaXplciA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IENvZGVHZW5lcmF0b3IoKS5nZW5lcmF0ZShyb3V0ZXNJbml0aWFsaXplcik7XG4gICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRSb3V0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFJvdXRlclBhcnNlclV0aWwuY2xlYW5SYXdSb3V0ZShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVOYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJvdXRlSU8oZmlsZW5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbm9kZTogdHMuTm9kZSkge1xuICAgICAgICBsZXQgcmVzO1xuICAgICAgICBpZiAoc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICByZXMgPSBzb3VyY2VGaWxlLnN0YXRlbWVudHMucmVkdWNlKChkaXJlY3RpdmUsIHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChSb3V0ZXJQYXJzZXJVdGlsLmlzVmFyaWFibGVSb3V0ZXMoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50LnBvcyA9PT0gbm9kZS5wb3MgJiYgc3RhdGVtZW50LmVuZCA9PT0gbm9kZS5lbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmUuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXRFbnVtRGVjbGFyYXRpb25Gb3JSb3V0ZXMoZmlsZW5hbWUsIHN0YXRlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICAgICAgfSwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2xhc3NJTyhmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBub2RlOiB0cy5Ob2RlLCBmaWxlQm9keSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCByZWR1Y2VkU291cmNlID0gZmlsZUJvZHkgPyBmaWxlQm9keS5zdGF0ZW1lbnRzIDogc291cmNlRmlsZS5zdGF0ZW1lbnRzO1xuICAgICAgICBjb25zdCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKGZpbGVuYW1lLCBzdGF0ZW1lbnQsIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEludGVyZmFjZUlPKGZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZUZpbGUsIG5vZGUsIGZpbGVCb2R5KSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGNvbnN0IHJlcyA9IHJlZHVjZWRTb3VyY2UucmVkdWNlKChkaXJlY3RpdmUsIHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRzLmlzSW50ZXJmYWNlRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKGZpbGVuYW1lLCBzdGF0ZW1lbnQsIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnRDYWNoZSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBKc0RvY0hlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvanMtZG9jLWhlbHBlcic7XG5pbXBvcnQgeyBNb2R1bGVIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL21vZHVsZS1oZWxwZXInO1xuaW1wb3J0IHsgU3ltYm9sSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IEZyYW1ld29ya0RlcGVuZGVuY2llcyB9IGZyb20gJy4vZnJhbWV3b3JrLWRlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFySlNEZXBlbmRlbmNpZXMgZXh0ZW5kcyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMge1xuICAgIHByaXZhdGUgZW5naW5lOiBhbnk7XG4gICAgcHJpdmF0ZSBjYWNoZTogQ29tcG9uZW50Q2FjaGUgPSBuZXcgQ29tcG9uZW50Q2FjaGUoKTtcbiAgICBwcml2YXRlIG1vZHVsZUhlbHBlciA9IG5ldyBNb2R1bGVIZWxwZXIodGhpcy5jYWNoZSk7XG4gICAgcHJpdmF0ZSBqc0RvY0hlbHBlciA9IG5ldyBKc0RvY0hlbHBlcigpO1xuICAgIHByaXZhdGUgc3ltYm9sSGVscGVyID0gbmV3IFN5bWJvbEhlbHBlcigpO1xuXG4gICAgY29uc3RydWN0b3IoZmlsZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgc3VwZXIoZmlsZXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIGxldCBkZXBzID0ge1xuICAgICAgICAgICAgbW9kdWxlczogW10sXG4gICAgICAgICAgICBtb2R1bGVzRm9yR3JhcGg6IFtdLFxuICAgICAgICAgICAgY29tcG9uZW50czogW10sXG4gICAgICAgICAgICBpbmplY3RhYmxlczogW10sXG4gICAgICAgICAgICBpbnRlcmNlcHRvcnM6IFtdLFxuICAgICAgICAgICAgcGlwZXM6IFtdLFxuICAgICAgICAgICAgZGlyZWN0aXZlczogW10sXG4gICAgICAgICAgICByb3V0ZXM6IFtdLFxuICAgICAgICAgICAgY2xhc3NlczogW10sXG4gICAgICAgICAgICBpbnRlcmZhY2VzOiBbXSxcbiAgICAgICAgICAgIG1pc2NlbGxhbmVvdXM6IHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IFtdLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uczogW10sXG4gICAgICAgICAgICAgICAgdHlwZWFsaWFzZXM6IFtdLFxuICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uczogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb3V0ZXNUcmVlOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlcHM7XG4gICAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VTZXF1ZW50aWFsKHByb21pc2VzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHByb21pc2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG5lZWQgdG8gYmUgYW4gYXJyYXkgb2YgUHJvbWlzZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZXJhdGVlRnVuYyA9IChwcmV2aW91c1Byb21pc2UsIGN1cnJlbnRQcm9taXNlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCsrICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFByb21pc2UocmVzdWx0LCByZXN1bHRzLCBjb3VudCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHByb21pc2VzID0gcHJvbWlzZXMuY29uY2F0KCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcblxuICAgICAgICBwcm9taXNlcy5yZWR1Y2UoaXRlcmF0ZWVGdW5jLCBQcm9taXNlLnJlc29sdmUoZmFsc2UpKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbiIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIExpdmVTZXJ2ZXIgZnJvbSAnQGNvbXBvZG9jL2xpdmUtc2VydmVyJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmNvbnN0IGNob2tpZGFyID0gcmVxdWlyZSgnY2hva2lkYXInKTtcbmNvbnN0IHsgbWFya2VkIH0gPSByZXF1aXJlKCdtYXJrZWQnKTtcbmNvbnN0IHRyYXZlcnNlID0gcmVxdWlyZSgndHJhdmVyc2UnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgYmFiZWwgPSByZXF1aXJlKCdAYmFiZWwvY29yZScpO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xuXG5pbXBvcnQgRGVwZW5kZW5jaWVzRW5naW5lIGZyb20gJy4vZW5naW5lcy9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCBFeHBvcnRFbmdpbmUgZnJvbSAnLi9lbmdpbmVzL2V4cG9ydC5lbmdpbmUnO1xuaW1wb3J0IEZpbGVFbmdpbmUgZnJvbSAnLi9lbmdpbmVzL2ZpbGUuZW5naW5lJztcbmltcG9ydCBIdG1sRW5naW5lIGZyb20gJy4vZW5naW5lcy9odG1sLmVuZ2luZSc7XG5pbXBvcnQgSTE4bkVuZ2luZSBmcm9tICcuL2VuZ2luZXMvaTE4bi5lbmdpbmUnO1xuaW1wb3J0IE1hcmtkb3duRW5naW5lLCB7IG1hcmtkb3duUmVhZGVkRGF0YXMgfSBmcm9tICcuL2VuZ2luZXMvbWFya2Rvd24uZW5naW5lJztcbmltcG9ydCBOZ2RFbmdpbmUgZnJvbSAnLi9lbmdpbmVzL25nZC5lbmdpbmUnO1xuaW1wb3J0IFNlYXJjaEVuZ2luZSBmcm9tICcuL2VuZ2luZXMvc2VhcmNoLmVuZ2luZSc7XG5cbmltcG9ydCB7IEFuZ3VsYXJEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2NvbXBpbGVyL2FuZ3VsYXItZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IEFuZ3VsYXJKU0RlcGVuZGVuY2llcyB9IGZyb20gJy4vY29tcGlsZXIvYW5ndWxhcmpzLWRlcGVuZGVuY2llcyc7XG5cbmltcG9ydCBBbmd1bGFyVmVyc2lvblV0aWwgZnJvbSAnLi4vdXRpbHMvYW5ndWxhci12ZXJzaW9uLnV0aWwnO1xuaW1wb3J0IHsgQ09NUE9ET0NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IENPTVBPRE9DX0RFRkFVTFRTIH0gZnJvbSAnLi4vdXRpbHMvZGVmYXVsdHMnO1xuaW1wb3J0IHsgcHJvbWlzZVNlcXVlbnRpYWwgfSBmcm9tICcuLi91dGlscy9wcm9taXNlLXNlcXVlbnRpYWwnO1xuaW1wb3J0IFJvdXRlclBhcnNlclV0aWwgZnJvbSAnLi4vdXRpbHMvcm91dGVyLXBhcnNlci51dGlsJztcblxuaW1wb3J0IHtcbiAgICBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZSxcbiAgICBjbGVhblNvdXJjZXNGb3JXYXRjaCxcbiAgICBmaW5kTWFpblNvdXJjZUZvbGRlclxufSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbmltcG9ydCB7IEFkZGl0aW9uYWxOb2RlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2FkZGl0aW9uYWwtbm9kZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ292ZXJhZ2VEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvdmVyYWdlRGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGl2ZVNlcnZlckNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMvbGl2ZS1zZXJ2ZXItY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuXG5jb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xubGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5sZXQgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlO1xubGV0IGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0O1xuY29uc3QgZ2VuZXJhdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCA9IHJlamVjdDtcbn0pO1xuXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEZpbGVzIHByb2Nlc3NlZCBkdXJpbmcgaW5pdGlhbCBzY2FubmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBmaWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBGaWxlcyBwcm9jZXNzZWQgZHVyaW5nIHdhdGNoIHNjYW5uaW5nXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZWRGaWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBGaWxlcyBjaGFuZ2VkIGR1cmluZyB3YXRjaCBzY2FubmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaENoYW5nZWRGaWxlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZm9yIHdhdGNoaW5nIHN0YXR1c1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1dhdGNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBwYWNrYWdlLmpzb24gZGF0YVxuICAgICAqL1xuICAgIHByaXZhdGUgcGFja2FnZUpzb25EYXRhID0ge307XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgY29tcG9kb2MgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICAgICAgZm9yIChsZXQgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgQ29uZmlndXJhdGlvbi5tYWluRGF0YVtvcHRpb25dICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGFbb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvciBkb2N1bWVudGF0aW9uTWFpbk5hbWUsIHByb2Nlc3MgaXQgb3V0c2lkZSB0aGUgbG9vcCwgZm9yIGhhbmRsaW5nIGNvbmZsaWN0IHdpdGggcGFnZXMgbmFtZVxuICAgICAgICAgICAgaWYgKG9wdGlvbiA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3IgZG9jdW1lbnRhdGlvbk1haW5OYW1lLCBwcm9jZXNzIGl0IG91dHNpZGUgdGhlIGxvb3AsIGZvciBoYW5kbGluZyBjb25mbGljdCB3aXRoIHBhZ2VzIG5hbWVcbiAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgY29tcG9kb2MgcHJvY2Vzc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZW5lcmF0ZSgpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG5cbiAgICAgICAgSTE4bkVuZ2luZS5pbml0KENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubGFuZ3VhZ2UpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LmNoYXJBdChDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5sZW5ndGggLSAxKSAhPT0gJy8nXG4gICAgICAgICkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgKz0gJy8nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ICE9PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhY2thZ2VKc29uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBIdG1sRW5naW5lLmluaXQoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMpLnRoZW4oKCkgPT4gdGhpcy5wcm9jZXNzUGFja2FnZUpzb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdlbmVyYXRpb25Qcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5kQ2FsbGJhY2soKSB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmhhbmRsZWRSZWplY3Rpb25MaXN0ZW5lcihlcnIsIHApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1VuaGFuZGxlZCBSZWplY3Rpb24gYXQ6JywgcCwgJ3JlYXNvbjonLCBlcnIpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAnU29ycnksIGJ1dCB0aGVyZSB3YXMgYSBwcm9ibGVtIGR1cmluZyBwYXJzaW5nIG9yIGdlbmVyYXRpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uIFBsZWFzZSBmaWxsIGFuIGlzc3VlIG9uIGdpdGh1Yi4gKGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb2RvYy9jb21wb2RvYy9pc3N1ZXMvbmV3KSdcbiAgICAgICAgKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmNhdWdodEV4Y2VwdGlvbkxpc3RlbmVyKGVycikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgJ1NvcnJ5LCBidXQgdGhlcmUgd2FzIGEgcHJvYmxlbSBkdXJpbmcgcGFyc2luZyBvciBnZW5lcmF0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLiBQbGVhc2UgZmlsbCBhbiBpc3N1ZSBvbiBnaXRodWIuIChodHRwczovL2dpdGh1Yi5jb20vY29tcG9kb2MvY29tcG9kb2MvaXNzdWVzL25ldyknXG4gICAgICAgICk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGNvbXBvZG9jIGRvY3VtZW50YXRpb24gY292ZXJhZ2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdGVzdENvdmVyYWdlKCkge1xuICAgICAgICB0aGlzLmdldERlcGVuZGVuY2llc0RhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBmaWxlcyBmb3IgaW5pdGlhbCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsZXMoZmlsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlIGZpbGVzIGZvciB3YXRjaCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VXBkYXRlZEZpbGVzKGZpbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMudXBkYXRlZEZpbGVzID0gZmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIG9uZSBUeXBlU2NyaXB0IGZpbGUgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNUU0ZpbGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgXy5mb3JFYWNoKHRoaXMudXBkYXRlZEZpbGVzLCBmaWxlID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcudHMnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygb25lIHJvb3QgbWFya2Rvd24gZmlsZXMgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNSb290TWFya2Rvd25GaWxlcygpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLnVwZGF0ZWRGaWxlcywgZmlsZSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLm1kJyAmJiBwYXRoLmRpcm5hbWUoZmlsZSkgPT09IGN3ZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgZmlsZXMgZm9yIHdhdGNoIHByb2Nlc3NpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJVcGRhdGVkRmlsZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlZEZpbGVzID0gW107XG4gICAgICAgIHRoaXMud2F0Y2hDaGFuZ2VkRmlsZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWNrYWdlSnNvbigpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1NlYXJjaGluZyBwYWNrYWdlLmpzb24gZmlsZScpO1xuICAgICAgICBGaWxlRW5naW5lLmdldChjd2QgKyBwYXRoLnNlcCArICdwYWNrYWdlLmpzb24nKS50aGVuKFxuICAgICAgICAgICAgcGFja2FnZURhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShwYWNrYWdlRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWNrYWdlSnNvbkRhdGEgPSBwYXJzZWREYXRhO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBhcnNlZERhdGEubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPT09IENPTVBPRE9DX0RFRkFVTFRTLnRpdGxlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZG9jdW1lbnRhdGlvbk1haW5OYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEubmFtZSArICcgZG9jdW1lbnRhdGlvbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkRGF0YS5kZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbkRlc2NyaXB0aW9uID0gcGFyc2VkRGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyVmVyc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBbmd1bGFyVmVyc2lvbk9mUHJvamVjdChwYXJzZWREYXRhKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygncGFja2FnZS5qc29uIGZpbGUgZm91bmQnKTtcblxuICAgICAgICAgICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkRGF0YS5kZXBlbmRlbmNpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEuZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZERhdGEucGVlckRlcGVuZGVuY2llcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhY2thZ2VQZWVyRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEucGVlckRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydGllc1RvQ2hlY2sgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdob21lcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYnVncycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGljZW5zZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAncmVwb3NpdG9yeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYXV0aG9yJ1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzT25lT2ZDaGVja2VkUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjay5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgaW4gcGFyc2VkRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09uZU9mQ2hlY2tlZFByb3BlcnRpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGFja2FnZVByb3BlcnRpZXNbcHJvcF0gPSBwYXJzZWREYXRhW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09uZU9mQ2hlY2tlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncGFja2FnZVByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLXByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWFya2Rvd25zKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREZXBlbmRlbmNpZXNEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbnRpbnVpbmcgd2l0aG91dCBwYWNrYWdlLmpzb24gZmlsZScpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01hcmtkb3ducygpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUGFja2FnZVBlZXJEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzaW5nIHBhY2thZ2UuanNvbiBwZWVyRGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGFja2FnZVBlZXJEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5oYXNQYWdlKCdkZXBlbmRlbmNpZXMnKSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBpZDogJ3BhY2thZ2VEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLWRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcyk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyBwYWNrYWdlLmpzb24gZGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGFja2FnZURlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgIG5hbWU6ICdkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgaWQ6ICdwYWNrYWdlRGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLWRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWFya2Rvd25zKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1NlYXJjaGluZyBSRUFETUUubWQsIENIQU5HRUxPRy5tZCwgQ09OVFJJQlVUSU5HLm1kLCBMSUNFTlNFLm1kLCBUT0RPLm1kIGZpbGVzJ1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbWFya2Rvd25zID0gWydyZWFkbWUnLCAnY2hhbmdlbG9nJywgJ2NvbnRyaWJ1dGluZycsICdsaWNlbnNlJywgJ3RvZG8nXTtcbiAgICAgICAgICAgIGxldCBudW1iZXJPZk1hcmtkb3ducyA9IDU7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IG51bWJlck9mTWFya2Rvd25zKSB7XG4gICAgICAgICAgICAgICAgICAgIE1hcmtkb3duRW5naW5lLmdldFRyYWRpdGlvbmFsTWFya2Rvd24obWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCkpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVhZG1lRGF0YTogbWFya2Rvd25SZWFkZWREYXRhcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScgPyAnaW5kZXgnIDogbWFya2Rvd25zW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnZ2V0dGluZy1zdGFydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdnZXR0aW5nLXN0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bjogcmVhZG1lRGF0YS5tYXJrZG93bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVhZG1lRGF0YS5yYXdEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZG93bnNbaV0gPT09ICdyZWFkbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucmVhZG1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdvdmVydmlldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdvdmVydmlldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWFya2Rvd25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbWFya2Rvd25zW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJuYW1lOiBtYXJrZG93bnNbaV0udG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCR7bWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCl9Lm1kIGZpbGUgZm91bmRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQ29udGludWluZyB3aXRob3V0ICR7bWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCl9Lm1kIGZpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2Rvd25zW2ldID09PSAncmVhZG1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWJ1aWxkUm9vdE1hcmtkb3ducygpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnUmVnZW5lcmF0aW5nIFJFQURNRS5tZCwgQ0hBTkdFTE9HLm1kLCBDT05UUklCVVRJTkcubWQsIExJQ0VOU0UubWQsIFRPRE8ubWQgcGFnZXMnXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLnJlc2V0Um9vdE1hcmtkb3duUGFnZXMoKTtcblxuICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc01hcmtkb3ducygpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwcm9taXNlU2VxdWVudGlhbChhY3Rpb25zKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWdlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJVcGRhdGVkRmlsZXMoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkZXBlbmRlbmN5IGRhdGEgZm9yIHNtYWxsIGdyb3VwIG9mIHVwZGF0ZWQgZmlsZXMgZHVyaW5nIHdhdGNoIHByb2Nlc3NcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE1pY3JvRGVwZW5kZW5jaWVzRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0dldCBkaWZmIGRlcGVuZGVuY2llcyBkYXRhJyk7XG5cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0NsYXNzOiBBbmd1bGFyRGVwZW5kZW5jaWVzIHwgQW5ndWxhckpTRGVwZW5kZW5jaWVzID0gQW5ndWxhckRlcGVuZGVuY2llcztcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuZGV0ZWN0QW5ndWxhckpTUHJvamVjdHMoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0FuZ3VsYXJKUyBwcm9qZWN0IGRldGVjdGVkJyk7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJQcm9qZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJKU1Byb2plY3QgPSB0cnVlO1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzQ2xhc3MgPSBBbmd1bGFySlNEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3Jhd2xlciA9IG5ldyBkZXBlbmRlbmNpZXNDbGFzcyhcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZEZpbGVzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRzY29uZmlnRGlyZWN0b3J5OiBwYXRoLmRpcm5hbWUoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNEYXRhID0gY3Jhd2xlci5nZXREZXBlbmRlbmNpZXMoKTtcblxuICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUudXBkYXRlKGRlcGVuZGVuY2llc0RhdGEpO1xuXG4gICAgICAgIHRoaXMucHJlcGFyZUp1c3RBRmV3VGhpbmdzKGRlcGVuZGVuY2llc0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYnVpbGQgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBkdXJpbmcgd2F0Y2ggcHJvY2Vzc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVidWlsZEV4dGVybmFsRG9jdW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlYnVpbGQgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbicpO1xuXG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5yZXNldEFkZGl0aW9uYWxQYWdlcygpO1xuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzICE9PSAnJykge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlRXh0ZXJuYWxJbmNsdWRlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlU2VxdWVudGlhbChhY3Rpb25zKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWdlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJVcGRhdGVkRmlsZXMoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGV0ZWN0QW5ndWxhckpTUHJvamVjdHMoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhY2thZ2VKc29uRGF0YS5kZXBlbmRlbmNpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFja2FnZUpzb25EYXRhLmRlcGVuZGVuY2llcy5hbmd1bGFyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBjb3VudEpTRmlsZXMgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5qcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50SlNGaWxlcyArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHBlcmNlbnRPZkpTRmlsZXMgPSAoY291bnRKU0ZpbGVzICogMTAwKSAvIHRoaXMuZmlsZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChwZXJjZW50T2ZKU0ZpbGVzID49IDc1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlcGVuZGVuY2llc0RhdGEoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdHZXQgZGVwZW5kZW5jaWVzIGRhdGEnKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5ndWxhckpTIGRldGVjdGlvbiBzdHJhdGVneSA6XG4gICAgICAgICAqIC0gaWYgaW4gcGFja2FnZS5qc29uXG4gICAgICAgICAqIC0gaWYgNzUlIG9mIHNjYW5uZWQgZmlsZXMgYXJlICouanMgZmlsZXNcbiAgICAgICAgICovXG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNDbGFzczogQW5ndWxhckRlcGVuZGVuY2llcyB8IEFuZ3VsYXJKU0RlcGVuZGVuY2llcyA9IEFuZ3VsYXJEZXBlbmRlbmNpZXM7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclByb2plY3QgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLmRldGVjdEFuZ3VsYXJKU1Byb2plY3RzKCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBbmd1bGFySlMgcHJvamVjdCBkZXRlY3RlZCcpO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc0NsYXNzID0gQW5ndWxhckpTRGVwZW5kZW5jaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNyYXdsZXIgPSBuZXcgZGVwZW5kZW5jaWVzQ2xhc3MoXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRzY29uZmlnRGlyZWN0b3J5OiBwYXRoLmRpcm5hbWUoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNEYXRhID0gY3Jhd2xlci5nZXREZXBlbmRlbmNpZXMoKTtcblxuICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUuaW5pdChkZXBlbmRlbmNpZXNEYXRhKTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc0xlbmd0aCA9IFJvdXRlclBhcnNlclV0aWwucm91dGVzTGVuZ3RoKCk7XG5cbiAgICAgICAgdGhpcy5wcmludFN0YXRpc3RpY3MoKTtcblxuICAgICAgICB0aGlzLnByZXBhcmVFdmVyeXRoaW5nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlSnVzdEFGZXdUaGluZ3MoZGlmZkNyYXdsZWREYXRhKTogdm9pZCB7XG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5yZXNldFBhZ2VzKCk7XG5cbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZVJvdXRlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlQ29tcG9uZW50cygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLmNvbnRyb2xsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVDb250cm9sbGVycygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVFbnRpdGllcygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLm1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZU1vZHVsZXMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZURpcmVjdGl2ZXMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVJbmplY3RhYmxlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVJbnRlcmNlcHRvcnMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLmd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlR3VhcmRzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlUGlwZXMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUNsYXNzZXMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUludGVyZmFjZXMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkaWZmQ3Jhd2xlZERhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIGRpZmZDcmF3bGVkRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIGRpZmZDcmF3bGVkRGF0YS5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZU1pc2NlbGxhbmVvdXMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlQ292ZXJhZ2UoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlU2VxdWVudGlhbChhY3Rpb25zKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXRzU3VwcG9ydGVkLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPiAtMVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBHZW5lcmF0aW5nIGRvY3VtZW50YXRpb24gaW4gZXhwb3J0IGZvcm1hdCAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRFbmdpbmUuZXhwb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRFbGFwc2VkVGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgc2Vjb25kcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGF0IGh0dHA6Ly8ke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWV9OiR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5XZWJTZXJ2ZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV4cG9ydGVkIGZvcm1hdCBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NHcmFwaHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJpbnRTdGF0aXN0aWNzKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvamVjdCBzdGF0aXN0aWNzICcpO1xuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZmlsZXMgICAgICA6ICR7dGhpcy5maWxlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIG1vZHVsZSAgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gY29tcG9uZW50ICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmNvbXBvbmVudHMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gY29udHJvbGxlciA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmNvbnRyb2xsZXJzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGVudGl0eSAgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5lbnRpdGllcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5kaXJlY3RpdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGRpcmVjdGl2ZSAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5kaXJlY3RpdmVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGluamVjdGFibGUgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5pbmplY3RhYmxlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gaW5qZWN0b3IgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmludGVyY2VwdG9ycy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5ndWFyZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZ3VhcmQgICAgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmd1YXJkcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBwaXBlICAgICAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUucGlwZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBjbGFzcyAgICAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUuY2xhc3Nlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGludGVyZmFjZSAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmZhY2VzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5yb3V0ZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSByb3V0ZSAgICAgIDogJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc0xlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZUV2ZXJ5dGhpbmcoKSB7XG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb21wb25lbnRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZU1vZHVsZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5kaXJlY3RpdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZURpcmVjdGl2ZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb250cm9sbGVycygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUVudGl0aWVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW5qZWN0YWJsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW50ZXJjZXB0b3JzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUd1YXJkcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUucm91dGVzICYmXG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUucm91dGVzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVJvdXRlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVBpcGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVJbnRlcmZhY2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUNvdmVyYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0Q292ZXJhZ2UgIT09ICcnKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVVbml0VGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzICE9PSAnJykge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlRXh0ZXJuYWxJbmNsdWRlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlU2VxdWVudGlhbChhY3Rpb25zKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXRzU3VwcG9ydGVkLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPiAtMVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBHZW5lcmF0aW5nIGRvY3VtZW50YXRpb24gaW4gZXhwb3J0IGZvcm1hdCAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRFbmdpbmUuZXhwb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRFbGFwc2VkVGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgc2Vjb25kcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGF0IGh0dHA6Ly8ke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWV9OiR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5XZWJTZXJ2ZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV4cG9ydGVkIGZvcm1hdCBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NHcmFwaHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbmNsdWRlZFBhdGhGb3JGaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzLCBmaWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVFeHRlcm5hbEluY2x1ZGVzKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnQWRkaW5nIGV4dGVybmFsIG1hcmtkb3duIGZpbGVzJyk7XG4gICAgICAgIC8vIFNjYW4gaW5jbHVkZSBmb2xkZXIgZm9yIGZpbGVzIGRldGFpbGVkIGluIHN1bW1hcnkuanNvblxuICAgICAgICAvLyBGb3IgZWFjaCBmaWxlLCBhZGQgdG8gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXNcbiAgICAgICAgLy8gRWFjaCBmaWxlIHdpbGwgYmUgY29udmVydGVkIHRvIGh0bWwgcGFnZSwgaW5zaWRlIENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeVBhdGhcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIEZpbGVFbmdpbmUuZ2V0KHRoaXMuZ2V0SW5jbHVkZWRQYXRoRm9yRmlsZSgnc3VtbWFyeS5qc29uJykpLnRoZW4oXG4gICAgICAgICAgICAgICAgc3VtbWFyeURhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQWRkaXRpb25hbCBkb2N1bWVudGF0aW9uOiBzdW1tYXJ5Lmpzb24gZmlsZSBmb3VuZCcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFN1bW1hcnlEYXRhID0gSlNPTi5wYXJzZShzdW1tYXJ5RGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdExldmVsT25lUGFnZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZShwYXJzZWRTdW1tYXJ5RGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW52YWxpZC10aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub3RSb290ICYmIHR5cGVvZiB0aGlzLm5vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYXdQYXRoID0gdGhpcy5wYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkaXRpb25hbE5vZGU6IEFkZGl0aW9uYWxOb2RlID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWxlID0gYWRkaXRpb25hbE5vZGUuZmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBhZGRpdGlvbmFsTm9kZS50aXRsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxQYXRoID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc0ZvbGRlcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbERlcHRoID0gcmF3UGF0aC5maWx0ZXIoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KGVsLCAxMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWxlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGl0bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGNsZWFuTmFtZVdpdGhvdXRTcGFjZUFuZFRvTG93ZXJDYXNlKHRpdGxlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSWQgY3JlYXRlZCB3aXRoIHRpdGxlICsgZmlsZSBwYXRoIGhhc2gsIHNlZW1zIHRvIGJlIGh5cG90aGV0aWNhbGx5IHVuaXF1ZSBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGNyeXB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUhhc2goJ3NoYTUxMicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlKHRpdGxlICsgZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaWdlc3QoJ2hleCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLmlkID0gaWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RFbGVtZW50Um9vdFRyZWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRGVwdGguZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFRyZWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBsYXN0RWxlbWVudFJvb3RUcmVlID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlZFN1bW1hcnlEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFzdEVsZW1lbnRSb290VHJlZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudFRyZWUuY2hpbGRyZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRyZWUgPSBlbGVtZW50VHJlZS5jaGlsZHJlbltlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUcmVlID0gZWxlbWVudFRyZWVbZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQYXRoICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZShlbGVtZW50VHJlZS50aXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudFJvb3RUcmVlID0gZWxlbWVudFRyZWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCA9IGZpbmFsUGF0aC5yZXBsYWNlKCcvJyArIHVybCwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2Rvd25GaWxlID0gTWFya2Rvd25FbmdpbmUuZ2V0VHJhZGl0aW9uYWxNYXJrZG93blN5bmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LmdldEluY2x1ZGVkUGF0aEZvckZpbGUoZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxEZXB0aC5sZW5ndGggPiA1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ09ubHkgNSBsZXZlbHMgb2YgZGVwdGggYXJlIHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF9wYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdhZGRpdGlvbmFsLXBhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUGFnZTogbWFya2Rvd25GaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiBmaW5hbERlcHRoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkxlbmd0aDogYWRkaXRpb25hbE5vZGUuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZGRpdGlvbmFsTm9kZS5jaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2hpbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsRGVwdGgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdExldmVsT25lUGFnZSA9IF9wYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsRGVwdGgubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGFsbCBjaGlsZCBwYWdlcyBvZiB0aGUgbGFzdCByb290IGxldmVsIDEgcGFnZSBpbnNpZGUgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TGV2ZWxPbmVQYWdlLmNoaWxkcmVuLnB1c2goX3BhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZEFkZGl0aW9uYWxQYWdlKF9wYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnRXJyb3IgZHVyaW5nIEFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVNb2R1bGVzKHNvbWVNb2R1bGVzPyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIG1vZHVsZXMnKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgX21vZHVsZXMgPSBzb21lTW9kdWxlcyA/IHNvbWVNb2R1bGVzIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldE1vZHVsZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzID0gX21vZHVsZXMubWFwKG5nTW9kdWxlID0+IHtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzID0ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBwaXBlczogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFsnZGVjbGFyYXRpb25zJywgJ2Jvb3RzdHJhcCcsICdpbXBvcnRzJywgJ2V4cG9ydHMnLCAnY29udHJvbGxlcnMnXS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVR5cGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVbbWV0YWRhdGFUeXBlXSA9IG5nTW9kdWxlW21ldGFkYXRhVHlwZV0uZmlsdGVyKG1ldGFEYXRhSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXRhRGF0YUl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlcGVuZGVuY2llc0VuZ2luZS5nZXREaXJlY3RpdmVzKCkuc29tZShkaXJlY3RpdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZERpcmVjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGFEYXRhSXRlbS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREaXJlY3RpdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREaXJlY3RpdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMuaW5jbHVkZXMoZGlyZWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWREaXJlY3RpdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlcGVuZGVuY2llc0VuZ2luZS5nZXRDb21wb25lbnRzKCkuc29tZShjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGFEYXRhSXRlbS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29tcG9uZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMuaW5jbHVkZXMoY29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb250cm9sbGVyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q29udHJvbGxlcnMoKS5zb21lKGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZENvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29udHJvbGxlciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udHJvbGxlciBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb250cm9sbGVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250cm9sbGVyIGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb250cm9sbGVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLmluY2x1ZGVzKGNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29udHJvbGxlcnMucHVzaChjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkQ29udHJvbGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vZHVsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmdldE1vZHVsZXMoKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9PiAobW9kdWxlIGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGlwZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmdldFBpcGVzKCkuc29tZShwaXBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRQaXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0YURhdGFJdGVtLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpcGUgPSAocGlwZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQaXBlID0gKHBpcGUgYXMgYW55KS5uYW1lID09PSBtZXRhRGF0YUl0ZW0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpcGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMuaW5jbHVkZXMocGlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5waXBlcy5wdXNoKHBpcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRQaXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5wcm92aWRlcnMgPSBuZ01vZHVsZS5wcm92aWRlcnMuZmlsdGVyKHByb3ZpZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbmplY3RhYmxlcygpLnNvbWUoaW5qZWN0YWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkSW5qZWN0YWJsZSA9IChpbmplY3RhYmxlIGFzIGFueSkubmFtZSA9PT0gcHJvdmlkZXIubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5qZWN0YWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5pbmplY3RhYmxlcy5pbmNsdWRlcyhpbmplY3RhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEluamVjdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLmdldEludGVyY2VwdG9ycygpLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgPT4gKGludGVyY2VwdG9yIGFzIGFueSkubmFtZSA9PT0gcHJvdmlkZXIubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFRyeSBmaXhpbmcgdHlwZSB1bmRlZmluZWQgZm9yIGVhY2ggcHJvdmlkZXJzXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKG5nTW9kdWxlLnByb3ZpZGVycywgcHJvdmlkZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW5qZWN0YWJsZXMoKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUgPT4gKGluamVjdGFibGUgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIudHlwZSA9ICdpbmplY3RhYmxlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJjZXB0b3JzKCkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvciA9PiAoaW50ZXJjZXB0b3IgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIudHlwZSA9ICdpbnRlcmNlcHRvcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBPcmRlciB0aGluZ3NcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMsIFtcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb250cm9sbGVycyA9IF8uc29ydEJ5KG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29udHJvbGxlcnMsIFtcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5kaXJlY3RpdmVzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5kaXJlY3RpdmVzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuaW5qZWN0YWJsZXMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmluamVjdGFibGVzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLnBpcGVzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5kZWNsYXJhdGlvbnMgPSBfLnNvcnRCeShuZ01vZHVsZS5kZWNsYXJhdGlvbnMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5lbnRyeUNvbXBvbmVudHMgPSBfLnNvcnRCeShuZ01vZHVsZS5lbnRyeUNvbXBvbmVudHMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5wcm92aWRlcnMgPSBfLnNvcnRCeShuZ01vZHVsZS5wcm92aWRlcnMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5pbXBvcnRzID0gXy5zb3J0QnkobmdNb2R1bGUuaW1wb3J0cywgWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmV4cG9ydHMgPSBfLnNvcnRCeShuZ01vZHVsZS5leHBvcnRzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmdNb2R1bGU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgaWQ6ICdtb2R1bGVzJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0uZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0ubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLnJlYWRtZSA9IG1hcmtlZChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtb2R1bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlOiBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVQaXBlcyA9IChzb21lUGlwZXM/KSA9PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIHBpcGVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMgPSBzb21lUGlwZXMgPyBzb21lUGlwZXMgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0UGlwZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBpcGUgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShwaXBlLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7cGlwZS5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKHBpcGUuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaXBlLnJlYWRtZSA9IG1hcmtlZChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ3BpcGVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBpcGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwaXBlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKHBpcGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ3BpcGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGlwZTogcGlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBwaXBlLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcHJlcGFyZUNsYXNzZXMgPSAoc29tZUNsYXNzZXM/KSA9PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNsYXNzZXMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzID0gc29tZUNsYXNzZXNcbiAgICAgICAgICAgID8gc29tZUNsYXNzZXNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldENsYXNzZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY2xhc3Nlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2xhc3NlID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShjbGFzc2UuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjbGFzc2UubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShjbGFzc2UuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2UucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY2xhc3NlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc2UubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjbGFzc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY2xhc3NlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdjbGFzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogY2xhc3NlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NlLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgY2xhc3NlLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcHJlcGFyZUludGVyZmFjZXMoc29tZUludGVyZmFjZXM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGludGVyZmFjZXMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmZhY2VzID0gc29tZUludGVyZmFjZXNcbiAgICAgICAgICAgID8gc29tZUludGVyZmFjZXNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldEludGVyZmFjZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXJmID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmZhY2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShpbnRlcmYuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtpbnRlcmYubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShpbnRlcmYuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmYucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnaW50ZXJmYWNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbnRlcmYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpbnRlcmYuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoaW50ZXJmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdpbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlOiBpbnRlcmYsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmYuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBpbnRlcmYuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVNaXNjZWxsYW5lb3VzKHNvbWVNaXNjPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBtaXNjZWxsYW5lb3VzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cyA9IHNvbWVNaXNjXG4gICAgICAgICAgICA/IHNvbWVNaXNjXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRNaXNjZWxsYW5lb3VzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmdW5jdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndmFyaWFibGVzJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdtaXNjZWxsYW5lb3VzLXZhcmlhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtaXNjZWxsYW5lb3VzLXZhcmlhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21pc2NlbGxhbmVvdXMtdHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy10eXBlYWxpYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VudW1lcmF0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVRlbXBsYXRldXJsKGNvbXBvbmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgbGV0IHRlbXBsYXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJuYW1lICsgcGF0aC5zZXAgKyBjb21wb25lbnQudGVtcGxhdGVVcmwpO1xuXG4gICAgICAgIGlmICghRmlsZUVuZ2luZS5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgICAgIGxldCBlcnIgPSBgQ2Fubm90IHJlYWQgdGVtcGxhdGUgZm9yICR7Y29tcG9uZW50Lm5hbWV9YDtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldCh0ZW1wbGF0ZVBhdGgpLnRoZW4oXG4gICAgICAgICAgICBkYXRhID0+IChjb21wb25lbnQudGVtcGxhdGVEYXRhID0gZGF0YSksXG4gICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVTdHlsZXMoY29tcG9uZW50KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgbGV0IHN0eWxlcyA9IGNvbXBvbmVudC5zdHlsZXM7XG4gICAgICAgIGNvbXBvbmVudC5zdHlsZXNEYXRhID0gJyc7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZVN0eWxlcywgcmVqZWN0U3R5bGVzKSA9PiB7XG4gICAgICAgICAgICBzdHlsZXMuZm9yRWFjaChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnN0eWxlc0RhdGEgPSBjb21wb25lbnQuc3R5bGVzRGF0YSArIHN0eWxlICsgJ1xcbic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmVTdHlsZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVTdHlsZXVybHMoY29tcG9uZW50KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgbGV0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50LmZpbGUpO1xuXG4gICAgICAgIGxldCBzdHlsZURhdGFQcm9taXNlID0gY29tcG9uZW50LnN0eWxlVXJscy5tYXAoc3R5bGVVcmwgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJuYW1lICsgcGF0aC5zZXAgKyBzdHlsZVVybCk7XG5cbiAgICAgICAgICAgIGlmICghRmlsZUVuZ2luZS5leGlzdHNTeW5jKHN0eWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXJyID0gYENhbm5vdCByZWFkIHN0eWxlIHVybCAke3N0eWxlUGF0aH0gZm9yICR7Y29tcG9uZW50Lm5hbWV9YDtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIEZpbGVFbmdpbmUuZ2V0KHN0eWxlUGF0aCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHN0eWxlRGF0YVByb21pc2UpLnRoZW4oXG4gICAgICAgICAgICBkYXRhID0+IChjb21wb25lbnQuc3R5bGVVcmxzRGF0YSA9IGRhdGEpLFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2VGFicyhkZXBlbmRlbmN5KTogQXJyYXk8YW55PiB7XG4gICAgICAgIGxldCBuYXZUYWJDb25maWcgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm5hdlRhYkNvbmZpZztcbiAgICAgICAgY29uc3QgaGFzQ3VzdG9tTmF2VGFiQ29uZmlnID0gbmF2VGFiQ29uZmlnLmxlbmd0aCAhPT0gMDtcbiAgICAgICAgbmF2VGFiQ29uZmlnID1cbiAgICAgICAgICAgIG5hdlRhYkNvbmZpZy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/IF8uY2xvbmVEZWVwKENPTVBPRE9DX0NPTlNUQU5UUy5uYXZUYWJEZWZpbml0aW9ucylcbiAgICAgICAgICAgICAgICA6IG5hdlRhYkNvbmZpZztcbiAgICAgICAgbGV0IG1hdGNoRGVwVHlwZSA9IChkZXBUeXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZXBUeXBlID09PSAnYWxsJyB8fCBkZXBUeXBlID09PSBkZXBlbmRlbmN5LnR5cGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG5hdlRhYnMgPSBbXTtcbiAgICAgICAgXy5mb3JFYWNoKG5hdlRhYkNvbmZpZywgY3VzdG9tVGFiID0+IHtcbiAgICAgICAgICAgIGxldCBuYXZUYWIgPSBfLmZpbmQoQ09NUE9ET0NfQ09OU1RBTlRTLm5hdlRhYkRlZmluaXRpb25zLCB7IGlkOiBjdXN0b21UYWIuaWQgfSk7XG4gICAgICAgICAgICBpZiAoIW5hdlRhYikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YWIgSUQgJyR7Y3VzdG9tVGFiLmlkfScgc3BlY2lmaWVkIGluIHRhYiBjb25maWd1cmF0aW9uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5hdlRhYi5sYWJlbCA9IGN1c3RvbVRhYi5sYWJlbDtcblxuICAgICAgICAgICAgaWYgKGhhc0N1c3RvbU5hdlRhYkNvbmZpZykge1xuICAgICAgICAgICAgICAgIG5hdlRhYi5jdXN0b20gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpcyB0YWIgYXBwbGljYWJsZSB0byB0YXJnZXQgZGVwZW5kZW5jeT9cbiAgICAgICAgICAgIGlmICgtMSA9PT0gXy5maW5kSW5kZXgobmF2VGFiLmRlcFR5cGVzLCBtYXRjaERlcFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBnbG9iYWwgY29uZmlnXG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAndHJlZScgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRG9tVHJlZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdzb3VyY2UnICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAndGVtcGxhdGVEYXRhJyAmJiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVUZW1wbGF0ZVRhYikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdzdHlsZURhdGEnICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVN0eWxlVGFiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwZXIgZGVwZW5kZW5jeSBjb25maWdcbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdyZWFkbWUnICYmICFkZXBlbmRlbmN5LnJlYWRtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdleGFtcGxlJyAmJiAhZGVwZW5kZW5jeS5leGFtcGxlVXJscykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjdXN0b21UYWIuaWQgPT09ICd0ZW1wbGF0ZURhdGEnICYmXG4gICAgICAgICAgICAgICAgKCFkZXBlbmRlbmN5LnRlbXBsYXRlVXJsIHx8IGRlcGVuZGVuY3kudGVtcGxhdGVVcmwubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGN1c3RvbVRhYi5pZCA9PT0gJ3N0eWxlRGF0YScgJiZcbiAgICAgICAgICAgICAgICAoIWRlcGVuZGVuY3kuc3R5bGVVcmxzIHx8IGRlcGVuZGVuY3kuc3R5bGVVcmxzLmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgICAgICAgICAgICAoIWRlcGVuZGVuY3kuc3R5bGVzIHx8IGRlcGVuZGVuY3kuc3R5bGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmF2VGFicy5wdXNoKG5hdlRhYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChuYXZUYWJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB2YWxpZCBuYXZpZ2F0aW9uIHRhYnMgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIGRlcGVuZGVuY3kgdHlwZSAnJHtkZXBlbmRlbmN5LnR5cGV9Jy4gU3BlY2lmeSBcXFxuYXQgbGVhc3Qgb25lIGNvbmZpZyBmb3IgdGhlICdpbmZvJyBvciAnc291cmNlJyB0YWIgaW4gLS1uYXZUYWJDb25maWcuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmF2VGFicztcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUNvbnRyb2xsZXJzKHNvbWVDb250cm9sbGVycz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgY29udHJvbGxlcnMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVycyA9IHNvbWVDb250cm9sbGVyc1xuICAgICAgICAgICAgPyBzb21lQ29udHJvbGxlcnNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldENvbnRyb2xsZXJzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbnRyb2xsZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sbGVyID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVyc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29udHJvbGxlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29udHJvbGxlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbnRyb2xsZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29udHJvbGxlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnY29udHJvbGxlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbnRyb2xsZXIuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVFbnRpdGllcyhzb21lRW50aXRpZXM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGVudGl0aWVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZW50aXRpZXMgPSBzb21lRW50aXRpZXNcbiAgICAgICAgICAgID8gc29tZUVudGl0aWVzXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRFbnRpdGllcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmVudGl0aWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVudGl0eSA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZW50aXRpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2VudGl0aWVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVudGl0eS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhlbnRpdHkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2VudGl0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eS5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGVudGl0eS5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVDb21wb25lbnRzKHNvbWVDb21wb25lbnRzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBjb21wb25lbnRzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29tcG9uZW50cyA9IHNvbWVDb21wb25lbnRzXG4gICAgICAgICAgICA/IHNvbWVDb21wb25lbnRzXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChtYWluUHJlcGFyZUNvbXBvbmVudFJlc29sdmUsIG1haW5QcmVwYXJlQ29tcG9uZW50UmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb21wb25lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDw9IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29tcG9uZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoY29tcG9uZW50LmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y29tcG9uZW50Lm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWFkbWUgPSBtYXJrZWQocmVhZG1lRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29tcG9uZW50cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29tcG9uZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdjb21wb25lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbXBvbmVudC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VGVtcGxhdGVVcmxQcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50VGVtcGxhdGVVcmxSZXNvbHZlLCBjb21wb25lbnRUZW1wbGF0ZVVybFJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQudGVtcGxhdGVVcmwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y29tcG9uZW50Lm5hbWV9IGhhcyBhIHRlbXBsYXRlVXJsLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGVtcGxhdGV1cmwoY29tcG9uZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRlbXBsYXRlVXJsUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZVVybFJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRlbXBsYXRlVXJsUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50U3R5bGVVcmxzUHJvbWlzZSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudFN0eWxlVXJsc1Jlc29sdmUsIGNvbXBvbmVudFN0eWxlVXJsc1JlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc3R5bGVVcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2NvbXBvbmVudC5uYW1lfSBoYXMgc3R5bGVVcmxzLCBpbmNsdWRlIHRoZW1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdHlsZXVybHMoY29tcG9uZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlVXJsc1Jlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVVcmxzUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVVcmxzUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50U3R5bGVzUHJvbWlzZSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudFN0eWxlc1Jlc29sdmUsIGNvbXBvbmVudFN0eWxlc1JlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc3R5bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2NvbXBvbmVudC5uYW1lfSBoYXMgc3R5bGVzLCBpbmNsdWRlIHRoZW1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdHlsZXMoY29tcG9uZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlc1Jlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVzUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVzUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZVVybFByb21pc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZVVybHNQcm9taXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVzUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgICBdKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpblByZXBhcmVDb21wb25lbnRSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVEaXJlY3RpdmVzKHNvbWVEaXJlY3RpdmVzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBkaXJlY3RpdmVzJyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXJlY3RpdmVzID0gc29tZURpcmVjdGl2ZXNcbiAgICAgICAgICAgID8gc29tZURpcmVjdGl2ZXNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldERpcmVjdGl2ZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlyZWN0aXZlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aXZlID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXJlY3RpdmVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShkaXJlY3RpdmUuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtkaXJlY3RpdmUubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShkaXJlY3RpdmUuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZGlyZWN0aXZlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkaXJlY3RpdmUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkaXJlY3RpdmUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoZGlyZWN0aXZlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlOiBkaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RpdmUuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBkaXJlY3RpdmUuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVJbmplY3RhYmxlcyhzb21lSW5qZWN0YWJsZXM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGluamVjdGFibGVzJyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmplY3RhYmxlcyA9IHNvbWVJbmplY3RhYmxlc1xuICAgICAgICAgICAgPyBzb21lSW5qZWN0YWJsZXNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldEluamVjdGFibGVzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmplYyA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5qZWN0YWJsZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXJrZG93bkVuZ2luZS5oYXNOZWlnaGJvdXJSZWFkbWVGaWxlKGluamVjLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7aW5qZWMubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShpbmplYy5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjLnJlYWRtZSA9IG1hcmtlZChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2luamVjdGFibGVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGluamVjLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogaW5qZWMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoaW5qZWMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2luamVjdGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZTogaW5qZWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmplYy5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGluamVjLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlSW50ZXJjZXB0b3JzKHNvbWVJbnRlcmNlcHRvcnM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGludGVyY2VwdG9ycycpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzID0gc29tZUludGVyY2VwdG9yc1xuICAgICAgICAgICAgPyBzb21lSW50ZXJjZXB0b3JzXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbnRlcmNlcHRvcnMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlcmNlcHRvciA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShpbnRlcmNlcHRvci5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2ludGVyY2VwdG9yLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoaW50ZXJjZXB0b3IuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvci5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbnRlcmNlcHRvcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaW50ZXJjZXB0b3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpbnRlcmNlcHRvci5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhpbnRlcmNlcHRvciksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnaW50ZXJjZXB0b3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZTogaW50ZXJjZXB0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmNlcHRvci5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGludGVyY2VwdG9yLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlR3VhcmRzKHNvbWVHdWFyZHM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGd1YXJkcycpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzID0gc29tZUd1YXJkcyA/IHNvbWVHdWFyZHMgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0R3VhcmRzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmd1YXJkcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3VhcmQgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmd1YXJkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoZ3VhcmQuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtndWFyZC5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGd1YXJkLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmQucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZ3VhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGd1YXJkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZ3VhcmQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoZ3VhcmQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2d1YXJkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGd1YXJkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3VhcmQuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBndWFyZC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZVJvdXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3Mgcm91dGVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzID0gRGVwZW5kZW5jaWVzRW5naW5lLmdldFJvdXRlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdyb3V0ZXMnLFxuICAgICAgICAgICAgICAgIGlkOiAncm91dGVzJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAncm91dGVzJyxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmdlbmVyYXRlUm91dGVzSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc1xuICAgICAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJyBSb3V0ZXMgaW5kZXggZ2VuZXJhdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlQ292ZXJhZ2UoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgcmVwb3J0Jyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBsb29wIHdpdGggY29tcG9uZW50cywgZGlyZWN0aXZlcywgY29udHJvbGxlcnMsIGVudGl0aWVzLCBjbGFzc2VzLCBpbmplY3RhYmxlcywgaW50ZXJmYWNlcywgcGlwZXMsIGd1YXJkcywgbWlzYyBmdW5jdGlvbnMgdmFyaWFibGVzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCBmaWxlcyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgbGV0IGdldFN0YXR1cyA9IGZ1bmN0aW9uIChwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudCA8PSAyNSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnbG93JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAyNSAmJiBwZXJjZW50IDw9IDUwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdtZWRpdW0nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA+IDUwICYmIHBlcmNlbnQgPD0gNzUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2dvb2QnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICd2ZXJ5LWdvb2QnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NDb21wb25lbnRzQW5kRGlyZWN0aXZlc0FuZENvbnRyb2xsZXJzQW5kRW50aXRpZXMgPSBsaXN0ID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobGlzdCwgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnByb3BlcnRpZXNDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQubWV0aG9kc0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm1ldGhvZHNDbGFzcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5ob3N0QmluZGluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaG9zdEJpbmRpbmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhvc3RMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaG9zdExpc3RlbmVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pbnB1dHNDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dHNDbGFzcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5vdXRwdXRzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub3V0cHV0c0NsYXNzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogZWxlbWVudC5maWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua3R5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXNDbGFzcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5tZXRob2RzQ2xhc3MubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXRzQ2xhc3MubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaG9zdEJpbmRpbmdzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RMaXN0ZW5lcnMubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub3V0cHV0c0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAxOyAvLyArMSBmb3IgZWxlbWVudCBkZWNvcmF0b3IgY29tbWVudFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNvbnN0cnVjdG9yT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iai5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gIT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kZXNjcmlwdGlvbiAmJiBlbGVtZW50LmRlc2NyaXB0aW9uICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MsIChwcm9wZXJ0eTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5tZXRob2RzQ2xhc3MsIChtZXRob2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lmhvc3RCaW5kaW5ncywgKHByb3BlcnR5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lmhvc3RMaXN0ZW5lcnMsIChtZXRob2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50LmlucHV0c0NsYXNzLCAoaW5wdXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQub3V0cHV0c0NsYXNzLCAob3V0cHV0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzKSAqIDEwMFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxTdGF0ZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZVBlcmNlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIGNsLnN0YXR1cyA9IGdldFN0YXR1cyhjbC5jb3ZlcmFnZVBlcmNlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkICs9IGNsLmNvdmVyYWdlUGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NDb3ZlcmFnZVBlckZpbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZScpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3ZlckZpbGVzID0gZmlsZXMuZmlsdGVyKGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3ZlclRlc3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZi5jb3ZlcmFnZVBlcmNlbnQgPj0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlclRlc3QgJiYgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2YuY292ZXJhZ2VQZXJjZW50fSAlIGZvciBmaWxlICR7Zi5maWxlUGF0aH0gLSAke2YubmFtZX0gLSBvdmVyIG1pbmltdW0gcGVyIGZpbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdmVyVGVzdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdW5kZXJGaWxlcyA9IGZpbGVzLmZpbHRlcihmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVuZGVyVGVzdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmNvdmVyYWdlUGVyY2VudCA8IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVyVGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2YuY292ZXJhZ2VQZXJjZW50fSAlIGZvciBmaWxlICR7Zi5maWxlUGF0aH0gLSAke2YubmFtZX0gLSB1bmRlciBtaW5pbXVtIHBlciBmaWxlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZXJUZXN0O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBvdmVyRmlsZXM6IG92ZXJGaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgdW5kZXJGaWxlczogdW5kZXJGaWxlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NGdW5jdGlvbnNBbmRWYXJpYWJsZXMgPSAoaWQsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goaWQsIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGVsLmZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua3R5cGU6IGVsLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rc3VidHlwZTogZWwuc3VidHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICd2YXJpYWJsZScgfHwgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2wubGlua3R5cGUgPSAnbWlzY2VsbGFuZW91cyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzKSAqIDEwMFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZUNvdW50ID0gdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICsgJy8nICsgdG90YWxTdGF0ZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBjbC5zdGF0dXMgPSBnZXRTdGF0dXMoY2wuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goY2wpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHByb2Nlc3NDbGFzc2VzID0gKGxpc3QsIHR5cGUsIGxpbmt0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGxpc3QsIChjbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gKE9iamVjdCBhcyBhbnkpLmFzc2lnbih7fSwgY2wpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm1ldGhvZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWV0aG9kcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbGE6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoOiBlbGVtZW50LmZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua3R5cGU6IGxpbmt0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxTdGF0ZW1lbnRzID0gZWxlbWVudC5wcm9wZXJ0aWVzLmxlbmd0aCArIGVsZW1lbnQubWV0aG9kcy5sZW5ndGggKyAxOyAvLyArMSBmb3IgZWxlbWVudCBpdHNlbGZcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iaiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVzY3JpcHRpb24gJiYgZWxlbWVudC5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQucHJvcGVydGllcywgKHByb3BlcnR5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lm1ldGhvZHMsIChtZXRob2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2xhLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzKSAqIDEwMFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxTdGF0ZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGEuY292ZXJhZ2VQZXJjZW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGEuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2xhLnN0YXR1cyA9IGdldFN0YXR1cyhjbGEuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbGEuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXNBbmRDb250cm9sbGVyc0FuZEVudGl0aWVzKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29tcG9uZW50c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzQW5kRGlyZWN0aXZlc0FuZENvbnRyb2xsZXJzQW5kRW50aXRpZXMoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXJlY3RpdmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHNBbmREaXJlY3RpdmVzQW5kQ29udHJvbGxlcnNBbmRFbnRpdGllcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbnRyb2xsZXJzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHNBbmREaXJlY3RpdmVzQW5kQ29udHJvbGxlcnNBbmRFbnRpdGllcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmVudGl0aWVzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBwcm9jZXNzQ2xhc3NlcyhDb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMsICdjbGFzcycsICdjbGFzc2UnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5qZWN0YWJsZXMsICdpbmplY3RhYmxlJywgJ2luamVjdGFibGUnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlcywgJ2ludGVyZmFjZScsICdpbnRlcmZhY2UnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzLCAnZ3VhcmQnLCAnZ3VhcmQnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzLCAnaW50ZXJjZXB0b3InLCAnaW50ZXJjZXB0b3InKTtcblxuICAgICAgICAgICAgXy5mb3JFYWNoKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMsIChwaXBlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IHBpcGUuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwaXBlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuICAgICAgICAgICAgICAgIGlmIChwaXBlLmRlc2NyaXB0aW9uICYmIHBpcGUuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoKHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCAvIHRvdGFsU3RhdGVtZW50cykgKiAxMDApO1xuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uc0FuZFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLFxuICAgICAgICAgICAgICAgICdmdW5jdGlvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25zQW5kVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgJ3ZhcmlhYmxlJ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZmlsZXMgPSBfLnNvcnRCeShmaWxlcywgWydmaWxlUGF0aCddKTtcblxuICAgICAgICAgICAgbGV0IGNvdmVyYWdlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLmZsb29yKHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgLyBmaWxlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgICAgICAgICBmaWxlc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5zdGF0dXMgPSBnZXRTdGF0dXMoY292ZXJhZ2VEYXRhLmNvdW50KTtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2NvdmVyYWdlJyxcbiAgICAgICAgICAgICAgICBpZDogJ2NvdmVyYWdlJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgICAgICAgICAgICBkYXRhOiBjb3ZlcmFnZURhdGEsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb3ZlcmFnZURhdGEuZmlsZXMgPSBmaWxlcztcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VEYXRhID0gY292ZXJhZ2VEYXRhO1xuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBIdG1sRW5naW5lLmdlbmVyYXRlQ292ZXJhZ2VCYWRnZShcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGVzID0gXy5zb3J0QnkoZmlsZXMsIFsnY292ZXJhZ2VQZXJjZW50J10pO1xuXG4gICAgICAgICAgICBsZXQgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHM7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgJiZcbiAgICAgICAgICAgICAgICAhQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBHbG9iYWwgY292ZXJhZ2UgdGVzdCBhbmQgbm90IHBlciBmaWxlXG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyYWdlRGF0YS5jb3VudCA+PSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZH0lKWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGR9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0ICYmXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cyA9IHByb2Nlc3NDb3ZlcmFnZVBlckZpbGUoKTtcbiAgICAgICAgICAgICAgICAvLyBQZXIgZmlsZSBjb3ZlcmFnZSB0ZXN0IGFuZCBub3QgZ2xvYmFsXG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGV9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgJiZcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFBlckZpbGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIFBlciBmaWxlIGNvdmVyYWdlIHRlc3QgYW5kIGdsb2JhbFxuICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzID0gcHJvY2Vzc0NvdmVyYWdlUGVyRmlsZSgpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhLmNvdW50ID49IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkICYmXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7Y292ZXJhZ2VEYXRhLmNvdW50fSUpIGlzIG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZX0lKWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZURhdGEuY291bnQgPj0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMudW5kZXJGaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7Y292ZXJhZ2VEYXRhLmNvdW50fSUpIGlzIG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGV9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA8IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkICYmXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUdsb2JhbCA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGR9JSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBlckZpbGUgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2VHbG9iYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2VQZXJGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2VHbG9iYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoJHtjb3ZlcmFnZURhdGEuY291bnR9JSkgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkfSUpYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQZXJGaWxlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlUGVyRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVVbml0VGVzdENvdmVyYWdlKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyB1bml0IHRlc3QgY292ZXJhZ2UgcmVwb3J0Jyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgY292RGF0LCBjb3ZGaWxlTmFtZXM7XG5cbiAgICAgICAgICAgIGxldCBjb3ZlcmFnZURhdGE6IENvdmVyYWdlRGF0YSA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VEYXRhO1xuXG4gICAgICAgICAgICBpZiAoIWNvdmVyYWdlRGF0YS5maWxlcykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdNaXNzaW5nIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgZGF0YScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3ZEYXQgPSB7fTtcbiAgICAgICAgICAgICAgICBjb3ZGaWxlTmFtZXMgPSBfLm1hcChjb3ZlcmFnZURhdGEuZmlsZXMsIGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gcGF0aC5ub3JtYWxpemUoZWwuZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBjb3ZEYXRbZmlsZU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiBlbC5saW5rdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzdWJ0eXBlOiBlbC5saW5rc3VidHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVhZCBjb3ZlcmFnZSBzdW1tYXJ5IGZpbGUgYW5kIGRhdGFcbiAgICAgICAgICAgIGxldCB1bml0VGVzdFN1bW1hcnkgPSB7fTtcbiAgICAgICAgICAgIGxldCBmaWxlRGF0ID0gRmlsZUVuZ2luZS5nZXRTeW5jKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSk7XG4gICAgICAgICAgICBpZiAoZmlsZURhdCkge1xuICAgICAgICAgICAgICAgIHVuaXRUZXN0U3VtbWFyeSA9IEpTT04ucGFyc2UoZmlsZURhdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnRXJyb3IgcmVhZGluZyB1bml0IHRlc3QgY292ZXJhZ2UgZmlsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdldENvdlN0YXR1cyA9IGZ1bmN0aW9uIChwZXJjZW50LCB0b3RhbExpbmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgICAgICAgICBpZiAodG90YWxMaW5lcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAndW5jb3ZlcmVkJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPD0gMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2xvdyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gMjUgJiYgcGVyY2VudCA8PSA1MCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnbWVkaXVtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiA1MCAmJiBwZXJjZW50IDw9IDc1KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdnb29kJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAndmVyeS1nb29kJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZ2V0Q292ZXJhZ2VEYXRhID0gZnVuY3Rpb24gKGRhdGEsIGZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgbGV0IG91dCA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPT0gJ3RvdGFsJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY292RGF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgYSBuYW1lIHRvIGluY2x1ZGUgaW4gb3V0cHV0IGJ1dCB0aGlzIGlzbid0IHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IHsgbmFtZTogZmlsZU5hbWUsIGZpbGVQYXRoOiBmaWxlTmFtZSB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZE1hdGNoID0gXy5maWx0ZXIoY292RmlsZU5hbWVzLCBlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gcGF0aC5ub3JtYWxpemUoZmlsZU5hbWUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwuaW5jbHVkZXMoZmlsZU5hbWUpIHx8IG5vcm1hbGl6ZWRGaWxlbmFtZS5pbmNsdWRlcyhlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kTWF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IF8uY2xvbmUoY292RGF0W2ZpbmRNYXRjaFswXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFsnZmlsZVBhdGgnXSA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBrZXlzVG9HZXQgPSBbJ3N0YXRlbWVudHMnLCAnYnJhbmNoZXMnLCAnZnVuY3Rpb25zJywgJ2xpbmVzJ107XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGtleXNUb0dldCwga2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBkYXRhW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZVBlcmNlbnQ6IE1hdGgucm91bmQodC5wY3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlQ291bnQ6ICcnICsgdC5jb3ZlcmVkICsgJy8nICsgdC50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGdldENvdlN0YXR1cyh0LnBjdCwgdC50b3RhbClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHVuaXRUZXN0RGF0YSA9IHt9O1xuICAgICAgICAgICAgbGV0IGZpbGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIGluIHVuaXRUZXN0U3VtbWFyeSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXQgPSBnZXRDb3ZlcmFnZURhdGEodW5pdFRlc3RTdW1tYXJ5W2ZpbGVdLCBmaWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PT0gJ3RvdGFsJykge1xuICAgICAgICAgICAgICAgICAgICB1bml0VGVzdERhdGFbJ3RvdGFsJ10gPSBkYXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChkYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVuaXRUZXN0RGF0YVsnZmlsZXMnXSA9IGZpbGVzO1xuICAgICAgICAgICAgdW5pdFRlc3REYXRhWydpZENvbHVtbiddID0gY292RGF0ICE9PSB1bmRlZmluZWQ7IC8vIHNob3VsZCB3ZSBpbmNsdWRlIHRoZSBpZCBjb2x1bW5cbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3REYXRhID0gdW5pdFRlc3REYXRhO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndW5pdC10ZXN0JyxcbiAgICAgICAgICAgICAgICBpZDogJ3VuaXQtdGVzdCcsXG4gICAgICAgICAgICAgICAgY29udGV4dDogJ3VuaXQtdGVzdCcsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICAgIGRhdGE6IHVuaXRUZXN0RGF0YSxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5c1RvR2V0ID0gWydzdGF0ZW1lbnRzJywgJ2JyYW5jaGVzJywgJ2Z1bmN0aW9ucycsICdsaW5lcyddO1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChrZXlzVG9HZXQsIGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSHRtbEVuZ2luZS5nZW5lcmF0ZUNvdmVyYWdlQmFkZ2UoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsIGtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiB1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XVsnY292ZXJhZ2VQZXJjZW50J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XVsnc3RhdHVzJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1BhZ2UocGFnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBwYWdlJywgcGFnZS5uYW1lKTtcblxuICAgICAgICBsZXQgaHRtbERhdGEgPSBIdG1sRW5naW5lLnJlbmRlcihDb25maWd1cmF0aW9uLm1haW5EYXRhLCBwYWdlKTtcbiAgICAgICAgbGV0IGZpbmFsUGF0aCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5sYXN0SW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9ICcvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZS5wYXRoKSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggKz0gcGFnZS5wYXRoICsgJy8nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhZ2UuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCArPSBwYWdlLmZpbGVuYW1lICsgJy5odG1sJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCArPSBwYWdlLm5hbWUgKyAnLmh0bWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2gpIHtcbiAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5pbmRleFBhZ2Uoe1xuICAgICAgICAgICAgICAgIGluZm9zOiBwYWdlLFxuICAgICAgICAgICAgICAgIHJhd0RhdGE6IGh0bWxEYXRhLFxuICAgICAgICAgICAgICAgIHVybDogZmluYWxQYXRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIEZpbGVFbmdpbmUud3JpdGVTeW5jKGZpbmFsUGF0aCwgaHRtbERhdGEpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NQYWdlcygpIHtcbiAgICAgICAgbGV0IHBhZ2VzID0gXy5zb3J0QnkoQ29uZmlndXJhdGlvbi5wYWdlcywgWyduYW1lJ10pO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIHBhZ2VzJyk7XG4gICAgICAgIFByb21pc2UuYWxsKHBhZ2VzLm1hcChwYWdlID0+IHRoaXMucHJvY2Vzc1BhZ2UocGFnZSkpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjYWxsYmFja3NBZnRlckdlbmVyYXRlU2VhcmNoSW5kZXhKc29uID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQWRkaXRpb25hbFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQXNzZXRzRm9sZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNvdXJjZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgU2VhcmNoRW5naW5lLmdlbmVyYXRlU2VhcmNoSW5kZXhKc29uKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc0FmdGVyR2VuZXJhdGVTZWFyY2hJbmRleEpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzQWZ0ZXJHZW5lcmF0ZVNlYXJjaEluZGV4SnNvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc01lbnUoQ29uZmlndXJhdGlvbi5tYWluRGF0YSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJhbnNwaWxlTWVudVdDVG9FUzUoZXM2Q29kZSkge1xuICAgICAgICByZXR1cm4gYmFiZWwudHJhbnNmb3JtQXN5bmMoZXM2Q29kZSwge1xuICAgICAgICAgICAgY3dkOiBfX2Rpcm5hbWUsXG4gICAgICAgICAgICBmaWxlbmFtZTogJ21lbnUtd2NfZXM1LmpzJyxcbiAgICAgICAgICAgIHByZXNldHM6IFtcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICdAYmFiZWwvcHJlc2V0LWVudicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZTogJzExJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICdAYmFiZWwvcGx1Z2luLXByb3Bvc2FsLXByaXZhdGUtbWV0aG9kcycsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3NlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NNZW51KG1haW5EYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1lbnUuLi4nKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmVQcm9jZXNzTWVudSwgcmVqZWN0UHJvY2Vzc01lbnUpID0+IHtcbiAgICAgICAgICAgIGxldCBvdXRwdXQgPSBtYWluRGF0YS5vdXRwdXQuc2xpY2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dExhc3RDaGFyYWN0ZXIgPSBvdXRwdXQubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRMYXN0Q2hhcmFjdGVyICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaW5hbFBhdGhFUzYgPSBgJHtvdXRwdXR9L2pzL21lbnUtd2MuanNgO1xuICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoRVM1ID0gYCR7b3V0cHV0fS9qcy9tZW51LXdjX2VzNS5qc2A7XG5cbiAgICAgICAgICAgIEh0bWxFbmdpbmUucmVuZGVyTWVudShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlcywgbWFpbkRhdGEpXG4gICAgICAgICAgICAgICAgLnRoZW4oaHRtbERhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLndyaXRlKGZpbmFsUGF0aEVTNiwgaHRtbERhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc3BpbGVNZW51V0NUb0VTNShodG1sRGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZXM1RGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLndyaXRlKGZpbmFsUGF0aEVTNSwgZXM1RGF0YS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb2Nlc3NNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyAnICsgZmluYWxQYXRoRVM1ICsgJyBwYWdlIGdlbmVyYXRpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0UHJvY2Vzc01lbnUoJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGhFUzUgKyAnIHBhZ2UgZ2VuZXJhdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGhFUzYgKyAnIHBhZ2UgZ2VuZXJhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyAnICsgZmluYWxQYXRoRVM2ICsgJyBwYWdlIGdlbmVyYXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcm9jZXNzQWRkaXRpb25hbFBhZ2VzKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBhZGRpdGlvbmFsIHBhZ2VzJyk7XG4gICAgICAgIGxldCBwYWdlcyA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzO1xuICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHBhZ2VzLm1hcChwYWdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWdlKHBhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGFnZS5jaGlsZHJlbi5tYXAoY2hpbGRQYWdlID0+IHRoaXMucHJvY2Vzc1BhZ2UoY2hpbGRQYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1BhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5nZW5lcmF0ZVNlYXJjaEluZGV4SnNvbihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Fzc2V0c0ZvbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc291cmNlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NBc3NldHNGb2xkZXIoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IGFzc2V0cyBmb2xkZXInKTtcblxuICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlcikpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgYXNzZXRzIGZvbGRlciAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyfSBkaWQgbm90IGV4aXN0YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmaW5hbE91dHB1dCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuXG4gICAgICAgICAgICBsZXQgdGVzdE91dHB1dERpciA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKGN3ZCk7XG5cbiAgICAgICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQucmVwbGFjZShjd2QgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBmaW5hbE91dHB1dCxcbiAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZzLmNvcHkoXG4gICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKSxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZGVzdGluYXRpb24pLFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIHJlc291cmNlcyBjb3B5ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NSZXNvdXJjZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IG1haW4gcmVzb3VyY2VzJyk7XG5cbiAgICAgICAgY29uc3Qgb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgK1xuICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEVsYXBzZWRUaW1lKCkgK1xuICAgICAgICAgICAgICAgICAgICAnIHNlY29uZHMgdXNpbmcgJyArXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgK1xuICAgICAgICAgICAgICAgICAgICAnIHRoZW1lJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0fSBhdCBodHRwOi8vJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3RuYW1lfToke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldlYlNlcnZlcihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgZmluYWxPdXRwdXQgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dDtcblxuICAgICAgICBsZXQgdGVzdE91dHB1dERpciA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKGN3ZCk7XG5cbiAgICAgICAgaWYgKHRlc3RPdXRwdXREaXIgJiYgdGVzdE91dHB1dERpci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaW5hbE91dHB1dCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LnJlcGxhY2UoY3dkICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZzLmNvcHkoXG4gICAgICAgICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lICsgJy8uLi9zcmMvcmVzb3VyY2VzLycpLFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsT3V0cHV0KSxcbiAgICAgICAgICAgIGVycm9yQ29weSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyByZXNvdXJjZXMgY29weSAnLCBlcnJvckNvcHkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dFRoZW1lUHJvbWlzZSA9IG5ldyBQcm9taXNlKChleHRUaGVtZVJlc29sdmUsIGV4dFRoZW1lUmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHRUaGVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNvcHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShjd2QgKyBwYXRoLnNlcCArIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXh0VGhlbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZmluYWxPdXRwdXQgKyAnL3N0eWxlcy8nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yQ29weVRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb3B5VGhlbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBkdXJpbmcgZXh0ZXJuYWwgc3R5bGluZyB0aGVtZSBjb3B5ICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weVRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRUaGVtZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnRXh0ZXJuYWwgc3R5bGluZyB0aGVtZSBjb3B5IHN1Y2NlZWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dFRoZW1lUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0VGhlbWVSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZhdmljb25Qcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY3VzdG9tRmF2aWNvblJlc29sdmUsIGN1c3RvbUZhdmljb25SZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21GYXZpY29uICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgQ3VzdG9tIGZhdmljb24gc3VwcGxpZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY29weShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QgKyBwYXRoLnNlcCArIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tRmF2aWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCArICcvaW1hZ2VzL2Zhdmljb24uaWNvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlGYXZpY29uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weUZhdmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyByZXNvdXJjZXMgY29weSBvZiBmYXZpY29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weUZhdmljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmF2aWNvblJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdFeHRlcm5hbCBjdXN0b20gZmF2aWNvbiBjb3B5IHN1Y2NlZWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GYXZpY29uUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GYXZpY29uUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21Mb2dvUHJvbWlzZSA9IG5ldyBQcm9taXNlKChjdXN0b21Mb2dvUmVzb2x2ZSwgY3VzdG9tTG9nb1JlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tTG9nbyAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgQ3VzdG9tIGxvZ28gc3VwcGxpZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoY3dkICsgcGF0aC5zZXAgKyBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUxvZ28pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbE91dHB1dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9pbWFnZXMvJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21Mb2dvLnNwbGl0KCcvJykucG9wKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3B5TG9nbyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb3B5TG9nbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyByZXNvdXJjZXMgY29weSBvZiBsb2dvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3B5TG9nb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tTG9nb1JlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnRXh0ZXJuYWwgY3VzdG9tIGxvZ28gY29weSBzdWNjZWVkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21Mb2dvUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tTG9nb1Jlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoW2V4dFRoZW1lUHJvbWlzZSwgY3VzdG9tRmF2aWNvblByb21pc2UsIGN1c3RvbUxvZ29Qcm9taXNlXSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGVsYXBzZWQgdGltZSBzaW5jZSB0aGUgcHJvZ3JhbSB3YXMgc3RhcnRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRFbGFwc2VkVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHN0YXJ0VGltZS52YWx1ZU9mKCkpIC8gMTAwMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJvY2Vzc0dyYXBocygpIHtcbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUdyYXBoKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnR3JhcGggZ2VuZXJhdGlvbiBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1haW4gZ3JhcGgnKTtcbiAgICAgICAgICAgIGxldCBtb2R1bGVzID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzO1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG1vZHVsZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBtb2R1bGUgZ3JhcGggJywgbW9kdWxlc1tpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsUGF0aCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQubGFzdEluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCArPSAnLyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxQYXRoICs9ICdtb2R1bGVzLycgKyBtb2R1bGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBfcmF3TW9kdWxlID0gRGVwZW5kZW5jaWVzRW5naW5lLmdldFJhd01vZHVsZShtb2R1bGVzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmJvb3RzdHJhcC5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmltcG9ydHMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5leHBvcnRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUucHJvdmlkZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBOZ2RFbmdpbmUucmVuZGVyR3JhcGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlc1tpXS5maWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlc1tpXS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZ2RFbmdpbmUucmVhZEdyYXBoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsUGF0aCArIHBhdGguc2VwICsgJ2RlcGVuZGVuY2llcy5zdmcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbaV0ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW2ldLmdyYXBoID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgZ3JhcGggcmVhZDogJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZmluYWxNYWluR3JhcGhQYXRoID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQ7XG4gICAgICAgICAgICBpZiAoZmluYWxNYWluR3JhcGhQYXRoLmxhc3RJbmRleE9mKCcvJykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgZmluYWxNYWluR3JhcGhQYXRoICs9ICcvJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsTWFpbkdyYXBoUGF0aCArPSAnZ3JhcGgnO1xuICAgICAgICAgICAgTmdkRW5naW5lLmluaXQocGF0aC5yZXNvbHZlKGZpbmFsTWFpbkdyYXBoUGF0aCkpO1xuXG4gICAgICAgICAgICBOZ2RFbmdpbmUucmVuZGVyR3JhcGgoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZmluYWxNYWluR3JhcGhQYXRoKSxcbiAgICAgICAgICAgICAgICAncCdcbiAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIE5nZEVuZ2luZS5yZWFkR3JhcGgoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZmluYWxNYWluR3JhcGhQYXRoICsgcGF0aC5zZXAgKyAnZGVwZW5kZW5jaWVzLnN2ZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ01haW4gZ3JhcGgnXG4gICAgICAgICAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWFpbkdyYXBoID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBtYWluIGdyYXBoIHJlYWRpbmcgOiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZU1haW5HcmFwaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ09vb3BzIGVycm9yIGR1cmluZyBtYWluIGdyYXBoIGdlbmVyYXRpb24sIG1vdmluZyBvbiBuZXh0IHBhcnQgd2l0aCBtYWluIGdyYXBoIGRpc2FibGVkIDogJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVNYWluR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBydW5XZWJTZXJ2ZXIoZm9sZGVyKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1dhdGNoaW5nKSB7XG4gICAgICAgICAgICBsZXQgbGl2ZVNlcnZlckNvbmZpZ3VyYXRpb246IExpdmVTZXJ2ZXJDb25maWd1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHJvb3Q6IGZvbGRlcixcbiAgICAgICAgICAgICAgICBvcGVuOiBDb25maWd1cmF0aW9uLm1haW5EYXRhLm9wZW4sXG4gICAgICAgICAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9nTGV2ZWw6IDAsXG4gICAgICAgICAgICAgICAgd2FpdDogMTAwMCxcbiAgICAgICAgICAgICAgICBwb3J0OiBDb25maWd1cmF0aW9uLm1haW5EYXRhLnBvcnRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0ICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGxpdmVTZXJ2ZXJDb25maWd1cmF0aW9uLmhvc3QgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMaXZlU2VydmVyLnN0YXJ0KGxpdmVTZXJ2ZXJDb25maWd1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS53YXRjaCAmJiAhdGhpcy5pc1dhdGNoaW5nKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmlsZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdObyBzb3VyY2VzIGZpbGVzIGF2YWlsYWJsZSwgcGxlYXNlIHVzZSAtcCBmbGFnJyk7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuV2F0Y2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoICYmIHRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgbGV0IHNyY0ZvbGRlciA9IGZpbmRNYWluU291cmNlRm9sZGVyKHRoaXMuZmlsZXMpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFscmVhZHkgd2F0Y2hpbmcgc291cmNlcyBpbiAke3NyY0ZvbGRlcn0gZm9sZGVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuV2F0Y2goKSB7XG4gICAgICAgIGxldCBzb3VyY2VzID0gW2ZpbmRNYWluU291cmNlRm9sZGVyKHRoaXMuZmlsZXMpXTtcbiAgICAgICAgbGV0IHdhdGNoZXJSZWFkeSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaXNXYXRjaGluZyA9IHRydWU7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oYFdhdGNoaW5nIHNvdXJjZXMgaW4gJHtmaW5kTWFpblNvdXJjZUZvbGRlcih0aGlzLmZpbGVzKX0gZm9sZGVyYCk7XG5cbiAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc1Jvb3RNYXJrZG93bnMoKSkge1xuICAgICAgICAgICAgc291cmNlcyA9IHNvdXJjZXMuY29uY2F0KE1hcmtkb3duRW5naW5lLmxpc3RSb290TWFya2Rvd25zKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMgIT09ICcnKSB7XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5jb25jYXQoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBhbGwgZWxlbWVudHMgb2Ygc291cmNlcyBsaXN0IGV4aXN0XG4gICAgICAgIHNvdXJjZXMgPSBjbGVhblNvdXJjZXNGb3JXYXRjaChzb3VyY2VzKTtcblxuICAgICAgICBsZXQgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHNvdXJjZXMsIHtcbiAgICAgICAgICAgIGF3YWl0V3JpdGVGaW5pc2g6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgICAgICAgICAgaWdub3JlZDogLyhzcGVjfFxcLmQpXFwudHMvXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgdGltZXJBZGRBbmRSZW1vdmVSZWY7XG4gICAgICAgIGxldCB0aW1lckNoYW5nZVJlZjtcbiAgICAgICAgbGV0IHJ1bm5lckFkZEFuZFJlbW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCB3YWl0ZXJBZGRBbmRSZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJBZGRBbmRSZW1vdmVSZWYpO1xuICAgICAgICAgICAgdGltZXJBZGRBbmRSZW1vdmVSZWYgPSBzZXRUaW1lb3V0KHJ1bm5lckFkZEFuZFJlbW92ZSwgMTAwMCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBydW5uZXJDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRVcGRhdGVkRmlsZXModGhpcy53YXRjaENoYW5nZWRGaWxlcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNXYXRjaGVkRmlsZXNUU0ZpbGVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1pY3JvRGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1dhdGNoZWRGaWxlc1Jvb3RNYXJrZG93bkZpbGVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRSb290TWFya2Rvd25zKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZEV4dGVybmFsRG9jdW1lbnRhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXQgd2FpdGVyQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyQ2hhbmdlUmVmKTtcbiAgICAgICAgICAgIHRpbWVyQ2hhbmdlUmVmID0gc2V0VGltZW91dChydW5uZXJDaGFuZ2UsIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdhdGNoZXIub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF3YXRjaGVyUmVhZHkpIHtcbiAgICAgICAgICAgICAgICB3YXRjaGVyUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHdhdGNoZXJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdhZGQnLCBmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSAke2ZpbGV9IGhhcyBiZWVuIGFkZGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXN0IGV4dGVuc2lvbiwgaWYgdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NhbiBldmVyeXRoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckFkZEFuZFJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ2NoYW5nZScsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7ZmlsZX0gaGFzIGJlZW4gY2hhbmdlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gb25seSBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5tZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcuanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hDaGFuZ2VkRmlsZXMucHVzaChwYXRoLmpvaW4oY3dkICsgcGF0aC5zZXAgKyBmaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGVyQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5vbigndW5saW5rJywgZmlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtmaWxlfSBoYXMgYmVlbiByZW1vdmVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXN0IGV4dGVuc2lvbiwgaWYgdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NhbiBldmVyeXRoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckFkZEFuZFJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBhcHBsaWNhdGlvbiAvIHJvb3QgY29tcG9uZW50IGluc3RhbmNlLlxuICAgICAqL1xuICAgIGdldCBhcHBsaWNhdGlvbigpOiBBcHBsaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldCBpc0NMSSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IGdsb2IgPSByZXF1aXJlKCdnbG9iJyk7XG5cbmV4cG9ydCBjbGFzcyBQYXJzZXJVdGlsIHtcbiAgICBwcml2YXRlIF9maWxlcztcbiAgICBwcml2YXRlIF9jd2Q7XG4gICAgcHJpdmF0ZSBfZ2xvYkZpbGVzID0gW107XG5cbiAgICBwdWJsaWMgaW5pdChleGNsdWRlOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZmlsZXMgPSBleGNsdWRlO1xuICAgICAgICB0aGlzLl9jd2QgPSBjd2Q7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IGV4Y2x1ZGUubGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9nbG9iRmlsZXMgPSBbLi4udGhpcy5fZ2xvYkZpbGVzLCAuLi5nbG9iLnN5bmMoZXhjbHVkZVtpXSwgeyBjd2Q6IHRoaXMuX2N3ZCB9KV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdGVzdEZpbGVzV2l0aEN3ZERlcHRoKCkge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSB0aGlzLl9maWxlcy5sZW5ndGg7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGF0dXM6IHRydWUsXG4gICAgICAgICAgICBsZXZlbDogMFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuX2N3ZCArIHBhdGguc2VwLCB0aGlzLl9maWxlc1tpXSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudFBhdGguaW5kZXhPZih0aGlzLl9jd2QpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSB0aGlzLl9maWxlc1tpXS5tYXRjaCgvXFwuLlxcLy9nKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGxldmVsID4gcmVzdWx0LmxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5sZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDd2QoY3dkLCBsZXZlbCkge1xuICAgICAgICBsZXQgX2N3ZCA9IGN3ZCxcbiAgICAgICAgICAgIF9yZXdpbmQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7XG4gICAgICAgICAgICBfcmV3aW5kICs9ICcuLi8nO1xuICAgICAgICB9XG4gICAgICAgIF9jd2QgPSBwYXRoLnJlc29sdmUoX2N3ZCwgX3Jld2luZCk7XG4gICAgICAgIHJldHVybiBfY3dkO1xuICAgIH1cblxuICAgIHB1YmxpYyB0ZXN0RmlsZShmaWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gdGhpcy5fZmlsZXMubGVuZ3RoO1xuICAgICAgICBsZXQgZmlsZUJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlKTtcbiAgICAgICAgbGV0IGZpbGVOYW1lSW5Dd2QgPSBmaWxlLnJlcGxhY2UodGhpcy5fY3dkICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwYXRoLnNlcCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBmaWxlTmFtZUluQ3dkID0gZmlsZU5hbWVJbkN3ZC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwnICsgcGF0aC5zZXAsICdnJyksICcvJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGdsb2IuaGFzTWFnaWModGhpcy5fZmlsZXNbaV0pICYmIHRoaXMuX2dsb2JGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdEdsb2JTZWFyY2ggPSB0aGlzLl9nbG9iRmlsZXMuZmluZEluZGV4KGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5fY3dkICsgcGF0aC5zZXAsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFBhdGhJbkN3ZCA9IGVsZW1lbnRQYXRoLnJlcGxhY2UodGhpcy5fY3dkICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFBhdGhJbkN3ZCA9IGVsZW1lbnRQYXRoSW5Dd2QucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoJ1xcXFwnICsgcGF0aC5zZXAsICdnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAnLydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRQYXRoSW5Dd2QgPT09IGZpbGVOYW1lSW5Dd2Q7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0R2xvYlNlYXJjaCAhPT0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGVOYW1lSW5Dd2QgPT09IHRoaXMuX2ZpbGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHAvYXBwbGljYXRpb24nO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi9hcHAvY29uZmlndXJhdGlvbic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2FwcC9lbmdpbmVzL2ZpbGUuZW5naW5lJztcbmltcG9ydCBJMThuRW5naW5lIGZyb20gJy4vYXBwL2VuZ2luZXMvaTE4bi5lbmdpbmUnO1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRmlsZUludGVyZmFjZSB9IGZyb20gJy4vYXBwL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi1maWxlLmludGVyZmFjZSc7XG5pbXBvcnQgQW5ndWxhclZlcnNpb25VdGlsIGZyb20gJy4vdXRpbHMvYW5ndWxhci12ZXJzaW9uLnV0aWwnO1xuaW1wb3J0IHsgQ09NUE9ET0NfREVGQVVMVFMgfSBmcm9tICcuL3V0aWxzL2RlZmF1bHRzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IFBhcnNlclV0aWwgfSBmcm9tICcuL3V0aWxzL3BhcnNlci51dGlsLmNsYXNzJztcbmltcG9ydCB7IHJlYWRDb25maWcsIGlnbm9yZURpcmVjdG9yeSB9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBjb3NtaWNvbmZpZ1N5bmMgfSBmcm9tICdjb3NtaWNvbmZpZyc7XG5cbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IG9zTmFtZSA9IHJlcXVpcmUoJ29zLW5hbWUnKTtcbmNvbnN0IHBrZyA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUoJ2NvbW1hbmRlcicpO1xuXG5jb25zdCBjb3NtaWNvbmZpZ01vZHVsZU5hbWUgPSAnY29tcG9kb2MnO1xuXG5sZXQgc2Nhbm5lZEZpbGVzID0gW107XG5sZXQgZXhjbHVkZUZpbGVzO1xubGV0IGluY2x1ZGVGaWxlcztcbmxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG5wcm9jZXNzLnNldE1heExpc3RlbmVycygwKTtcblxuZXhwb3J0IGNsYXNzIENsaUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFJ1biBjb21wb2RvYyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXJ0KCk6IGFueSB7XG4gICAgICAgIGZ1bmN0aW9uIGxpc3QodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnNwbGl0KCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9ncmFtXG4gICAgICAgICAgICAudmVyc2lvbihwa2cudmVyc2lvbilcbiAgICAgICAgICAgIC51c2FnZSgnPHNyYz4gW29wdGlvbnNdJylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1jLCAtLWNvbmZpZyBbY29uZmlnXScsXG4gICAgICAgICAgICAgICAgJ0EgY29uZmlndXJhdGlvbiBmaWxlIDogLmNvbXBvZG9jcmMsIC5jb21wb2RvY3JjLmpzb24sIC5jb21wb2RvY3JjLnlhbWwgb3IgY29tcG9kb2MgcHJvcGVydHkgaW4gcGFja2FnZS5qc29uJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLXAsIC0tdHNjb25maWcgW2NvbmZpZ10nLCAnQSB0c2NvbmZpZy5qc29uIGZpbGUnKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLWQsIC0tb3V0cHV0IFtmb2xkZXJdJyxcbiAgICAgICAgICAgICAgICAnV2hlcmUgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5mb2xkZXJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy15LCAtLWV4dFRoZW1lIFtmaWxlXScsICdFeHRlcm5hbCBzdHlsaW5nIHRoZW1lIGZpbGUnKVxuICAgICAgICAgICAgLm9wdGlvbignLW4sIC0tbmFtZSBbbmFtZV0nLCAnVGl0bGUgZG9jdW1lbnRhdGlvbicsIENPTVBPRE9DX0RFRkFVTFRTLnRpdGxlKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLWEsIC0tYXNzZXRzRm9sZGVyIFtmb2xkZXJdJyxcbiAgICAgICAgICAgICAgICAnRXh0ZXJuYWwgYXNzZXRzIGZvbGRlciB0byBjb3B5IGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIGZvbGRlcidcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy1vLCAtLW9wZW4gW3ZhbHVlXScsICdPcGVuIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctdCwgLS1zaWxlbnQnLFxuICAgICAgICAgICAgICAgIFwiSW4gc2lsZW50IG1vZGUsIGxvZyBtZXNzYWdlcyBhcmVuJ3QgbG9nZ2VkIGluIHRoZSBjb25zb2xlXCIsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1zLCAtLXNlcnZlJyxcbiAgICAgICAgICAgICAgICAnU2VydmUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gKGRlZmF1bHQgaHR0cDovL2xvY2FsaG9zdDo4MDgwLyknLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWhvc3QgW2hvc3RdJywgJ0NoYW5nZSBkZWZhdWx0IGhvc3QgYWRkcmVzcycpXG4gICAgICAgICAgICAub3B0aW9uKCctciwgLS1wb3J0IFtwb3J0XScsICdDaGFuZ2UgZGVmYXVsdCBzZXJ2aW5nIHBvcnQnLCBDT01QT0RPQ19ERUZBVUxUUy5wb3J0KVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLXcsIC0td2F0Y2gnLFxuICAgICAgICAgICAgICAgICdXYXRjaCBzb3VyY2UgZmlsZXMgYWZ0ZXIgc2VydmUgYW5kIGZvcmNlIGRvY3VtZW50YXRpb24gcmVidWlsZCcsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1lLCAtLWV4cG9ydEZvcm1hdCBbZm9ybWF0XScsXG4gICAgICAgICAgICAgICAgJ0V4cG9ydCBpbiBzcGVjaWZpZWQgZm9ybWF0IChqc29uLCBodG1sKScsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0XG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWZpbGVzIFtmaWxlc10nLCAnRmlsZXMgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbCwgdXNlZCBmb3IgY292ZXJhZ2UgdGVzdCcpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWxhbmd1YWdlIFtsYW5ndWFnZV0nLFxuICAgICAgICAgICAgICAgICdMYW5ndWFnZSB1c2VkIGZvciB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gKGRlLURFLCBlbi1VUywgZXMtRVMsIGZyLUZSLCBodS1IVSwgaXQtSVQsIGphLUpQLCBrby1LUiwgbmwtTkwsIHBsLVBMLCBwdC1CUiwgc2stU0ssIHpoLUNOLCB6aC1UVyknLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmxhbmd1YWdlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLXRoZW1lIFt0aGVtZV0nLFxuICAgICAgICAgICAgICAgIFwiQ2hvb3NlIG9uZSBvZiBhdmFpbGFibGUgdGhlbWVzLCBkZWZhdWx0IGlzICdnaXRib29rJyAobGFyYXZlbCwgb3JpZ2luYWwsIG1hdGVyaWFsLCBwb3N0bWFyaywgcmVhZHRoZWRvY3MsIHN0cmlwZSwgdmFncmFudClcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1oaWRlR2VuZXJhdG9yJyxcbiAgICAgICAgICAgICAgICAnRG8gbm90IHByaW50IHRoZSBDb21wb2RvYyBsaW5rIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UnLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWhpZGVEYXJrTW9kZVRvZ2dsZScsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBzaG93IGRhcmsgbW9kZSB0b2dnbGUgYnV0dG9uIGF0IHRoZSB0b3AgcmlnaHQgcG9zaXRpb24gb2YgdGhlIHBhZ2UnLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLXRvZ2dsZU1lbnVJdGVtcyA8aXRlbXM+JyxcbiAgICAgICAgICAgICAgICBcIkNsb3NlIGJ5IGRlZmF1bHQgaXRlbXMgaW4gdGhlIG1lbnUgdmFsdWVzIDogWydhbGwnXSBvciBvbmUgb2YgdGhlc2UgWydtb2R1bGVzJywnY29tcG9uZW50cycsJ2RpcmVjdGl2ZXMnLCdjb250cm9sbGVycycsJ2VudGl0aWVzJywnY2xhc3NlcycsJ2luamVjdGFibGVzJywnZ3VhcmRzJywnaW50ZXJmYWNlcycsJ2ludGVyY2VwdG9ycycsJ3BpcGVzJywnbWlzY2VsbGFuZW91cycsJ2FkZGl0aW9uYWxQYWdlcyddXCIsXG4gICAgICAgICAgICAgICAgbGlzdCxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tbmF2VGFiQ29uZmlnIDx0YWIgY29uZmlncz4nLFxuICAgICAgICAgICAgICAgIGBMaXN0IG5hdmlnYXRpb24gdGFiIG9iamVjdHMgaW4gdGhlIGRlc2lyZWQgb3JkZXIgd2l0aCB0d28gc3RyaW5nIHByb3BlcnRpZXMgKFwiaWRcIiBhbmQgXCJsYWJlbFwiKS4gXFxcbkRvdWJsZS1xdW90ZXMgbXVzdCBiZSBlc2NhcGVkIHdpdGggJ1xcXFwnLiBcXFxuQXZhaWxhYmxlIHRhYiBJRHMgYXJlIFwiaW5mb1wiLCBcInJlYWRtZVwiLCBcInNvdXJjZVwiLCBcInRlbXBsYXRlRGF0YVwiLCBcInN0eWxlRGF0YVwiLCBcInRyZWVcIiwgYW5kIFwiZXhhbXBsZVwiLiBcXFxuTm90ZTogQ2VydGFpbiB0YWJzIHdpbGwgb25seSBiZSBzaG93biBpZiBhcHBsaWNhYmxlIHRvIGEgZ2l2ZW4gZGVwZW5kZW5jeWAsXG4gICAgICAgICAgICAgICAgbGlzdCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShDT01QT0RPQ19ERUZBVUxUUy5uYXZUYWJDb25maWcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLXRlbXBsYXRlcyBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ1BhdGggdG8gZGlyZWN0b3J5IG9mIEhhbmRsZWJhcnMgdGVtcGxhdGVzIHRvIG92ZXJyaWRlIGJ1aWx0LWluIHRlbXBsYXRlcydcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0taW5jbHVkZXMgW3BhdGhdJywgJ1BhdGggb2YgZXh0ZXJuYWwgbWFya2Rvd24gZmlsZXMgdG8gaW5jbHVkZScpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWluY2x1ZGVzTmFtZSBbbmFtZV0nLFxuICAgICAgICAgICAgICAgICdOYW1lIG9mIGl0ZW0gbWVudSBvZiBleHRlcm5hbHMgbWFya2Rvd24gZmlsZXMnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeU5hbWVcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tY292ZXJhZ2VUZXN0IFt0aHJlc2hvbGRdJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2Ugd2l0aCBhIHRocmVzaG9sZCAoZGVmYXVsdCA3MCknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWNvdmVyYWdlTWluaW11bVBlckZpbGUgW21pbmltdW1dJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgd2l0aCBhIG1pbmltdW0gKGRlZmF1bHQgMCknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgW3RydWV8ZmFsc2VdJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgKGdsb2JhbCBvciBwZXIgZmlsZSkgd2lsbCBmYWlsIHdpdGggZXJyb3Igb3IganVzdCB3YXJuIHVzZXIgKHRydWU6IGVycm9yLCBmYWxzZTogd2FybiknLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQnLCAnRGlzcGxheSBvbmx5IGZhaWxlZCBmaWxlcyBmb3IgYSBjb3ZlcmFnZSB0ZXN0JylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdW5pdFRlc3RDb3ZlcmFnZSBbanNvbi1zdW1tYXJ5XScsXG4gICAgICAgICAgICAgICAgJ1RvIGluY2x1ZGUgdW5pdCB0ZXN0IGNvdmVyYWdlLCBzcGVjaWZ5IGlzdGFuYnVsIEpTT04gY292ZXJhZ2Ugc3VtbWFyeSBmaWxlJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlU291cmNlQ29kZScsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBhZGQgc291cmNlIGNvZGUgdGFiIGFuZCBsaW5rcyB0byBzb3VyY2UgY29kZScsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZURvbVRyZWUnLCAnRG8gbm90IGFkZCBkb20gdHJlZSB0YWInLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZVRlbXBsYXRlVGFiJywgJ0RvIG5vdCBhZGQgdGVtcGxhdGUgdGFiJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVTdHlsZVRhYicsICdEbyBub3QgYWRkIHN0eWxlIHRhYicsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlR3JhcGgnLCAnRG8gbm90IGFkZCB0aGUgZGVwZW5kZW5jeSBncmFwaCcsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlQ292ZXJhZ2UnLCAnRG8gbm90IGFkZCB0aGUgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSByZXBvcnQnLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZVByaXZhdGUnLCAnRG8gbm90IHNob3cgcHJpdmF0ZSBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlUHJvdGVjdGVkJywgJ0RvIG5vdCBzaG93IHByb3RlY3RlZCBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlSW50ZXJuYWwnLCAnRG8gbm90IHNob3cgQGludGVybmFsIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWRpc2FibGVMaWZlQ3ljbGVIb29rcycsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBzaG93IEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2tzIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJyxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlUm91dGVzR3JhcGgnLFxuICAgICAgICAgICAgICAgICdEbyBub3QgYWRkIHRoZSByb3V0ZXMgZ3JhcGgnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVSb3V0ZXNHcmFwaFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlU2VhcmNoJywgJ0RvIG5vdCBhZGQgdGhlIHNlYXJjaCBpbnB1dCcsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlRGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICAnRG8gbm90IGFkZCB0aGUgZGVwZW5kZW5jaWVzIGxpc3QnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVEZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZVByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICdEbyBub3QgYWRkIHRoZSBwcm9wZXJ0aWVzIGxpc3QnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcm9wZXJ0aWVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLW1pbmltYWwnLFxuICAgICAgICAgICAgICAgICdNaW5pbWFsIG1vZGUgd2l0aCBvbmx5IGRvY3VtZW50YXRpb24uIE5vIHNlYXJjaCwgbm8gZ3JhcGgsIG5vIGNvdmVyYWdlLicsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3VzdG9tRmF2aWNvbiBbcGF0aF0nLCAnVXNlIGEgY3VzdG9tIGZhdmljb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jdXN0b21Mb2dvIFtwYXRoXScsICdVc2UgYSBjdXN0b20gbG9nbycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWdhSUQgW2lkXScsICdHb29nbGUgQW5hbHl0aWNzIHRyYWNraW5nIElEJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZ2FTaXRlIFtzaXRlXScsICdHb29nbGUgQW5hbHl0aWNzIHNpdGUgbmFtZScsIENPTVBPRE9DX0RFRkFVTFRTLmdhU2l0ZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tbWF4U2VhcmNoUmVzdWx0cyBbbWF4U2VhcmNoUmVzdWx0c10nLFxuICAgICAgICAgICAgICAgICdNYXggc2VhcmNoIHJlc3VsdHMgb24gdGhlIHJlc3VsdHMgcGFnZS4gVG8gc2hvdyBhbGwgcmVzdWx0cywgc2V0IHRvIDAnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLm1heFNlYXJjaFJlc3VsdHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuXG4gICAgICAgIGxldCBvdXRwdXRIZWxwID0gKCkgPT4ge1xuICAgICAgICAgICAgcHJvZ3JhbS5vdXRwdXRIZWxwKCk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29uZmlnRXhwbG9yZXIgPSBjb3NtaWNvbmZpZ1N5bmMoY29zbWljb25maWdNb2R1bGVOYW1lKTtcblxuICAgICAgICBsZXQgY29uZmlnRXhwbG9yZXJSZXN1bHQ7XG5cbiAgICAgICAgbGV0IGNvbmZpZ0ZpbGU6IENvbmZpZ3VyYXRpb25GaWxlSW50ZXJmYWNlID0ge307XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbU9wdGlvbnMgPSBwcm9ncmFtLm9wdHMoKTtcblxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuY29uZmlnKSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnRmlsZVBhdGggPSBwcm9ncmFtT3B0aW9ucy5jb25maWc7XG4gICAgICAgICAgICBsZXQgdGVzdENvbmZpZ0ZpbGVQYXRoID0gY29uZmlnRmlsZVBhdGgubWF0Y2gocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICBpZiAodGVzdENvbmZpZ0ZpbGVQYXRoICYmIHRlc3RDb25maWdGaWxlUGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZVBhdGggPSBjb25maWdGaWxlUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnRXhwbG9yZXJSZXN1bHQgPSBjb25maWdFeHBsb3Jlci5sb2FkKHBhdGgucmVzb2x2ZShjb25maWdGaWxlUGF0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnRXhwbG9yZXJSZXN1bHQgPSBjb25maWdFeHBsb3Jlci5zZWFyY2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdFeHBsb3JlclJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZSA9IGNvbmZpZ0V4cGxvcmVyUmVzdWx0LmNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm91dHB1dCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgPSBjb25maWdGaWxlLm91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMub3V0cHV0ICYmIHByb2dyYW1PcHRpb25zLm91dHB1dCAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCA9IHByb2dyYW1PcHRpb25zLm91dHB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmV4dFRoZW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lID0gY29uZmlnRmlsZS5leHRUaGVtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZXh0VGhlbWUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXh0VGhlbWUgPSBwcm9ncmFtT3B0aW9ucy5leHRUaGVtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlID0gY29uZmlnRmlsZS5sYW5ndWFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMubGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubGFuZ3VhZ2UgPSBwcm9ncmFtT3B0aW9ucy5sYW5ndWFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnRoZW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRoZW1lID0gY29uZmlnRmlsZS50aGVtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMudGhlbWUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgPSBwcm9ncmFtT3B0aW9ucy50aGVtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm5hbWUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZG9jdW1lbnRhdGlvbk1haW5OYW1lID0gY29uZmlnRmlsZS5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5uYW1lICYmIHByb2dyYW1PcHRpb25zLm5hbWUgIT09IENPTVBPRE9DX0RFRkFVTFRTLnRpdGxlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSA9IHByb2dyYW1PcHRpb25zLm5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5hc3NldHNGb2xkZXIpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyID0gY29uZmlnRmlsZS5hc3NldHNGb2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmFzc2V0c0ZvbGRlcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgPSBwcm9ncmFtT3B0aW9ucy5hc3NldHNGb2xkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5vcGVuKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm9wZW4gPSBjb25maWdGaWxlLm9wZW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLm9wZW4pIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3BlbiA9IHByb2dyYW1PcHRpb25zLm9wZW47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS50b2dnbGVNZW51SXRlbXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zID0gY29uZmlnRmlsZS50b2dnbGVNZW51SXRlbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMudG9nZ2xlTWVudUl0ZW1zICYmXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy50b2dnbGVNZW51SXRlbXMgIT09IENPTVBPRE9DX0RFRkFVTFRTLnRvZ2dsZU1lbnVJdGVtc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zID0gcHJvZ3JhbU9wdGlvbnMudG9nZ2xlTWVudUl0ZW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudGVtcGxhdGVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlcyA9IGNvbmZpZ0ZpbGUudGVtcGxhdGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy50ZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGVtcGxhdGVzID0gcHJvZ3JhbU9wdGlvbnMudGVtcGxhdGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUubmF2VGFiQ29uZmlnKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm5hdlRhYkNvbmZpZyA9IGNvbmZpZ0ZpbGUubmF2VGFiQ29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW1PcHRpb25zLm5hdlRhYkNvbmZpZyAmJlxuICAgICAgICAgICAgSlNPTi5wYXJzZShwcm9ncmFtT3B0aW9ucy5uYXZUYWJDb25maWcpLmxlbmd0aCAhPT0gQ09NUE9ET0NfREVGQVVMVFMubmF2VGFiQ29uZmlnLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubmF2VGFiQ29uZmlnID0gSlNPTi5wYXJzZShwcm9ncmFtT3B0aW9ucy5uYXZUYWJDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMgPSBjb25maWdGaWxlLmluY2x1ZGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5pbmNsdWRlcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyA9IHByb2dyYW1PcHRpb25zLmluY2x1ZGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaW5jbHVkZXNOYW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzTmFtZSA9IGNvbmZpZ0ZpbGUuaW5jbHVkZXNOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW1PcHRpb25zLmluY2x1ZGVzTmFtZSAmJlxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuaW5jbHVkZXNOYW1lICE9PSBDT01QT0RPQ19ERUZBVUxUUy5hZGRpdGlvbmFsRW50cnlOYW1lXG4gICAgICAgICkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc05hbWUgPSBwcm9ncmFtT3B0aW9ucy5pbmNsdWRlc05hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5zaWxlbnQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5zaWxlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICBsb2dnZXIuc2lsZW50ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5zZXJ2ZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSA9IGNvbmZpZ0ZpbGUuc2VydmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnNlcnZlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlID0gcHJvZ3JhbU9wdGlvbnMuc2VydmU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5ob3N0KSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3QgPSBjb25maWdGaWxlLmhvc3Q7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3RuYW1lID0gY29uZmlnRmlsZS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5ob3N0KSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3QgPSBwcm9ncmFtT3B0aW9ucy5ob3N0O1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0bmFtZSA9IHByb2dyYW1PcHRpb25zLmhvc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5wb3J0KSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnBvcnQgPSBjb25maWdGaWxlLnBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnBvcnQgJiYgcHJvZ3JhbU9wdGlvbnMucG9ydCAhPT0gQ09NUE9ET0NfREVGQVVMVFMucG9ydCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0ID0gcHJvZ3JhbU9wdGlvbnMucG9ydDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLndhdGNoKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoID0gY29uZmlnRmlsZS53YXRjaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMud2F0Y2gpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEud2F0Y2ggPSBwcm9ncmFtT3B0aW9ucy53YXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgPSBjb25maWdGaWxlLmV4cG9ydEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5leHBvcnRGb3JtYXQgJiZcbiAgICAgICAgICAgIHByb2dyYW1PcHRpb25zLmV4cG9ydEZvcm1hdCAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0XG4gICAgICAgICkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgPSBwcm9ncmFtT3B0aW9ucy5leHBvcnRGb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhpZGVHZW5lcmF0b3IgPSBjb25maWdGaWxlLmhpZGVHZW5lcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmhpZGVHZW5lcmF0b3IpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZUdlbmVyYXRvciA9IHByb2dyYW1PcHRpb25zLmhpZGVHZW5lcmF0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5oaWRlRGFya01vZGVUb2dnbGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZURhcmtNb2RlVG9nZ2xlID0gY29uZmlnRmlsZS5oaWRlRGFya01vZGVUb2dnbGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmhpZGVEYXJrTW9kZVRvZ2dsZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oaWRlRGFya01vZGVUb2dnbGUgPSBwcm9ncmFtT3B0aW9ucy5oaWRlRGFya01vZGVUb2dnbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3QpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3QsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0KSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3QsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmNvdmVyYWdlTWluaW11bVBlckZpbGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZSA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBjb25maWdGaWxlLmNvdmVyYWdlTWluaW11bVBlckZpbGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoY29uZmlnRmlsZS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlLCAxMClcbiAgICAgICAgICAgICAgICAgICAgOiBDT01QT0RPQ19ERUZBVUxUUy5kZWZhdWx0Q292ZXJhZ2VNaW5pbXVtUGVyRmlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHByb2dyYW1PcHRpb25zLmNvdmVyYWdlTWluaW11bVBlckZpbGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSwgMTApXG4gICAgICAgICAgICAgICAgICAgIDogQ09NUE9ET0NfREVGQVVMVFMuZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgPVxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID1cbiAgICAgICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQgPVxuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkID1cbiAgICAgICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnVuaXRUZXN0Q292ZXJhZ2UpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSA9IGNvbmZpZ0ZpbGUudW5pdFRlc3RDb3ZlcmFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMudW5pdFRlc3RDb3ZlcmFnZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS51bml0VGVzdENvdmVyYWdlID0gcHJvZ3JhbU9wdGlvbnMudW5pdFRlc3RDb3ZlcmFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTb3VyY2VDb2RlID0gY29uZmlnRmlsZS5kaXNhYmxlU291cmNlQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVNvdXJjZUNvZGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlU291cmNlQ29kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVEb21UcmVlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVEb21UcmVlID0gY29uZmlnRmlsZS5kaXNhYmxlRG9tVHJlZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZURvbVRyZWUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZURvbVRyZWUgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlRG9tVHJlZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVUZW1wbGF0ZVRhYikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIgPSBjb25maWdGaWxlLmRpc2FibGVUZW1wbGF0ZVRhYjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVRlbXBsYXRlVGFiKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVUZW1wbGF0ZVRhYiA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVUZW1wbGF0ZVRhYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVTdHlsZVRhYikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU3R5bGVUYWIgPSBjb25maWdGaWxlLmRpc2FibGVTdHlsZVRhYjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVN0eWxlVGFiKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTdHlsZVRhYiA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVTdHlsZVRhYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSBjb25maWdGaWxlLmRpc2FibGVHcmFwaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZUdyYXBoKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVHcmFwaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSBjb25maWdGaWxlLmRpc2FibGVDb3ZlcmFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVDb3ZlcmFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVQcml2YXRlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlID0gY29uZmlnRmlsZS5kaXNhYmxlUHJpdmF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByaXZhdGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByaXZhdGUgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlUHJpdmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByb3RlY3RlZCA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVByb3RlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByb3RlY3RlZCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByb3RlY3RlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVJbnRlcm5hbCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwgPSBjb25maWdGaWxlLmRpc2FibGVJbnRlcm5hbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZUludGVybmFsKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVJbnRlcm5hbCA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVJbnRlcm5hbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MgPSBjb25maWdGaWxlLmRpc2FibGVMaWZlQ3ljbGVIb29rcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcyA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVMaWZlQ3ljbGVIb29rcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGggPSBjb25maWdGaWxlLmRpc2FibGVSb3V0ZXNHcmFwaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVSb3V0ZXNHcmFwaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVTZWFyY2gpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVNlYXJjaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU2VhcmNoID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVNlYXJjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZURlcGVuZGVuY2llcyA9IGNvbmZpZ0ZpbGUuZGlzYWJsZURlcGVuZGVuY2llcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZURlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRGVwZW5kZW5jaWVzID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZURlcGVuZGVuY2llcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcm9wZXJ0aWVzID0gY29uZmlnRmlsZS5kaXNhYmxlUHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByb3BlcnRpZXMgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlUHJvcGVydGllcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm1pbmltYWwpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLm1pbmltYWwpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gPSBjb25maWdGaWxlLmN1c3RvbUZhdmljb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmN1c3RvbUZhdmljb24pIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tRmF2aWNvbiA9IHByb2dyYW1PcHRpb25zLmN1c3RvbUZhdmljb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUxvZ28gPSBjb25maWdGaWxlLmN1c3RvbUxvZ287XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmN1c3RvbUxvZ28pIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tTG9nbyA9IHByb2dyYW1PcHRpb25zLmN1c3RvbUxvZ287XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5nYUlEKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmdhSUQgPSBjb25maWdGaWxlLmdhSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmdhSUQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FJRCA9IHByb2dyYW1PcHRpb25zLmdhSUQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5nYVNpdGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FTaXRlID0gY29uZmlnRmlsZS5nYVNpdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmdhU2l0ZSAmJiBwcm9ncmFtT3B0aW9ucy5nYVNpdGUgIT09IENPTVBPRE9DX0RFRkFVTFRTLmdhU2l0ZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5nYVNpdGUgPSBwcm9ncmFtT3B0aW9ucy5nYVNpdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgaWYgKCFsb2dnZXIuc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbXBvZG9jIHYke3BrZy52ZXJzaW9ufWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3NyYy9iYW5uZXInKSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGtnLnZlcnNpb24pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVHlwZVNjcmlwdCB2ZXJzaW9uIHVzZWQgYnkgQ29tcG9kb2MgOiAke3RzLnZlcnNpb259YCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKEZpbGVFbmdpbmUuZXhpc3RzU3luYyhjd2QgKyBwYXRoLnNlcCArICdwYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWNrYWdlRGF0YSA9IEZpbGVFbmdpbmUuZ2V0U3luYyhjd2QgKyBwYXRoLnNlcCArICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShwYWNrYWdlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0RGV2RGVwZW5kZW5jaWVzID0gcGFyc2VkRGF0YS5kZXZEZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdERldkRlcGVuZGVuY2llcyAmJiBwcm9qZWN0RGV2RGVwZW5kZW5jaWVzLnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0c1Byb2plY3RWZXJzaW9uID0gQW5ndWxhclZlcnNpb25VdGlsLmNsZWFuVmVyc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdERldkRlcGVuZGVuY2llcy50eXBlc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFR5cGVTY3JpcHQgdmVyc2lvbiBvZiBjdXJyZW50IHByb2plY3QgOiAke3RzUHJvamVjdFZlcnNpb259YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBOb2RlLmpzIHZlcnNpb24gOiAke3Byb2Nlc3MudmVyc2lvbn1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYE9wZXJhdGluZyBzeXN0ZW0gOiAke29zTmFtZShvcy5wbGF0Zm9ybSgpLCBvcy5yZWxlYXNlKCkpfWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdFeHBsb3JlclJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFVzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSA6ICR7Y29uZmlnRXhwbG9yZXJSZXN1bHQuZmlsZXBhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZ0V4cGxvcmVyUmVzdWx0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgTm8gY29uZmlndXJhdGlvbiBmaWxlIGZvdW5kLCBzd2l0Y2hpbmcgdG8gQ0xJIGZsYWdzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmxhbmd1YWdlICYmICFJMThuRW5naW5lLnN1cHBvcnRMYW5ndWFnZShwcm9ncmFtT3B0aW9ucy5sYW5ndWFnZSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgIGBUaGUgbGFuZ3VhZ2UgJHtwcm9ncmFtT3B0aW9ucy5sYW5ndWFnZX0gaXMgbm90IGF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvICR7STE4bkVuZ2luZS5mYWxsYmFja0xhbmd1YWdlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMudHNjb25maWcgJiYgdHlwZW9mIHByb2dyYW1PcHRpb25zLnRzY29uZmlnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUGxlYXNlIHByb3ZpZGUgYSB0c2NvbmZpZyBmaWxlLmApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudHNjb25maWcpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgPSBjb25maWdGaWxlLnRzY29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy50c2NvbmZpZykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IHByb2dyYW1PcHRpb25zLnRzY29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLm1heFNlYXJjaFJlc3VsdHMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWF4U2VhcmNoUmVzdWx0cyA9IHByb2dyYW1PcHRpb25zLm1heFNlYXJjaFJlc3VsdHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5maWxlcykge1xuICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gY29uZmlnRmlsZS5maWxlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnRmlsZS5leGNsdWRlKSB7XG4gICAgICAgICAgICBleGNsdWRlRmlsZXMgPSBjb25maWdGaWxlLmV4Y2x1ZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaW5jbHVkZSkge1xuICAgICAgICAgICAgaW5jbHVkZUZpbGVzID0gY29uZmlnRmlsZS5pbmNsdWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIC0tZmlsZXMgYXJndW1lbnQgY2FsbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgYXJndiA9IHJlcXVpcmUoJ21pbmltaXN0JykocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKTtcbiAgICAgICAgaWYgKGFyZ3YgJiYgYXJndi5maWxlcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oYXNGaWxlc1RvQ292ZXJhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd2LmZpbGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHN1cGVyLnNldEZpbGVzKFthcmd2LmZpbGVzXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1cGVyLnNldEZpbGVzKGFyZ3YuZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnNlcnZlICYmICFDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnICYmIHByb2dyYW1PcHRpb25zLm91dHB1dCkge1xuICAgICAgICAgICAgLy8gaWYgLXMgJiAtZCwgc2VydmUgaXRcbiAgICAgICAgICAgIGlmICghRmlsZUVuZ2luZS5leGlzdHNTeW5jKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dH0gZm9sZGVyIGRvZXNuJ3QgZXhpc3RgKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICBgU2VydmluZyBkb2N1bWVudGF0aW9uIGZyb20gJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dH0gYXQgaHR0cDovLyR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0bmFtZX06JHtwcm9ncmFtT3B0aW9ucy5wb3J0fWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHN1cGVyLnJ1bldlYlNlcnZlcihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5zZXJ2ZSAmJlxuICAgICAgICAgICAgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgJiZcbiAgICAgICAgICAgICFwcm9ncmFtT3B0aW9ucy5vdXRwdXRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBpZiBvbmx5IC1zIGZpbmQgLi9kb2N1bWVudGF0aW9uLCBpZiBvayBzZXJ2ZSwgZWxzZSBlcnJvciBwcm92aWRlIC1kXG4gICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Byb3ZpZGUgb3V0cHV0IGdlbmVyYXRlZCBmb2xkZXIgd2l0aCAtZCBmbGFnJyk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGF0IGh0dHA6Ly8ke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWV9OiR7cHJvZ3JhbU9wdGlvbnMucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzdXBlci5ydW5XZWJTZXJ2ZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGFzRmlsZXNUb0NvdmVyYWdlKSB7XG4gICAgICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSdW4gZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSB0ZXN0IGZvciBmaWxlcycpO1xuICAgICAgICAgICAgICAgIHN1cGVyLnRlc3RDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ01pc3NpbmcgY292ZXJhZ2UgY29uZmlndXJhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmhpZGVHZW5lcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhpZGVHZW5lcmF0b3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyAmJiBwcm9ncmFtLmFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogdHNjb25maWcgZmlsZSBwcm92aWRlZCBvbmx5XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbGV0IHRlc3RUc0NvbmZpZ1BhdGggPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLmluZGV4T2YocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RUc0NvbmZpZ1BhdGggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghRmlsZUVuZ2luZS5leGlzdHNTeW5jKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcIiR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZ31cIiBmaWxlIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHBhdGguZGlybmFtZShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb2YgdHNjb25maWcuanNvbiBhcyBhIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAgICAgICAgICAgIGN3ZCA9IF9maWxlLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkuam9pbihwYXRoLnNlcCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyB0c2NvbmZpZyBmaWxlICcsIF9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdHNDb25maWdGaWxlID0gcmVhZENvbmZpZyhfZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0c0NvbmZpZ0ZpbGUuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IHRzQ29uZmlnRmlsZS5maWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRoIG9mIHRoZXNlIGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMgPSBzY2FubmVkRmlsZXMubWFwKHNjYW5uZWRGaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3dkICsgcGF0aC5zZXAgKyBzY2FubmVkRmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBmaWxlcyBhcmUgc3VwcGxpZWQgd2l0aCBcImZpbGVzXCIgYXR0cmlidXRlcywgZW5oYW5jZSB0aGUgYXJyYXkgd2l0aCBpbmNsdWRlc1xuICAgICAgICAgICAgICAgICAgICBleGNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuZXhjbHVkZSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUZpbGVzID0gdHNDb25maWdGaWxlLmluY2x1ZGUgfHwgW107XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5uZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSBbLi4uaW5jbHVkZUZpbGVzLCAuLi5zY2FubmVkRmlsZXNdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4Y2x1ZGVQYXJzZXIgPSBuZXcgUGFyc2VyVXRpbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlciA9IG5ldyBQYXJzZXJVdGlsKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhcnNlci5pbml0KGV4Y2x1ZGVGaWxlcywgY3dkKTtcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlci5pbml0KGluY2x1ZGVGaWxlcywgY3dkKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRDd2QgPSBjd2Q7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4Y2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGggPSBleGNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGguc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGV4Y2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlUGFyc2VyVGVzdEZpbGVzV2l0aEN3ZERlcHRoLmxldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmNsdWRlUGFyc2VyVGVzdEZpbGVzV2l0aEN3ZERlcHRoID0gaW5jbHVkZVBhcnNlci50ZXN0RmlsZXNXaXRoQ3dkRGVwdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDd2QgPSBpbmNsdWRlUGFyc2VyLnVwZGF0ZUN3ZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5sZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5kZXIgPSByZXF1aXJlKCdmaW5kaXQyJykoc3RhcnRDd2QgfHwgJy4nKTtcblxuICAgICAgICAgICAgICAgICAgICBmaW5kZXIub24oJ2RpcmVjdG9yeScsIGZ1bmN0aW9uIChkaXIsIHN0YXQsIHN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVEaXJlY3RvcnkoZGlyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdmaWxlJywgKGZpbGUsIHN0YXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvKHNwZWN8XFwuZClcXC50cy8udGVzdChmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdJZ25vcmluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlUGFyc2VyLnRlc3RGaWxlKGZpbGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgfHwgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzeCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhjbHVkaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgaW5jbHVkZSBwcm92aWRlZCBpbiB0c2NvbmZpZywgdXNlIG9ubHkgdGhpcyBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIG5vdCBmaWxlcyBmb3VuZCB3aXRoIGdsb2JhbCBmaW5kaXQgc2NhbiBpbiB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgfHwgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzeCcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQYXJzZXIudGVzdEZpbGUoZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgfHwgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzeCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhzY2FubmVkRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdCB8fCBwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3RQZXJGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1J1biBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHRlc3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci50ZXN0Q292ZXJhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnICYmIHByb2dyYW0uYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogdHNjb25maWcgZmlsZSBwcm92aWRlZCB3aXRoIHNvdXJjZSBmb2xkZXIgaW4gYXJnXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbGV0IHRlc3RUc0NvbmZpZ1BhdGggPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLmluZGV4T2YocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RUc0NvbmZpZ1BhdGggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VGb2xkZXIgPSBwcm9ncmFtLmFyZ3NbMF07XG4gICAgICAgICAgICAgICAgaWYgKCFGaWxlRW5naW5lLmV4aXN0c1N5bmMoc291cmNlRm9sZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgUHJvdmlkZWQgc291cmNlIGZvbGRlciAke3NvdXJjZUZvbGRlcn0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnVXNpbmcgcHJvdmlkZWQgc291cmNlIGZvbGRlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghRmlsZUVuZ2luZS5leGlzdHNTeW5jKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnfVwiIGZpbGUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBwYXRoLmRpcm5hbWUoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYmFzZW5hbWUoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9mIHRzY29uZmlnLmpzb24gYXMgYSB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgY3dkID0gX2ZpbGUuc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyB0c2NvbmZpZyBmaWxlICcsIF9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRzQ29uZmlnRmlsZSA9IHJlYWRDb25maWcoX2ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzQ29uZmlnRmlsZS5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IHRzQ29uZmlnRmlsZS5maWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgcGF0aCBvZiB0aGVzZSBmaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IHNjYW5uZWRGaWxlcy5tYXAoc2Nhbm5lZEZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3dkICsgcGF0aC5zZXAgKyBzY2FubmVkRmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBmaWxlcyBhcmUgc3VwcGxpZWQgd2l0aCBcImZpbGVzXCIgYXR0cmlidXRlcywgZW5oYW5jZSB0aGUgYXJyYXkgd2l0aCBpbmNsdWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZUZpbGVzID0gdHNDb25maWdGaWxlLmV4Y2x1ZGUgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuaW5jbHVkZSB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5uZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUZpbGVzID0gWy4uLmluY2x1ZGVGaWxlcywgLi4uc2Nhbm5lZEZpbGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV4Y2x1ZGVQYXJzZXIgPSBuZXcgUGFyc2VyVXRpbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQYXJzZXIgPSBuZXcgUGFyc2VyVXRpbCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlUGFyc2VyLmluaXQoZXhjbHVkZUZpbGVzLCBjd2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlci5pbml0KGluY2x1ZGVGaWxlcywgY3dkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0Q3dkID0gc291cmNlRm9sZGVyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhcnNlci50ZXN0RmlsZXNXaXRoQ3dkRGVwdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGV4Y2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGgubGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluY2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQYXJzZXIudGVzdEZpbGVzV2l0aEN3ZERlcHRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVQYXJzZXIudGVzdEZpbGVzV2l0aEN3ZERlcHRoKCkuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDd2QgPSBpbmNsdWRlUGFyc2VyLnVwZGF0ZUN3ZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUGFyc2VyVGVzdEZpbGVzV2l0aEN3ZERlcHRoLmxldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmRlciA9IHJlcXVpcmUoJ2ZpbmRpdDInKShwYXRoLnJlc29sdmUoc3RhcnRDd2QpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdkaXJlY3RvcnknLCBmdW5jdGlvbiAoZGlyLCBzdGF0LCBzdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZURpcmVjdG9yeShkaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdmaWxlJywgKGZpbGUsIHN0YXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyhzcGVjfFxcLmQpXFwudHMvLnRlc3QoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0lnbm9yaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleGNsdWRlUGFyc2VyLnRlc3RGaWxlKGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBpbmNsdWRlIHByb3ZpZGVkIGluIHRzY29uZmlnLCB1c2Ugb25seSB0aGlzIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIG5vdCBmaWxlcyBmb3VuZCB3aXRoIGdsb2JhbCBmaW5kaXQgc2NhbiBpbiB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgJiYgaW5jbHVkZVBhcnNlci50ZXN0RmlsZShmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhjbHVkaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0luY2x1ZGluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0RmlsZXMoc2Nhbm5lZEZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0IHx8IHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdFBlckZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1J1biBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHRlc3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCd0c2NvbmZpZy5qc29uIGZpbGUgd2FzIG5vdCBmb3VuZCwgcGxlYXNlIHVzZSAtcCBmbGFnJyk7XG4gICAgICAgICAgICAgICAgb3V0cHV0SGVscCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIl8iLCJTeW50YXhLaW5kIiwidHMiLCJfdHMuZ2V0SlNEb2NDb21tZW50UmFuZ2VzIiwibWFya2VkIiwiZnMiLCJwYXRoIiwidHJhdmVyc2UiLCJBbmd1bGFyQXBpVXRpbCIsIkNvbmZpZ3VyYXRpb24iLCJGaWxlRW5naW5lIiwiRGVwZW5kZW5jaWVzRW5naW5lIiwiaTE4bmV4dCIsImRlY2FjaGUiLCJJMThuRW5naW5lIiwiRXhwb3J0SnNvbkVuZ2luZSIsIkV4cG9ydFBkZkVuZ2luZSIsIkhhbmRsZWJhcnMiLCJzZW12ZXIiLCJBbmd1bGFyVmVyc2lvblV0aWwiLCJCYXNpY1R5cGVVdGlsIiwiZGVjb2RlIiwiYXN0IiwiUHJvamVjdCIsIlZhcmlhYmxlRGVjbGFyYXRpb24iLCJKU09ONSIsIkltcG9ydHNVdGlsIiwiTm9kZSIsImNyeXB0byIsImNsb25lRGVlcCIsImNvbmNhdCIsImZpbmQiLCJFeHRlbmRzTWVyZ2VyIiwiUm91dGVyUGFyc2VyVXRpbCIsIkNvbXBvbmVudHNUcmVlRW5naW5lIiwidXVpZHY0IiwiY3dkIiwiTWFya2Rvd25FbmdpbmUiLCJIdG1sRW5naW5lIiwiRXhwb3J0RW5naW5lIiwiU2VhcmNoRW5naW5lIiwiTmdkRW5naW5lIiwiTGl2ZVNlcnZlciIsImNvc21pY29uZmlnU3luYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3pDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRixRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMs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QUFDLFdBQVcsR0FBR0EsWUFBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBQSxDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsUUFBUSxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFBLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxVQUFVLEdBQUdBLFlBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUEsQ0FBQyxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLFdBQVcsR0FBR0EsWUFBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBQSxDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsWUFBWSxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFBLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUEsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFVBQVUsR0FBR0EsWUFBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBQSxDQUFDLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsS0FBSyxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFBLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUdBLFlBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUEsQ0FBQyxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNoRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0tBQy9CO0lBRU8saURBQW9CLEdBQTVCO1FBQ0ksSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsVUFBQSxNQUFNO1lBQzlELE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sTUFBTSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztLQUNOO0lBRU8sdURBQTBCLEdBQWxDLFVBQW1DLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSztRQUNoRCxJQUFJLE9BQU8sR0FBRztZQUNWLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLElBQUksRUFBRSxTQUFTO1NBQ2xCLENBQUM7UUFDRixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUU7b0JBQzdCLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFO3dCQUM3QixJQUNJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDdkQ7NEJBQ0UsZ0JBQWdCLElBQUksQ0FBQyxDQUFDOzRCQUN0QixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDMUI7cUJBQ0o7eUJBQU07d0JBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFDbkMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDOzRCQUN0QixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDMUI7cUJBQ0o7aUJBQ0o7YUFDSjs7WUFHRCxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDbEMsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUU7d0JBQzdCLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFOzRCQUM3QixJQUNJLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQ0FDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDdkQ7Z0NBQ0UsS0FBSyxHQUFHLElBQUksQ0FBQztnQ0FDYixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDMUI7eUJBQ0o7NkJBQU07NEJBQ0gsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQ0FDdkIsS0FBSyxHQUFHLElBQUksQ0FBQztnQ0FDYixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDMUI7eUJBQ0o7cUJBQ0o7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDUixPQUFPLEdBQUc7d0JBQ04sTUFBTSxFQUFFLFVBQVU7d0JBQ2xCLElBQUksRUFBRSxTQUFTO3FCQUNsQixDQUFDO2lCQUNMO2FBQ0o7U0FDSjtRQUNELE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0lBRU8saURBQW9CLEdBQTVCO1FBQ0ksSUFBSSxpQkFBaUIsR0FBRyxVQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSztZQUMxQyxJQUFJLG9CQUFvQixHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNuRSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O2dCQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNsRCxJQUFJLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxPQUFPLGFBQWEsQ0FBQyxXQUFXLEtBQUssV0FBVyxFQUFFO3dCQUNsRCxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDakMsYUFBYSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7d0JBQzlCLGFBQWEsQ0FBQyxhQUFhOzRCQUN2QixhQUFhLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDO3dCQUN6RCxhQUFhLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7cUJBQ3pFO2lCQUNKO2FBQ0o7WUFDRCxPQUFPLE9BQU8sQ0FBQztTQUNsQixDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUM1RDtJQUVNLGlDQUFJLEdBQVgsVUFBWSxJQUFZOztRQUF4QixpQkEyQkM7UUExQkcsSUFBTSxlQUFlLEdBQXVDO1lBQ3hELGNBQU0sT0FBQSxLQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxXQUFXLENBQUMsR0FBQTtZQUM3RCxjQUFNLE9BQUEsS0FBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLEdBQUE7WUFDOUQsY0FBTSxPQUFBLEtBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxHQUFBO1lBQ3hELGNBQU0sT0FBQSxLQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsR0FBQTtZQUM1RCxjQUFNLE9BQUEsS0FBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUE7WUFDekQsY0FBTSxPQUFBLEtBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxHQUFBO1lBQzVELGNBQU0sT0FBQSxLQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxXQUFXLENBQUMsR0FBQTtZQUM3RCxjQUFNLE9BQUEsS0FBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsUUFBUSxDQUFDLEdBQUE7WUFDMUQsY0FBTSxPQUFBLEtBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxHQUFBO1lBQzVELGNBQU0sT0FBQSxLQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUE7WUFDekUsY0FBTSxPQUFBLEtBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBQTtZQUN6RSxjQUFNLE9BQUEsS0FBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFBO1lBQzNFLGNBQU0sT0FBQSxLQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUE7WUFDNUUsY0FBTSxPQUFBUSxnQkFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBQTtTQUNyQyxDQUFDOztZQUVGLEtBQTJCLElBQUEsb0JBQUEsU0FBQSxlQUFlLENBQUEsZ0RBQUEsNkVBQUU7Z0JBQXZDLElBQUksY0FBYyw0QkFBQTtnQkFDbkIsSUFBSSxNQUFNLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBRTlCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtvQkFDYixPQUFPLE1BQU0sQ0FBQztpQkFDakI7YUFDSjs7Ozs7Ozs7O1FBRUQsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFFTSxtQ0FBTSxHQUFiLFVBQWMsV0FBVztRQUF6QixpQkEyR0M7UUExR0csSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaENSLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFDLE1BQWtCO2dCQUM5QyxJQUFNLE1BQU0sR0FBR0EsWUFBQyxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxLQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQzthQUNqQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DQSxZQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBQyxTQUF3QjtnQkFDdkQsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7YUFDdkMsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQ0EsWUFBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFVBQUMsVUFBMEI7Z0JBQzFELElBQU0sTUFBTSxHQUFHQSxZQUFDLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLEtBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDO2FBQ3pDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakNBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFDLE1BQXNCO2dCQUNuRCxJQUFNLE1BQU0sR0FBR0EsWUFBQyxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxLQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQzthQUNsQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DQSxZQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBQyxTQUF3QjtnQkFDdkQsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7YUFDdkMsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwQ0EsWUFBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFVBQUMsVUFBMEI7Z0JBQzFELElBQU0sTUFBTSxHQUFHQSxZQUFDLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLEtBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDO2FBQ3pDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckNBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxVQUFDLFdBQTRCO2dCQUM3RCxJQUFNLE1BQU0sR0FBR0EsWUFBQyxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRSxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUMzQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CQSxZQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBQyxLQUFnQjtnQkFDM0MsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDOUQsS0FBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDL0IsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQ0EsWUFBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFVBQUMsR0FBa0I7Z0JBQ2pELElBQU0sTUFBTSxHQUFHQSxZQUFDLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLEtBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQ2pDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUJBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFDLElBQWM7Z0JBQ3hDLElBQU0sTUFBTSxHQUFHQSxZQUFDLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVELEtBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzdCLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaENBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFDLE1BQVc7Z0JBQ3ZDLElBQU0sTUFBTSxHQUFHQSxZQUFDLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLEtBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQ2pDLENBQUMsQ0FBQztTQUNOOzs7O1FBSUQsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hEQSxZQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFVBQUMsUUFBYTtnQkFDekQsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUU7b0JBQ3JELElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2lCQUN0QixDQUFDLENBQUM7Z0JBQ0gsS0FBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQ25ELENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hEQSxZQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFVBQUMsSUFBcUI7Z0JBQ2pFLElBQU0sTUFBTSxHQUFHQSxZQUFDLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFO29CQUNyRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2lCQUNsQixDQUFDLENBQUM7Z0JBQ0gsS0FBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQy9DLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2xEQSxZQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFVBQUMsU0FBMkI7Z0JBQ3pFLElBQU0sTUFBTSxHQUFHQSxZQUFDLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFO29CQUN2RCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7b0JBQ3BCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtpQkFDdkIsQ0FBQyxDQUFDO2dCQUNILEtBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQzthQUN0RCxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuREEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxVQUFDLFdBQXdCO2dCQUN2RSxJQUFNLE1BQU0sR0FBR0EsWUFBQyxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRTtvQkFDeEQsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO29CQUN0QixJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUk7aUJBQ3pCLENBQUMsQ0FBQztnQkFDSCxLQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUM7YUFDekQsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztLQUMvQjtJQUVNLDJDQUFjLEdBQXJCLFVBQXNCLElBQVk7UUFDOUIsSUFBSSxVQUFVLEdBQUdBLFlBQUMsQ0FBQyxNQUFNLENBQ3JCLEVBQUUsRUFDRixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQy9CLENBQUM7UUFDRixJQUFJLE1BQU0sR0FBR0EsWUFBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFTLENBQUMsQ0FBQztRQUN2RCxPQUFPLE1BQU0sSUFBSSxLQUFLLENBQUM7S0FDMUI7SUFFTyxpREFBb0IsR0FBNUI7UUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDOztRQUV6RCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHQSxZQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEdBQUdBLFlBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsR0FBR0EsWUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixHQUFHQSxZQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzdGO0lBRU0sc0NBQVMsR0FBaEIsVUFBaUIsSUFBWTtRQUN6QixPQUFPQSxZQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUMvQztJQUVNLHlDQUFZLEdBQW5CLFVBQW9CLElBQVk7UUFDNUIsT0FBT0EsWUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDbEQ7SUFFTSx1Q0FBVSxHQUFqQjtRQUNJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUN2QjtJQUVNLDBDQUFhLEdBQXBCO1FBQ0ksT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0tBQzFCO0lBRU0sMkNBQWMsR0FBckI7UUFDSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7S0FDM0I7SUFFTSx3Q0FBVyxHQUFsQjtRQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUN4QjtJQUVNLDBDQUFhLEdBQXBCO1FBQ0ksT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0tBQzFCO0lBRU0sMkNBQWMsR0FBckI7UUFDSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7S0FDM0I7SUFFTSw0Q0FBZSxHQUF0QjtRQUNJLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztLQUM1QjtJQUVNLHNDQUFTLEdBQWhCO1FBQ0ksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQ3RCO0lBRU0sMENBQWEsR0FBcEI7UUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7S0FDMUI7SUFFTSxzQ0FBUyxHQUFoQjtRQUNJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUN0QjtJQUVNLHFDQUFRLEdBQWY7UUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDckI7SUFFTSx1Q0FBVSxHQUFqQjtRQUNJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUN2QjtJQUVNLDZDQUFnQixHQUF2QjtRQUNJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUM3QjtJQUNMLHlCQUFDO0FBQUQsQ0FBQyxJQUFBO0FBRUQsMkJBQWUsa0JBQWtCLENBQUMsV0FBVyxFQUFFOztBQ2xkL0M7SUFFSTtLQUF3QjtJQUNWLHNCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDdEIsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDO0tBQzlCO0lBRU0sd0JBQUcsR0FBVixVQUFXLFFBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQkssYUFBRSxDQUFDLFFBQVEsQ0FBQ0MsZUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBQyxHQUFHLEVBQUUsSUFBSTtnQkFDbEQsSUFBSSxHQUFHLEVBQUU7b0JBQ0wsTUFBTSxDQUFDLGVBQWUsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7aUJBQ2hEO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDakI7YUFDSixDQUFDLENBQUM7U0FDTixDQUFDLENBQUM7S0FDTjtJQUVNLDBCQUFLLEdBQVosVUFBYSxRQUFnQixFQUFFLFFBQWdCO1FBQzNDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQkQsYUFBRSxDQUFDLFVBQVUsQ0FBQ0MsZUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBQSxHQUFHO2dCQUMvQyxJQUFJLEdBQUcsRUFBRTtvQkFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2Y7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLENBQUM7aUJBQ2I7YUFDSixDQUFDLENBQUM7U0FDTixDQUFDLENBQUM7S0FDTjtJQUVNLDhCQUFTLEdBQWhCLFVBQWlCLFFBQWdCLEVBQUUsUUFBZ0I7UUFDL0NELGFBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ3pDO0lBRU0sNEJBQU8sR0FBZCxVQUFlLFFBQWdCO1FBQzNCLE9BQU9BLGFBQUUsQ0FBQyxZQUFZLENBQUNDLGVBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDMUQ7Ozs7SUFLTSwrQkFBVSxHQUFqQixVQUFrQixJQUFZO1FBQzFCLE9BQU9ELGFBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDOUI7SUFDTCxpQkFBQztBQUFELENBQUMsSUFBQTtBQUVELG1CQUFlLFVBQVUsQ0FBQyxXQUFXLEVBQUU7O0FDekN2QyxJQUFNRSxVQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRXJDO0lBRUk7S0FBd0I7SUFDViw0QkFBVyxHQUF6QjtRQUNJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7WUFDNUIsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztTQUN0RDtRQUNELE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0tBQ3BDO0lBRU0sMkJBQUEsUUFBTSxDQUFBLEdBQWIsVUFBYyxZQUFZLEVBQUUsSUFBSTtRQUM1QixJQUFJLFVBQVUsR0FBZSxFQUFFLENBQUM7UUFFaENBLFVBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBUyxJQUFJO1lBQ2hDLElBQUksSUFBSSxFQUFFO2dCQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQ3RCO2dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO2lCQUMzQjtnQkFDRCxJQUFJRSxlQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO29CQUMxQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQzFCO2FBQ0o7U0FDSixDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUIsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDaEMsVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzVDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxVQUFVLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDeEMsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLENBQUNBLGVBQWEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUU7WUFDNUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRTtZQUN6QyxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDM0M7UUFFRCxPQUFPQyxZQUFVLENBQUMsS0FBSyxDQUNuQixZQUFZLEdBQUdKLGVBQUksQ0FBQyxHQUFHLEdBQUcscUJBQXFCLEVBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FDM0MsQ0FBQyxPQUFLLENBQUEsQ0FBQyxVQUFBLEdBQUc7WUFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7S0FDTjtJQUVNLHlDQUFjLEdBQXJCO1FBQ0ksSUFBTSxPQUFPLEdBQTBCSyxvQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2RSxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUxQixLQUFLLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMxRCxJQUFNLFFBQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsSUFBTSxhQUFhLEdBQUc7Z0JBQ2xCLElBQUksRUFBRSxRQUFNLENBQUMsSUFBSTtnQkFDakIsRUFBRSxFQUFFLFFBQU0sQ0FBQyxFQUFFO2dCQUNiLFdBQVcsRUFBRSxRQUFNLENBQUMsV0FBVztnQkFDL0IsY0FBYyxFQUFFLFFBQU0sQ0FBQyxjQUFjO2dCQUNyQyxrQkFBa0IsRUFBRSxRQUFNLENBQUMsa0JBQWtCO2dCQUM3QyxVQUFVLEVBQUUsUUFBTSxDQUFDLFVBQVU7Z0JBQzdCLElBQUksRUFBRSxRQUFNLENBQUMsSUFBSTtnQkFDakIsT0FBTyxFQUFFLFFBQU0sQ0FBQyxPQUFPO2dCQUN2QixVQUFVLEVBQUUsUUFBTSxDQUFDLFVBQVU7Z0JBQzdCLFFBQVEsRUFBRTtvQkFDTjt3QkFDSSxJQUFJLEVBQUUsV0FBVzt3QkFDakIsUUFBUSxFQUFFLEVBQUU7cUJBQ2Y7b0JBQ0Q7d0JBQ0ksSUFBSSxFQUFFLGNBQWM7d0JBQ3BCLFFBQVEsRUFBRSxFQUFFO3FCQUNmO29CQUNEO3dCQUNJLElBQUksRUFBRSxTQUFTO3dCQUNmLFFBQVEsRUFBRSxFQUFFO3FCQUNmO29CQUNEO3dCQUNJLElBQUksRUFBRSxTQUFTO3dCQUNmLFFBQVEsRUFBRSxFQUFFO3FCQUNmO29CQUNEO3dCQUNJLElBQUksRUFBRSxXQUFXO3dCQUNqQixRQUFRLEVBQUUsRUFBRTtxQkFDZjtvQkFDRDt3QkFDSSxJQUFJLEVBQUUsU0FBUzt3QkFDZixRQUFRLEVBQUUsRUFBRTtxQkFDZjtpQkFDSjthQUNKLENBQUM7WUFFRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLElBQU0sZUFBZSxHQUFHO29CQUNwQixJQUFJLEVBQUUsUUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2lCQUNqQyxDQUFDO2dCQUNGLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUM1RDtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsSUFBTSxrQkFBa0IsR0FBRztvQkFDdkIsSUFBSSxFQUFFLFFBQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDcEMsQ0FBQztnQkFDRixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMvRDtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUMsSUFBTSxhQUFhLEdBQUc7b0JBQ2xCLElBQUksRUFBRSxRQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7aUJBQy9CLENBQUM7Z0JBQ0YsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1QyxJQUFNLGFBQWEsR0FBRztvQkFDbEIsSUFBSSxFQUFFLFFBQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDL0IsQ0FBQztnQkFDRixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDMUQ7WUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLElBQU0sZ0JBQWdCLEdBQUc7b0JBQ3JCLElBQUksRUFBRSxRQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7aUJBQ2pDLENBQUM7Z0JBQ0YsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDN0Q7WUFFRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDeEM7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0tBQzNCO0lBQ0wsdUJBQUM7QUFBRCxDQUFDLElBQUE7QUFFRCx5QkFBZSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7O0FDdEp0QyxJQUFNLGlCQUFpQixHQUFHO0lBQzdCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLHFCQUFxQixFQUFFLHlCQUF5QjtJQUNoRCxZQUFZLEVBQUUsY0FBYztJQUM1QixVQUFVLEVBQUUsWUFBWTtJQUN4QixlQUFlLEVBQUUsY0FBYztJQUMvQixZQUFZLEVBQUUsY0FBYztJQUM1QixZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxjQUFjO0lBQzNCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsS0FBSyxFQUFFLE9BQU87SUFDZCxPQUFPLEVBQUUsVUFBVTtJQUNuQixRQUFRLEVBQUUsV0FBVztJQUNyQixPQUFPLEVBQUUsWUFBWTtJQUNyQixTQUFPLEVBQUUsV0FBVztJQUNwQixJQUFJLEVBQUUsT0FBTztJQUNiLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLGlCQUFpQixFQUFFLDZCQUE2QjtJQUNoRCxpQkFBaUIsRUFBRSxZQUFZO0lBQy9CLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsY0FBYyxFQUFFLGNBQWM7SUFDOUIsNkJBQTZCLEVBQUUsNEJBQTRCO0lBQzNELFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFVBQVUsRUFBRSxlQUFlO0lBQzNCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLEtBQUssRUFBRSxPQUFPO0lBQ2QsU0FBUyxFQUFFLGFBQWE7SUFDeEIsSUFBSSxFQUFFLGFBQWE7SUFDbkIsZ0JBQWdCLEVBQUUsWUFBWTtJQUM5QixVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztJQUM1QixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixNQUFNLEVBQUUsU0FBUztJQUNqQixPQUFPLEVBQUUsUUFBUTtJQUNqQixLQUFLLEVBQUUsUUFBUTtJQUNmLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLGFBQWEsRUFBRSxlQUFlO0lBQzlCLE1BQU0sRUFBRSxPQUFPO0lBQ2YsT0FBTyxFQUFFLFFBQVE7SUFDakIsSUFBSSxFQUFFLE1BQU07SUFDWixFQUFFLEVBQUUsTUFBTTtJQUNWLFVBQVUsRUFBRSx1QkFBdUI7SUFDbkMsV0FBVyxFQUFFLHlDQUF5QztJQUN0RCxvQkFBb0IsRUFBRSx5QkFBeUI7SUFDL0MsUUFBUSxFQUFFLG1DQUFtQztJQUM3QyxRQUFRLEVBQUUsVUFBVTtJQUNwQixPQUFPLEVBQUUsVUFBVTtJQUNuQixRQUFRLEVBQUUsV0FBVztJQUNyQixVQUFVLEVBQUUsV0FBVztJQUN2QixtQkFBbUIsRUFBRSxxQkFBcUI7SUFDMUMsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFVBQVUsRUFBRSxlQUFlO0lBQzNCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLGNBQWM7SUFDckIsa0JBQWtCLEVBQUUsNkJBQTZCO0lBQ2pELE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsb0JBQW9CLEVBQUUsb0JBQW9CO0lBQzFDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFNBQVMsRUFBRSxjQUFjO0lBQ3pCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxPQUFPO0lBQ2YsUUFBUSxFQUFFLFNBQVM7SUFDbkIsSUFBSSxFQUFFLEtBQUs7SUFDWCxjQUFjLEVBQUUsWUFBWTtJQUM1QixpQkFBaUIsRUFBRSxlQUFlO0lBQ2xDLEtBQUssRUFBRSxPQUFPO0lBQ2QsaUJBQWlCLEVBQUUsd0JBQXdCO0lBQzNDLG9CQUFvQixFQUFFLHFCQUFxQjtJQUMzQyxLQUFLLEVBQUUsTUFBTTtJQUNiLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLGFBQWE7Q0FDekI7O0FDMUdNLElBQU0saUJBQWlCLEdBQUc7SUFDN0IsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsTUFBTSxFQUFFLE9BQU87SUFDZixPQUFPLEVBQUUsU0FBUztJQUNsQixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUMxQixVQUFVLEVBQUUsWUFBWTtJQUN4QixxQkFBcUIsRUFBRSx3QkFBd0I7SUFDL0MsWUFBWSxFQUFFLGNBQWM7SUFDNUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsZUFBZSxFQUFFLGVBQWU7SUFDaEMsWUFBWSxFQUFFLFlBQVk7SUFDMUIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsVUFBVSxFQUFFLFVBQVU7SUFDdEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxZQUFZLEVBQUUsY0FBYztJQUM1QixLQUFLLEVBQUUsT0FBTztJQUNkLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFNBQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxNQUFNO0lBQ1osU0FBUyxFQUFFLFdBQVc7SUFDdEIsaUJBQWlCLEVBQUUsK0JBQStCO0lBQ2xELGlCQUFpQixFQUFFLGlCQUFpQjtJQUNwQyxLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFlBQVksRUFBRSxjQUFjO0lBQzVCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGNBQWMsRUFBRSxjQUFjO0lBQzlCLDZCQUE2QixFQUFFLDZCQUE2QjtJQUM1RCxVQUFVLEVBQUUsWUFBWTtJQUN4QixVQUFVLEVBQUUsWUFBWTtJQUN4QixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztJQUNkLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUksRUFBRSxhQUFhO0lBQ25CLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNsQyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztJQUM1QixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztJQUNkLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxNQUFNO0lBQ1osRUFBRSxFQUFFLElBQUk7SUFDUixVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFdBQVcsRUFBRSx3Q0FBd0M7SUFDckQsb0JBQW9CLEVBQUUscUJBQXFCO0lBQzNDLFFBQVEsRUFBRSxtQ0FBbUM7SUFDN0MsUUFBUSxFQUFFLFVBQVU7SUFDcEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsUUFBUTtJQUNoQixVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztJQUN0QixJQUFJLEVBQUUsTUFBTTtJQUNaLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxPQUFPO0lBQ2Qsa0JBQWtCLEVBQUUsa0JBQWtCO0lBQ3RDLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsb0JBQW9CLEVBQUUsZ0JBQWdCO0lBQ3RDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLElBQUksRUFBRSxNQUFNO0lBQ1osY0FBYyxFQUFFLGNBQWM7SUFDOUIsaUJBQWlCLEVBQUUsaUJBQWlCO0lBQ3BDLEtBQUssRUFBRSxPQUFPO0lBQ2QsaUJBQWlCLEVBQUUsaUJBQWlCO0lBQ3BDLG9CQUFvQixFQUFFLG9CQUFvQjtJQUMxQyxLQUFLLEVBQUUsT0FBTztJQUNkLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFNBQVM7SUFDakIsT0FBTyxFQUFFLFVBQVU7Q0FDdEI7O0FDMUdNLElBQU0saUJBQWlCLEdBQUc7SUFDN0IsU0FBUyxFQUFFLFlBQVk7SUFDdkIsU0FBUyxFQUFFLFlBQVk7SUFDdkIsU0FBUyxFQUFFLFVBQVU7SUFDckIsUUFBUSxFQUFFLE9BQU87SUFDakIsTUFBTSxFQUFFLFNBQVM7SUFDakIsTUFBTSxFQUFFLE9BQU87SUFDZixPQUFPLEVBQUUsUUFBUTtJQUNqQixTQUFTLEVBQUUsWUFBWTtJQUN2QixVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsYUFBYTtJQUMxQixXQUFXLEVBQUUsZUFBZTtJQUM1QixVQUFVLEVBQUUsYUFBYTtJQUN6QixxQkFBcUIsRUFBRSwrQkFBK0I7SUFDdEQsWUFBWSxFQUFFLGVBQWU7SUFDN0IsVUFBVSxFQUFFLGFBQWE7SUFDekIsZUFBZSxFQUFFLG1CQUFtQjtJQUNwQyxZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFZLEVBQUUsY0FBYztJQUM1QixVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsYUFBYTtJQUMxQixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixVQUFVLEVBQUUsV0FBVztJQUN2QixRQUFRLEVBQUUsV0FBVztJQUNyQixNQUFNLEVBQUUsU0FBUztJQUNqQixlQUFlLEVBQUUsd0JBQXdCO0lBQ3pDLFlBQVksRUFBRSxlQUFlO0lBQzdCLEtBQUssRUFBRSxPQUFPO0lBQ2QsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsU0FBTyxFQUFFLFVBQVU7SUFDbkIsSUFBSSxFQUFFLFNBQVM7SUFDZixTQUFTLEVBQUUsV0FBVztJQUN0QixpQkFBaUIsRUFBRSxtQ0FBbUM7SUFDdEQsaUJBQWlCLEVBQUUsWUFBWTtJQUMvQixLQUFLLEVBQUUsU0FBUztJQUNoQixNQUFNLEVBQUUsVUFBVTtJQUNsQixZQUFZLEVBQUUsb0JBQW9CO0lBQ2xDLGFBQWEsRUFBRSxzQkFBc0I7SUFDckMsY0FBYyxFQUFFLGVBQWU7SUFDL0IsNkJBQTZCLEVBQUUsNkJBQTZCO0lBQzVELFVBQVUsRUFBRSxlQUFlO0lBQzNCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxRQUFRO0lBQ2YsU0FBUyxFQUFFLFdBQVc7SUFDdEIsSUFBSSxFQUFFLGFBQWE7SUFDbkIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFlBQVksRUFBRSxlQUFlO0lBQzdCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLEtBQUssRUFBRSxRQUFRO0lBQ2YsUUFBUSxFQUFFLFlBQVk7SUFDdEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsYUFBYSxFQUFFLFlBQVk7SUFDM0IsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLFFBQVE7SUFDZCxFQUFFLEVBQUUsSUFBSTtJQUNSLFVBQVUsRUFBRSw0QkFBNEI7SUFDeEMsV0FBVyxFQUFFLGtDQUFrQztJQUMvQyxvQkFBb0IsRUFBRSxpQ0FBaUM7SUFDdkQsUUFBUSxFQUFFLDZCQUE2QjtJQUN2QyxRQUFRLEVBQUUsVUFBVTtJQUNwQixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUscUJBQXFCO0lBQy9CLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLG1CQUFtQixFQUFFLDBCQUEwQjtJQUMvQyxJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFNBQVMsRUFBRSxhQUFhO0lBQ3hCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLE9BQU87SUFDZixLQUFLLEVBQUUsYUFBYTtJQUNwQixrQkFBa0IsRUFBRSwyQkFBMkI7SUFDL0MsT0FBTyxFQUFFLFVBQVU7SUFDbkIsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsT0FBTztJQUNmLE9BQU8sRUFBRSxVQUFVO0lBQ25CLG9CQUFvQixFQUFFLHFCQUFxQjtJQUMzQyxRQUFRLEVBQUUsVUFBVTtJQUNwQixTQUFTLEVBQUUsT0FBTztJQUNsQixNQUFNLEVBQUUsUUFBUTtJQUNoQixVQUFVLEVBQUUsZUFBZTtJQUMzQixNQUFNLEVBQUUsU0FBUztJQUNqQixRQUFRLEVBQUUsV0FBVztJQUNyQixJQUFJLEVBQUUsTUFBTTtJQUNaLGNBQWMsRUFBRSxlQUFlO0lBQy9CLGlCQUFpQixFQUFFLG9CQUFvQjtJQUN2QyxLQUFLLEVBQUUsT0FBTztJQUNkLGlCQUFpQixFQUFFLHNCQUFzQjtJQUN6QyxvQkFBb0IsRUFBRSxvQ0FBb0M7SUFDMUQsS0FBSyxFQUFFLE9BQU87SUFDZCxTQUFTLEVBQUUsV0FBVztJQUN0QixHQUFHLEVBQUUsSUFBSTtJQUNULE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE9BQU8sRUFBRSxRQUFRO0NBQ3BCOztBQzFHTSxJQUFNLGlCQUFpQixHQUFHO0lBQzdCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxPQUFPO0lBQ2YsT0FBTyxFQUFFLFNBQVM7SUFDbEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLGNBQWM7SUFDM0IsV0FBVyxFQUFFLGFBQWE7SUFDMUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIscUJBQXFCLEVBQUUsNkJBQTZCO0lBQ3BELFlBQVksRUFBRSxjQUFjO0lBQzVCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLGVBQWUsRUFBRSxtQkFBbUI7SUFDcEMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBWSxFQUFFLGFBQWE7SUFDM0IsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsUUFBUSxFQUFFLFNBQVM7SUFDbkIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsZUFBZSxFQUFFLHFCQUFxQjtJQUN0QyxZQUFZLEVBQUUsY0FBYztJQUM1QixLQUFLLEVBQUUsY0FBYztJQUNyQixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtJQUNwQixPQUFPLEVBQUUsU0FBUztJQUNsQixTQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUUsU0FBUztJQUNmLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLGlCQUFpQixFQUFFLDRCQUE0QjtJQUMvQyxpQkFBaUIsRUFBRSxXQUFXO0lBQzlCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsY0FBYyxFQUFFLGNBQWM7SUFDOUIsNkJBQTZCLEVBQUUsaUNBQWlDO0lBQ2hFLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsU0FBUyxFQUFFLFdBQVc7SUFDdEIsSUFBSSxFQUFFLGFBQWE7SUFDbkIsZ0JBQWdCLEVBQUUsV0FBVztJQUM3QixVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixNQUFNLEVBQUUsU0FBUztJQUNqQixZQUFZLEVBQUUsZUFBZTtJQUM3QixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixNQUFNLEVBQUUsU0FBUztJQUNqQixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsUUFBUTtJQUNmLFFBQVEsRUFBRSxhQUFhO0lBQ3ZCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxLQUFLO0lBQ1gsRUFBRSxFQUFFLEtBQUs7SUFDVCxVQUFVLEVBQUUsNkJBQTZCO0lBQ3pDLFdBQVcsRUFBRSwrQ0FBK0M7SUFDNUQsb0JBQW9CLEVBQUUseUJBQXlCO0lBQy9DLFFBQVEsRUFBRSx5Q0FBeUM7SUFDbkQsUUFBUSxFQUFFLFdBQVc7SUFDckIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixVQUFVLEVBQUUsWUFBWTtJQUN4QixtQkFBbUIsRUFBRSxxQkFBcUI7SUFDMUMsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLGVBQWU7SUFDdEIsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsb0JBQW9CLEVBQUUsb0JBQW9CO0lBQzFDLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFVBQVUsRUFBRSxjQUFjO0lBQzFCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLG1CQUFtQixFQUFFLG9CQUFvQjtJQUN6QyxJQUFJLEVBQUUsTUFBTTtJQUNaLGNBQWMsRUFBRSxlQUFlO0lBQy9CLGlCQUFpQixFQUFFLG9CQUFvQjtJQUN2QyxLQUFLLEVBQUUsT0FBTztJQUNkLGlCQUFpQixFQUFFLHNCQUFzQjtJQUN6QyxvQkFBb0IsRUFBRSw2QkFBNkI7SUFDbkQsS0FBSyxFQUFFLFFBQVE7SUFDZixTQUFTLEVBQUUsV0FBVztJQUN0QixHQUFHLEVBQUUsS0FBSztJQUNWLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxjQUFjO0NBQzFCOztBQzNHTSxJQUFNLGlCQUFpQixHQUFHO0lBQzdCLFNBQVMsRUFBRSx5QkFBeUI7SUFDcEMsU0FBUyxFQUFFLGNBQWM7SUFDekIsU0FBUyxFQUFFLFVBQVU7SUFDckIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLFNBQVM7SUFDakIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsV0FBVyxFQUFFLGNBQWM7SUFDM0IsVUFBVSxFQUFFLFlBQVk7SUFDeEIscUJBQXFCLEVBQUUsMEJBQTBCO0lBQ2pELFlBQVksRUFBRSxhQUFhO0lBQzNCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLGVBQWUsRUFBRSx1QkFBdUI7SUFDeEMsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxZQUFZLEVBQUUsWUFBWTtJQUMxQixVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsUUFBUTtJQUNyQixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixVQUFVLEVBQUUsUUFBUTtJQUNwQixRQUFRLEVBQUUsV0FBVztJQUNyQixNQUFNLEVBQUUsU0FBUztJQUNqQixlQUFlLEVBQUUsbUJBQW1CO0lBQ3BDLFlBQVksRUFBRSxhQUFhO0lBQzNCLEtBQUssRUFBRSxRQUFRO0lBQ2YsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsU0FBTyxFQUFFLFdBQVc7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixTQUFTLEVBQUUsWUFBWTtJQUN2QixpQkFBaUIsRUFBRSw0QkFBNEI7SUFDL0MsaUJBQWlCLEVBQUUsVUFBVTtJQUM3QixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFlBQVksRUFBRSxlQUFlO0lBQzdCLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsY0FBYyxFQUFFLFdBQVc7SUFDM0IsNkJBQTZCLEVBQUUsd0JBQXdCO0lBQ3ZELFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFVBQVUsRUFBRSwwQkFBMEI7SUFDdEMsT0FBTyxFQUFFLFVBQVU7SUFDbkIsS0FBSyxFQUFFLGlCQUFpQjtJQUN4QixTQUFTLEVBQUUsYUFBYTtJQUN4QixJQUFJLEVBQUUsWUFBWTtJQUNsQixnQkFBZ0IsRUFBRSxpQkFBaUI7SUFDbkMsVUFBVSxFQUFFLGNBQWM7SUFDMUIsV0FBVyxFQUFFLGVBQWU7SUFDNUIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsWUFBWSxFQUFFLGVBQWU7SUFDN0IsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLGFBQWE7SUFDekIsTUFBTSxFQUFFLGVBQWU7SUFDdkIsT0FBTyxFQUFFLFFBQVE7SUFDakIsS0FBSyxFQUFFLE9BQU87SUFDZCxRQUFRLEVBQUUsWUFBWTtJQUN0QixPQUFPLEVBQUUsV0FBVztJQUNwQixhQUFhLEVBQUUsT0FBTztJQUN0QixNQUFNLEVBQUUsT0FBTztJQUNmLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxLQUFLO0lBQ1gsRUFBRSxFQUFFLEtBQUs7SUFDVCxVQUFVLEVBQUUsd0JBQXdCO0lBQ3BDLFdBQVcsRUFBRSw0Q0FBNEM7SUFDekQsb0JBQW9CLEVBQUUsZUFBZTtJQUNyQyxRQUFRLEVBQUUsK0NBQStDO0lBQ3pELFFBQVEsRUFBRSxZQUFZO0lBQ3RCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLG1CQUFtQixFQUFFLGlCQUFpQjtJQUN0QyxJQUFJLEVBQUUsTUFBTTtJQUNaLEtBQUssRUFBRSxTQUFTO0lBQ2hCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLGFBQWE7SUFDcEIsa0JBQWtCLEVBQUUsU0FBUztJQUM3QixPQUFPLEVBQUUsb0JBQW9CO0lBQzdCLEtBQUssRUFBRSxTQUFTO0lBQ2hCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLG9CQUFvQixFQUFFLHFCQUFxQjtJQUMzQyxRQUFRLEVBQUUsV0FBVztJQUNyQixTQUFTLEVBQUUsU0FBUztJQUNwQixNQUFNLEVBQUUsUUFBUTtJQUNoQixVQUFVLEVBQUUsWUFBWTtJQUN4QixNQUFNLEVBQUUsVUFBVTtJQUNsQixRQUFRLEVBQUUsUUFBUTtJQUNsQixJQUFJLEVBQUUsT0FBTztJQUNiLGNBQWMsRUFBRSxhQUFhO0lBQzdCLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxLQUFLLEVBQUUsU0FBUztJQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsb0JBQW9CLEVBQUUsd0JBQXdCO0lBQzlDLEtBQUssRUFBRSxPQUFPO0lBQ2QsU0FBUyxFQUFFLFVBQVU7SUFDckIsR0FBRyxFQUFFLE1BQU07SUFDWCxNQUFNLEVBQUUsVUFBVTtJQUNsQixPQUFPLEVBQUUsYUFBYTtDQUN6Qjs7QUMxR00sSUFBTSxpQkFBaUIsR0FBRztJQUM3QixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixRQUFRLEVBQUUsTUFBTTtJQUNoQixNQUFNLEVBQUUsT0FBTztJQUNmLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLHFCQUFxQixFQUFFLGtCQUFrQjtJQUN6QyxZQUFZLEVBQUUsZUFBZTtJQUM3QixVQUFVLEVBQUUsWUFBWTtJQUN4QixlQUFlLEVBQUUsb0JBQW9CO0lBQ3JDLFlBQVksRUFBRSxhQUFhO0lBQzNCLFlBQVksRUFBRSxjQUFjO0lBQzVCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsS0FBSyxFQUFFLE9BQU87SUFDZCxPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsUUFBUTtJQUNsQixPQUFPLEVBQUUsU0FBUztJQUNsQixTQUFPLEVBQUUsU0FBUztJQUNsQixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLGlCQUFpQixFQUFFLGdDQUFnQztJQUNuRCxpQkFBaUIsRUFBRSxVQUFVO0lBQzdCLEtBQUssRUFBRSxTQUFTO0lBQ2hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFlBQVksRUFBRSxjQUFjO0lBQzVCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGNBQWMsRUFBRSxlQUFlO0lBQy9CLDZCQUE2QixFQUFFLDZCQUE2QjtJQUM1RCxVQUFVLEVBQUUsZ0JBQWdCO0lBQzVCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxRQUFRO0lBQ2YsU0FBUyxFQUFFLGVBQWU7SUFDMUIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsZ0JBQWdCLEVBQUUsY0FBYztJQUNoQyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixNQUFNLEVBQUUsT0FBTztJQUNmLFlBQVksRUFBRSxjQUFjO0lBQzVCLFNBQVMsRUFBRSxhQUFhO0lBQ3hCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsUUFBUSxFQUFFLFVBQVU7SUFDcEIsT0FBTyxFQUFFLFFBQVE7SUFDakIsYUFBYSxFQUFFLE9BQU87SUFDdEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFFBQVE7SUFDakIsSUFBSSxFQUFFLE1BQU07SUFDWixFQUFFLEVBQUUsSUFBSTtJQUNSLFVBQVUsRUFBRSwwQkFBMEI7SUFDdEMsV0FBVyxFQUFFLHFDQUFxQztJQUNsRCxvQkFBb0IsRUFBRSxpQ0FBaUM7SUFDdkQsUUFBUSxFQUFFLGlDQUFpQztJQUMzQyxRQUFRLEVBQUUsV0FBVztJQUNyQixPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsVUFBVTtJQUNwQixVQUFVLEVBQUUsV0FBVztJQUN2QixtQkFBbUIsRUFBRSxtQkFBbUI7SUFDeEMsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLE9BQU87SUFDZCxrQkFBa0IsRUFBRSxnQkFBZ0I7SUFDcEMsT0FBTyxFQUFFLFNBQVM7SUFDbEIsS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztJQUNsQixvQkFBb0IsRUFBRSwrQkFBK0I7SUFDckQsUUFBUSxFQUFFLFVBQVU7SUFDcEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsTUFBTSxFQUFFLE9BQU87SUFDZixVQUFVLEVBQUUsWUFBWTtJQUN4QixNQUFNLEVBQUUsT0FBTztJQUNmLFFBQVEsRUFBRSxTQUFTO0lBQ25CLElBQUksRUFBRSxNQUFNO0lBQ1osY0FBYyxFQUFFLGNBQWM7SUFDOUIsaUJBQWlCLEVBQUUsaUJBQWlCO0lBQ3BDLEtBQUssRUFBRSxNQUFNO0lBQ2IsaUJBQWlCLEVBQUUsc0JBQXNCO0lBQ3pDLG9CQUFvQixFQUFFLHFCQUFxQjtJQUMzQyxLQUFLLEVBQUUsUUFBUTtJQUNmLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLGFBQWE7SUFDckIsT0FBTyxFQUFFLGdCQUFnQjtDQUM1Qjs7QUMxR00sSUFBTSxpQkFBaUIsR0FBRztJQUM3QixTQUFTLEVBQUUsTUFBTTtJQUNqQixTQUFTLEVBQUUsSUFBSTtJQUNmLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsTUFBTSxFQUFFLEtBQUs7SUFDYixPQUFPLEVBQUUsS0FBSztJQUNkLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxTQUFTO0lBQ3RCLFdBQVcsRUFBRSxTQUFTO0lBQ3RCLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLHFCQUFxQixFQUFFLE9BQU87SUFDOUIsWUFBWSxFQUFFLElBQUk7SUFDbEIsVUFBVSxFQUFFLFFBQVE7SUFDcEIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsWUFBWSxFQUFFLE1BQU07SUFDcEIsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLElBQUk7SUFDakIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsVUFBVSxFQUFFLFNBQVM7SUFDckIsVUFBVSxFQUFFLFNBQVM7SUFDckIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsTUFBTSxFQUFFLEtBQUs7SUFDYixlQUFlLEVBQUUsY0FBYztJQUMvQixZQUFZLEVBQUUsS0FBSztJQUNuQixLQUFLLEVBQUUsT0FBTztJQUNkLE9BQU8sRUFBRSxHQUFHO0lBQ1osUUFBUSxFQUFFLEdBQUc7SUFDYixPQUFPLEVBQUUsUUFBUTtJQUNqQixTQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxNQUFNO0lBQ1osU0FBUyxFQUFFLElBQUk7SUFDZixpQkFBaUIsRUFBRSwwQkFBMEI7SUFDN0MsaUJBQWlCLEVBQUUsTUFBTTtJQUN6QixLQUFLLEVBQUUsS0FBSztJQUNaLE1BQU0sRUFBRSxLQUFLO0lBQ2IsWUFBWSxFQUFFLFlBQVk7SUFDMUIsYUFBYSxFQUFFLFNBQVM7SUFDeEIsY0FBYyxFQUFFLFFBQVE7SUFDeEIsNkJBQTZCLEVBQUUsZUFBZTtJQUM5QyxVQUFVLEVBQUUsS0FBSztJQUNqQixVQUFVLEVBQUUsSUFBSTtJQUNoQixPQUFPLEVBQUUsT0FBTztJQUNoQixLQUFLLEVBQUUsSUFBSTtJQUNYLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLElBQUksRUFBRSxJQUFJO0lBQ1YsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxVQUFVO0lBQ3ZCLE1BQU0sRUFBRSxJQUFJO0lBQ1osWUFBWSxFQUFFLFVBQVU7SUFDeEIsU0FBUyxFQUFFLFVBQVU7SUFDckIsVUFBVSxFQUFFLFVBQVU7SUFDdEIsTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsT0FBTztJQUNoQixLQUFLLEVBQUUsSUFBSTtJQUNYLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLE9BQU8sRUFBRSxNQUFNO0lBQ2YsYUFBYSxFQUFFLEtBQUs7SUFDcEIsTUFBTSxFQUFFLE9BQU87SUFDZixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUUsSUFBSTtJQUNWLEVBQUUsRUFBRSxLQUFLO0lBQ1QsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsc0JBQXNCO0lBQ25DLG9CQUFvQixFQUFFLFlBQVk7SUFDbEMsUUFBUSxFQUFFLGtCQUFrQjtJQUM1QixRQUFRLEVBQUUsT0FBTztJQUNqQixPQUFPLEVBQUUsSUFBSTtJQUNiLFFBQVEsRUFBRSxJQUFJO0lBQ2QsVUFBVSxFQUFFLE9BQU87SUFDbkIsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLElBQUksRUFBRSxLQUFLO0lBQ1gsS0FBSyxFQUFFLEtBQUs7SUFDWixNQUFNLEVBQUUsS0FBSztJQUNiLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFNBQVMsRUFBRSxRQUFRO0lBQ25CLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLE1BQU07SUFDYixrQkFBa0IsRUFBRSxhQUFhO0lBQ2pDLE9BQU8sRUFBRSxLQUFLO0lBQ2QsS0FBSyxFQUFFLEtBQUs7SUFDWixNQUFNLEVBQUUsS0FBSztJQUNiLE9BQU8sRUFBRSxNQUFNO0lBQ2Ysb0JBQW9CLEVBQUUsUUFBUTtJQUM5QixRQUFRLEVBQUUsTUFBTTtJQUNoQixTQUFTLEVBQUUsT0FBTztJQUNsQixNQUFNLEVBQUUsS0FBSztJQUNiLFVBQVUsRUFBRSxHQUFHO0lBQ2YsTUFBTSxFQUFFLE1BQU07SUFDZCxRQUFRLEVBQUUsUUFBUTtJQUNsQixJQUFJLEVBQUUsR0FBRztJQUNULGNBQWMsRUFBRSxVQUFVO0lBQzFCLGlCQUFpQixFQUFFLFNBQVM7SUFDNUIsS0FBSyxFQUFFLEdBQUc7SUFDVixpQkFBaUIsRUFBRSxTQUFTO0lBQzVCLG9CQUFvQixFQUFFLGNBQWM7SUFDcEMsS0FBSyxFQUFFLEdBQUc7SUFDVixTQUFTLEVBQUUsSUFBSTtJQUNmLEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsSUFBSTtDQUNoQjs7QUMxR00sSUFBTSxpQkFBaUIsR0FBRztJQUM3QixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsWUFBWTtJQUN2QixTQUFTLEVBQUUsV0FBVztJQUN0QixRQUFRLEVBQUUsVUFBVTtJQUNwQixNQUFNLEVBQUUsUUFBUTtJQUNoQixNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztJQUNsQixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsYUFBYTtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUMxQixVQUFVLEVBQUUsWUFBWTtJQUN4QixxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsVUFBVSxFQUFFLFlBQVk7SUFDeEIsZUFBZSxFQUFFLGdCQUFnQjtJQUNqQyxZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLFlBQVksRUFBRSxjQUFjO0lBQzVCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxjQUFjO0lBQzNCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsS0FBSyxFQUFFLE9BQU87SUFDZCxPQUFPLEVBQUUsV0FBVztJQUNwQixRQUFRLEVBQUUsYUFBYTtJQUN2QixPQUFPLEVBQUUsU0FBUztJQUNsQixTQUFPLEVBQUUsU0FBUztJQUNsQixJQUFJLEVBQUUsU0FBUztJQUNmLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLGlCQUFpQixFQUFFLDZCQUE2QjtJQUNoRCxpQkFBaUIsRUFBRSxhQUFhO0lBQ2hDLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsY0FBYyxFQUFFLGNBQWM7SUFDOUIsNkJBQTZCLEVBQUUsNEJBQTRCO0lBQzNELFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxlQUFlO0lBQzNCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsU0FBUyxFQUFFLGNBQWM7SUFDekIsSUFBSSxFQUFFLFlBQVk7SUFDbEIsZ0JBQWdCLEVBQUUsZUFBZTtJQUNqQyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztJQUM1QixTQUFTLEVBQUUsV0FBVztJQUN0QixVQUFVLEVBQUUsWUFBWTtJQUN4QixNQUFNLEVBQUUsU0FBUztJQUNqQixPQUFPLEVBQUUsVUFBVTtJQUNuQixLQUFLLEVBQUUsUUFBUTtJQUNmLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLGFBQWEsRUFBRSxVQUFVO0lBQ3pCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxNQUFNO0lBQ1osRUFBRSxFQUFFLEtBQUs7SUFDVCxVQUFVLEVBQUUsMkJBQTJCO0lBQ3ZDLFdBQVcsRUFBRSxzQ0FBc0M7SUFDbkQsb0JBQW9CLEVBQUUsZ0NBQWdDO0lBQ3RELFFBQVEsRUFBRSxpQ0FBaUM7SUFDM0MsUUFBUSxFQUFFLFdBQVc7SUFDckIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsYUFBYTtJQUNyQixVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztJQUN0QixJQUFJLEVBQUUsTUFBTTtJQUNaLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxPQUFPO0lBQ2Qsa0JBQWtCLEVBQUUsMkJBQTJCO0lBQy9DLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsb0JBQW9CLEVBQUUsbUJBQW1CO0lBQ3pDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFNBQVMsRUFBRSxjQUFjO0lBQ3pCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLFlBQVk7SUFDeEIsTUFBTSxFQUFFLFNBQVM7SUFDakIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixjQUFjLEVBQUUsZUFBZTtJQUMvQixpQkFBaUIsRUFBRSxpQkFBaUI7SUFDcEMsS0FBSyxFQUFFLE9BQU87SUFDZCxpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsb0JBQW9CLEVBQUUsb0JBQW9CO0lBQzFDLEtBQUssRUFBRSxRQUFRO0lBQ2YsU0FBUyxFQUFFLFlBQVk7SUFDdkIsR0FBRyxFQUFFLElBQUk7SUFDVCxNQUFNLEVBQUUsU0FBUztJQUNqQixPQUFPLEVBQUUsVUFBVTtDQUN0Qjs7QUMxR00sSUFBTSxpQkFBaUIsR0FBRztJQUM3QixTQUFTLEVBQUUsU0FBUztJQUNwQixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsY0FBYztJQUN6QixRQUFRLEVBQUUsU0FBUztJQUNuQixNQUFNLEVBQUUsWUFBWTtJQUNwQixNQUFNLEVBQUUsT0FBTztJQUNmLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFdBQVcsRUFBRSxZQUFZO0lBQ3pCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxZQUFZLEVBQUUsWUFBWTtJQUMxQixVQUFVLEVBQUUsWUFBWTtJQUN4QixlQUFlLEVBQUUsa0JBQWtCO0lBQ25DLFlBQVksRUFBRSxnQkFBZ0I7SUFDOUIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsVUFBVSxFQUFFLGNBQWM7SUFDMUIsV0FBVyxFQUFFLE1BQU07SUFDbkIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsTUFBTSxFQUFFLFNBQVM7SUFDakIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxZQUFZLEVBQUUsWUFBWTtJQUMxQixLQUFLLEVBQUUsT0FBTztJQUNkLE9BQU8sRUFBRSxVQUFVO0lBQ25CLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFNBQU8sRUFBRSxXQUFXO0lBQ3BCLElBQUksRUFBRSxNQUFNO0lBQ1osU0FBUyxFQUFFLFNBQVM7SUFDcEIsaUJBQWlCLEVBQUUsdUNBQXVDO0lBQzFELGlCQUFpQixFQUFFLE9BQU87SUFDMUIsS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsU0FBUztJQUNqQixZQUFZLEVBQUUsY0FBYztJQUM1QixhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsY0FBYztJQUM5Qiw2QkFBNkIsRUFBRSwwQkFBMEI7SUFDekQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsVUFBVSxFQUFFLGNBQWM7SUFDMUIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsS0FBSyxFQUFFLFFBQVE7SUFDZixTQUFTLEVBQUUsYUFBYTtJQUN4QixJQUFJLEVBQUUsWUFBWTtJQUNsQixnQkFBZ0IsRUFBRSxjQUFjO0lBQ2hDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFlBQVksRUFBRSxjQUFjO0lBQzVCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLEtBQUssRUFBRSxPQUFPO0lBQ2QsUUFBUSxFQUFFLFVBQVU7SUFDcEIsT0FBTyxFQUFFLFFBQVE7SUFDakIsYUFBYSxFQUFFLE9BQU87SUFDdEIsTUFBTSxFQUFFLE9BQU87SUFDZixPQUFPLEVBQUUsUUFBUTtJQUNqQixJQUFJLEVBQUUsT0FBTztJQUNiLEVBQUUsRUFBRSxLQUFLO0lBQ1QsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsMkNBQTJDO0lBQ3hELG9CQUFvQixFQUFFLHlCQUF5QjtJQUMvQyxRQUFRLEVBQUUsb0NBQW9DO0lBQzlDLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLG1CQUFtQixFQUFFLG9CQUFvQjtJQUN6QyxJQUFJLEVBQUUsTUFBTTtJQUNaLEtBQUssRUFBRSxRQUFRO0lBQ2YsTUFBTSxFQUFFLFNBQVM7SUFDakIsVUFBVSxFQUFFLGFBQWE7SUFDekIsU0FBUyxFQUFFLGdCQUFnQjtJQUMzQixJQUFJLEVBQUUsUUFBUTtJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxPQUFPO0lBQ2Qsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFNBQVM7SUFDakIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsb0JBQW9CLEVBQUUsNkJBQTZCO0lBQ25ELFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLElBQUksRUFBRSxLQUFLO0lBQ1gsY0FBYyxFQUFFLGNBQWM7SUFDOUIsaUJBQWlCLEVBQUUsaUJBQWlCO0lBQ3BDLEtBQUssRUFBRSxNQUFNO0lBQ2IsaUJBQWlCLEVBQUUscUJBQXFCO0lBQ3hDLG9CQUFvQixFQUFFLGdDQUFnQztJQUN0RCxLQUFLLEVBQUUsU0FBUztJQUNoQixTQUFTLEVBQUUsU0FBUztJQUNwQixHQUFHLEVBQUUsS0FBSztJQUNWLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE9BQU8sRUFBRSxPQUFPO0NBQ25COztBQ3pHTSxJQUFNLGlCQUFpQixHQUFHO0lBQzdCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxZQUFZO0lBQ3pCLFdBQVcsRUFBRSxlQUFlO0lBQzVCLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLHFCQUFxQixFQUFFLDJCQUEyQjtJQUNsRCxZQUFZLEVBQUUsYUFBYTtJQUMzQixVQUFVLEVBQUUsYUFBYTtJQUN6QixlQUFlLEVBQUUsY0FBYztJQUMvQixZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFZLEVBQUUsY0FBYztJQUM1QixVQUFVLEVBQUUsZUFBZTtJQUMzQixXQUFXLEVBQUUsV0FBVztJQUN4QixTQUFTLEVBQUUsVUFBVTtJQUNyQixVQUFVLEVBQUUsV0FBVztJQUN2QixVQUFVLEVBQUUsWUFBWTtJQUN4QixRQUFRLEVBQUUsV0FBVztJQUNyQixNQUFNLEVBQUUsVUFBVTtJQUNsQixlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLFlBQVksRUFBRSxhQUFhO0lBQzNCLEtBQUssRUFBRSxPQUFPO0lBQ2QsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsU0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLFNBQVM7SUFDZixTQUFTLEVBQUUsU0FBUztJQUNwQixpQkFBaUIsRUFBRSw0QkFBNEI7SUFDL0MsaUJBQWlCLEVBQUUsV0FBVztJQUM5QixLQUFLLEVBQUUsUUFBUTtJQUNmLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFlBQVksRUFBRSxjQUFjO0lBQzVCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGNBQWMsRUFBRSxlQUFlO0lBQy9CLDZCQUE2QixFQUFFLDRCQUE0QjtJQUMzRCxVQUFVLEVBQUUsZUFBZTtJQUMzQixVQUFVLEVBQUUsWUFBWTtJQUN4QixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztJQUNkLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUksRUFBRSxZQUFZO0lBQ2xCLGdCQUFnQixFQUFFLFlBQVk7SUFDOUIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLFlBQVk7SUFDekIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsS0FBSyxFQUFFLFFBQVE7SUFDZixRQUFRLEVBQUUsVUFBVTtJQUNwQixPQUFPLEVBQUUsU0FBUztJQUNsQixhQUFhLEVBQUUsWUFBWTtJQUMzQixNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztJQUNsQixJQUFJLEVBQUUsTUFBTTtJQUNaLEVBQUUsRUFBRSxLQUFLO0lBQ1QsVUFBVSxFQUFFLHlCQUF5QjtJQUNyQyxXQUFXLEVBQUUsd0NBQXdDO0lBQ3JELG9CQUFvQixFQUFFLGlDQUFpQztJQUN2RCxRQUFRLEVBQUUsbUNBQW1DO0lBQzdDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFFBQVEsRUFBRSxhQUFhO0lBQ3ZCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLG1CQUFtQixFQUFFLG1CQUFtQjtJQUN4QyxJQUFJLEVBQUUsTUFBTTtJQUNaLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFNBQVM7SUFDakIsVUFBVSxFQUFFLGNBQWM7SUFDMUIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixLQUFLLEVBQUUsU0FBUztJQUNoQixrQkFBa0IsRUFBRSw0QkFBNEI7SUFDaEQsT0FBTyxFQUFFLFNBQVM7SUFDbEIsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsT0FBTztJQUNmLE9BQU8sRUFBRSxVQUFVO0lBQ25CLG9CQUFvQixFQUFFLHVCQUF1QjtJQUM3QyxRQUFRLEVBQUUsU0FBUztJQUNuQixTQUFTLEVBQUUsWUFBWTtJQUN2QixNQUFNLEVBQUUsT0FBTztJQUNmLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLElBQUksRUFBRSxNQUFNO0lBQ1osY0FBYyxFQUFFLGlCQUFpQjtJQUNqQyxpQkFBaUIsRUFBRSxvQkFBb0I7SUFDdkMsS0FBSyxFQUFFLE9BQU87SUFDZCxpQkFBaUIsRUFBRSx5QkFBeUI7SUFDNUMsb0JBQW9CLEVBQUUsNkJBQTZCO0lBQ25ELEtBQUssRUFBRSxPQUFPO0lBQ2QsU0FBUyxFQUFFLFdBQVc7SUFDdEIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsU0FBUztJQUNqQixPQUFPLEVBQUUsVUFBVTtDQUN0Qjs7QUMxR00sSUFBTSxpQkFBaUIsR0FBRztJQUM3QixTQUFTLEVBQUUsdUJBQXVCO0lBQ2xDLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLHFCQUFxQixFQUFFLHdCQUF3QjtJQUMvQyxZQUFZLEVBQUUsWUFBWTtJQUMxQixVQUFVLEVBQUUsWUFBWTtJQUN4QixlQUFlLEVBQUUsb0JBQW9CO0lBQ3JDLFlBQVksRUFBRSxjQUFjO0lBQzVCLFlBQVksRUFBRSxZQUFZO0lBQzFCLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsS0FBSyxFQUFFLGFBQWE7SUFDcEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsU0FBTyxFQUFFLFdBQVc7SUFDcEIsSUFBSSxFQUFFLE9BQU87SUFDYixTQUFTLEVBQUUsU0FBUztJQUNwQixpQkFBaUIsRUFBRSxnQ0FBZ0M7SUFDbkQsaUJBQWlCLEVBQUUsVUFBVTtJQUM3QixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFlBQVksRUFBRSxjQUFjO0lBQzVCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGNBQWMsRUFBRSxjQUFjO0lBQzlCLDZCQUE2QixFQUFFLDJCQUEyQjtJQUMxRCxVQUFVLEVBQUUsZUFBZTtJQUMzQixVQUFVLEVBQUUsY0FBYztJQUMxQixPQUFPLEVBQUUsV0FBVztJQUNwQixLQUFLLEVBQUUsT0FBTztJQUNkLFNBQVMsRUFBRSxlQUFlO0lBQzFCLElBQUksRUFBRSxZQUFZO0lBQ2xCLGdCQUFnQixFQUFFLFlBQVk7SUFDOUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsTUFBTSxFQUFFLFNBQVM7SUFDakIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsS0FBSyxFQUFFLFFBQVE7SUFDZixRQUFRLEVBQUUsVUFBVTtJQUNwQixPQUFPLEVBQUUsUUFBUTtJQUNqQixhQUFhLEVBQUUsT0FBTztJQUN0QixNQUFNLEVBQUUsT0FBTztJQUNmLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLElBQUksRUFBRSxPQUFPO0lBQ2IsRUFBRSxFQUFFLEtBQUs7SUFDVCxVQUFVLEVBQUUsa0NBQWtDO0lBQzlDLFdBQVcsRUFBRSxtQ0FBbUM7SUFDaEQsb0JBQW9CLEVBQUUsK0JBQStCO0lBQ3JELFFBQVEsRUFBRSxnQ0FBZ0M7SUFDMUMsUUFBUSxFQUFFLFdBQVc7SUFDckIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsUUFBUSxFQUFFLFNBQVM7SUFDbkIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsUUFBUTtJQUNoQixVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztJQUN0QixJQUFJLEVBQUUsTUFBTTtJQUNaLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLGtCQUFrQixFQUFFLGVBQWU7SUFDbkMsT0FBTyxFQUFFLG1CQUFtQjtJQUM1QixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxRQUFRLEVBQUUsVUFBVTtJQUNwQixTQUFTLEVBQUUsUUFBUTtJQUNuQixNQUFNLEVBQUUsT0FBTztJQUNmLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxPQUFPO0lBQ2YsUUFBUSxFQUFFLFNBQVM7SUFDbkIsSUFBSSxFQUFFLEtBQUs7SUFDWCxjQUFjLEVBQUUsY0FBYztJQUM5QixpQkFBaUIsRUFBRSxpQkFBaUI7SUFDcEMsS0FBSyxFQUFFLE1BQU07SUFDYixpQkFBaUIsRUFBRSxzQkFBc0I7SUFDekMsb0JBQW9CLEVBQUUsdUJBQXVCO0lBQzdDLEtBQUssRUFBRSxTQUFTO0lBQ2hCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFdBQVc7SUFDbkIsT0FBTyxFQUFFLFVBQVU7Q0FDdEI7O0FDMUdNLElBQU0saUJBQWlCLEdBQUc7SUFDN0IsU0FBUyxFQUFFLEtBQUs7SUFDaEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsU0FBUyxFQUFFLEtBQUs7SUFDaEIsUUFBUSxFQUFFLElBQUk7SUFDZCxNQUFNLEVBQUUsSUFBSTtJQUNaLE1BQU0sRUFBRSxHQUFHO0lBQ1gsT0FBTyxFQUFFLEtBQUs7SUFDZCxTQUFTLEVBQUUsSUFBSTtJQUNmLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxNQUFNO0lBQ25CLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLHFCQUFxQixFQUFFLE1BQU07SUFDN0IsWUFBWSxFQUFFLFNBQVM7SUFDdkIsVUFBVSxFQUFFLE9BQU87SUFDbkIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsWUFBWSxFQUFFLE1BQU07SUFDcEIsWUFBWSxFQUFFLEtBQUs7SUFDbkIsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLElBQUk7SUFDakIsU0FBUyxFQUFFLElBQUk7SUFDZixVQUFVLEVBQUUsTUFBTTtJQUNsQixVQUFVLEVBQUUsT0FBTztJQUNuQixRQUFRLEVBQUUsSUFBSTtJQUNkLE1BQU0sRUFBRSxJQUFJO0lBQ1osZUFBZSxFQUFFLFFBQVE7SUFDekIsWUFBWSxFQUFFLElBQUk7SUFDbEIsS0FBSyxFQUFFLE1BQU07SUFDYixPQUFPLEVBQUUsSUFBSTtJQUNiLFFBQVEsRUFBRSxJQUFJO0lBQ2QsT0FBTyxFQUFFLElBQUk7SUFDYixTQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxJQUFJO0lBQ1YsU0FBUyxFQUFFLElBQUk7SUFDZixpQkFBaUIsRUFBRSxRQUFRO0lBQzNCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsU0FBUztJQUN6Qiw2QkFBNkIsRUFBRSxZQUFZO0lBQzNDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsS0FBSyxFQUFFLElBQUk7SUFDWCxTQUFTLEVBQUUsV0FBVztJQUN0QixJQUFJLEVBQUUsSUFBSTtJQUNWLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsTUFBTSxFQUFFLE1BQU07SUFDZCxZQUFZLEVBQUUsS0FBSztJQUNuQixTQUFTLEVBQUUsSUFBSTtJQUNmLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLE1BQU07SUFDZixLQUFLLEVBQUUsT0FBTztJQUNkLFFBQVEsRUFBRSxLQUFLO0lBQ2YsT0FBTyxFQUFFLElBQUk7SUFDYixhQUFhLEVBQUUsSUFBSTtJQUNuQixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxNQUFNO0lBQ2YsSUFBSSxFQUFFLElBQUk7SUFDVixFQUFFLEVBQUUsR0FBRztJQUNQLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxpQkFBaUI7SUFDOUIsb0JBQW9CLEVBQUUsUUFBUTtJQUM5QixRQUFRLEVBQUUsYUFBYTtJQUN2QixRQUFRLEVBQUUsS0FBSztJQUNmLE9BQU8sRUFBRSxNQUFNO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsTUFBTTtJQUNsQixtQkFBbUIsRUFBRSxNQUFNO0lBQzNCLElBQUksRUFBRSxJQUFJO0lBQ1YsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsSUFBSTtJQUNaLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLElBQUk7SUFDWixLQUFLLEVBQUUsSUFBSTtJQUNYLGtCQUFrQixFQUFFLE9BQU87SUFDM0IsT0FBTyxFQUFFLElBQUk7SUFDYixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxNQUFNO0lBQ2QsT0FBTyxFQUFFLElBQUk7SUFDYixvQkFBb0IsRUFBRSxVQUFVO0lBQ2hDLFFBQVEsRUFBRSxLQUFLO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsSUFBSTtJQUNaLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE1BQU0sRUFBRSxJQUFJO0lBQ1osUUFBUSxFQUFFLElBQUk7SUFDZCxJQUFJLEVBQUUsSUFBSTtJQUNWLGNBQWMsRUFBRSxNQUFNO0lBQ3RCLGlCQUFpQixFQUFFLE1BQU07SUFDekIsS0FBSyxFQUFFLElBQUk7SUFDWCxpQkFBaUIsRUFBRSxPQUFPO0lBQzFCLG9CQUFvQixFQUFFLFFBQVE7SUFDOUIsS0FBSyxFQUFFLEdBQUc7SUFDVixTQUFTLEVBQUUsSUFBSTtJQUNmLEdBQUcsRUFBRSxHQUFHO0lBQ1IsTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsSUFBSTtDQUNoQjs7QUMxR00sSUFBTSxpQkFBaUIsR0FBRztJQUM3QixTQUFTLEVBQUUsS0FBSztJQUNoQixTQUFTLEVBQUUsSUFBSTtJQUNmLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLElBQUk7SUFDZixVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixXQUFXLEVBQUUsYUFBYTtJQUMxQixVQUFVLEVBQUUsWUFBWTtJQUN4QixxQkFBcUIsRUFBRSxTQUFTO0lBQ2hDLFlBQVksRUFBRSxjQUFjO0lBQzVCLFVBQVUsRUFBRSxPQUFPO0lBQ25CLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLFlBQVksRUFBRSxNQUFNO0lBQ3BCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFNBQVMsRUFBRSxnQkFBZ0I7SUFDM0IsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixVQUFVLEVBQUUsT0FBTztJQUNuQixRQUFRLEVBQUUsSUFBSTtJQUNkLE1BQU0sRUFBRSxJQUFJO0lBQ1osZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxZQUFZLEVBQUUsSUFBSTtJQUNsQixLQUFLLEVBQUUsTUFBTTtJQUNiLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxPQUFPLEVBQUUsSUFBSTtJQUNiLFNBQU8sRUFBRSxJQUFJO0lBQ2IsSUFBSSxFQUFFLElBQUk7SUFDVixTQUFTLEVBQUUsSUFBSTtJQUNmLGlCQUFpQixFQUFFLFFBQVE7SUFDM0IsaUJBQWlCLEVBQUUsTUFBTTtJQUN6QixLQUFLLEVBQUUsTUFBTTtJQUNiLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFlBQVksRUFBRSxlQUFlO0lBQzdCLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsY0FBYyxFQUFFLFNBQVM7SUFDekIsNkJBQTZCLEVBQUUsY0FBYztJQUM3QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixVQUFVLEVBQUUsSUFBSTtJQUNoQixPQUFPLEVBQUUsSUFBSTtJQUNiLEtBQUssRUFBRSxJQUFJO0lBQ1gsU0FBUyxFQUFFLFdBQVc7SUFDdEIsSUFBSSxFQUFFLElBQUk7SUFDVixnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBWSxFQUFFLEtBQUs7SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixVQUFVLEVBQUUsSUFBSTtJQUNoQixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxNQUFNO0lBQ2YsS0FBSyxFQUFFLE9BQU87SUFDZCxRQUFRLEVBQUUsS0FBSztJQUNmLE9BQU8sRUFBRSxJQUFJO0lBQ2IsYUFBYSxFQUFFLElBQUk7SUFDbkIsTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsTUFBTTtJQUNmLElBQUksRUFBRSxJQUFJO0lBQ1YsRUFBRSxFQUFFLEdBQUc7SUFDUCxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsa0JBQWtCO0lBQy9CLG9CQUFvQixFQUFFLFFBQVE7SUFDOUIsUUFBUSxFQUFFLGNBQWM7SUFDeEIsUUFBUSxFQUFFLEtBQUs7SUFDZixPQUFPLEVBQUUsTUFBTTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2QsVUFBVSxFQUFFLE1BQU07SUFDbEIsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLElBQUksRUFBRSxJQUFJO0lBQ1YsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsS0FBSztJQUNiLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLElBQUk7SUFDWCxrQkFBa0IsRUFBRSxPQUFPO0lBQzNCLE9BQU8sRUFBRSxLQUFLO0lBQ2QsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsTUFBTTtJQUNkLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLG9CQUFvQixFQUFFLFVBQVU7SUFDaEMsUUFBUSxFQUFFLEtBQUs7SUFDZixTQUFTLEVBQUUsSUFBSTtJQUNmLE1BQU0sRUFBRSxJQUFJO0lBQ1osVUFBVSxFQUFFLEtBQUs7SUFDakIsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsSUFBSTtJQUNkLElBQUksRUFBRSxJQUFJO0lBQ1YsY0FBYyxFQUFFLE1BQU07SUFDdEIsaUJBQWlCLEVBQUUsTUFBTTtJQUN6QixLQUFLLEVBQUUsSUFBSTtJQUNYLGlCQUFpQixFQUFFLE9BQU87SUFDMUIsb0JBQW9CLEVBQUUsU0FBUztJQUMvQixLQUFLLEVBQUUsR0FBRztJQUNWLFNBQVMsRUFBRSxJQUFJO0lBQ2YsR0FBRyxFQUFFLEdBQUc7SUFDUixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxJQUFJO0NBQ2hCOztBQzFHTSxJQUFNLGlCQUFpQixHQUFHO0lBQzdCLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLFdBQVc7SUFDdEIsUUFBUSxFQUFFLEtBQUs7SUFDZixNQUFNLEVBQUUsSUFBSTtJQUNaLE1BQU0sRUFBRSxLQUFLO0lBQ2IsT0FBTyxFQUFFLEtBQUs7SUFDZCxTQUFTLEVBQUUsTUFBTTtJQUNqQixVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixXQUFXLEVBQUUsTUFBTTtJQUNuQixVQUFVLEVBQUUsTUFBTTtJQUNsQixxQkFBcUIsRUFBRSxTQUFTO0lBQ2hDLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFVBQVUsRUFBRSxPQUFPO0lBQ25CLGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFFBQVEsRUFBRSxLQUFLO0lBQ2YsTUFBTSxFQUFFLElBQUk7SUFDWixlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLFlBQVksRUFBRSxJQUFJO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsT0FBTyxFQUFFLElBQUk7SUFDYixRQUFRLEVBQUUsR0FBRztJQUNiLE9BQU8sRUFBRSxNQUFNO0lBQ2YsU0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLElBQUk7SUFDVixTQUFTLEVBQUUsSUFBSTtJQUNmLGlCQUFpQixFQUFFLHdCQUF3QjtJQUMzQyxpQkFBaUIsRUFBRSxNQUFNO0lBQ3pCLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLElBQUk7SUFDWixZQUFZLEVBQUUsY0FBYztJQUM1QixhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsU0FBUztJQUN6Qiw2QkFBNkIsRUFBRSxpQkFBaUI7SUFDaEQsVUFBVSxFQUFFLEtBQUs7SUFDakIsVUFBVSxFQUFFLElBQUk7SUFDaEIsT0FBTyxFQUFFLE1BQU07SUFDZixLQUFLLEVBQUUsSUFBSTtJQUNYLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLElBQUksRUFBRSxJQUFJO0lBQ1YsZ0JBQWdCLEVBQUUsVUFBVTtJQUM1QixVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixNQUFNLEVBQUUsSUFBSTtJQUNaLFlBQVksRUFBRSxjQUFjO0lBQzVCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFVBQVUsRUFBRSxPQUFPO0lBQ25CLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLE1BQU07SUFDZixLQUFLLEVBQUUsR0FBRztJQUNWLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLE9BQU8sRUFBRSxLQUFLO0lBQ2QsYUFBYSxFQUFFLElBQUk7SUFDbkIsTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxJQUFJO0lBQ1YsRUFBRSxFQUFFLEtBQUs7SUFDVCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFdBQVcsRUFBRSw4QkFBOEI7SUFDM0Msb0JBQW9CLEVBQUUsYUFBYTtJQUNuQyxRQUFRLEVBQUUsc0JBQXNCO0lBQ2hDLFFBQVEsRUFBRSxLQUFLO0lBQ2YsT0FBTyxFQUFFLEtBQUs7SUFDZCxRQUFRLEVBQUUsSUFBSTtJQUNkLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsSUFBSSxFQUFFLEtBQUs7SUFDWCxLQUFLLEVBQUUsS0FBSztJQUNaLE1BQU0sRUFBRSxLQUFLO0lBQ2IsVUFBVSxFQUFFLElBQUk7SUFDaEIsU0FBUyxFQUFFLEtBQUs7SUFDaEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixLQUFLLEVBQUUsS0FBSztJQUNaLGtCQUFrQixFQUFFLGVBQWU7SUFDbkMsT0FBTyxFQUFFLElBQUk7SUFDYixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxLQUFLO0lBQ2Qsb0JBQW9CLEVBQUUsUUFBUTtJQUM5QixRQUFRLEVBQUUsS0FBSztJQUNmLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLE1BQU0sRUFBRSxJQUFJO0lBQ1osVUFBVSxFQUFFLFlBQVk7SUFDeEIsTUFBTSxFQUFFLEtBQUs7SUFDYixRQUFRLEVBQUUsSUFBSTtJQUNkLElBQUksRUFBRSxJQUFJO0lBQ1YsY0FBYyxFQUFFLE9BQU87SUFDdkIsaUJBQWlCLEVBQUUsVUFBVTtJQUM3QixLQUFLLEVBQUUsSUFBSTtJQUNYLGlCQUFpQixFQUFFLE9BQU87SUFDMUIsb0JBQW9CLEVBQUUsYUFBYTtJQUNuQyxLQUFLLEVBQUUsR0FBRztJQUNWLFNBQVMsRUFBRSxJQUFJO0lBQ2YsR0FBRyxFQUFFLEdBQUc7SUFDUixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxJQUFJO0NBQ2hCOztBQ3ZGRDtJQUVJO1FBUVEsd0JBQW1CLEdBQUc7WUFDMUIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87U0FDbkIsQ0FBQztRQUVLLHFCQUFnQixHQUFHLE9BQU8sQ0FBQztLQXpCVjtJQUNWLHNCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDdEIsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDO0tBQzlCO0lBcUJNLHlCQUFJLEdBQVgsVUFBWSxRQUFnQjtRQUN4QkMsMkJBQU8sQ0FBQyxJQUFJLENBQUM7WUFDVCxHQUFHLEVBQUUsUUFBUTtZQUNiLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ2xDLGFBQWEsRUFBRTtnQkFDWCxlQUFlLEVBQUUsS0FBSzthQUN6QjtTQUNKLENBQUMsQ0FBQztRQUNIQSwyQkFBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDaEVBLDJCQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRUEsMkJBQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFQSwyQkFBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDaEVBLDJCQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRUEsMkJBQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFQSwyQkFBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDaEVBLDJCQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRUEsMkJBQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFQSwyQkFBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDaEVBLDJCQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRUEsMkJBQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFQSwyQkFBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDaEVBLDJCQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztLQUNuRTtJQUVNLDhCQUFTLEdBQWhCLFVBQWlCLEdBQVc7UUFDeEIsT0FBT0EsMkJBQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDekI7SUFFTSwyQkFBTSxHQUFiLFVBQWMsR0FBVztRQUNyQixPQUFPQSwyQkFBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM5QjtJQUVNLG9DQUFlLEdBQXRCLFVBQXVCLFFBQWdCO1FBQ25DLE9BQU8sT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssV0FBVyxDQUFDO0tBQ3BFO0lBQ0wsaUJBQUM7QUFBRCxDQUFDLElBQUE7QUFFRCxtQkFBZSxVQUFVLENBQUMsV0FBVyxFQUFFOztBQ25GdkMsSUFBTUMsU0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUVuQztJQU9JO1FBQUEsaUJBOEJDO1FBaENPLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBR3pCQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDVixJQUFBLE1BQU0sR0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQXRCLENBQXVCO1FBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBRTdCLElBQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVwRCxRQUFRLENBQUMsTUFBTSxHQUFHLFVBQUEsSUFBSTs7WUFFbEIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3JDLENBQUM7UUFFRixRQUFRLENBQUMsRUFBRSxHQUFHLFVBQUEsSUFBSTs7WUFFZCxLQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUM7U0FDZixDQUFDO1FBRUYsUUFBUSxDQUFDLFNBQVMsR0FBRyxVQUFBLElBQUk7O1lBRXJCLE9BQU8sSUFBSSxDQUFDO1NBQ2YsQ0FBQzs7UUFJRixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztZQUMzQixRQUFRLEVBQUUsUUFBUTtZQUNsQixHQUFHLEVBQUUsSUFBSTtZQUNULE1BQU0sRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztLQUNOO0lBQ2EsK0JBQVcsR0FBekI7UUFDSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFO1lBQy9CLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7U0FDNUQ7UUFDRCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztLQUN2QztJQUVNLHFDQUFPLEdBQWQsVUFBZSxlQUF1QjtRQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQzs7UUFFMUIsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBRXRDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7O1FBRTdELElBQU0sTUFBTSxHQUFHO1lBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQzdCLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUNMLDBCQUFDO0FBQUQsQ0FBQyxJQUFBO0FBRUQsMEJBQWUsbUJBQW1CLENBQUMsV0FBVyxFQUFFOztBQ3ZEaEQsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRXRDO0lBRUk7S0FBd0I7SUFDViwyQkFBVyxHQUF6QjtRQUNJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQzNCLGVBQWUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztTQUNwRDtRQUNELE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQztLQUNuQztJQUVNLDBCQUFBLFFBQU0sQ0FBQSxHQUFiLFVBQWMsWUFBWTtRQUN0QixJQUFJLEtBQUssR0FBRztZQUNSLE1BQU0sRUFBRTtnQkFDSixNQUFNLEVBQUVQLGVBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHFEQUFxRCxDQUFDO2dCQUNuRixJQUFJLEVBQUVBLGVBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlEQUFpRCxDQUFDO2dCQUM3RSxPQUFPLEVBQUVBLGVBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO2FBQ3RGO1NBQ0osQ0FBQztRQUVGLElBQUksT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLElBQUksYUFBYSxHQUFHO1lBQ2hCLElBQUksRUFBRTtnQkFDRixLQUFLLEVBQUVHLGVBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCO2FBQ3REO1lBQ0QsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLEVBQUU7Z0JBQ0osTUFBTSxFQUFFO29CQUNKLFFBQVEsRUFBRSxFQUFFO29CQUNaLElBQUksRUFBRSxJQUFJO29CQUNWLEtBQUssRUFBRSxTQUFTO29CQUNoQixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7aUJBQ3hCO2dCQUNELFNBQVMsRUFBRTtvQkFDUCxRQUFRLEVBQUUsRUFBRTtvQkFDWixJQUFJLEVBQUUsSUFBSTtpQkFDYjthQUNKO1NBQ0osQ0FBQztRQUVGLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLElBQUksRUFBRUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7WUFDbEQsU0FBUyxFQUFFLFFBQVE7WUFDbkIsSUFBSSxFQUFFLElBQUk7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztTQUM3QixDQUFDLENBQUM7UUFFSEEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFFakQsSUFBSSxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtZQUN2QyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDdkIsSUFBSSxFQUFFSyxZQUFVLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO2dCQUM3QyxTQUFTLEVBQUUsUUFBUTthQUN0QixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDdkIsS0FBSyxFQUFFLHlsS0FBeWxLO2dCQUNobUssS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLFFBQVE7Z0JBQ25CLFNBQVMsRUFBRSxPQUFPO2FBQ3JCLENBQUMsQ0FBQztTQUNOO1FBRUQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDdkIsR0FBRyxFQUFFO2dCQUNELEtBQUssRUFBRTtvQkFDSCxJQUFJLEVBQUVBLFlBQVUsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUM7b0JBQy9DLElBQUksRUFBRSxJQUFJO29CQUNWLFNBQVMsRUFBRSxRQUFRO29CQUNuQixRQUFRLEVBQUUsRUFBRTtvQkFDWixNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7aUJBQzNCO2dCQUNELFdBQVcsRUFBRTtvQkFDVCxJQUFJLEVBQUUsSUFBSTtpQkFDYjthQUNKO1lBQ0QsU0FBUyxFQUFFLE9BQU87U0FDckIsQ0FBQyxDQUFDOztRQUlILGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7Ozs7Ozs7UUFjM0QsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztRQUUxRCxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7Ozs7O1FBb0I3RCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CVCxhQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBR0MsZUFBSSxDQUFDLEdBQUcsR0FBRyxtQkFBbUIsRUFBRSxVQUFBLEdBQUc7Z0JBQzVELElBQUksR0FBRyxFQUFFO29CQUNMLE1BQU0sQ0FBQyxrQ0FBZ0MsR0FBSyxDQUFDLENBQUM7aUJBQ2pEO3FCQUFNO29CQUNILE1BQU0sQ0FBQyxJQUFJLENBQ1BELGFBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUdDLGVBQUksQ0FBQyxHQUFHLEdBQUcsbUJBQW1CLENBQUMsQ0FDdEUsQ0FBQztvQkFDRixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2IsT0FBTyxFQUFFLENBQUM7aUJBQ2I7YUFDSixDQUFDLENBQUM7U0FDTixDQUFDLENBQUM7S0FDTjtJQUVPLGlEQUF1QixHQUEvQixVQUFnQyxRQUFnQjtRQUM1QyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMvRDtJQUVPLGlEQUF1QixHQUEvQjtRQUFBLGlCQXFCQztRQXBCRyxJQUFJLEtBQUssR0FBR0csZUFBYSxDQUFDLGFBQWEsQ0FBQztRQUV4QyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZCxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTtZQUNkLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ04sSUFBSSxFQUFFLEtBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUc7Z0JBQ2xELE9BQU8sRUFBRSxJQUFJO2dCQUNiLEtBQUssRUFBRSxRQUFRO2FBQ2xCLENBQUMsQ0FBQztZQUVILElBQUksdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFekMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQztLQUNmO0lBRU8sMENBQWdCLEdBQXhCLFVBQXlCLElBQUk7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNOLElBQUksRUFBRSxHQUFHO1lBQ1QsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLFNBQVMsRUFBRSxPQUFPO1NBQ3JCLENBQUMsQ0FBQztLQUNOO0lBRU8sZ0RBQXNCLEdBQTlCO1FBQ0ksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNOLElBQUksRUFBRSxTQUFTO1lBQ2YsT0FBTyxFQUFFLElBQUk7WUFDYixLQUFLLEVBQUUsUUFBUTtTQUNsQixDQUFDLENBQUM7UUFFSFQsWUFBQyxDQUFDLE9BQU8sQ0FBQ1MsZUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsVUFBQSxNQUFNO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ04sSUFBSSxFQUFFLEtBQUcsTUFBTSxDQUFDLElBQU07Z0JBQ3RCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDekIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDTixJQUFJLEVBQUU7b0JBQ0Y7d0JBQ0ksSUFBSSxFQUFFLGFBQWE7d0JBQ25CLElBQUksRUFBRSxJQUFJO3FCQUNiO29CQUNEO3dCQUNJLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtxQkFDcEI7aUJBQ0o7Z0JBQ0QsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzthQUNsQixDQUFDLENBQUM7WUFFSCxJQUFJLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFO2dCQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNOLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsSUFBSTtvQkFDVixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2lCQUNsQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDTixJQUFJLEVBQUUsS0FBRyxNQUFNLENBQUMsY0FBZ0I7b0JBQ2hDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2pCLENBQUMsQ0FBQzthQUNOO1lBRUQsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ04sSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztpQkFDbEIsQ0FBQyxDQUFDO2dCQUVILElBQUksTUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUV0QlQsWUFBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFVBQUEsV0FBVztvQkFDdEMsTUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ1QsSUFBSSxFQUFFLEtBQUcsV0FBVyxDQUFDLElBQU07cUJBQzlCLENBQUMsQ0FBQztpQkFDTixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFJLENBQUMsQ0FBQzthQUNuQjtZQUVELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNOLElBQUksRUFBRSxhQUFhO29CQUNuQixJQUFJLEVBQUUsSUFBSTtvQkFDVixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2lCQUNsQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxNQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBRXRCQSxZQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBQSxRQUFRO29CQUNoQyxNQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzt3QkFDVCxJQUFJLEVBQUUsS0FBRyxRQUFRLENBQUMsSUFBTTtxQkFDM0IsQ0FBQyxDQUFDO2lCQUNOLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQUksQ0FBQyxDQUFDO2FBQ25CO1lBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ04sSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLElBQUksRUFBRSxJQUFJO29CQUNWLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7aUJBQ2xCLENBQUMsQ0FBQztnQkFFSCxJQUFJLE1BQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFFdEJBLFlBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFBLFNBQVM7b0JBQy9CLE1BQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO3dCQUNULElBQUksRUFBRSxLQUFHLFNBQVMsQ0FBQyxJQUFNO3FCQUM1QixDQUFDLENBQUM7aUJBQ04sQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxJQUFJLENBQUMsTUFBSSxDQUFDLENBQUM7YUFDbkI7WUFFRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDTixJQUFJLEVBQUUsV0FBVztvQkFDakIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztpQkFDbEIsQ0FBQyxDQUFDO2dCQUVILElBQUksTUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUV0QkEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQUEsU0FBUztvQkFDL0IsTUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7d0JBQ1QsSUFBSSxFQUFFLEtBQUcsU0FBUyxDQUFDLElBQU07cUJBQzVCLENBQUMsQ0FBQztpQkFDTixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFJLENBQUMsQ0FBQzthQUNuQjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ04sSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQ3hCLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQztLQUNmO0lBRU8sbURBQXlCLEdBQWpDO1FBQ0ksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNOLElBQUksRUFBRSxZQUFZO1lBQ2xCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsS0FBSyxFQUFFLFFBQVE7U0FDbEIsQ0FBQyxDQUFDO1FBRUhBLFlBQUMsQ0FBQyxPQUFPLENBQUNTLGVBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQUEsU0FBUztZQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNOLElBQUksRUFBRSxLQUFHLFNBQVMsQ0FBQyxJQUFNO2dCQUN6QixLQUFLLEVBQUUsV0FBVztnQkFDbEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQ3pCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ04sSUFBSSxFQUFFO29CQUNGO3dCQUNJLElBQUksRUFBRSxhQUFhO3dCQUNuQixJQUFJLEVBQUUsSUFBSTtxQkFDYjtvQkFDRDt3QkFDSSxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7cUJBQ3ZCO2lCQUNKO2dCQUNELE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDbEIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDTixJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztpQkFDbEIsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ04sSUFBSSxFQUFFLEtBQUcsU0FBUyxDQUFDLGNBQWdCO29CQUNuQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDTjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ04sSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQ3hCLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0wsc0JBQUM7QUFBRCxDQUFDLElBQUE7QUFFRCx3QkFBZSxlQUFlLENBQUMsV0FBVyxFQUFFOztBQ2pXNUM7SUFFSTtLQUF3QjtJQUNWLHdCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7WUFDeEIsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDO0tBQ2hDO0lBRU0sdUJBQUEsUUFBTSxDQUFBLEdBQWIsVUFBYyxZQUFZLEVBQUUsSUFBSTtRQUM1QixRQUFRQSxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDdkMsS0FBSyxNQUFNO2dCQUNQLE9BQU9NLGtCQUFnQixDQUFDLFFBQU0sQ0FBQSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RCxLQUFLLEtBQUs7Z0JBQ04sT0FBT0MsaUJBQWUsQ0FBQyxRQUFNLENBQUEsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuRDtLQUNKO0lBQ0wsbUJBQUM7QUFBRCxDQUFDLElBQUE7QUFFRCxxQkFBZSxZQUFZLENBQUMsV0FBVyxFQUFFOztBQ3RCekM7SUFDSSwwQkFBb0IsSUFBSTtRQUFKLFNBQUksR0FBSixJQUFJLENBQUE7S0FBSTtJQUVyQixxQ0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsSUFBWTtRQUN4QyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sSUFBSUMscUJBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDMUM7SUFDTCx1QkFBQztBQUFELENBQUM7O0FDUkQ7SUFDSSwwQkFBb0IsSUFBSTtRQUFKLFNBQUksR0FBSixJQUFJLENBQUE7S0FBSTtJQUVyQixxQ0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsSUFBWTtRQUN4QyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sSUFBSUEscUJBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDMUM7SUFDTCx1QkFBQztBQUFELENBQUM7O0FDVkQ7SUFBQTtLQUlDO0lBSFUscUNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLElBQVk7UUFDeEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkQ7SUFDTCx1QkFBQztBQUFELENBQUM7O0FDSkQ7SUFBQTtLQU1DO0lBTFUseUNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLElBQVk7UUFDeEMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUlBLHFCQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzFDO0lBQ0wsMkJBQUM7QUFBRCxDQUFDOztBQ1BEO0lBQUE7S0FvQ0M7SUFuQ1Usa0NBQVUsR0FBakIsVUFDSSxPQUFZLEVBQ1osQ0FBTSxFQUNOLFFBQWdCLEVBQ2hCLENBQU0sRUFDTixPQUEyQjtRQUUzQixJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztTQUN4RTtRQUVELElBQUksTUFBTSxDQUFDO1FBQ1gsUUFBUSxRQUFRO1lBQ1osS0FBSyxTQUFTO2dCQUNWLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQixNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQixNQUFNO1lBQ1YsS0FBSyxHQUFHO2dCQUNKLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDVixTQUFTO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQy9FO1NBQ0o7UUFFRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7WUFDbEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlCO0lBQ0wsb0JBQUM7QUFBRCxDQUFDOztBQ3BDRDtJQUFBO0tBWUM7SUFYVSxnQ0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsYUFBa0I7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJCLElBQUksYUFBYSxFQUFFO1lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM5QjtLQUNKO0lBQ0wsa0JBQUM7QUFBRCxDQUFDOztBQ1hEO0lBQ0k7S0FBZ0I7SUFFVCx1Q0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsUUFBUSxFQUFFLFdBQW1CLEVBQUUsT0FBMkI7UUFDdEYsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHTixvQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFFekMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87WUFDcEIsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDN0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE1BQU07Z0JBQ2xCLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQUEsV0FBVztvQkFDbkMsSUFBSSxXQUFXLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLEVBQUU7d0JBQy9CLGdCQUFnQixHQUFHLElBQUksQ0FBQztxQkFDM0I7b0JBQ0QsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7d0JBQ25DLGdCQUFnQixHQUFHLElBQUksQ0FBQztxQkFDM0I7aUJBQ0osQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUEsaUJBQWlCO29CQUN0QyxJQUFJLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxFQUFFO3dCQUNyQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7cUJBQzNCO29CQUNELElBQUksaUJBQWlCLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7d0JBQ3pDLGdCQUFnQixHQUFHLElBQUksQ0FBQztxQkFDM0I7aUJBQ0osQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUEsVUFBVTtvQkFDakMsSUFBSSxVQUFVLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLEVBQUU7d0JBQzlCLGdCQUFnQixHQUFHLElBQUksQ0FBQztxQkFDM0I7b0JBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7d0JBQ2xDLGdCQUFnQixHQUFHLElBQUksQ0FBQztxQkFDM0I7aUJBQ0osQ0FBQyxDQUFDO2dCQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUEsUUFBUTtvQkFDN0IsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLEVBQUU7d0JBQzVCLGdCQUFnQixHQUFHLElBQUksQ0FBQztxQkFDM0I7b0JBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7d0JBQ2hDLGdCQUFnQixHQUFHLElBQUksQ0FBQztxQkFDM0I7aUJBQ0osQ0FBQyxDQUFDO2FBQ04sQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3hCO1NBQ0osQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQixRQUFRLFdBQVc7Z0JBQ2YsS0FBSyxXQUFXO29CQUNaLE9BQU8sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO29CQUM1QixNQUFNO2dCQUNWLEtBQUssV0FBVztvQkFDWixPQUFPLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztvQkFDNUIsTUFBTTtnQkFDVixLQUFLLFlBQVk7b0JBQ2IsT0FBTyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7b0JBQzdCLE1BQU07Z0JBQ1YsS0FBSyxZQUFZO29CQUNiLE9BQU8sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO29CQUM3QixNQUFNO2dCQUNWLEtBQUssTUFBTTtvQkFDUCxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztvQkFDdkIsTUFBTTthQUNiO1lBQ0QsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlCO0tBQ0o7SUFDTCx5QkFBQztBQUFELENBQUM7O0FDdEVEO0lBQUE7S0FTQztJQVJVLDRDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxJQUFZO1FBQ3hDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNMLDhCQUFDO0FBQUQsQ0FBQzs7QUNURDtJQUFBO0tBc0JDO0lBckJVLGdEQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxJQUFZLEVBQUUsT0FBMkI7UUFDckUsSUFBTSxXQUFXLEdBQWE7WUFDMUIsZUFBZTtZQUNmLGFBQWE7WUFDYixZQUFZO1lBQ1osY0FBYztTQUNqQixDQUFDO1FBQ0YsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25DLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDakI7U0FDSjtRQUNELElBQUksTUFBTSxFQUFFO1lBQ1IsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7S0FDSjtJQUNMLGtDQUFDO0FBQUQsQ0FBQzs7QUNyQkQ7SUFJSTtLQUF3QjtJQUNWLDhCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtZQUM5QixrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1NBQzFEO1FBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7S0FDdEM7SUFFTSx5Q0FBWSxHQUFuQixVQUFvQixPQUFlO1FBQy9CLE9BQU8sT0FBTzthQUNULE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2FBQ2hCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2FBQ2hCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2FBQ2hCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2FBQ2hCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDekI7SUFFTSx1REFBMEIsR0FBakMsVUFBa0MsV0FBVztRQUN6QyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO1lBQzFCLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0UsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDNUM7U0FDSjtRQUVELE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0lBRU8scURBQXdCLEdBQWhDLFVBQWlDLE9BQWU7UUFDNUMsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJO1lBQ0EsTUFBTSxHQUFHTyxpQkFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25EO1FBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRTtRQUVkLE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBRU0sOENBQWlCLEdBQXhCLFVBQXlCLE9BQWU7UUFDcEMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztLQUM5RDtJQUVNLHVDQUFVLEdBQWpCLFVBQWtCLEdBQWdCLEVBQUUsY0FBc0I7UUFDdEQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUQsT0FBTyxhQUFXLGdCQUFnQixtQkFBYyxHQUFHLENBQUMsSUFBTSxDQUFDO0tBQzlEO0lBbER1Qiw4QkFBVyxHQUFHLGVBQWUsQ0FBQztJQW1EMUQseUJBQUM7Q0FwREQsSUFvREM7QUFFRCwyQkFBZSxrQkFBa0IsQ0FBQyxXQUFXLEVBQUU7O0FDekQvQyxJQUFLLFVBT0o7QUFQRCxXQUFLLFVBQVU7SUFDWCwrQ0FBTSxDQUFBO0lBQ04saURBQU8sQ0FBQTtJQUNQLCtDQUFNLENBQUE7SUFDTiwrQ0FBTSxDQUFBO0lBQ04sMkNBQUksQ0FBQTtJQUNKLG1EQUFRLENBQUE7QUFDWixDQUFDLEVBUEksVUFBVSxLQUFWLFVBQVUsUUFPZDtBQUVELElBQUssb0JBR0o7QUFIRCxXQUFLLG9CQUFvQjtJQUNyQiw2REFBRyxDQUFBO0lBQ0gsK0RBQUksQ0FBQTtBQUNSLENBQUMsRUFISSxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBR3hCO0FBRUQ7SUFFSTtLQUF3QjtJQUNWLHlCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDekIsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1NBQ2hEO1FBQ0QsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO0tBQ2pDOzs7Ozs7SUFPTSx3Q0FBZ0IsR0FBdkIsVUFBd0IsSUFBWTtRQUNoQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2pELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLFVBQVUsQ0FBQztTQUMzQzthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7S0FDSjs7Ozs7O0lBT00sd0NBQWdCLEdBQXZCLFVBQXdCLElBQVk7UUFDaEMsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNqRCxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxvQkFBb0IsQ0FBQztTQUNyRDthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7S0FDSjs7Ozs7SUFNTSxtQ0FBVyxHQUFsQixVQUFtQixJQUFZO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNyRTs7Ozs7O0lBT00sa0NBQVUsR0FBakIsVUFBa0IsSUFBWTtRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QixPQUFPLHNGQUFvRixJQUFNLENBQUM7U0FDckc7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QixPQUFPLCtEQUErRCxDQUFDO1NBQzFFO1FBRUQsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFDTCxvQkFBQztBQUFELENBQUMsSUFBQTtBQUVELHNCQUFlLGFBQWEsQ0FBQyxXQUFXLEVBQUU7O0FDcEUxQztJQUNJO0tBQWdCO0lBRVIsZ0RBQWMsR0FBdEIsVUFBdUIsR0FBRztRQUExQixpQkEyQ0M7UUExQ0csSUFBSSxHQUFHLENBQUMsVUFBUSxDQUFBLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzQixPQUFPLEtBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGlCQUFjLENBQUM7U0FDbEU7UUFFRCxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBUSxDQUFBLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSTtZQUM5QixJQUFJLE9BQU8sR0FBR1Asb0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLE9BQU8sRUFBRTtnQkFDVCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO29CQUMvQixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7d0JBQy9CLElBQUksR0FBRyxRQUFRLENBQUM7cUJBQ25CO29CQUNELE9BQU8sS0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsdUJBQWlCLElBQUksVUFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGdCQUNYLElBQUksQ0FBQyxJQUFJLFNBQU0sQ0FBQztpQkFDN0I7cUJBQU07b0JBQ0gsSUFBSSxJQUFJLEdBQUdRLG9CQUFrQixDQUFDLFVBQVUsQ0FDcEMsT0FBTyxDQUFDLElBQUksRUFDWlYsZUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQ3hDLENBQUM7b0JBQ0YsT0FBTyxLQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUN4QyxHQUFHLENBQ04sb0JBQWMsSUFBSSw2QkFBcUIsSUFBSSxDQUFDLElBQUksU0FBTSxDQUFDO2lCQUMzRDthQUNKO2lCQUFNLElBQUlXLGVBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM3QyxJQUFJLElBQUksR0FBR0EsZUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLE9BQU8sS0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FDeEMsR0FBRyxDQUNOLG9CQUFjLElBQUksNkJBQXFCLElBQUksQ0FBQyxJQUFJLFNBQU0sQ0FBQzthQUMzRDtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDeEIsT0FBTyxLQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFLLElBQUksQ0FBQyxJQUFNLENBQUM7aUJBQ3JFO3FCQUFNO29CQUNILElBQUksSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDWCxPQUFPLEtBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFNLENBQUM7cUJBQzlCO3lCQUFNO3dCQUNILE9BQU8sRUFBRSxDQUFDO3FCQUNiO2lCQUNKO2FBQ0o7U0FDSixDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQU0sTUFBTSxjQUFXLENBQUM7S0FDM0U7SUFFTyxtREFBaUIsR0FBekIsVUFBMEIsR0FBRztRQUN6QixPQUFPLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztLQUNsQztJQUVNLDRDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxNQUFNO1FBQXRDLGlCQTJFQztRQTFFRyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZCxJQUFJLDZCQUE2QixHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLDBCQUEwQixHQUFHLENBQUMsQ0FBQztRQUVuQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7Z0JBQ25CLElBQUksR0FBRyxDQUFDLHFCQUFxQixFQUFFO29CQUMzQiw2QkFBNkIsSUFBSSxDQUFDLENBQUM7aUJBQ3RDO2FBQ0osQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHLEVBQUUsS0FBSztnQkFDM0IsSUFBTSxPQUFPLEdBQUdULG9CQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xELElBQUksR0FBRyxDQUFDLHFCQUFxQixFQUFFO29CQUMzQixJQUFJLDBCQUEwQixLQUFLLENBQUMsRUFBRTt3QkFDbEMsSUFBSSxJQUFJLHNCQUFzQixDQUFDO3FCQUNsQztvQkFDRCwwQkFBMEIsSUFBSSxDQUFDLENBQUM7aUJBQ25DO2dCQUNELElBQUksT0FBTyxFQUFFO29CQUNULElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7d0JBQy9CLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3dCQUM3QixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTs0QkFDL0IsSUFBSSxHQUFHLFFBQVEsQ0FBQzt5QkFDbkI7d0JBQ0QsSUFBSSxJQUFJLEtBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHVCQUFpQixJQUFJLFVBQ2xFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxpQ0FDSU0scUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQU0sQ0FBQztxQkFDeEU7eUJBQU07d0JBQ0gsSUFBSSxJQUFJLEdBQUdFLG9CQUFrQixDQUFDLFVBQVUsQ0FDcEMsT0FBTyxDQUFDLElBQUksRUFDWlYsZUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQ3hDLENBQUM7d0JBQ0YsSUFBSSxJQUFJLEtBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQ3hDLEdBQUcsQ0FDTixvQkFBYyxJQUFJLDZCQUFxQlEscUJBQVUsQ0FBQyxnQkFBZ0IsQ0FDL0QsR0FBRyxDQUFDLElBQUksQ0FDWCxTQUFNLENBQUM7cUJBQ1g7aUJBQ0o7cUJBQU0sSUFBSSxHQUFHLENBQUMsY0FBYyxFQUFFO29CQUMzQixJQUFJLElBQUksUUFBTSxHQUFHLENBQUMsSUFBSSxVQUFLLEdBQUcsQ0FBQyxJQUFNLENBQUM7aUJBQ3pDO3FCQUFNLElBQUksR0FBRyxDQUFDLFVBQVEsQ0FBQSxFQUFFO29CQUNyQixJQUFJLElBQUksS0FBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEM7cUJBQU0sSUFBSUcsZUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzVDLElBQU0sSUFBSSxHQUFHQSxlQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxJQUFJLEtBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQ3hDLEdBQUcsQ0FDTixvQkFBYyxJQUFJLDZCQUFxQkgscUJBQVUsQ0FBQyxnQkFBZ0IsQ0FDL0QsR0FBRyxDQUFDLElBQUksQ0FDWCxTQUFNLENBQUM7aUJBQ1g7cUJBQU07b0JBQ0gsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO3dCQUNWLElBQUksSUFBSSxLQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFLLEdBQUcsQ0FBQyxJQUFNLENBQUM7cUJBQ3BFO3lCQUFNO3dCQUNILElBQUksSUFBSSxLQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBRyxDQUFDO3FCQUN2RDtpQkFDSjtnQkFDRCxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDM0IsSUFBSSwwQkFBMEIsS0FBSyw2QkFBNkIsRUFBRTt3QkFDOUQsSUFBSSxJQUFJLEdBQUcsQ0FBQztxQkFDZjtpQkFDSjtnQkFDRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2hDLElBQUksSUFBSSxJQUFJLENBQUM7aUJBQ2hCO2FBQ0osQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDYixPQUFVLE1BQU0sQ0FBQyxJQUFJLFNBQUksSUFBSSxNQUFHLENBQUM7U0FDcEM7YUFBTTtZQUNILE9BQU8sTUFBSSxJQUFJLE1BQUcsQ0FBQztTQUN0QjtLQUNKO0lBQ0wsOEJBQUM7QUFBRCxDQUFDOztBQ3RJRDtJQUFBO0tBUUM7SUFQVSxpQ0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsTUFBTSxFQUFFLEdBQVEsRUFBRSxPQUEyQjtRQUN6RSxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUN6QyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUI7YUFBTTtZQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQztLQUNKO0lBQ0wsbUJBQUM7QUFBRCxDQUFDOztBQ0pEO0lBQUE7S0FRQztJQVBVLCtCQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxRQUFnQjtRQUM1QyxJQUFJSCxZQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzdCLE9BQU9BLFlBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNILE9BQU8sUUFBUSxDQUFDO1NBQ25CO0tBQ0o7SUFDTCxpQkFBQztBQUFELENBQUM7O0FDWkQ7SUFBQTtLQU9DO0lBTlUsbUNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLENBQU0sRUFBRSxPQUEyQjtRQUMvRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUN2QixPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUI7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbkM7SUFDTCxxQkFBQztBQUFELENBQUM7O0FDUEQ7SUFBQTtLQVNDO0lBUlUsNkNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLE1BQU07UUFDbEMsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHLElBQUksT0FBRyxHQUFHLENBQUMsSUFBSSxVQUFLLEdBQUcsQ0FBQyxJQUFNLEdBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDYixPQUFVLE1BQU0sQ0FBQyxJQUFJLFNBQUksSUFBSSxNQUFHLENBQUM7U0FDcEM7YUFBTTtZQUNILE9BQU8sTUFBSSxJQUFJLE1BQUcsQ0FBQztTQUN0QjtLQUNKO0lBQ0wsK0JBQUM7QUFBRCxDQUFDOztBQ1REO0lBQUE7S0FJQztJQUhVLHVDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxJQUFnQixFQUFFLEtBQWEsRUFBRSxPQUEyQjtRQUN4RixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNoRjtJQUNMLHlCQUFDO0FBQUQsQ0FBQzs7QUNIRDtJQUNJO0tBQWdCO0lBRVQsc0NBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLElBQUksRUFBRSxPQUFPO1FBQ3pDLElBQUksTUFBTSxHQUFHTCxlQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEUsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQzthQUFNLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25DO0tBQ0o7SUFDTCx3QkFBQztBQUFELENBQUM7O0FDZEQ7SUFBQTtLQUtDO0lBSlUsdUNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLElBQWdCLEVBQUUsS0FBYSxFQUFFLE9BQTJCO1FBQ3hGLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxLQUFLVCxZQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE9BQU8sWUFBWSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN4RTtJQUNMLHlCQUFDO0FBQUQsQ0FBQzs7QUNMRDtJQUFBO0tBZ0VDO0lBL0RXLHlDQUFRLEdBQWhCLFVBQWlCLE9BQWU7UUFDNUIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUMzQixPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUMzQixPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM5QixPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzdCLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFO1lBQy9CLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsT0FBTyxPQUFPLENBQUM7S0FDbEI7SUFFTyxnREFBZSxHQUF2QixVQUF3QixHQUFHO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNiLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDaEM7SUFFTSwyQ0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsU0FBOEIsRUFBRSxPQUEyQjtRQUN2RixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUVsQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ25CLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM1QjtRQUVELEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO2dCQUN0QixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtvQkFDekMsSUFBSSxHQUFHLEdBQUcsRUFBdUIsQ0FBQztvQkFDbEMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO3dCQUN0QixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFOzRCQUNsRCxHQUFHLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2lDQUM3QixPQUFPLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztpQ0FDL0IsT0FBTyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQzt5QkFDMUM7NkJBQU07NEJBQ0gsR0FBRyxDQUFDLE9BQU87Z0NBQ1Asd0RBQW1ELElBQUksUUFBSTtvQ0FDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQ0FDekQsZUFBZSxDQUFDO3lCQUN2Qjt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNsQjtpQkFDSjthQUNKO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QjtLQUNKO0lBQ0wsNkJBQUM7QUFBRCxDQUFDOztBQ2hFRDtJQUFBO0tBOEJDO0lBN0JVLHVDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxTQUE4QixFQUFFLE9BQTJCO1FBQ3ZGLElBQUksU0FBUyxFQUFFO1lBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMzQixJQUFJLEdBQUcsR0FBRyxFQUF1QixDQUFDO1lBQ2xDLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztZQUV6QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsQixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7b0JBQ3RCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO3dCQUN6QyxZQUFZLEdBQUcsSUFBSSxDQUFDO3dCQUNwQixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFOzRCQUN0RSxHQUFHLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7eUJBQ3pEO3dCQUNELElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTs0QkFDdEIsR0FBRyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO3lCQUN0Qzt3QkFDRCxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7NEJBQ25CLEdBQUcsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7eUJBQ3JDO3FCQUNKO2lCQUNKO2FBQ0o7WUFDRCxJQUFJLFlBQVksRUFBRTtnQkFDZCxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDbEIsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlCO1NBQ0o7S0FDSjtJQUNMLHlCQUFDO0FBQUQsQ0FBQzs7QUM5QkQ7SUFBQTtLQXdCQztJQXZCVSx1Q0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsU0FBOEIsRUFBRSxPQUEyQjtRQUN2RixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVkLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO2dCQUN0QixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtvQkFDekMsSUFBSSxHQUFHLEdBQUcsRUFBdUIsQ0FBQztvQkFDbEMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO3dCQUN0QixHQUFHLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPOzZCQUM3QixPQUFPLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQzs2QkFDL0IsT0FBTyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDMUM7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbEI7YUFDSjtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNwQixPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUI7S0FDSjtJQUNMLHlCQUFDO0FBQUQsQ0FBQzs7QUN4QkQ7SUFBQTtLQW9CQztJQW5CVSwyQ0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsU0FBOEIsRUFBRSxPQUEyQjtRQUN2RixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRTNCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVsQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDdEIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7b0JBQ3ZDLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2hCO2FBQ0o7U0FDSjtRQUNELElBQUksS0FBSyxFQUFFO1lBQ1AsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7S0FDSjtJQUNMLDZCQUFDO0FBQUQsQ0FBQzs7QUNuQkQ7SUFBQTtLQStDQztJQTlDVSxzQ0FBVSxHQUFqQixVQUNJLE9BQVksRUFDWixTQUF5QyxFQUN6QyxPQUEyQjtRQUUzQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVkLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO2dCQUN0QixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtvQkFDdkMsSUFBSSxHQUFHLEdBQUcsRUFBdUIsQ0FBQztvQkFDbEMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDdEUsR0FBRyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2hFO29CQUNELElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7d0JBQ3RFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDekQ7eUJBQU07d0JBQ0gsR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3FCQUNoQztvQkFDRCxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7d0JBQ3RCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztxQkFDdEM7b0JBQ0QsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFO3dCQUMzQixHQUFHLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7cUJBQ2hEO29CQUNELElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTt3QkFDbkIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTs0QkFDeEIsR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzt5QkFDckM7NkJBQU07NEJBQ0gsR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3lCQUNoQztxQkFDSjtvQkFDRCxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7d0JBQ3RCLEdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3FCQUNoQztvQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNsQjthQUNKO1NBQ0o7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QjtLQUNKO0lBQ0wsd0JBQUM7QUFBRCxDQUFDOztBQ2pERDtJQUFBO0tBa0JDO0lBakJVLDhDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxTQUFxQixFQUFFLE9BQTJCO1FBQzlFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUM7UUFDWCxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDdEIsSUFDSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTO29CQUN2QyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQ3hDO29CQUNFLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUM5QixNQUFNO2lCQUNUO2FBQ0o7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBQ0wsZ0NBQUM7QUFBRCxDQUFDOztBQ2REO0lBQ0k7S0FBZ0I7SUFFVCxtQ0FBVSxHQUFqQixVQUFrQixPQUFZLEVBQUUsSUFBWSxFQUFFLE9BQTJCO1FBQ3JFLElBQUksT0FBTyxHQUFHVyxvQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBSSxnQkFBZ0IsR0FBR1Esb0JBQWtCLENBQUMsaUJBQWlCLENBQ3ZEVixlQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FDeEMsQ0FBQztRQUNGLElBQUksT0FBTyxFQUFFO1lBQ1QsT0FBTyxDQUFDLElBQUksR0FBRztnQkFDWCxHQUFHLEVBQUUsSUFBSTthQUNaLENBQUM7WUFDRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO2dCQUMvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtvQkFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO2lCQUNoQztnQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztnQkFDbkYsSUFDSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlO3FCQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsRUFDaEU7b0JBQ0UsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO29CQUNsQixRQUFRLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTzt3QkFDeEIsS0FBSyxNQUFNOzRCQUNQLFFBQVEsR0FBRyxjQUFjLENBQUM7NEJBQzFCLE1BQU07d0JBQ1YsS0FBSyxVQUFVOzRCQUNYLFFBQVEsR0FBRyxXQUFXLENBQUM7NEJBQ3ZCLE1BQU07d0JBQ1YsS0FBSyxXQUFXOzRCQUNaLFFBQVEsR0FBRyxhQUFhLENBQUM7NEJBQ3pCLE1BQU07d0JBQ1YsS0FBSyxVQUFVOzRCQUNYLFFBQVEsR0FBRyxXQUFXLENBQUM7cUJBQzlCO29CQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSTt3QkFDYixLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLFFBQVEsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQ2xGO2dCQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQzthQUNqQztpQkFBTTtnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFXLGdCQUFnQixtQkFBYyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQU0sQ0FBQztnQkFDakYsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO2FBQ2xDO1lBRUQsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlCO2FBQU0sSUFBSVcsZUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QyxPQUFPLENBQUMsSUFBSSxHQUFHO2dCQUNYLEdBQUcsRUFBRSxJQUFJO2FBQ1osQ0FBQztZQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBR0EsZUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUI7YUFBTTtZQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQztLQUNKO0lBQ0wscUJBQUM7QUFBRCxDQUFDOztBQzFERDtJQUFBO0tBc0JDO0lBckJVLG9DQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxJQUFnQjtRQUM1QyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsUUFBUSxJQUFJO1lBQ1IsS0FBS25CLGtCQUFVLENBQUMsY0FBYztnQkFDMUIsU0FBUyxHQUFHLE1BQU0sQ0FBQztnQkFDbkIsTUFBTTtZQUNWLEtBQUtBLGtCQUFVLENBQUMsZ0JBQWdCO2dCQUM1QixTQUFTLEdBQUcsTUFBTSxDQUFDO2dCQUNuQixNQUFNO1lBQ1YsS0FBS0Esa0JBQVUsQ0FBQyxhQUFhO2dCQUN6QixTQUFTLEdBQUcsT0FBTyxDQUFDO2dCQUNwQixNQUFNO1lBQ1YsS0FBS0Esa0JBQVUsQ0FBQyxhQUFhO2dCQUN6QixTQUFTLEdBQUcsUUFBUSxDQUFDO2dCQUNyQixNQUFNO1lBQ1Y7Z0JBQ0ksU0FBUyxHQUFHLE9BQU8sQ0FBQztnQkFDcEIsTUFBTTtTQUNiO1FBQ0QsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFDTCxzQkFBQztBQUFELENBQUM7O0FDckJEO0lBQUE7S0FrQ0M7Ozs7Ozs7SUEzQlUsb0NBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLElBQWtCO1FBQzlDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixRQUFRLElBQUk7WUFDUixLQUFLQSxrQkFBVSxDQUFDLGNBQWM7Z0JBQzFCLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBQ3RCLE1BQU07WUFDVixLQUFLQSxrQkFBVSxDQUFDLGVBQWU7Z0JBQzNCLFNBQVMsR0FBRyxVQUFVLENBQUM7Z0JBQ3ZCLE1BQU07WUFDVixLQUFLQSxrQkFBVSxDQUFDLGdCQUFnQjtnQkFDNUIsU0FBUyxHQUFHLFdBQVcsQ0FBQztnQkFDeEIsTUFBTTtZQUNWLEtBQUtBLGtCQUFVLENBQUMsYUFBYTtnQkFDekIsU0FBUyxHQUFHLFFBQVEsQ0FBQztnQkFDckIsTUFBTTtZQUNWLEtBQUtBLGtCQUFVLENBQUMsYUFBYTtnQkFDekIsU0FBUyxHQUFHLFFBQVEsQ0FBQztnQkFDckIsTUFBTTtZQUNWLEtBQUtBLGtCQUFVLENBQUMsWUFBWTtnQkFDeEIsU0FBUyxHQUFHLE9BQU8sQ0FBQztnQkFDcEIsTUFBTTtZQUNWLEtBQUtBLGtCQUFVLENBQUMsZUFBZTtnQkFDM0IsU0FBUyxHQUFHLFVBQVUsQ0FBQztnQkFDdkIsTUFBTTtTQUNiO1FBQ0QsT0FBTyxJQUFJZ0IscUJBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDL0M7SUFDTCxzQkFBQztBQUFELENBQUM7O0FDckNEO0lBQUE7S0FzQ0M7SUFyQ1UsdUNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLEdBQVcsRUFBRSxRQUFnQixFQUFFLE1BQWM7UUFDekUsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQXVCLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUN6QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7UUFFRCxJQUFJLElBQUksR0FBRyxDQUFDLEVBQ1IsR0FBRyxDQUFDO1FBQ1IsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ2IsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixJQUFJLEVBQUUsQ0FBQzthQUNWO1NBQ0o7UUFFRCxJQUFJLE1BQU0sQ0FBQztRQUNYLFFBQVEsUUFBUTtZQUNaLEtBQUssS0FBSztnQkFDTixNQUFNLEdBQUcsSUFBSSxLQUFLLE1BQU0sQ0FBQztnQkFDekIsTUFBTTtZQUNWLEtBQUssS0FBSztnQkFDTixNQUFNLEdBQUcsSUFBSSxLQUFLLE1BQU0sQ0FBQztnQkFDekIsTUFBTTtZQUNWLEtBQUssR0FBRztnQkFDSixNQUFNLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQztnQkFDdkIsTUFBTTtZQUNWLFNBQVM7Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDcEY7U0FDSjtRQUVELElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtZQUNsQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDOUI7SUFDTCx5QkFBQztBQUFELENBQUM7O0FDckNEO0lBQUE7S0FRQztJQVBVLGlDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxJQUFZO1FBQ3hDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzVELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzVELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUlBLHFCQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzFDO0lBQ0wsbUJBQUM7QUFBRCxDQUFDOztBQ1REO0lBQUE7S0FxQkM7SUFwQlUsMENBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLElBQUksRUFBRSxXQUFXO1FBQzdDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLE9BQU8sR0FBdUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxHQUFHLENBQUMsRUFDTCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV2QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25CLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzVFLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDakI7U0FDSjtRQUVELElBQUksTUFBTSxFQUFFO1lBQ1IsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7S0FDSjtJQUNMLDRCQUFDO0FBQUQsQ0FBQzs7QUNyQkQ7SUFBQTtLQWdCQztJQWZVLG1DQUFVLEdBQWpCLFVBQWtCLE9BQVk7UUFDMUIsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQXVCLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7UUFHakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRTtnQkFDckMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3RDLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDOUI7YUFDSjtTQUNKO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ25DO0lBQ0wscUJBQUM7QUFBRCxDQUFDOztBQ2hCRDtJQUFBO0tBY0M7SUFiVSw2QkFBVSxHQUFqQixVQUFrQixPQUFZO1FBQzFCLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksT0FBTyxHQUF1QixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7O1FBR2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlCO1NBQ0o7UUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbkM7SUFDTCxlQUFDO0FBQUQsQ0FBQzs7QUNaRDtJQUNJO0tBQWdCO0lBRVQsMkNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLFdBQW1CLEVBQUUsS0FBYTtRQUM5RCxJQUFJLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRSxJQUFJLFNBQVMsQ0FBQztRQUNkLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxjQUFjLENBQUM7UUFHbkIsU0FBUyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUU5RSxJQUFNLGNBQWMsR0FBRyxVQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxXQUFXO1lBQ2hFLElBQUksT0FBTyxHQUFHLGtCQUFrQixDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM5RSxJQUFJLEtBQUssQ0FBQztZQUNWLElBQUksZ0JBQWdCLENBQUM7WUFDckIsSUFBSSxPQUFPLENBQUM7WUFDWixJQUFJLFFBQVEsQ0FBQztZQUNiLElBQUksZUFBZSxDQUFDO1lBQ3BCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLEtBQUssQ0FBQztZQUNWLElBQUksUUFBUSxDQUFDO1lBRWIsS0FBSyxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdkMsSUFBSSxPQUFPLEtBQUssQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO2dCQUN2QyxnQkFBZ0IsR0FBR04sb0JBQWtCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN0RTtpQkFBTTtnQkFDSCxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUMzQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNyQyxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQzNCLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDekIsQ0FBQztvQkFDRixJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ2xFO2dCQUNELGdCQUFnQixHQUFHQSxvQkFBa0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDOUQ7WUFFRCxJQUFJLGdCQUFnQixFQUFFO2dCQUNsQixLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUM5QixRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUVqQyxJQUFJLFdBQVcsRUFBRTtvQkFDYixlQUFlLEdBQUcsR0FBRyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztpQkFDdEU7cUJBQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDMUMsZUFBZSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2lCQUM5RTtxQkFBTSxJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7b0JBQzlDLGVBQWUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2lCQUM1QztxQkFBTTtvQkFDSCxlQUFlLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztpQkFDNUM7Z0JBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO29CQUNuQyxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO2lCQUNyQztxQkFBTSxJQUNILGdCQUFnQixDQUFDLElBQUksS0FBSyxlQUFlO3FCQUN4QyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksZ0JBQWdCLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxFQUN4RTtvQkFDRSxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO29CQUN4QyxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO29CQUM5QixNQUFNLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztvQkFDckMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO3dCQUNyQyxRQUFRLEdBQUcsY0FBYyxDQUFDO3FCQUM3Qjt5QkFBTSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7d0JBQ2hELFFBQVEsR0FBRyxXQUFXLENBQUM7cUJBQzFCO3lCQUFNLElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLFdBQVcsRUFBRTt3QkFDakQsUUFBUSxHQUFHLGFBQWEsQ0FBQztxQkFDNUI7eUJBQU0sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFO3dCQUNoRCxRQUFRLEdBQUcsV0FBVyxDQUFDO3FCQUMxQjtpQkFDSjtnQkFFRCxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUVkLFFBQVEsS0FBSztvQkFDVCxLQUFLLENBQUM7d0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsTUFBTTtvQkFDVixLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUM7d0JBQ0YsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQy9CLE1BQU07aUJBQ2I7Z0JBRUQsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDbkMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7aUJBQy9CO2dCQUNELElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRTtvQkFDdkMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7aUJBQzFCO2dCQUVELElBQ0ksZ0JBQWdCLENBQUMsSUFBSSxLQUFLLGVBQWU7b0JBQ3pDLGdCQUFnQixDQUFDLElBQUksS0FBSyxTQUFTLEVBQ3JDO29CQUNFLE9BQU8sR0FBRyxlQUFZLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLFNBQUksUUFBUSxhQUFRLE1BQU0sV0FBSyxLQUFLLFNBQU0sQ0FBQztpQkFDcEc7cUJBQU07b0JBQ0gsT0FBTyxHQUFHLGVBQVksUUFBUSxHQUFHLGdCQUFnQixDQUFDLElBQUksVUFBSyxRQUFRLGFBQVEsTUFBTSxXQUFLLEtBQUssU0FBTSxDQUFDO2lCQUNyRztnQkFFRCxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDaEU7aUJBQU0sSUFBSSxDQUFDLGdCQUFnQixJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7Z0JBQ25FLE9BQU8sR0FBRyxlQUFZLEtBQUssQ0FBQyxNQUFNLFdBQUssS0FBSyxDQUFDLFFBQVEsU0FBTSxDQUFDO2dCQUM1RCxJQUFJLFdBQVcsRUFBRTtvQkFDYixlQUFlLEdBQUcsR0FBRyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztpQkFDdEU7cUJBQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDMUMsZUFBZSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2lCQUM5RTtxQkFBTSxJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7b0JBQzlDLGVBQWUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2lCQUM1QztxQkFBTTtvQkFDSCxlQUFlLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztpQkFDNUM7Z0JBQ0QsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ2hFO2lCQUFNLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRTtnQkFDbkYsT0FBTyxHQUFHLGVBQVksS0FBSyxDQUFDLE1BQU0sV0FBSyxPQUFPLENBQUMsV0FBVyxTQUFNLENBQUM7Z0JBQ2pFLElBQUksV0FBVyxFQUFFO29CQUNiLGVBQWUsR0FBRyxHQUFHLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2lCQUN0RTtxQkFBTSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO29CQUMxQyxlQUFlLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7aUJBQzlFO3FCQUFNLElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRTtvQkFDOUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7aUJBQzVDO3FCQUFNO29CQUNILGVBQWUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2lCQUM1QztnQkFDRCxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDaEU7aUJBQU0sSUFBSSxDQUFDLGdCQUFnQixJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7Z0JBQ25FLE9BQU8sR0FBRyxlQUFZLEtBQUssQ0FBQyxNQUFNLFdBQUssS0FBSyxDQUFDLE1BQU0sU0FBTSxDQUFDO2dCQUMxRCxJQUFJLFdBQVcsRUFBRTtvQkFDYixlQUFlLEdBQUcsR0FBRyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztpQkFDdEU7cUJBQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDMUMsZUFBZSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2lCQUM5RTtxQkFBTTtvQkFDSCxlQUFlLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztpQkFDNUM7Z0JBQ0QsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ2hFO2lCQUFNO2dCQUNILE9BQU8sbUJBQW1CLENBQUM7YUFDOUI7U0FDSixDQUFDO1FBRUYsU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVM7WUFDdkQsSUFBSSxVQUFVLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLEdBQUcsRUFBRSxHQUFHO2dCQUNSLElBQUksRUFBRSxJQUFJO2FBQ2IsQ0FBQztZQUdGLElBQUksUUFBUSxFQUFFO2dCQUNWLE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDdEQ7aUJBQU07Z0JBQ0gsT0FBTyxRQUFRLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzVDO1NBQ0o7O1FBSUQsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3JDLElBQUksdUJBQXVCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBRTFFLElBQUksdUJBQXVCLElBQUksdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDL0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDckQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTt3QkFDdkMsSUFBSSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3JDLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUM3QixzQkFBbUIsU0FBUyxDQUN4QixnQkFBZ0IsQ0FDbkIsV0FBSyxnQkFBZ0IsU0FBTSxFQUM1QixZQUFVLGdCQUFrQixDQUMvQixDQUFDO3FCQUNMO2lCQUNKO2FBQ0o7U0FDSjtRQUVELEdBQUc7WUFDQyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzs7WUFHdEMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsY0FBYyxHQUFHLFdBQVcsQ0FBQztnQkFDN0IsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDdEIsV0FBVyxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUU7Z0JBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDdEIsV0FBVyxHQUFHLFlBQVksQ0FDdEIsY0FBYyxFQUNkLE1BQU0sRUFDTixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQ1YsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUNWLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDYixDQUFDO2lCQUNMO2FBQ0o7U0FDSixRQUFRLE9BQU8sSUFBSSxjQUFjLEtBQUssV0FBVyxFQUFFO1FBRXBELE9BQU8sV0FBVyxDQUFDO0tBQ3RCO0lBQ0wsNkJBQUM7QUFBRCxDQUFDOztBQzlNRDtJQUFBO0tBNEJDO0lBM0JVLHdDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxJQUFZO1FBQ3hDLElBQUksSUFBSSxHQUFRLElBQUksQ0FBQztRQUVyQixJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNwRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDckUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2QjtRQUVELElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekUsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUNiO1FBRUQsSUFBSSxJQUFJLFlBQVksTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN2RSxPQUFPLGVBQVksSUFBSSw2QkFBcUIsSUFBSSxTQUFNLENBQUM7U0FDMUQ7YUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoRSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmO0tBQ0o7SUFDTCwwQkFBQztBQUFELENBQUM7O0FDN0JEO0lBQUE7S0FlQztJQWRVLHNDQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxZQUFvQixFQUFFLE9BQU87UUFDekQsUUFBUSxZQUFZO1lBQ2hCLEtBQUssQ0FBQztnQkFDRixPQUFPLElBQUksQ0FBQztZQUNoQixLQUFLLENBQUMsQ0FBQztZQUNQLEtBQUssQ0FBQyxDQUFDO1lBQ1AsS0FBSyxDQUFDLENBQUM7WUFDUCxLQUFLLENBQUMsQ0FBQztZQUNQLEtBQUssQ0FBQztnQkFDRixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLEVBQUUsQ0FBQztLQUNiO0lBQ0wsd0JBQUM7QUFBRCxDQUFDOztBQ2ZEO0lBQUE7S0FhQztJQVpVLG1DQUFVLEdBQWpCLFVBQWtCLE9BQVksRUFBRSxHQUFXLEVBQUUsT0FBTztRQUNoRCxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakIsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxJQUFJLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxJQUFJLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3JELE1BQU07Z0JBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO29CQUN2QyxLQUFLO29CQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFDTCxxQkFBQztBQUFELENBQUM7O0FDYkQ7SUFBQTtLQUlDO0lBSFUsbUNBQVUsR0FBakIsVUFBa0IsT0FBWSxFQUFFLE1BQWMsRUFBRSxHQUFXLEVBQUUsT0FBTztRQUNoRSxPQUFPLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ3hDO0lBQ0wscUJBQUM7QUFBRCxDQUFDOztBQ21DRDtJQUFBO0tBOENDO0lBN0NVLDJDQUFlLEdBQXRCLFVBQXVCLElBQUk7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLElBQUksdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRSxJQUFJLDJCQUEyQixFQUFFLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLElBQUkseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFLElBQUksc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0tBQzFFO0lBRU8sMENBQWMsR0FBdEIsVUFBdUIsSUFBSSxFQUFFLEdBQVcsRUFBRSxNQUF5QjtRQUMvRE0scUJBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFOztZQUUzQixPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0saUJBQUcsSUFBSSxVQUFLakIsWUFBQyxDQUFDLEtBQUssQ0FBQyxTQUFnQixDQUFDLFVBQUUsQ0FBQztTQUNoRixDQUFDLENBQUM7S0FDTjtJQUNMLHdCQUFDO0FBQUQsQ0FBQzs7QUNoRkQ7SUFPSTtRQU5RLFVBQUssR0FBcUIsRUFBUyxDQUFDO1FBT3hDLElBQU0sTUFBTSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsZUFBZSxDQUFDaUIscUJBQVUsQ0FBQyxDQUFDO0tBQ3RDO0lBQ2Esc0JBQVcsR0FBekI7UUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtZQUN0QixVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7U0FDMUM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUM7S0FDOUI7SUFFTSx5QkFBSSxHQUFYLFVBQVksWUFBb0I7UUFBaEMsaUJBb0ZDO1FBbkZHLElBQU0sUUFBUSxHQUFHO1lBQ2IsVUFBVTtZQUNWLFVBQVU7WUFDVixTQUFTO1lBQ1QsUUFBUTtZQUNSLFdBQVc7WUFDWCxZQUFZO1lBQ1osUUFBUTtZQUNSLGtCQUFrQjtZQUNsQixXQUFXO1lBQ1gsWUFBWTtZQUNaLGFBQWE7WUFDYixPQUFPO1lBQ1AsTUFBTTtZQUNOLE9BQU87WUFDUCxXQUFXO1lBQ1gsUUFBUTtZQUNSLE9BQU87WUFDUCxZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxXQUFXO1lBQ1gsY0FBYztZQUNkLHFCQUFxQjtZQUNyQixZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLGFBQWE7WUFDYixtQkFBbUI7WUFDbkIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQixhQUFhO1lBQ2IsY0FBYztZQUNkLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIseUJBQXlCO1lBQ3pCLHlCQUF5QjtZQUN6QiwyQkFBMkI7WUFDM0IsNEJBQTRCO1lBQzVCLGlCQUFpQjtZQUNqQixzQkFBc0I7WUFDdEIsb0JBQW9CO1NBQ3ZCLENBQUM7UUFDRixJQUFJLFlBQVksRUFBRTtZQUNkLElBQ0lQLFlBQVUsQ0FBQyxVQUFVLENBQUNKLGVBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHQSxlQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDO2dCQUM1RSxLQUFLLEVBQ1A7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FDUCx1RUFBdUUsQ0FDMUUsQ0FBQzthQUNMO1NBQ0o7UUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE9BQU87WUFDaEIsSUFBSSxXQUFXLEdBQUcsS0FBSSxDQUFDLHFCQUFxQixDQUN4QyxZQUFZLEVBQ1osV0FBVyxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQ2pDLENBQUM7WUFDRixPQUFPSSxZQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLElBQUk7Z0JBQ3hDLE9BQUFPLHFCQUFVLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7YUFBQSxDQUM1QyxDQUFDO1NBQ0wsQ0FBQyxDQUNMO2FBQ0ksSUFBSSxDQUFDO1lBQ0YsSUFBSSxRQUFRLEdBQUcsS0FBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRSxPQUFPUCxZQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLElBQUk7Z0JBQ3JDLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDdkIsS0FBSSxDQUFDLFlBQVksR0FBR08scUJBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7b0JBQ3BELGFBQWEsRUFBRSxJQUFJO29CQUNuQixNQUFNLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUM7YUFDTixDQUFDLENBQUM7U0FDTixDQUFDO2FBQ0QsSUFBSSxDQUFDO1lBQ0YsSUFBSSxRQUFRLEdBQUcsS0FBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdFLE9BQU9QLFlBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsWUFBWTtnQkFDN0MsS0FBSSxDQUFDLGVBQWUsR0FBR08scUJBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO29CQUNwRCxhQUFhLEVBQUUsSUFBSTtvQkFDbkIsTUFBTSxFQUFFLElBQUk7aUJBQ2YsQ0FBQyxDQUFDO2FBQ04sQ0FBQyxDQUFDO1NBQ04sQ0FBQyxDQUFDO0tBQ1Y7SUFFTSwrQkFBVSxHQUFqQixVQUFrQixZQUFZLEVBQUUsSUFBSTtRQUNoQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDN0UsT0FBT1AsWUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxZQUFZO1lBQzdDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQ3JCLE9BQU9PLHFCQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDcEMsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLE1BQU0sRUFBRSxJQUFJO2FBQ2YsQ0FBQyxjQUFNLElBQUksRUFBRyxDQUFDO1NBQ25CLENBQUMsQ0FBQztLQUNOO0lBRU0sMkJBQU0sR0FBYixVQUFjLFFBQWEsRUFBRSxJQUFTO1FBQ2xDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUNoQixNQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7O1FBS2hDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNyQixJQUFJLEVBQUUsQ0FBQztTQUNWLENBQUMsQ0FBQztLQUNOO0lBQ08sMENBQXFCLEdBQTdCLFVBQThCLFlBQW9CLEVBQUUsUUFBZ0I7UUFDaEUsSUFBSSxPQUFPLEdBQUdYLGVBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQ3hFLElBQUksWUFBWSxFQUFFO1lBQ2QsSUFBSSxRQUFRLEdBQUdBLGVBQUksQ0FBQyxPQUFPLENBQ3ZCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBR0EsZUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLEdBQUdBLGVBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUNoRSxDQUFDO1lBQ0YsT0FBTyxHQUFHSSxZQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUM7U0FDbEU7UUFDRCxPQUFPLE9BQU8sQ0FBQztLQUNsQjtJQUVNLDBDQUFxQixHQUE1QixVQUE2QixZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVk7UUFDMUQsT0FBT0EsWUFBVSxDQUFDLEdBQUcsQ0FDakJKLGVBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLCtDQUErQyxDQUFDLENBQzVFLENBQUMsSUFBSSxDQUNGLFVBQUEsSUFBSTtZQUNBLElBQUksUUFBUSxHQUFRVyxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxZQUFZLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxZQUFZO2FBQ3JCLENBQUMsQ0FBQztZQUNILElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNDLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBR1gsZUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNyRTtZQUVELE9BQU9JLFlBQVUsQ0FBQyxLQUFLLENBQ25CLFlBQVksR0FBR0osZUFBSSxDQUFDLEdBQUcsR0FBRyx5QkFBeUIsR0FBRyxLQUFLLEdBQUcsTUFBTSxFQUNwRSxNQUFNLENBQ1QsQ0FBQyxPQUFLLENBQUEsQ0FBQyxVQUFBLEdBQUc7Z0JBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2hGLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM5QixDQUFDLENBQUM7U0FDTixFQUNELFVBQUEsR0FBRyxJQUFJLE9BQUEsT0FBTyxDQUFDLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxHQUFBLENBQ2xFLENBQUM7S0FDTDtJQUNMLGlCQUFDO0FBQUQsQ0FBQyxJQUFBO0FBRUQsbUJBQWUsVUFBVSxDQUFDLFdBQVcsRUFBRTs7QUN0S3ZDLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQU9uQztJQVNJO1FBQUEsaUJBMkNDOzs7O1FBaERnQixrQkFBYSxHQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBTXhGLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNWLElBQUEsTUFBTSxHQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBdEIsQ0FBdUI7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFFN0IsSUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BELFFBQVEsQ0FBQyxJQUFJLEdBQUcsVUFBQyxJQUFJLEVBQUUsUUFBUTtZQUMzQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDWCxRQUFRLEdBQUcsTUFBTSxDQUFDO2FBQ3JCO1lBRUQsV0FBVyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsT0FBTyw2REFBd0QsUUFBUSxXQUFLLFdBQVcsd0JBQXFCLENBQUM7U0FDaEgsQ0FBQztRQUVGLFFBQVEsQ0FBQyxLQUFLLEdBQUcsVUFBQyxNQUFNLEVBQUUsSUFBSTtZQUMxQixRQUNJLHVEQUF1RDtnQkFDdkQsV0FBVztnQkFDWCxNQUFNO2dCQUNOLFlBQVk7Z0JBQ1osV0FBVztnQkFDWCxJQUFJO2dCQUNKLFlBQVk7Z0JBQ1osWUFBWSxFQUNkO1NBQ0wsQ0FBQztRQUVGLFFBQVEsQ0FBQyxLQUFLLEdBQUcsVUFBVSxJQUFZLEVBQUUsS0FBYSxFQUFFLElBQVk7WUFDaEUsSUFBSSxHQUFHLEdBQUcsWUFBWSxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsSUFBSSxHQUFHLDBCQUEwQixDQUFDO1lBQzlFLElBQUksS0FBSyxFQUFFO2dCQUNQLEdBQUcsSUFBSSxVQUFVLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQzthQUNuQztZQUNELEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDWCxPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztZQUMzQixRQUFRLEVBQUUsUUFBUTtZQUNsQixHQUFHLEVBQUUsSUFBSTtZQUNULE1BQU0sRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztLQUNOO0lBQ2EsMEJBQVcsR0FBekI7UUFDSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtZQUMxQixjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7U0FDbEQ7UUFDRCxPQUFPLGNBQWMsQ0FBQyxRQUFRLENBQUM7S0FDbEM7SUFFTSwrQ0FBc0IsR0FBN0IsVUFBOEIsUUFBZ0I7UUFBOUMsaUJBVUM7UUFURyxPQUFPSSxZQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBR0osZUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQzdELE9BQUssQ0FBQSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUFJLFlBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHSixlQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFBLENBQUM7YUFDeEUsSUFBSSxDQUFDLFVBQUEsSUFBSTtZQUNOLElBQU0sWUFBWSxHQUF3QjtnQkFDdEMsUUFBUSxFQUFFLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUNuQyxPQUFPLEVBQUUsSUFBSTthQUNoQixDQUFDO1lBQ0YsT0FBTyxZQUFZLENBQUM7U0FDdkIsQ0FBQyxDQUFDO0tBQ1Y7SUFFTSxtREFBMEIsR0FBakMsVUFBa0MsUUFBZ0I7UUFDOUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDSSxZQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBR0osZUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0tBQ3ZGO0lBRU8sc0NBQWEsR0FBckI7UUFBQSxpQkFJQztRQUhHLE9BQU9JLFlBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHSixlQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLElBQUk7WUFDbkUsT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztTQUFBLENBQzVCLENBQUM7S0FDTDtJQUVNLGdEQUF1QixHQUE5QixVQUErQixJQUFZO1FBQ3ZDLElBQUksT0FBTyxHQUFHQSxlQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksVUFBVSxHQUFHLE9BQU8sR0FBR0EsZUFBSSxDQUFDLEdBQUcsR0FBR0EsZUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3pFLE9BQU9ELGFBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzlDO0lBRU0sK0NBQXNCLEdBQTdCLFVBQThCLElBQVk7UUFDdEMsSUFBSSxPQUFPLEdBQUdDLGVBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxVQUFVLEdBQUcsT0FBTyxHQUFHQSxlQUFJLENBQUMsR0FBRyxHQUFHQSxlQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekUsT0FBT0ksWUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUM1QztJQUVPLDRDQUFtQixHQUEzQixVQUE0QixJQUFZO1FBQ3BDLElBQUksT0FBTyxHQUFHSixlQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksVUFBVSxHQUFHLE9BQU8sR0FBR0EsZUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUM7UUFDbEQsSUFBSSxxQkFBcUIsR0FBRyxPQUFPLEdBQUdBLGVBQUksQ0FBQyxHQUFHLEdBQUdBLGVBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNwRixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSUksWUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNuQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1NBQzFCO2FBQU07WUFDSCxTQUFTLEdBQUcscUJBQXFCLENBQUM7U0FDckM7UUFDRCxPQUFPLFNBQVMsQ0FBQztLQUNwQjs7OztJQUtNLHlDQUFnQixHQUF2QjtRQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQztZQUM3QyxPQUFBQSxZQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBR0osZUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FBQSxDQUN0RCxDQUFDO0tBQ0w7SUFFTSwwQ0FBaUIsR0FBeEI7UUFDSSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDdEMsVUFBQSxDQUFDO1lBQ0csT0FBQUksWUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUdKLGVBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDM0RJLFlBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHSixlQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUFBLENBQzFELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDdEM7SUFFTywrQkFBTSxHQUFkLFVBQWUsSUFBWTtRQUN2QixPQUFPLElBQUk7YUFDTixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQzthQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQzthQUN2QixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQzthQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQy9COzs7O0lBS08sbUNBQVUsR0FBbEIsVUFBbUIsS0FBb0I7UUFDbkMsT0FBT04sWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUEsQ0FBQyxDQUFDO0tBQ2hEO0lBQ0wscUJBQUM7QUFBRCxDQUFDLElBQUE7QUFFRCx1QkFBZSxjQUFjLENBQUMsV0FBVyxFQUFFOztBQzFKM0MsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFFbEQ7SUFJSTtLQUF3QjtJQUNWLHFCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7WUFDckIsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDO0tBQzdCO0lBRU0sd0JBQUksR0FBWCxVQUFZLFVBQWtCO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzdCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLGFBQWEsRUFBRSxJQUFJO1lBQ25CLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO0tBQ047SUFFTSwrQkFBVyxHQUFsQixVQUFtQixRQUFnQixFQUFFLFVBQWtCLEVBQUUsSUFBWSxFQUFFLElBQWE7UUFDaEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckMsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDVyxvQkFBa0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdFO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDQSxvQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQzlFO0tBQ0o7SUFFTSw2QkFBUyxHQUFoQixVQUFpQixRQUFnQixFQUFFLElBQVk7UUFDM0MsT0FBT0QsWUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFLLENBQUEsQ0FBQyxVQUFBLEdBQUc7WUFDckMsT0FBQSxPQUFPLENBQUMsTUFBTSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUFBLENBQ3BELENBQUM7S0FDTDtJQUNMLGdCQUFDO0FBQUQsQ0FBQyxJQUFBO0FBRUQsa0JBQWUsU0FBUyxDQUFDLFdBQVcsRUFBRTs7QUMzQy9CLElBQU0sa0JBQWtCLEdBQUc7SUFDOUIsaUJBQWlCLEVBQUU7UUFDZjtZQUNJLEVBQUUsRUFBRSxNQUFNO1lBQ1YsSUFBSSxFQUFFLE9BQU87WUFDYixXQUFXLEVBQUUsTUFBTTtZQUNuQixLQUFLLEVBQUUsTUFBTTtZQUNiLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQztTQUNwQjtRQUNEO1lBQ0ksRUFBRSxFQUFFLFFBQVE7WUFDWixJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLEtBQUssRUFBRSxRQUFRO1lBQ2YsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDO1NBQ3BCO1FBQ0Q7WUFDSSxFQUFFLEVBQUUsUUFBUTtZQUNaLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUFFLFFBQVE7WUFDckIsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDcEI7UUFDRDtZQUNJLEVBQUUsRUFBRSxjQUFjO1lBQ2xCLElBQUksRUFBRSxlQUFlO1lBQ3JCLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUMxQjtRQUNEO1lBQ0ksRUFBRSxFQUFFLFdBQVc7WUFDZixJQUFJLEVBQUUsWUFBWTtZQUNsQixXQUFXLEVBQUUsT0FBTztZQUNwQixLQUFLLEVBQUUsUUFBUTtZQUNmLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUMxQjtRQUNEO1lBQ0ksRUFBRSxFQUFFLE1BQU07WUFDVixJQUFJLEVBQUUsT0FBTztZQUNiLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUMxQjtRQUNEO1lBQ0ksRUFBRSxFQUFFLFNBQVM7WUFDYixJQUFJLEVBQUUsVUFBVTtZQUNoQixXQUFXLEVBQUUsU0FBUztZQUN0QixLQUFLLEVBQUUsVUFBVTtZQUNqQixRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7U0FDN0Q7S0FDSjtDQUNKLENBQUM7QUFFRjs7OztBQUlPLElBQU0sMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0FBRWhEOzs7O0FBSU8sSUFBTSw2QkFBNkIsR0FBRyxTQUFTOztBQ3JEdEQsSUFBTSxJQUFJLEdBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xDLElBQU0sT0FBTyxHQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV4QztJQVFJO1FBTlEsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFFNUIsbUJBQWMsR0FBRyxDQUFDLENBQUM7S0FHRjtJQUNWLHdCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7WUFDeEIsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDO0tBQ2hDO0lBRU0sZ0NBQVMsR0FBaEIsVUFBaUIsSUFBSTtRQUNqQixJQUFJLElBQUksQ0FBQztRQUNULElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLDZCQUE2QixFQUFFO1lBQ3JELElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUN2RSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRW5FLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFFckYsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QixJQUFJLEdBQUdXLG1CQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXpDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUNaLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRS9ELElBQUksR0FBRyxHQUFHO2dCQUNOLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtnQkFDbkQsSUFBSSxFQUFFLElBQUk7YUFDYixDQUFDO1lBRUYsSUFDSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQzVDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLDBCQUEwQixFQUM5QztnQkFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2xDO1NBQ0o7S0FDSjtJQUVNLDhDQUF1QixHQUE5QixVQUErQixZQUFvQjtRQUFuRCxpQkFxQ0M7UUFwQ0csSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQzs7WUFFbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3RDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsT0FBT0MsWUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsNkNBQTZDLENBQUMsQ0FBQyxJQUFJLENBQ2pGLFVBQUEsSUFBSTtZQUNBLElBQUksUUFBUSxHQUFRTyxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7Z0JBQ2xCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztnQkFDbEMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQzthQUM3QyxDQUFDLENBQUM7WUFDSCxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUdYLGVBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDckU7WUFFRCxPQUFPSSxZQUFVLENBQUMsS0FBSyxDQUNuQixZQUFZLEdBQUdKLGVBQUksQ0FBQyxHQUFHLEdBQUcsNEJBQTRCLEVBQ3RELE1BQU0sQ0FDVCxDQUFDLE9BQUssQ0FBQSxDQUFDLFVBQUEsR0FBRztnQkFDUCxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDOUIsQ0FBQyxDQUFDO1NBQ04sRUFDRCxVQUFBLEdBQUcsSUFBSSxPQUFBLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsR0FBQSxDQUNoRSxDQUFDO0tBQ0w7SUFDTCxtQkFBQztBQUFELENBQUMsSUFBQTtBQUVELHFCQUFlLFlBQVksQ0FBQyxXQUFXLEVBQUU7O0FDL0Z6QyxJQUFNLENBQUMsR0FBUSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFbEM7SUFLSTtRQUpRLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFDdkIsc0JBQWlCLEdBQVUsRUFBRSxDQUFDO0tBR2Q7SUFDVixnQ0FBVyxHQUF6QjtRQUNJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUU7WUFDaEMsb0JBQW9CLENBQUMsUUFBUSxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztTQUM5RDtRQUNELE9BQU8sb0JBQW9CLENBQUMsUUFBUSxDQUFDO0tBQ3hDO0lBRU0sMkNBQVksR0FBbkIsVUFBb0IsU0FBUztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNuQztJQUVPLDRDQUFhLEdBQXJCO1FBQUEsaUJBbUNDO1FBbENHLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1lBQ3hDLElBQUksSUFBSSxHQUFHO2dCQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7b0JBQ2QsSUFBSSxLQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO3dCQUN2QyxJQUFJLFFBQVEsR0FDUixPQUFPLENBQUMsR0FBRyxFQUFFOzRCQUNiQSxlQUFJLENBQUMsR0FBRzs0QkFDUkEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUM1Q0EsZUFBSSxDQUFDLEdBQUc7NEJBQ1IsS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQzt3QkFDMUNJLFlBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUN6QixVQUFBLFlBQVk7NEJBQ1IsS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7NEJBQ3RELENBQUMsRUFBRSxDQUFDOzRCQUNKLElBQUksRUFBRSxDQUFDO3lCQUNWLEVBQ0QsVUFBQSxDQUFDOzRCQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2hCLE1BQU0sRUFBRSxDQUFDO3lCQUNaLENBQ0osQ0FBQztxQkFDTDt5QkFBTTt3QkFDSCxLQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7d0JBQzVFLENBQUMsRUFBRSxDQUFDO3dCQUNKLElBQUksRUFBRSxDQUFDO3FCQUNWO2lCQUNKO3FCQUFNO29CQUNILE9BQU8sRUFBRSxDQUFDO2lCQUNiO2FBQ0osQ0FBQztZQUNGLElBQUksRUFBRSxDQUFDO1NBQ1YsQ0FBQyxDQUFDO0tBQ047SUFFTyxxREFBc0IsR0FBOUI7UUFBQSxpQkFhQztRQVpHLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQlYsWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsVUFBQSxTQUFTO2dCQUN2QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMzQ0EsWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsVUFBQSxlQUFlO29CQUM3QyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxZQUFZLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNsRSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2pEO2lCQUNKLENBQUMsQ0FBQzthQUNOLENBQUMsQ0FBQztZQUNILE9BQU8sRUFBRSxDQUFDO1NBQ2IsQ0FBQyxDQUFDO0tBQ047SUFFTyx1REFBd0IsR0FBaEM7UUFBQSxpQkFxQ0M7UUFwQ0csT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CQSxZQUFDLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsVUFBQSxTQUFTO2dCQUNoQyxJQUFJLFVBQVUsR0FBRztvQkFDYixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7b0JBQ3BCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtvQkFDcEIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO29CQUM1QixRQUFRLEVBQUUsRUFBRTtvQkFDWixRQUFRLEVBQUUsRUFBRTtvQkFDWixXQUFXLEVBQUUsRUFBRTtpQkFDbEIsQ0FBQztnQkFDRixJQUFJLE9BQU8sU0FBUyxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7b0JBQzNDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztpQkFDNUM7Z0JBQ0QsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2xDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckQ7Z0JBQ0QsS0FBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMzQyxDQUFDLENBQUM7WUFDSCxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUNyQjtnQkFDSSxLQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQzlCO29CQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ2hFLE9BQU8sRUFBRSxDQUFDO2lCQUNiLEVBQ0QsVUFBQSxDQUFDO29CQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLE1BQU0sRUFBRSxDQUFDO2lCQUNaLENBQ0osQ0FBQzthQUNMLEVBQ0QsVUFBQSxDQUFDO2dCQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkIsQ0FDSixDQUFDO1NBQ0wsQ0FBQyxDQUFDO0tBQ047SUFDTCwyQkFBQztBQUFELENBQUMsSUFBQTtBQUVELDZCQUFlLG9CQUFvQixDQUFDLFdBQVcsRUFBRTs7QUNoSGpELElBQU1zQixLQUFHLEdBQUcsSUFBSUMsZUFBTyxFQUFFLENBQUM7QUFFMUI7SUFFSTtLQUF3QjtJQUNWLHVCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDdkIsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDO0tBQy9COzs7Ozs7O0lBT08saUNBQVcsR0FBbkIsVUFBb0IsT0FBTyxFQUFFLFlBQW9CLEVBQUUsYUFBcUI7UUFDcEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7WUFDYixJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQUU7Z0JBQzlCLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxDQUFDO29CQUNULElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLGFBQWEsRUFBRTt3QkFDL0IsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFDdEI7aUJBQ0osQ0FBQyxDQUFDO2FBQ047U0FDSixDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztLQUNkOzs7Ozs7O0lBUU8sbUNBQWEsR0FBckIsVUFBc0IsT0FBTyxFQUFFLFlBQW9CLEVBQUUsYUFBcUI7UUFDdEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFBLENBQUM7WUFDZCxJQUFJLGNBQWMsR0FBd0IsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdFLElBQUksY0FBYyxFQUFFO2dCQUNoQixJQUFJLGNBQWMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtvQkFDakMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDbkQ7YUFDSjtTQUNKLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0tBQ2Q7Ozs7OztJQU9PLHFEQUErQixHQUF2QyxVQUF3QyxtQkFBbUIsRUFBRSxtQkFBbUI7UUFDNUUsSUFBSSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakQsSUFBSSxZQUFZLElBQUksWUFBWSxLQUFLdEIsa0JBQVUsQ0FBQyxtQkFBbUIsRUFBRTtZQUNqRSxJQUFJLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2RCxJQUFJLFdBQVcsRUFBRTtnQkFDYixJQUFJLGVBQWUsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVDLElBQUksZUFBZSxJQUFJLGVBQWUsS0FBS0Esa0JBQVUsQ0FBQyx1QkFBdUIsRUFBRTtvQkFDM0UsSUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQTBDLEVBQ3JFLFlBQVUsR0FBRyxFQUFFLENBQUM7O29CQUVwQixJQUFJLE9BQUssR0FBRyxDQUFDLENBQUM7b0JBQ2QsSUFBSSxnQkFBYyxHQUFHLFVBQUEsVUFBVTt3QkFDM0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUk7NEJBQ25CLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtnQ0FDWCxJQUFJLG1CQUFtQixDQUFDLE9BQUssR0FBRyxDQUFDLENBQUMsRUFBRTtvQ0FDaEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixDQUFDLE9BQUssR0FBRyxDQUFDLENBQUMsRUFBRTt3Q0FDeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFOzRDQUNsQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO2dEQUM3QixPQUFLLElBQUksQ0FBQyxDQUFDO2dEQUNYLGdCQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQzs2Q0FDL0M7aURBQU07Z0RBQ0gsWUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDOzZDQUN0Qzt5Q0FDSjs2Q0FBTTs0Q0FDSCxZQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7eUNBQ3RDO3FDQUNKO2lDQUNKOzZCQUNKO3lCQUNKLENBQUMsQ0FBQztxQkFDTixDQUFDO29CQUNGLGdCQUFjLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN4QyxPQUFPLFlBQVUsQ0FBQztpQkFDckI7YUFDSjtTQUNKO0tBQ0o7Ozs7OztJQU9NLHVEQUFpQyxHQUF4QyxVQUNJLGlCQUF5QixFQUN6QixVQUF5QixFQUN6QixhQUFzQjs7WUFFbEIsb0JBQW9CLEdBQUcsaUJBQWlCLEVBQ3hDLGNBQWMsRUFDZCxpQkFBaUIsR0FBRyxFQUFFLEVBQ3RCLG9CQUFvQixHQUFHLEtBQUssRUFFNUIsY0FBYyxHQUFHLE1BQU07UUFFM0IsSUFBTSxJQUFJLEdBQ04sT0FBT3FCLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFdBQVc7Y0FDdkRBLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztjQUN0Q0EsS0FBRyxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7OztRQUs3QyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztZQUNiLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFDbEMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFDeEMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVWLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2pDLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQVksRUFDOUQsV0FBVyxTQUFBLENBQUM7b0JBRWhCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUNoQyxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUMxRDtvQkFDRCxJQUFJLFVBQVUsS0FBSyxvQkFBb0IsRUFBRTt3QkFDckMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO3dCQUM1QixjQUFjLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixNQUFNO3FCQUNUO29CQUNELElBQUksV0FBVyxLQUFLLG9CQUFvQixFQUFFO3dCQUN0QyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7d0JBQzVCLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBQ3RCLGlCQUFpQixHQUFHLFVBQVUsQ0FBQzt3QkFDL0IsY0FBYyxHQUFHLENBQUMsQ0FBQzt3QkFDbkIsTUFBTTtxQkFDVDtpQkFDSjthQUNKO1lBQ0QsSUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDL0MsSUFBSSxlQUFlLEVBQUU7Z0JBQ2pCLElBQU0sd0JBQXdCLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMzRCxJQUFJLHdCQUF3QixLQUFLLG9CQUFvQixFQUFFO29CQUNuRCxjQUFjLEdBQUcsQ0FBQyxDQUFDO2lCQUN0QjthQUNKO1lBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUN2QixJQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxhQUFhLEVBQUU7b0JBQ2YsSUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2xELElBQUksaUJBQWlCLEtBQUssb0JBQW9CLEVBQUU7d0JBRTVDLGNBQWMsR0FBRyxDQUFDLENBQUM7cUJBQ3RCO2lCQUNKO2FBQ0o7U0FDSixDQUFDLENBQUM7UUFFSCxTQUFTLGNBQWMsQ0FBQyxtQkFBbUI7WUFDdkMsSUFBSSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFakQsSUFBSSxZQUFZLElBQUksWUFBWSxLQUFLckIsa0JBQVUsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDakUsSUFBSSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZELElBQUksV0FBVyxFQUFFO29CQUNiLElBQUksZUFBZSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxlQUFlLElBQUksZUFBZSxLQUFLQSxrQkFBVSxDQUFDLHVCQUF1QixFQUFFO3dCQUMzRSxJQUFJLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBMEMsQ0FBQzt3QkFDMUUsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDO3FCQUNsQztpQkFDSjthQUNKO1NBQ0o7UUFFRCxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsRUFBRTtZQUN2QyxJQUFJLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3hFLElBQUksVUFBVSxTQUFBLENBQUM7WUFDZixJQUFJLE9BQU8sbUJBQW1CLEtBQUssV0FBVyxFQUFFO2dCQUM1QyxVQUFVLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFFdkQsSUFBTSxnQkFBZ0IsR0FDbEIsT0FBT3FCLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssV0FBVztzQkFDOUNBLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO3NCQUM3QkEsS0FBRyxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUV0RCxJQUFJLGdCQUFnQixFQUFFO29CQUNsQixJQUFJLGNBQVksR0FBRyxjQUFjLEdBQUcsaUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7b0JBQzdFLElBQUksbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsY0FBWSxDQUFDLENBQUM7b0JBRWhGLElBQUksbUJBQW1CLEVBQUU7d0JBQ3JCLE9BQU8sY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUM7cUJBQzlDO3lCQUFNOzt3QkFFSCxJQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLENBQUM7d0JBRXRFLElBQUksa0JBQWtCLElBQUksa0JBQWtCLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTs7Z0NBQ25ELEtBR0ssSUFBQSx1QkFBQSxTQUFBLGtCQUFrQixDQUFBLHNEQUFBLHNGQUFFO29DQUhkLElBQUEsS0FBQSx1Q0FHVixFQUZHLG9CQUFvQixRQUFBLEVBQ3BCLHVCQUF1QixRQUFBO29DQUV2Qix1QkFBdUIsQ0FBQyxPQUFPLENBQUMsVUFBQSxzQkFBc0I7d0NBQ2xELElBQ0ksc0JBQXNCLFlBQVlFLDJCQUFtQjs0Q0FDckQsc0JBQXNCLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBWSxFQUNuRDs0Q0FDRSxPQUFPLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO3lDQUNqRDtxQ0FDSixDQUFDLENBQUM7aUNBQ047Ozs7Ozs7Ozt5QkFDSjtxQkFDSjtpQkFDSjthQUNKO1lBQ0QsSUFDSSxDQUFDLG1CQUFtQjtnQkFDcEIsYUFBYSxLQUFLLFVBQVU7Z0JBQzVCLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDbEU7Z0JBQ0UsSUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUMvQyxJQUFNLDRCQUE0QixHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FDakUsQ0FBQyxFQUNELHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FDMUMsQ0FBQztnQkFDRixJQUFNLGlCQUFpQixHQUNuQiw0QkFBNEIsR0FBRyxHQUFHLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQ2xGLElBQU0scUJBQXFCLEdBQUdkLFlBQVUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxxQkFBcUIsQ0FBQzthQUNoQztTQUNKO2FBQU07O1lBRUgsSUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5RSxJQUFJLG1CQUFtQixFQUFFO2dCQUNyQixJQUFJLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFFakQsSUFBSSxZQUFZLElBQUksWUFBWSxLQUFLVCxrQkFBVSxDQUFDLG1CQUFtQixFQUFFO29CQUNqRSxJQUFJLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkQsSUFBSSxXQUFXLEVBQUU7d0JBQ2IsSUFBSSxlQUFlLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUM1QyxJQUNJLGVBQWU7NEJBQ2YsZUFBZSxLQUFLQSxrQkFBVSxDQUFDLHVCQUF1QixFQUN4RDs0QkFDRSxJQUFJLFlBQVksR0FDWixXQUFXLENBQUMsWUFBMEMsQ0FBQzs0QkFDM0QsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDO3lCQUNsQzs2QkFBTSxJQUNILGVBQWU7NkJBQ2QsZUFBZSxLQUFLQSxrQkFBVSxDQUFDLGFBQWE7Z0NBQ3pDLGVBQWUsS0FBS0Esa0JBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxFQUNuRTs0QkFDRSxJQUFJLGFBQWEsS0FBSyxVQUFVLEVBQUU7Z0NBQzlCLE9BQU8sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDOzZCQUNoQztpQ0FBTTtnQ0FDSCxPQUFPLG1CQUFtQixDQUFDLFlBQVksQ0FBQzs2QkFDM0M7eUJBQ0o7NkJBQU0sSUFBSSxlQUFlLEVBQUU7NEJBQ3hCLE9BQU8sbUJBQW1CLENBQUMsWUFBWSxDQUFDO3lCQUMzQztxQkFDSjtpQkFDSjthQUNKO1NBQ0o7UUFFRCxPQUFPLEVBQUUsQ0FBQztLQUNiO0lBRU0seUNBQW1CLEdBQTFCLFVBQTJCLFlBQW9CLEVBQUUsVUFBeUI7UUFDdEUsSUFBTSxJQUFJLEdBQ04sT0FBT3FCLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFdBQVc7Y0FDdkRBLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztjQUN0Q0EsS0FBRyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN6QyxjQUFjLEVBRWQsU0FBUyxHQUFHLEVBQUUsQ0FDUztRQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztZQUNiLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFDbEMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFDeEMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVWLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2pDLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQVksRUFDOUQsV0FBVyxTQUFBLENBQUM7b0JBRWhCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUNoQyxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUMxRDtvQkFDRCxJQUFJLFVBQVUsS0FBSyxZQUFZLEVBQUU7d0JBQzdCLGNBQWMsR0FBRyxDQUFDLENBQUM7d0JBQ25CLE1BQU07cUJBQ1Q7b0JBQ0QsSUFBSSxXQUFXLEtBQUssWUFBWSxFQUFFO3dCQUc5QixjQUFjLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSixDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsRUFBRTtZQUN2QyxJQUFJLFVBQVUsR0FBR2hCLGVBQUksQ0FBQyxPQUFPLENBQ3pCQSxlQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQzdCLEdBQUc7Z0JBQ0gsY0FBYyxDQUFDLHVCQUF1QixFQUFFO2dCQUN4QyxLQUFLLENBQ1osQ0FBQztZQUNGLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHQSxlQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0QsU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsT0FBTyxTQUFTLENBQUM7S0FDcEI7Ozs7OztJQU9NLG9EQUE4QixHQUFyQyxVQUFzQyxpQkFBaUIsRUFBRSxjQUFzQjtZQUN2RSxjQUFjLEVBQ2QsU0FBUyxHQUFHLEVBQUUsQ0FFUztRQUMzQixJQUFNLElBQUksR0FDTixPQUFPZ0IsS0FBRyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxXQUFXO2NBQ2xEQSxLQUFHLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQztjQUNqQ0EsS0FBRyxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOzs7O1FBSzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDO1lBQ2IsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUNsQyxrQkFBa0IsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUN4QyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVYsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLEVBQUU7Z0JBQ3hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDakMsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBWSxFQUM5RCxXQUFXLFNBQUEsQ0FBQztvQkFFaEIsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQ2hDLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQzFEO29CQUNELElBQUksVUFBVSxLQUFLLGlCQUFpQixFQUFFO3dCQUNsQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixNQUFNO3FCQUNUO29CQUNELElBQUksV0FBVyxLQUFLLGlCQUFpQixFQUFFO3dCQUduQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSixDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsRUFBRTtZQUN2QyxTQUFTLEdBQUdoQixlQUFJLENBQUMsT0FBTyxDQUNwQkEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQ3hCLEdBQUc7Z0JBQ0gsY0FBYyxDQUFDLHVCQUF1QixFQUFFO2dCQUN4QyxLQUFLLENBQ1osQ0FBQztTQUNMO1FBQ0QsT0FBTyxTQUFTLENBQUM7S0FDcEI7Ozs7OztJQU9NLCtEQUF5QyxHQUFoRCxVQUFpRCxpQkFBaUIsRUFBRSxVQUF5QjtRQUN6RixJQUFJLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFDbEQsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQzdDLGNBQWMsRUFDZCxpQkFBaUIsR0FBRyxFQUFFLEVBQ3RCLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBTSxJQUFJLEdBQ04sT0FBT2dCLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFdBQVc7Y0FDdkRBLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztjQUN0Q0EsS0FBRyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7OztRQUs3QyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztZQUNiLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFDbEMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFDeEMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVWLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2pDLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQVksRUFDOUQsV0FBVyxTQUFBLENBQUM7b0JBRWhCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUNoQyxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUMxRDtvQkFDRCxJQUFJLFVBQVUsS0FBSyxvQkFBb0IsRUFBRTt3QkFDckMsY0FBYyxHQUFHLENBQUMsQ0FBQzt3QkFDbkIsTUFBTTtxQkFDVDtvQkFDRCxJQUFJLFdBQVcsS0FBSyxvQkFBb0IsRUFBRTt3QkFDdEMsY0FBYyxHQUFHLElBQUksQ0FBQzt3QkFDdEIsaUJBQWlCLEdBQUcsVUFBVSxDQUFDO3dCQUMvQixjQUFjLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixNQUFNO3FCQUNUO2lCQUNKO2FBQ0o7U0FDSixDQUFDLENBQUM7UUFFSCxJQUFJLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQztRQUN4QyxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsRUFBRTtZQUN2QyxJQUFJLFVBQVUsR0FBR2hCLGVBQUksQ0FBQyxPQUFPLENBQ3pCQSxlQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQzdCLEdBQUc7Z0JBQ0gsY0FBYyxDQUFDLHVCQUF1QixFQUFFO2dCQUN4QyxLQUFLLENBQ1osQ0FBQztZQUNGLElBQU0sZ0JBQWdCLEdBQ2xCLE9BQU9nQixLQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFdBQVc7a0JBQzlDQSxLQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztrQkFDN0JBLEtBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QyxJQUFJLGdCQUFnQixFQUFFO2dCQUNsQixjQUFjLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ2xDLElBQUksWUFBWSxHQUFHLGNBQWMsR0FBRyxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztnQkFDN0UsbUJBQW1CLEdBQUcsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzdFO1NBQ0o7YUFBTTtZQUNILGNBQWMsR0FBRyxJQUFJLENBQUM7O1lBRXRCLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3JGO1FBRUQsSUFBSSxtQkFBbUIsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3pGOztRQUVELElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoQyxJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsRUFBRTtnQkFDdkMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FDdEIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FDekIsQ0FBQztnQkFDRixJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7b0JBQ1osT0FBTyxHQUFHLENBQUM7aUJBQ2Q7Z0JBQ0QsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQ3BCLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQ3pCLENBQUM7Z0JBQ0YsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO29CQUNaLE9BQU8sR0FBRyxDQUFDO2lCQUNkO2FBQ0o7U0FDSjtLQUNKO0lBQ0wsa0JBQUM7QUFBRCxDQUFDLElBQUE7QUFFRCxvQkFBZSxXQUFXLENBQUMsV0FBVyxFQUFFOztBQ3JkeEMsSUFBTWYsVUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUVyQyxJQUFNZSxLQUFHLEdBQUcsSUFBSUMsZUFBTyxFQUFFLENBQUM7QUFFMUI7SUFjSTtRQWJRLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFJYixzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDdkIsa0NBQTZCLEdBQ2pDLGlJQUFpSSxDQUFDO1FBQzlILDRDQUF1QyxHQUMzQywyR0FBMkcsQ0FBQztLQUd4RjtJQUNWLDRCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUM1QixnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3REO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7S0FDcEM7SUFFTSxtQ0FBUSxHQUFmLFVBQWdCLEtBQUs7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBR3ZCLFlBQUMsQ0FBQyxNQUFNLENBQUNBLFlBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRUEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUN4RTtJQUVNLDZDQUFrQixHQUF6QixVQUEwQixLQUFLO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDQSxZQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRUEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM1RjtJQUVNLDhDQUFtQixHQUExQixVQUEyQixVQUFVLEVBQUUsYUFBYSxFQUFFLFFBQVE7UUFDMUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUN4QixJQUFJLEVBQUUsVUFBVTtZQUNoQixXQUFXLEVBQUUsYUFBYTtZQUMxQixRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLEdBQUdBLFlBQUMsQ0FBQyxNQUFNLENBQUNBLFlBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFQSxZQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQzlGO0lBRU0sb0NBQVMsR0FBaEIsVUFBaUIsVUFBa0IsRUFBRSxhQUFhO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2QsSUFBSSxFQUFFLFVBQVU7WUFDaEIsV0FBVyxFQUFFLGFBQWE7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBR0EsWUFBQyxDQUFDLE1BQU0sQ0FBQ0EsWUFBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFQSxZQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQzFFO0lBRU0sOENBQW1CLEdBQTFCLFVBQTJCLEtBQWE7UUFDcEMsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFNLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxJQUFJLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzFCLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbEU7UUFFRCxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQzdDLElBQUksQ0FBQyw2QkFBNkIsRUFDbEMsV0FBVyxDQUNkLENBQUM7UUFFRixtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQzdDLElBQUksQ0FBQyx1Q0FBdUMsRUFDNUMsV0FBVyxDQUNkLENBQUM7UUFFRixPQUFPeUIsZ0JBQUssQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztLQUMzQztJQUVNLHdDQUFhLEdBQXBCLFVBQXFCLEtBQWE7UUFDOUIsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxJQUFJLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzFCLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbEU7UUFFRCxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQzdDLElBQUksQ0FBQyw2QkFBNkIsRUFDbEMsV0FBVyxDQUNkLENBQUM7UUFFRixtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQzdDLElBQUksQ0FBQyx1Q0FBdUMsRUFDNUMsV0FBVyxDQUNkLENBQUM7UUFFRixPQUFPLG1CQUFtQixDQUFDO0tBQzlCO0lBRU0sd0NBQWEsR0FBcEIsVUFBcUIsTUFBYztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztLQUM1QjtJQUVNLG1EQUF3QixHQUEvQixVQUFnQyxPQUFtQjtRQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxJQUNJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ2hEO2dCQUNFLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUVELE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBRU0sOENBQW1CLEdBQTFCLFVBQTJCLHNCQUFrQztRQUN6RCxJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQzs7O1FBRzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQzlFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQztvQkFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O1lBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDbEY7S0FDSjtJQUVNLCtDQUFvQixHQUEzQjtRQUFBLGlCQXFFQztRQXBFRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEJ6QixZQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBQyxJQUE0QjtnQkFDMUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQXdDLENBQUM7Z0JBQ2hFLElBQUksV0FBVyxFQUFFO29CQUNiLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRTt3QkFDdEJBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFDLE9BQTBCOzs0QkFFdkQsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO2dDQUNuQkEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQUMsUUFBdUI7b0NBQ2pEQSxZQUFDLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxNQUFNLEVBQUUsVUFBQSxLQUFLO3dDQUN4QixJQUNJLFFBQVEsQ0FBQyxJQUFJOzRDQUNiLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUk7NENBQzVCLEtBQUssQ0FBQyxRQUFRLEtBQUssS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFDdkQ7NENBQ0UsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3lDQUNqRDs2Q0FBTSxJQUNILFFBQVEsQ0FBQyxJQUFJOzRDQUNiLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUk7NENBQzVCLEtBQUssQ0FBQyxRQUFRLEtBQUssS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFDdkQ7NENBQ0UsSUFBSSxrQkFBa0IsR0FDbEIwQixhQUFXLENBQUMsOEJBQThCLENBQ3RDLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FDckMsQ0FBQzs0Q0FFTixrQkFBa0IsR0FBRyxrQkFBa0I7aURBQ2xDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUdwQixlQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztpREFDckMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQzs0Q0FFekIsSUFDSSxRQUFRLENBQUMsSUFBSTtnREFDYixLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJO2dEQUM1QixLQUFLLENBQUMsUUFBUSxLQUFLLGtCQUFrQixFQUN2QztnREFDRSxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NkNBQ2pEO3lDQUNKO3FDQUNKLENBQUMsQ0FBQztpQ0FDTixDQUFDLENBQUM7NkJBQ047eUJBQ0osQ0FBQyxDQUFDO3FCQUNOO2lCQUNKOzs7OztnQkFLRCxJQUFJSixVQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzNCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDaEJGLFlBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFDLFFBQXVCOzRCQUM5Q0EsWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsTUFBTSxFQUFFLFVBQUEsS0FBSztnQ0FDeEIsSUFDSSxRQUFRLENBQUMsSUFBSTtvQ0FDYixLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJO29DQUM1QixLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQ3ZEO29DQUNFLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztpQ0FDakQ7NkJBQ0osQ0FBQyxDQUFDO3lCQUNOLENBQUMsQ0FBQztxQkFDTjtpQkFDSjthQUNKLENBQUMsQ0FBQztTQUNOO0tBQ0o7SUFFTSxtREFBd0IsR0FBL0IsVUFBZ0MsVUFBa0I7UUFDOUMsT0FBT0EsWUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7S0FDdEQ7SUFFTSxrREFBdUIsR0FBOUIsVUFBK0IsVUFBa0I7O1FBRTdDLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzlCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixPQUFPLGNBQWMsQ0FBQztLQUN6QjtJQUVNLDhDQUFtQixHQUExQjtRQUFBLGlCQXNKQzs7OztRQWxKR08sVUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJO1lBQzdDLElBQUksSUFBSSxFQUFFO2dCQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQ3RCO2dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO2lCQUMzQjtnQkFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDM0I7YUFDSjtTQUNKLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBR1AsWUFBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdEQsSUFBSSxVQUFVLEdBQUc7WUFDYixJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLFFBQVEsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUVGLElBQUksaUJBQWlCLEdBQUcsVUFBQSxJQUFJO1lBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O2dCQUUzQyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ3pCLElBQUksS0FBSyxHQUFHLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqRSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO3dCQUNyQixJQUFJOzRCQUNBLEtBQUssQ0FBQyxRQUFRLEdBQUd5QixnQkFBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQzVDO3dCQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUNSLE1BQU0sQ0FBQyxLQUFLLENBQ1IsK0dBQStHLENBQ2xILENBQUM7eUJBQ0w7d0JBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUNsQixLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQzt3QkFDdEIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ25DO29CQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7d0JBQzNCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkM7aUJBQ0o7YUFDSjtpQkFBTTs7Z0JBRUgsSUFBSSxTQUFTLEdBQUcsS0FBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFekQsSUFBSSxTQUFTLEVBQUU7b0JBQ1gsSUFBSSxNQUFNLEdBQUdBLGdCQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDekMsSUFBSSxNQUFNLEVBQUU7d0JBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNWLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7d0JBQ3hCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQzt3QkFDM0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDbEIsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN0QixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7Z0NBQ3JCLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0NBQ3RCLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO29DQUNyQixJQUFJLEVBQUUsV0FBVztvQ0FDakIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO29DQUM5QixJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7aUNBQ3ZCLENBQUMsQ0FBQzs2QkFDTjt5QkFDSjt3QkFDRCxJQUFJLENBQUMsY0FBYyxFQUFFOzRCQUNqQixVQUFVLENBQUMsUUFBUSwwQ0FBTyxVQUFVLENBQUMsUUFBUSxrQkFBSyxNQUFNLFNBQUMsQ0FBQzt5QkFDN0Q7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKLENBQUM7UUFFRixJQUFJLFdBQVcsR0FBR3pCLFlBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLElBQUksV0FBVyxFQUFFO1lBQ2IsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7OztTQUdsQztRQUVELElBQUksaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBRWxDLElBQUksZUFBZSxHQUFHLFVBQUEsS0FBSztZQUN2QixLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2FBQ3pDO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDaEIsQ0FBQztRQUVGLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7UUFJaEQsSUFBSSxnQkFBZ0IsR0FBRyxVQUFDLEdBQUcsRUFBRSxVQUFVO1lBQ25DLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtnQkFDZCxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ3hCLElBQUksS0FBSyxHQUFHLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFBRTt3QkFDOUIsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFOzRCQUNaLEtBQUssQ0FBQyxRQUFRLEdBQUd5QixnQkFBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3pDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQzs0QkFDbEIsS0FBSyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7NEJBQ3RCLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUNuQztxQkFDSjtpQkFDSjthQUNKO2lCQUFNO2dCQUNILElBQUksS0FBSyxHQUFHLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFO29CQUM5QixJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7d0JBQ1osS0FBSyxDQUFDLFFBQVEsR0FBR0EsZ0JBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN6QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7d0JBQ2xCLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO3dCQUN0QixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDbkM7aUJBQ0o7YUFDSjtTQUNKLENBQUM7UUFFRixJQUFJLGdCQUFnQixHQUFHLFVBQUEsS0FBSztZQUN4QixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFDMUIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRTt3QkFDaEMsSUFBSSxLQUFLLEdBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBQ3pFLElBQUksUUFBTSxHQUFxQnpCLFlBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLGdCQUFnQixFQUFFOzRCQUN6RCxJQUFJLEVBQUUsS0FBSzt5QkFDZCxDQUFDLENBQUM7d0JBQ0gsSUFBSSxRQUFNLEVBQUU7NEJBQ1IsSUFBSSxVQUFVLEdBQXFCLEVBQUUsQ0FBQzs0QkFDdEMsVUFBVSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7NEJBQzNCLFVBQVUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDOzRCQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLFFBQU0sQ0FBQyxJQUFJLENBQUM7NEJBQ2hDLGdCQUFnQixDQUFDLFFBQU0sRUFBRSxVQUFVLENBQUMsQ0FBQzs0QkFFckMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDOzRCQUNoQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQy9DO3FCQUNKO29CQUNELGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkM7YUFDSjtTQUNKLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXBDLE9BQU8saUJBQWlCLENBQUM7S0FDNUI7SUFFTSwrQ0FBb0IsR0FBM0I7UUFBQSxpQkEwQkM7UUF6QkcsSUFBSSxpQkFBaUIsR0FBRyxVQUFDLEdBQUcsRUFBRSxNQUFPO1lBQ2pDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO2dCQUNmLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUU7b0JBQzFCLElBQUksUUFBUSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25ELElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRTt3QkFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7cUJBQzlCO29CQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BCO2FBQ0o7WUFDRCxPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUM7O1FBR0ZBLFlBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFBLGVBQWU7WUFDbkNBLFlBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxVQUFBLFVBQVU7Z0JBQzdDQSxZQUFDLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxPQUFPLEVBQUUsVUFBQSxNQUFNO29CQUMxQixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRTt3QkFDakMsTUFBTSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO3FCQUN4QztpQkFDSixDQUFDLENBQUM7YUFDTixDQUFDLENBQUM7U0FDTixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN0RDtJQUVNLDhDQUFtQixHQUExQixVQUEyQixZQUFvQixFQUFFLE1BQWtCO1FBQy9ELE9BQU9VLFlBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLDZDQUE2QyxDQUFDLENBQUMsSUFBSSxDQUNqRixVQUFBLElBQUk7WUFDQSxJQUFJLFFBQVEsR0FBUU8scUJBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDakMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxhQUFhLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUV0RCxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0MsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHWCxlQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3JFO1lBRUQsT0FBT0ksWUFBVSxDQUFDLEtBQUssQ0FDbkIsWUFBWSxHQUFHSixlQUFJLENBQUMsR0FBRyxHQUFHLDRCQUE0QixFQUN0RCxNQUFNLENBQ1QsQ0FBQztTQUNMLEVBQ0QsVUFBQSxHQUFHLElBQUksT0FBQSxPQUFPLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLEdBQUEsQ0FDaEUsQ0FBQztLQUNMO0lBRU0sdUNBQVksR0FBbkI7UUFDSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLFlBQVksR0FBRyxVQUFBLEtBQUs7WUFDcEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO2dCQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ1g7WUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFDMUIsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkM7YUFDSjtTQUNKLENBQUM7UUFFRixLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdkIsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQztRQUVELE9BQU8sRUFBRSxDQUFDO0tBQ2I7SUFFTSxzQ0FBVyxHQUFsQjtRQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM1QjtJQUVNLDZDQUFrQixHQUF6QjtRQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDdkM7SUFFTSwyQ0FBZ0IsR0FBdkIsVUFBd0IsSUFBSTtRQUN4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFO1lBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNuRCxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDM0MsSUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUTt3QkFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUN0RTt3QkFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDO3FCQUNqQjtpQkFDSjthQUNKO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVNLCtDQUFvQixHQUEzQixVQUE0QixVQUFzQjs7UUFBbEQsaUJBZ0RDO1FBL0NHLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN0QixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUNMLGtCQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQztZQUN6RSxRQUNJMEIsWUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuREEsWUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQ2pEO1NBQ0wsQ0FBQyxDQUFDO1FBRUgsSUFBSSxvQ0FBb0MsR0FBRyxFQUFFLENBQUM7Z0NBRW5DLFVBQVU7O1lBRWpCLElBQUksNEJBQTRCLEdBQUcsS0FBSyxDQUFDO1lBQzVCLFVBQVUsQ0FBQyxjQUFjLENBQUMsVUFBQSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSzFCLGtCQUFVLENBQUMsaUJBQWlCLEVBQUU7b0JBQzlDLElBQUksS0FBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRTt3QkFDdkMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO3FCQUN2QztpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNmLEVBQUU7WUFDSCxJQUFJLDRCQUE0QixFQUFFO2dCQUM5QixvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekQ7OztZQWJMLEtBQXlCLElBQUEsZ0JBQUEsU0FBQSxXQUFXLENBQUEsd0NBQUE7Z0JBQS9CLElBQU0sVUFBVSx3QkFBQTt3QkFBVixVQUFVO2FBY3BCOzs7Ozs7Ozs7OztZQUdELEtBQXlCLElBQUEseUNBQUEsU0FBQSxvQ0FBb0MsQ0FBQSwwRkFBQSw0SUFBRTtnQkFBMUQsSUFBTSxVQUFVLGlEQUFBO2dCQUNqQixJQUFNLHFCQUFxQixHQUFHLFVBQVU7cUJBQ25DLGdCQUFnQixFQUFFO3FCQUNsQiwwQkFBMEIsRUFBRSxDQUFDO2dCQUNsQyxJQUNJLENBQUMwQixZQUFJLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUM7b0JBQ2pEQSxZQUFJLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUM7b0JBQ2pEQSxZQUFJLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUM7b0JBQ2hELENBQUNBLFlBQUksQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxFQUNwRDtvQkFDRSxNQUFNLElBQUksS0FBSyxDQUNYLGtEQUFnRCxxQkFBcUIsQ0FBQyxXQUFXLEVBQUksQ0FDeEYsQ0FBQztpQkFDTDtnQkFDRCxJQUFJQSxZQUFJLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsRUFBRTtvQkFDbkQsVUFBVSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQ3ZGO2FBQ0o7Ozs7Ozs7OztRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFTSwyQ0FBZ0IsR0FBdkIsVUFBd0IsVUFBc0I7O1FBQTlDLGlCQTJKQztRQTFKRyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUM7UUFDdEIsSUFBTSxjQUFjLEdBQUcsSUFBSTthQUN0QixvQkFBb0IsQ0FBQzFCLGtCQUFVLENBQUMsYUFBYSxDQUFDO2FBQzlDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBMEIsWUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO1FBRXRFLElBQUksdUNBQXVDLEdBQUcsRUFBRSxDQUFDO2dDQUV0QyxhQUFhOztZQUVwQixJQUFJLDRCQUE0QixHQUFHLEtBQUssQ0FBQztZQUM1QixhQUFhLENBQUMsY0FBYyxDQUFDLFVBQUEsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUsxQixrQkFBVSxDQUFDLGlCQUFpQixFQUFFO29CQUM5QyxJQUFJLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUU7d0JBQ3ZDLDRCQUE0QixHQUFHLElBQUksQ0FBQztxQkFDdkM7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZixFQUFFO1lBQ0gsSUFBSSw0QkFBNEIsRUFBRTtnQkFDOUIsdUNBQXVDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQy9EOzs7WUFiTCxLQUE0QixJQUFBLG1CQUFBLFNBQUEsY0FBYyxDQUFBLDhDQUFBO2dCQUFyQyxJQUFNLGFBQWEsMkJBQUE7d0JBQWIsYUFBYTthQWN2Qjs7Ozs7Ozs7O2dDQUdVLGFBQWE7WUFDcEIsSUFBSSx1QkFBdUIsR0FBRyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQ2pFLGNBQWMsRUFDZCxpQkFBaUIsR0FBRyxFQUFFLEVBQ3RCLHVCQUF1QixHQUFHLEtBQUssRUFDL0IsY0FBYyxHQUFHLEtBQUssQ0FBQzs7WUFHM0IsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFFN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7Z0JBQ2IsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUNsQyxrQkFBa0IsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUN4QyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVWLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFO29CQUN4QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ2pDLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQVksRUFDOUQsV0FBVyxTQUFBLENBQUM7d0JBRWhCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFOzRCQUNoQyxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO3lCQUMxRDt3QkFFRCxJQUFJLFVBQVUsS0FBSyx1QkFBdUIsRUFBRTs0QkFDeEMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDOzRCQUMvQixjQUFjLEdBQUcsQ0FBQyxDQUFDOzRCQUNuQixNQUFNO3lCQUNUO3dCQUNELElBQUksV0FBVyxLQUFLLHVCQUF1QixFQUFFOzRCQUN6Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7NEJBQy9CLGNBQWMsR0FBRyxJQUFJLENBQUM7NEJBQ3RCLGlCQUFpQixHQUFHLFVBQVUsQ0FBQzs0QkFDL0IsY0FBYyxHQUFHLENBQUMsQ0FBQzs0QkFDbkIsTUFBTTt5QkFDVDtxQkFDSjtpQkFDSjthQUNKLENBQUMsQ0FBQztZQUVILElBQUkscUJBQXFCLFNBQUEsQ0FBQztZQUUxQixJQUFJLHVCQUF1QixFQUFFO2dCQUN6QixJQUFJLE9BQU8sY0FBYyxLQUFLLFdBQVcsRUFBRTtvQkFDdkMsSUFBTSxjQUFjLEdBQUcsVUFBQSxJQUFJO3dCQUN2QixPQUFPLE9BQU9xQixLQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQztxQkFDeEQsQ0FBQztvQkFFRixJQUFNLFlBQVksR0FBRyxVQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYTt3QkFDL0MsSUFBSSxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQzt3QkFDcEMsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFOzRCQUNuQixPQUFPLEVBQUUsQ0FBQzt5QkFDYjt3QkFDRCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQ2QsS0FBSyxFQUNMLE9BQU8sR0FBRyxFQUFFLENBQUM7d0JBQ2pCLElBQUksQ0FBQyxhQUFhLEVBQUU7NEJBQ2hCLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7NEJBQ3hCLFNBQVMsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7eUJBQ3ZDO3dCQUNELE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7NEJBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3BCLFVBQVUsR0FBRyxLQUFLLEdBQUcsWUFBWSxDQUFDO3lCQUNyQzt3QkFDRCxPQUFPLE9BQU8sQ0FBQztxQkFDbEIsQ0FBQztvQkFFRixJQUFNLFdBQVcsR0FBR2hCLGVBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQ3JELElBQU0sa0JBQWtCLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixFQUFFLENBQUM7b0JBQ3BFLElBQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFFOUQsSUFBSSxVQUFVLEdBQUdBLGVBQUksQ0FBQyxPQUFPLENBQ3pCLFdBQVcsR0FBRyxHQUFHLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsS0FBSyxDQUN2RSxDQUFDO29CQUVGLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUM1QixJQUFJLGNBQWMsR0FBRyxZQUFZLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDckUsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7NEJBRTNCLElBQUksVUFBVSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDbkMsSUFBSSxRQUFRLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ3pELFVBQVU7Z0NBQ04sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzt5QkFDcEU7NkJBQU07OzRCQUVILFVBQVU7Z0NBQ05BLGVBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixHQUFHLEtBQUssQ0FBQzt5QkFDcEU7cUJBQ0o7b0JBQ0QsSUFBTSxnQkFBZ0IsR0FDbEIsT0FBT2dCLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssV0FBVzswQkFDOUNBLEtBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDOzBCQUM3QkEsS0FBRyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM5QyxJQUFJLGdCQUFnQixFQUFFO3dCQUNsQixJQUFJLFlBQVksR0FBRyxjQUFjOzhCQUMzQixpQkFBaUI7OEJBQ2pCLHVCQUF1QixDQUFDO3dCQUM5QixxQkFBcUI7NEJBQ2pCLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUM3RDtpQkFDSjthQUNKO2lCQUFNOztnQkFFSCxxQkFBcUIsR0FBRyxhQUFhO3FCQUNoQyxhQUFhLEVBQUU7cUJBQ2YsZ0JBQWdCLEVBQUU7cUJBQ2xCLDBCQUEwQixFQUFFLENBQUM7YUFDckM7WUFFRCxJQUFJLENBQUNLLFlBQUksQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO2dCQUNwRCxNQUFNLElBQUksS0FBSyxDQUNYLGtEQUFnRCxxQkFBcUIsQ0FBQyxXQUFXLEVBQUksQ0FDeEYsQ0FBQzthQUNMO1lBRUQsSUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUMsMkJBQTJCLENBQ3JFMUIsa0JBQVUsQ0FBQyxzQkFBc0IsQ0FDcEMsQ0FBQztZQUNGLElBQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUMzREEsa0JBQVUsQ0FBQyxzQkFBc0IsQ0FDcEMsQ0FBQztZQUNGLElBQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1RSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDaEQsa0JBQWtCLENBQUMsY0FBYyxDQUM3QixXQUFXLEVBQ1gsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBQSxDQUFDLENBQ3RELENBQUM7Ozs7WUE5SE4sS0FBNEIsSUFBQSw0Q0FBQSxTQUFBLHVDQUF1QyxDQUFBLGdHQUFBO2dCQUE5RCxJQUFNLGFBQWEsb0RBQUE7d0JBQWIsYUFBYTthQStIdkI7Ozs7Ozs7OztRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFTSw0Q0FBaUIsR0FBeEIsVUFBeUIsVUFBc0I7O1FBQS9DLGlCQXVEQztRQXRERyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUM7UUFDdEIsSUFBTSx5QkFBeUIsR0FBRyxJQUFJO2FBQ2pDLG9CQUFvQixDQUFDQSxrQkFBVSxDQUFDLHdCQUF3QixDQUFDO2FBQ3pELE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMwQixZQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsR0FBQSxDQUFDLENBQUM7UUFFekUsSUFBSSxrREFBa0QsR0FBRyxFQUFFLENBQUM7Z0NBRWpELHdCQUF3Qjs7WUFFL0IsSUFBSSw0QkFBNEIsR0FBRyxLQUFLLENBQUM7WUFDNUIsd0JBQXdCLENBQUMsY0FBYyxDQUFDLFVBQUEsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUsxQixrQkFBVSxDQUFDLGlCQUFpQixFQUFFO29CQUM5QyxJQUFJLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUU7d0JBQ3ZDLDRCQUE0QixHQUFHLElBQUksQ0FBQztxQkFDdkM7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZixFQUFFO1lBQ0gsSUFBSSw0QkFBNEIsRUFBRTtnQkFDOUIsa0RBQWtELENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7YUFDckY7OztZQWJMLEtBQXVDLElBQUEsOEJBQUEsU0FBQSx5QkFBeUIsQ0FBQSxvRUFBQTtnQkFBM0QsSUFBTSx3QkFBd0Isc0NBQUE7d0JBQXhCLHdCQUF3QjthQWNsQzs7Ozs7Ozs7Ozs7WUFHRCxLQUF1QyxJQUFBLHVEQUFBLFNBQUEsa0RBQWtELENBQUEsc0hBQUEsc0xBQUU7Z0JBQXRGLElBQU0sd0JBQXdCLCtEQUFBO2dCQUMvQixJQUFNLGdDQUFnQyxHQUFHLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNoRixJQUFJLGdDQUFnQyxFQUFFO29CQUNsQyxJQUFJO3dCQUNBLElBQU0sc0NBQXNDLEdBQ3hDLGdDQUFnQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQ3hELElBQUksc0NBQXNDLEVBQUU7NEJBQ3hDLElBQU0scUJBQXFCLEdBQ3ZCLHNDQUFzQyxDQUFDLDBCQUEwQixFQUFFLENBQUM7NEJBQ3hFLElBQ0ksQ0FBQzBCLFlBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQztnQ0FDakRBLFlBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUM7Z0NBQ3hDQSxZQUFJLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUM7Z0NBQ2hELENBQUNBLFlBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsRUFDM0M7Z0NBQ0UsTUFBTSxJQUFJLEtBQUssQ0FDWCxrREFBZ0QscUJBQXFCLENBQUMsV0FBVyxFQUFJLENBQ3hGLENBQUM7NkJBQ0w7NEJBQ0QsSUFBSSxPQUFPLHFCQUFxQixDQUFDLHFCQUFxQixLQUFLLFdBQVcsRUFBRTtnQ0FDcEUsd0JBQXdCLENBQUMsZUFBZSxDQUNwQyxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUMxRCxDQUFDOzZCQUNMO3lCQUNKO3FCQUNKO29CQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7aUJBQ2pCO2FBQ0o7Ozs7Ozs7OztRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7O0lBTU0sK0NBQW9CLEdBQTNCLFVBQTRCLFVBQXNCOztRQUM5QyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUM7UUFFdEIsSUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsc0JBQXNCLENBQUMsVUFBQSxDQUFDO1lBQzFELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFNLElBQUksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO2dCQUNyRSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO2FBQzVDO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakIsQ0FBQyxDQUFDO1FBRUgsSUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUM7Z0NBRTdDLFFBQVE7WUFDZixJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsRUFBRTs7YUFFNUI7WUFDRCxRQUFRLENBQUMsZUFBZSxDQUFDLFVBQUEsTUFBTSxJQUFJLE9BQUEsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBQSxDQUFDLENBQUM7OztZQUp6RSxLQUF1QixJQUFBLEtBQUEsU0FBQSxXQUFXLENBQUMsb0JBQW9CLENBQUMxQixrQkFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFBLGdCQUFBO2dCQUE3RSxJQUFNLFFBQVEsV0FBQTt3QkFBUixRQUFRO2FBS2xCOzs7Ozs7Ozs7UUFFRCxPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBNkJNLDBEQUErQixHQUF0QyxVQUNJLFdBQXNDLEVBQ3RDLElBQWEsRUFDYixVQUF5QjtRQUV6QixXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQW1DO1lBQzdELE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUMsUUFBK0I7Z0JBQ3ZELElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQ3RDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQy9DLFFBQVEsWUFBWTtvQkFDaEIsS0FBSyxNQUFNLENBQUM7b0JBQ1osS0FBSyxZQUFZLENBQUM7b0JBQ2xCLEtBQUssUUFBUSxDQUFDO29CQUNkLEtBQUssV0FBVzt3QkFDWixJQUFJLG1CQUFtQixFQUFFOzRCQUNyQixJQUFJLG1CQUFtQixDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxhQUFhLEVBQUU7OztnQ0FHdkQsSUFDSSxtQkFBbUIsQ0FBQyxJQUFJLEtBQUtBLGtCQUFVLENBQUMsd0JBQXdCLEVBQ2xFO29DQUNFLElBQUksOEJBQThCLEdBQzFCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFDdEMsK0JBQStCLFNBQUEsQ0FBQztvQ0FDcEMsSUFBSSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUU7d0NBQ2hDLCtCQUErQjs0Q0FDM0IsbUJBQW1CLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dDQUM3QyxJQUFJLE1BQU0sR0FDTnlCLGFBQVcsQ0FBQyx5Q0FBeUMsQ0FDakQsK0JBQStCOzRDQUMzQixHQUFHOzRDQUNILDhCQUE4QixFQUNsQyxVQUFVLENBQ2IsQ0FBQzt3Q0FDTixJQUFJLE1BQU0sS0FBSyxFQUFFLEVBQUU7NENBQ2YsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzs0Q0FDN0IsbUJBQW1CLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzt5Q0FDckM7cUNBQ0o7aUNBQ0o7NkJBQ0o7eUJBQ0o7d0JBQ0QsTUFBTTtpQkFDYjthQUNKLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0tBQ3RCO0lBQ0wsdUJBQUM7QUFBRCxDQUFDLElBQUE7QUFFRCx5QkFBZSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7O1NDNTBCN0IscUJBQXFCLENBQUMsSUFBMEI7SUFDNUQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtRQUN0QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQy9FLENBQUMsR0FBRyxDQUFDLEVBQ1UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLE1BQ2hELEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPO1lBRW5ELEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2RCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7b0JBQ2xCLElBQUksSUFBSSxHQUF5QixXQUFXLENBQUMsSUFBNEIsQ0FBQztvQkFDMUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO3dCQUNmLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ25DLElBQUksSUFBSSxLQUFLLHFCQUFxQixFQUFFOzRCQUNoQyxNQUFNLEdBQUcsSUFBSSxDQUFDO3lCQUNqQjtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7S0FDSjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCOztTQ3hCZ0Isc0JBQXNCLENBQUMsSUFBMEI7SUFDN0QsSUFBSSxNQUFNLENBQUM7SUFDWCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFDdEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25GLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDTCxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBRW5ELEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2RCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7b0JBQ2xCLElBQUksSUFBSSxHQUF5QixXQUFXLENBQUMsSUFBNEIsQ0FBQztvQkFDMUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO3dCQUNmLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ25DLElBQUksSUFBSSxLQUFLLHFCQUFxQixFQUFFOzRCQUNoQyxNQUFNLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQzt5QkFDcEM7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO0tBQ0o7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQjs7U0N2QmdCLHNCQUFzQixDQUFDLEVBQUU7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNMLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDakIsSUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDakMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQ1gsTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNmO0lBQ0QsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQixJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUM1RCxNQUFNLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQy9DO1FBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtZQUNiLE1BQU0sSUFBSSxJQUFJLENBQUM7U0FDbEI7S0FDSjtJQUNELElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLENBQUM7S0FDakI7O0lBRUQsTUFBTSxJQUFJLE1BQU0sQ0FBQztJQUNqQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUU7UUFDVCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLekIsa0JBQVUsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0QsTUFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ2pDO2FBQU0sSUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyx3QkFBd0I7WUFDcEQsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2xCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUNkO1lBQ0UsTUFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM1QzthQUFNLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUtBLGtCQUFVLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2xFLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUMxQjtLQUNKO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEI7O1NDbENnQixnQ0FBZ0MsQ0FBQyxHQUFHO0lBQ2hELElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQztJQUV6QixJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzdDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUMsUUFBUSxFQUFFLEtBQUs7WUFDbkMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUNmLGNBQWMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDL0M7WUFDRCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUtBLGtCQUFVLENBQUMsYUFBYSxFQUFFO29CQUN4RCxjQUFjLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztpQkFDM0Q7cUJBQU0sSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxXQUFXLEVBQUU7b0JBQzdELGNBQWMsSUFBSSxNQUFNLENBQUM7aUJBQzVCO3FCQUFNLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUtBLGtCQUFVLENBQUMsWUFBWSxFQUFFO29CQUM5RCxjQUFjLElBQUksT0FBTyxDQUFDO2lCQUM3QjtxQkFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLGFBQWEsRUFBRTtvQkFDL0QsY0FBYyxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDbEU7cUJBQU07b0JBQ0gsY0FBYyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2lCQUMvQzthQUNKO1lBQ0QsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQyxjQUFjLElBQUksSUFBSSxDQUFDO2FBQzFCO1NBQ0osQ0FBQyxDQUFDO0tBQ047SUFFRCxjQUFjLElBQUksR0FBRyxDQUFDO0lBRXRCLE9BQU8sY0FBYyxDQUFDO0FBQzFCOztBQ2pCQSxJQUFNMkIsUUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QixJQUFBeEIsUUFBTSxHQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBdEIsQ0FBdUI7QUFFckM7SUFHSSxxQkFBb0IsV0FBMkI7UUFBM0IsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBRnZDLG9CQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztLQUVHOzs7O0lBTTVDLDJDQUFxQixHQUE1QixVQUE2QixJQUFhOzs7O1FBSXRDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3pCO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLSCxrQkFBVSxDQUFDLFlBQVksRUFBRTtZQUM5QyxPQUFPLE9BQU8sQ0FBQztTQUNsQjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxXQUFXLEVBQUU7WUFDN0MsT0FBTyxNQUFNLENBQUM7U0FDakI7S0FDSjtJQUVPLHlDQUFtQixHQUEzQixVQUE0QixJQUFXLEVBQUUsTUFBeUM7UUFDOUVELFlBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQUEsR0FBRztZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixNQUFNLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7YUFDakQ7U0FDSixDQUFDLENBQUM7S0FDTjtJQUVPLHdDQUFrQixHQUExQixVQUEyQixJQUFJLEVBQUUsYUFBYTtRQUMxQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUU5QixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtvQkFDckMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFO3dCQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUM5QjtpQkFDSjthQUNKO1lBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbkIsT0FBTyxNQUFNLENBQUM7YUFDakI7U0FDSjthQUFNO1lBQ0gsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzlFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRTtvQkFDNUQsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0IsT0FBTyxNQUFNLENBQUM7aUJBQ2pCO2FBQ0o7U0FDSjtRQUVELE9BQU8sU0FBUyxDQUFDO0tBQ3BCO0lBRU8sc0NBQWdCLEdBQXhCLFVBQXlCLFVBQVU7UUFBbkMsaUJBcUJDO1FBcEJHLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUVyQkEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBQyxTQUFjO1lBQ2pDLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRTtnQkFDdEIsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtvQkFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ3pEO2dCQUNELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7b0JBQ2pDLElBQUksSUFBSSxHQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMvRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO3dCQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixDQUMvQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FDakMsQ0FBQztxQkFDTDtvQkFDRCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMxQjthQUNKO1NBQ0osQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUM7S0FDdEI7SUFFTyxvQ0FBYyxHQUF0QixVQUF1QixHQUFHO1FBQTFCLGlCQTJDQztRQTFDRyxJQUFJLEdBQUcsQ0FBQyxVQUFRLENBQUEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE9BQU8sS0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsaUJBQWMsQ0FBQztTQUNsRTtRQUVELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFRLENBQUEsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJO1lBQzlCLElBQUksT0FBTyxHQUFHVyxvQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7b0JBQy9CLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTt3QkFDL0IsSUFBSSxHQUFHLFFBQVEsQ0FBQztxQkFDbkI7b0JBQ0QsT0FBTyxLQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyx1QkFBaUIsSUFBSSxVQUNsRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQ1gsSUFBSSxDQUFDLElBQUksU0FBTSxDQUFDO2lCQUM3QjtxQkFBTTtvQkFDSCxJQUFJLElBQUksR0FBR1Esb0JBQWtCLENBQUMsVUFBVSxDQUNwQyxPQUFPLENBQUMsSUFBSSxFQUNaVixlQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FDeEMsQ0FBQztvQkFDRixPQUFPLEtBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQ3hDLEdBQUcsQ0FDTixvQkFBYyxJQUFJLDZCQUFxQixJQUFJLENBQUMsSUFBSSxTQUFNLENBQUM7aUJBQzNEO2FBQ0o7aUJBQU0sSUFBSVcsZUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzdDLElBQUksSUFBSSxHQUFHQSxlQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0MsT0FBTyxLQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUN4QyxHQUFHLENBQ04sb0JBQWMsSUFBSSw2QkFBcUIsSUFBSSxDQUFDLElBQUksU0FBTSxDQUFDO2FBQzNEO2lCQUFNO2dCQUNILElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUN4QixPQUFPLEtBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQUssSUFBSSxDQUFDLElBQU0sQ0FBQztpQkFDckU7cUJBQU07b0JBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUNYLE9BQU8sS0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQU0sQ0FBQztxQkFDOUI7eUJBQU07d0JBQ0gsT0FBTyxFQUFFLENBQUM7cUJBQ2I7aUJBQ0o7YUFDSjtTQUNKLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBTSxNQUFNLGNBQVcsQ0FBQztLQUMzRTtJQUVPLHVDQUFpQixHQUF6QixVQUEwQixHQUFHO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0tBQ2xDO0lBRU8sd0NBQWtCLEdBQTFCLFVBQTJCLElBQUk7UUFBL0IsaUJBaUdDO1FBaEdHLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUV2QixhQUFhLEdBQUcsSUFBSTthQUNmLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDSixJQUFNLE9BQU8sR0FBR1Qsb0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLE9BQU8sRUFBRTtnQkFDVCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO29CQUMvQixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7d0JBQy9CLElBQUksR0FBRyxRQUFRLENBQUM7cUJBQ25CO29CQUNELE9BQU8sS0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsdUJBQWlCLElBQUksVUFDakUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGdCQUNYLEdBQUcsQ0FBQyxJQUFJLFNBQU0sQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0gsSUFBSSxJQUFJLEdBQUdRLG9CQUFrQixDQUFDLFVBQVUsQ0FDcEMsT0FBTyxDQUFDLElBQUksRUFDWlYsZUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQ3hDLENBQUM7b0JBQ0YsT0FBTyxLQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUN2QyxHQUFHLENBQ04sb0JBQWMsSUFBSSw2QkFBcUIsR0FBRyxDQUFDLElBQUksU0FBTSxDQUFDO2lCQUMxRDthQUNKO2lCQUFNLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRTtnQkFDM0IsT0FBTyxRQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQUssR0FBRyxDQUFDLElBQU0sQ0FBQzthQUN4QztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFRLENBQUEsRUFBRTtnQkFDckIsT0FBTyxLQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ25DO2lCQUFNLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO2dCQUNuQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNwRDtpQkFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLElBQUksS0FBS1Isa0JBQVUsQ0FBQyxhQUFhLEVBQUU7Z0JBQ2hFLE9BQU8sTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzthQUM5QztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxhQUFhLEVBQUU7Z0JBQzFELE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2FBQy9CO2lCQUFNLElBQ0gsR0FBRyxDQUFDLElBQUk7Z0JBQ1IsR0FBRyxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxzQkFBc0I7Z0JBQzlDLEdBQUcsQ0FBQyxRQUFRO2dCQUNaLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDekI7Z0JBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNMLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDekIsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDakIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDbEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQzNDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUU7d0JBQ2IsTUFBTSxJQUFJLElBQUksQ0FBQztxQkFDbEI7aUJBQ0o7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQztnQkFDZCxPQUFPLE1BQU0sQ0FBQzthQUNqQjtpQkFBTSxJQUNILEdBQUcsQ0FBQyxJQUFJO2dCQUNSLEdBQUcsQ0FBQyxJQUFJLEtBQUtBLGtCQUFVLENBQUMsYUFBYTtnQkFDckMsR0FBRyxDQUFDLFVBQVU7Z0JBQ2QsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUMzQjtnQkFDRSxPQUFPLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLHVCQUF1QixFQUFFO2dCQUNwRSxPQUFPLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNLElBQUltQixlQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDNUMsSUFBTSxJQUFJLEdBQUdBLGVBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxPQUFPLEtBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQ3ZDLEdBQUcsQ0FDTixvQkFBYyxJQUFJLDZCQUFxQixHQUFHLENBQUMsSUFBSSxTQUFNLENBQUM7YUFDMUQ7aUJBQU07Z0JBQ0gsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO29CQUNWLElBQUksd0JBQXdCLEdBQUcsRUFBRSxDQUFDO29CQUNsQyxJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUM7b0JBQ3BCLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTt3QkFDVix3QkFBd0IsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDO3FCQUN4QztvQkFDRCxJQUNJLEdBQUcsQ0FBQyxJQUFJLEtBQUtuQixrQkFBVSxDQUFDLFlBQVk7d0JBQ3BDLEdBQUcsQ0FBQyxVQUFVO3dCQUNkLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUNyQjt3QkFDRSx3QkFBd0IsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQzt3QkFDaEQsU0FBUyxHQUFHLEtBQUssQ0FBQztxQkFDckI7b0JBQ0QsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO3dCQUNkLHdCQUF3QixJQUFJLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDM0Q7b0JBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO3dCQUNWLHdCQUF3QixJQUFJLFNBQVMsR0FBRyxHQUFHLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzFFO29CQUNELE9BQU8sd0JBQXdCLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtvQkFDakIsT0FBTyxLQUFHLEdBQUcsQ0FBQyxJQUFNLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNILE9BQU8sS0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUcsQ0FBQztpQkFDdEQ7YUFDSjtTQUNKLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEIsT0FBTyxhQUFhLENBQUM7S0FDeEI7SUFFTyxpQ0FBVyxHQUFuQixVQUFvQixJQUFhLEVBQUUsVUFBeUI7UUFDeEQsSUFBSSxRQUE2QixDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM1QixRQUFRLEdBQUdDLFVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMxRTthQUFNO1lBQ0gsUUFBUSxHQUFHQSxVQUFFLENBQUMsNkJBQTZCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyRTtRQUNELE9BQU8sUUFBUSxDQUFDO0tBQ25CO0lBRU8saUNBQVcsR0FBbkIsVUFBb0IsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVO1FBQXZELGlCQWdGQztRQS9FRyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFO1lBQ25CLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNsQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU3RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN0QixTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUc7b0JBQ2xCLElBQUksRUFBRSxRQUFRO29CQUNkLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsU0FBUztpQkFDMUIsQ0FBQzthQUNMO1lBRUQsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLRCxrQkFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDOUMsSUFBSSxZQUFZLEdBQUc7b0JBQ2YsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLE1BQU07b0JBQ1osVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLGtCQUFrQixFQUFFLEVBQUU7b0JBQ3RCLElBQUksRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUEsQ0FBQztvQkFDckUsVUFBVSxFQUFFLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTTtvQkFDMUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO2lCQUM1RCxDQUFDO2dCQUVGLElBQUksWUFBWSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQ3RELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQ3JELFlBQVksRUFDWixVQUFVLENBQ2IsQ0FBQztvQkFDRixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTt3QkFDaEMsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEUsWUFBWSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQzt3QkFDakQsWUFBWSxDQUFDLFdBQVcsR0FBR0csUUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7cUJBQ3pEO2lCQUNKO2dCQUVELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUMxRCxZQUFZLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFEO2dCQUNELElBQUksWUFBWSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdELFlBQVksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQ3JDLFlBQVksQ0FBQyxJQUFJLEVBQ2pCLFlBQVksQ0FBQyxTQUFTLENBQ3pCLENBQUM7aUJBQ0w7cUJBQU0sSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDMUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2hFO2dCQUVELFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLSCxrQkFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDOUMsSUFBSSxZQUFZLEdBQUc7b0JBQ2YsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDakUsVUFBVSxFQUFFLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDdEUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO2lCQUM1RCxDQUFDO2dCQUVGLElBQUksWUFBWSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQ3RELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQ3JELFlBQVksRUFDWixVQUFVLENBQ2IsQ0FBQztvQkFDRixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTt3QkFDaEMsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEUsWUFBWSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQzt3QkFDakQsWUFBWSxDQUFDLFdBQVcsR0FBR0csUUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7cUJBQ3pEO2lCQUNKO2dCQUVELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUMxRCxZQUFZLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFEO2dCQUVELFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2FBQ25EO1NBQ0o7S0FDSjtJQUVPLDBDQUFvQixHQUE1QixVQUE2QixTQUF1QjtRQUNoRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ2pDLElBQUksdUJBQXVCLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ25FLFFBQ0ksdUJBQXVCLEtBQUssV0FBVyxJQUFJLHVCQUF1QixLQUFLLFdBQVcsRUFDcEY7U0FDTDthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7S0FDSjtJQUVPLHdDQUFrQixHQUExQixVQUEyQixTQUFTO1FBQ2hDLE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVO2NBQ2hDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxZQUFZO2NBQ3JELEtBQUssQ0FBQztLQUNmO0lBRU8sK0JBQVMsR0FBakIsVUFBa0IsTUFBTTs7OztRQUlwQixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBTSxTQUFTLEdBQVksTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQzVDLFVBQUEsUUFBUSxJQUFJLE9BQUEsUUFBUSxDQUFDLElBQUksS0FBS0gsa0JBQVUsQ0FBQyxjQUFjLEdBQUEsQ0FDMUQsQ0FBQztZQUNGLElBQUksU0FBUyxFQUFFO2dCQUNYLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjs7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDeEMsSUFBTSxTQUFTLEdBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RSxJQUFJLFNBQVMsRUFBRTtnQkFDWCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdEM7SUFFTyxpQ0FBVyxHQUFuQixVQUFvQixNQUFNO1FBQ3RCLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFNLFdBQVcsR0FBWSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDOUMsVUFBQSxRQUFRLElBQUksT0FBQSxRQUFRLENBQUMsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLGdCQUFnQixHQUFBLENBQzVELENBQUM7WUFDRixJQUFJLFdBQVcsRUFBRTtnQkFDYixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdEM7SUFFTyxnQ0FBVSxHQUFsQixVQUFtQixNQUFNOzs7OztRQUlyQixJQUFNLFlBQVksR0FBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTs7Z0JBQ2QsS0FBa0IsSUFBQSxLQUFBLFNBQUEsTUFBTSxDQUFDLEtBQUssQ0FBQSxnQkFBQSw0QkFBRTtvQkFBM0IsSUFBTSxHQUFHLFdBQUE7b0JBQ1YsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFOzs0QkFDVixLQUFrQixJQUFBLG9CQUFBLFNBQUEsR0FBRyxDQUFDLElBQUksQ0FBQSxDQUFBLGdCQUFBLDRCQUFFO2dDQUF2QixJQUFNLEdBQUcsV0FBQTtnQ0FDVixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQ0FDN0MsT0FBTyxJQUFJLENBQUM7aUNBQ2Y7NkJBQ0o7Ozs7Ozs7OztxQkFDSjtpQkFDSjs7Ozs7Ozs7O1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVPLDhCQUFRLEdBQWhCLFVBQWlCLE1BQU07UUFDbkIsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQU0sUUFBUSxHQUFZLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUMzQyxVQUFBLFFBQVEsSUFBSSxPQUFBLFFBQVEsQ0FBQyxJQUFJLEtBQUtBLGtCQUFVLENBQUMsYUFBYSxHQUFBLENBQ3pELENBQUM7WUFDRixJQUFJLFFBQVEsRUFBRTtnQkFDVixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdEM7SUFFTyxvQ0FBYyxHQUF0QixVQUF1QixNQUFNOzs7OztRQUl6QixJQUFNLFlBQVksR0FBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTs7Z0JBQ2QsS0FBa0IsSUFBQSxLQUFBLFNBQUEsTUFBTSxDQUFDLEtBQUssQ0FBQSxnQkFBQSw0QkFBRTtvQkFBM0IsSUFBTSxHQUFHLFdBQUE7b0JBQ1YsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFOzs0QkFDVixLQUFrQixJQUFBLG9CQUFBLFNBQUEsR0FBRyxDQUFDLElBQUksQ0FBQSxDQUFBLGdCQUFBLDRCQUFFO2dDQUF2QixJQUFNLEdBQUcsV0FBQTtnQ0FDVixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQ0FDN0MsT0FBTyxJQUFJLENBQUM7aUNBQ2Y7NkJBQ0o7Ozs7Ozs7OztxQkFDSjtpQkFDSjs7Ozs7Ozs7O1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVPLHFDQUFlLEdBQXZCLFVBQXdCLFNBQVM7UUFDN0IsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVU7Y0FDaEMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLE1BQU07Y0FDL0MsS0FBSyxDQUFDO0tBQ2Y7SUFFTywyQ0FBcUIsR0FBN0IsVUFBOEIsU0FBUztRQUNuQyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVTtjQUNoQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssWUFBWTtjQUNyRCxLQUFLLENBQUM7S0FDZjtJQUVPLHVDQUFpQixHQUF6QixVQUEwQixTQUFTO1FBQy9CLE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVO2NBQ2hDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxVQUFVO2dCQUMvQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUTtjQUNyRCxLQUFLLENBQUM7S0FDZjs7OztJQU1NLDJDQUFxQixHQUE1QixVQUNJLFFBQWdCLEVBQ2hCLGdCQUErRCxFQUMvRCxVQUEwQjtRQUUxQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLE1BQU0sRUFBRTtZQUNSLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEYsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELFdBQVcsR0FBR0csUUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksTUFBTSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFDOUQsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDN0I7WUFDRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN2RCxJQUFJLHFCQUFxQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkYsSUFDSSxxQkFBcUI7b0JBQ3JCLHFCQUFxQixDQUFDLE1BQU0sSUFBSSxDQUFDO29CQUNqQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQy9CO29CQUNFLElBQU0sV0FBVyxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFDckUsVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ3BDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDdkQ7Z0JBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNsQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDN0I7YUFDSjtZQUNELElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFO2dCQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3BFLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3pELElBQU0sV0FBVyxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3pELFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO29CQUNwQyxrQkFBa0IsR0FBRyxXQUFXLENBQUMsa0JBQWtCLENBQUM7b0JBQ3BELFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3QzthQUNKO1NBQ0o7UUFDRCxJQUFJLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzNDLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxjQUFjLENBQUM7UUFFbkIsSUFBSSxPQUFPRixVQUFFLENBQUMsK0JBQStCLEtBQUssV0FBVyxFQUFFO1lBQzNELElBQUksZ0JBQWdCLEdBQUdBLFVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVFLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFJLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2xCLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO3dCQUNoQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNoRTtpQkFDSjthQUNKO1NBQ0o7UUFFRCxJQUFJLE9BQU9BLFVBQUUsQ0FBQyw4QkFBOEIsS0FBSyxXQUFXLEVBQUU7WUFDMUQsSUFBSSxZQUFZLEdBQUdBLFVBQUUsQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksWUFBWSxFQUFFO2dCQUNkLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRTtvQkFDekIsY0FBYyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO2lCQUNqRDthQUNKO1NBQ0o7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFbEUsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUU7Ozs7O1lBSzdCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Ozs7Z0JBS3pELFdBQVc7b0JBQ1AsV0FBVyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0UsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLFlBQVk7b0JBQ1IsWUFBWSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsRjtZQUNELElBQUksV0FBVyxFQUFFO2dCQUNiLE9BQU87b0JBQ0gsVUFBVSxZQUFBO29CQUNWLGtCQUFrQixvQkFBQTtvQkFDbEIsV0FBVyxhQUFBO29CQUNYLGNBQWMsRUFBRSxjQUFjO29CQUM5QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3RCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDeEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO29CQUNsQyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7b0JBQ3BDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7b0JBQ3hDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtvQkFDbEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO29CQUNoQyxTQUFTLEVBQUUsU0FBUztvQkFDcEIsU0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFVBQVUsRUFBRSxrQkFBa0I7b0JBQzlCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztpQkFDL0IsQ0FBQzthQUNMO2lCQUFNLElBQUksU0FBUyxFQUFFO2dCQUNsQixPQUFPO29CQUNIO3dCQUNJLFFBQVEsVUFBQTt3QkFDUixTQUFTLFdBQUE7d0JBQ1QsVUFBVSxZQUFBO3dCQUNWLGtCQUFrQixvQkFBQTt3QkFDbEIsV0FBVyxhQUFBO3dCQUNYLGNBQWMsRUFBRSxjQUFjO3dCQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87d0JBQ3hCLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTt3QkFDeEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO3dCQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7d0JBQ2xCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVzt3QkFDaEMsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLFNBQU8sRUFBRSxjQUFjO3dCQUN2QixVQUFVLEVBQUUsa0JBQWtCO3dCQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7cUJBQy9CO2lCQUNKLENBQUM7YUFDTDtpQkFBTSxJQUFJLE1BQU0sRUFBRTtnQkFDZixPQUFPO29CQUNIO3dCQUNJLFFBQVEsVUFBQTt3QkFDUixTQUFTLFdBQUE7d0JBQ1QsVUFBVSxZQUFBO3dCQUNWLGtCQUFrQixvQkFBQTt3QkFDbEIsV0FBVyxhQUFBO3dCQUNYLGNBQWMsRUFBRSxjQUFjO3dCQUM5QixTQUFTLEVBQUUsU0FBUzt3QkFDcEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO3dCQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87cUJBQzNCO2lCQUNKLENBQUM7YUFDTDtpQkFBTSxJQUFJLFFBQVEsRUFBRTtnQkFDakIsT0FBTztvQkFDSDt3QkFDSSxRQUFRLFVBQUE7d0JBQ1IsU0FBUyxXQUFBO3dCQUNULFVBQVUsWUFBQTt3QkFDVixrQkFBa0Isb0JBQUE7d0JBQ2xCLFdBQVcsYUFBQTt3QkFDWCxjQUFjLEVBQUUsY0FBYzt3QkFDOUIsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztxQkFDM0I7aUJBQ0osQ0FBQzthQUNMO2lCQUFNO2dCQUNILE9BQU87b0JBQ0g7d0JBQ0ksVUFBVSxZQUFBO3dCQUNWLGtCQUFrQixvQkFBQTt3QkFDbEIsV0FBVyxhQUFBO3dCQUNYLGNBQWMsRUFBRSxjQUFjO3dCQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87d0JBQ3hCLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTt3QkFDeEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO3dCQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7d0JBQ2xCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVzt3QkFDaEMsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLFNBQU8sRUFBRSxjQUFjO3dCQUN2QixVQUFVLEVBQUUsa0JBQWtCO3dCQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7cUJBQy9CO2lCQUNKLENBQUM7YUFDTDtTQUNKO2FBQU0sSUFBSSxXQUFXLEVBQUU7WUFDcEIsT0FBTztnQkFDSDtvQkFDSSxVQUFVLFlBQUE7b0JBQ1Ysa0JBQWtCLG9CQUFBO29CQUNsQixXQUFXLGFBQUE7b0JBQ1gsY0FBYyxFQUFFLGNBQWM7b0JBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtvQkFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7b0JBQ2xDLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtvQkFDcEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7b0JBQ3hDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7b0JBQ2hDLFNBQVMsRUFBRSxTQUFTO29CQUNwQixTQUFPLEVBQUUsY0FBYztvQkFDdkIsVUFBVSxFQUFFLGtCQUFrQjtvQkFDOUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lCQUMvQjthQUNKLENBQUM7U0FDTDthQUFNO1lBQ0gsT0FBTztnQkFDSDtvQkFDSSxVQUFVLFlBQUE7b0JBQ1Ysa0JBQWtCLG9CQUFBO29CQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87b0JBQ3hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtvQkFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7b0JBQ2xDLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtvQkFDcEMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO29CQUN4QyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7b0JBQzlCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtvQkFDbEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO29CQUNoQyxTQUFTLEVBQUUsU0FBUztvQkFDcEIsU0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFVBQVUsRUFBRSxrQkFBa0I7b0JBQzlCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztpQkFDL0I7YUFDSixDQUFDO1NBQ0w7S0FHSjtJQUVPLGtDQUFZLEdBQXBCLFVBQXFCLE9BQU8sRUFBRSxVQUFVOzs7O1FBSXBDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksZUFBZSxDQUFDO1FBQ3BCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1lBRXJDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV4QixjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxRCxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM1RCxJQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDMUUsSUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRTVFLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBRW5CLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNsQixTQUFTO2FBQ1o7WUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUlPLGVBQWEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO2dCQUNuRSxTQUFTO2FBQ1o7WUFFRCxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixJQUFJUCxVQUFFLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDdkQ7YUFDSjtpQkFBTSxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUMxRTtpQkFBTSxJQUFJLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsRUFDTCxLQUFLLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO2dCQUN0QyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwQixZQUFZLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQzNFLENBQUM7aUJBQ0w7YUFDSjtpQkFBTSxJQUFJLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlELElBQUksQ0FBQyxHQUFHLENBQUMsRUFDTCxLQUFLLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO2dCQUN2QyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwQixhQUFhLENBQUMsSUFBSSxDQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQ3JFLENBQUM7aUJBQ0w7YUFDSjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSU8sZUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDcEUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7d0JBQ3RFLElBQ0ksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQ3hFOzRCQUNFLElBQUlQLFVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSUEsVUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFO2dDQUNoRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQzs2QkFDakU7aUNBQU0sSUFDSEEsVUFBRSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztnQ0FDaENBLFVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFDaEM7Z0NBQ0UsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQ0FDckMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO2lDQUMzRDs2QkFDSjtpQ0FBTSxJQUFJQSxVQUFFLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0NBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDOzZCQUNsRTtpQ0FBTSxJQUNIQSxVQUFFLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDO2dDQUNuQ0EsVUFBRSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUNyQztnQ0FDRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7NkJBQ3ZEO2lDQUFNLElBQUlBLFVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQ0FDL0MsZUFBZSxDQUFDLElBQUksQ0FDaEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FDakQsQ0FBQzs2QkFDTDtpQ0FBTSxJQUFJQSxVQUFFLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0NBQzVDLElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUN4RCxNQUFNLEVBQ04sVUFBVSxDQUNiLENBQUM7Z0NBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUNWLElBQUksR0FBRyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztnQ0FDeEMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lDQUM5QztnQ0FDRCxXQUFXLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQzs2QkFDdEU7eUJBQ0o7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDdkMsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDeEMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDbEMsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFMUMsTUFBTSxHQUFHO1lBQ0wsTUFBTSxRQUFBO1lBQ04sT0FBTyxTQUFBO1lBQ1AsWUFBWSxjQUFBO1lBQ1osYUFBYSxlQUFBO1lBQ2IsT0FBTyxTQUFBO1lBQ1AsVUFBVSxZQUFBO1lBQ1YsZUFBZSxpQkFBQTtZQUNmLElBQUksTUFBQTtZQUNKLFdBQVcsYUFBQTtTQUNkLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUM7U0FDbkM7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVPLG1DQUFhLEdBQXJCLFVBQXNCLFFBQXVCO1FBQ3pDLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUN0QixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDL0I7UUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDeEI7UUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RjtRQUNELE9BQU8sRUFBRSxDQUFDO0tBQ2I7SUFFTSwrQkFBUyxHQUFoQixVQUFpQixJQUFJOztRQUFyQixpQkE2TEM7UUE1TEcsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPLE9BQU8sQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNoQixPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEM7WUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDekIsT0FBTyxJQUFJLEdBQUcsQ0FBQztnQkFDZixJQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7O29CQUN6QixLQUF1QixJQUFBLEtBQUEsU0FBQSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQSxnQkFBQSw0QkFBRTt3QkFBM0MsSUFBTSxRQUFRLFdBQUE7d0JBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7cUJBQ2hEOzs7Ozs7Ozs7Z0JBQ0QsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxHQUFHLENBQUM7YUFDbEI7WUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN2QixJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3pELE9BQU8sR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLRCxrQkFBVSxDQUFDLGlCQUFpQixFQUFFO29CQUM3RCxPQUFPLEdBQUcsR0FBRyxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2pFO2FBQ0o7WUFFRCxJQUFNLG9CQUFvQixHQUFHLFVBQUMsR0FBRyxFQUFFLFNBQVM7O2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDckIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUVsQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ2xCLElBQU0sVUFBVSxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNwRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLGlCQUFpQixFQUFFOzRCQUN4RCxPQUFPLElBQUksR0FBRyxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDN0Q7NkJBQU07NEJBQ0gsT0FBTyxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNqRDtxQkFDSjt5QkFBTTt3QkFDSCxJQUFJQyxVQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTs0QkFDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQ0FDbkIsT0FBTyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7NkJBQzVDO2lDQUFNO2dDQUNILE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzs2QkFDNUM7eUJBQ0o7NkJBQU07NEJBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3BDO3dCQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTs0QkFDZixPQUFPLElBQUksS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ2hEO3dCQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBS0Qsa0JBQVUsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTs0QkFDaEQsT0FBTyxJQUFJLEtBQUssR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDaEQ7d0JBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFOzRCQUNwQixPQUFPLElBQUksR0FBRyxDQUFDOzRCQUNmLElBQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQzs7Z0NBQ3pCLEtBQXVCLElBQUEsb0JBQUEsU0FBQSxJQUFJLENBQUMsYUFBYSxDQUFBLENBQUEsZ0JBQUEsNEJBQUU7b0NBQXRDLElBQU0sUUFBUSxXQUFBO29DQUNmLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lDQUNoRDs7Ozs7Ozs7OzRCQUNELE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUN6QyxPQUFPLElBQUksR0FBRyxDQUFDO3lCQUNsQjtxQkFDSjtvQkFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFO3dCQUNiLE9BQU8sSUFBSSxTQUFTLENBQUM7cUJBQ3hCO2lCQUNKO2FBQ0osQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUlDLFVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyRCxPQUFPLElBQUksR0FBRyxDQUFDO2dCQUNmLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLElBQUksR0FBRyxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSUEsVUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xELG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ2hEO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDeEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUM5QixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7b0JBQ1QsT0FBTyxHQUFHLEdBQUcsQ0FBQztvQkFFZCxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNsQixJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzNCLElBQUksSUFBSSxDQUFDLElBQUksS0FBS0Qsa0JBQVUsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTs0QkFDeEQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUM3QyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDcEM7NkJBQU07NEJBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3BDO3dCQUNELElBQUlDLFVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFOzRCQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO2dDQUNuQixPQUFPLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQzs2QkFDNUM7aUNBQU07Z0NBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUM1Qzt5QkFDSjt3QkFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7NEJBQ2YsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUNoRDt3QkFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUtELGtCQUFVLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7NEJBQ2hELE9BQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ2hEO3dCQUVELElBQ0ksSUFBSSxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxhQUFhOzRCQUN0QyxJQUFJLENBQUMsUUFBUTs0QkFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLFdBQVc7NEJBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFDbEM7NEJBQ0UsU0FBUzt5QkFDWjt3QkFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFOzRCQUNiLE9BQU8sSUFBSSxJQUFJLENBQUM7eUJBQ25CO3FCQUNKO29CQUNELE9BQU8sSUFBSSxHQUFHLENBQUM7aUJBQ2xCO2FBQ0o7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN6QixPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUMzQixPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkY7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSUMsVUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLElBQUlBLFVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO3dCQUNuQixPQUFPLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztxQkFDNUM7eUJBQU07d0JBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUM1QztpQkFDSjtnQkFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2YsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNoRDtnQkFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFO29CQUNiLE9BQU8sSUFBSSxLQUFLLENBQUM7aUJBQ3BCO2FBQ0o7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUM1QixPQUFPLEdBQUcsT0FBTyxDQUFDO1NBQ3JCO2FBQU07WUFDSCxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxJQUNJLE9BQU8sS0FBSyxFQUFFO2dCQUNkLElBQUksQ0FBQyxXQUFXO2dCQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7aUJBQ3BCLElBQUksQ0FBQyxJQUFJLEtBQUtELGtCQUFVLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxTQUFTLENBQUMsRUFDdEY7Z0JBQ0UsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLGFBQWEsRUFBRTtnQkFDeEMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQy9CO1NBQ0o7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JELE9BQU8sSUFBSSxHQUFHLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQ0wsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3BDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUU7b0JBQ3ZCLE9BQU8sSUFBSSxJQUFJLENBQUM7aUJBQ25CO2FBQ0o7WUFDRCxPQUFPLElBQUksR0FBRyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxPQUFPLENBQUM7S0FDbEI7SUFFTywwQ0FBb0IsR0FBNUIsVUFBNkIsTUFBbUMsRUFBRSxVQUF5QjtRQUEzRixpQkF1QkM7UUF0QkcsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLElBQUksSUFBSSxHQUFHMkIsUUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLElBQUksTUFBTSxHQUFRO1lBQ2QsRUFBRSxFQUFFLG1CQUFtQixHQUFHLElBQUk7WUFDOUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFBLENBQUMsR0FBRyxFQUFFO1lBQ3RGLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDdkMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25ELFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGtCQUFrQixFQUFFLEVBQUU7U0FDekIsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzlFLElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsTUFBTSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQztZQUMzQyxNQUFNLENBQUMsV0FBVyxHQUFHeEIsUUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBRU8sMkNBQXFCLEdBQTdCLFVBQ0ksTUFBb0MsRUFDcEMsVUFBMEI7UUFGOUIsaUJBZ0NDO1FBNUJHLElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QyxJQUFJLElBQUksR0FBR3dCLFFBQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RSxJQUFJLE1BQU0sR0FBRztZQUNULEVBQUUsRUFBRSxvQkFBb0IsR0FBRyxJQUFJO1lBQy9CLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDLEdBQUcsRUFBRTtZQUN0RixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUNuRCxVQUFVLEVBQUUsS0FBSztZQUNqQixrQkFBa0IsRUFBRSxFQUFFO1NBQ3pCLENBQUM7UUFDRixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5RSxJQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxjQUFjLEdBQUcsa0JBQWtCLENBQUM7WUFDM0MsTUFBTSxDQUFDLFdBQVcsR0FBR3hCLFFBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ25EO1FBRUQsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDcEMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUNuQixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO29CQUNkLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjtTQUNKO1FBRUQsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFFTyxpREFBMkIsR0FBbkMsVUFDSSxNQUFpQyxFQUNqQyxVQUEwQjtRQUY5QixpQkFnREM7Ozs7UUF6Q0csSUFBSSxNQUFNLEdBQVE7WUFDZCxJQUFJLEVBQUUsYUFBYTtZQUNuQixXQUFXLEVBQUUsRUFBRTtZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFBLENBQUMsR0FBRyxFQUFFO1lBQ3RGLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztTQUN0RCxDQUFDO1FBQ0YsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdkQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDOUUsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RSxNQUFNLENBQUMsY0FBYyxHQUFHLGtCQUFrQixDQUFDO1lBQzNDLE1BQU0sQ0FBQyxXQUFXLEdBQUdBLFFBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ25EO1FBRUQsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFBLFFBQVE7b0JBQ3JDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDeEIsQ0FBQyxDQUFDO2dCQUNILElBQ0lKLFlBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFQyxrQkFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDakRELFlBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFQyxrQkFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNuRDtvQkFDRSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxhQUFhLEdBQUEsQ0FBQyxDQUFDO2lCQUNuRTtnQkFDRCxNQUFNLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQzthQUMvQjtTQUNKO1FBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEQ7UUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELE1BQU0sQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEU7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBRU8sbUNBQWEsR0FBckIsVUFBc0IsUUFBZ0MsRUFBRSxVQUFVO1FBQzlELElBQUksTUFBTSxHQUFRO1lBQ2QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUN4QixZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVc7a0JBQzVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2tCQUNoRCxTQUFTO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDOUIsUUFBUSxFQUFFLE9BQU8sUUFBUSxDQUFDLGFBQWEsS0FBSyxXQUFXO1lBQ3ZELFdBQVcsRUFBRSxFQUFFO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1NBQ3hELENBQUM7UUFDRixJQUFJLFNBQVMsQ0FBQztRQUVkLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDaEYsTUFBTSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7U0FDdkM7UUFFRCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxXQUFXLEVBQUU7WUFDdkYsTUFBTSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDL0M7UUFFRCxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckQsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2hCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hGLElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsTUFBTSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQztZQUMzQyxNQUFNLENBQUMsV0FBVyxHQUFHRyxRQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRTtZQUNyQixNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEU7UUFFRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUU7WUFDcEIsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUEsUUFBUTtvQkFDdkMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsSUFDSUosWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUVDLGtCQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNqREQsWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUVDLGtCQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ25EO29CQUNFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLGFBQWEsR0FBQSxDQUFDLENBQUM7aUJBQ25FO2dCQUNELE1BQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2FBQy9CO1NBQ0o7O1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO2dCQUN0QixNQUFNLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzthQUM1QjtZQUNELElBQUksMEJBQXdCLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQUEsWUFBWTtnQkFDcEMsSUFBSSxZQUFZLEtBQUtBLGtCQUFVLENBQUMsY0FBYyxFQUFFO29CQUM1QywwQkFBd0IsR0FBRyxJQUFJLENBQUM7aUJBQ25DO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLDBCQUF3QixFQUFFO2dCQUMzQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQ0Esa0JBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN2RDtTQUNKO1FBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNwRDtTQUNKO1FBRUQsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFFTyxnREFBMEIsR0FBbEMsVUFBbUMsTUFBTSxFQUFFLFVBQVU7UUFDakQsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksYUFBVyxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsQixJQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELElBQUksUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7b0JBQ2xDLFNBQVM7aUJBQ1o7Z0JBQ0QsSUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDO29CQUN2Q1EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQ3hDO29CQUNFLFNBQVM7aUJBQ1o7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7b0JBQ3ZDLGFBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQzFFO2FBQ0o7Ozs7WUFJRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3pCLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUN0QyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDckMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7NEJBQ2xCLGFBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO2dDQUNyQixJQUNJLEdBQUcsQ0FBQyxPQUFPO29DQUNYLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVztvQ0FDdkIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssT0FBTyxFQUNyQztvQ0FDRSxJQUNJLEdBQUcsQ0FBQyxJQUFJO3dDQUNSLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVzt3Q0FDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLElBQUksRUFDckM7d0NBQ0UsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO3FDQUNuQztpQ0FDSjs2QkFDSixDQUFDLENBQUM7eUJBQ04sQ0FBQyxDQUFDO3FCQUNOO2lCQUNKO2FBQ0o7WUFDRCxPQUFPLGFBQVcsQ0FBQztTQUN0QjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUM7U0FDYjtLQUNKO0lBRU8sNENBQXNCLEdBQTlCLFVBQStCLE1BQTRCLEVBQUUsVUFBeUI7UUFBdEYsaUJBMEZDO1FBekZHLElBQUksTUFBTSxHQUFRO1lBQ2QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUN0QixJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUEsQ0FBQyxHQUFHLEVBQUU7WUFDdEYsUUFBUSxFQUFFLE9BQU8sTUFBTSxDQUFDLGFBQWEsS0FBSyxXQUFXO1lBQ3JELFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDdkMsY0FBYyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25ELFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGtCQUFrQixFQUFFLEVBQUU7U0FDekIsQ0FBQztRQUNGLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXZELElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTs7WUFFcEMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUNmLElBQUksTUFBTSxHQUFjLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RDLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFO29CQUN6QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUN2RCxNQUFNLEVBQ04sTUFBTSxDQUFDLGdCQUFnQixDQUMxQixDQUFDO29CQUNGLElBQUksVUFBVSxFQUFFO3dCQUNaLElBQUk7NEJBQ0EsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDdkUsSUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDOzRCQUM3QyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzt5QkFFakU7d0JBQUMsT0FBTyxLQUFLLEVBQUUsR0FBRTtxQkFDckI7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsSUFBSSxNQUFNLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzRCxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQUEsYUFBYTtnQkFDM0QsT0FBQSxLQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQzthQUFBLENBQ2hDLENBQUM7U0FDTDtRQUVELElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzlFLElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsTUFBTSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQztZQUMzQyxNQUFNLENBQUMsV0FBVyxHQUFHTCxRQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUNuQixNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEU7UUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUEsUUFBUTtvQkFDckMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsSUFDSUosWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUVDLGtCQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNqREQsWUFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUVDLGtCQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ25EO29CQUNFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLGFBQWEsR0FBQSxDQUFDLENBQUM7aUJBQ25FO2dCQUNELE1BQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2FBQy9CO1NBQ0o7O1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO2dCQUN0QixNQUFNLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzthQUM1QjtZQUNELElBQUksMEJBQXdCLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQUEsWUFBWTtnQkFDcEMsSUFBSSxZQUFZLEtBQUtBLGtCQUFVLENBQUMsY0FBYyxFQUFFO29CQUM1QywwQkFBd0IsR0FBRyxJQUFJLENBQUM7aUJBQ25DO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLDBCQUF3QixFQUFFO2dCQUMzQixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQ0Esa0JBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN2RDtTQUNKO1FBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEQ7UUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELE1BQU0sQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEU7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBRU8saUNBQVcsR0FBbkIsVUFDSSxRQUFnQyxFQUNoQyxZQUEwQixFQUMxQixVQUEwQjtRQUUxQixJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUMvQyxJQUFJLE9BQU8sR0FBUTtZQUNmLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUM3RCxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVc7a0JBQzVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2tCQUNoRCxTQUFTO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsa0JBQWtCLEVBQUUsRUFBRTtTQUN6QixDQUFDO1FBQ0YsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2hCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hGLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsT0FBTyxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQztZQUM1QyxPQUFPLENBQUMsV0FBVyxHQUFHRyxRQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUVqRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckQsT0FBTyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JEO1NBQ0o7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUN0QixJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QyxJQUFJLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFO29CQUNsRCxJQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFDakQsT0FBTyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7b0JBQ3hDLE9BQU8sQ0FBQyxXQUFXLEdBQUdBLFFBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDaEQ7YUFDSjtTQUNKO1FBQ0QsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBRS9ELElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtZQUNmLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzQzthQUFNOztZQUVILElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsSUFBSUYsVUFBRSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQzFDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7d0JBQ2pDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO3FCQUN2RDtpQkFDSjthQUNKO1NBQ0o7UUFDRCxPQUFPLE9BQU8sQ0FBQztLQUNsQjtJQUVPLG1DQUFhLEdBQXJCLFVBQXNCLEdBQTRCO1FBQWxELGlCQThCQztRQTdCRyxJQUFJLE9BQU8sR0FBUTtZQUNmLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUk7WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGtCQUFrQixFQUFFLEVBQUU7U0FDekIsQ0FBQztRQUNGLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRTtZQUNwQixPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUNqQztRQUNELElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRTtZQUNuQixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUMzQjtRQUNELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtZQUNWLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2YsSUFBSUEsVUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDakMsT0FBTyxDQUFDLFVBQVEsQ0FBQSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVTswQkFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDOzBCQUN6RCxFQUFFLENBQUM7aUJBQ1o7YUFDSjtTQUNKO1FBQ0QsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN0RTtRQUNELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDekQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxPQUFPLE9BQU8sQ0FBQztLQUNsQjtJQUVPLDhDQUF3QixHQUFoQyxVQUFpQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVc7UUFDL0QsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2RSxPQUFPLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXO2NBQ3JDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2NBQ2hELFNBQVMsQ0FBQztRQUNoQixPQUFPLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMzQixPQUFPLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQ3RCLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtnQkFDaEIsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzNCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUUzRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO3dCQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDckQsT0FBTyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNyRDtvQkFDRCxJQUFJLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFO3dCQUNsRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUNyRCxRQUFRLEVBQ1IsVUFBVSxDQUNiLENBQUM7d0JBQ0YsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEUsT0FBTyxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQzt3QkFDNUMsT0FBTyxDQUFDLFdBQVcsR0FBR0UsUUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7cUJBQ3BEO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMvRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDZixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0M7YUFBTTs7WUFFSCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLElBQUlGLFVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUMxQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO3dCQUNqQyxPQUFPLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztxQkFDdkQ7aUJBQ0o7YUFDSjs7WUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pCLElBQUksTUFBTSxHQUFjLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFO29CQUN6QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUN2RCxNQUFNLEVBQ04sTUFBTSxDQUFDLGdCQUFnQixDQUMxQixDQUFDO29CQUNGLElBQUksVUFBVSxFQUFFO3dCQUNaLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQzVEO2lCQUNKO2FBQ0o7U0FDSjtRQUNELElBQUksUUFBUSxDQUFDLElBQUksS0FBS0Qsa0JBQVUsQ0FBQyxXQUFXLEVBQUU7O1lBRTFDLElBQUksUUFBUSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3pELElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzdCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5RDthQUNKO1NBQ0o7UUFDRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDckIsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FDbEUsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsR0FBQSxDQUMvRCxDQUFDO1NBQ0w7UUFDRCxPQUFPLE9BQU8sQ0FBQztLQUNsQjtJQUVPLHVDQUFpQixHQUF6QixVQUEwQixRQUFRLEVBQUUscUJBQXFCLEVBQUUsVUFBVztRQUF0RSxpQkF3Q0M7UUF2Q0csSUFBSSxNQUFNLEdBQUcscUJBQXFCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUN4RCxJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVU7Y0FDNUIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFBLENBQUM7Y0FDekQsRUFBRSxDQUFDO1FBQ1QsT0FBTyxDQUFDLGFBQWE7WUFDakIsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO2tCQUNYLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSTtvQkFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUNwQixDQUFDO2tCQUNGLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2hCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2hGLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsT0FBTyxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQztZQUM1QyxPQUFPLENBQUMsV0FBVyxHQUFHRyxRQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUVqRCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckQsT0FBTyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JEO1NBQ0o7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUN0QixJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFO3dCQUNsRCxJQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzt3QkFDakQsT0FBTyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7d0JBQ3hDLE9BQU8sQ0FBQyxXQUFXLEdBQUdBLFFBQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDaEQ7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0lBQ0wsa0JBQUM7QUFBRCxDQUFDOztBQ25oREQ7SUFHSTtRQUNJLElBQUksQ0FBQyxPQUFPLEdBQUdGLFVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDNUIsT0FBTyxFQUFFQSxVQUFFLENBQUMsV0FBVyxDQUFDLFFBQVE7U0FDbkMsQ0FBQyxDQUFDO0tBQ047SUFFTSw2QkFBSyxHQUFaLFVBQWEsSUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN6QkEsVUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQ3ZCLElBQUksRUFDSkEsVUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUVBLFVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQ3RELENBQUM7S0FDTDtJQUNMLG9CQUFDO0FBQUQsQ0FBQzs7QUNWRDtJQUFBO1FBQ3FCLFlBQU8sR0FBRyxLQUFLLENBQUM7S0FtUXBDO0lBalFVLDJDQUFvQixHQUEzQixVQUE0QixJQUFZLEVBQUUsT0FBdUI7UUFDN0QsSUFBSSxNQUFNLEdBQUc7WUFDVCxJQUFJLEVBQUUsRUFBRTtZQUNSLElBQUksRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUVGLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQzdCLE9BQU8sTUFBTSxDQUFDO1NBQ2pCO1FBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlCLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDbkIsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7U0FDakI7UUFDRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtZQUNoQyxNQUFNLENBQUMsSUFBSSxHQUFHd0IsYUFBVyxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNoRTtRQUNELE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBRU0sOEJBQU8sR0FBZCxVQUFlLElBQVk7UUFDdkIsSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEQsSUFBSSxHQUFHLFdBQVcsQ0FBQztTQUN0QjthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNsRCxJQUFJLEdBQUcsTUFBTSxDQUFDO1NBQ2pCO2FBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3hELElBQUksR0FBRyxZQUFZLENBQUM7U0FDdkI7YUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxHQUFHLFFBQVEsQ0FBQztTQUNuQjthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN2RCxJQUFJLEdBQUcsV0FBVyxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7SUFNTSwwQ0FBbUIsR0FBMUIsVUFDSSxJQUFvRSxFQUNwRSxJQUFJO1FBRUosSUFBSXhCLFVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQ0EsVUFBRSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9ELE9BQVUsSUFBSSxDQUFDLElBQUksU0FBSSxJQUFNLENBQUM7U0FDakM7UUFFRCxJQUFJLEdBQUcsSUFBSSxHQUFHLE1BQUksSUFBTSxHQUFHLEVBQUUsQ0FBQztRQUU5QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNYLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNsQixRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUN4QjthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUN0QixRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDakMsSUFBSUEsVUFBRSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDOUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsQ0FBQyxJQUFJLEdBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbEUsUUFBUSxHQUFHLE1BQUksUUFBUSxNQUFHLENBQUM7aUJBQzlCO2FBQ0o7U0FDSjtRQUVELElBQUlBLFVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsT0FBTyxRQUFNLFFBQVUsQ0FBQztTQUMzQjtRQUNELE9BQU8sS0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFNLENBQUM7S0FDMUU7Ozs7OztJQU9NLGlEQUEwQixHQUFqQyxVQUFrQyxJQUFnQztRQUM5RCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBS0Qsa0JBQVUsQ0FBQyx1QkFBdUIsRUFBRTs7O1lBRy9ELElBQUksaUJBQWUsRUFBRSxnQkFBYyxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzVCRCxZQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBQSxRQUFRO3dCQUMvQixJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBS0Msa0JBQVUsQ0FBQyxrQkFBa0IsRUFBRTs0QkFDbEUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7Z0NBQ2xDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLEVBQUU7b0NBQ25ELGdCQUFjLEdBQUcsSUFBSSxDQUFDO2lDQUN6Qjs2QkFDSjs0QkFDRCxJQUNJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVU7Z0NBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFDdEM7Z0NBQ0UsaUJBQWUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzs2QkFDL0M7eUJBQ0o7cUJBQ0osQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7WUFDRCxJQUFJLGdCQUFjLEVBQUU7Z0JBQ2hCLE9BQU8saUJBQWUsQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxPQUFPLElBQUksYUFBYSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzFDO1NBQ0o7YUFBTTtZQUNILE9BQU8sSUFBSSxhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7S0FDSjs7Ozs7OztJQVFNLDBDQUFtQixHQUExQixVQUNJLElBS3NCOzs7UUFJdEIsSUFDSSxDQUFDQyxVQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUlBLFVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzNFQSxVQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJQSxVQUFFLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQzdFO1lBQ0UsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7OztZQU0xRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUMzRCxJQUFJLElBQUksR0FBTSxTQUFTLFNBQUksWUFBWSxNQUFHLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUlBLFVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsRUFBRTs7WUFFNUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekM7YUFBTSxJQUFJQSxVQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFOztZQUU5QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3BCO1lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDM0I7U0FDSjthQUFNLElBQUlBLFVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUU7OztZQUdqQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7YUFDL0I7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN4RTs7Ozs7OztJQVFPLG1DQUFZLEdBQXBCLFVBQ0ksSUFBNkIsRUFDN0IsT0FBc0IsRUFDdEIsYUFBcUI7UUFIekIsaUJBbURDO1FBOUNHLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztRQUVyQixJQUFJQSxVQUFFLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLElBQUksYUFBYSxLQUFLLFVBQVUsRUFBRTtZQUM3RSxTQUFTLEdBQUd3QixhQUFXLENBQUMsaUNBQWlDLENBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUNkLE9BQU8sRUFDUCxhQUFhLENBQ2hCLENBQUM7U0FDTDtRQUNELElBQUl4QixVQUFFLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLElBQUksYUFBYSxLQUFLLFVBQVUsRUFBRTtZQUM3RSxJQUFNLElBQUksR0FBR3dCLGFBQVcsQ0FBQyxpQ0FBaUMsQ0FDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQ2QsT0FBTyxFQUNQLGFBQWEsQ0FDaEIsQ0FBQztZQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtRQUVELElBQUksU0FBUyxDQUFDLFdBQVcsSUFBSXhCLFVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0UsT0FBTyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUEsQ0FBQyxDQUFDO1NBQy9FO2FBQU0sSUFDSCxDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUlBLFVBQUUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQzthQUNsRSxTQUFTLENBQUMsV0FBVyxJQUFJQSxVQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3JFLFNBQVMsQ0FBQyxXQUFXO2dCQUNsQkEsVUFBRSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQztnQkFDbEMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDakM7WUFDRSxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QzthQUFNLElBQ0gsU0FBUyxDQUFDLFdBQVc7WUFDckIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJO2FBQ3pCLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLRCxrQkFBVSxDQUFDLFdBQVc7Z0JBQ2xELFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLQSxrQkFBVSxDQUFDLFlBQVksQ0FBQyxFQUM3RDtZQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQ2pGO2FBQU0sSUFBSSxTQUFTLENBQUMsV0FBVyxJQUFJQyxVQUFFLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3RGLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZCO2FBQU0sSUFDSCxTQUFTLENBQUMsV0FBVztZQUNyQixTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVE7WUFDOUIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDM0M7O1lBRUUsT0FBTyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUEsQ0FBQyxDQUFDO1NBQy9FO0tBQ0o7SUFFTSxvQ0FBYSxHQUFwQixVQUNJLEtBQWlELEVBQ2pELGFBQXFCLEVBQ3JCLE9BQXNCLEVBQ3RCLFNBQW1CO1FBSnZCLGlCQXFCQztRQWZHLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsRUFDTCxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFDbEIsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUV2QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUU7Z0JBQ3ZELGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEM7U0FDSjtRQUVELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsR0FBQSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzNGO0lBRU0sdUNBQWdCLEdBQXZCLFVBQ0ksS0FBaUQsRUFDakQsSUFBWSxFQUNaLFNBQW1CO1FBRW5CLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksR0FBQSxDQUFDLENBQUM7S0FDeEQ7SUFDTCxtQkFBQztBQUFELENBQUM7O0FDdlFEO0lBQ0kseUJBQ1ksV0FBd0IsRUFDeEIsWUFBK0M7UUFBL0MsNkJBQUEsRUFBQSxtQkFBaUMsWUFBWSxFQUFFO1FBRC9DLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFtQztLQUN2RDtJQUVHLHFEQUEyQixHQUFsQyxVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ25GO0lBRU0sbURBQXlCLEdBQWhDLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzNFO0lBRU0sMENBQWdCLEdBQXZCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ3hFO0lBRU0sMENBQWdCLEdBQXZCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ3hFO0lBRU0sOENBQW9CLEdBQTNCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQzVFO0lBRU0sMENBQWdCLEdBQXZCLFVBQ0ksS0FBaUQ7UUFFakQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ2xEO0lBRU0seUNBQWUsR0FBdEIsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDdkU7SUFFTSxvREFBMEIsR0FBakMsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDcEU7SUFFTSw4Q0FBb0IsR0FBM0IsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUV0QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoRixJQUFJLENBQUMsRUFBRTtZQUNILENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4QixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDOUI7UUFDRCxPQUFPLENBQUMsQ0FBQztLQUNaO0lBRU0sK0NBQXFCLEdBQTVCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3ZFO0lBRU0sOENBQW9CLEdBQTNCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQzVFO0lBRU0sNENBQWtCLEdBQXpCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQzFFO0lBRU0sNENBQWtCLEdBQXpCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQzFFO0lBRU0sK0NBQXFCLEdBQTVCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQzdFO0lBRU0sZ0RBQXNCLEdBQTdCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUMxRjtJQUVNLDRDQUFrQixHQUF6QixVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNwRTtJQUVNLDhDQUFvQixHQUEzQixVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1RTtJQUVNLDZDQUFtQixHQUExQixVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNyRTtJQUVNLCtDQUFxQixHQUE1QixVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRjFCLGlCQU9DO1FBSEcsT0FBTyxJQUFJLENBQUMsWUFBWTthQUNuQixhQUFhLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7YUFDMUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDLENBQUM7S0FDbEU7SUFFTSxxREFBMkIsR0FBbEMsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUYxQixpQkFPQztRQUhHLE9BQU8sSUFBSSxDQUFDLFlBQVk7YUFDbkIsYUFBYSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUM7YUFDaEQsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDLENBQUM7S0FDbEU7SUFFTSxtREFBeUIsR0FBaEMsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUYxQixpQkFPQztRQUhHLE9BQU8sSUFBSSxDQUFDLFlBQVk7YUFDbkIsYUFBYSxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDO2FBQzlDLEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUEsQ0FBQyxDQUFDO0tBQ2xFO0lBRU0saURBQXVCLEdBQTlCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3pFO0lBQ00saURBQXVCLEdBQTlCLFVBQStCLElBQVk7UUFDdkMsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksa0JBQWtCLElBQUksa0JBQWtCLENBQUMsTUFBTSxFQUFFO1lBQ2pELFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHO2dCQUM5QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDL0MsQ0FBQyxDQUFDO1NBQ047UUFDRCxPQUFPLFdBQVcsQ0FBQztLQUN0QjtJQUVNLHlEQUErQixHQUF0QyxVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ3ZGO0lBRU0sOENBQW9CLEdBQTNCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFFdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQzVFO0lBRU8seUNBQWUsR0FBdkIsVUFBd0IsSUFBZ0Q7UUFDcEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDcEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQ25ELFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO1lBQ25CLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsRCxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztLQUNkO0lBRU0sNkNBQW1CLEdBQTFCLFVBQ0ksS0FBaUQsRUFDakQsSUFBWSxFQUNaLFNBQW1CO1FBSHZCLGlCQWVDO1FBVkcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNMLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUNsQixhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRXZCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDOUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQztTQUNKO1FBQ0QsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDaEU7SUFFTSx3Q0FBYyxHQUFyQixVQUNJLFFBQWdCLEVBQ2hCLFVBQXlCLEVBQ3pCLElBQWEsRUFDYixRQUFRO1FBSlosaUJBdUJDOzs7O1FBZEcsSUFBSSxhQUFhLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUMzRSxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQUMsU0FBUyxFQUFFLFNBQVM7WUFDaEQsSUFBSUEsVUFBRSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUNsQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQzFELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FDbkIsS0FBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUMxRSxDQUFDO2lCQUNMO2FBQ0o7WUFFRCxPQUFPLFNBQVMsQ0FBQztTQUNwQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRVAsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3ZCO0lBRU8sc0NBQVksR0FBcEIsVUFBcUIsSUFBbUI7UUFDcEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO0tBQ2pEO0lBQ0wsc0JBQUM7QUFBRCxDQUFDLElBQUE7QUFFRDtJQUFBO1FBQ1ksVUFBSyxHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO0tBUy9DO0lBUFUsNEJBQUcsR0FBVixVQUFXLEdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM5QjtJQUVNLDRCQUFHLEdBQVYsVUFBVyxHQUFXLEVBQUUsS0FBVTtRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDOUI7SUFDTCxxQkFBQztBQUFELENBQUM7O0FDblFEO0lBUUksK0JBQVksS0FBZSxFQUFFLE9BQVk7UUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBTSxnQkFBZ0IsR0FBRztZQUNyQixNQUFNLEVBQUVBLFVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRztZQUMzQixNQUFNLEVBQUVBLFVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUM5QixpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1lBQzVDLE9BQU8sRUFBRSxJQUFJO1NBQ2hCLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFHQSxVQUFFLENBQUMsYUFBYSxDQUMzQixJQUFJLENBQUMsS0FBSyxFQUNWLGdCQUFnQixFQUNoQixZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FDakMsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUNoRTtJQUNMLDRCQUFDO0FBQUQsQ0FBQzs7QUM1QkQ7SUFRSTtLQUF3QjtJQUNWLHlCQUFXLEdBQXpCO1FBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDekIsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1NBQ2hEO1FBQ0QsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO0tBQ2pDO0lBRU0sNkJBQUssR0FBWixVQUFhLElBQUk7UUFBakIsaUJBOElDO1FBN0lHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFcEMsSUFBTSx1QkFBdUIsR0FBRyxVQUFBLFNBQVM7WUFDckMsSUFBSSxHQUFHLENBQUM7WUFDUixJQUFJLE9BQU8sU0FBUyxDQUFDLFNBQU8sQ0FBQSxLQUFLLFdBQVcsRUFBRTtnQkFDMUMsR0FBRyxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsU0FBTyxDQUFBLENBQUMsQ0FBQztnQkFFakQsSUFBSSxHQUFHLEVBQUU7b0JBQ0wsSUFBTSw4QkFBNEIsR0FBRyxVQUFBLEdBQUc7O3dCQUVwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sS0FBSyxXQUFXLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUM5RCxJQUFJLFVBQVUsR0FBRzJCLFdBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ3hDLFVBQVUsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDbkQsSUFBSSxPQUFPLFNBQVMsQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUFFO2dDQUMvQyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQzs2QkFDaEU7eUJBQ0o7d0JBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxVQUFVLEtBQUssV0FBVyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDcEUsSUFBSSxhQUFhLEdBQUdBLFdBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQzlDLGFBQWEsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDekQsSUFBSSxPQUFPLFNBQVMsQ0FBQyxlQUFlLEtBQUssV0FBVyxFQUFFO2dDQUNsRCxLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDOzZCQUN0RTt5QkFDSjs7d0JBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxXQUFXLEtBQUssV0FBVyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDdEUsSUFBSSxTQUFTLEdBQUdBLFdBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7NEJBQzNDLFNBQVMsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDakQsSUFBSSxPQUFPLFNBQVMsQ0FBQyxXQUFXLEtBQUssV0FBVyxFQUFFO2dDQUM5QyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQzs2QkFDOUQ7eUJBQ0o7d0JBQ0QsSUFDSSxPQUFPLEdBQUcsQ0FBQyxZQUFZLEtBQUssV0FBVzs0QkFDdkMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3Qjs0QkFDRSxJQUFJLFVBQVUsR0FBR0EsV0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFDN0MsVUFBVSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUNuRCxJQUFJLE9BQU8sU0FBUyxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUU7Z0NBQy9DLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDOzZCQUNoRTt5QkFDSjt3QkFDRCxJQUNJLE9BQU8sR0FBRyxDQUFDLFlBQVksS0FBSyxXQUFXOzRCQUN2QyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzdCOzRCQUNFLElBQUksVUFBVSxHQUFHQSxXQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUM3QyxVQUFVLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7NEJBQ25ELElBQUksT0FBTyxTQUFTLENBQUMsWUFBWSxLQUFLLFdBQVcsRUFBRTtnQ0FDL0MsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7NkJBQ2hFO3lCQUNKO3dCQUNELElBQ0ksT0FBTyxHQUFHLENBQUMsZUFBZSxLQUFLLFdBQVc7NEJBQzFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDaEM7NEJBQ0UsSUFBSSxhQUFhLEdBQUdBLFdBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7NEJBQ25ELGFBQWEsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDekQsSUFBSSxPQUFPLFNBQVMsQ0FBQyxlQUFlLEtBQUssV0FBVyxFQUFFO2dDQUNsRCxLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDOzZCQUN0RTt5QkFDSjt3QkFDRCxJQUNJLE9BQU8sR0FBRyxDQUFDLFlBQVksS0FBSyxXQUFXOzRCQUN2QyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzdCOzRCQUNFLElBQUksZUFBZSxHQUFHQSxXQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUNsRCxlQUFlLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7NEJBQzdELElBQUksT0FBTyxTQUFTLENBQUMsWUFBWSxLQUFLLFdBQVcsRUFBRTtnQ0FDL0MsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDLENBQUM7NkJBQ3JFO3lCQUNKO3dCQUNELElBQ0ksT0FBTyxHQUFHLENBQUMsYUFBYSxLQUFLLFdBQVc7NEJBQ3hDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDOUI7NEJBQ0UsSUFBSSxnQkFBZ0IsR0FBR0EsV0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDcEQsZ0JBQWdCLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDL0QsSUFBSSxPQUFPLFNBQVMsQ0FBQyxhQUFhLEtBQUssV0FBVyxFQUFFO2dDQUNoRCxLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDOzZCQUN2RTt5QkFDSjt3QkFDRCxJQUFJcEIsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTs0QkFDOUMsU0FBUyxDQUFDLFlBQVksR0FBRyw4QkFBOEIsQ0FDbkQsU0FBUyxDQUFDLFlBQVksQ0FDekIsQ0FBQzt5QkFDTDt3QkFDRCxJQUFJLEdBQUcsQ0FBQyxTQUFPLENBQUEsRUFBRTs0QkFDYiw4QkFBNEIsQ0FBQyxLQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQU8sQ0FBQSxDQUFDLENBQUMsQ0FBQzt5QkFDdEU7cUJBQ0osQ0FBQzs7b0JBRUYsOEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3JDO2FBQ0o7U0FDSixDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFbEQsSUFBTSxvQkFBb0IsR0FBRyxVQUFBLEVBQUU7WUFDM0IsSUFBSSxHQUFHLENBQUM7WUFDUixJQUFJLE9BQU8sRUFBRSxDQUFDLFNBQU8sQ0FBQSxLQUFLLFdBQVcsRUFBRTtnQkFDbkMsR0FBRyxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsU0FBTyxDQUFBLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxHQUFHLEVBQUU7b0JBQ0wsSUFBTSw4QkFBNEIsR0FBRyxVQUFBLEdBQUc7d0JBQ3BDLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFdBQVcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7NEJBQzlELElBQUksVUFBVSxHQUFHb0IsV0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDeEMsVUFBVSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUNuRCxJQUFJLE9BQU8sRUFBRSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7Z0NBQ25DLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDOzZCQUNwRDt5QkFDSjt3QkFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLFVBQVUsS0FBSyxXQUFXLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUNwRSxJQUFJLGFBQWEsR0FBR0EsV0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDOUMsYUFBYSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN6RCxJQUFJLE9BQU8sRUFBRSxDQUFDLFVBQVUsS0FBSyxXQUFXLEVBQUU7Z0NBQ3RDLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDOzZCQUMxRDt5QkFDSjt3QkFDRCxJQUFJLEdBQUcsQ0FBQyxTQUFPLENBQUEsRUFBRTs0QkFDYiw4QkFBNEIsQ0FBQyxLQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQU8sQ0FBQSxDQUFDLENBQUMsQ0FBQzt5QkFDdEU7cUJBQ0osQ0FBQzs7b0JBRUYsOEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3JDO2FBQ0o7U0FDSixDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUvQyxPQUFPLElBQUksQ0FBQztLQUNmO0lBRU8sdUNBQWUsR0FBdkIsVUFBd0IsSUFBSSxFQUFFLGFBQWE7UUFDdkMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsRUFBRTtZQUNkLElBQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUN0QixVQUFVLENBQUMsV0FBVyxHQUFHO2dCQUNyQixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7YUFDM0IsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztLQUNOO0lBRU8sd0NBQWdCLEdBQXhCLFVBQXlCLFNBQWMsRUFBRSxjQUFzQixFQUFFLFVBQWU7UUFDNUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLFNBQVM7WUFDeEIsSUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUNuRCxVQUFBLGVBQWUsSUFBSSxPQUFBLGVBQWUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLElBQUksR0FBQSxDQUM3RCxDQUFDO1lBRUYsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDbEIsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7YUFDeEQ7aUJBQU07Z0JBQ0gsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM3QztTQUNKLENBQUMsQ0FBQztLQUNOO0lBRU8sMENBQWtCLEdBQTFCLFVBQTJCLElBQVk7UUFDbkMsSUFBTSxVQUFVLEdBQUdDLFFBQU0sQ0FDckIsRUFBRSxFQUNGLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxXQUFXLENBQ25CLENBQUM7UUFDRixJQUFNLE1BQU0sR0FBR0MsTUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQVMsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sTUFBTSxJQUFJLEtBQUssQ0FBQztLQUMxQjtJQUNMLG9CQUFDO0FBQUQsQ0FBQyxJQUFBO0FBRUQsc0JBQWUsYUFBYSxDQUFDLFdBQVcsRUFBRTs7QUN6TTFDO0lBQUE7S0ErQkM7SUE5QlUsZ0NBQVEsR0FBZixVQUFnQixJQUFhO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDcEQ7SUFFTyx5Q0FBaUIsR0FBekIsVUFBMEIsSUFBYSxFQUFFLElBQW1CLEVBQUUsS0FBUztRQUF2RSxpQkFJQztRQUo2RCxzQkFBQSxFQUFBLFNBQVM7UUFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7UUFDNUUsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVPLGlDQUFTLEdBQWpCLFVBQWtCLElBQWEsRUFBRSxJQUFtQjtRQUFwRCxpQkFPQztRQU5HLElBQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUEsQ0FBQyxHQUFBLENBQUMsQ0FBQztRQUVsRixJQUFJLFVBQVUsRUFBRTtZQUNaLElBQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFBLENBQUMsQ0FBQztTQUNoRDtLQUNKO0lBRU8sMkJBQUcsR0FBWCxVQUFZLEtBQXlCLEVBQUUsSUFBbUI7UUFDdEQsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU87U0FDVjtRQUVELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pCO2FBQU07WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BCO0tBQ0o7SUFDTCxvQkFBQztBQUFELENBQUMsSUFBQTtBQUVEO0lBQ0ksdUJBQW1CLE1BQXdDLEVBQVMsS0FBd0I7UUFBekUsV0FBTSxHQUFOLE1BQU0sQ0FBa0M7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtLQUFJO0lBQ3BHLG9CQUFDO0FBQUQsQ0FBQyxJQUFBO0FBRUQsSUFBTSxnQkFBZ0IsR0FBeUI7SUFDM0MsSUFBSSxhQUFhLENBQ2IsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFBLEVBQzdCLENBQUM5QixrQkFBVSxDQUFDLGlCQUFpQixFQUFFQSxrQkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUN4RDtJQUNELElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUUsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxFQUFFLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDbEUsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdEUsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEUsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVFLElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxNQUFNLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0QsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLGFBQWEsQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzNFLElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxPQUFPLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0QsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLE1BQU0sQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3RCxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsTUFBTSxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdELElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsRUFBRSxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsR0FBRyxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxNQUFNLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN4RSxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsR0FBRyxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzdELElBQUksYUFBYSxDQUNiLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUEsRUFDbEIsQ0FBQ0Esa0JBQVUsQ0FBQyxZQUFZLEVBQUVBLGtCQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FDaEU7SUFDRCxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsR0FBRyxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlELElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxHQUFHLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUQsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLEdBQUcsQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9ELElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxHQUFHLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuRSxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RCxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkUsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLEdBQUcsQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxJQUFJLGFBQWEsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLEVBQUUsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxFQUFFLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxLQUFLLENBQUMsR0FBQSxFQUFFLENBQUNBLGtCQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEUsSUFBSSxhQUFhLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxDQUFDLEdBQUcsQ0FBQyxHQUFBLEVBQUUsQ0FBQ0Esa0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9ELElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksYUFBYSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUEsRUFBRSxDQUFDQSxrQkFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQ3pFOztBQ3pFRCxJQUFNMkIsUUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVqQztJQUNJLDZCQUFvQixNQUF1QjtRQUF2QixXQUFNLEdBQU4sTUFBTSxDQUFpQjtLQUFJO0lBRXhDLG9DQUFNLEdBQWIsVUFBYyxJQUFTLEVBQUUsT0FBWSxFQUFFLElBQVMsRUFBRSxLQUFVLEVBQUUsRUFBTzs7UUFFakUsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBSSxHQUFHQSxRQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsSUFBSSxZQUFZLEdBQWtCO1lBQzlCLElBQUksTUFBQTtZQUNKLEVBQUUsRUFBRSxZQUFZLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO1lBQ3BDLElBQUksRUFBRSxJQUFJOztZQUVWLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDeEUsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUNwRSxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1lBQ3hFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDMUQsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7O1lBRTlELFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDMUQsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDOztZQUU1RCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1lBQzFELFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDNUQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUN0RCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1lBQzFELFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDaEUsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUNwRSxXQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU07WUFDdEIsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPO1lBQ3hCLGVBQWUsRUFBRSxFQUFFLENBQUMsVUFBVTtZQUM5QixZQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU87WUFFeEIsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVO1lBQ3pCLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0I7WUFFekMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZO1lBQzdCLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYTtZQUUvQixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7WUFDM0IsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjO1lBQ2pDLElBQUksRUFBRSxXQUFXO1lBQ2pCLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVuRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUNoRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1lBQzFELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUN0RCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1lBQzVELFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDOUQsYUFBYSxFQUFFLEVBQUU7WUFDakIsVUFBVSxFQUFFLEVBQUU7U0FDakIsQ0FBQztRQUNGLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxXQUFXLEVBQUU7WUFDcEYsWUFBWSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQzFFLEtBQUssRUFDTCxPQUFPLENBQ1YsQ0FBQztTQUNMO1FBQ0QsSUFBSW5CLGVBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7WUFDOUMsWUFBWSxDQUFDLFlBQVksR0FBRyw4QkFBOEIsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDekY7UUFDRCxJQUFJLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLFlBQVksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDakQ7UUFDRCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEIsWUFBWSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO1NBQ2hEO1FBQ0QsSUFBSSxFQUFFLENBQUMsU0FBTyxDQUFBLEVBQUU7WUFDWixZQUFZLENBQUMsU0FBTyxDQUFBLEdBQUcsRUFBRSxDQUFDLFNBQU8sQ0FBQSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxFQUFFLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQyxZQUFZLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7U0FDM0M7UUFDRCxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7WUFDZCxZQUFZLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7U0FDekM7UUFFRCxPQUFPLFlBQVksQ0FBQztLQUN2QjtJQUNMLDBCQUFDO0FBQUQsQ0FBQzs7QUN0RkQsSUFBTW1CLFFBQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFakM7SUFDSTtLQUFnQjtJQUVULHFDQUFNLEdBQWIsVUFDSSxJQUFTLEVBQ1QsT0FBc0IsRUFDdEIsSUFBWSxFQUNaLFVBQXNELEVBQ3RELEVBQU87UUFFUCxJQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBTSxJQUFJLEdBQUdBLFFBQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRSxJQUFNLEtBQUssR0FBbUI7WUFDMUIsSUFBSSxNQUFBO1lBQ0osRUFBRSxFQUFFLGFBQWEsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7WUFDckMsSUFBSSxFQUFFLElBQUk7WUFDVixZQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU87WUFDeEIsSUFBSSxFQUFFLFlBQVk7WUFDbEIsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1lBQzNCLGNBQWMsRUFBRSxFQUFFLENBQUMsY0FBYztZQUNqQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDeEIsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVO1lBQ3pCLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0I7U0FDNUMsQ0FBQztRQUNGLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDcEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQ3JDO1NBQ0o7UUFDRCxJQUFJLEVBQUUsQ0FBQyxTQUFPLENBQUEsRUFBRTtZQUNaLEtBQUssQ0FBQyxTQUFPLENBQUEsR0FBRyxFQUFFLENBQUMsU0FBTyxDQUFBLENBQUM7U0FDOUI7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUNMLDJCQUFDO0FBQUQsQ0FBQzs7QUNsQ0QsSUFBTUEsUUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVqQztJQUNJLDZCQUFvQixNQUF1QjtRQUF2QixXQUFNLEdBQU4sTUFBTSxDQUFpQjtLQUFJO0lBRXhDLG9DQUFNLEdBQWIsVUFBYyxJQUFTLEVBQUUsT0FBWSxFQUFFLElBQVMsRUFBRSxLQUFVLEVBQUUsRUFBTztRQUNqRSxJQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBTSxJQUFJLEdBQUdBLFFBQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRSxJQUFNLGFBQWEsR0FBa0I7WUFDakMsSUFBSSxNQUFBO1lBQ0osRUFBRSxFQUFFLFlBQVksR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7WUFDcEMsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsV0FBVztZQUNqQixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7WUFDM0IsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjO1lBQ2pDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDMUQsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUU1RCxXQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU07WUFDdEIsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPO1lBRXhCLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTtZQUN6QixrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCO1lBRXpDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtZQUM3QixhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWE7WUFFL0IsZUFBZSxFQUFFLEVBQUUsQ0FBQyxVQUFVO1lBQzlCLFlBQVksRUFBRSxFQUFFLENBQUMsT0FBTztZQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdEUsQ0FBQztRQUNGLElBQUluQixlQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFO1lBQzlDLGFBQWEsQ0FBQyxZQUFZLEdBQUcsOEJBQThCLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzNGO1FBQ0QsSUFBSSxFQUFFLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QyxhQUFhLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxFQUFFLENBQUMsU0FBTyxDQUFBLEVBQUU7WUFDWixhQUFhLENBQUMsU0FBTyxDQUFBLEdBQUcsRUFBRSxDQUFDLFNBQU8sQ0FBQSxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxFQUFFLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQyxhQUFhLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7U0FDNUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEIsYUFBYSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO1NBQ2pEO1FBQ0QsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFO1lBQ2QsYUFBYSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7S0FDeEI7SUFDTCwwQkFBQztBQUFELENBQUM7O0FDdkREO0lBQUE7S0FvQ0M7SUFuQ1UseUNBQW1CLEdBQTFCLFVBQ0ksUUFBZ0IsRUFDaEIsVUFBeUIsRUFDekIsSUFBYTtRQUViLElBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxLQUFLLFdBQVcsRUFBRTtZQUM5QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM1RDtRQUVELE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBRU8scUNBQWUsR0FBdkIsVUFBd0IsVUFBdUMsRUFBRSxJQUFhO1FBQTlFLGlCQUVDO1FBREcsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUEsQ0FBQyxDQUFDO0tBQzdEO0lBRU8sb0NBQWMsR0FBdEIsVUFBdUIsU0FBdUIsRUFBRSxJQUFhO1FBQ3pELElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUMxRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZDO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUVPLGlDQUFXLEdBQW5CLFVBQW9CLE1BQStCO1FBQW5ELGlCQUlDO1FBSEcsT0FBTyxNQUFNO2FBQ1IsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUEsQ0FBQzthQUN4QyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDLENBQUM7S0FDL0M7SUFFTyxvQ0FBYyxHQUF0QixVQUF1QixJQUFnQztRQUNuRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsR0FBQSxDQUFDLENBQUM7S0FDckU7SUFDTCxrQkFBQztBQUFELENBQUM7O0FDakNEO0lBQ0ksc0JBQ1ksS0FBcUIsRUFDckIsWUFBK0M7UUFBL0MsNkJBQUEsRUFBQSxtQkFBaUMsWUFBWSxFQUFFO1FBRC9DLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFtQztLQUN2RDtJQUVHLHlDQUFrQixHQUF6QixVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRjFCLGlCQU9DO1FBSEcsT0FBTyxJQUFJLENBQUMsWUFBWTthQUNuQixhQUFhLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUM7YUFDMUMsR0FBRyxDQUFDLFVBQUEsWUFBWSxJQUFJLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUEsQ0FBQyxDQUFDO0tBQzNGO0lBRU0sMkNBQW9CLEdBQTNCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFGMUIsaUJBT0M7UUFIRyxPQUFPLElBQUksQ0FBQyxZQUFZO2FBQ25CLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQzthQUM1QyxHQUFHLENBQUMsVUFBQSxZQUFZLElBQUksT0FBQSxLQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsR0FBQSxDQUFDLENBQUM7S0FDM0Y7SUFFTSw0Q0FBcUIsR0FBNUIsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUYxQixpQkFhQztRQVRHLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJO1lBQzNFLElBQUksU0FBUyxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXJDLElBQUksU0FBUyxFQUFFO2dCQUNYLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO1lBRUQsT0FBTyxLQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNoRSxDQUFDLENBQUM7S0FDTjtJQUVNLCtDQUF3QixHQUEvQixVQUNJLEtBQWlELEVBQ2pELE9BQXNCO1FBRjFCLGlCQWFDO1FBVEcsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSTtZQUM5RSxJQUFJLFNBQVMsR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVyQyxJQUFJLFNBQVMsRUFBRTtnQkFDWCxPQUFPLFNBQVMsQ0FBQzthQUNwQjtZQUVELE9BQU8sS0FBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDaEUsQ0FBQyxDQUFDO0tBQ047SUFFTyxpREFBMEIsR0FBbEMsVUFBbUMsSUFBWTtRQUMzQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QjtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFTSx1Q0FBZ0IsR0FBdkIsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUYxQixpQkFRQztRQUpHLE9BQU8sSUFBSSxDQUFDLFlBQVk7YUFDbkIsYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDO2FBQ3hDLEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDO2FBQ2xELEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUEsQ0FBQyxDQUFDO0tBQ2xFO0lBRU0sdUNBQWdCLEdBQXZCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFGMUIsaUJBT0M7UUFIRyxPQUFPLElBQUksQ0FBQyxZQUFZO2FBQ25CLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQzthQUN4QyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxLQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBQSxDQUFDLENBQUM7S0FDM0U7SUFFTSwwQ0FBbUIsR0FBMUIsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQy9EO0lBRU0sa0NBQVcsR0FBbEIsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUV0QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUMzRCxFQUFFLENBQUM7UUFDUCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDZjtRQUNELE9BQU8sRUFBRSxDQUFDO0tBQ2I7SUFFTSx1Q0FBZ0IsR0FBdkIsVUFDSSxLQUFpRCxFQUNqRCxPQUFzQjtRQUV0QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0lBRU0seUNBQWtCLEdBQXpCLFVBQ0ksS0FBaUQsRUFDakQsT0FBc0I7UUFGMUIsaUJBT0M7UUFIRyxPQUFPLElBQUksQ0FBQyxZQUFZO2FBQ25CLGFBQWEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQzthQUMxQyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxLQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBQSxDQUFDLENBQUM7S0FDM0U7SUFDTCxtQkFBQztBQUFELENBQUM7O0FDcEhELElBQU1tQixRQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRWpDO0lBQ0ksMEJBQW9CLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO0tBQUk7SUFFM0MsaUNBQU0sR0FBYixVQUNJLElBQVMsRUFDVCxPQUFzQixFQUN0QixJQUFZLEVBQ1osVUFBc0QsRUFDdEQsRUFBTztRQUVQLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxJQUFJLElBQUksR0FBR0EsUUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLE9BQU87WUFDSCxJQUFJLE1BQUE7WUFDSixFQUFFLEVBQUUsU0FBUyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtZQUNqQyxJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDO1lBQ3hELFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7WUFDcEUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztZQUMxRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDO1lBQ3hFLGVBQWUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7WUFDaEYsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztZQUNoRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDO1lBQ2hFLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7WUFDaEUsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQztZQUNwRSxJQUFJLEVBQUUsUUFBUTtZQUNkLGNBQWMsRUFBRSxFQUFFLENBQUMsY0FBYztZQUNqQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU87WUFDbkIsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1lBQzNCLFVBQVUsRUFBRSxPQUFPLENBQUMsSUFBSTtZQUN4QixVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7WUFDekIsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQjtTQUM5QixDQUFDO0tBQ25CO0lBQ0wsdUJBQUM7QUFBRCxDQUFDOztBQ3RDRCxJQUFNQSxRQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRWpDO0lBQ0k7S0FBZ0I7SUFFVCxpQ0FBTSxHQUFiLFVBQ0ksSUFBUyxFQUNULE9BQXNCLEVBQ3RCLElBQVksRUFDWixVQUFzRCxFQUN0RCxFQUFPO1FBRVAsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLElBQU0sSUFBSSxHQUFHQSxRQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUUsSUFBTSxLQUFLLEdBQWU7WUFDdEIsSUFBSSxNQUFBO1lBQ0osRUFBRSxFQUFFLGFBQWEsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7WUFDckMsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztZQUMzQixjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWM7WUFDakMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ3hCLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTtZQUN6QixrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCO1lBQ3pDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTtTQUM1QixDQUFDO1FBQ0YsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFDTCx1QkFBQztBQUFELENBQUM7O0FDb0JELElBQU1BLFFBQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekIsSUFBQXhCLFFBQU0sR0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQXRCLENBQXVCO0FBQ3JDLElBQU0sR0FBRyxHQUFHLElBQUltQixlQUFPLEVBQUUsQ0FBQztBQUUxQjtBQUVBO0lBQXlDLHVDQUFxQjtJQVExRCw2QkFBWSxLQUFlLEVBQUUsT0FBWTtRQUF6QyxZQUNJLGtCQUFNLEtBQUssRUFBRSxPQUFPLENBQUMsU0FDeEI7UUFSTyxXQUFLLEdBQW1CLElBQUksY0FBYyxFQUFFLENBQUM7UUFDN0Msa0JBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsaUJBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLGtCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxxQkFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7O0tBSS9DO0lBRU0sNkNBQWUsR0FBdEI7UUFBQSxpQkE2SkM7UUE1SkcsSUFBSSxJQUFJLEdBQUc7WUFDUCxPQUFPLEVBQUUsRUFBRTtZQUNYLGVBQWUsRUFBRSxFQUFFO1lBQ25CLFVBQVUsRUFBRSxFQUFFO1lBQ2QsV0FBVyxFQUFFLEVBQUU7WUFDZixRQUFRLEVBQUUsRUFBRTtZQUNaLFdBQVcsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEVBQUU7WUFDaEIsTUFBTSxFQUFFLEVBQUU7WUFDVixLQUFLLEVBQUUsRUFBRTtZQUNULFVBQVUsRUFBRSxFQUFFO1lBQ2QsTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsRUFBRTtZQUNYLFVBQVUsRUFBRSxFQUFFO1lBQ2QsYUFBYSxFQUFFO2dCQUNYLFNBQVMsRUFBRSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxFQUFFO2dCQUNiLFdBQVcsRUFBRSxFQUFFO2dCQUNmLFlBQVksRUFBRSxFQUFFO2FBQ25CO1lBQ0QsVUFBVSxFQUFFLFNBQVM7U0FDeEIsQ0FBQztRQUVGLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO1FBRXhELFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBQyxJQUFtQjtZQUNoQyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRS9CLElBQUlqQixlQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSUEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxNQUFNLEVBQUU7Z0JBQ3ZFLElBQUksQ0FBQ0csZUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSUgsZUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUU7b0JBQzlFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNqQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUM1QztxQkFBTTtvQkFDSCxJQUNJLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNwQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUN4Qzt3QkFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFDakMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDNUM7aUJBQ0o7YUFDSjtZQUVELE9BQU8sSUFBSSxDQUFDO1NBQ2YsQ0FBQyxDQUFDOzs7UUFLSCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUEsU0FBUztnQkFDMUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztnQkFHaEIsQ0FBQyxVQUFDLElBQUksRUFBRSxPQUFPOztvQkFFWCxJQUFNLGVBQWUsR0FBRyxVQUFBLGlCQUFpQjt3QkFDckMsSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLEVBQUU7NEJBQy9CLElBQUksaUJBQWlCLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRTtnQ0FDeEMsSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0NBQ25ELGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTzs7d0NBRWxELElBQ0ksT0FBTyxDQUFDLElBQUk7NENBQ1osT0FBTyxDQUFDLElBQUksS0FBS0wsa0JBQVUsQ0FBQyxVQUFVLEVBQ3hDOzRDQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0RBQ1IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dEQUNsQixJQUFJLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzs2Q0FDaEQsQ0FBQyxDQUFDO3lDQUNOOzs7O3dDQUlELElBQ0ksT0FBTyxDQUFDLElBQUksS0FBS0Esa0JBQVUsQ0FBQyxhQUFhOzRDQUN6QyxPQUFPLENBQUMsVUFBVSxFQUNwQjs0Q0FDRSxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3hDLFVBQUEsUUFBUTtnREFDSixPQUFBLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJOzZDQUFBLENBQ2hELENBQUM7NENBQ0YsSUFBSSxFQUFFLEVBQUU7Z0RBQ0osZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzZDQUN2Qjt5Q0FDSjtxQ0FDSixDQUFDLENBQUM7aUNBQ047NkJBQ0o7eUJBQ0o7cUJBQ0osQ0FBQztvQkFDRixlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3pCLEVBQUUsU0FBaUIsQ0FBQyxDQUFDO2dCQUV0QixJQUFNLE1BQU0sR0FBRyxVQUFBLEdBQUc7b0JBQ2QsSUFBTSxPQUFPLEdBQUcsVUFBQyxZQUFZLEVBQUUsSUFBSTt3QkFDL0IsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO3dCQUNyQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7d0JBQ2xCLElBQU0sbUJBQW1CLEdBQUcsVUFBQyxFQUFFLEVBQUUsS0FBSzs0QkFDbEMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0NBQ3ZCLFlBQVksR0FBRyxLQUFLLENBQUM7Z0NBQ3JCLEtBQUssR0FBRyxJQUFJLENBQUM7NkJBQ2hCO3lCQUNKLENBQUM7d0JBQ0YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOzt3QkFFMUMsSUFBSSxLQUFLLEVBQUU7NEJBQ1AsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7OzRCQUVyQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTTtnQ0FDakIsSUFDSSxPQUFPRCxZQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7b0NBQ2xELFdBQVcsRUFDYjtvQ0FDRSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lDQUM3Qjs2QkFDSixDQUFDLENBQUM7eUJBQ047cUJBQ0osQ0FBQztvQkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7aUJBQ3JDLENBQUM7Z0JBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3hDLENBQUMsQ0FBQztTQUNOOzs7Ozs7Ozs7Ozs7O1FBY0QsSUFBSSxHQUFHZ0MsZUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O1FBS2pDLElBQUksQ0FBQ3ZCLGVBQWEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUU7WUFDNUN3QixrQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3hDQSxrQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBRXhDLElBQUksQ0FBQyxVQUFVLEdBQUdBLGtCQUFnQixDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUQ7UUFFRCxPQUFPLElBQUksQ0FBQztLQUNmO0lBRU8sMENBQVksR0FBcEIsVUFBcUIsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVE7UUFDN0QsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFNLElBQUksR0FBR0wsUUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFFLElBQU0sSUFBSSxHQUFRO1lBQ2QsSUFBSSxNQUFBO1lBQ0osRUFBRSxFQUFFLFFBQVEsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7WUFDaEMsSUFBSSxFQUFFLElBQUk7WUFDVixVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7WUFDekIsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQjtZQUN6QyxJQUFJLEVBQUUsT0FBTztZQUNiLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFO1NBQ2hDLENBQUM7UUFDRixJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUVsQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQztTQUNyQztRQUNELElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7U0FDM0M7UUFDRCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFDWixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUM7U0FDN0I7UUFDRCxJQUFJLEVBQUUsQ0FBQyxlQUFlLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxFQUFFLENBQUMsU0FBTyxDQUFBLEVBQUU7WUFDWixJQUFJLENBQUMsU0FBTyxDQUFBLEdBQUcsRUFBRSxDQUFDLFNBQU8sQ0FBQSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxFQUFFLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO1lBQ1osSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQztTQUN2QztRQUNELElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRTtZQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7U0FDekM7UUFDRCxJQUFJbkIsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtZQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLDhCQUE4QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvRDtRQUNELElBQUksRUFBRSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO1lBRWhDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUU7O2dCQUU3QixxQkFBcUIsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO2dCQUVwQixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNuQztTQUNKO1FBQ0QsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFakIsSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUN4QixhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNwQztTQUNKO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO0tBQ0o7SUFFTyxxREFBdUIsR0FBL0IsVUFBZ0MsY0FBNkIsRUFBRSxhQUFrQjtRQUFqRixpQkE0cEJDO1FBM3BCRyxJQUFNLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBR0gsZUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELElBQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUM7O1FBSWpDLElBQU0sT0FBTyxHQUNULE9BQU8sR0FBRyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssV0FBVztjQUMzRCxHQUFHLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7Y0FDMUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUzRCxJQUFNLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pFLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRWhDLElBQUksd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7WUFFckMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztnQkFDOUIsSUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2pELElBQUksR0FBRyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztnQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2xCLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTt3QkFDM0MsSUFDSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVE7NEJBQ2xELG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQ3RFOzRCQUNFLG1CQUFtQixHQUFHLElBQUksQ0FBQzt5QkFDOUI7cUJBQ0o7aUJBQ0o7YUFDSixDQUFDLENBQUM7U0FDTjtRQUVELElBQUksbUJBQW1CLElBQUksQ0FBQ0csZUFBYSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTs7WUFFbkUsTUFBTSxDQUFDLElBQUksQ0FBQywwREFBMEQsQ0FBQyxDQUFDOztZQUd4RXdCLGtCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTNDLFdBQVcsR0FBR0Esa0JBQWdCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQzFFLFdBQVcsR0FBR0Esa0JBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBRXZFLFdBQVcsQ0FBQyxJQUFJLEdBQUdoQyxrQkFBVSxDQUFDLFVBQVUsQ0FBQztTQUM1QztRQUVEQyxVQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxVQUFDLFdBQW9CO1lBQzlDLElBQ0ksS0FBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQztnQkFDeEVPLGVBQWEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUN4QztnQkFDRSxPQUFPO2FBQ1Y7WUFDRCxJQUFNLFNBQVMsR0FBRyxVQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVE7Z0JBQzVDLElBQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckMsSUFBTSxJQUFJLEdBQUdtQixRQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTFFLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDakIsSUFBSSwwQkFBd0IsR0FBRyxLQUFLLENBQUM7b0JBQ3JDLElBQU0sY0FBYyxHQUFHLFVBQUMsZ0JBQWdCLEVBQUUsS0FBSzt3QkFDM0MsSUFBSSxJQUFVLENBQUM7d0JBRWYsSUFBTSxJQUFJLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDdkMsSUFBTSxLQUFLLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQzt3QkFDN0QsSUFBTSxFQUFFLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQzFDLElBQUksRUFDSixPQUFPLEVBQ1AsSUFBSSxFQUNKLFFBQVEsQ0FDWCxDQUFDO3dCQUVGLElBQUksS0FBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFOzRCQUNqQyxJQUFNLFNBQVMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQzVELElBQUksRUFDSixPQUFPLEVBQ1AsSUFBSSxFQUNKLEtBQUssRUFDTCxFQUFFLENBQ0wsQ0FBQzs0QkFDRixJQUFJSyxrQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0NBQzlEQSxrQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FDaEMsSUFBSSxFQUNKLEtBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUNyRCxJQUFJLENBQ1AsQ0FBQzs2QkFDTDs0QkFDRCxJQUFJLEdBQUcsU0FBUyxDQUFDOzRCQUNqQixJQUFJLE9BQU8sRUFBRSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0NBQ2xDQSxrQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQ0FDcEQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBQ3RDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzZCQUNqRDt5QkFDSjs2QkFBTSxJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRTs0QkFDM0MsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQ0FDcEIsT0FBTzs2QkFDVjs0QkFDRCxJQUFNLFlBQVksR0FBRyxJQUFJLG1CQUFtQixDQUN4QyxLQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQ3pDLElBQUksR0FBRyxZQUFZLENBQUM7NEJBQ3BCLElBQUksT0FBTyxFQUFFLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRTtnQ0FDbENDLHNCQUFvQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQ0FDaEQsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7NkJBQy9DO3lCQUNKOzZCQUFNLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFOzRCQUM1QyxJQUFNLGFBQWEsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUMsTUFBTSxDQUNuRCxJQUFJLEVBQ0osT0FBTyxFQUNQLElBQUksRUFDSixLQUFLLEVBQ0wsRUFBRSxDQUNMLENBQUM7NEJBQ0YsSUFBSSxHQUFHLGFBQWEsQ0FBQzs0QkFDckIsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFO2dDQUNsQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzs2QkFDakQ7eUJBQ0o7NkJBQU0sSUFBSSxLQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7NEJBQ3hDLElBQU0sU0FBUyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLENBQzNDLElBQUksRUFDSixPQUFPLEVBQ1AsSUFBSSxFQUNKLEtBQUssRUFDTCxFQUFFLENBQ0wsQ0FBQzs0QkFDRixJQUFJLEdBQUcsU0FBUyxDQUFDOzRCQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dDQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDbkM7NEJBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFO2dDQUNsQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs2QkFDMUM7eUJBQ0o7NkJBQU0sSUFBSSxLQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7NEJBQzVDLElBQU0sY0FBYyxHQUFtQjtnQ0FDbkMsSUFBSSxNQUFBO2dDQUNKLEVBQUUsRUFBRSxhQUFhLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO2dDQUNyQyxJQUFJLEVBQUUsSUFBSTtnQ0FDVixVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7Z0NBQ3pCLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTztnQ0FDbkIsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVO2dDQUN6QixrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCO2dDQUN6QyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7Z0NBQzNCLGNBQWMsRUFBRSxFQUFFLENBQUMsY0FBYztnQ0FDakMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0NBQzdCLFdBQVcsRUFBRSxLQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUNyRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQ3BCOzZCQUNKLENBQUM7NEJBQ0YsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2dDQUNoQixjQUFjLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7NkJBQ2xEOzRCQUNELElBQUksRUFBRSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQ3pDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NkJBQ25EOzRCQUNELElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRTtnQ0FDZCxjQUFjLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7NkJBQzNDOzRCQUNELElBQUksRUFBRSxDQUFDLFNBQU8sQ0FBQSxFQUFFO2dDQUNaLGNBQWMsQ0FBQyxTQUFPLENBQUEsR0FBRyxFQUFFLENBQUMsU0FBTyxDQUFBLENBQUM7NkJBQ3ZDOzRCQUNELElBQUksR0FBRyxjQUFjLENBQUM7NEJBQ3RCLElBQUksT0FBTyxFQUFFLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRTtnQ0FDbEMsSUFBSWxDLFlBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO29DQUM5QyxjQUFjLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztvQ0FDcEMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7aUNBQ25EO3FDQUFNLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUU7b0NBQ3BDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO29DQUM5QixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQ0FDN0M7cUNBQU07b0NBQ0gsY0FBYyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7b0NBQ25DLEtBQUksQ0FBQyxtQkFBbUIsQ0FDcEIsY0FBYyxFQUNkLGFBQWEsQ0FBQyxXQUFXLENBQzVCLENBQUM7aUNBQ0w7NkJBQ0o7eUJBQ0o7NkJBQU0sSUFBSSxLQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7NEJBQ3RDLElBQU0sUUFBUSxHQUFhO2dDQUN2QixJQUFJLE1BQUE7Z0NBQ0osRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7Z0NBQy9CLElBQUksRUFBRSxJQUFJO2dDQUNWLElBQUksRUFBRSxNQUFNO2dDQUNaLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTtnQ0FDekIsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQjtnQ0FDekMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO2dDQUMzQixjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWM7Z0NBQ2pDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTtnQ0FDekIsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPO2dDQUNuQixJQUFJLEVBQUUsS0FBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2dDQUMzRCxNQUFNLEVBQUUsS0FBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2dDQUM3RCxVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQ0FDN0IsV0FBVyxFQUFFLEtBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQ3JELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FDcEI7NkJBQ0osQ0FBQzs0QkFDRixJQUFJLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dDQUN6QyxRQUFRLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzZCQUM3Qzs0QkFDRCxJQUFJLEdBQUcsUUFBUSxDQUFDOzRCQUNoQixJQUFJLE9BQU8sRUFBRSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0NBQ2xDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzZCQUN0Qzt5QkFDSjs2QkFBTSxJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRTs0QkFDM0MsSUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsQ0FDekMsS0FBSSxDQUFDLGVBQWUsQ0FDdkIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUN6QyxJQUFJLEdBQUcsYUFBYSxDQUFDOzRCQUNyQixJQUFJLE9BQU8sRUFBRSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0NBQ2xDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOzZCQUNoRDt5QkFDSjs2QkFBTTs0QkFDSCxJQUFNLG9DQUFvQyxHQUFHLEtBQUksQ0FBQyxvQkFBb0IsQ0FDbEUsSUFBSSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQzs7NEJBRUYsSUFDSSxDQUFDLDBCQUF3QjtnQ0FDekIsQ0FBQyxvQ0FBb0MsRUFDdkM7Z0NBQ0UsMEJBQXdCLEdBQUcsSUFBSSxDQUFDO2dDQUNoQyxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQzs2QkFDbkU7eUJBQ0o7d0JBQ0QsS0FBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUUzQixJQUFJLE9BQU8sRUFBRSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7NEJBQ2xDLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3BCOzZCQUFNOzRCQUNILEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3JCO3FCQUNKLENBQUM7b0JBRUYsSUFBTSxrQkFBa0IsR0FBRyxVQUFBLFlBQVk7d0JBQ25DLElBQUksWUFBWSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTs0QkFDL0QsSUFBSSxLQUFLLEdBQUcsZ0RBQWdELENBQUMsSUFBSSxDQUM3RCxZQUFZLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQzFDLENBQUM7NEJBQ0YsSUFBSSxDQUFDLEtBQUssSUFBSUUsVUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFO2dDQUN2QyxLQUFLLEdBQUcsSUFBSSxDQUFDOzZCQUNoQjs0QkFDRCxPQUFPLEtBQUssQ0FBQzt5QkFDaEI7d0JBQ0QsSUFBSUEsVUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUM3QixPQUFPLElBQUksQ0FBQzt5QkFDZjt3QkFDRCxPQUFPLEtBQUssQ0FBQztxQkFDaEIsQ0FBQztvQkFFRixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDdEU7cUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLQSxVQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRTt3QkFDNUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7cUJBQ25FO3lCQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUtBLFVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO3dCQUN2RCxJQUFNLElBQUksR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN2QyxJQUFNLEVBQUUsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUM5RCxJQUFNLGFBQWEsR0FBa0I7NEJBQ2pDLElBQUksTUFBQTs0QkFDSixFQUFFLEVBQUUsWUFBWSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTs0QkFDcEMsSUFBSSxFQUFFLElBQUk7NEJBQ1YsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVOzRCQUN6QixrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCOzRCQUN6QyxJQUFJLEVBQUUsV0FBVzs0QkFDakIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUU7eUJBQ2hDLENBQUM7d0JBQ0YsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFOzRCQUNmLGFBQWEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQzt5QkFDNUM7d0JBQ0QsSUFBSSxFQUFFLENBQUMsZUFBZSxFQUFFOzRCQUNwQixhQUFhLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7eUJBQ3REO3dCQUNELElBQUksRUFBRSxDQUFDLElBQUksRUFBRTs0QkFDVCxhQUFhLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7eUJBQ2hDO3dCQUNELElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTs0QkFDaEIsYUFBYSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDOzRCQUMzQyxhQUFhLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7eUJBQ3BEO3dCQUNELElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTs0QkFDWixhQUFhLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUM7eUJBQ3RDO3dCQUNELElBQUksRUFBRSxDQUFDLFNBQU8sQ0FBQSxFQUFFOzRCQUNaLGFBQWEsQ0FBQyxTQUFPLENBQUEsR0FBRyxFQUFFLENBQUMsU0FBTyxDQUFBLENBQUM7eUJBQ3RDO3dCQUNELElBQUksT0FBTyxFQUFFLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRTs0QkFDbEMsS0FBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDMUIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQ2hEOzZCQUFNOzRCQUNILEtBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQzlCO3FCQUNKO3lCQUFNLElBQUlBLFVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDdkMsSUFBTSxLQUFLLEdBQUcsS0FBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNsRCxJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUN4QixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO3dCQUNwQyxJQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDcEQsSUFBTSxXQUFXLEdBQW9COzRCQUNqQyxJQUFJLE1BQUE7NEJBQ0osSUFBSSxFQUFFLElBQUk7NEJBQ1YsS0FBSyxFQUFFLGVBQWU7NEJBQ3RCLE9BQU8sRUFBRSxVQUFVOzRCQUNuQixVQUFVLFlBQUE7NEJBQ1Ysa0JBQWtCLG9CQUFBOzRCQUNsQixXQUFXLEVBQUUsS0FBSSxDQUFDLGdEQUFnRCxDQUFDLElBQUksQ0FBQzt5QkFDM0UsQ0FBQzt3QkFDRixJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7NEJBQ1osV0FBVyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO3lCQUNqQzt3QkFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7NEJBQ2xCLFdBQVcsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzt5QkFDN0M7d0JBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDL0MsV0FBVyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO3lCQUMzQzt3QkFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7NEJBQ3JDLElBQ0ksRUFDSSxLQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztnQ0FDOUNPLGVBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUN4QyxFQUNIO2dDQUNFLEtBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0NBQ3hCLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzs2QkFDM0Q7eUJBQ0o7cUJBQ0o7eUJBQU0sSUFBSVAsVUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNuQyxJQUFNLEtBQUssR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzlDLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7d0JBQ3hCLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7d0JBQ3BDLElBQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDO3dCQUNwRCxJQUFNLFFBQVEsR0FBZ0I7NEJBQzFCLElBQUksTUFBQTs0QkFDSixNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU87NEJBQ3JCLEtBQUssRUFBRSxlQUFlOzRCQUN0QixPQUFPLEVBQUUsTUFBTTs0QkFDZixVQUFVLFlBQUE7NEJBQ1Ysa0JBQWtCLG9CQUFBOzRCQUNsQixXQUFXLEVBQ1AsS0FBSSxDQUFDLGdEQUFnRCxDQUFDLElBQUksQ0FBQzs0QkFDL0QsSUFBSSxFQUFFLElBQUk7eUJBQ2IsQ0FBQzt3QkFFRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUNqQixLQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUNyQixhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQzNEO3FCQUNKO3lCQUFNLElBQUlBLFVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDeEMsSUFBTSxLQUFLLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM5QyxJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUN4QixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO3dCQUNwQyxJQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDcEQsSUFBTSxhQUFhLEdBQXFCOzRCQUNwQyxJQUFJLE1BQUE7NEJBQ0osS0FBSyxFQUFFLGVBQWU7NEJBQ3RCLE9BQU8sRUFBRSxXQUFXOzRCQUNwQixPQUFPLEVBQUUsS0FBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDOzRCQUN6QyxJQUFJLEVBQUUsSUFBSTs0QkFDVixVQUFVLFlBQUE7NEJBQ1Ysa0JBQWtCLG9CQUFBOzRCQUNsQixXQUFXLEVBQUUsS0FBSSxDQUFDLGdEQUFnRCxDQUFDLElBQUksQ0FBQzt5QkFDM0UsQ0FBQzt3QkFDRixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7NEJBQ1gsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs0QkFDcEMsSUFBSSxhQUFhLENBQUMsT0FBTyxLQUFLLEVBQUUsRUFBRTtnQ0FDOUIsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs2QkFDNUQ7eUJBQ0o7d0JBRUQsSUFDSSxhQUFhLENBQUMsSUFBSTs0QkFDbEIsYUFBYSxDQUFDLElBQUksS0FBS0Qsa0JBQVUsQ0FBQyxtQkFBbUI7NEJBQ3JELElBQUksQ0FBQyxJQUFJLEVBQ1g7NEJBQ0UsYUFBYSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2hCLENBQUM7eUJBQ0w7d0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDakIsYUFBYSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3lCQUMvRDt3QkFFRCxJQUFJLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7NEJBQ3JDLEtBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQzdCO3FCQUNKO3lCQUFNLElBQUlDLFVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDckMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFOzRCQUNYLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQ0FDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUEsU0FBUztvQ0FDbEMsT0FBQSxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztpQ0FBQSxDQUNqRCxDQUFDOzZCQUNMO3lCQUNKO3FCQUNKO2lCQUNKO3FCQUFNO29CQUNILElBQU0sRUFBRSxHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFO3dCQUNYLElBQUksU0FBUyxTQUFBLENBQUM7d0JBQ2QsSUFBSTs0QkFDQSxTQUFTLEdBQUcrQixrQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7eUJBQy9EO3dCQUFDLE9BQU8sQ0FBQyxFQUFFOzs0QkFFUixNQUFNLENBQUMsS0FBSyxDQUNSLHdIQUF3SCxDQUMzSCxDQUFDOzRCQUNGLFNBQVMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQ3pDQSxrQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQztnQ0FDaEMsSUFBSSxFQUFFLFNBQVM7Z0NBQ2YsSUFBSSxFQUFFLElBQUk7NkJBQ2IsQ0FBQyxDQUFDOzRCQUNILE9BQU8sSUFBSSxDQUFDO3lCQUNmO3dCQUNELGFBQWEsQ0FBQyxNQUFNLDBDQUFPLGFBQWEsQ0FBQyxNQUFNLGtCQUFLLFNBQVMsU0FBQyxDQUFDO3FCQUNsRTtvQkFDRCxJQUFJL0IsVUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUM3QixLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztxQkFDbkU7b0JBQ0QsSUFBSUEsVUFBRSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJQSxVQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUMxRCxJQUFNLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDOzs7Ozs7Ozs7O3dCQVVuRCxJQUFJLFlBQVUsQ0FBQzt3QkFDZixJQUFJLFVBQVUsU0FBQSxDQUFDO3dCQUNmLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFDdkQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dDQUNqQixVQUFVLEdBQUcsS0FBSSxDQUFDLGlDQUFpQyxDQUMvQyxJQUFJLENBQUMsVUFBVSxFQUNmLGlCQUFpQixDQUNwQixDQUFDOzZCQUNMOzRCQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLFdBQVcsRUFBRTtnQ0FDM0MsSUFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVU7b0NBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzFDO29DQUNFLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUN0RCxVQUFVLEdBQUcsS0FBSSxDQUFDLGlDQUFpQyxDQUMvQyxjQUFjLENBQUMsVUFBVSxFQUN6QixpQkFBaUIsQ0FDcEIsQ0FBQztpQ0FDTDs2QkFDSjs0QkFDRCxJQUFJLENBQUMsVUFBVSxFQUFFO2dDQUNiLElBQ0ksSUFBSSxDQUFDLFVBQVU7b0NBQ2YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO29DQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN0QztvQ0FDRSxVQUFVLEdBQUcsS0FBSSxDQUFDLHlDQUF5QyxDQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFDekIsaUJBQWlCLENBQ3BCLENBQUM7aUNBQ0w7NkJBQ0o7NEJBQ0QsSUFBSSxVQUFVLEVBQUU7Z0NBQ1osSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0NBQ2pDRixZQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBQyxRQUFhO3dDQUMxQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7NENBQ2YsWUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7eUNBQzlCO3FDQUNKLENBQUMsQ0FBQztpQ0FDTjtnQ0FDRCxJQUFJLFlBQVUsRUFBRTtvQ0FDWmlDLGtCQUFnQixDQUFDLGFBQWEsQ0FBQyxZQUFVLENBQUMsQ0FBQztpQ0FDOUM7NkJBQ0o7eUJBQ0o7cUJBQ0o7b0JBQ0QsSUFBSS9CLFVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDK0Isa0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzFFLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQzs7d0JBRTNCLElBQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7d0JBQ25FLElBQUksd0JBQXdCLEVBQUU7NEJBQzFCLElBQUksd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQ0FDckMsSUFDSSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO29DQUNoQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTt3Q0FDakNoQyxrQkFBVSxDQUFDLG1CQUFtQixFQUNwQztvQ0FDRSxjQUFjLEdBQUcsSUFBSSxDQUFDO2lDQUN6Qjs2QkFDSjt5QkFDSjt3QkFFRCxJQUFNLGlCQUFpQixHQUFHLFVBQUEsWUFBWTs0QkFDbEMsSUFBTSxLQUFLLEdBQVEsS0FBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUMvRCxJQUFJLEtBQUssRUFBRTtnQ0FDUCxJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO2dDQUN4QixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO2dDQUNwQyxJQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztnQ0FDcEQsSUFBTSxJQUFJLEdBQVE7b0NBQ2QsSUFBSSxNQUFBO29DQUNKLEtBQUssRUFBRSxlQUFlO29DQUN0QixPQUFPLEVBQUUsVUFBVTtvQ0FDbkIsSUFBSSxFQUFFLElBQUk7b0NBQ1YsVUFBVSxZQUFBO29DQUNWLGtCQUFrQixvQkFBQTtpQ0FDckIsQ0FBQztnQ0FDRixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0NBQ3pDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtvQ0FDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO2lDQUMxQztnQ0FDRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7b0NBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztpQ0FDeEM7Z0NBQ0QsSUFDSSxZQUFZLENBQUMsS0FBSztvQ0FDbEIsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQ0FDN0IsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQy9CO29DQUNFLElBQU0sY0FBYyxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUN0RCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUN4QixDQUFDO29DQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO29DQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHRyxRQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7aUNBQzdDO2dDQUNELElBQUkscUJBQXFCLENBQUMsWUFBWSxDQUFDLEVBQUU7b0NBQ3JDLElBQU0sa0JBQWtCLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7b0NBQ2hFNkIsa0JBQWdCLENBQUMsbUJBQW1CLENBQ2hDLElBQUksRUFDSixDQUFDLGtCQUFrQixDQUFDLEVBQ3BCLElBQUksQ0FDUCxDQUFDO29DQUNGQSxrQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2lDQUMxRDtnQ0FDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO29DQUN6QixLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29DQUNqQixhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUNBQ3BEOzZCQUNKO3lCQUNKLENBQUM7d0JBRUYsSUFBSSxjQUFjLEVBQUU7NEJBQ2hCLElBQUksd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQ0FDM0MsSUFBTSxxQkFBcUIsR0FDdkIsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQ0FFOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDbkQsSUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDdEQsSUFBTSxJQUFJLEdBQUcsb0JBQW9CLENBQUMsSUFBSTswQ0FDaEMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVc7MENBQ3JDLEVBQUUsQ0FBQztvQ0FDVCxJQUFNLElBQUksR0FBUTt3Q0FDZCxJQUFJLE1BQUE7d0NBQ0osS0FBSyxFQUFFLGVBQWU7d0NBQ3RCLE9BQU8sRUFBRSxVQUFVO3dDQUNuQixJQUFJLEVBQUUsSUFBSTtxQ0FDYixDQUFDO29DQUNGLElBQUksd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO3dDQUN6QyxJQUFJLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7NENBQ2xELElBQUksQ0FBQyxXQUFXO2dEQUNaLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7eUNBQzNEO3dDQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVc7OENBQzlCLEtBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQ2xDLElBQUksQ0FBQyxXQUFXLENBQ25COzhDQUNELFNBQVMsQ0FBQztxQ0FDbkI7b0NBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dDQUNyQyxLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3dDQUNqQixhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUNBQ3BEO2lDQUNKOzZCQUNKO3lCQUNKOzZCQUFNOzRCQUNILGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUMzQjtxQkFDSjtvQkFDRCxJQUFJL0IsVUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNqQyxJQUFNLEtBQUssR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzlDLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7d0JBQ3hCLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7d0JBQ3BDLElBQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDO3dCQUNwRCxJQUFNLElBQUksR0FBcUI7NEJBQzNCLElBQUksTUFBQTs0QkFDSixLQUFLLEVBQUUsZUFBZTs0QkFDdEIsT0FBTyxFQUFFLFdBQVc7NEJBQ3BCLE9BQU8sRUFBRSxLQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7NEJBQ3pDLElBQUksRUFBRSxJQUFJOzRCQUNWLFVBQVUsWUFBQTs0QkFDVixrQkFBa0Isb0JBQUE7NEJBQ2xCLFdBQVcsRUFBRSxLQUFJLENBQUMsZ0RBQWdELENBQUMsSUFBSSxDQUFDO3lCQUMzRSxDQUFDO3dCQUNGLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTs0QkFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3lCQUM5Qjt3QkFDRCxJQUNJLElBQUksQ0FBQyxJQUFJOzRCQUNULElBQUksQ0FBQyxJQUFJLEtBQUtELGtCQUFVLENBQUMsbUJBQW1COzRCQUM1QyxJQUFJLENBQUMsSUFBSSxFQUNYOzRCQUNFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDdkU7d0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDakIsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDakIsYUFBYSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUN0RDtxQkFDSjtvQkFDRCxJQUFJQyxVQUFFLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2hDLElBQU0sS0FBSyxHQUFHLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbEQsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQzt3QkFDeEIsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzt3QkFDcEMsSUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7d0JBQ3BELElBQU0sV0FBVyxHQUFvQjs0QkFDakMsSUFBSSxNQUFBOzRCQUNKLEtBQUssRUFBRSxlQUFlOzRCQUN0QixPQUFPLEVBQUUsVUFBVTs0QkFDbkIsSUFBSSxFQUFFLElBQUk7NEJBQ1YsVUFBVSxZQUFBOzRCQUNWLGtCQUFrQixvQkFBQTs0QkFDbEIsV0FBVyxFQUFFLEtBQUksQ0FBQyxnREFBZ0QsQ0FBQyxJQUFJLENBQUM7eUJBQzNFLENBQUM7d0JBQ0YsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFOzRCQUNaLFdBQVcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQzt5QkFDakM7d0JBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFOzRCQUNsQixXQUFXLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7eUJBQzdDO3dCQUNELElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7NEJBQy9DLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQzt5QkFDM0M7d0JBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFOzRCQUNyQyxJQUNJLEVBQ0ksS0FBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7Z0NBQzlDTyxlQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FDeEMsRUFDSDtnQ0FDRSxLQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dDQUN4QixhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7NkJBQzNEO3lCQUNKO3FCQUNKO29CQUNELElBQUlQLFVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDNUIsSUFBTSxLQUFLLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM5QyxJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUN4QixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO3dCQUNwQyxJQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDcEQsSUFBTSxRQUFRLEdBQWdCOzRCQUMxQixJQUFJLE1BQUE7NEJBQ0osTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPOzRCQUNyQixLQUFLLEVBQUUsZUFBZTs0QkFDdEIsT0FBTyxFQUFFLE1BQU07NEJBQ2YsVUFBVSxZQUFBOzRCQUNWLGtCQUFrQixvQkFBQTs0QkFDbEIsV0FBVyxFQUNQLEtBQUksQ0FBQyxnREFBZ0QsQ0FBQyxJQUFJLENBQUM7NEJBQy9ELElBQUksRUFBRSxJQUFJO3lCQUNiLENBQUM7d0JBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDakIsS0FBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDckIsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUMzRDtxQkFDSjtpQkFDSjthQUNKLENBQUM7WUFFRixTQUFTLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUNqRCxDQUFDLENBQUM7S0FDTjs7Ozs7OztJQVFPLGlEQUFtQixHQUEzQixVQUE0QixNQUFNLEVBQUUsS0FBSztRQUNyQyxJQUFNLHFCQUFxQixHQUFHRixZQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtZQUMxQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUkscUJBQXFCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO0tBQ0o7SUFFTyxtQ0FBSyxHQUFiLFVBQWMsSUFBVTtRQUNwQixJQUFJLElBQUksRUFBRTtZQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUcsSUFBSSxDQUFDLElBQU0sQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDSCxPQUFPO1NBQ1Y7UUFDRCxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPO1lBQzVFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFLLE9BQU8sTUFBRyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUM7cUJBQ1IsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksR0FBQSxDQUFDO3FCQUNoQixPQUFPLENBQUMsVUFBQSxDQUFDO29CQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLFNBQU8sQ0FBRyxDQUFDLENBQUM7aUJBQ2hDLENBQUMsQ0FBQzthQUNWO1NBQ0osQ0FBQyxDQUFDO0tBQ047SUFFTyxvQ0FBTSxHQUFkLFVBQWUsSUFBVTtRQUNyQixJQUFJLElBQUksRUFBRTtZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUcsSUFBSSxDQUFDLElBQU0sQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDSCxPQUFPO1NBQ1Y7S0FDSjtJQUVPLGlEQUFtQixHQUEzQixVQUE0QixJQUFXLEVBQUUsTUFBeUM7UUFDOUVBLFlBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQUEsR0FBRztZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixNQUFNLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7YUFDakQ7U0FDSixDQUFDLENBQUM7S0FDTjtJQUVPLCtEQUFpQyxHQUF6QyxVQUEwQyxTQUFTLEVBQUUsSUFBSTtRQUNyRCxJQUFJLE1BQU0sQ0FBQztRQUNYLElBQU0sSUFBSSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLEVBQUU7Z0JBQ04sSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM1QjtnQkFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7b0JBQ3pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTt3QkFDakMsTUFBTSxHQUFHLElBQUksQ0FBQztxQkFDakI7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVCO2lCQUNKO2FBQ0o7U0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QixPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVPLHVFQUF5QyxHQUFqRCxVQUFrRCxHQUFHLEVBQUUsSUFBSTtRQUN2RCxJQUFJLE1BQU0sQ0FBQztRQUNYLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3JCLElBQU0sSUFBSSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNYLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNWLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztvQkFDekMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDbkIsTUFBTSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDL0U7aUJBQ0o7YUFDSjtTQUNKLENBQUM7UUFDRixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVPLDZDQUFlLEdBQXZCLFVBQXdCLFVBQVUsRUFBRSxJQUFZO1FBQzVDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCQSxZQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLFNBQWM7Z0JBQzFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7b0JBQ2pDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTt3QkFDL0MsTUFBTSxHQUFHLElBQUksQ0FBQztxQkFDakI7aUJBQ0o7YUFDSixDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0gsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtnQkFDckMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUNuRCxNQUFNLEdBQUcsSUFBSSxDQUFDO2lCQUNqQjthQUNKO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVPLDRDQUFjLEdBQXRCLFVBQXVCLFNBQVMsRUFBRSxJQUFZO1FBQzFDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ2pDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDL0MsTUFBTSxHQUFHLElBQUksQ0FBQzthQUNqQjtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFFTywwQ0FBWSxHQUFwQixVQUFxQixRQUFRO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDdEQ7SUFFTyxzQ0FBUSxHQUFoQixVQUFpQixRQUFRO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDbEQ7SUFFTyx5Q0FBVyxHQUFuQixVQUFvQixRQUFRO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDckQ7SUFFTyxvQ0FBTSxHQUFkLFVBQWUsUUFBUTtRQUNuQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ2hEO0lBRU8seUNBQVcsR0FBbkIsVUFBb0IsUUFBUTtRQUN4QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQ3JEO0lBRU8sMENBQVksR0FBcEIsVUFBcUIsUUFBUTtRQUN6QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQ3REO0lBRU8sc0NBQVEsR0FBaEIsVUFBaUIsUUFBUTtRQUNyQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQy9GO0lBRU8sa0RBQW9CLEdBQTVCLFVBQTZCLFNBQVM7UUFDbEMsUUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUM7WUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO1lBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztZQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7WUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO1lBQzdDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUMzQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFDM0M7S0FDTDtJQUVPLHFDQUFPLEdBQWYsVUFBZ0IsWUFBc0I7UUFDbEMsUUFDSUEsWUFBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1lBQ3ZDQSxZQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQztZQUM1Q0EsWUFBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDO1lBQ3pDQSxZQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUM7WUFDbkNBLFlBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUNyQztLQUNMO0lBRU8sNENBQWMsR0FBdEIsVUFBdUIsSUFBSTtRQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ3pCO0lBRU8sNENBQWMsR0FBdEIsVUFDSSxXQUF5QixFQUN6QixVQUF5QjtRQUV6QixJQUNJLFdBQVcsQ0FBQyxVQUFVO1lBQ3RCLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUztZQUNoQyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3QztZQUNFLElBQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWhELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUNyRCxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUM7YUFDekI7aUJBQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLQyxrQkFBVSxDQUFDLGFBQWEsRUFBRTtnQkFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2hCO2lCQUFNO2dCQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztnQkFDaEUsT0FBT3lCLGFBQVcsQ0FBQyxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzlFO1NBQ0o7UUFFRCxPQUFPLEVBQUUsQ0FBQztLQUNiO0lBRU8sb0RBQXNCLEdBQTlCLFVBQStCLFVBQVU7Ozs7UUFJckMsSUFBTSx5QkFBeUIsR0FBRztZQUM5QixVQUFVO1lBQ1YsYUFBYTtZQUNiLFdBQVc7WUFDWCxhQUFhO1lBQ2Isb0JBQW9CO1lBQ3BCLHVCQUF1QjtZQUN2QixpQkFBaUI7WUFDakIsb0JBQW9CO1lBQ3BCLFlBQVk7WUFDWixrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLGtCQUFrQjtTQUNyQixDQUFDO1FBQ0YsT0FBTyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdEO0lBRU8sa0RBQW9CLEdBQTVCLFVBQTZCLElBQTZCO1FBQ3RELElBQU0sTUFBTSxHQUFRO1lBQ2hCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUNwQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDbEIsQ0FBQztRQUNGLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDekQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFFTywyQ0FBYSxHQUFyQixVQUFzQixHQUFHO1FBQXpCLGlCQTZEQztRQTVERyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUl6QixrQkFBVSxDQUFDLG9CQUFvQixFQUFFO1lBQzlELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUVqQixJQUFNLG9CQUFrQixHQUFHa0MsT0FBTSxFQUFFLENBQUM7WUFFcEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUEsQ0FBQyxDQUFDO1lBRXhFLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQUEsTUFBTTtnQkFDeEIsTUFBTSxDQUFDLGtCQUFrQixHQUFHLG9CQUFrQixDQUFDO2dCQUMvQyxPQUFPLE1BQU0sQ0FBQzthQUNqQixDQUFDLENBQUM7WUFFSCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ25ELElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDL0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyRTtpQkFDSjthQUNKO1lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNwRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxRDtZQUVELE9BQU8sT0FBTyxDQUFDO1NBQ2xCO2FBQU07WUFDSCxJQUFNLE1BQU0sR0FBUTtnQkFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDckMsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLGtCQUFrQixFQUFFLEVBQUU7YUFDekIsQ0FBQztZQUVGLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRTtnQkFDcEIsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7YUFDaEM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxhQUFhLEVBQUU7Z0JBQ25CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1lBQ0QsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFO2dCQUNqQixNQUFNLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxXQUFXO3NCQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7c0JBQ3ZELFNBQVMsQ0FBQzthQUNuQjtZQUNELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDVixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBS2xDLGtCQUFVLENBQUMsYUFBYSxFQUFFOztvQkFFNUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDbkIsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7cUJBQ3hDO2lCQUNKO2FBQ0o7WUFDRCxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0RCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN2RDtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0tBQ0o7SUFFTyxxQ0FBTyxHQUFmLFVBQWdCLElBQUk7UUFDaEIsUUFBUSxJQUFJO1lBQ1IsS0FBS0Esa0JBQVUsQ0FBQyxXQUFXO2dCQUN2QixPQUFPLE1BQU0sQ0FBQztZQUNsQixLQUFLQSxrQkFBVSxDQUFDLFVBQVU7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLEtBQUtBLGtCQUFVLENBQUMsY0FBYztnQkFDMUIsT0FBTyxTQUFTLENBQUM7WUFDckIsS0FBS0Esa0JBQVUsQ0FBQyxZQUFZO2dCQUN4QixPQUFPLE9BQU8sQ0FBQztZQUNuQixLQUFLQSxrQkFBVSxDQUFDLGFBQWE7Z0JBQ3pCLE9BQU8sUUFBUSxDQUFDO1lBQ3BCLEtBQUtBLGtCQUFVLENBQUMsYUFBYTtnQkFDekIsT0FBTyxRQUFRLENBQUM7WUFDcEIsS0FBS0Esa0JBQVUsQ0FBQyxnQkFBZ0I7Z0JBQzVCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUtBLGtCQUFVLENBQUMsYUFBYTtnQkFDekIsT0FBTyxlQUFlLENBQUM7U0FDOUI7S0FDSjtJQUVPLGdEQUFrQixHQUExQixVQUEyQixJQUFJO1FBQzNCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO2dCQUNaLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7b0JBQ25FLE1BQU0sR0FBRyxJQUFJLENBQUM7aUJBQ2pCO2FBQ0osQ0FBQyxDQUFDO1NBQ047UUFDRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVPLHNEQUF3QixHQUFoQyxVQUFpQyxNQUE4QjtRQUMzRCxJQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1FBQ3ZFLElBQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFNLE1BQU0sR0FBUTtZQUNoQixVQUFVLEVBQUUsS0FBSztZQUNqQixrQkFBa0IsRUFBRSxFQUFFO1lBQ3RCLElBQUksRUFBRSxVQUFVO1NBQ25CLENBQUM7UUFFRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLFFBQVEsRUFBRTtnQkFDVixJQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDNUMsSUFBTSxvQkFBb0IsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLG9CQUFvQixDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQzt3QkFDbEQsZUFBZSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO3FCQUM5QztpQkFDSjtxQkFBTTtvQkFDSCxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN4QzthQUNKO1NBQ0o7UUFFRCxNQUFNLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztRQUU5QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7WUFDcEMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0Q7UUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTO3FCQUN2QixHQUFHLENBQUMsVUFBQSxRQUFRO29CQUNULE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDeEIsQ0FBQztxQkFDRCxPQUFPLEVBQUUsQ0FBQztnQkFDZixJQUNJRCxZQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRUMsa0JBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2pERCxZQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRUMsa0JBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDbkQ7b0JBQ0UsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLEtBQUtBLGtCQUFVLENBQUMsYUFBYSxHQUFBLENBQUMsQ0FBQztpQkFDbkU7YUFDSjtTQUNKO1FBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakRELFlBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFBLEdBQUc7Z0JBQzVCLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtvQkFDYixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO3dCQUNsQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTs0QkFDekMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7eUJBQ3hCO3FCQUNKO2lCQUNKO2FBQ0osQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELE1BQU0sQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEU7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0lBRU8sc0RBQXdCLEdBQWhDLFVBQWlDLElBQUk7UUFDakMsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFO1lBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNyRCxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsQixJQUFNLE1BQU0sR0FBUTtvQkFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJO29CQUNwRCxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVzswQkFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUNuRDswQkFDRCxTQUFTO29CQUNmLFVBQVUsRUFBRSxLQUFLO29CQUNqQixrQkFBa0IsRUFBRSxFQUFFO2lCQUN6QixDQUFDO2dCQUNGLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO29CQUNsRCxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztpQkFDekU7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUMsQ0FBQztpQkFDTDtnQkFDRCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtvQkFDMUQsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDckQ7Z0JBQ0QsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUN2QyxDQUFDO2dCQUNGLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUN2RDtnQkFDRCxPQUFPLE1BQU0sQ0FBQzthQUNqQjtTQUNKO0tBQ0o7SUFFTyw4RUFBZ0QsR0FBeEQsVUFBeUQsSUFBSTtRQUN6RCxJQUFJLFdBQVcsR0FBVyxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7b0JBQzlDLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUUsV0FBVyxHQUFHSSxRQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3hDO2FBQ0o7U0FDSjtRQUNELE9BQU8sV0FBVyxDQUFDO0tBQ3RCO0lBRU8sa0RBQW9CLEdBQTVCLFVBQTZCLElBQXdCO1FBQ2pELElBQU0sTUFBTSxHQUFRO1lBQ2hCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUNwQixPQUFPLEVBQUUsRUFBRTtTQUNkLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUM5QixJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7WUFDekIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsSUFBTSxNQUFNLEdBQVE7b0JBQ2hCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJO29CQUMvQixVQUFVLEVBQUUsS0FBSztvQkFDakIsa0JBQWtCLEVBQUUsRUFBRTtpQkFDekIsQ0FBQztnQkFDRixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFOztvQkFFN0IsTUFBTSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzswQkFDNUQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzswQkFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2lCQUMxQztnQkFDRCxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO29CQUMzRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDN0Q7Z0JBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0I7U0FDSjtRQUNELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDekQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUVPLDJEQUE2QixHQUFyQyxVQUFzQyxRQUFRLEVBQUUsSUFBSTtRQUNoRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFO1lBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNuRCxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsQixJQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztnQkFDM0UsSUFBTSxJQUFJLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDN0Q2QixrQkFBZ0IsQ0FBQyxRQUFRLENBQUM7b0JBQ3RCLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDcEQsSUFBSSxFQUFFQSxrQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO29CQUMxQyxRQUFRLEVBQUUsUUFBUTtpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE9BQU87b0JBQ0g7d0JBQ0ksTUFBTSxFQUFFLElBQUk7cUJBQ2Y7aUJBQ0osQ0FBQzthQUNMO1NBQ0o7UUFDRCxPQUFPLEVBQUUsQ0FBQztLQUNiO0lBRU8sd0NBQVUsR0FBbEIsVUFBbUIsUUFBZ0IsRUFBRSxVQUF5QixFQUFFLElBQWE7UUFBN0UsaUJBa0JDO1FBakJHLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO1lBQ3ZCLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFDLFNBQVMsRUFBRSxTQUFTO2dCQUNwRCxJQUFJQSxrQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDOUMsSUFBSSxTQUFTLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUMxRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQ25CLEtBQUksQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQzFELENBQUM7cUJBQ0w7aUJBQ0o7Z0JBRUQsT0FBTyxTQUFTLENBQUM7YUFDcEIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNQLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN2QjthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUM7U0FDYjtLQUNKO0lBRU8sd0NBQVUsR0FBbEIsVUFBbUIsUUFBZ0IsRUFBRSxVQUF5QixFQUFFLElBQWEsRUFBRSxRQUFRO1FBQXZGLGlCQWtCQzs7OztRQWRHLElBQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDN0UsSUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFDLFNBQVMsRUFBRSxTQUFTO1lBQ2xELElBQUkvQixVQUFFLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ2xDLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDMUQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUNuQixLQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQzFFLENBQUM7aUJBQ0w7YUFDSjtZQUVELE9BQU8sU0FBUyxDQUFDO1NBQ3BCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDdkI7SUFFTyw0Q0FBYyxHQUF0QixVQUF1QixRQUFnQixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUTtRQUFuRSxpQkFrQkM7Ozs7UUFkRyxJQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQzdFLElBQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBQyxTQUFTLEVBQUUsU0FBUztZQUNsRCxJQUFJQSxVQUFFLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDMUQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUNuQixLQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQzFFLENBQUM7aUJBQ0w7YUFDSjtZQUVELE9BQU8sU0FBUyxDQUFDO1NBQ3BCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDdkI7SUFDTCwwQkFBQztBQUFELENBcjlDQSxDQUF5QyxxQkFBcUI7O0FDbkQ5RDtJQUEyQyx5Q0FBcUI7SUFPNUQsK0JBQVksS0FBZSxFQUFFLE9BQVk7UUFBekMsWUFDSSxrQkFBTSxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQ3hCO1FBUE8sV0FBSyxHQUFtQixJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzdDLGtCQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLGlCQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxrQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7O0tBSXpDO0lBRU0sK0NBQWUsR0FBdEI7UUFDSSxJQUFJLElBQUksR0FBRztZQUNQLE9BQU8sRUFBRSxFQUFFO1lBQ1gsZUFBZSxFQUFFLEVBQUU7WUFDbkIsVUFBVSxFQUFFLEVBQUU7WUFDZCxXQUFXLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxFQUFFO1lBQ2hCLEtBQUssRUFBRSxFQUFFO1lBQ1QsVUFBVSxFQUFFLEVBQUU7WUFDZCxNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1lBQ1gsVUFBVSxFQUFFLEVBQUU7WUFDZCxhQUFhLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsWUFBWSxFQUFFLEVBQUU7YUFDbkI7WUFDRCxVQUFVLEVBQUUsU0FBUztTQUN4QixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNMLDRCQUFDO0FBQUQsQ0FqQ0EsQ0FBMkMscUJBQXFCOztTQ05oRCxpQkFBaUIsQ0FBQyxRQUFRO0lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztLQUNyRTtJQUVELE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtRQUMvQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBTSxZQUFZLEdBQUcsVUFBQyxlQUFlLEVBQUUsY0FBYztZQUNqRCxPQUFPLGVBQWU7aUJBQ2pCLElBQUksQ0FBQyxVQUFTLE1BQU07Z0JBQ2pCLElBQUksS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO29CQUNmLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNwQztnQkFDRCxPQUFPLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ2pELENBQUMsQ0FDRCxPQUFLLENBQUEsQ0FBQyxVQUFBLEdBQUc7Z0JBQ04sT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdEIsQ0FBQyxDQUFDO1NBQ1YsQ0FBQztRQUVGLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUEsQ0FBQyxDQUFDO1FBRXBELFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHO1lBQzFELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQixDQUFDLENBQUM7S0FDTixDQUFDLENBQUM7QUFDUDs7QUNyQkEsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdCLElBQUEsTUFBTSxHQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBdEIsQ0FBdUI7QUFDckMsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3JDLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQyxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFrQ3JDLElBQU1rQyxLQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLElBQUksU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7QUFDM0IsSUFBSSx3QkFBd0IsQ0FBQztBQUM3QixJQUFJLHVCQUF1QixDQUFDO0FBQzVCLElBQU0saUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtJQUNsRCx3QkFBd0IsR0FBRyxPQUFPLENBQUM7SUFDbkMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3JDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7O0lBK0JDLHFCQUFZLE9BQWdCO1FBQTVCLGlCQWNDOzs7O1FBL0JNLHNCQUFpQixHQUFrQixFQUFFLENBQUM7Ozs7O1FBS3RDLGVBQVUsR0FBWSxLQUFLLENBQUM7Ozs7UUFLM0Isb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFzaUN0QixpQkFBWSxHQUFHLFVBQUMsU0FBVTtZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdCM0IsZUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLFNBQVMsR0FBR0Usb0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFckYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO2dCQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxHQUFHLEdBQUdGLGVBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsSUFBSSxJQUFJLEdBQUc7b0JBQ1AsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO3dCQUNULElBQUksSUFBSSxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0MsSUFBSTRCLGdCQUFjLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQUksSUFBSSxDQUFDLElBQUksbUNBQWdDLENBQUMsQ0FBQzs0QkFDM0QsSUFBSSxNQUFNLEdBQUdBLGdCQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUMvRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDaEM7d0JBQ0QsSUFBSSxJQUFJLEdBQUc7NEJBQ1AsSUFBSSxFQUFFLE9BQU87NEJBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJOzRCQUNmLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTs0QkFDWCxPQUFPLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7NEJBQzlCLE9BQU8sRUFBRSxNQUFNOzRCQUNmLElBQUksRUFBRSxJQUFJOzRCQUNWLEtBQUssRUFBRSxDQUFDOzRCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTt5QkFDbEQsQ0FBQzt3QkFDRixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ2xCLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7eUJBQ3ZDO3dCQUNENUIsZUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDNUIsQ0FBQyxFQUFFLENBQUM7d0JBQ0osSUFBSSxFQUFFLENBQUM7cUJBQ1Y7eUJBQU07d0JBQ0gsT0FBTyxFQUFFLENBQUM7cUJBQ2I7aUJBQ0osQ0FBQztnQkFDRixJQUFJLEVBQUUsQ0FBQzthQUNWLENBQUMsQ0FBQztTQUNOLENBQUM7UUFFSyxtQkFBYyxHQUFHLFVBQUMsV0FBWTtZQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDL0JBLGVBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLFdBQVc7a0JBQ3RDLFdBQVc7a0JBQ1hFLG9CQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRXRDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtnQkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLElBQUksR0FBRyxHQUFHRixlQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ2hELElBQUksSUFBSSxHQUFHO29CQUNQLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTt3QkFDVCxJQUFJLE1BQU0sR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLElBQUk0QixnQkFBYyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFJLE1BQU0sQ0FBQyxJQUFJLG1DQUFnQyxDQUFDLENBQUM7NEJBQzdELElBQUksTUFBTSxHQUFHQSxnQkFBYyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDakUsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7eUJBQ2xDO3dCQUNELElBQUksSUFBSSxHQUFHOzRCQUNQLElBQUksRUFBRSxTQUFTOzRCQUNmLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTs0QkFDakIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFOzRCQUNiLE9BQU8sRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzs0QkFDaEMsT0FBTyxFQUFFLE9BQU87NEJBQ2hCLE9BQUssRUFBRSxNQUFNOzRCQUNiLEtBQUssRUFBRSxDQUFDOzRCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTt5QkFDbEQsQ0FBQzt3QkFDRixJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7NEJBQ3BCLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7eUJBQ3pDO3dCQUNENUIsZUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDNUIsQ0FBQyxFQUFFLENBQUM7d0JBQ0osSUFBSSxFQUFFLENBQUM7cUJBQ1Y7eUJBQU07d0JBQ0gsT0FBTyxFQUFFLENBQUM7cUJBQ2I7aUJBQ0osQ0FBQztnQkFDRixJQUFJLEVBQUUsQ0FBQzthQUNWLENBQUMsQ0FBQztTQUNOLENBQUM7UUE1bUNFLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQ3hCLElBQUksT0FBT0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLEVBQUU7Z0JBQ3ZEQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNwRDs7WUFFRCxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7Z0JBQ25CQSxlQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNsRTs7WUFFRCxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ3pCO1NBQ0o7S0FDSjs7OztJQUtTLDhCQUFRLEdBQWxCO1FBQUEsaUJBa0JDO1FBakJHLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUVoRUssWUFBVSxDQUFDLElBQUksQ0FBQ0wsZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVqRCxJQUNJQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUNBLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ3hGO1lBQ0VBLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQztTQUN4QztRQUVELElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLGlCQUFpQixDQUFDLFlBQVksRUFBRTtZQUN4RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM3QjthQUFNO1lBQ0g2QixZQUFVLENBQUMsSUFBSSxDQUFDN0IsZUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFBLENBQUMsQ0FBQztTQUMzRjtRQUNELE9BQU8saUJBQWlCLENBQUM7S0FDNUI7SUFFTyxpQ0FBVyxHQUFuQjtRQUNJLE9BQU8sQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztLQUMvRTtJQUVPLGdEQUEwQixHQUFsQyxVQUFtQyxHQUFHLEVBQUUsQ0FBQztRQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLEtBQUssQ0FDUixxS0FBcUssQ0FDeEssQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkI7SUFFTywrQ0FBeUIsR0FBakMsVUFBa0MsR0FBRztRQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxLQUFLLENBQ1IscUtBQXFLLENBQ3hLLENBQUM7UUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25COzs7O0lBS1Msa0NBQVksR0FBdEI7UUFDSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztLQUM5Qjs7Ozs7SUFNTSw4QkFBUSxHQUFmLFVBQWdCLEtBQW9CO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0tBQ3RCOzs7OztJQU1NLHFDQUFlLEdBQXRCLFVBQXVCLEtBQW9CO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0tBQzdCOzs7OztJQU1NLDRDQUFzQixHQUE3QjtRQUNJLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVuQlQsWUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQUEsSUFBSTtZQUM3QixJQUFJTSxlQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDOUIsTUFBTSxHQUFHLElBQUksQ0FBQzthQUNqQjtTQUNKLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0tBQ2pCOzs7OztJQU1NLHNEQUFnQyxHQUF2QztRQUNJLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVuQk4sWUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQUEsSUFBSTtZQUM3QixJQUFJTSxlQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSUEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSzhCLEtBQUcsRUFBRTtnQkFDNUQsTUFBTSxHQUFHLElBQUksQ0FBQzthQUNqQjtTQUNKLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0tBQ2pCOzs7O0lBS00sdUNBQWlCLEdBQXhCO1FBQ0ksSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztLQUMvQjtJQUVPLHdDQUFrQixHQUExQjtRQUFBLGlCQWtGQztRQWpGRyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDM0MxQixZQUFVLENBQUMsR0FBRyxDQUFDMEIsS0FBRyxHQUFHOUIsZUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQ2hELFVBQUEsV0FBVztZQUNQLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsS0FBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7WUFDbEMsSUFDSSxPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssV0FBVztnQkFDdENHLGVBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEtBQUssaUJBQWlCLENBQUMsS0FBSyxFQUMxRTtnQkFDRUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7b0JBQ3hDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7YUFDMUM7WUFDRCxJQUFJLE9BQU8sVUFBVSxDQUFDLFdBQVcsS0FBSyxXQUFXLEVBQUU7Z0JBQy9DQSxlQUFhLENBQUMsUUFBUSxDQUFDLDRCQUE0QixHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7YUFDaEY7WUFDREEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjO2dCQUNqQ1Usb0JBQWtCLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBRXZDLElBQUksQ0FBQ1YsZUFBYSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDN0MsSUFBSSxPQUFPLFVBQVUsQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUFFO29CQUNoRCxLQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUM1RDtnQkFDRCxJQUFJLE9BQU8sVUFBVSxDQUFDLGdCQUFnQixLQUFLLFdBQVcsRUFBRTtvQkFDcEQsS0FBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUNwRTthQUNKO1lBRUQsSUFBSSxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO2dCQUMzQyxJQUFNLGlCQUFpQixHQUFHO29CQUN0QixTQUFTO29CQUNULGFBQWE7b0JBQ2IsVUFBVTtvQkFDVixVQUFVO29CQUNWLE1BQU07b0JBQ04sU0FBUztvQkFDVCxZQUFZO29CQUNaLFFBQVE7aUJBQ1gsQ0FBQztnQkFDRixJQUFJLDJCQUF5QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTtvQkFDMUIsSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFO3dCQUNwQiwyQkFBeUIsR0FBRyxJQUFJLENBQUM7d0JBQ2pDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDckU7aUJBQ0osQ0FBQyxDQUFDO2dCQUNILElBQUksMkJBQXlCLEVBQUU7b0JBQzNCQSxlQUFhLENBQUMsT0FBTyxDQUFDO3dCQUNsQixJQUFJLEVBQUUsWUFBWTt3QkFDbEIsRUFBRSxFQUFFLG1CQUFtQjt3QkFDdkIsT0FBTyxFQUFFLG9CQUFvQjt3QkFDN0IsS0FBSyxFQUFFLENBQUM7d0JBQ1IsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJO3FCQUM5QyxDQUFDLENBQUM7aUJBQ047YUFDSjtZQUVELEtBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FDeEI7Z0JBQ0ksS0FBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDOUIsRUFDRCxVQUFBLFlBQVk7Z0JBQ1IsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQixDQUNKLENBQUM7U0FDTCxFQUNELFVBQUEsWUFBWTtZQUNSLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3JELEtBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FDeEI7Z0JBQ0ksS0FBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDOUIsRUFDRCxVQUFBLGFBQWE7Z0JBQ1QsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQixDQUNKLENBQUM7U0FDTCxDQUNKLENBQUM7S0FDTDtJQUVPLG9EQUE4QixHQUF0QyxVQUF1QyxZQUFZO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUN4REEsZUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsR0FBRyxZQUFZLENBQUM7UUFDOUQsSUFBSSxDQUFDQSxlQUFhLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3hDQSxlQUFhLENBQUMsT0FBTyxDQUFDO2dCQUNsQixJQUFJLEVBQUUsY0FBYztnQkFDcEIsRUFBRSxFQUFFLHFCQUFxQjtnQkFDekIsT0FBTyxFQUFFLHNCQUFzQjtnQkFDL0IsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJO2FBQzlDLENBQUMsQ0FBQztTQUNOO0tBQ0o7SUFFTyxnREFBMEIsR0FBbEMsVUFBbUMsWUFBWTtRQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDcERBLGVBQWEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxDQUFDO1FBQzFEQSxlQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xCLElBQUksRUFBRSxjQUFjO1lBQ3BCLEVBQUUsRUFBRSxxQkFBcUI7WUFDekIsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixLQUFLLEVBQUUsQ0FBQztZQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSTtTQUM5QyxDQUFDLENBQUM7S0FDTjtJQUVPLHNDQUFnQixHQUF4QjtRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQ1AsK0VBQStFLENBQ2xGLENBQUM7UUFFRixPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0UsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxJQUFJLEdBQUc7Z0JBQ1AsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLEVBQUU7b0JBQ3ZCNEIsZ0JBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2xFLFVBQUMsVUFBK0I7d0JBQzVCNUIsZUFBYSxDQUFDLE9BQU8sQ0FBQzs0QkFDbEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBQ3hELE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLEVBQUUsRUFBRSxpQkFBaUI7NEJBQ3JCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTs0QkFDN0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxPQUFPOzRCQUN4QixLQUFLLEVBQUUsQ0FBQzs0QkFDUixRQUFRLEVBQUUsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUk7eUJBQzlDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7NEJBQzNCQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7NEJBQ3JDQSxlQUFhLENBQUMsT0FBTyxDQUFDO2dDQUNsQixJQUFJLEVBQUUsVUFBVTtnQ0FDaEIsRUFBRSxFQUFFLFVBQVU7Z0NBQ2QsT0FBTyxFQUFFLFVBQVU7Z0NBQ25CLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSTs2QkFDOUMsQ0FBQyxDQUFDO3lCQUNOOzZCQUFNOzRCQUNIQSxlQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0NBQ2xDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dDQUNsQixTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtnQ0FDckMsS0FBSyxFQUFFLENBQUM7Z0NBQ1IsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJOzZCQUM5QyxDQUFDLENBQUM7eUJBQ047d0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLG1CQUFnQixDQUFDLENBQUM7d0JBQzNELENBQUMsRUFBRSxDQUFDO3dCQUNKLElBQUksRUFBRSxDQUFDO3FCQUNWLEVBQ0QsVUFBQSxZQUFZO3dCQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXNCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsYUFBVSxDQUFDLENBQUM7d0JBQ3hFLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTs0QkFDM0JBLGVBQWEsQ0FBQyxPQUFPLENBQUM7Z0NBQ2xCLElBQUksRUFBRSxPQUFPO2dDQUNiLEVBQUUsRUFBRSxPQUFPO2dDQUNYLE9BQU8sRUFBRSxVQUFVO2dDQUNuQixLQUFLLEVBQUUsQ0FBQztnQ0FDUixRQUFRLEVBQUUsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUk7NkJBQzlDLENBQUMsQ0FBQzt5QkFDTjt3QkFDRCxDQUFDLEVBQUUsQ0FBQzt3QkFDSixJQUFJLEVBQUUsQ0FBQztxQkFDVixDQUNKLENBQUM7aUJBQ0w7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLENBQUM7aUJBQ2I7YUFDSixDQUFDO1lBQ0YsSUFBSSxFQUFFLENBQUM7U0FDVixDQUFDLENBQUM7S0FDTjtJQUVPLDBDQUFvQixHQUE1QjtRQUFBLGlCQXFCQztRQXBCRyxNQUFNLENBQUMsSUFBSSxDQUNQLGtGQUFrRixDQUNyRixDQUFDO1FBRUYsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWpCQSxlQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUV2QyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ1QsT0FBTyxLQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUNsQyxDQUFDLENBQUM7UUFFSCxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7YUFDckIsSUFBSSxDQUFDLFVBQUEsR0FBRztZQUNMLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM1QixDQUFDLENBQ0QsT0FBSyxDQUFBLENBQUMsVUFBQSxZQUFZO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7S0FDVjs7OztJQUtPLDhDQUF3QixHQUFoQztRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUUxQyxJQUFJLGlCQUFpQixHQUFnRCxtQkFBbUIsQ0FBQztRQUN6RkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTdDLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUU7WUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQzFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDOUNBLGVBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQy9DLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDO1NBQzdDO1FBRUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxpQkFBaUIsQ0FDL0IsSUFBSSxDQUFDLFlBQVksRUFDakI7WUFDSSxpQkFBaUIsRUFBRUgsZUFBSSxDQUFDLE9BQU8sQ0FBQ0csZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDbkUsRUFDREEsZUFBYSxFQUNid0Isa0JBQWdCLENBQ25CLENBQUM7UUFFRixJQUFJLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVqRHRCLG9CQUFrQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ2hEOzs7O0lBS08sa0RBQTRCLEdBQXBDO1FBQUEsaUJBcUJDO1FBcEJHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUU5QyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFakJGLGVBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRXJDLElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNULE9BQU8sS0FBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7YUFDekMsQ0FBQyxDQUFDO1NBQ047UUFFRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7YUFDckIsSUFBSSxDQUFDLFVBQUEsR0FBRztZQUNMLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM1QixDQUFDLENBQ0QsT0FBSyxDQUFBLENBQUMsVUFBQSxZQUFZO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7S0FDVjtJQUVPLDZDQUF1QixHQUEvQjtRQUVJLElBQUksT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUU7WUFDMUQsSUFBSSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FFckU7aUJBQU07Z0JBQ0gsSUFBSSxjQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUk7b0JBQ25CLElBQUlILGVBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO3dCQUM5QixjQUFZLElBQUksQ0FBQyxDQUFDO3FCQUNyQjtpQkFDSixDQUFDLENBQUM7Z0JBQ29CLENBQUMsY0FBWSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87YUFJbkU7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBRU8seUNBQW1CLEdBQTNCO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDOzs7Ozs7UUFPckMsSUFBSSxpQkFBaUIsR0FBZ0QsbUJBQW1CLENBQUM7UUFDekZHLGVBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUMxQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzlDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUMvQyxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQztTQUM3QztRQUVELElBQUksT0FBTyxHQUFHLElBQUksaUJBQWlCLENBQy9CLElBQUksQ0FBQyxLQUFLLEVBQ1Y7WUFDSSxpQkFBaUIsRUFBRUgsZUFBSSxDQUFDLE9BQU8sQ0FBQ0csZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDbkUsRUFDREEsZUFBYSxFQUNid0Isa0JBQWdCLENBQ25CLENBQUM7UUFFRixJQUFJLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVqRHRCLG9CQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTFDRixlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBR3dCLGtCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXRFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztLQUM1QjtJQUVPLDJDQUFxQixHQUE3QixVQUE4QixlQUFlO1FBQTdDLGlCQXlHQztRQXhHRyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFakJ4QixlQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFM0IsSUFBSSxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFO1lBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxhQUFhLEVBQUUsR0FBQSxDQUFDLENBQUM7U0FDNUM7UUFFRCxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsaUJBQWlCLEVBQUUsR0FBQSxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsa0JBQWtCLEVBQUUsR0FBQSxDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsZUFBZSxFQUFFLEdBQUEsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLGNBQWMsRUFBRSxHQUFBLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFBLENBQUMsQ0FBQztTQUNoRDtRQUVELElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFBLENBQUMsQ0FBQztTQUNqRDtRQUVELElBQUksZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxtQkFBbUIsRUFBRSxHQUFBLENBQUMsQ0FBQztTQUNsRDtRQUVELElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxhQUFhLEVBQUUsR0FBQSxDQUFDLENBQUM7U0FDNUM7UUFFRCxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsWUFBWSxFQUFFLEdBQUEsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLGNBQWMsRUFBRSxHQUFBLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFBLENBQUMsQ0FBQztTQUNoRDtRQUVELElBQ0ksZUFBZSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbEQsZUFBZSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbEQsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDcEQsZUFBZSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDdkQ7WUFDRSxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBQSxDQUFDLENBQUM7U0FDbkQ7UUFFRCxJQUFJLENBQUNBLGVBQWEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxlQUFlLEVBQUUsR0FBQSxDQUFDLENBQUM7U0FDOUM7UUFFRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7YUFDckIsSUFBSSxDQUFDLFVBQUEsR0FBRztZQUNMLElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLGlCQUFpQixDQUFDLFlBQVksRUFBRTtnQkFDeEUsSUFDSSxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQzVDQSxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FDdEMsR0FBRyxDQUFDLENBQUMsRUFDUjtvQkFDRSxNQUFNLENBQUMsSUFBSSxDQUNQLCtDQUE2Q0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFjLENBQ3JGLENBQUM7b0JBQ0Y4QixjQUFZLENBQUMsUUFBTSxDQUFBLENBQ2Y5QixlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDN0JBLGVBQWEsQ0FBQyxRQUFRLENBQ3pCLENBQUMsSUFBSSxDQUFDO3dCQUNILHdCQUF3QixFQUFFLENBQUM7d0JBQzNCLEtBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDbkIsTUFBTSxDQUFDLElBQUksQ0FDUCw2QkFBNkI7NEJBQ3pCQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU07NEJBQzdCLE1BQU07NEJBQ04sS0FBSSxDQUFDLGNBQWMsRUFBRTs0QkFDckIsVUFBVSxDQUNqQixDQUFDO3dCQUNGLElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFOzRCQUM5QixNQUFNLENBQUMsSUFBSSxDQUNQLGdDQUE4QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLG1CQUFjQSxlQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsU0FBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFNLENBQzVJLENBQUM7NEJBQ0YsS0FBSSxDQUFDLFlBQVksQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDcEQ7cUJBQ0osQ0FBQyxDQUFDO2lCQUNOO3FCQUFNO29CQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztpQkFDaEQ7YUFDSjtpQkFBTTtnQkFDSCxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQzVCO1NBQ0osQ0FBQyxDQUNELE9BQUssQ0FBQSxDQUFDLFVBQUEsWUFBWTtZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDOUIsQ0FBQyxDQUFDO0tBQ1Y7SUFFTyxxQ0FBZSxHQUF2QjtRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbkMsSUFBSUUsb0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBa0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFRLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUlBLG9CQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQWtCQSxvQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBUSxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJQSxvQkFBa0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFrQkEsb0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQVEsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBa0JBLG9CQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFRLENBQUMsQ0FBQztTQUMxRTtRQUNELElBQUlBLG9CQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQWtCQSxvQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBUSxDQUFDLENBQUM7U0FDdkU7UUFDRCxJQUFJQSxvQkFBa0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFrQkEsb0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQVEsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBa0JBLG9CQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFRLENBQUMsQ0FBQztTQUMxRTtRQUNELElBQUlBLG9CQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQWtCQSxvQkFBa0IsQ0FBQyxZQUFZLENBQUMsTUFBUSxDQUFDLENBQUM7U0FDM0U7UUFDRCxJQUFJQSxvQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFrQkEsb0JBQWtCLENBQUMsTUFBTSxDQUFDLE1BQVEsQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBa0JBLG9CQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFRLENBQUMsQ0FBQztTQUNwRTtRQUNELElBQUlBLG9CQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQWtCQSxvQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBUSxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJQSxvQkFBa0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFrQkEsb0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQVEsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsSUFBSUYsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQWtCQSxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQWMsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0tBQ3RDO0lBRU8sdUNBQWlCLEdBQXpCO1FBQUEsaUJBaUpDO1FBaEpHLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVqQixPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ1QsT0FBTyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUNuQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ1QsT0FBTyxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDaEMsQ0FBQyxDQUFDO1FBRUgsSUFBSUUsb0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxPQUFPLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSUEsb0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxPQUFPLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQ3BDLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSUEsb0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxPQUFPLEtBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUNqQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUlBLG9CQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsT0FBTyxLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUNwQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUlBLG9CQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsT0FBTyxLQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUNyQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUlBLG9CQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsT0FBTyxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDL0IsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUNJQSxvQkFBa0IsQ0FBQyxNQUFNO1lBQ3pCQSxvQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQzdDLENBQUNGLGVBQWEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQzVDO1lBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxPQUFPLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUMvQixDQUFDLENBQUM7U0FDTjtRQUVELElBQUlFLG9CQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsT0FBTyxLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDOUIsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJQSxvQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNULE9BQU8sS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ2hDLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSUEsb0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxPQUFPLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFDSUEsb0JBQWtCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNyREEsb0JBQWtCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNyREEsb0JBQWtCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN2REEsb0JBQWtCLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUMxRDtZQUNFLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsT0FBTyxLQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzthQUN0QyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksQ0FBQ0YsZUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7WUFDekMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxPQUFPLEtBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUNqQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEtBQUssRUFBRSxFQUFFO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsT0FBTyxLQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzthQUN6QyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNULE9BQU8sS0FBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7YUFDekMsQ0FBQyxDQUFDO1NBQ047UUFFRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7YUFDckIsSUFBSSxDQUFDLFVBQUEsR0FBRztZQUNMLElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLGlCQUFpQixDQUFDLFlBQVksRUFBRTtnQkFDeEUsSUFDSSxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQzVDQSxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FDdEMsR0FBRyxDQUFDLENBQUMsRUFDUjtvQkFDRSxNQUFNLENBQUMsSUFBSSxDQUNQLCtDQUE2Q0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFjLENBQ3JGLENBQUM7b0JBQ0Y4QixjQUFZLENBQUMsUUFBTSxDQUFBLENBQ2Y5QixlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDN0JBLGVBQWEsQ0FBQyxRQUFRLENBQ3pCLENBQUMsSUFBSSxDQUFDO3dCQUNILHdCQUF3QixFQUFFLENBQUM7d0JBQzNCLEtBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDbkIsTUFBTSxDQUFDLElBQUksQ0FDUCw2QkFBNkI7NEJBQ3pCQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU07NEJBQzdCLE1BQU07NEJBQ04sS0FBSSxDQUFDLGNBQWMsRUFBRTs0QkFDckIsVUFBVSxDQUNqQixDQUFDO3dCQUNGLElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFOzRCQUM5QixNQUFNLENBQUMsSUFBSSxDQUNQLGdDQUE4QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLG1CQUFjQSxlQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsU0FBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFNLENBQzVJLENBQUM7NEJBQ0YsS0FBSSxDQUFDLFlBQVksQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDcEQ7cUJBQ0osQ0FBQyxDQUFDO2lCQUNOO3FCQUFNO29CQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztpQkFDaEQ7YUFDSjtpQkFBTTtnQkFDSCxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDeEI7U0FDSixDQUFDLENBQ0QsT0FBSyxDQUFBLENBQUMsVUFBQSxZQUFZO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CLENBQUMsQ0FBQztLQUNWO0lBRU8sNENBQXNCLEdBQTlCLFVBQStCLElBQUk7UUFDL0IsT0FBT0gsZUFBSSxDQUFDLElBQUksQ0FBQ0csZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDM0Q7SUFFTyw2Q0FBdUIsR0FBL0I7UUFBQSxpQkEwR0M7UUF6R0csTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDOzs7O1FBSTlDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQkMsWUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzVELFVBQUEsV0FBVztnQkFDUCxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxDQUFDLENBQUM7Z0JBRWpFLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFbEQsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO2dCQUNoQixJQUFJLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztnQkFFakMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDOztvQkFFaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7O3dCQUUvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDOzt3QkFFeEIsSUFBSSxjQUFjLEdBQW1CLElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQy9DLElBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7d0JBQy9CLElBQUksS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7d0JBQ2pDLElBQUksV0FBUyxHQUFHRCxlQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQzt3QkFFdEQsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEVBQUU7NEJBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO3lCQUNuQyxDQUFDLENBQUM7d0JBRUgsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFOzRCQUM3RCxJQUFNLEdBQUcsR0FBRyxtQ0FBbUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs0QkFLdkQsSUFBTSxFQUFFLEdBQUcsTUFBTTtpQ0FDWixVQUFVLENBQUMsUUFBUSxDQUFDO2lDQUNwQixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztpQ0FDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs0QkFHbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOzRCQUVsQixJQUFJLHFCQUFtQixHQUFHLFNBQVMsQ0FBQzs0QkFDcEMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEVBQUU7Z0NBQ2pCLElBQUksV0FBVyxHQUNYLE9BQU8scUJBQW1CLEtBQUssV0FBVztzQ0FDcEMsaUJBQWlCO3NDQUNqQixxQkFBbUIsQ0FBQztnQ0FDOUIsSUFBSSxPQUFPLFdBQVcsQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO29DQUM3QyxXQUFXLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQ0FDMUM7cUNBQU07b0NBQ0gsV0FBVyxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQ0FDakM7Z0NBQ0QsV0FBUztvQ0FDTCxHQUFHO3dDQUNILG1DQUFtQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDM0QscUJBQW1CLEdBQUcsV0FBVyxDQUFDOzZCQUNyQyxDQUFDLENBQUM7NEJBRUgsV0FBUyxHQUFHLFdBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxZQUFZLEdBQUc0QixnQkFBYyxDQUFDLDBCQUEwQixDQUN4RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQ3BDLENBQUM7NEJBRUYsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQ0FDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDOzZCQUN4RDtpQ0FBTTtnQ0FDSCxJQUFJLEtBQUssR0FBRztvQ0FDUixJQUFJLEVBQUUsS0FBSztvQ0FDWCxFQUFFLEVBQUUsRUFBRTtvQ0FDTixRQUFRLEVBQUUsR0FBRztvQ0FDYixPQUFPLEVBQUUsaUJBQWlCO29DQUMxQixJQUFJLEVBQUUsV0FBUztvQ0FDZixjQUFjLEVBQUUsWUFBWTtvQ0FDNUIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNO29DQUN4QixjQUFjLEVBQUUsY0FBYyxDQUFDLFFBQVE7MENBQ2pDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTTswQ0FDOUIsQ0FBQztvQ0FDUCxRQUFRLEVBQUUsRUFBRTtvQ0FDWixTQUFTLEVBQUUsS0FBSztvQ0FDaEIsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRO2lDQUNsRCxDQUFDO2dDQUNGLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0NBQ3pCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztpQ0FDNUI7Z0NBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7b0NBRXZCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUNBQ3pDO3FDQUFNO29DQUNINUIsZUFBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO2lDQUMxQzs2QkFDSjt5QkFDSjtxQkFDSjtpQkFDSixDQUFDLENBQUM7Z0JBRUgsT0FBTyxFQUFFLENBQUM7YUFDYixFQUNELFVBQUEsWUFBWTtnQkFDUixNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMzQixNQUFNLENBQUMsa0RBQWtELENBQUMsQ0FBQzthQUM5RCxDQUNKLENBQUM7U0FDTCxDQUFDLENBQUM7S0FDTjtJQUVNLG9DQUFjLEdBQXJCLFVBQXNCLFdBQVk7UUFBbEMsaUJBMk1DO1FBMU1HLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLFFBQVEsR0FBRyxXQUFXLEdBQUcsV0FBVyxHQUFHRSxvQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUzRSxPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDL0JGLGVBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxRQUFRO2dCQUNsRCxRQUFRLENBQUMsYUFBYSxHQUFHO29CQUNyQixVQUFVLEVBQUUsRUFBRTtvQkFDZCxXQUFXLEVBQUUsRUFBRTtvQkFDZixVQUFVLEVBQUUsRUFBRTtvQkFDZCxXQUFXLEVBQUUsRUFBRTtvQkFDZixLQUFLLEVBQUUsRUFBRTtpQkFDWixDQUFDO2dCQUNGLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FDdEUsVUFBQSxZQUFZO29CQUNSLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUEsWUFBWTt3QkFDL0QsUUFBUSxZQUFZLENBQUMsSUFBSTs0QkFDckIsS0FBSyxXQUFXO2dDQUNaLE9BQU9FLG9CQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFBLFNBQVM7b0NBQ3BELElBQUksaUJBQWlCLENBQUM7b0NBQ3RCLElBQUksT0FBTyxZQUFZLENBQUMsRUFBRSxLQUFLLFdBQVcsRUFBRTt3Q0FDeEMsaUJBQWlCOzRDQUNaLFNBQWlCLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxFQUFFLENBQUM7cUNBQ2pEO3lDQUFNO3dDQUNILGlCQUFpQjs0Q0FDWixTQUFpQixDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsSUFBSSxDQUFDO3FDQUNyRDtvQ0FDRCxJQUNJLGlCQUFpQjt3Q0FDakIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ3hEO3dDQUNFLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztxQ0FDckQ7b0NBQ0QsT0FBTyxpQkFBaUIsQ0FBQztpQ0FDNUIsQ0FBQyxDQUFDOzRCQUVQLEtBQUssV0FBVztnQ0FDWixPQUFPQSxvQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQSxTQUFTO29DQUNwRCxJQUFJLGlCQUFpQixDQUFDO29DQUN0QixJQUFJLE9BQU8sWUFBWSxDQUFDLEVBQUUsS0FBSyxXQUFXLEVBQUU7d0NBQ3hDLGlCQUFpQjs0Q0FDWixTQUFpQixDQUFDLEVBQUUsS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDO3FDQUNqRDt5Q0FBTTt3Q0FDSCxpQkFBaUI7NENBQ1osU0FBaUIsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUksQ0FBQztxQ0FDckQ7b0NBQ0QsSUFDSSxpQkFBaUI7d0NBQ2pCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUN4RDt3Q0FDRSxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7cUNBQ3JEO29DQUNELE9BQU8saUJBQWlCLENBQUM7aUNBQzVCLENBQUMsQ0FBQzs0QkFFUCxLQUFLLFlBQVk7Z0NBQ2IsT0FBT0Esb0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUEsVUFBVTtvQ0FDdEQsSUFBSSxrQkFBa0IsQ0FBQztvQ0FDdkIsSUFBSSxPQUFPLFlBQVksQ0FBQyxFQUFFLEtBQUssV0FBVyxFQUFFO3dDQUN4QyxrQkFBa0I7NENBQ2IsVUFBa0IsQ0FBQyxFQUFFLEtBQUssWUFBWSxDQUFDLEVBQUUsQ0FBQztxQ0FDbEQ7eUNBQU07d0NBQ0gsa0JBQWtCOzRDQUNiLFVBQWtCLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxJQUFJLENBQUM7cUNBQ3REO29DQUNELElBQ0ksa0JBQWtCO3dDQUNsQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFDMUQ7d0NBQ0UsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FDQUN2RDtvQ0FDRCxPQUFPLGtCQUFrQixDQUFDO2lDQUM3QixDQUFDLENBQUM7NEJBRVAsS0FBSyxRQUFRO2dDQUNULE9BQU9BLG9CQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FDdkMsVUFBQSxNQUFNLElBQUksT0FBQyxNQUFjLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxJQUFJLEdBQUEsQ0FDdkQsQ0FBQzs0QkFFTixLQUFLLE1BQU07Z0NBQ1AsT0FBT0Esb0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUEsSUFBSTtvQ0FDMUMsSUFBSSxZQUFZLENBQUM7b0NBQ2pCLElBQUksT0FBTyxZQUFZLENBQUMsRUFBRSxLQUFLLFdBQVcsRUFBRTt3Q0FDeEMsWUFBWSxHQUFJLElBQVksQ0FBQyxFQUFFLEtBQUssWUFBWSxDQUFDLEVBQUUsQ0FBQztxQ0FDdkQ7eUNBQU07d0NBQ0gsWUFBWSxHQUFJLElBQVksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUksQ0FBQztxQ0FDM0Q7b0NBQ0QsSUFDSSxZQUFZO3dDQUNaLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM5Qzt3Q0FDRSxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUNBQzNDO29DQUNELE9BQU8sWUFBWSxDQUFDO2lDQUN2QixDQUFDLENBQUM7NEJBRVA7Z0NBQ0ksT0FBTyxJQUFJLENBQUM7eUJBQ25CO3FCQUNKLENBQUMsQ0FBQztpQkFDTixDQUNKLENBQUM7Z0JBQ0YsUUFBUSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFBLFFBQVE7b0JBQ25ELFFBQ0lBLG9CQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFBLFVBQVU7d0JBQy9DLElBQUksa0JBQWtCLEdBQUksVUFBa0IsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDcEUsSUFDSSxrQkFBa0I7NEJBQ2xCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUMxRDs0QkFDRSxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQ3ZEO3dCQUNELE9BQU8sa0JBQWtCLENBQUM7cUJBQzdCLENBQUM7d0JBQ0ZBLG9CQUFrQixDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FDckMsVUFBQSxXQUFXLElBQUksT0FBQyxXQUFtQixDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxHQUFBLENBQzdELEVBQ0g7aUJBQ0wsQ0FBQyxDQUFDOztnQkFFSFgsWUFBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFVBQUEsUUFBUTtvQkFDbEMsSUFDSVcsb0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUNwQyxVQUFBLFVBQVUsSUFBSSxPQUFDLFVBQWtCLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEdBQUEsQ0FDM0QsRUFDSDt3QkFDRSxRQUFRLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztxQkFDaEM7b0JBQ0QsSUFDSUEsb0JBQWtCLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUNyQyxVQUFBLFdBQVcsSUFBSSxPQUFDLFdBQW1CLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEdBQUEsQ0FDN0QsRUFDSDt3QkFDRSxRQUFRLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztxQkFDakM7aUJBQ0osQ0FBQyxDQUFDOztnQkFFSCxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBR1gsWUFBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRTtvQkFDNUUsTUFBTTtpQkFDVCxDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUdBLFlBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUU7b0JBQzlFLE1BQU07aUJBQ1QsQ0FBQyxDQUFDO2dCQUNILFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFO29CQUM1RSxNQUFNO2lCQUNULENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBR0EsWUFBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtvQkFDOUUsTUFBTTtpQkFDVCxDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUdBLFlBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUVoRixRQUFRLENBQUMsWUFBWSxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxRQUFRLENBQUMsZUFBZSxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxRQUFRLENBQUMsU0FBUyxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxRQUFRLENBQUMsT0FBTyxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxRQUFRLENBQUMsT0FBTyxHQUFHQSxZQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUV4RCxPQUFPLFFBQVEsQ0FBQzthQUNuQixDQUFDLENBQUM7WUFFSFMsZUFBYSxDQUFDLE9BQU8sQ0FBQztnQkFDbEIsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsRUFBRSxFQUFFLFNBQVM7Z0JBQ2IsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLEtBQUssRUFBRSxDQUFDO2dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSTthQUM5QyxDQUFDLENBQUM7WUFFSCxJQUFJLEdBQUcsR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2hELElBQUksSUFBSSxHQUFHO2dCQUNQLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtvQkFDVCxJQUNJNEIsZ0JBQWMsQ0FBQyxzQkFBc0IsQ0FDakM1QixlQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3pDLEVBQ0g7d0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FDUCxNQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLG1DQUFnQyxDQUM3RSxDQUFDO3dCQUNGLElBQUksTUFBTSxHQUFHNEIsZ0JBQWMsQ0FBQyx1QkFBdUIsQ0FDL0M1QixlQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3pDLENBQUM7d0JBQ0ZBLGVBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQzdEO29CQUNEQSxlQUFhLENBQUMsT0FBTyxDQUFDO3dCQUNsQixJQUFJLEVBQUUsU0FBUzt3QkFDZixJQUFJLEVBQUVBLGVBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7d0JBQzVDLEVBQUUsRUFBRUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDeEMsT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUNBLGVBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMzRCxPQUFPLEVBQUUsUUFBUTt3QkFDakIsTUFBTSxFQUFFQSxlQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQ3pDLEtBQUssRUFBRSxDQUFDO3dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtxQkFDbEQsQ0FBQyxDQUFDO29CQUNILENBQUMsRUFBRSxDQUFDO29CQUNKLElBQUksRUFBRSxDQUFDO2lCQUNWO3FCQUFNO29CQUNILE9BQU8sRUFBRSxDQUFDO2lCQUNiO2FBQ0osQ0FBQztZQUNGLElBQUksRUFBRSxDQUFDO1NBQ1YsQ0FBQyxDQUFDO0tBQ047SUFrRk0sdUNBQWlCLEdBQXhCLFVBQXlCLGNBQWU7UUFBeEMsaUJBdUNDO1FBdENHLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsY0FBYztjQUM1QyxjQUFjO2NBQ2RFLG9CQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXpDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBR0YsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ25ELElBQUksSUFBSSxHQUFHO2dCQUNQLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtvQkFDVCxJQUFJLE1BQU0sR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELElBQUk0QixnQkFBYyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFJLE1BQU0sQ0FBQyxJQUFJLG1DQUFnQyxDQUFDLENBQUM7d0JBQzdELElBQUksTUFBTSxHQUFHQSxnQkFBYyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDakUsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ2xDO29CQUNELElBQUksSUFBSSxHQUFHO3dCQUNQLElBQUksRUFBRSxZQUFZO3dCQUNsQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7d0JBQ2pCLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTt3QkFDYixPQUFPLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7d0JBQ2hDLE9BQU8sRUFBRSxXQUFXO3dCQUNwQixTQUFTLEVBQUUsTUFBTTt3QkFDakIsS0FBSyxFQUFFLENBQUM7d0JBQ1IsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRO3FCQUNsRCxDQUFDO29CQUNGLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTt3QkFDcEIsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztxQkFDekM7b0JBQ0Q1QixlQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixDQUFDLEVBQUUsQ0FBQztvQkFDSixJQUFJLEVBQUUsQ0FBQztpQkFDVjtxQkFBTTtvQkFDSCxPQUFPLEVBQUUsQ0FBQztpQkFDYjthQUNKLENBQUM7WUFDRixJQUFJLEVBQUUsQ0FBQztTQUNWLENBQUMsQ0FBQztLQUNOO0lBRU0sMENBQW9CLEdBQTNCLFVBQTRCLFFBQVM7UUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3JDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxRQUFRO2NBQ3pDLFFBQVE7Y0FDUkUsb0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU1QyxPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDL0IsSUFBSUYsZUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNEQSxlQUFhLENBQUMsT0FBTyxDQUFDO29CQUNsQixJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLEVBQUUsRUFBRSx5QkFBeUI7b0JBQzdCLE9BQU8sRUFBRSx5QkFBeUI7b0JBQ2xDLEtBQUssRUFBRSxDQUFDO29CQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtpQkFDbEQsQ0FBQyxDQUFDO2FBQ047WUFDRCxJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0RBLGVBQWEsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLElBQUksRUFBRSxlQUFlO29CQUNyQixJQUFJLEVBQUUsV0FBVztvQkFDakIsRUFBRSxFQUFFLHlCQUF5QjtvQkFDN0IsT0FBTyxFQUFFLHlCQUF5QjtvQkFDbEMsS0FBSyxFQUFFLENBQUM7b0JBQ1IsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRO2lCQUNsRCxDQUFDLENBQUM7YUFDTjtZQUNELElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3REEsZUFBYSxDQUFDLE9BQU8sQ0FBQztvQkFDbEIsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRSxhQUFhO29CQUNuQixFQUFFLEVBQUUsMkJBQTJCO29CQUMvQixPQUFPLEVBQUUsMkJBQTJCO29CQUNwQyxLQUFLLEVBQUUsQ0FBQztvQkFDUixRQUFRLEVBQUUsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVE7aUJBQ2xELENBQUMsQ0FBQzthQUNOO1lBQ0QsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlEQSxlQUFhLENBQUMsT0FBTyxDQUFDO29CQUNsQixJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLEVBQUUsRUFBRSw0QkFBNEI7b0JBQ2hDLE9BQU8sRUFBRSw0QkFBNEI7b0JBQ3JDLEtBQUssRUFBRSxDQUFDO29CQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtpQkFDbEQsQ0FBQyxDQUFDO2FBQ047WUFFRCxPQUFPLEVBQUUsQ0FBQztTQUNiLENBQUMsQ0FBQztLQUNOO0lBRU8sdUNBQWlCLEdBQXpCLFVBQTBCLFNBQVM7UUFDL0IsSUFBSSxPQUFPLEdBQUdILGVBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksWUFBWSxHQUFHQSxlQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBR0EsZUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDSSxZQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3RDLElBQUksR0FBRyxHQUFHLDhCQUE0QixTQUFTLENBQUMsSUFBTSxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNLEtBQU8sQ0FBQyxDQUFDO1NBQy9DO1FBRUQsT0FBT0EsWUFBVSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQ3BDLFVBQUEsSUFBSSxJQUFJLFFBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUMsRUFDdkMsVUFBQSxHQUFHO1lBQ0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDN0IsQ0FDSixDQUFDO0tBQ0w7SUFFTyxrQ0FBWSxHQUFwQixVQUFxQixTQUFTO1FBQzFCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDOUIsU0FBUyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLGFBQWEsRUFBRSxZQUFZO1lBQzNDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO2dCQUNoQixTQUFTLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQzthQUM5RCxDQUFDLENBQUM7WUFDSCxhQUFhLEVBQUUsQ0FBQztTQUNuQixDQUFDLENBQUM7S0FDTjtJQUVPLHFDQUFlLEdBQXZCLFVBQXdCLFNBQVM7UUFDN0IsSUFBSSxPQUFPLEdBQUdKLGVBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNDLElBQUksZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBQSxRQUFRO1lBQ25ELElBQUksU0FBUyxHQUFHQSxlQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBR0EsZUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUU1RCxJQUFJLENBQUNJLFlBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ25DLElBQUksR0FBRyxHQUFHLDJCQUF5QixTQUFTLGFBQVEsU0FBUyxDQUFDLElBQU0sQ0FBQztnQkFDckUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNLEtBQU8sQ0FBQyxDQUFDO2FBQy9DO1lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO2dCQUMvQkEsWUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJO29CQUMvQixPQUFPLENBQUM7d0JBQ0osSUFBSSxNQUFBO3dCQUNKLFFBQVEsVUFBQTtxQkFDWCxDQUFDLENBQUM7aUJBQ04sQ0FBQyxDQUFDO2FBQ04sQ0FBQyxDQUFDO1NBQ04sQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUNyQyxVQUFBLElBQUksSUFBSSxRQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxJQUFDLEVBQ3hDLFVBQUEsR0FBRztZQUNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdCLENBQ0osQ0FBQztLQUNMO0lBRU8sZ0NBQVUsR0FBbEIsVUFBbUIsVUFBVTtRQUN6QixJQUFJLFlBQVksR0FBR0QsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDdkQsSUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUN4RCxZQUFZO1lBQ1IsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO2tCQUNuQlQsWUFBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQztrQkFDakQsWUFBWSxDQUFDO1FBQ3ZCLElBQUksWUFBWSxHQUFHLFVBQUMsT0FBZTtZQUMvQixPQUFPLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxLQUFLLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDM0QsQ0FBQztRQUVGLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQkEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsVUFBQSxTQUFTO1lBQzdCLElBQUksTUFBTSxHQUFHQSxZQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBbUIsU0FBUyxDQUFDLEVBQUUscUNBQWtDLENBQUMsQ0FBQzthQUN0RjtZQUVELE1BQU0sQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUUvQixJQUFJLHFCQUFxQixFQUFFO2dCQUN2QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzthQUN4Qjs7WUFHRCxJQUFJLENBQUMsQ0FBQyxLQUFLQSxZQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQ25ELE9BQU87YUFDVjs7WUFHRCxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssTUFBTSxJQUFJUyxlQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRTtnQkFDbEUsT0FBTzthQUNWO1lBQ0QsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdkUsT0FBTzthQUNWO1lBQ0QsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLGNBQWMsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDOUUsT0FBTzthQUNWO1lBQ0QsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFdBQVcsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hFLE9BQU87YUFDVjs7WUFHRCxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDakQsT0FBTzthQUNWO1lBQ0QsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3ZELE9BQU87YUFDVjtZQUNELElBQ0ksU0FBUyxDQUFDLEVBQUUsS0FBSyxjQUFjO2lCQUM5QixDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQ2xFO2dCQUNFLE9BQU87YUFDVjtZQUNELElBQ0ksU0FBUyxDQUFDLEVBQUUsS0FBSyxXQUFXO2lCQUMzQixDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO2lCQUMzRCxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQ3hEO2dCQUNFLE9BQU87YUFDVjtZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFtRSxVQUFVLENBQUMsSUFBSSxxRkFDeEMsQ0FBQyxDQUFDO1NBQy9EO1FBRUQsT0FBTyxPQUFPLENBQUM7S0FDbEI7SUFFTSx3Q0FBa0IsR0FBekIsVUFBMEIsZUFBZ0I7UUFBMUMsaUJBa0NDO1FBakNHLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsZUFBZTtjQUM5QyxlQUFlO2NBQ2ZFLG9CQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTFDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBR0YsZUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ3BELElBQUksSUFBSSxHQUFHO2dCQUNQLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtvQkFDVCxJQUFJLFVBQVUsR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELElBQUksSUFBSSxHQUFHO3dCQUNQLElBQUksRUFBRSxhQUFhO3dCQUNuQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7d0JBQ3JCLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTt3QkFDakIsT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO3dCQUNwQyxPQUFPLEVBQUUsWUFBWTt3QkFDckIsVUFBVSxFQUFFLFVBQVU7d0JBQ3RCLEtBQUssRUFBRSxDQUFDO3dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtxQkFDbEQsQ0FBQztvQkFDRixJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUU7d0JBQ3hCLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7cUJBQzdDO29CQUNEQSxlQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixDQUFDLEVBQUUsQ0FBQztvQkFDSixJQUFJLEVBQUUsQ0FBQztpQkFDVjtxQkFBTTtvQkFDSCxPQUFPLEVBQUUsQ0FBQztpQkFDYjthQUNKLENBQUM7WUFDRixJQUFJLEVBQUUsQ0FBQztTQUNWLENBQUMsQ0FBQztLQUNOO0lBRU0scUNBQWUsR0FBdEIsVUFBdUIsWUFBYTtRQUFwQyxpQkFrQ0M7UUFqQ0csTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hDQSxlQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxZQUFZO2NBQ3hDLFlBQVk7Y0FDWkUsb0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFdkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQU0sR0FBRyxHQUFHRixlQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDbkQsSUFBTSxJQUFJLEdBQUc7Z0JBQ1QsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO29CQUNULElBQUksTUFBTSxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxJQUFJLEdBQUc7d0JBQ1AsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTt3QkFDakIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO3dCQUNiLE9BQU8sRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzt3QkFDaEMsT0FBTyxFQUFFLFFBQVE7d0JBQ2pCLE1BQU0sRUFBRSxNQUFNO3dCQUNkLEtBQUssRUFBRSxDQUFDO3dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtxQkFDbEQsQ0FBQztvQkFDRixJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7d0JBQ3BCLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7cUJBQ3pDO29CQUNEQSxlQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixDQUFDLEVBQUUsQ0FBQztvQkFDSixJQUFJLEVBQUUsQ0FBQztpQkFDVjtxQkFBTTtvQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2pCO2FBQ0osQ0FBQztZQUNGLElBQUksRUFBRSxDQUFDO1NBQ1YsQ0FBQyxDQUFDO0tBQ047SUFFTSx1Q0FBaUIsR0FBeEIsVUFBeUIsY0FBZTtRQUF4QyxpQkFzR0M7UUFyR0csTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xDQSxlQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxjQUFjO2NBQzVDLGNBQWM7Y0FDZEUsb0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFekMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLDJCQUEyQixFQUFFLDBCQUEwQjtZQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBR0YsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ25ELElBQUksSUFBSSxHQUFHO2dCQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7b0JBQ2QsSUFBSSxXQUFTLEdBQUdBLGVBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyRCxJQUFJNEIsZ0JBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBSSxXQUFTLENBQUMsSUFBSSxtQ0FBZ0MsQ0FBQyxDQUFDO3dCQUNoRSxJQUFJLFVBQVUsR0FBR0EsZ0JBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3hFLFdBQVMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN6QztvQkFDRCxJQUFJLElBQUksR0FBRzt3QkFDUCxJQUFJLEVBQUUsWUFBWTt3QkFDbEIsSUFBSSxFQUFFLFdBQVMsQ0FBQyxJQUFJO3dCQUNwQixFQUFFLEVBQUUsV0FBUyxDQUFDLEVBQUU7d0JBQ2hCLE9BQU8sRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLFdBQVMsQ0FBQzt3QkFDbkMsT0FBTyxFQUFFLFdBQVc7d0JBQ3BCLFNBQVMsRUFBRSxXQUFTO3dCQUNwQixLQUFLLEVBQUUsQ0FBQzt3QkFDUixRQUFRLEVBQUUsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVE7cUJBQ2xELENBQUM7b0JBRUYsSUFBSSxXQUFTLENBQUMsV0FBVyxFQUFFO3dCQUN2QixJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxXQUFTLENBQUMsV0FBVyxDQUFDO3FCQUM1QztvQkFDRDVCLGVBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRTVCLElBQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLENBQzNDLFVBQUMsMkJBQTJCLEVBQUUsMEJBQTBCO3dCQUNwRCxJQUFJLFdBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFJLFdBQVMsQ0FBQyxJQUFJLG1DQUFnQyxDQUFDLENBQUM7NEJBQ2hFLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFTLENBQUMsQ0FBQyxJQUFJLENBQ2xDO2dDQUNJLDJCQUEyQixFQUFFLENBQUM7NkJBQ2pDLEVBQ0QsVUFBQSxDQUFDO2dDQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ2hCLDBCQUEwQixFQUFFLENBQUM7NkJBQ2hDLENBQ0osQ0FBQzt5QkFDTDs2QkFBTTs0QkFDSCwyQkFBMkIsRUFBRSxDQUFDO3lCQUNqQztxQkFDSixDQUNKLENBQUM7b0JBQ0YsSUFBTSx5QkFBeUIsR0FBRyxJQUFJLE9BQU8sQ0FDekMsVUFBQyx5QkFBeUIsRUFBRSx3QkFBd0I7d0JBQ2hELElBQUksV0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQUksV0FBUyxDQUFDLElBQUksaUNBQThCLENBQUMsQ0FBQzs0QkFDOUQsS0FBSSxDQUFDLGVBQWUsQ0FBQyxXQUFTLENBQUMsQ0FBQyxJQUFJLENBQ2hDO2dDQUNJLHlCQUF5QixFQUFFLENBQUM7NkJBQy9CLEVBQ0QsVUFBQSxDQUFDO2dDQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ2hCLHdCQUF3QixFQUFFLENBQUM7NkJBQzlCLENBQ0osQ0FBQzt5QkFDTDs2QkFBTTs0QkFDSCx5QkFBeUIsRUFBRSxDQUFDO3lCQUMvQjtxQkFDSixDQUNKLENBQUM7b0JBQ0YsSUFBTSxzQkFBc0IsR0FBRyxJQUFJLE9BQU8sQ0FDdEMsVUFBQyxzQkFBc0IsRUFBRSxxQkFBcUI7d0JBQzFDLElBQUksV0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQUksV0FBUyxDQUFDLElBQUksOEJBQTJCLENBQUMsQ0FBQzs0QkFDM0QsS0FBSSxDQUFDLFlBQVksQ0FBQyxXQUFTLENBQUMsQ0FBQyxJQUFJLENBQzdCO2dDQUNJLHNCQUFzQixFQUFFLENBQUM7NkJBQzVCLEVBQ0QsVUFBQSxDQUFDO2dDQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ2hCLHFCQUFxQixFQUFFLENBQUM7NkJBQzNCLENBQ0osQ0FBQzt5QkFDTDs2QkFBTTs0QkFDSCxzQkFBc0IsRUFBRSxDQUFDO3lCQUM1QjtxQkFDSixDQUNKLENBQUM7b0JBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQzt3QkFDUiwyQkFBMkI7d0JBQzNCLHlCQUF5Qjt3QkFDekIsc0JBQXNCO3FCQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUNKLENBQUMsRUFBRSxDQUFDO3dCQUNKLElBQUksRUFBRSxDQUFDO3FCQUNWLENBQUMsQ0FBQztpQkFDTjtxQkFBTTtvQkFDSCwyQkFBMkIsRUFBRSxDQUFDO2lCQUNqQzthQUNKLENBQUM7WUFDRixJQUFJLEVBQUUsQ0FBQztTQUNWLENBQUMsQ0FBQztLQUNOO0lBRU0sdUNBQWlCLEdBQXhCLFVBQXlCLGNBQWU7UUFBeEMsaUJBd0NDO1FBdkNHLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUVsQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsY0FBYztjQUM1QyxjQUFjO2NBQ2RFLG9CQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXpDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBR0YsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ25ELElBQUksSUFBSSxHQUFHO2dCQUNQLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtvQkFDVCxJQUFJLFNBQVMsR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JELElBQUk0QixnQkFBYyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFJLFNBQVMsQ0FBQyxJQUFJLG1DQUFnQyxDQUFDLENBQUM7d0JBQ2hFLElBQUksTUFBTSxHQUFHQSxnQkFBYyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDcEUsU0FBUyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ3JDO29CQUNELElBQUksSUFBSSxHQUFHO3dCQUNQLElBQUksRUFBRSxZQUFZO3dCQUNsQixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7d0JBQ3BCLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRTt3QkFDaEIsT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO3dCQUNuQyxPQUFPLEVBQUUsV0FBVzt3QkFDcEIsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLEtBQUssRUFBRSxDQUFDO3dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtxQkFDbEQsQ0FBQztvQkFDRixJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUU7d0JBQ3ZCLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7cUJBQzVDO29CQUNENUIsZUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUIsQ0FBQyxFQUFFLENBQUM7b0JBQ0osSUFBSSxFQUFFLENBQUM7aUJBQ1Y7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLENBQUM7aUJBQ2I7YUFDSixDQUFDO1lBQ0YsSUFBSSxFQUFFLENBQUM7U0FDVixDQUFDLENBQUM7S0FDTjtJQUVNLHdDQUFrQixHQUF6QixVQUEwQixlQUFnQjtRQUExQyxpQkF3Q0M7UUF2Q0csTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRW5DQSxlQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxlQUFlO2NBQzlDLGVBQWU7Y0FDZkUsb0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFMUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUksR0FBRyxHQUFHRixlQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDcEQsSUFBSSxJQUFJLEdBQUc7Z0JBQ1AsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO29CQUNULElBQUksS0FBSyxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEQsSUFBSTRCLGdCQUFjLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQUksS0FBSyxDQUFDLElBQUksbUNBQWdDLENBQUMsQ0FBQzt3QkFDNUQsSUFBSSxNQUFNLEdBQUdBLGdCQUFjLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNoRSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDakM7b0JBQ0QsSUFBSSxJQUFJLEdBQUc7d0JBQ1AsSUFBSSxFQUFFLGFBQWE7d0JBQ25CLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTt3QkFDaEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUNaLE9BQU8sRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQzt3QkFDL0IsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFVBQVUsRUFBRSxLQUFLO3dCQUNqQixLQUFLLEVBQUUsQ0FBQzt3QkFDUixRQUFRLEVBQUUsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVE7cUJBQ2xELENBQUM7b0JBQ0YsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO3dCQUNuQixJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO3FCQUN4QztvQkFDRDVCLGVBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVCLENBQUMsRUFBRSxDQUFDO29CQUNKLElBQUksRUFBRSxDQUFDO2lCQUNWO3FCQUFNO29CQUNILE9BQU8sRUFBRSxDQUFDO2lCQUNiO2FBQ0osQ0FBQztZQUNGLElBQUksRUFBRSxDQUFDO1NBQ1YsQ0FBQyxDQUFDO0tBQ047SUFFTSx5Q0FBbUIsR0FBMUIsVUFBMkIsZ0JBQWlCO1FBQTVDLGlCQXdDQztRQXZDRyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFcENBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLGdCQUFnQjtjQUNoRCxnQkFBZ0I7Y0FDaEJFLG9CQUFrQixDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTNDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEdBQUcsR0FBR0YsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3JELElBQUksSUFBSSxHQUFHO2dCQUNQLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtvQkFDVCxJQUFJLFdBQVcsR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pELElBQUk0QixnQkFBYyxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDekQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFJLFdBQVcsQ0FBQyxJQUFJLG1DQUFnQyxDQUFDLENBQUM7d0JBQ2xFLElBQUksTUFBTSxHQUFHQSxnQkFBYyxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDdEUsV0FBVyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ3ZDO29CQUNELElBQUksSUFBSSxHQUFHO3dCQUNQLElBQUksRUFBRSxjQUFjO3dCQUNwQixJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUk7d0JBQ3RCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTt3QkFDbEIsT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO3dCQUNyQyxPQUFPLEVBQUUsYUFBYTt3QkFDdEIsVUFBVSxFQUFFLFdBQVc7d0JBQ3ZCLEtBQUssRUFBRSxDQUFDO3dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtxQkFDbEQsQ0FBQztvQkFDRixJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUU7d0JBQ3pCLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7cUJBQzlDO29CQUNENUIsZUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUIsQ0FBQyxFQUFFLENBQUM7b0JBQ0osSUFBSSxFQUFFLENBQUM7aUJBQ1Y7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLENBQUM7aUJBQ2I7YUFDSixDQUFDO1lBQ0YsSUFBSSxFQUFFLENBQUM7U0FDVixDQUFDLENBQUM7S0FDTjtJQUVNLG1DQUFhLEdBQXBCLFVBQXFCLFVBQVc7UUFBaEMsaUJBc0NDO1FBckNHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUU5QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBR0Usb0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFekYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUksR0FBRyxHQUFHRixlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDL0MsSUFBSSxJQUFJLEdBQUc7Z0JBQ1AsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO29CQUNULElBQUksS0FBSyxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsSUFBSTRCLGdCQUFjLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQUksS0FBSyxDQUFDLElBQUksbUNBQWdDLENBQUMsQ0FBQzt3QkFDNUQsSUFBSSxNQUFNLEdBQUdBLGdCQUFjLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNoRSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDakM7b0JBQ0QsSUFBSSxJQUFJLEdBQUc7d0JBQ1AsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO3dCQUNoQixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7d0JBQ1osT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO3dCQUMvQixPQUFPLEVBQUUsT0FBTzt3QkFDaEIsVUFBVSxFQUFFLEtBQUs7d0JBQ2pCLEtBQUssRUFBRSxDQUFDO3dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUTtxQkFDbEQsQ0FBQztvQkFDRixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7cUJBQ3hDO29CQUNENUIsZUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUIsQ0FBQyxFQUFFLENBQUM7b0JBQ0osSUFBSSxFQUFFLENBQUM7aUJBQ1Y7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLENBQUM7aUJBQ2I7YUFDSixDQUFDO1lBQ0YsSUFBSSxFQUFFLENBQUM7U0FDVixDQUFDLENBQUM7S0FDTjtJQUVNLG1DQUFhLEdBQXBCO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzlCQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBR0Usb0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFL0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CRixlQUFhLENBQUMsT0FBTyxDQUFDO2dCQUNsQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxFQUFFLEVBQUUsUUFBUTtnQkFDWixPQUFPLEVBQUUsUUFBUTtnQkFDakIsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJO2FBQzlDLENBQUMsQ0FBQztZQUVILElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLGlCQUFpQixDQUFDLFlBQVksRUFBRTtnQkFDeEV3QixrQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FDaEN4QixlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDN0JBLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNoQyxDQUFDLElBQUksQ0FDRjtvQkFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7b0JBQ3ZDLE9BQU8sRUFBRSxDQUFDO2lCQUNiLEVBQ0QsVUFBQSxDQUFDO29CQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLE1BQU0sRUFBRSxDQUFDO2lCQUNaLENBQ0osQ0FBQzthQUNMO2lCQUFNO2dCQUNILE9BQU8sRUFBRSxDQUFDO2FBQ2I7U0FDSixDQUFDLENBQUM7S0FDTjtJQUVNLHFDQUFlLEdBQXRCO1FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBRXJELE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTs7OztZQUkvQixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLCtCQUErQixHQUFHLENBQUMsQ0FBQztZQUN4QyxJQUFJLFNBQVMsR0FBRyxVQUFVLE9BQU87Z0JBQzdCLElBQUksTUFBTSxDQUFDO2dCQUNYLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRTtvQkFDZixNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUNsQjtxQkFBTSxJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRTtvQkFDdEMsTUFBTSxHQUFHLFFBQVEsQ0FBQztpQkFDckI7cUJBQU0sSUFBSSxPQUFPLEdBQUcsRUFBRSxJQUFJLE9BQU8sSUFBSSxFQUFFLEVBQUU7b0JBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUM7aUJBQ25CO3FCQUFNO29CQUNILE1BQU0sR0FBRyxXQUFXLENBQUM7aUJBQ3hCO2dCQUNELE9BQU8sTUFBTSxDQUFDO2FBQ2pCLENBQUM7WUFDRixJQUFNLHVEQUF1RCxHQUFHLFVBQUEsSUFBSTtnQkFDaEVULFlBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQUMsRUFBTztvQkFDcEIsSUFBTSxPQUFPLEdBQUksTUFBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO3dCQUMxQixPQUFPLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztxQkFDaEM7b0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7d0JBQ3ZCLE9BQU8sQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO3FCQUM3QjtvQkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTt3QkFDdkIsT0FBTyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7cUJBQzdCO29CQUNELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO3dCQUN4QixPQUFPLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztxQkFDOUI7b0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7d0JBQ3RCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO3FCQUM1QjtvQkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTt3QkFDdkIsT0FBTyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7cUJBQzdCO29CQUNELElBQUksRUFBRSxHQUFRO3dCQUNWLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSTt3QkFDdEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO3dCQUNsQixRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUk7d0JBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtxQkFDckIsQ0FBQztvQkFDRixJQUFJLHdCQUF3QixHQUFHLENBQUMsQ0FBQztvQkFDakMsSUFBSSxlQUFlLEdBQ2YsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNO3dCQUM5QixPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU07d0JBQzNCLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTTt3QkFDMUIsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNO3dCQUMzQixPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU07d0JBQzVCLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTTt3QkFDM0IsQ0FBQyxDQUFDO29CQUVOLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRTt3QkFDeEIsZUFBZSxJQUFJLENBQUMsQ0FBQzt3QkFDckIsSUFDSSxPQUFPLENBQUMsY0FBYzs0QkFDdEIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXOzRCQUNsQyxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQzNDOzRCQUNFLHdCQUF3QixJQUFJLENBQUMsQ0FBQzt5QkFDakM7cUJBQ0o7b0JBQ0QsSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFO3dCQUNuRCx3QkFBd0IsSUFBSSxDQUFDLENBQUM7cUJBQ2pDO29CQUVEQSxZQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsVUFBQyxRQUFhO3dCQUM3QyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUtDLGtCQUFVLENBQUMsY0FBYyxFQUFFOzs0QkFFckQsZUFBZSxJQUFJLENBQUMsQ0FBQzt5QkFDeEI7d0JBQ0QsSUFDSSxRQUFRLENBQUMsV0FBVzs0QkFDcEIsUUFBUSxDQUFDLFdBQVcsS0FBSyxFQUFFOzRCQUMzQixRQUFRLENBQUMsWUFBWSxLQUFLQSxrQkFBVSxDQUFDLGNBQWMsRUFDckQ7NEJBQ0Usd0JBQXdCLElBQUksQ0FBQyxDQUFDO3lCQUNqQztxQkFDSixDQUFDLENBQUM7b0JBQ0hELFlBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxVQUFDLE1BQVc7d0JBQ3hDLElBQUksTUFBTSxDQUFDLFlBQVksS0FBS0Msa0JBQVUsQ0FBQyxjQUFjLEVBQUU7OzRCQUVuRCxlQUFlLElBQUksQ0FBQyxDQUFDO3lCQUN4Qjt3QkFDRCxJQUNJLE1BQU0sQ0FBQyxXQUFXOzRCQUNsQixNQUFNLENBQUMsV0FBVyxLQUFLLEVBQUU7NEJBQ3pCLE1BQU0sQ0FBQyxZQUFZLEtBQUtBLGtCQUFVLENBQUMsY0FBYyxFQUNuRDs0QkFDRSx3QkFBd0IsSUFBSSxDQUFDLENBQUM7eUJBQ2pDO3FCQUNKLENBQUMsQ0FBQztvQkFDSEQsWUFBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQUMsUUFBYTt3QkFDMUMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLQyxrQkFBVSxDQUFDLGNBQWMsRUFBRTs7NEJBRXJELGVBQWUsSUFBSSxDQUFDLENBQUM7eUJBQ3hCO3dCQUNELElBQ0ksUUFBUSxDQUFDLFdBQVc7NEJBQ3BCLFFBQVEsQ0FBQyxXQUFXLEtBQUssRUFBRTs0QkFDM0IsUUFBUSxDQUFDLFlBQVksS0FBS0Esa0JBQVUsQ0FBQyxjQUFjLEVBQ3JEOzRCQUNFLHdCQUF3QixJQUFJLENBQUMsQ0FBQzt5QkFDakM7cUJBQ0osQ0FBQyxDQUFDO29CQUNIRCxZQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsVUFBQyxNQUFXO3dCQUN6QyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUtDLGtCQUFVLENBQUMsY0FBYyxFQUFFOzs0QkFFbkQsZUFBZSxJQUFJLENBQUMsQ0FBQzt5QkFDeEI7d0JBQ0QsSUFDSSxNQUFNLENBQUMsV0FBVzs0QkFDbEIsTUFBTSxDQUFDLFdBQVcsS0FBSyxFQUFFOzRCQUN6QixNQUFNLENBQUMsWUFBWSxLQUFLQSxrQkFBVSxDQUFDLGNBQWMsRUFDbkQ7NEJBQ0Usd0JBQXdCLElBQUksQ0FBQyxDQUFDO3lCQUNqQztxQkFDSixDQUFDLENBQUM7b0JBQ0hELFlBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxVQUFDLEtBQVU7d0JBQ3RDLElBQUksS0FBSyxDQUFDLFlBQVksS0FBS0Msa0JBQVUsQ0FBQyxjQUFjLEVBQUU7OzRCQUVsRCxlQUFlLElBQUksQ0FBQyxDQUFDO3lCQUN4Qjt3QkFDRCxJQUNJLEtBQUssQ0FBQyxXQUFXOzRCQUNqQixLQUFLLENBQUMsV0FBVyxLQUFLLEVBQUU7NEJBQ3hCLEtBQUssQ0FBQyxZQUFZLEtBQUtBLGtCQUFVLENBQUMsY0FBYyxFQUNsRDs0QkFDRSx3QkFBd0IsSUFBSSxDQUFDLENBQUM7eUJBQ2pDO3FCQUNKLENBQUMsQ0FBQztvQkFDSEQsWUFBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQUMsTUFBVzt3QkFDeEMsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLQyxrQkFBVSxDQUFDLGNBQWMsRUFBRTs7NEJBRW5ELGVBQWUsSUFBSSxDQUFDLENBQUM7eUJBQ3hCO3dCQUNELElBQ0ksTUFBTSxDQUFDLFdBQVc7NEJBQ2xCLE1BQU0sQ0FBQyxXQUFXLEtBQUssRUFBRTs0QkFDekIsTUFBTSxDQUFDLFlBQVksS0FBS0Esa0JBQVUsQ0FBQyxjQUFjLEVBQ25EOzRCQUNFLHdCQUF3QixJQUFJLENBQUMsQ0FBQzt5QkFDakM7cUJBQ0osQ0FBQyxDQUFDO29CQUVILEVBQUUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDM0IsQ0FBQyx3QkFBd0IsR0FBRyxlQUFlLElBQUksR0FBRyxDQUNyRCxDQUFDO29CQUNGLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRTt3QkFDdkIsRUFBRSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7cUJBQzFCO29CQUNELEVBQUUsQ0FBQyxhQUFhLEdBQUcsd0JBQXdCLEdBQUcsR0FBRyxHQUFHLGVBQWUsQ0FBQztvQkFDcEUsRUFBRSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUMxQywrQkFBK0IsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDO29CQUN0RCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNsQixDQUFDLENBQUM7YUFDTixDQUFDO1lBQ0YsSUFBSSxzQkFBc0IsR0FBRztnQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBRW5DLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDO29CQUMxQixJQUFJLFFBQVEsR0FDUixDQUFDLENBQUMsZUFBZSxJQUFJUSxlQUFhLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO29CQUN2RSxJQUFJLFFBQVEsSUFBSSxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLDBCQUEwQixFQUFFO3dCQUNoRSxNQUFNLENBQUMsSUFBSSxDQUNKLENBQUMsQ0FBQyxlQUFlLG9CQUFlLENBQUMsQ0FBQyxRQUFRLFdBQU0sQ0FBQyxDQUFDLElBQUksNkJBQTBCLENBQ3RGLENBQUM7cUJBQ0w7b0JBQ0QsT0FBTyxRQUFRLENBQUM7aUJBQ25CLENBQUMsQ0FBQztnQkFDSCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQztvQkFDM0IsSUFBSSxTQUFTLEdBQ1QsQ0FBQyxDQUFDLGVBQWUsR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDdEUsSUFBSSxTQUFTLEVBQUU7d0JBQ1gsTUFBTSxDQUFDLEtBQUssQ0FDTCxDQUFDLENBQUMsZUFBZSxvQkFBZSxDQUFDLENBQUMsUUFBUSxXQUFNLENBQUMsQ0FBQyxJQUFJLDhCQUEyQixDQUN2RixDQUFDO3FCQUNMO29CQUNELE9BQU8sU0FBUyxDQUFDO2lCQUNwQixDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNuQyxPQUFPO29CQUNILFNBQVMsRUFBRSxTQUFTO29CQUNwQixVQUFVLEVBQUUsVUFBVTtpQkFDekIsQ0FBQzthQUNMLENBQUM7WUFDRixJQUFJLDRCQUE0QixHQUFHLFVBQUMsRUFBRSxFQUFFLElBQUk7Z0JBQ3hDVCxZQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxVQUFDLEVBQU87b0JBQ2xCLElBQUksRUFBRSxHQUFRO3dCQUNWLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSTt3QkFDakIsSUFBSSxFQUFFLElBQUk7d0JBQ1YsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJO3dCQUNqQixXQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU87d0JBQ3ZCLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtxQkFDaEIsQ0FBQztvQkFDRixJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTt3QkFDNUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxlQUFlLENBQUM7cUJBQ2pDO29CQUNELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO29CQUNqQyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7b0JBRXhCLElBQUksRUFBRSxDQUFDLFlBQVksS0FBS0Msa0JBQVUsQ0FBQyxjQUFjLEVBQUU7O3dCQUUvQyxlQUFlLElBQUksQ0FBQyxDQUFDO3FCQUN4QjtvQkFDRCxJQUNJLEVBQUUsQ0FBQyxXQUFXO3dCQUNkLEVBQUUsQ0FBQyxXQUFXLEtBQUssRUFBRTt3QkFDckIsRUFBRSxDQUFDLFlBQVksS0FBS0Esa0JBQVUsQ0FBQyxjQUFjLEVBQy9DO3dCQUNFLHdCQUF3QixJQUFJLENBQUMsQ0FBQztxQkFDakM7b0JBRUQsRUFBRSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUMzQixDQUFDLHdCQUF3QixHQUFHLGVBQWUsSUFBSSxHQUFHLENBQ3JELENBQUM7b0JBQ0YsRUFBRSxDQUFDLGFBQWEsR0FBRyx3QkFBd0IsR0FBRyxHQUFHLEdBQUcsZUFBZSxDQUFDO29CQUNwRSxFQUFFLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQzFDLCtCQUErQixJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUM7b0JBQ3RELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2xCLENBQUMsQ0FBQzthQUNOLENBQUM7WUFFRixJQUFJLGNBQWMsR0FBRyxVQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUTtnQkFDdENELFlBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQUMsRUFBTztvQkFDcEIsSUFBSSxPQUFPLEdBQUksTUFBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO3dCQUNyQixPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztxQkFDM0I7b0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7d0JBQ2xCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO3FCQUN4QjtvQkFDRCxJQUFJLEdBQUcsR0FBUTt3QkFDWCxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUk7d0JBQ3RCLElBQUksRUFBRSxJQUFJO3dCQUNWLFFBQVEsRUFBRSxRQUFRO3dCQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7cUJBQ3JCLENBQUM7b0JBQ0YsSUFBSSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7b0JBQ2pDLElBQUksZUFBZSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFFN0UsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFO3dCQUN4QixlQUFlLElBQUksQ0FBQyxDQUFDO3dCQUNyQixJQUNJLE9BQU8sQ0FBQyxjQUFjOzRCQUN0QixPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVc7NEJBQ2xDLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFDM0M7NEJBQ0Usd0JBQXdCLElBQUksQ0FBQyxDQUFDO3lCQUNqQztxQkFDSjtvQkFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUU7d0JBQ25ELHdCQUF3QixJQUFJLENBQUMsQ0FBQztxQkFDakM7b0JBRURBLFlBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFDLFFBQWE7d0JBQ3hDLElBQUksUUFBUSxDQUFDLFlBQVksS0FBS0Msa0JBQVUsQ0FBQyxjQUFjLEVBQUU7OzRCQUVyRCxlQUFlLElBQUksQ0FBQyxDQUFDO3lCQUN4Qjt3QkFDRCxJQUNJLFFBQVEsQ0FBQyxXQUFXOzRCQUNwQixRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUU7NEJBQzNCLFFBQVEsQ0FBQyxZQUFZLEtBQUtBLGtCQUFVLENBQUMsY0FBYyxFQUNyRDs0QkFDRSx3QkFBd0IsSUFBSSxDQUFDLENBQUM7eUJBQ2pDO3FCQUNKLENBQUMsQ0FBQztvQkFDSEQsWUFBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQUMsTUFBVzt3QkFDbkMsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLQyxrQkFBVSxDQUFDLGNBQWMsRUFBRTs7NEJBRW5ELGVBQWUsSUFBSSxDQUFDLENBQUM7eUJBQ3hCO3dCQUNELElBQ0ksTUFBTSxDQUFDLFdBQVc7NEJBQ2xCLE1BQU0sQ0FBQyxXQUFXLEtBQUssRUFBRTs0QkFDekIsTUFBTSxDQUFDLFlBQVksS0FBS0Esa0JBQVUsQ0FBQyxjQUFjLEVBQ25EOzRCQUNFLHdCQUF3QixJQUFJLENBQUMsQ0FBQzt5QkFDakM7cUJBQ0osQ0FBQyxDQUFDO29CQUVILEdBQUcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDNUIsQ0FBQyx3QkFBd0IsR0FBRyxlQUFlLElBQUksR0FBRyxDQUNyRCxDQUFDO29CQUNGLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRTt3QkFDdkIsR0FBRyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7cUJBQzNCO29CQUNELEdBQUcsQ0FBQyxhQUFhLEdBQUcsd0JBQXdCLEdBQUcsR0FBRyxHQUFHLGVBQWUsQ0FBQztvQkFDckUsR0FBRyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUM1QywrQkFBK0IsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNuQixDQUFDLENBQUM7YUFDTixDQUFDO1lBRUYsdURBQXVELENBQ25EUSxlQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FDcEMsQ0FBQztZQUNGLHVEQUF1RCxDQUNuREEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQ3BDLENBQUM7WUFDRix1REFBdUQsQ0FDbkRBLGVBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUNyQyxDQUFDO1lBQ0YsdURBQXVELENBQ25EQSxlQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDbEMsQ0FBQztZQUVGLGNBQWMsQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLGNBQWMsQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9FLGNBQWMsQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzVFLGNBQWMsQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hFLGNBQWMsQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBRWxGVCxZQUFDLENBQUMsT0FBTyxDQUFDUyxlQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxVQUFDLElBQVM7Z0JBQzlDLElBQUksRUFBRSxHQUFRO29CQUNWLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2lCQUNsQixDQUFDO2dCQUNGLElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRTtvQkFDN0Msd0JBQXdCLElBQUksQ0FBQyxDQUFDO2lCQUNqQztnQkFFRCxFQUFFLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyx3QkFBd0IsR0FBRyxlQUFlLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ3BGLEVBQUUsQ0FBQyxhQUFhLEdBQUcsd0JBQXdCLEdBQUcsR0FBRyxHQUFHLGVBQWUsQ0FBQztnQkFDcEUsRUFBRSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMxQywrQkFBK0IsSUFBSSxFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUN0RCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2xCLENBQUMsQ0FBQztZQUVILDRCQUE0QixDQUN4QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUM5QyxVQUFVLENBQ2IsQ0FBQztZQUNGLDRCQUE0QixDQUN4QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUM5QyxVQUFVLENBQ2IsQ0FBQztZQUVGLEtBQUssR0FBR1QsWUFBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRXRDLElBQUksWUFBWSxHQUFHO2dCQUNmLEtBQUssRUFDRCxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7c0JBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO3NCQUMxRCxDQUFDO2dCQUNYLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssT0FBQTthQUNSLENBQUM7WUFDRixZQUFZLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcERTLGVBQWEsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxVQUFVO2dCQUNoQixFQUFFLEVBQUUsVUFBVTtnQkFDZCxPQUFPLEVBQUUsVUFBVTtnQkFDbkIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLEtBQUssRUFBRSxDQUFDO2dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSTthQUM5QyxDQUFDLENBQUM7WUFDSCxZQUFZLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUMzQkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1lBQ25ELElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLGlCQUFpQixDQUFDLFlBQVksRUFBRTtnQkFDeEU2QixZQUFVLENBQUMscUJBQXFCLENBQzVCN0IsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQzdCLGVBQWUsRUFDZixZQUFZLENBQ2YsQ0FBQzthQUNMO1lBQ0QsS0FBSyxHQUFHVCxZQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUU3QyxJQUFJLDBCQUEwQixDQUFDO1lBQy9CLElBQ0lTLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWTtnQkFDbkMsQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFDN0M7O2dCQUVFLElBQUksWUFBWSxDQUFDLEtBQUssSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDcEUsTUFBTSxDQUFDLElBQUksQ0FDUCw2QkFBMkIsWUFBWSxDQUFDLEtBQUssOEJBQXlCQSxlQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQixPQUFJLENBQ3pILENBQUM7b0JBQ0Ysd0JBQXdCLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkI7cUJBQU07b0JBQ0gsSUFBSSxPQUFPLEdBQUcsNkJBQTJCLFlBQVksQ0FBQyxLQUFLLGtDQUE2QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsT0FBSSxDQUFDO29CQUN6SSx1QkFBdUIsRUFBRSxDQUFDO29CQUMxQixJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFO3dCQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuQjt5QkFBTTt3QkFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuQjtpQkFDSjthQUNKO2lCQUFNLElBQ0gsQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUNwQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFDNUM7Z0JBQ0UsMEJBQTBCLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQzs7Z0JBRXRELElBQUksMEJBQTBCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2xELElBQUksT0FBTyxHQUFHLDREQUEwREEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsT0FBSSxDQUFDO29CQUMxSCx1QkFBdUIsRUFBRSxDQUFDO29CQUMxQixJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFO3dCQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuQjt5QkFBTTt3QkFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuQjtpQkFDSjtxQkFBTTtvQkFDSCxNQUFNLENBQUMsSUFBSSxDQUNQLHdEQUFzREEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsT0FBSSxDQUMxRyxDQUFDO29CQUNGLHdCQUF3QixFQUFFLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25CO2FBQ0o7aUJBQU0sSUFDSEEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUNuQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFDNUM7O2dCQUVFLDBCQUEwQixHQUFHLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3RELElBQ0ksWUFBWSxDQUFDLEtBQUssSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7b0JBQ2xFLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUNwRDtvQkFDRSxNQUFNLENBQUMsSUFBSSxDQUNQLDZCQUEyQixZQUFZLENBQUMsS0FBSyw4QkFBeUJBLGVBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLE9BQUksQ0FDekgsQ0FBQztvQkFDRixNQUFNLENBQUMsSUFBSSxDQUNQLHdEQUFzREEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsT0FBSSxDQUMxRyxDQUFDO29CQUNGLHdCQUF3QixFQUFFLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25CO3FCQUFNLElBQ0gsWUFBWSxDQUFDLEtBQUssSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7b0JBQ2xFLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNsRDtvQkFDRSxNQUFNLENBQUMsSUFBSSxDQUNQLDZCQUEyQixZQUFZLENBQUMsS0FBSyw4QkFBeUJBLGVBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLE9BQUksQ0FDekgsQ0FBQztvQkFDRixJQUFJLE9BQU8sR0FBRyw0REFBMERBLGVBQWEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLE9BQUksQ0FBQztvQkFDMUgsdUJBQXVCLEVBQUUsQ0FBQztvQkFDMUIsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTt3QkFDbEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbkI7eUJBQU07d0JBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbkI7aUJBQ0o7cUJBQU0sSUFDSCxZQUFZLENBQUMsS0FBSyxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQjtvQkFDakUsMEJBQTBCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2xEO29CQUNFLElBQUksYUFBYSxHQUFHLDZCQUEyQixZQUFZLENBQUMsS0FBSyxrQ0FBNkJBLGVBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLE9BQUksRUFDMUksY0FBYyxHQUFHLDREQUEwREEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsT0FBSSxDQUFDO29CQUNqSSx1QkFBdUIsRUFBRSxDQUFDO29CQUMxQixJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFO3dCQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUM1QixNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuQjt5QkFBTTt3QkFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuQjtpQkFDSjtxQkFBTTtvQkFDSCxJQUFJLE9BQU8sR0FBRyw2QkFBMkIsWUFBWSxDQUFDLEtBQUssa0NBQTZCQSxlQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQixPQUFJLEVBQ3BJLGNBQWMsR0FBRyx3REFBc0RBLGVBQWEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLE9BQUksQ0FBQztvQkFDN0gsdUJBQXVCLEVBQUUsQ0FBQztvQkFDMUIsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTt3QkFDbEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbkI7eUJBQU07d0JBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbkI7aUJBQ0o7YUFDSjtpQkFBTTtnQkFDSCxPQUFPLEVBQUUsQ0FBQzthQUNiO1NBQ0osQ0FBQyxDQUFDO0tBQ047SUFFTSw2Q0FBdUIsR0FBOUI7UUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDakQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CLElBQUksTUFBTSxFQUFFLFlBQVksQ0FBQztZQUV6QixJQUFJLFlBQVksR0FBaUJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBRXJFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7YUFDdEQ7aUJBQU07Z0JBQ0gsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDWixZQUFZLEdBQUdULFlBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFBLEVBQUU7b0JBQ3ZDLElBQUksUUFBUSxHQUFHTSxlQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHO3dCQUNmLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTt3QkFDYixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7d0JBQ3JCLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVzt3QkFDM0IsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO3FCQUNoQixDQUFDO29CQUNGLE9BQU8sUUFBUSxDQUFDO2lCQUNuQixDQUFDLENBQUM7YUFDTjs7WUFFRCxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7WUFDekIsSUFBSSxPQUFPLEdBQUdJLFlBQVUsQ0FBQyxPQUFPLENBQUNELGVBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMxRSxJQUFJLE9BQU8sRUFBRTtnQkFDVCxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN6QztpQkFBTTtnQkFDSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQzthQUNsRTtZQUNELElBQUksWUFBWSxHQUFHLFVBQVUsT0FBTyxFQUFFLFVBQVU7Z0JBQzVDLElBQUksTUFBTSxDQUFDO2dCQUNYLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtvQkFDbEIsTUFBTSxHQUFHLFdBQVcsQ0FBQztpQkFDeEI7cUJBQU0sSUFBSSxPQUFPLElBQUksRUFBRSxFQUFFO29CQUN0QixNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUNsQjtxQkFBTSxJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRTtvQkFDdEMsTUFBTSxHQUFHLFFBQVEsQ0FBQztpQkFDckI7cUJBQU0sSUFBSSxPQUFPLEdBQUcsRUFBRSxJQUFJLE9BQU8sSUFBSSxFQUFFLEVBQUU7b0JBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUM7aUJBQ25CO3FCQUFNO29CQUNILE1BQU0sR0FBRyxXQUFXLENBQUM7aUJBQ3hCO2dCQUNELE9BQU8sTUFBTSxDQUFDO2FBQ2pCLENBQUM7WUFDRixJQUFJLGVBQWUsR0FBRyxVQUFVLElBQUksRUFBRSxRQUFRO2dCQUMxQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFO29CQUN0QixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7O3dCQUV0QixHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztxQkFDaEQ7eUJBQU07d0JBQ0gsSUFBTSxTQUFTLEdBQUdULFlBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFVBQUEsRUFBRTs0QkFDdkMsSUFBTSxrQkFBa0IsR0FBR00sZUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN4RSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3lCQUNuRSxDQUFDLENBQUM7d0JBQ0gsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDdEIsR0FBRyxHQUFHTixZQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNwQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO3lCQUM5QjtxQkFDSjtpQkFDSjtnQkFDRCxJQUFJLFNBQVMsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNqRUEsWUFBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBQSxHQUFHO29CQUNwQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDWCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2xCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRzs0QkFDUCxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDOzRCQUNsQyxhQUFhLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLOzRCQUM3QyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQzt5QkFDdkMsQ0FBQztxQkFDTDtpQkFDSixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLENBQUM7YUFDZCxDQUFDO1lBRUYsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLEtBQUssSUFBSSxJQUFJLElBQUksZUFBZSxFQUFFO2dCQUM5QixJQUFJLEdBQUcsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7b0JBQ2xCLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQy9CO3FCQUFNO29CQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ25CO2FBQ0o7WUFDRCxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzlCLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLEtBQUssU0FBUyxDQUFDO1lBQ2hEUyxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7WUFDbkRBLGVBQWEsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxXQUFXO2dCQUNqQixFQUFFLEVBQUUsV0FBVztnQkFDZixPQUFPLEVBQUUsV0FBVztnQkFDcEIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLEtBQUssRUFBRSxDQUFDO2dCQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSTthQUM5QyxDQUFDLENBQUM7WUFFSCxJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksS0FBSyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3hFLElBQUksU0FBUyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pFVCxZQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFBLEdBQUc7b0JBQ3BCLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUM1QnNDLFlBQVUsQ0FBQyxxQkFBcUIsQ0FBQzdCLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTs0QkFDakUsS0FBSyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQzs0QkFDcEQsTUFBTSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7eUJBQy9DLENBQUMsQ0FBQztxQkFDTjtpQkFDSixDQUFDLENBQUM7YUFDTjtZQUNELE9BQU8sRUFBRSxDQUFDO1NBQ2IsQ0FBQyxDQUFDO0tBQ047SUFFTyxpQ0FBVyxHQUFuQixVQUFvQixJQUFJO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxJQUFJLFFBQVEsR0FBRzZCLFlBQVUsQ0FBQyxNQUFNLENBQUM3QixlQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksU0FBUyxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUU5QyxJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDdkQsU0FBUyxJQUFJLEdBQUcsQ0FBQztTQUNwQjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNYLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztTQUNoQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztTQUN4QzthQUFNO1lBQ0gsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtZQUN2QytCLGNBQVksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxJQUFJO2dCQUNYLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixHQUFHLEVBQUUsU0FBUzthQUNqQixDQUFDLENBQUM7U0FDTjtRQUVEOUIsWUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDNUI7SUFFTSxrQ0FBWSxHQUFuQjtRQUFBLGlCQW1DQztRQWxDRyxJQUFJLEtBQUssR0FBR1YsWUFBQyxDQUFDLE1BQU0sQ0FBQ1MsZUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFBLENBQUMsQ0FBQzthQUNqRCxJQUFJLENBQUM7WUFDRixJQUFJLHFDQUFxQyxHQUFHO2dCQUN4QyxJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNuRCxLQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztpQkFDakM7cUJBQU07b0JBQ0gsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEtBQUssRUFBRSxFQUFFO3dCQUM1QyxLQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztxQkFDOUI7b0JBQ0QsS0FBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7aUJBQzNCO2FBQ0osQ0FBQztZQUNGLElBQUksQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZDK0IsY0FBWSxDQUFDLHVCQUF1QixDQUFDL0IsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3BFO29CQUNJLHFDQUFxQyxFQUFFLENBQUM7aUJBQzNDLEVBQ0QsVUFBQSxDQUFDO29CQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25CLENBQ0osQ0FBQzthQUNMO2lCQUFNO2dCQUNILHFDQUFxQyxFQUFFLENBQUM7YUFDM0M7U0FDSixDQUFDO2FBQ0QsSUFBSSxDQUFDO1lBQ0YsT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbkQsQ0FBQyxDQUNELE9BQUssQ0FBQSxDQUFDLFVBQUEsQ0FBQztZQUNKLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkIsQ0FBQyxDQUFDO0tBQ1Y7SUFFTywwQ0FBb0IsR0FBNUIsVUFBNkIsT0FBTztRQUNoQyxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ2pDLEdBQUcsRUFBRSxTQUFTO1lBQ2QsUUFBUSxFQUFFLGdCQUFnQjtZQUMxQixPQUFPLEVBQUU7Z0JBQ0w7b0JBQ0ksbUJBQW1CO29CQUNuQjt3QkFDSSxPQUFPLEVBQUU7NEJBQ0wsRUFBRSxFQUFFLElBQUk7eUJBQ1g7cUJBQ0o7aUJBQ0o7YUFDSjtZQUNELE9BQU8sRUFBRTtnQkFDTDtvQkFDSSx3Q0FBd0M7b0JBQ3hDO3dCQUNJLEtBQUssRUFBRSxLQUFLO3FCQUNmO2lCQUNKO2FBQ0o7U0FDSixDQUFDLENBQUM7S0FDTjtJQUVPLGlDQUFXLEdBQW5CLFVBQW9CLFFBQVE7UUFBNUIsaUJBa0RDO1FBakRHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUvQixPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCO1lBQ3JELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsSUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQzVCLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0QsSUFBTSxZQUFZLEdBQU0sTUFBTSxtQkFBZ0IsQ0FBQztZQUMvQyxJQUFNLFlBQVksR0FBTSxNQUFNLHVCQUFvQixDQUFDO1lBRW5ENkIsWUFBVSxDQUFDLFVBQVUsQ0FBQzdCLGVBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztpQkFDNUQsSUFBSSxDQUFDLFVBQUEsUUFBUTtnQkFDVkMsWUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDO3FCQUNuQyxJQUFJLENBQUM7b0JBQ0YsS0FBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQzt5QkFDOUIsSUFBSSxDQUFDLFVBQUEsT0FBTzt3QkFDVEEsWUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQzs2QkFDdkMsSUFBSSxDQUFDOzRCQUNGLGtCQUFrQixFQUFFLENBQUM7eUJBQ3hCLENBQUMsQ0FDRCxPQUFLLENBQUEsQ0FBQyxVQUFBLEdBQUc7NEJBQ04sTUFBTSxDQUFDLEtBQUssQ0FDUixlQUFlLEdBQUcsWUFBWSxHQUFHLGtCQUFrQixDQUN0RCxDQUFDOzRCQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2xCLE9BQU8saUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7eUJBQ2hDLENBQUMsQ0FBQztxQkFDVixDQUFDLENBQ0QsT0FBSyxDQUFBLENBQUMsVUFBQSxHQUFHO3dCQUNOLE1BQU0sQ0FBQyxLQUFLLENBQ1IsZUFBZSxHQUFHLFlBQVksR0FBRyxrQkFBa0IsQ0FDdEQsQ0FBQzt3QkFDRixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNsQixPQUFPLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUNoQyxDQUFDLENBQUM7aUJBQ1YsQ0FBQyxDQUNELE9BQUssQ0FBQSxDQUFDLFVBQUEsR0FBRztvQkFDTixNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztvQkFDbEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEIsT0FBTyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDaEMsQ0FBQyxDQUFDO2FBQ1YsQ0FBQyxDQUNELE9BQUssQ0FBQSxDQUFDLFVBQUEsR0FBRztnQkFDTixNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNoQyxDQUFDLENBQUM7U0FDVixDQUFDLENBQUM7S0FDTjtJQUVNLDRDQUFzQixHQUE3QjtRQUFBLGlCQTJCQztRQTFCRyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDeEMsSUFBSSxLQUFLLEdBQUdELGVBQWEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQ1AsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUk7WUFDVixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDMUIsT0FBTyxPQUFPLENBQUMsR0FBRztvQkFDZCxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzswQkFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxTQUFTLElBQUksT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFBLENBQUMsVUFDaEUsQ0FBQzthQUNOO2lCQUFNO2dCQUNILE9BQU8sS0FBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQztTQUNKLENBQUMsQ0FDTDthQUNJLElBQUksQ0FBQztZQUNGK0IsY0FBWSxDQUFDLHVCQUF1QixDQUFDL0IsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JFLElBQUlBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLEVBQUUsRUFBRTtvQkFDNUMsS0FBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7aUJBQzlCO2dCQUNELEtBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQzNCLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FDRCxPQUFLLENBQUEsQ0FBQyxVQUFBLENBQUM7WUFDSixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QixDQUFDLENBQUM7S0FDVjtJQUVNLHlDQUFtQixHQUExQjtRQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUNDLFlBQVUsQ0FBQyxVQUFVLENBQUNELGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FDUiw0QkFBMEJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxtQkFBZ0IsQ0FDaEYsQ0FBQztTQUNMO2FBQU07WUFDSCxJQUFJLFdBQVcsR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFFaEQsSUFBSSxhQUFhLEdBQUdBLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzJCLEtBQUcsQ0FBQyxDQUFDO1lBRTdELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxXQUFXLEdBQUczQixlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMyQixLQUFHLEdBQUc5QixlQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzNFO1lBRUQsSUFBTSxXQUFXLEdBQUdBLGVBQUksQ0FBQyxJQUFJLENBQ3pCLFdBQVcsRUFDWEEsZUFBSSxDQUFDLFFBQVEsQ0FBQ0csZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FDckQsQ0FBQztZQUNGSixhQUFFLENBQUMsSUFBSSxDQUNIQyxlQUFJLENBQUMsT0FBTyxDQUFDRyxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUNqREgsZUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFDekIsVUFBQSxHQUFHO2dCQUNDLElBQUksR0FBRyxFQUFFO29CQUNMLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0osQ0FDSixDQUFDO1NBQ0w7S0FDSjtJQUVNLHNDQUFnQixHQUF2QjtRQUFBLGlCQWdJQztRQS9IRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFbkMsSUFBTSxVQUFVLEdBQUc7WUFDZixNQUFNLENBQUMsSUFBSSxDQUNQLDZCQUE2QjtnQkFDekJHLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTTtnQkFDN0IsTUFBTTtnQkFDTixLQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixpQkFBaUI7Z0JBQ2pCQSxlQUFhLENBQUMsUUFBUSxDQUFDLEtBQUs7Z0JBQzVCLFFBQVEsQ0FDZixDQUFDO1lBQ0YsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7Z0JBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQ1AsZ0NBQThCQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sbUJBQWNBLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxTQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLElBQU0sQ0FDNUksQ0FBQztnQkFDRixLQUFJLENBQUMsWUFBWSxDQUFDQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNILHdCQUF3QixFQUFFLENBQUM7Z0JBQzNCLEtBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN0QjtTQUNKLENBQUM7UUFFRixJQUFJLFdBQVcsR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFFaEQsSUFBSSxhQUFhLEdBQUdBLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzJCLEtBQUcsQ0FBQyxDQUFDO1FBRTdELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNDLFdBQVcsR0FBRzNCLGVBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQzJCLEtBQUcsR0FBRzlCLGVBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDM0U7UUFFREQsYUFBRSxDQUFDLElBQUksQ0FDSEMsZUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLENBQUMsRUFDOUNBLGVBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQ3pCLFVBQUEsU0FBUztZQUNMLElBQUksU0FBUyxFQUFFO2dCQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDM0Q7aUJBQU07Z0JBQ0gsSUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBQyxlQUFlLEVBQUUsY0FBYztvQkFDaEUsSUFBSUcsZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7d0JBQ2pDSixhQUFFLENBQUMsSUFBSSxDQUNIQyxlQUFJLENBQUMsT0FBTyxDQUFDOEIsS0FBRyxHQUFHOUIsZUFBSSxDQUFDLEdBQUcsR0FBR0csZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFDOURILGVBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxFQUN0QyxVQUFVLGNBQWM7NEJBQ3BCLElBQUksY0FBYyxFQUFFO2dDQUNoQixNQUFNLENBQUMsS0FBSyxDQUNSLDJDQUEyQyxFQUMzQyxjQUFjLENBQ2pCLENBQUM7Z0NBQ0YsY0FBYyxFQUFFLENBQUM7NkJBQ3BCO2lDQUFNO2dDQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQztnQ0FDckQsZUFBZSxFQUFFLENBQUM7NkJBQ3JCO3lCQUNKLENBQ0osQ0FBQztxQkFDTDt5QkFBTTt3QkFDSCxlQUFlLEVBQUUsQ0FBQztxQkFDckI7aUJBQ0osQ0FBQyxDQUFDO2dCQUVILElBQU0sb0JBQW9CLEdBQUcsSUFBSSxPQUFPLENBQ3BDLFVBQUMsb0JBQW9CLEVBQUUsbUJBQW1CO29CQUN0QyxJQUFJRyxlQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxFQUFFLEVBQUU7d0JBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQzt3QkFDdkNKLGFBQUUsQ0FBQyxJQUFJLENBQ0hDLGVBQUksQ0FBQyxPQUFPLENBQ1I4QixLQUFHLEdBQUc5QixlQUFJLENBQUMsR0FBRyxHQUFHRyxlQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FDeEQsRUFDREgsZUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUMsRUFDakQsVUFBQSxnQkFBZ0I7OzRCQUVaLElBQUksZ0JBQWdCLEVBQUU7Z0NBQ2xCLE1BQU0sQ0FBQyxLQUFLLENBQ1Isd0NBQXdDLEVBQ3hDLGdCQUFnQixDQUNuQixDQUFDO2dDQUNGLG1CQUFtQixFQUFFLENBQUM7NkJBQ3pCO2lDQUFNO2dDQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztnQ0FDdEQsb0JBQW9CLEVBQUUsQ0FBQzs2QkFDMUI7eUJBQ0osQ0FDSixDQUFDO3FCQUNMO3lCQUFNO3dCQUNILG9CQUFvQixFQUFFLENBQUM7cUJBQzFCO2lCQUNKLENBQ0osQ0FBQztnQkFFRixJQUFNLGlCQUFpQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCO29CQUN0RSxJQUFJRyxlQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxFQUFFLEVBQUU7d0JBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQzt3QkFDcENKLGFBQUUsQ0FBQyxJQUFJLENBQ0hDLGVBQUksQ0FBQyxPQUFPLENBQUM4QixLQUFHLEdBQUc5QixlQUFJLENBQUMsR0FBRyxHQUFHRyxlQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUNoRUgsZUFBSSxDQUFDLE9BQU8sQ0FDUixXQUFXOzRCQUNQLFVBQVU7NEJBQ1ZHLGVBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FDekQsRUFDRCxVQUFBLGFBQWE7OzRCQUVULElBQUksYUFBYSxFQUFFO2dDQUNmLE1BQU0sQ0FBQyxLQUFLLENBQ1IscUNBQXFDLEVBQ3JDLGFBQWEsQ0FDaEIsQ0FBQztnQ0FDRixnQkFBZ0IsRUFBRSxDQUFDOzZCQUN0QjtpQ0FBTTtnQ0FDSCxNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7Z0NBQ25ELGlCQUFpQixFQUFFLENBQUM7NkJBQ3ZCO3lCQUNKLENBQ0osQ0FBQztxQkFDTDt5QkFBTTt3QkFDSCxpQkFBaUIsRUFBRSxDQUFDO3FCQUN2QjtpQkFDSixDQUFDLENBQUM7Z0JBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUN4RTtvQkFDSSxVQUFVLEVBQUUsQ0FBQztpQkFDaEIsQ0FDSixDQUFDO2FBQ0w7U0FDSixDQUNKLENBQUM7S0FDTDs7Ozs7O0lBT08sb0NBQWMsR0FBdEI7UUFDSSxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDO0tBQzlEO0lBRU0sbUNBQWEsR0FBcEI7UUFBQSxpQkFnR0M7UUEvRkcsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN2QjthQUFNO1lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2xDLElBQUksU0FBTyxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUM3QyxJQUFJLEdBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEtBQUcsR0FBRyxTQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3pCLElBQUksTUFBSSxHQUFHO2dCQUNQLElBQUksR0FBQyxJQUFJLEtBQUcsR0FBRyxDQUFDLEVBQUU7b0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxTQUFPLENBQUMsR0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RELElBQUksV0FBUyxHQUFHQSxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDOUMsSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUN2RCxXQUFTLElBQUksR0FBRyxDQUFDO3FCQUNwQjtvQkFDRCxXQUFTLElBQUksVUFBVSxHQUFHLFNBQU8sQ0FBQyxHQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQzFDLElBQUksVUFBVSxHQUFHRSxvQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBTyxDQUFDLEdBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsRSxJQUNJLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ2xDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQy9CLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQzdCLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQzdCLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDakM7d0JBQ0U4QixXQUFTLENBQUMsV0FBVyxDQUNqQixTQUFPLENBQUMsR0FBQyxDQUFDLENBQUMsSUFBSSxFQUNmLFdBQVMsRUFDVCxHQUFHLEVBQ0gsU0FBTyxDQUFDLEdBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbEIsQ0FBQyxJQUFJLENBQ0Y7NEJBQ0lBLFdBQVMsQ0FBQyxTQUFTLENBQ2ZuQyxlQUFJLENBQUMsT0FBTyxDQUFDLFdBQVMsR0FBR0EsZUFBSSxDQUFDLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxFQUN2RCxTQUFPLENBQUMsR0FBQyxDQUFDLENBQUMsSUFBSSxDQUNsQixDQUFDLElBQUksQ0FDRixVQUFBLElBQUk7Z0NBQ0EsU0FBTyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0NBQ3hCLEdBQUMsRUFBRSxDQUFDO2dDQUNKLE1BQUksRUFBRSxDQUFDOzZCQUNWLEVBQ0QsVUFBQSxHQUFHO2dDQUNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxDQUFDLENBQUM7NkJBQ2xELENBQ0osQ0FBQzt5QkFDTCxFQUNELFVBQUEsWUFBWTs0QkFDUixNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO3lCQUM5QixDQUNKLENBQUM7cUJBQ0w7eUJBQU07d0JBQ0gsR0FBQyxFQUFFLENBQUM7d0JBQ0osTUFBSSxFQUFFLENBQUM7cUJBQ1Y7aUJBQ0o7cUJBQU07b0JBQ0gsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUN2QjthQUNKLENBQUM7WUFDRixJQUFJLG9CQUFrQixHQUFHRyxlQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN2RCxJQUFJLG9CQUFrQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDNUMsb0JBQWtCLElBQUksR0FBRyxDQUFDO2FBQzdCO1lBQ0Qsb0JBQWtCLElBQUksT0FBTyxDQUFDO1lBQzlCZ0MsV0FBUyxDQUFDLElBQUksQ0FBQ25DLGVBQUksQ0FBQyxPQUFPLENBQUMsb0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBRWpEbUMsV0FBUyxDQUFDLFdBQVcsQ0FDakJoQyxlQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFDL0JILGVBQUksQ0FBQyxPQUFPLENBQUMsb0JBQWtCLENBQUMsRUFDaEMsR0FBRyxDQUNOLENBQUMsSUFBSSxDQUNGO2dCQUNJbUMsV0FBUyxDQUFDLFNBQVMsQ0FDZm5DLGVBQUksQ0FBQyxPQUFPLENBQUMsb0JBQWtCLEdBQUdBLGVBQUksQ0FBQyxHQUFHLEdBQUcsa0JBQWtCLENBQUMsRUFDaEUsWUFBWSxDQUNmLENBQUMsSUFBSSxDQUNGLFVBQUEsSUFBSTtvQkFDQUcsZUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN4QyxNQUFJLEVBQUUsQ0FBQztpQkFDVixFQUNELFVBQUEsR0FBRztvQkFDQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN4REEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7b0JBQy9DLE1BQUksRUFBRSxDQUFDO2lCQUNWLENBQ0osQ0FBQzthQUNMLEVBQ0QsVUFBQSxHQUFHO2dCQUNDLE1BQU0sQ0FBQyxLQUFLLENBQ1IsMkZBQTJGLEVBQzNGLEdBQUcsQ0FDTixDQUFDO2dCQUNGQSxlQUFhLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDL0MsTUFBSSxFQUFFLENBQUM7YUFDVixDQUNKLENBQUM7U0FDTDtLQUNKO0lBRU0sa0NBQVksR0FBbkIsVUFBb0IsTUFBTTtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNsQixJQUFJLHVCQUF1QixHQUE0QjtnQkFDbkQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFQSxlQUFhLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJO2dCQUNYLFFBQVEsRUFBRSxDQUFDO2dCQUNYLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2FBQ3BDLENBQUM7WUFDRixJQUFJQSxlQUFhLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUU7Z0JBQ3BDLHVCQUF1QixDQUFDLElBQUksR0FBR0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDOUQ7WUFDRGlDLHFCQUFVLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDN0M7UUFDRCxJQUFJakMsZUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xELElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtnQkFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2dCQUMvRCx1QkFBdUIsRUFBRSxDQUFDO2dCQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25CO2lCQUFNO2dCQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNuQjtTQUNKO2FBQU0sSUFBSUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN4RCxJQUFJLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBK0IsU0FBUyxZQUFTLENBQUMsQ0FBQztTQUNsRTtLQUNKO0lBRU0sOEJBQVEsR0FBZjtRQUFBLGlCQXFGQztRQXBGRyxJQUFJLE9BQU8sR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUV2QixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF1QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVMsQ0FBQyxDQUFDO1FBRTlFLElBQUk0QixnQkFBYyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDbkMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUNBLGdCQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSTVCLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQ0EsZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM3RDs7UUFHRCxPQUFPLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDbEMsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixhQUFhLEVBQUUsSUFBSTtZQUNuQixPQUFPLEVBQUUsZ0JBQWdCO1NBQzVCLENBQUMsQ0FBQztRQUNILElBQUksb0JBQW9CLENBQUM7UUFDekIsSUFBSSxjQUFjLENBQUM7UUFDbkIsSUFBSSxrQkFBa0IsR0FBRztZQUNyQixTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixLQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkIsQ0FBQztRQUNGLElBQUksa0JBQWtCLEdBQUc7WUFDckIsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbkMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQy9ELENBQUM7UUFDRixJQUFJLFlBQVksR0FBRztZQUNmLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUksQ0FBQyxlQUFlLENBQUMsS0FBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDN0MsSUFBSSxLQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRTtnQkFDL0IsS0FBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxLQUFJLENBQUMsZ0NBQWdDLEVBQUUsRUFBRTtnQkFDaEQsS0FBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7YUFDL0I7aUJBQU07Z0JBQ0gsS0FBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7YUFDdkM7U0FDSixDQUFDO1FBQ0YsSUFBSSxZQUFZLEdBQUc7WUFDZixZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0IsY0FBYyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkQsQ0FBQztRQUVGLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2YsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDcEIsT0FBTztxQkFDRixFQUFFLENBQUMsS0FBSyxFQUFFLFVBQUEsSUFBSTtvQkFDWCxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVEsSUFBSSxvQkFBaUIsQ0FBQyxDQUFDOzs7b0JBRzVDLElBQUlILGVBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO3dCQUM5QixrQkFBa0IsRUFBRSxDQUFDO3FCQUN4QjtpQkFDSixDQUFDO3FCQUNELEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxJQUFJO29CQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBUSxJQUFJLHNCQUFtQixDQUFDLENBQUM7OztvQkFHOUMsSUFDSUEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLO3dCQUM1QkEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLO3dCQUM1QkEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLEVBQ2hDO3dCQUNFLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUNBLGVBQUksQ0FBQyxJQUFJLENBQUM4QixLQUFHLEdBQUc5QixlQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzlELFlBQVksRUFBRSxDQUFDO3FCQUNsQjtpQkFDSixDQUFDO3FCQUNELEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxJQUFJO29CQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBUSxJQUFJLHNCQUFtQixDQUFDLENBQUM7OztvQkFHOUMsSUFBSUEsZUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7d0JBQzlCLGtCQUFrQixFQUFFLENBQUM7cUJBQ3hCO2lCQUNKLENBQUMsQ0FBQzthQUNWO1NBQ0osQ0FBQyxDQUFDO0tBQ047SUFLRCxzQkFBSSxvQ0FBVzs7OzthQUFmO1lBQ0ksT0FBTyxJQUFJLENBQUM7U0FDZjs7O09BQUE7SUFFRCxzQkFBSSw4QkFBSzthQUFUO1lBQ0ksT0FBTyxLQUFLLENBQUM7U0FDaEI7OztPQUFBO0lBQ0wsa0JBQUM7QUFBRCxDQUFDOztBQzE3RkQsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRTdCO0lBQUE7UUFHWSxlQUFVLEdBQUcsRUFBRSxDQUFDO0tBMkUzQjtJQXpFVSx5QkFBSSxHQUFYLFVBQVksT0FBaUIsRUFBRSxHQUFXO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFekIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsVUFBVSwwQ0FBTyxJQUFJLENBQUMsVUFBVSxrQkFBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBQyxDQUFDO1NBQ3hGO0tBQ0o7SUFFTSwwQ0FBcUIsR0FBNUI7UUFDSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLE1BQU0sR0FBRztZQUNULE1BQU0sRUFBRSxJQUFJO1lBQ1osS0FBSyxFQUFFLENBQUM7U0FDWCxDQUFDO1FBQ0YsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQixJQUFJLFdBQVcsR0FBR0EsZUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHQSxlQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUN2QyxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNsRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFO29CQUN0QixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztpQkFDeEI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDakI7SUFFTSw4QkFBUyxHQUFoQixVQUFpQixHQUFHLEVBQUUsS0FBSztRQUN2QixJQUFJLElBQUksR0FBRyxHQUFHLEVBQ1YsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxLQUFLLENBQUM7U0FDcEI7UUFDRCxJQUFJLEdBQUdBLGVBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFTSw2QkFBUSxHQUFmLFVBQWdCLElBQVk7UUFBNUIsaUJBK0JDO1FBOUJHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ1ZBLGVBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1FBQ3ZDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBR0EsZUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMzRCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSUEsZUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDbkIsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHQSxlQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ2hGO1FBRUQsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDN0QsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFBLE9BQU87b0JBQ3BELElBQUksV0FBVyxHQUFHQSxlQUFJLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxJQUFJLEdBQUdBLGVBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQzlELElBQUksZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsSUFBSSxHQUFHQSxlQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQ3ZDLElBQUksTUFBTSxDQUFDLElBQUksR0FBR0EsZUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFDaEMsR0FBRyxDQUNOLENBQUM7b0JBQ0YsT0FBTyxnQkFBZ0IsS0FBSyxhQUFhLENBQUM7aUJBQzdDLENBQUMsQ0FBQztnQkFDSCxNQUFNLEdBQUcsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDcEM7aUJBQU07Z0JBQ0gsTUFBTSxHQUFHLGFBQWEsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsTUFBTTthQUNUO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUNMLGlCQUFDO0FBQUQsQ0FBQzs7QUMvREQsSUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNsQyxJQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN2QyxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFckMsSUFBTSxxQkFBcUIsR0FBRyxVQUFVLENBQUM7QUFFekMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksWUFBWSxDQUFDO0FBQ2pCLElBQUksWUFBWSxDQUFDO0FBQ2pCLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUV4QixPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVTLGtDQUFXO0lBQS9DOztLQTQ0QkM7Ozs7SUF4NEJhLDhCQUFLLEdBQWY7UUFBQSxpQkF1NEJDO1FBdDRCRyxTQUFTLElBQUksQ0FBQyxHQUFHO1lBQ2IsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsT0FBTzthQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO2FBQ3BCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQzthQUN4QixNQUFNLENBQ0gsdUJBQXVCLEVBQ3ZCLDZHQUE2RyxDQUNoSDthQUNBLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxzQkFBc0IsQ0FBQzthQUN6RCxNQUFNLENBQ0gsdUJBQXVCLEVBQ3ZCLDRDQUE0QyxFQUM1QyxpQkFBaUIsQ0FBQyxNQUFNLENBQzNCO2FBQ0EsTUFBTSxDQUFDLHVCQUF1QixFQUFFLDZCQUE2QixDQUFDO2FBQzlELE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7YUFDM0UsTUFBTSxDQUNILDZCQUE2QixFQUM3QixrRUFBa0UsQ0FDckU7YUFDQSxNQUFNLENBQUMsb0JBQW9CLEVBQUUsa0NBQWtDLENBQUM7YUFDaEUsTUFBTSxDQUNILGNBQWMsRUFDZCwyREFBMkQsRUFDM0QsS0FBSyxDQUNSO2FBQ0EsTUFBTSxDQUNILGFBQWEsRUFDYixnRUFBZ0UsRUFDaEUsS0FBSyxDQUNSO2FBQ0EsTUFBTSxDQUFDLGVBQWUsRUFBRSw2QkFBNkIsQ0FBQzthQUN0RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDO2FBQ2xGLE1BQU0sQ0FDSCxhQUFhLEVBQ2IsZ0VBQWdFLEVBQ2hFLEtBQUssQ0FDUjthQUNBLE1BQU0sQ0FDSCw2QkFBNkIsRUFDN0IseUNBQXlDLEVBQ3pDLGlCQUFpQixDQUFDLFlBQVksQ0FDakM7YUFDQSxNQUFNLENBQUMsaUJBQWlCLEVBQUUseURBQXlELENBQUM7YUFDcEYsTUFBTSxDQUNILHVCQUF1QixFQUN2QixrSkFBa0osRUFDbEosaUJBQWlCLENBQUMsUUFBUSxDQUM3QjthQUNBLE1BQU0sQ0FDSCxpQkFBaUIsRUFDakIsNEhBQTRILENBQy9IO2FBQ0EsTUFBTSxDQUNILGlCQUFpQixFQUNqQiwwREFBMEQsRUFDMUQsS0FBSyxDQUNSO2FBQ0EsTUFBTSxDQUNILHNCQUFzQixFQUN0QiwyRUFBMkUsRUFDM0UsS0FBSyxDQUNSO2FBQ0EsTUFBTSxDQUNILDJCQUEyQixFQUMzQiwyT0FBMk8sRUFDM08sSUFBSSxFQUNKLGlCQUFpQixDQUFDLGVBQWUsQ0FDcEM7YUFDQSxNQUFNLENBQ0gsOEJBQThCLEVBQzlCLDRVQUcwRCxFQUMxRCxJQUFJLEVBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FDakQ7YUFDQSxNQUFNLENBQ0gsc0JBQXNCLEVBQ3RCLDBFQUEwRSxDQUM3RTthQUNBLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSw0Q0FBNEMsQ0FBQzthQUN6RSxNQUFNLENBQ0gsdUJBQXVCLEVBQ3ZCLCtDQUErQyxFQUMvQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FDeEM7YUFDQSxNQUFNLENBQ0gsNEJBQTRCLEVBQzVCLHNFQUFzRSxDQUN6RTthQUNBLE1BQU0sQ0FDSCxvQ0FBb0MsRUFDcEMsNEVBQTRFLENBQy9FO2FBQ0EsTUFBTSxDQUNILDBDQUEwQyxFQUMxQywrSEFBK0gsRUFDL0gsaUJBQWlCLENBQUMseUJBQXlCLENBQzlDO2FBQ0EsTUFBTSxDQUFDLDhCQUE4QixFQUFFLCtDQUErQyxDQUFDO2FBQ3ZGLE1BQU0sQ0FDSCxtQ0FBbUMsRUFDbkMsNEVBQTRFLENBQy9FO2FBQ0EsTUFBTSxDQUNILHFCQUFxQixFQUNyQixxREFBcUQsRUFDckQsS0FBSyxDQUNSO2FBQ0EsTUFBTSxDQUFDLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLEtBQUssQ0FBQzthQUM1RCxNQUFNLENBQUMsc0JBQXNCLEVBQUUseUJBQXlCLEVBQUUsS0FBSyxDQUFDO2FBQ2hFLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLENBQUM7YUFDMUQsTUFBTSxDQUFDLGdCQUFnQixFQUFFLGlDQUFpQyxFQUFFLEtBQUssQ0FBQzthQUNsRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsOENBQThDLEVBQUUsS0FBSyxDQUFDO2FBQ2xGLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxnREFBZ0QsRUFBRSxLQUFLLENBQUM7YUFDbkYsTUFBTSxDQUFDLG9CQUFvQixFQUFFLGtEQUFrRCxFQUFFLEtBQUssQ0FBQzthQUN2RixNQUFNLENBQUMsbUJBQW1CLEVBQUUsa0RBQWtELEVBQUUsS0FBSyxDQUFDO2FBQ3RGLE1BQU0sQ0FDSCx5QkFBeUIsRUFDekIsZ0VBQWdFLEVBQ2hFLEtBQUssQ0FDUjthQUNBLE1BQU0sQ0FDSCxzQkFBc0IsRUFDdEIsNkJBQTZCLEVBQzdCLGlCQUFpQixDQUFDLGtCQUFrQixDQUN2QzthQUNBLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw2QkFBNkIsRUFBRSxLQUFLLENBQUM7YUFDL0QsTUFBTSxDQUNILHVCQUF1QixFQUN2QixrQ0FBa0MsRUFDbEMsaUJBQWlCLENBQUMsbUJBQW1CLENBQ3hDO2FBQ0EsTUFBTSxDQUNILHFCQUFxQixFQUNyQixnQ0FBZ0MsRUFDaEMsaUJBQWlCLENBQUMsaUJBQWlCLENBQ3RDO2FBQ0EsTUFBTSxDQUNILFdBQVcsRUFDWCx5RUFBeUUsRUFDekUsS0FBSyxDQUNSO2FBQ0EsTUFBTSxDQUFDLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDO2FBQ3hELE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxtQkFBbUIsQ0FBQzthQUNsRCxNQUFNLENBQUMsYUFBYSxFQUFFLDhCQUE4QixDQUFDO2FBQ3JELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7YUFDakYsTUFBTSxDQUNILHVDQUF1QyxFQUN2Qyx1RUFBdUUsRUFDdkUsaUJBQWlCLENBQUMsZ0JBQWdCLENBQ3JDO2FBQ0EsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QixJQUFJLFVBQVUsR0FBRztZQUNiLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CLENBQUM7UUFFRixJQUFNLGNBQWMsR0FBR3FDLDJCQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUU5RCxJQUFJLG9CQUFvQixDQUFDO1FBRXpCLElBQUksVUFBVSxHQUErQixFQUFFLENBQUM7UUFFaEQsSUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXRDLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUN2QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzNDLElBQUksa0JBQWtCLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JELGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBR3JDLGVBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDekU7WUFDRCxvQkFBb0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDQSxlQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7U0FDNUU7YUFBTTtZQUNILG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNsRDtRQUVELElBQUksb0JBQW9CLEVBQUU7WUFDdEIsSUFBSSxPQUFPLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0JBQ3BELFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7YUFDNUM7U0FDSjtRQUVELElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNuQkcsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztTQUNyRDtRQUNELElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUM3RUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztTQUN6RDtRQUVELElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRTtZQUNyQkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN6RDtRQUNELElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRTtZQUN6QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztTQUM3RDtRQUVELElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRTtZQUNyQkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN6RDtRQUNELElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRTtZQUN6QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztTQUM3RDtRQUVELElBQUksVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNsQkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztTQUNuRDtRQUNELElBQUksY0FBYyxDQUFDLEtBQUssRUFBRTtZQUN0QkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQztTQUN2RDtRQUVELElBQUksVUFBVSxDQUFDLElBQUksRUFBRTtZQUNqQkEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsS0FBSyxFQUFFO1lBQ3hFQSxlQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7U0FDdEU7UUFFRCxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUU7WUFDekJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7U0FDakU7UUFDRCxJQUFJLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFDN0JBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7U0FDckU7UUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDakJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDakQ7UUFDRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUU7WUFDckJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7U0FDckQ7UUFFRCxJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUU7WUFDNUJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUM7U0FDdkU7UUFDRCxJQUNJLGNBQWMsQ0FBQyxlQUFlO1lBQzlCLGNBQWMsQ0FBQyxlQUFlLEtBQUssaUJBQWlCLENBQUMsZUFBZSxFQUN0RTtZQUNFQSxlQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO1NBQzNFO1FBRUQsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ3RCQSxlQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxjQUFjLENBQUMsU0FBUyxFQUFFO1lBQzFCQSxlQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1NBQy9EO1FBRUQsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFO1lBQ3pCQSxlQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1NBQ2pFO1FBQ0QsSUFDSSxjQUFjLENBQUMsWUFBWTtZQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEtBQUssaUJBQWlCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFDMUY7WUFDRUEsZUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDakY7UUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDckJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDekQ7UUFDRCxJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUU7WUFDekJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7U0FDN0Q7UUFFRCxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUU7WUFDekJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7U0FDakU7UUFDRCxJQUNJLGNBQWMsQ0FBQyxZQUFZO1lBQzNCLGNBQWMsQ0FBQyxZQUFZLEtBQUssaUJBQWlCLENBQUMsbUJBQW1CLEVBQ3ZFO1lBQ0VBLGVBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7U0FDckU7UUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDbkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDekI7UUFDRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDekI7UUFFRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUU7WUFDbEJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7U0FDbkQ7UUFDRCxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDdEJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7U0FDdkQ7UUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDakJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDOUNBLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDckQ7UUFDRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUU7WUFDckJBLGVBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDbERBLGVBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7U0FDekQ7UUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDakJBLGVBQWEsQ0FBQyxRQUFR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
|