UNPKG

237 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('lodash'), require('@angular/common/http'), require('core-js/fn/object'), require('rxjs'), require('rxjs/operators')) :
3 typeof define === 'function' && define.amd ? define('ngx-restangular', ['exports', '@angular/core', 'lodash', '@angular/common/http', 'core-js/fn/object', 'rxjs', 'rxjs/operators'], factory) :
4 (factory((global['ngx-restangular'] = {}),global.ng.core,null,global.ng.common.http,null,global.rxjs,global.rxjs.operators));
5}(this, (function (exports,core,lodash,http,object,rxjs,operators) { 'use strict';
6
7 /*! *****************************************************************************
8 Copyright (c) Microsoft Corporation. All rights reserved.
9 Licensed under the Apache License, Version 2.0 (the "License"); you may not use
10 this file except in compliance with the License. You may obtain a copy of the
11 License at http://www.apache.org/licenses/LICENSE-2.0
12
13 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
15 WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
16 MERCHANTABLITY OR NON-INFRINGEMENT.
17
18 See the Apache Version 2.0 License for specific language governing permissions
19 and limitations under the License.
20 ***************************************************************************** */
21 function __read(o, n) {
22 var m = typeof Symbol === "function" && o[Symbol.iterator];
23 if (!m)
24 return o;
25 var i = m.call(o), r, ar = [], e;
26 try {
27 while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
28 ar.push(r.value);
29 }
30 catch (error) {
31 e = { error: error };
32 }
33 finally {
34 try {
35 if (r && !r.done && (m = i["return"]))
36 m.call(i);
37 }
38 finally {
39 if (e)
40 throw e.error;
41 }
42 }
43 return ar;
44 }
45 function __spread() {
46 for (var ar = [], i = 0; i < arguments.length; i++)
47 ar = ar.concat(__read(arguments[i]));
48 return ar;
49 }
50
51 /**
52 * @fileoverview added by tsickle
53 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
54 */
55 /** @type {?} */
56 var RESTANGULAR = new core.InjectionToken('restangularWithConfig');
57 /**
58 * @param {?} __0
59 * @return {?}
60 */
61 function RestangularFactory(_a) {
62 var _b = __read(_a, 2), callbackOrServices = _b[0], callback = _b[1];
63 /** @type {?} */
64 var arrServices = [];
65 /** @type {?} */
66 var fn = callbackOrServices;
67 if (lodash.isArray(callbackOrServices)) {
68 arrServices = callbackOrServices;
69 fn = callback;
70 }
71 return { fn: fn, arrServices: arrServices };
72 }
73
74 /**
75 * @fileoverview added by tsickle
76 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
77 */
78 var RestangularHelper = /** @class */ (function () {
79 function RestangularHelper() {
80 }
81 /**
82 * @param {?} options
83 * @return {?}
84 */
85 RestangularHelper.createRequest = /**
86 * @param {?} options
87 * @return {?}
88 */
89 function (options) {
90 /** @type {?} */
91 var requestQueryParams = RestangularHelper.createRequestQueryParams(options.params);
92 /** @type {?} */
93 var requestHeaders = RestangularHelper.createRequestHeaders(options.headers);
94 /** @type {?} */
95 var methodName = options.method.toUpperCase();
96 /** @type {?} */
97 var withCredentials = options.withCredentials || false;
98 /** @type {?} */
99 var request = new http.HttpRequest(methodName, options.url, options.data, {
100 headers: requestHeaders,
101 params: requestQueryParams,
102 responseType: options.responseType,
103 withCredentials: withCredentials
104 });
105 if (['GET', 'DELETE', 'HEAD', 'JSONP', 'OPTIONS'].indexOf(methodName) >= 0) {
106 request = new http.HttpRequest(methodName, options.url, {
107 headers: requestHeaders,
108 params: requestQueryParams,
109 responseType: options.responseType,
110 withCredentials: withCredentials
111 });
112 }
113 return request;
114 };
115 /**
116 * @param {?} queryParams
117 * @return {?}
118 */
119 RestangularHelper.createRequestQueryParams = /**
120 * @param {?} queryParams
121 * @return {?}
122 */
123 function (queryParams) {
124 /** @type {?} */
125 var requestQueryParams = object.assign({}, queryParams);
126 /** @type {?} */
127 var search = new http.HttpParams();
128 var _loop_1 = function (key) {
129 /** @type {?} */
130 var value = requestQueryParams[key];
131 if (Array.isArray(value)) {
132 value.forEach(function (val) {
133 search = search.append(key, val);
134 });
135 }
136 else {
137 if (typeof value === 'object') {
138 value = JSON.stringify(value);
139 }
140 search = search.append(key, value);
141 }
142 };
143 for (var key in requestQueryParams) {
144 _loop_1(key);
145 }
146 return search;
147 };
148 /**
149 * @param {?} headers
150 * @return {?}
151 */
152 RestangularHelper.createRequestHeaders = /**
153 * @param {?} headers
154 * @return {?}
155 */
156 function (headers) {
157 for (var key in headers) {
158 /** @type {?} */
159 var value = headers[key];
160 if (typeof value === 'undefined') {
161 delete headers[key];
162 }
163 }
164 return new http.HttpHeaders(object.assign({}, headers));
165 };
166 return RestangularHelper;
167 }());
168
169 /**
170 * @fileoverview added by tsickle
171 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
172 */
173 var RestangularHttp = /** @class */ (function () {
174 function RestangularHttp(http$$1) {
175 this.http = http$$1;
176 }
177 /**
178 * @param {?} options
179 * @return {?}
180 */
181 RestangularHttp.prototype.createRequest = /**
182 * @param {?} options
183 * @return {?}
184 */
185 function (options) {
186 /** @type {?} */
187 var request = RestangularHelper.createRequest(options);
188 return this.request(request);
189 };
190 /**
191 * @param {?} request
192 * @return {?}
193 */
194 RestangularHttp.prototype.request = /**
195 * @param {?} request
196 * @return {?}
197 */
198 function (request) {
199 var _this = this;
200 return this.http.handle(request)
201 .pipe(operators.filter(function (event) { return event instanceof http.HttpResponse; }), operators.map(function (response) {
202 if (!response.ok) {
203 return rxjs.throwError(new http.HttpErrorResponse(response));
204 }
205 return response;
206 }), operators.map(function (response) {
207 response.config = { params: request };
208 return response;
209 }), operators.catchError(function (err) {
210 err.request = request;
211 err.data = err.error;
212 err.repeatRequest = function (newRequest) {
213 return _this.request(newRequest || request);
214 };
215 return rxjs.throwError(err);
216 }));
217 };
218 RestangularHttp.decorators = [
219 { type: core.Injectable },
220 ];
221 /** @nocollapse */
222 RestangularHttp.ctorParameters = function () {
223 return [
224 { type: http.HttpBackend }
225 ];
226 };
227 return RestangularHttp;
228 }());
229
230 /**
231 * @fileoverview added by tsickle
232 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
233 */
234 /**
235 * @param {?} object
236 * @param {?} configuration
237 * @return {?}
238 */
239 function RestangularConfigurer(object$$1, configuration) {
240 object$$1.configuration = configuration;
241 /**
242 * Those are HTTP safe methods for which there is no need to pass any data with the request.
243 * @type {?}
244 */
245 var safeMethods = ['get', 'head', 'options', 'trace', 'getlist'];
246 configuration.isSafe = function (operation) {
247 return lodash.includes(safeMethods, operation.toLowerCase());
248 };
249 /** @type {?} */
250 var absolutePattern = /^https?:\/\//i;
251 configuration.isAbsoluteUrl = function (string) {
252 return lodash.isUndefined(configuration.absoluteUrl) || lodash.isNull(configuration.absoluteUrl) ?
253 string && absolutePattern.test(string) :
254 configuration.absoluteUrl;
255 };
256 configuration.absoluteUrl = lodash.isUndefined(configuration.absoluteUrl) ? true : configuration.absoluteUrl;
257 object$$1.setSelfLinkAbsoluteUrl = function (value) {
258 configuration.absoluteUrl = value;
259 };
260 /**
261 * This is the BaseURL to be used with Restangular
262 */
263 configuration.baseUrl = lodash.isUndefined(configuration.baseUrl) ? '' : configuration.baseUrl;
264 object$$1.setBaseUrl = function (newBaseUrl) {
265 configuration.baseUrl = /\/$/.test(newBaseUrl) ?
266 newBaseUrl.substring(0, newBaseUrl.length - 1) :
267 newBaseUrl;
268 return this;
269 };
270 /**
271 * Sets the extra fields to keep from the parents
272 */
273 configuration.extraFields = configuration.extraFields || [];
274 object$$1.setExtraFields = function (newExtraFields) {
275 configuration.extraFields = newExtraFields;
276 return this;
277 };
278 /**
279 * Some default $http parameter to be used in EVERY call
280 **/
281 configuration.defaultHttpFields = configuration.defaultHttpFields || {};
282 object$$1.setDefaultHttpFields = function (values) {
283 configuration.defaultHttpFields = values;
284 return this;
285 };
286 /**
287 * Always return plain data, no restangularized object
288 **/
289 configuration.plainByDefault = configuration.plainByDefault || false;
290 object$$1.setPlainByDefault = function (value) {
291 configuration.plainByDefault = value === true ? true : false;
292 return this;
293 };
294 configuration.withHttpValues = function (httpLocalConfig, obj) {
295 return lodash.defaults(obj, httpLocalConfig, configuration.defaultHttpFields);
296 };
297 configuration.encodeIds = lodash.isUndefined(configuration.encodeIds) ? true : configuration.encodeIds;
298 object$$1.setEncodeIds = function (encode) {
299 configuration.encodeIds = encode;
300 };
301 configuration.defaultRequestParams = configuration.defaultRequestParams || {
302 get: {},
303 post: {},
304 put: {},
305 remove: {},
306 common: {}
307 };
308 object$$1.setDefaultRequestParams = function (param1, param2) {
309 /** @type {?} */
310 var methods = [];
311 /** @type {?} */
312 var params = param2 || param1;
313 if (!lodash.isUndefined(param2)) {
314 if (lodash.isArray(param1)) {
315 methods = param1;
316 }
317 else {
318 methods.push(param1);
319 }
320 }
321 else {
322 methods.push('common');
323 }
324 lodash.each(methods, function (method) {
325 configuration.defaultRequestParams[method] = params;
326 });
327 return this;
328 };
329 object$$1.requestParams = configuration.defaultRequestParams;
330 configuration.defaultHeaders = configuration.defaultHeaders || {};
331 object$$1.setDefaultHeaders = function (headers) {
332 configuration.defaultHeaders = headers;
333 object$$1.defaultHeaders = configuration.defaultHeaders;
334 return this;
335 };
336 object$$1.defaultHeaders = configuration.defaultHeaders;
337 /**
338 * Method overriders response Method
339 **/
340 configuration.defaultResponseMethod = configuration.defaultResponseMethod || 'promise';
341 object$$1.setDefaultResponseMethod = function (method) {
342 configuration.defaultResponseMethod = method;
343 object$$1.defaultResponseMethod = configuration.defaultResponseMethod;
344 return this;
345 };
346 object$$1.defaultResponseMethod = configuration.defaultResponseMethod;
347 /**
348 * Method overriders will set which methods are sent via POST with an X-HTTP-Method-Override
349 **/
350 configuration.methodOverriders = configuration.methodOverriders || [];
351 object$$1.setMethodOverriders = function (values) {
352 /** @type {?} */
353 var overriders = lodash.extend([], values);
354 if (configuration.isOverridenMethod('delete', overriders)) {
355 overriders.push('remove');
356 }
357 configuration.methodOverriders = overriders;
358 return this;
359 };
360 configuration.jsonp = lodash.isUndefined(configuration.jsonp) ? false : configuration.jsonp;
361 object$$1.setJsonp = function (active) {
362 configuration.jsonp = active;
363 };
364 configuration.isOverridenMethod = function (method, values) {
365 /** @type {?} */
366 var search = values || configuration.methodOverriders;
367 return !lodash.isUndefined(lodash.find(search, function (one) {
368 return one.toLowerCase() === method.toLowerCase();
369 }));
370 };
371 /**
372 * Sets the URL creator type. For now, only Path is created. In the future we'll have queryParams
373 **/
374 configuration.urlCreator = configuration.urlCreator || 'path';
375 object$$1.setUrlCreator = function (name) {
376 if (!lodash.has(configuration.urlCreatorFactory, name)) {
377 throw new Error('URL Path selected isn\'t valid');
378 }
379 configuration.urlCreator = name;
380 return this;
381 };
382 /**
383 * You can set the restangular fields here. The 3 required fields for Restangular are:
384 *
385 * id: Id of the element
386 * route: name of the route of this element
387 * parentResource: the reference to the parent resource
388 *
389 * All of this fields except for id, are handled (and created) by Restangular. By default,
390 * the field values will be id, route and parentResource respectively
391 */
392 configuration.restangularFields = configuration.restangularFields || {
393 id: 'id',
394 route: 'route',
395 parentResource: 'parentResource',
396 restangularCollection: 'restangularCollection',
397 cannonicalId: '__cannonicalId',
398 etag: 'restangularEtag',
399 selfLink: 'href',
400 get: 'get',
401 getList: 'getList',
402 put: 'put',
403 post: 'post',
404 remove: 'remove',
405 head: 'head',
406 trace: 'trace',
407 options: 'options',
408 patch: 'patch',
409 getRestangularUrl: 'getRestangularUrl',
410 getRequestedUrl: 'getRequestedUrl',
411 putElement: 'putElement',
412 addRestangularMethod: 'addRestangularMethod',
413 getParentList: 'getParentList',
414 clone: 'clone',
415 ids: 'ids',
416 httpConfig: '_$httpConfig',
417 reqParams: 'reqParams',
418 one: 'one',
419 all: 'all',
420 several: 'several',
421 oneUrl: 'oneUrl',
422 allUrl: 'allUrl',
423 customPUT: 'customPUT',
424 customPATCH: 'customPATCH',
425 customPOST: 'customPOST',
426 customDELETE: 'customDELETE',
427 customGET: 'customGET',
428 customGETLIST: 'customGETLIST',
429 customOperation: 'customOperation',
430 doPUT: 'doPUT',
431 doPATCH: 'doPATCH',
432 doPOST: 'doPOST',
433 doDELETE: 'doDELETE',
434 doGET: 'doGET',
435 doGETLIST: 'doGETLIST',
436 fromServer: 'fromServer',
437 withConfig: 'withConfig',
438 withHttpConfig: 'withHttpConfig',
439 singleOne: 'singleOne',
440 plain: 'plain',
441 save: 'save',
442 restangularized: 'restangularized'
443 };
444 object$$1.setRestangularFields = function (resFields) {
445 configuration.restangularFields =
446 lodash.extend({}, configuration.restangularFields, resFields);
447 return this;
448 };
449 configuration.isRestangularized = function (obj) {
450 return !!obj[configuration.restangularFields.restangularized];
451 };
452 configuration.setFieldToElem = function (field, elem, value) {
453 /** @type {?} */
454 var properties = field.split('.');
455 /** @type {?} */
456 var idValue = elem;
457 lodash.each(lodash.initial(properties), function (prop) {
458 idValue[prop] = {};
459 idValue = idValue[prop];
460 });
461 /** @type {?} */
462 var index = lodash.last(properties);
463 idValue[index] = value;
464 return this;
465 };
466 configuration.getFieldFromElem = function (field, elem) {
467 /** @type {?} */
468 var properties = field.split('.');
469 /** @type {?} */
470 var idValue = elem;
471 lodash.each(properties, function (prop) {
472 if (idValue) {
473 idValue = idValue[prop];
474 }
475 });
476 return lodash.clone(idValue);
477 };
478 configuration.setIdToElem = function (elem, id /*, route */) {
479 configuration.setFieldToElem(configuration.restangularFields.id, elem, id);
480 return this;
481 };
482 configuration.getIdFromElem = function (elem) {
483 return configuration.getFieldFromElem(configuration.restangularFields.id, elem);
484 };
485 configuration.isValidId = function (elemId) {
486 return '' !== elemId && !lodash.isUndefined(elemId) && !lodash.isNull(elemId);
487 };
488 configuration.setUrlToElem = function (elem, url /*, route */) {
489 configuration.setFieldToElem(configuration.restangularFields.selfLink, elem, url);
490 return this;
491 };
492 configuration.getUrlFromElem = function (elem) {
493 return configuration.getFieldFromElem(configuration.restangularFields.selfLink, elem);
494 };
495 configuration.useCannonicalId = lodash.isUndefined(configuration.useCannonicalId) ? false : configuration.useCannonicalId;
496 object$$1.setUseCannonicalId = function (value) {
497 configuration.useCannonicalId = value;
498 return this;
499 };
500 configuration.getCannonicalIdFromElem = function (elem) {
501 /** @type {?} */
502 var cannonicalId = elem[configuration.restangularFields.cannonicalId];
503 /** @type {?} */
504 var actualId = configuration.isValidId(cannonicalId) ? cannonicalId : configuration.getIdFromElem(elem);
505 return actualId;
506 };
507 /**
508 * Sets the Response parser. This is used in case your response isn't directly the data.
509 * For example if you have a response like {meta: {'meta'}, data: {name: 'Gonto'}}
510 * you can extract this data which is the one that needs wrapping
511 *
512 * The ResponseExtractor is a function that receives the response and the method executed.
513 */
514 configuration.responseInterceptors = configuration.responseInterceptors ? __spread(configuration.responseInterceptors) : [];
515 configuration.defaultResponseInterceptor = function (data /*, operation, what, url, response, subject */) {
516 return data || {};
517 };
518 configuration.responseExtractor = function (data, operation, what, url, response, subject) {
519 /** @type {?} */
520 var interceptors = lodash.clone(configuration.responseInterceptors);
521 interceptors.push(configuration.defaultResponseInterceptor);
522 /** @type {?} */
523 var theData = data;
524 lodash.each(interceptors, function (interceptor) {
525 theData = interceptor(theData, operation, what, url, response, subject);
526 });
527 return theData;
528 };
529 object$$1.addResponseInterceptor = function (extractor) {
530 configuration.responseInterceptors.push(extractor);
531 return this;
532 };
533 configuration.errorInterceptors = configuration.errorInterceptors ? __spread(configuration.errorInterceptors) : [];
534 object$$1.addErrorInterceptor = function (interceptor) {
535 configuration.errorInterceptors = __spread([interceptor], configuration.errorInterceptors);
536 return this;
537 };
538 object$$1.setResponseInterceptor = object$$1.addResponseInterceptor;
539 object$$1.setResponseExtractor = object$$1.addResponseInterceptor;
540 object$$1.setErrorInterceptor = object$$1.addErrorInterceptor;
541 /**
542 * Response interceptor is called just before resolving promises.
543 */
544 /**
545 * Request interceptor is called before sending an object to the server.
546 */
547 configuration.requestInterceptors = configuration.requestInterceptors ? __spread(configuration.requestInterceptors) : [];
548 configuration.defaultInterceptor = function (element, operation, path, url, headers, params, httpConfig) {
549 return {
550 element: element,
551 headers: headers,
552 params: params,
553 httpConfig: httpConfig
554 };
555 };
556 configuration.fullRequestInterceptor = function (element, operation, path, url, headers, params, httpConfig) {
557 /** @type {?} */
558 var interceptors = lodash.clone(configuration.requestInterceptors);
559 /** @type {?} */
560 var defaultRequest = configuration.defaultInterceptor(element, operation, path, url, headers, params, httpConfig);
561 return lodash.reduce(interceptors, function (request, interceptor) {
562 /** @type {?} */
563 var returnInterceptor = interceptor(request.element, operation, path, url, request.headers, request.params, request.httpConfig);
564 return lodash.extend(request, returnInterceptor);
565 }, defaultRequest);
566 };
567 object$$1.addRequestInterceptor = function (interceptor) {
568 configuration.requestInterceptors.push(function (elem, operation, path, url, headers, params, httpConfig) {
569 return {
570 headers: headers,
571 params: params,
572 element: interceptor(elem, operation, path, url),
573 httpConfig: httpConfig
574 };
575 });
576 return this;
577 };
578 object$$1.setRequestInterceptor = object$$1.addRequestInterceptor;
579 object$$1.addFullRequestInterceptor = function (interceptor) {
580 configuration.requestInterceptors.push(interceptor);
581 return this;
582 };
583 object$$1.setFullRequestInterceptor = object$$1.addFullRequestInterceptor;
584 configuration.onBeforeElemRestangularized = configuration.onBeforeElemRestangularized || function (elem) {
585 return elem;
586 };
587 object$$1.setOnBeforeElemRestangularized = function (post) {
588 configuration.onBeforeElemRestangularized = post;
589 return this;
590 };
591 object$$1.setRestangularizePromiseInterceptor = function (interceptor) {
592 configuration.restangularizePromiseInterceptor = interceptor;
593 return this;
594 };
595 /**
596 * This method is called after an element has been "Restangularized".
597 *
598 * It receives the element, a boolean indicating if it's an element or a collection
599 * and the name of the model
600 *
601 */
602 configuration.onElemRestangularized = configuration.onElemRestangularized || function (elem) {
603 return elem;
604 };
605 object$$1.setOnElemRestangularized = function (post) {
606 configuration.onElemRestangularized = post;
607 return this;
608 };
609 configuration.shouldSaveParent = configuration.shouldSaveParent || function () {
610 return true;
611 };
612 object$$1.setParentless = function (values) {
613 if (lodash.isArray(values)) {
614 configuration.shouldSaveParent = function (route) {
615 return !lodash.includes(values, route);
616 };
617 }
618 else if (lodash.isBoolean(values)) {
619 configuration.shouldSaveParent = function () {
620 return !values;
621 };
622 }
623 return this;
624 };
625 /**
626 * This lets you set a suffix to every request.
627 *
628 * For example, if your api requires that for JSon requests you do /users/123.json, you can set that
629 * in here.
630 *
631 *
632 * By default, the suffix is null
633 */
634 configuration.suffix = lodash.isUndefined(configuration.suffix) ? null : configuration.suffix;
635 object$$1.setRequestSuffix = function (newSuffix) {
636 configuration.suffix = newSuffix;
637 return this;
638 };
639 /**
640 * Add element transformers for certain routes.
641 */
642 configuration.transformers = configuration.transformers || {};
643 object$$1.addElementTransformer = function (type, secondArg, thirdArg) {
644 /** @type {?} */
645 var isCollection = null;
646 /** @type {?} */
647 var transformer = null;
648 if (arguments.length === 2) {
649 transformer = secondArg;
650 }
651 else {
652 transformer = thirdArg;
653 isCollection = secondArg;
654 }
655 /** @type {?} */
656 var typeTransformers = configuration.transformers[type];
657 if (!typeTransformers) {
658 typeTransformers = configuration.transformers[type] = [];
659 }
660 typeTransformers.push(function (coll, elem) {
661 if (lodash.isNull(isCollection) || (coll === isCollection)) {
662 return transformer(elem);
663 }
664 return elem;
665 });
666 return object$$1;
667 };
668 object$$1.extendCollection = function (route, fn) {
669 return object$$1.addElementTransformer(route, true, fn);
670 };
671 object$$1.extendModel = function (route, fn) {
672 return object$$1.addElementTransformer(route, false, fn);
673 };
674 configuration.transformElem = function (elem, isCollection, route, Restangular, force) {
675 if (!force && !configuration.transformLocalElements && !elem[configuration.restangularFields.fromServer]) {
676 return elem;
677 }
678 /** @type {?} */
679 var typeTransformers = configuration.transformers[route];
680 /** @type {?} */
681 var changedElem = elem;
682 if (typeTransformers) {
683 lodash.each(typeTransformers, function (transformer) {
684 changedElem = transformer(isCollection, changedElem);
685 });
686 }
687 return configuration.onElemRestangularized(changedElem, isCollection, route, Restangular);
688 };
689 configuration.transformLocalElements = lodash.isUndefined(configuration.transformLocalElements) ?
690 false :
691 configuration.transformLocalElements;
692 object$$1.setTransformOnlyServerElements = function (active) {
693 configuration.transformLocalElements = !active;
694 };
695 configuration.fullResponse = lodash.isUndefined(configuration.fullResponse) ? false : configuration.fullResponse;
696 object$$1.setFullResponse = function (full) {
697 configuration.fullResponse = full;
698 return this;
699 };
700 // Internal values and functions
701 configuration.urlCreatorFactory = {};
702 /**
703 * Base URL Creator. Base prototype for everything related to it
704 *
705 * @type {?}
706 */
707 var BaseCreator = function () {
708 };
709 BaseCreator.prototype.setConfig = function (config) {
710 this.config = config;
711 return this;
712 };
713 BaseCreator.prototype.parentsArray = function (current) {
714 /** @type {?} */
715 var parents = [];
716 while (current) {
717 parents.push(current);
718 current = current[this.config.restangularFields.parentResource];
719 }
720 return parents.reverse();
721 };
722 /**
723 * @param {?} config
724 * @param {?} $http
725 * @param {?} url
726 * @param {?} configurer
727 * @return {?}
728 */
729 function RestangularResource(config, $http, url, configurer) {
730 /** @type {?} */
731 var resource = {};
732 lodash.each(lodash.keys(configurer), function (key) {
733 /** @type {?} */
734 var value = configurer[key];
735 // Add default parameters
736 value.params = lodash.extend({}, value.params, config.defaultRequestParams[value.method.toLowerCase()]);
737 // We don't want the ? if no params are there
738 if (lodash.isEmpty(value.params)) {
739 delete value.params;
740 }
741 if (config.isSafe(value.method)) {
742 resource[key] = function () {
743 /** @type {?} */
744 var resultConfig = lodash.extend(value, {
745 url: url
746 });
747 return $http.createRequest(resultConfig);
748 };
749 }
750 else {
751 resource[key] = function (data) {
752 /** @type {?} */
753 var resultConfig = lodash.extend(value, {
754 url: url,
755 data: data
756 });
757 return $http.createRequest(resultConfig);
758 };
759 }
760 });
761 return resource;
762 }
763 BaseCreator.prototype.resource = function (current, $http, localHttpConfig, callHeaders, callParams, what, etag, operation) {
764 /** @type {?} */
765 var params = lodash.defaults(callParams || {}, this.config.defaultRequestParams.common);
766 /** @type {?} */
767 var headers = lodash.defaults(callHeaders || {}, this.config.defaultHeaders);
768 if (etag) {
769 if (!configuration.isSafe(operation)) {
770 headers['If-Match'] = etag;
771 }
772 else {
773 headers['If-None-Match'] = etag;
774 }
775 }
776 /** @type {?} */
777 var url = this.base(current);
778 if (what) {
779 /** @type {?} */
780 var add = '';
781 if (!/\/$/.test(url)) {
782 add += '/';
783 }
784 add += what;
785 url += add;
786 }
787 if (this.config.suffix &&
788 url.indexOf(this.config.suffix, url.length - this.config.suffix.length) === -1 && !this.config.getUrlFromElem(current)) {
789 url += this.config.suffix;
790 }
791 current[this.config.restangularFields.httpConfig] = undefined;
792 return RestangularResource(this.config, $http, url, {
793 getList: this.config.withHttpValues(localHttpConfig, {
794 method: 'GET',
795 params: params,
796 headers: headers
797 }),
798 get: this.config.withHttpValues(localHttpConfig, {
799 method: 'GET',
800 params: params,
801 headers: headers
802 }),
803 jsonp: this.config.withHttpValues(localHttpConfig, {
804 method: 'jsonp',
805 params: params,
806 headers: headers
807 }),
808 put: this.config.withHttpValues(localHttpConfig, {
809 method: 'PUT',
810 params: params,
811 headers: headers
812 }),
813 post: this.config.withHttpValues(localHttpConfig, {
814 method: 'POST',
815 params: params,
816 headers: headers
817 }),
818 remove: this.config.withHttpValues(localHttpConfig, {
819 method: 'DELETE',
820 params: params,
821 headers: headers
822 }),
823 head: this.config.withHttpValues(localHttpConfig, {
824 method: 'HEAD',
825 params: params,
826 headers: headers
827 }),
828 trace: this.config.withHttpValues(localHttpConfig, {
829 method: 'TRACE',
830 params: params,
831 headers: headers
832 }),
833 options: this.config.withHttpValues(localHttpConfig, {
834 method: 'OPTIONS',
835 params: params,
836 headers: headers
837 }),
838 patch: this.config.withHttpValues(localHttpConfig, {
839 method: 'PATCH',
840 params: params,
841 headers: headers
842 })
843 });
844 };
845 /**
846 * This is the Path URL creator. It uses Path to show Hierarchy in the Rest API.
847 * This means that if you have an Account that then has a set of Buildings, a URL to a building
848 * would be /accounts/123/buildings/456
849 *
850 * @type {?}
851 */
852 var Path = function () {
853 };
854 Path.prototype = new BaseCreator();
855 Path.prototype.normalizeUrl = function (url) {
856 /** @type {?} */
857 var parts = /((?:http[s]?:)?\/\/)?(.*)?/.exec(url);
858 parts[2] = parts[2].replace(/[\\\/]+/g, '/');
859 return (typeof parts[1] !== 'undefined') ? parts[1] + parts[2] : parts[2];
860 };
861 Path.prototype.base = function (current) {
862 /** @type {?} */
863 var __this = this;
864 return lodash.reduce(this.parentsArray(current), function (acum, elem) {
865 /** @type {?} */
866 var elemUrl;
867 /** @type {?} */
868 var elemSelfLink = __this.config.getUrlFromElem(elem);
869 if (elemSelfLink) {
870 if (__this.config.isAbsoluteUrl(elemSelfLink)) {
871 return elemSelfLink;
872 }
873 else {
874 elemUrl = elemSelfLink;
875 }
876 }
877 else {
878 elemUrl = elem[__this.config.restangularFields.route];
879 if (elem[__this.config.restangularFields.restangularCollection]) {
880 /** @type {?} */
881 var ids = elem[__this.config.restangularFields.ids];
882 if (ids) {
883 elemUrl += '/' + ids.join(',');
884 }
885 }
886 else {
887 /** @type {?} */
888 var elemId = void 0;
889 if (__this.config.useCannonicalId) {
890 elemId = __this.config.getCannonicalIdFromElem(elem);
891 }
892 else {
893 elemId = __this.config.getIdFromElem(elem);
894 }
895 if (configuration.isValidId(elemId) && !elem.singleOne) {
896 elemUrl += '/' + (__this.config.encodeIds ? encodeURIComponent(elemId) : elemId);
897 }
898 }
899 }
900 acum = acum.replace(/\/$/, '') + '/' + elemUrl;
901 return __this.normalizeUrl(acum);
902 }, this.config.baseUrl);
903 };
904 Path.prototype.fetchUrl = function (current, what) {
905 /** @type {?} */
906 var baseUrl = this.base(current);
907 if (what) {
908 baseUrl += '/' + what;
909 }
910 return baseUrl;
911 };
912 Path.prototype.fetchRequestedUrl = function (current, what) {
913 /** @type {?} */
914 var url = this.fetchUrl(current, what);
915 /** @type {?} */
916 var params = current[configuration.restangularFields.reqParams];
917 // From here on and until the end of fetchRequestedUrl,
918 // the code has been kindly borrowed from angular.js
919 // The reason for such code bloating is coherence:
920 // If the user were to use this for cache management, the
921 // serialization of parameters would need to be identical
922 // to the one done by angular for cache keys to match.
923 /**
924 * @param {?} obj
925 * @return {?}
926 */
927 function sortedKeys(obj) {
928 /** @type {?} */
929 var resultKeys = [];
930 for (var key in obj) {
931 if (obj.hasOwnProperty(key)) {
932 resultKeys.push(key);
933 }
934 }
935 return resultKeys.sort();
936 }
937 /**
938 * @param {?} obj
939 * @param {?=} iterator
940 * @param {?=} context
941 * @return {?}
942 */
943 function forEachSorted(obj, iterator, context) {
944 /** @type {?} */
945 var sortedKeysArray = sortedKeys(obj);
946 for (var i = 0; i < sortedKeysArray.length; i++) {
947 iterator.call(context, obj[sortedKeysArray[i]], sortedKeysArray[i]);
948 }
949 return sortedKeysArray;
950 }
951 /**
952 * @param {?} val
953 * @param {?=} pctEncodeSpaces
954 * @return {?}
955 */
956 function encodeUriQuery(val, pctEncodeSpaces) {
957 return encodeURIComponent(val)
958 .replace(/%40/gi, '@')
959 .replace(/%3A/gi, ':')
960 .replace(/%24/g, '$')
961 .replace(/%2C/gi, ',')
962 .replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
963 }
964 if (!params) {
965 return url + (this.config.suffix || '');
966 }
967 /** @type {?} */
968 var parts = [];
969 forEachSorted(params, function (value, key) {
970 if (value === null || value === undefined) {
971 return;
972 }
973 if (!lodash.isArray(value)) {
974 value = [value];
975 }
976 lodash.forEach(value, function (v) {
977 if (lodash.isObject(v)) {
978 v = JSON.stringify(v);
979 }
980 parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(v));
981 });
982 });
983 return url + (this.config.suffix || '') + ((url.indexOf('?') === -1) ? '?' : '&') + parts.join('&');
984 };
985 configuration.urlCreatorFactory.path = Path;
986 }
987
988 /**
989 * @fileoverview added by tsickle
990 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
991 */
992 var Restangular = /** @class */ (function () {
993 function Restangular(configObj, injector, http$$1) {
994 this.configObj = configObj;
995 this.injector = injector;
996 this.http = http$$1;
997 this.provider = new providerConfig(http$$1);
998 /** @type {?} */
999 var element = this.provider.$get();
1000 object.assign(this, element);
1001 this.setDefaultConfig();
1002 }
1003 /**
1004 * @return {?}
1005 */
1006 Restangular.prototype.setDefaultConfig = /**
1007 * @return {?}
1008 */
1009 function () {
1010 var _this = this;
1011 var _a;
1012 if (!this.configObj || !lodash.isFunction(this.configObj.fn)) {
1013 return;
1014 }
1015 /** @type {?} */
1016 var arrDI = lodash.map(this.configObj.arrServices, function (services) {
1017 return _this.injector.get(services);
1018 });
1019 (_a = this.configObj).fn.apply(_a, __spread([this.provider], arrDI));
1020 };
1021 Restangular.decorators = [
1022 { type: core.Injectable },
1023 ];
1024 /** @nocollapse */
1025 Restangular.ctorParameters = function () {
1026 return [
1027 { type: undefined, decorators: [{ type: core.Optional }, { type: core.Inject, args: [RESTANGULAR,] }] },
1028 { type: core.Injector },
1029 { type: RestangularHttp }
1030 ];
1031 };
1032 return Restangular;
1033 }());
1034 /**
1035 * @param {?} $http
1036 * @return {?}
1037 */
1038 function providerConfig($http) {
1039 /** @type {?} */
1040 var globalConfiguration = {};
1041 RestangularConfigurer(this, globalConfiguration);
1042 this.$get = $get;
1043 /**
1044 * @return {?}
1045 */
1046 function $get() {
1047 /**
1048 * @param {?} config
1049 * @return {?}
1050 */
1051 function createServiceForConfiguration(config) {
1052 /** @type {?} */
1053 var service = {};
1054 /** @type {?} */
1055 var urlHandler = new config.urlCreatorFactory[config.urlCreator]();
1056 urlHandler.setConfig(config);
1057 /**
1058 * @param {?} parent
1059 * @param {?} elem
1060 * @param {?} route
1061 * @param {?} reqParams
1062 * @param {?} fromServer
1063 * @return {?}
1064 */
1065 function restangularizeBase(parent, elem, route, reqParams, fromServer) {
1066 elem[config.restangularFields.route] = route;
1067 elem[config.restangularFields.getRestangularUrl] = lodash.bind(urlHandler.fetchUrl, urlHandler, elem);
1068 elem[config.restangularFields.getRequestedUrl] = lodash.bind(urlHandler.fetchRequestedUrl, urlHandler, elem);
1069 elem[config.restangularFields.addRestangularMethod] = lodash.bind(addRestangularMethodFunction, elem);
1070 elem[config.restangularFields.clone] = lodash.bind(copyRestangularizedElement, elem);
1071 elem[config.restangularFields.reqParams] = lodash.isEmpty(reqParams) ? null : reqParams;
1072 elem[config.restangularFields.withHttpConfig] = lodash.bind(withHttpConfig, elem);
1073 elem[config.restangularFields.plain] = lodash.bind(stripRestangular, elem, elem);
1074 // Tag element as restangularized
1075 elem[config.restangularFields.restangularized] = true;
1076 // RequestLess connection
1077 elem[config.restangularFields.one] = lodash.bind(one, elem, elem);
1078 elem[config.restangularFields.all] = lodash.bind(all, elem, elem);
1079 elem[config.restangularFields.several] = lodash.bind(several, elem, elem);
1080 elem[config.restangularFields.oneUrl] = lodash.bind(oneUrl, elem, elem);
1081 elem[config.restangularFields.allUrl] = lodash.bind(allUrl, elem, elem);
1082 elem[config.restangularFields.fromServer] = !!fromServer;
1083 if (parent && config.shouldSaveParent(route)) {
1084 /** @type {?} */
1085 var parentId = config.getIdFromElem(parent);
1086 /** @type {?} */
1087 var parentUrl = config.getUrlFromElem(parent);
1088 /** @type {?} */
1089 var restangularFieldsForParent = lodash.union(lodash.values(lodash.pick(config.restangularFields, ['route', 'singleOne', 'parentResource'])), config.extraFields);
1090 /** @type {?} */
1091 var parentResource = lodash.pick(parent, restangularFieldsForParent);
1092 if (config.isValidId(parentId)) {
1093 config.setIdToElem(parentResource, parentId, route);
1094 }
1095 if (config.isValidId(parentUrl)) {
1096 config.setUrlToElem(parentResource, parentUrl, route);
1097 }
1098 elem[config.restangularFields.parentResource] = parentResource;
1099 }
1100 else {
1101 elem[config.restangularFields.parentResource] = null;
1102 }
1103 return elem;
1104 }
1105 /**
1106 * @param {?} parent
1107 * @param {?} route
1108 * @param {?} id
1109 * @param {?} singleOne
1110 * @return {?}
1111 */
1112 function one(parent, route, id, singleOne) {
1113 /** @type {?} */
1114 var error;
1115 if (lodash.isNumber(route) || lodash.isNumber(parent)) {
1116 error = 'You\'re creating a Restangular entity with the number ';
1117 error += 'instead of the route or the parent. For example, you can\'t call .one(12).';
1118 throw new Error(error);
1119 }
1120 if (lodash.isUndefined(route)) {
1121 error = 'You\'re creating a Restangular entity either without the path. ';
1122 error += 'For example you can\'t call .one(). Please check if your arguments are valid.';
1123 throw new Error(error);
1124 }
1125 /** @type {?} */
1126 var elem = {};
1127 config.setIdToElem(elem, id, route);
1128 config.setFieldToElem(config.restangularFields.singleOne, elem, singleOne);
1129 return restangularizeElem(parent, elem, route, false);
1130 }
1131 /**
1132 * @param {?} parent
1133 * @param {?} route
1134 * @return {?}
1135 */
1136 function all(parent, route) {
1137 return restangularizeCollection(parent, [], route, false);
1138 }
1139 /**
1140 * @param {?} parent
1141 * @param {?} route
1142 * @return {?}
1143 */
1144 function several(parent, route /*, ids */) {
1145 /** @type {?} */
1146 var collection = [];
1147 collection[config.restangularFields.ids] = Array.prototype.splice.call(arguments, 2);
1148 return restangularizeCollection(parent, collection, route, false);
1149 }
1150 /**
1151 * @param {?} parent
1152 * @param {?} route
1153 * @param {?} url
1154 * @return {?}
1155 */
1156 function oneUrl(parent, route, url) {
1157 if (!route) {
1158 throw new Error('Route is mandatory when creating new Restangular objects.');
1159 }
1160 /** @type {?} */
1161 var elem = {};
1162 config.setUrlToElem(elem, url, route);
1163 return restangularizeElem(parent, elem, route, false);
1164 }
1165 /**
1166 * @param {?} parent
1167 * @param {?} route
1168 * @param {?} url
1169 * @return {?}
1170 */
1171 function allUrl(parent, route, url) {
1172 if (!route) {
1173 throw new Error('Route is mandatory when creating new Restangular objects.');
1174 }
1175 /** @type {?} */
1176 var elem = {};
1177 config.setUrlToElem(elem, url, route);
1178 return restangularizeCollection(parent, elem, route, false);
1179 }
1180 // Promises
1181 /**
1182 * @param {?} subject
1183 * @param {?} isCollection
1184 * @param {?} valueToFill
1185 * @return {?}
1186 */
1187 function restangularizeResponse(subject, isCollection, valueToFill) {
1188 return subject.pipe(operators.filter(function (res) { return !!res; }));
1189 }
1190 /**
1191 * @param {?} subject
1192 * @param {?} response
1193 * @param {?} data
1194 * @param {?} filledValue
1195 * @return {?}
1196 */
1197 function resolvePromise(subject, response, data, filledValue) {
1198 lodash.extend(filledValue, data);
1199 // Trigger the full response interceptor.
1200 if (config.fullResponse) {
1201 subject.next(lodash.extend(response, {
1202 data: data
1203 }));
1204 }
1205 else {
1206 subject.next(data);
1207 }
1208 subject.complete();
1209 }
1210 // Elements
1211 /**
1212 * @param {?} elem
1213 * @return {?}
1214 */
1215 function stripRestangular(elem) {
1216 if (lodash.isArray(elem)) {
1217 /** @type {?} */
1218 var array_1 = [];
1219 lodash.each(elem, function (value) {
1220 array_1.push(config.isRestangularized(value) ? stripRestangular(value) : value);
1221 });
1222 return array_1;
1223 }
1224 else {
1225 return lodash.omit(elem, lodash.values(lodash.omit(config.restangularFields, 'id')));
1226 }
1227 }
1228 /**
1229 * @param {?} elem
1230 * @return {?}
1231 */
1232 function addCustomOperation(elem) {
1233 elem[config.restangularFields.customOperation] = lodash.bind(customFunction, elem);
1234 /** @type {?} */
1235 var requestMethods = { get: customFunction, delete: customFunction };
1236 lodash.each(['put', 'patch', 'post'], function (name) {
1237 requestMethods[name] = function (operation, element, path, params, headers) {
1238 return lodash.bind(customFunction, this)(operation, path, params, headers, element);
1239 };
1240 });
1241 lodash.each(requestMethods, function (requestFunc, name) {
1242 /** @type {?} */
1243 var callOperation = name === 'delete' ? 'remove' : name;
1244 lodash.each(['do', 'custom'], function (alias) {
1245 elem[alias + name.toUpperCase()] = lodash.bind(requestFunc, elem, callOperation);
1246 });
1247 });
1248 elem[config.restangularFields.customGETLIST] = lodash.bind(fetchFunction, elem);
1249 elem[config.restangularFields.doGETLIST] = elem[config.restangularFields.customGETLIST];
1250 }
1251 /**
1252 * @param {?} fromElement
1253 * @param {?=} toElement
1254 * @return {?}
1255 */
1256 function copyRestangularizedElement(fromElement, toElement) {
1257 if (toElement === void 0) {
1258 toElement = {};
1259 }
1260 /** @type {?} */
1261 var copiedElement = object.assign(toElement, fromElement);
1262 return restangularizeElem(copiedElement[config.restangularFields.parentResource], copiedElement, copiedElement[config.restangularFields.route], true);
1263 }
1264 /**
1265 * @param {?} parent
1266 * @param {?} element
1267 * @param {?} route
1268 * @param {?=} fromServer
1269 * @param {?=} collection
1270 * @param {?=} reqParams
1271 * @return {?}
1272 */
1273 function restangularizeElem(parent, element, route, fromServer, collection, reqParams) {
1274 /** @type {?} */
1275 var elem = config.onBeforeElemRestangularized(element, false, route);
1276 /** @type {?} */
1277 var localElem = restangularizeBase(parent, elem, route, reqParams, fromServer);
1278 if (config.useCannonicalId) {
1279 localElem[config.restangularFields.cannonicalId] = config.getIdFromElem(localElem);
1280 }
1281 if (collection) {
1282 localElem[config.restangularFields.getParentList] = function () {
1283 return collection;
1284 };
1285 }
1286 localElem[config.restangularFields.restangularCollection] = false;
1287 localElem[config.restangularFields.get] = lodash.bind(getFunction, localElem);
1288 localElem[config.restangularFields.getList] = lodash.bind(fetchFunction, localElem);
1289 localElem[config.restangularFields.put] = lodash.bind(putFunction, localElem);
1290 localElem[config.restangularFields.post] = lodash.bind(postFunction, localElem);
1291 localElem[config.restangularFields.remove] = lodash.bind(deleteFunction, localElem);
1292 localElem[config.restangularFields.head] = lodash.bind(headFunction, localElem);
1293 localElem[config.restangularFields.trace] = lodash.bind(traceFunction, localElem);
1294 localElem[config.restangularFields.options] = lodash.bind(optionsFunction, localElem);
1295 localElem[config.restangularFields.patch] = lodash.bind(patchFunction, localElem);
1296 localElem[config.restangularFields.save] = lodash.bind(save, localElem);
1297 addCustomOperation(localElem);
1298 return config.transformElem(localElem, false, route, service, true);
1299 }
1300 /**
1301 * @param {?} parent
1302 * @param {?} element
1303 * @param {?} route
1304 * @param {?=} fromServer
1305 * @param {?=} reqParams
1306 * @return {?}
1307 */
1308 function restangularizeCollection(parent, element, route, fromServer, reqParams) {
1309 /** @type {?} */
1310 var elem = config.onBeforeElemRestangularized(element, true, route);
1311 /** @type {?} */
1312 var localElem = restangularizeBase(parent, elem, route, reqParams, fromServer);
1313 localElem[config.restangularFields.restangularCollection] = true;
1314 localElem[config.restangularFields.post] = lodash.bind(postFunction, localElem, null);
1315 localElem[config.restangularFields.remove] = lodash.bind(deleteFunction, localElem);
1316 localElem[config.restangularFields.head] = lodash.bind(headFunction, localElem);
1317 localElem[config.restangularFields.trace] = lodash.bind(traceFunction, localElem);
1318 localElem[config.restangularFields.putElement] = lodash.bind(putElementFunction, localElem);
1319 localElem[config.restangularFields.options] = lodash.bind(optionsFunction, localElem);
1320 localElem[config.restangularFields.patch] = lodash.bind(patchFunction, localElem);
1321 localElem[config.restangularFields.get] = lodash.bind(getById, localElem);
1322 localElem[config.restangularFields.getList] = lodash.bind(fetchFunction, localElem, null);
1323 addCustomOperation(localElem);
1324 return config.transformElem(localElem, true, route, service, true);
1325 }
1326 /**
1327 * @param {?} parent
1328 * @param {?} element
1329 * @param {?} route
1330 * @return {?}
1331 */
1332 function restangularizeCollectionAndElements(parent, element, route) {
1333 /** @type {?} */
1334 var collection = restangularizeCollection(parent, element, route, false);
1335 lodash.each(collection, function (elem) {
1336 if (elem) {
1337 restangularizeElem(parent, elem, route, false);
1338 }
1339 });
1340 return collection;
1341 }
1342 /**
1343 * @param {?} id
1344 * @param {?} reqParams
1345 * @param {?} headers
1346 * @return {?}
1347 */
1348 function getById(id, reqParams, headers) {
1349 return this.customGET(id.toString(), reqParams, headers);
1350 }
1351 /**
1352 * @param {?} idx
1353 * @param {?} params
1354 * @param {?} headers
1355 * @return {?}
1356 */
1357 function putElementFunction(idx, params, headers) {
1358 /** @type {?} */
1359 var __this = this;
1360 /** @type {?} */
1361 var elemToPut = this[idx];
1362 /** @type {?} */
1363 var subject = new rxjs.BehaviorSubject(null);
1364 /** @type {?} */
1365 var filledArray = [];
1366 filledArray = config.transformElem(filledArray, true, elemToPut[config.restangularFields.route], service);
1367 elemToPut.put(params, headers)
1368 .subscribe(function (serverElem) {
1369 /** @type {?} */
1370 var newArray = copyRestangularizedElement(__this);
1371 newArray[idx] = serverElem;
1372 filledArray = newArray;
1373 subject.next(newArray);
1374 }, function (response) {
1375 subject.error(response);
1376 }, function () {
1377 subject.complete();
1378 });
1379 return restangularizeResponse(subject, true, filledArray);
1380 }
1381 /**
1382 * @param {?} resData
1383 * @param {?} operation
1384 * @param {?} route
1385 * @param {?} fetchUrl
1386 * @param {?} response
1387 * @param {?} subject
1388 * @return {?}
1389 */
1390 function parseResponse(resData, operation, route, fetchUrl, response, subject) {
1391 /** @type {?} */
1392 var data = config.responseExtractor(resData, operation, route, fetchUrl, response, subject);
1393 /** @type {?} */
1394 var etag = response.headers.get('ETag');
1395 if (data && etag) {
1396 data[config.restangularFields.etag] = etag;
1397 }
1398 return data;
1399 }
1400 /**
1401 * @param {?} what
1402 * @param {?} reqParams
1403 * @param {?} headers
1404 * @return {?}
1405 */
1406 function fetchFunction(what, reqParams, headers) {
1407 /** @type {?} */
1408 var __this = this;
1409 /** @type {?} */
1410 var subject = new rxjs.BehaviorSubject(null);
1411 /** @type {?} */
1412 var operation = 'getList';
1413 /** @type {?} */
1414 var url = urlHandler.fetchUrl(this, what);
1415 /** @type {?} */
1416 var whatFetched = what || __this[config.restangularFields.route];
1417 /** @type {?} */
1418 var request = config.fullRequestInterceptor(null, operation, whatFetched, url, headers || {}, reqParams || {}, this[config.restangularFields.httpConfig] || {});
1419 /** @type {?} */
1420 var filledArray = [];
1421 filledArray = config.transformElem(filledArray, true, whatFetched, service);
1422 /** @type {?} */
1423 var method = 'getList';
1424 if (config.jsonp) {
1425 method = 'jsonp';
1426 }
1427 /** @type {?} */
1428 var okCallback = function (response) {
1429 /** @type {?} */
1430 var resData = response.body;
1431 /** @type {?} */
1432 var fullParams = response.config.params;
1433 /** @type {?} */
1434 var data = parseResponse(resData, operation, whatFetched, url, response, subject);
1435 // support empty response for getList() calls (some APIs respond with 204 and empty body)
1436 if (lodash.isUndefined(data) || '' === data) {
1437 data = [];
1438 }
1439 if (!lodash.isArray(data)) {
1440 throw new Error('Response for getList SHOULD be an array and not an object or something else');
1441 }
1442 if (true === config.plainByDefault) {
1443 return resolvePromise(subject, response, data, filledArray);
1444 }
1445 /** @type {?} */
1446 var processedData = lodash.map(data, function (elem) {
1447 if (!__this[config.restangularFields.restangularCollection]) {
1448 return restangularizeElem(__this, elem, what, true, data);
1449 }
1450 else {
1451 return restangularizeElem(__this[config.restangularFields.parentResource], elem, __this[config.restangularFields.route], true, data);
1452 }
1453 });
1454 processedData = lodash.extend(data, processedData);
1455 if (!__this[config.restangularFields.restangularCollection]) {
1456 resolvePromise(subject, response, restangularizeCollection(__this, processedData, what, true, fullParams), filledArray);
1457 }
1458 else {
1459 resolvePromise(subject, response, restangularizeCollection(__this[config.restangularFields.parentResource], processedData, __this[config.restangularFields.route], true, fullParams), filledArray);
1460 }
1461 };
1462 urlHandler.resource(this, $http, request.httpConfig, request.headers, request.params, what, this[config.restangularFields.etag], operation)[method]()
1463 .subscribe(okCallback, function error(response) {
1464 if (response.status === 304 && __this[config.restangularFields.restangularCollection]) {
1465 resolvePromise(subject, response, __this, filledArray);
1466 }
1467 else if (lodash.every(config.errorInterceptors, function (cb) {
1468 return cb(response, subject, okCallback) !== false;
1469 })) {
1470 // triggered if no callback returns false
1471 subject.error(response);
1472 }
1473 });
1474 return restangularizeResponse(subject, true, filledArray);
1475 }
1476 /**
1477 * @param {?} httpConfig
1478 * @return {?}
1479 */
1480 function withHttpConfig(httpConfig) {
1481 this[config.restangularFields.httpConfig] = httpConfig;
1482 return this;
1483 }
1484 /**
1485 * @param {?} params
1486 * @param {?} headers
1487 * @return {?}
1488 */
1489 function save(params, headers) {
1490 if (this[config.restangularFields.fromServer]) {
1491 return this[config.restangularFields.put](params, headers);
1492 }
1493 else {
1494 return lodash.bind(elemFunction, this)('post', undefined, params, undefined, headers);
1495 }
1496 }
1497 /**
1498 * @param {?} operation
1499 * @param {?} what
1500 * @param {?} params
1501 * @param {?} obj
1502 * @param {?} headers
1503 * @return {?}
1504 */
1505 function elemFunction(operation, what, params, obj, headers) {
1506 /** @type {?} */
1507 var __this = this;
1508 /** @type {?} */
1509 var subject = new rxjs.BehaviorSubject(null);
1510 /** @type {?} */
1511 var resParams = params || {};
1512 /** @type {?} */
1513 var route = what || this[config.restangularFields.route];
1514 /** @type {?} */
1515 var fetchUrl = urlHandler.fetchUrl(this, what);
1516 /** @type {?} */
1517 var callObj = obj || this;
1518 // fallback to etag on restangular object (since for custom methods we probably don't explicitly specify the etag field)
1519 /** @type {?} */
1520 var etag = callObj[config.restangularFields.etag] || (operation !== 'post' ? this[config.restangularFields.etag] : null);
1521 if (lodash.isObject(callObj) && config.isRestangularized(callObj)) {
1522 callObj = stripRestangular(callObj);
1523 }
1524 /** @type {?} */
1525 var request = config.fullRequestInterceptor(callObj, operation, route, fetchUrl, headers || {}, resParams || {}, this[config.restangularFields.httpConfig] || {});
1526 /** @type {?} */
1527 var filledObject = {};
1528 filledObject = config.transformElem(filledObject, false, route, service);
1529 /** @type {?} */
1530 var okCallback = function (response) {
1531 /** @type {?} */
1532 var resData = lodash.get(response, 'body');
1533 /** @type {?} */
1534 var fullParams = lodash.get(response, 'config.params');
1535 /** @type {?} */
1536 var elem = parseResponse(resData, operation, route, fetchUrl, response, subject);
1537 if (elem) {
1538 /** @type {?} */
1539 var data = void 0;
1540 if (true === config.plainByDefault) {
1541 return resolvePromise(subject, response, elem, filledObject);
1542 }
1543 if (operation === 'post' && !__this[config.restangularFields.restangularCollection]) {
1544 data = restangularizeElem(__this[config.restangularFields.parentResource], elem, route, true, null, fullParams);
1545 resolvePromise(subject, response, data, filledObject);
1546 }
1547 else {
1548 data = restangularizeElem(__this[config.restangularFields.parentResource], elem, __this[config.restangularFields.route], true, null, fullParams);
1549 data[config.restangularFields.singleOne] = __this[config.restangularFields.singleOne];
1550 resolvePromise(subject, response, data, filledObject);
1551 }
1552 }
1553 else {
1554 resolvePromise(subject, response, undefined, filledObject);
1555 }
1556 };
1557 /** @type {?} */
1558 var errorCallback = function (response) {
1559 if (response.status === 304 && config.isSafe(operation)) {
1560 resolvePromise(subject, response, __this, filledObject);
1561 }
1562 else if (lodash.every(config.errorInterceptors, function (cb) {
1563 return cb(response, subject, okCallback) !== false;
1564 })) {
1565 // triggered if no callback returns false
1566 subject.error(response);
1567 }
1568 };
1569 // Overriding HTTP Method
1570 /** @type {?} */
1571 var callOperation = operation;
1572 /** @type {?} */
1573 var callHeaders = lodash.extend({}, request.headers);
1574 /** @type {?} */
1575 var isOverrideOperation = config.isOverridenMethod(operation);
1576 if (isOverrideOperation) {
1577 callOperation = 'post';
1578 callHeaders = lodash.extend(callHeaders, { 'X-HTTP-Method-Override': operation === 'remove' ? 'DELETE' : operation.toUpperCase() });
1579 }
1580 else if (config.jsonp && callOperation === 'get') {
1581 callOperation = 'jsonp';
1582 }
1583 if (config.isSafe(operation)) {
1584 if (isOverrideOperation) {
1585 urlHandler.resource(this, $http, request.httpConfig, callHeaders, request.params, what, etag, callOperation)[callOperation]({}).subscribe(okCallback, errorCallback);
1586 }
1587 else {
1588 urlHandler.resource(this, $http, request.httpConfig, callHeaders, request.params, what, etag, callOperation)[callOperation]().subscribe(okCallback, errorCallback);
1589 }
1590 }
1591 else {
1592 urlHandler.resource(this, $http, request.httpConfig, callHeaders, request.params, what, etag, callOperation)[callOperation](request.element).subscribe(okCallback, errorCallback);
1593 }
1594 return restangularizeResponse(subject, false, filledObject);
1595 }
1596 /**
1597 * @param {?} params
1598 * @param {?} headers
1599 * @return {?}
1600 */
1601 function getFunction(params, headers) {
1602 return lodash.bind(elemFunction, this)('get', undefined, params, undefined, headers);
1603 }
1604 /**
1605 * @param {?} params
1606 * @param {?} headers
1607 * @return {?}
1608 */
1609 function deleteFunction(params, headers) {
1610 return lodash.bind(elemFunction, this)('remove', undefined, params, undefined, headers);
1611 }
1612 /**
1613 * @param {?} params
1614 * @param {?} headers
1615 * @return {?}
1616 */
1617 function putFunction(params, headers) {
1618 return lodash.bind(elemFunction, this)('put', undefined, params, undefined, headers);
1619 }
1620 /**
1621 * @param {?} what
1622 * @param {?} elem
1623 * @param {?} params
1624 * @param {?} headers
1625 * @return {?}
1626 */
1627 function postFunction(what, elem, params, headers) {
1628 return lodash.bind(elemFunction, this)('post', what, params, elem, headers);
1629 }
1630 /**
1631 * @param {?} params
1632 * @param {?} headers
1633 * @return {?}
1634 */
1635 function headFunction(params, headers) {
1636 return lodash.bind(elemFunction, this)('head', undefined, params, undefined, headers);
1637 }
1638 /**
1639 * @param {?} params
1640 * @param {?} headers
1641 * @return {?}
1642 */
1643 function traceFunction(params, headers) {
1644 return lodash.bind(elemFunction, this)('trace', undefined, params, undefined, headers);
1645 }
1646 /**
1647 * @param {?} params
1648 * @param {?} headers
1649 * @return {?}
1650 */
1651 function optionsFunction(params, headers) {
1652 return lodash.bind(elemFunction, this)('options', undefined, params, undefined, headers);
1653 }
1654 /**
1655 * @param {?} elem
1656 * @param {?} params
1657 * @param {?} headers
1658 * @return {?}
1659 */
1660 function patchFunction(elem, params, headers) {
1661 return lodash.bind(elemFunction, this)('patch', undefined, params, elem, headers);
1662 }
1663 /**
1664 * @param {?} operation
1665 * @param {?} path
1666 * @param {?} params
1667 * @param {?} headers
1668 * @param {?} elem
1669 * @return {?}
1670 */
1671 function customFunction(operation, path, params, headers, elem) {
1672 return lodash.bind(elemFunction, this)(operation, path, params, elem, headers);
1673 }
1674 /**
1675 * @param {?} name
1676 * @param {?} operation
1677 * @param {?} path
1678 * @param {?} defaultParams
1679 * @param {?} defaultHeaders
1680 * @param {?} defaultElem
1681 * @return {?}
1682 */
1683 function addRestangularMethodFunction(name, operation, path, defaultParams, defaultHeaders, defaultElem) {
1684 /** @type {?} */
1685 var bindedFunction;
1686 if (operation === 'getList') {
1687 bindedFunction = lodash.bind(fetchFunction, this, path);
1688 }
1689 else {
1690 bindedFunction = lodash.bind(customFunction, this, operation, path);
1691 }
1692 /** @type {?} */
1693 var createdFunction = function (params, headers, elem) {
1694 /** @type {?} */
1695 var callParams = lodash.defaults({
1696 params: params,
1697 headers: headers,
1698 elem: elem
1699 }, {
1700 params: defaultParams,
1701 headers: defaultHeaders,
1702 elem: defaultElem
1703 });
1704 return bindedFunction(callParams.params, callParams.headers, callParams.elem);
1705 };
1706 if (config.isSafe(operation)) {
1707 this[name] = createdFunction;
1708 }
1709 else {
1710 this[name] = function (elem, params, headers) {
1711 return createdFunction(params, headers, elem);
1712 };
1713 }
1714 }
1715 /**
1716 * @param {?} configurer
1717 * @return {?}
1718 */
1719 function withConfigurationFunction(configurer) {
1720 /** @type {?} */
1721 var newConfig = lodash.clone(lodash.omit(config, 'configuration'));
1722 RestangularConfigurer(newConfig, newConfig);
1723 configurer(newConfig);
1724 return createServiceForConfiguration(newConfig);
1725 }
1726 /**
1727 * @param {?} route
1728 * @param {?} parent
1729 * @return {?}
1730 */
1731 function toService(route, parent) {
1732 /** @type {?} */
1733 var knownCollectionMethods = lodash.values(config.restangularFields);
1734 /** @type {?} */
1735 var serv = {};
1736 /** @type {?} */
1737 var collection = (parent || service).all(route);
1738 serv.one = lodash.bind(one, (parent || service), parent, route);
1739 serv.all = lodash.bind(collection.all, collection);
1740 serv.post = lodash.bind(collection.post, collection);
1741 serv.getList = lodash.bind(collection.getList, collection);
1742 serv.withHttpConfig = lodash.bind(collection.withHttpConfig, collection);
1743 serv.get = lodash.bind(collection.get, collection);
1744 for (var prop in collection) {
1745 if (collection.hasOwnProperty(prop) && lodash.isFunction(collection[prop]) && !lodash.includes(knownCollectionMethods, prop)) {
1746 serv[prop] = lodash.bind(collection[prop], collection);
1747 }
1748 }
1749 return serv;
1750 }
1751 RestangularConfigurer(service, config);
1752 service.copy = lodash.bind(copyRestangularizedElement, service);
1753 service.service = lodash.bind(toService, service);
1754 service.withConfig = lodash.bind(withConfigurationFunction, service);
1755 service.one = lodash.bind(one, service, null);
1756 service.all = lodash.bind(all, service, null);
1757 service.several = lodash.bind(several, service, null);
1758 service.oneUrl = lodash.bind(oneUrl, service, null);
1759 service.allUrl = lodash.bind(allUrl, service, null);
1760 service.stripRestangular = lodash.bind(stripRestangular, service);
1761 service.restangularizeElement = lodash.bind(restangularizeElem, service);
1762 service.restangularizeCollection = lodash.bind(restangularizeCollectionAndElements, service);
1763 return service;
1764 }
1765 return createServiceForConfiguration(globalConfiguration);
1766 }
1767 }
1768
1769 /**
1770 * @fileoverview added by tsickle
1771 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
1772 */
1773 /** @type {?} */
1774 var CONFIG_OBJ = new core.InjectionToken('configObj');
1775 var RestangularModule = /** @class */ (function () {
1776 function RestangularModule(parentModule) {
1777 if (parentModule) {
1778 throw new Error('RestangularModule is already loaded. Import it in the AppModule only');
1779 }
1780 }
1781 /**
1782 * @param {?=} config1
1783 * @param {?=} config2
1784 * @return {?}
1785 */
1786 RestangularModule.forRoot = /**
1787 * @param {?=} config1
1788 * @param {?=} config2
1789 * @return {?}
1790 */
1791 function (config1, config2) {
1792 return {
1793 ngModule: RestangularModule,
1794 providers: [
1795 { provide: CONFIG_OBJ, useValue: [config1, config2] },
1796 { provide: RESTANGULAR, useFactory: RestangularFactory, deps: [CONFIG_OBJ] },
1797 ]
1798 };
1799 };
1800 RestangularModule.decorators = [
1801 { type: core.NgModule, args: [{
1802 imports: [http.HttpClientModule],
1803 providers: [RestangularHttp, Restangular]
1804 },] },
1805 ];
1806 /** @nocollapse */
1807 RestangularModule.ctorParameters = function () {
1808 return [
1809 { type: RestangularModule, decorators: [{ type: core.Optional }, { type: core.SkipSelf }] }
1810 ];
1811 };
1812 return RestangularModule;
1813 }());
1814
1815 /**
1816 * @fileoverview added by tsickle
1817 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
1818 */
1819
1820 /**
1821 * @fileoverview added by tsickle
1822 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
1823 */
1824
1825 /**
1826 * @fileoverview added by tsickle
1827 * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
1828 */
1829
1830 exports.RestangularModule = RestangularModule;
1831 exports.Restangular = Restangular;
1832 exports.RestangularHttp = RestangularHttp;
1833 exports.ɵb = RESTANGULAR;
1834 exports.ɵc = RestangularFactory;
1835 exports.ɵa = CONFIG_OBJ;
1836
1837 Object.defineProperty(exports, '__esModule', { value: true });
1838
1839})));
1840
1841//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJlc3Rhbmd1bGFyLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbbnVsbCwibmc6Ly9uZ3gtcmVzdGFuZ3VsYXIvbGliL25neC1yZXN0YW5ndWxhci5jb25maWcudHMiLCJuZzovL25neC1yZXN0YW5ndWxhci9saWIvbmd4LXJlc3Rhbmd1bGFyLWhlbHBlci50cyIsIm5nOi8vbmd4LXJlc3Rhbmd1bGFyL2xpYi9uZ3gtcmVzdGFuZ3VsYXItaHR0cC50cyIsIm5nOi8vbmd4LXJlc3Rhbmd1bGFyL2xpYi9uZ3gtcmVzdGFuZ3VsYXItY29uZmlnLmZhY3RvcnkudHMiLCJuZzovL25neC1yZXN0YW5ndWxhci9saWIvbmd4LXJlc3Rhbmd1bGFyLnRzIiwibmc6Ly9uZ3gtcmVzdGFuZ3VsYXIvbGliL25neC1yZXN0YW5ndWxhci5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnbG9kYXNoJztcblxuXG5leHBvcnQgY29uc3QgUkVTVEFOR1VMQVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPigncmVzdGFuZ3VsYXJXaXRoQ29uZmlnJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXN0YW5ndWxhckZhY3RvcnkoW2NhbGxiYWNrT3JTZXJ2aWNlcywgY2FsbGJhY2tdKSB7XG4gIGxldCBhcnJTZXJ2aWNlcyA9IFtdO1xuICBsZXQgZm4gPSBjYWxsYmFja09yU2VydmljZXM7XG5cbiAgaWYgKGlzQXJyYXkoY2FsbGJhY2tPclNlcnZpY2VzKSkge1xuICAgIGFyclNlcnZpY2VzID0gY2FsbGJhY2tPclNlcnZpY2VzO1xuICAgIGZuID0gY2FsbGJhY2s7XG4gIH1cblxuICByZXR1cm4ge2ZuLCBhcnJTZXJ2aWNlc307XG59XG4iLCJpbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2NvcmUtanMvZm4vb2JqZWN0JztcblxuZXhwb3J0IGNsYXNzIFJlc3Rhbmd1bGFySGVscGVyIHtcblxuICBzdGF0aWMgY3JlYXRlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgY29uc3QgcmVxdWVzdFF1ZXJ5UGFyYW1zID0gUmVzdGFuZ3VsYXJIZWxwZXIuY3JlYXRlUmVxdWVzdFF1ZXJ5UGFyYW1zKG9wdGlvbnMucGFyYW1zKTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IFJlc3Rhbmd1bGFySGVscGVyLmNyZWF0ZVJlcXVlc3RIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IG9wdGlvbnMubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3Qgd2l0aENyZWRlbnRpYWxzID0gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdChcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBvcHRpb25zLnVybCxcbiAgICAgIG9wdGlvbnMuZGF0YSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHBhcmFtczogcmVxdWVzdFF1ZXJ5UGFyYW1zLFxuICAgICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKFsnR0VUJywgJ0RFTEVURScsICdIRUFEJywgJ0pTT05QJywgJ09QVElPTlMnXS5pbmRleE9mKG1ldGhvZE5hbWUpID49IDApIHtcbiAgICAgIHJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIG9wdGlvbnMudXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgcGFyYW1zOiByZXF1ZXN0UXVlcnlQYXJhbXMsXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiBvcHRpb25zLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgICB3aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUmVxdWVzdFF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSB7XG4gICAgY29uc3QgcmVxdWVzdFF1ZXJ5UGFyYW1zID0gYXNzaWduKHt9LCBxdWVyeVBhcmFtcyk7XG4gICAgbGV0IHNlYXJjaDogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXF1ZXN0UXVlcnlQYXJhbXMpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55ID0gcmVxdWVzdFF1ZXJ5UGFyYW1zW2tleV07XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICBzZWFyY2ggPSBzZWFyY2guYXBwZW5kKGtleSwgdmFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHNlYXJjaCA9IHNlYXJjaC5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlYXJjaDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSZXF1ZXN0SGVhZGVycyhoZWFkZXJzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaGVhZGVycykge1xuICAgICAgY29uc3QgdmFsdWU6IGFueSA9IGhlYWRlcnNba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGRlbGV0ZSBoZWFkZXJzW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyhhc3NpZ24oe30sIGhlYWRlcnMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cEJhY2tlbmQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyB0aHJvd0Vycm9yLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlc3Rhbmd1bGFySGVscGVyIH0gZnJvbSAnLi9uZ3gtcmVzdGFuZ3VsYXItaGVscGVyJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSHR0cEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAvc3JjL3Jlc3BvbnNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlc3Rhbmd1bGFySHR0cCB7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBCYWNrZW5kKSB7XG4gIH1cblxuICBjcmVhdGVSZXF1ZXN0KG9wdGlvbnMpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IFJlc3Rhbmd1bGFySGVscGVyLmNyZWF0ZVJlcXVlc3Qob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHJlcXVlc3QpO1xuICB9XG5cbiAgcmVxdWVzdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuaGFuZGxlKHJlcXVlc3QpXG4gICAgLnBpcGUoXG4gICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgSHR0cEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KSxcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgIHJlc3BvbnNlLmNvbmZpZyA9IHtwYXJhbXM6IHJlcXVlc3R9O1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgZXJyLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICBlcnIuZGF0YSA9IGVyci5lcnJvcjtcbiAgICAgICAgZXJyLnJlcGVhdFJlcXVlc3QgPSAobmV3UmVxdWVzdD8pID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG5ld1JlcXVlc3QgfHwgcmVxdWVzdCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4iLCJpbXBvcnQge1xuICBpbmNsdWRlcyxcbiAgaXNVbmRlZmluZWQsXG4gIGlzTnVsbCxcbiAgaXNBcnJheSxcbiAgaXNPYmplY3QsXG4gIGlzQm9vbGVhbixcbiAgZGVmYXVsdHMsXG4gIGVhY2gsXG4gIGV4dGVuZCxcbiAgZmluZCxcbiAgaGFzLFxuICBpbml0aWFsLFxuICBsYXN0LFxuICBjbG9uZSxcbiAgcmVkdWNlLFxuICBrZXlzLFxuICBpc0VtcHR5LFxuICBmb3JFYWNoLFxufSBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgZnVuY3Rpb24gUmVzdGFuZ3VsYXJDb25maWd1cmVyKG9iamVjdCwgY29uZmlndXJhdGlvbikge1xuICBvYmplY3QuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRob3NlIGFyZSBIVFRQIHNhZmUgbWV0aG9kcyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gbmVlZCB0byBwYXNzIGFueSBkYXRhIHdpdGggdGhlIHJlcXVlc3QuXG4gICAqL1xuICBjb25zdCBzYWZlTWV0aG9kcyA9IFsnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucycsICd0cmFjZScsICdnZXRsaXN0J107XG4gIGNvbmZpZ3VyYXRpb24uaXNTYWZlID0gZnVuY3Rpb24gKG9wZXJhdGlvbikge1xuICAgIHJldHVybiBpbmNsdWRlcyhzYWZlTWV0aG9kcywgb3BlcmF0aW9uLnRvTG93ZXJDYXNlKCkpO1xuICB9O1xuXG4gIGNvbnN0IGFic29sdXRlUGF0dGVybiA9IC9eaHR0cHM/OlxcL1xcLy9pO1xuICBjb25maWd1cmF0aW9uLmlzQWJzb2x1dGVVcmwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGlzVW5kZWZpbmVkKGNvbmZpZ3VyYXRpb24uYWJzb2x1dGVVcmwpIHx8IGlzTnVsbChjb25maWd1cmF0aW9uLmFic29sdXRlVXJsKSA/XG4gICAgICBzdHJpbmcgJiYgYWJzb2x1dGVQYXR0ZXJuLnRlc3Qoc3RyaW5nKSA6XG4gICAgICBjb25maWd1cmF0aW9uLmFic29sdXRlVXJsO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uYWJzb2x1dGVVcmwgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmFic29sdXRlVXJsKSA/IHRydWUgOiBjb25maWd1cmF0aW9uLmFic29sdXRlVXJsO1xuICBvYmplY3Quc2V0U2VsZkxpbmtBYnNvbHV0ZVVybCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGNvbmZpZ3VyYXRpb24uYWJzb2x1dGVVcmwgPSB2YWx1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIEJhc2VVUkwgdG8gYmUgdXNlZCB3aXRoIFJlc3Rhbmd1bGFyXG4gICAqL1xuICBjb25maWd1cmF0aW9uLmJhc2VVcmwgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmJhc2VVcmwpID8gJycgOiBjb25maWd1cmF0aW9uLmJhc2VVcmw7XG4gIG9iamVjdC5zZXRCYXNlVXJsID0gZnVuY3Rpb24gKG5ld0Jhc2VVcmwpIHtcbiAgICBjb25maWd1cmF0aW9uLmJhc2VVcmwgPSAvXFwvJC8udGVzdChuZXdCYXNlVXJsKSA/XG4gICAgICBuZXdCYXNlVXJsLnN1YnN0cmluZygwLCBuZXdCYXNlVXJsLmxlbmd0aCAtIDEpIDpcbiAgICAgIG5ld0Jhc2VVcmw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4dHJhIGZpZWxkcyB0byBrZWVwIGZyb20gdGhlIHBhcmVudHNcbiAgICovXG4gIGNvbmZpZ3VyYXRpb24uZXh0cmFGaWVsZHMgPSBjb25maWd1cmF0aW9uLmV4dHJhRmllbGRzIHx8IFtdO1xuICBvYmplY3Quc2V0RXh0cmFGaWVsZHMgPSBmdW5jdGlvbiAobmV3RXh0cmFGaWVsZHMpIHtcbiAgICBjb25maWd1cmF0aW9uLmV4dHJhRmllbGRzID0gbmV3RXh0cmFGaWVsZHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNvbWUgZGVmYXVsdCAkaHR0cCBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBpbiBFVkVSWSBjYWxsXG4gICAqKi9cbiAgY29uZmlndXJhdGlvbi5kZWZhdWx0SHR0cEZpZWxkcyA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdEh0dHBGaWVsZHMgfHwge307XG4gIG9iamVjdC5zZXREZWZhdWx0SHR0cEZpZWxkcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICBjb25maWd1cmF0aW9uLmRlZmF1bHRIdHRwRmllbGRzID0gdmFsdWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBbHdheXMgcmV0dXJuIHBsYWluIGRhdGEsIG5vIHJlc3Rhbmd1bGFyaXplZCBvYmplY3RcbiAgICoqL1xuICBjb25maWd1cmF0aW9uLnBsYWluQnlEZWZhdWx0ID0gY29uZmlndXJhdGlvbi5wbGFpbkJ5RGVmYXVsdCB8fCBmYWxzZTtcbiAgb2JqZWN0LnNldFBsYWluQnlEZWZhdWx0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgY29uZmlndXJhdGlvbi5wbGFpbkJ5RGVmYXVsdCA9IHZhbHVlID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24ud2l0aEh0dHBWYWx1ZXMgPSBmdW5jdGlvbiAoaHR0cExvY2FsQ29uZmlnLCBvYmopIHtcbiAgICByZXR1cm4gZGVmYXVsdHMob2JqLCBodHRwTG9jYWxDb25maWcsIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEh0dHBGaWVsZHMpO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZW5jb2RlSWRzID0gaXNVbmRlZmluZWQoY29uZmlndXJhdGlvbi5lbmNvZGVJZHMpID8gdHJ1ZSA6IGNvbmZpZ3VyYXRpb24uZW5jb2RlSWRzO1xuICBvYmplY3Quc2V0RW5jb2RlSWRzID0gZnVuY3Rpb24gKGVuY29kZSkge1xuICAgIGNvbmZpZ3VyYXRpb24uZW5jb2RlSWRzID0gZW5jb2RlO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RQYXJhbXMgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0UGFyYW1zIHx8IHtcbiAgICBnZXQ6IHt9LFxuICAgIHBvc3Q6IHt9LFxuICAgIHB1dDoge30sXG4gICAgcmVtb3ZlOiB7fSxcbiAgICBjb21tb246IHt9XG4gIH07XG5cbiAgb2JqZWN0LnNldERlZmF1bHRSZXF1ZXN0UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtMSwgcGFyYW0yKSB7XG4gICAgbGV0IG1ldGhvZHMgPSBbXTtcbiAgICBjb25zdCBwYXJhbXMgPSBwYXJhbTIgfHwgcGFyYW0xO1xuICAgIGlmICghaXNVbmRlZmluZWQocGFyYW0yKSkge1xuICAgICAgaWYgKGlzQXJyYXkocGFyYW0xKSkge1xuICAgICAgICBtZXRob2RzID0gcGFyYW0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kcy5wdXNoKHBhcmFtMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZHMucHVzaCgnY29tbW9uJyk7XG4gICAgfVxuXG4gICAgZWFjaChtZXRob2RzLCBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0UGFyYW1zW21ldGhvZF0gPSBwYXJhbXM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgb2JqZWN0LnJlcXVlc3RQYXJhbXMgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0UGFyYW1zO1xuXG4gIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEhlYWRlcnMgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRIZWFkZXJzIHx8IHt9O1xuICBvYmplY3Quc2V0RGVmYXVsdEhlYWRlcnMgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICAgIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIG9iamVjdC5kZWZhdWx0SGVhZGVycyA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdEhlYWRlcnM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgb2JqZWN0LmRlZmF1bHRIZWFkZXJzID0gY29uZmlndXJhdGlvbi5kZWZhdWx0SGVhZGVycztcblxuXG4gIC8qKlxuICAgKiBNZXRob2Qgb3ZlcnJpZGVycyByZXNwb25zZSBNZXRob2RcbiAgICoqL1xuICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZU1ldGhvZCA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlc3BvbnNlTWV0aG9kIHx8ICdwcm9taXNlJztcbiAgb2JqZWN0LnNldERlZmF1bHRSZXNwb25zZU1ldGhvZCA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZU1ldGhvZCA9IG1ldGhvZDtcbiAgICBvYmplY3QuZGVmYXVsdFJlc3BvbnNlTWV0aG9kID0gY29uZmlndXJhdGlvbi5kZWZhdWx0UmVzcG9uc2VNZXRob2Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIG9iamVjdC5kZWZhdWx0UmVzcG9uc2VNZXRob2QgPSBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZU1ldGhvZDtcblxuICAvKipcbiAgICogTWV0aG9kIG92ZXJyaWRlcnMgd2lsbCBzZXQgd2hpY2ggbWV0aG9kcyBhcmUgc2VudCB2aWEgUE9TVCB3aXRoIGFuIFgtSFRUUC1NZXRob2QtT3ZlcnJpZGVcbiAgICoqL1xuICBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnMgPSBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnMgfHwgW107XG4gIG9iamVjdC5zZXRNZXRob2RPdmVycmlkZXJzID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgIGNvbnN0IG92ZXJyaWRlcnMgPSBleHRlbmQoW10sIHZhbHVlcyk7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZW5NZXRob2QoJ2RlbGV0ZScsIG92ZXJyaWRlcnMpKSB7XG4gICAgICBvdmVycmlkZXJzLnB1c2goJ3JlbW92ZScpO1xuICAgIH1cbiAgICBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnMgPSBvdmVycmlkZXJzO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uanNvbnAgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmpzb25wKSA/IGZhbHNlIDogY29uZmlndXJhdGlvbi5qc29ucDtcbiAgb2JqZWN0LnNldEpzb25wID0gZnVuY3Rpb24gKGFjdGl2ZSkge1xuICAgIGNvbmZpZ3VyYXRpb24uanNvbnAgPSBhY3RpdmU7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5pc092ZXJyaWRlbk1ldGhvZCA9IGZ1bmN0aW9uIChtZXRob2QsIHZhbHVlcykge1xuICAgIGNvbnN0IHNlYXJjaCA9IHZhbHVlcyB8fCBjb25maWd1cmF0aW9uLm1ldGhvZE92ZXJyaWRlcnM7XG4gICAgcmV0dXJuICFpc1VuZGVmaW5lZChmaW5kKHNlYXJjaCwgZnVuY3Rpb24gKG9uZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gb25lLnRvTG93ZXJDYXNlKCkgPT09IG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgVVJMIGNyZWF0b3IgdHlwZS4gRm9yIG5vdywgb25seSBQYXRoIGlzIGNyZWF0ZWQuIEluIHRoZSBmdXR1cmUgd2UnbGwgaGF2ZSBxdWVyeVBhcmFtc1xuICAgKiovXG4gIGNvbmZpZ3VyYXRpb24udXJsQ3JlYXRvciA9IGNvbmZpZ3VyYXRpb24udXJsQ3JlYXRvciB8fCAncGF0aCc7XG4gIG9iamVjdC5zZXRVcmxDcmVhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoIWhhcyhjb25maWd1cmF0aW9uLnVybENyZWF0b3JGYWN0b3J5LCBuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVUkwgUGF0aCBzZWxlY3RlZCBpc25cXCd0IHZhbGlkJyk7XG4gICAgfVxuXG4gICAgY29uZmlndXJhdGlvbi51cmxDcmVhdG9yID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogWW91IGNhbiBzZXQgdGhlIHJlc3Rhbmd1bGFyIGZpZWxkcyBoZXJlLiBUaGUgMyByZXF1aXJlZCBmaWVsZHMgZm9yIFJlc3Rhbmd1bGFyIGFyZTpcbiAgICpcbiAgICogaWQ6IElkIG9mIHRoZSBlbGVtZW50XG4gICAqIHJvdXRlOiBuYW1lIG9mIHRoZSByb3V0ZSBvZiB0aGlzIGVsZW1lbnRcbiAgICogcGFyZW50UmVzb3VyY2U6IHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCByZXNvdXJjZVxuICAgKlxuICAgKiAgQWxsIG9mIHRoaXMgZmllbGRzIGV4Y2VwdCBmb3IgaWQsIGFyZSBoYW5kbGVkIChhbmQgY3JlYXRlZCkgYnkgUmVzdGFuZ3VsYXIuIEJ5IGRlZmF1bHQsXG4gICAqICB0aGUgZmllbGQgdmFsdWVzIHdpbGwgYmUgaWQsIHJvdXRlIGFuZCBwYXJlbnRSZXNvdXJjZSByZXNwZWN0aXZlbHlcbiAgICovXG4gIGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMgPSBjb25maWd1cmF0aW9uLnJlc3Rhbmd1bGFyRmllbGRzIHx8IHtcbiAgICBpZDogJ2lkJyxcbiAgICByb3V0ZTogJ3JvdXRlJyxcbiAgICBwYXJlbnRSZXNvdXJjZTogJ3BhcmVudFJlc291cmNlJyxcbiAgICByZXN0YW5ndWxhckNvbGxlY3Rpb246ICdyZXN0YW5ndWxhckNvbGxlY3Rpb24nLFxuICAgIGNhbm5vbmljYWxJZDogJ19fY2Fubm9uaWNhbElkJyxcbiAgICBldGFnOiAncmVzdGFuZ3VsYXJFdGFnJyxcbiAgICBzZWxmTGluazogJ2hyZWYnLFxuICAgIGdldDogJ2dldCcsXG4gICAgZ2V0TGlzdDogJ2dldExpc3QnLFxuICAgIHB1dDogJ3B1dCcsXG4gICAgcG9zdDogJ3Bvc3QnLFxuICAgIHJlbW92ZTogJ3JlbW92ZScsXG4gICAgaGVhZDogJ2hlYWQnLFxuICAgIHRyYWNlOiAndHJhY2UnLFxuICAgIG9wdGlvbnM6ICdvcHRpb25zJyxcbiAgICBwYXRjaDogJ3BhdGNoJyxcbiAgICBnZXRSZXN0YW5ndWxhclVybDogJ2dldFJlc3Rhbmd1bGFyVXJsJyxcbiAgICBnZXRSZXF1ZXN0ZWRVcmw6ICdnZXRSZXF1ZXN0ZWRVcmwnLFxuICAgIHB1dEVsZW1lbnQ6ICdwdXRFbGVtZW50JyxcbiAgICBhZGRSZXN0YW5ndWxhck1ldGhvZDogJ2FkZFJlc3Rhbmd1bGFyTWV0aG9kJyxcbiAgICBnZXRQYXJlbnRMaXN0OiAnZ2V0UGFyZW50TGlzdCcsXG4gICAgY2xvbmU6ICdjbG9uZScsXG4gICAgaWRzOiAnaWRzJyxcbiAgICBodHRwQ29uZmlnOiAnXyRodHRwQ29uZmlnJyxcbiAgICByZXFQYXJhbXM6ICdyZXFQYXJhbXMnLFxuICAgIG9uZTogJ29uZScsXG4gICAgYWxsOiAnYWxsJyxcbiAgICBzZXZlcmFsOiAnc2V2ZXJhbCcsXG4gICAgb25lVXJsOiAnb25lVXJsJyxcbiAgICBhbGxVcmw6ICdhbGxVcmwnLFxuICAgIGN1c3RvbVBVVDogJ2N1c3RvbVBVVCcsXG4gICAgY3VzdG9tUEFUQ0g6ICdjdXN0b21QQVRDSCcsXG4gICAgY3VzdG9tUE9TVDogJ2N1c3RvbVBPU1QnLFxuICAgIGN1c3RvbURFTEVURTogJ2N1c3RvbURFTEVURScsXG4gICAgY3VzdG9tR0VUOiAnY3VzdG9tR0VUJyxcbiAgICBjdXN0b21HRVRMSVNUOiAnY3VzdG9tR0VUTElTVCcsXG4gICAgY3VzdG9tT3BlcmF0aW9uOiAnY3VzdG9tT3BlcmF0aW9uJyxcbiAgICBkb1BVVDogJ2RvUFVUJyxcbiAgICBkb1BBVENIOiAnZG9QQVRDSCcsXG4gICAgZG9QT1NUOiAnZG9QT1NUJyxcbiAgICBkb0RFTEVURTogJ2RvREVMRVRFJyxcbiAgICBkb0dFVDogJ2RvR0VUJyxcbiAgICBkb0dFVExJU1Q6ICdkb0dFVExJU1QnLFxuICAgIGZyb21TZXJ2ZXI6ICdmcm9tU2VydmVyJyxcbiAgICB3aXRoQ29uZmlnOiAnd2l0aENvbmZpZycsXG4gICAgd2l0aEh0dHBDb25maWc6ICd3aXRoSHR0cENvbmZpZycsXG4gICAgc2luZ2xlT25lOiAnc2luZ2xlT25lJyxcbiAgICBwbGFpbjogJ3BsYWluJyxcbiAgICBzYXZlOiAnc2F2ZScsXG4gICAgcmVzdGFuZ3VsYXJpemVkOiAncmVzdGFuZ3VsYXJpemVkJ1xuICB9O1xuICBvYmplY3Quc2V0UmVzdGFuZ3VsYXJGaWVsZHMgPSBmdW5jdGlvbiAocmVzRmllbGRzKSB7XG4gICAgY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcyA9XG4gICAgICBleHRlbmQoe30sIGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMsIHJlc0ZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5pc1Jlc3Rhbmd1bGFyaXplZCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gISFvYmpbY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhcml6ZWRdO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uc2V0RmllbGRUb0VsZW0gPSBmdW5jdGlvbiAoZmllbGQsIGVsZW0sIHZhbHVlKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IGZpZWxkLnNwbGl0KCcuJyk7XG4gICAgbGV0IGlkVmFsdWUgPSBlbGVtO1xuICAgIGVhY2goaW5pdGlhbChwcm9wZXJ0aWVzKSwgZnVuY3Rpb24gKHByb3A6IGFueSkge1xuICAgICAgaWRWYWx1ZVtwcm9wXSA9IHt9O1xuICAgICAgaWRWYWx1ZSA9IGlkVmFsdWVbcHJvcF07XG4gICAgfSk7XG4gICAgY29uc3QgaW5kZXg6IGFueSA9IGxhc3QocHJvcGVydGllcyk7XG4gICAgaWRWYWx1ZVtpbmRleF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBjb25maWd1cmF0aW9uLmdldEZpZWxkRnJvbUVsZW0gPSBmdW5jdGlvbiAoZmllbGQsIGVsZW0pIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gZmllbGQuc3BsaXQoJy4nKTtcbiAgICBsZXQgaWRWYWx1ZTogYW55ID0gZWxlbTtcbiAgICBlYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBpZiAoaWRWYWx1ZSkge1xuICAgICAgICBpZFZhbHVlID0gaWRWYWx1ZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmUoaWRWYWx1ZSk7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5zZXRJZFRvRWxlbSA9IGZ1bmN0aW9uIChlbGVtLCBpZCAvKiwgcm91dGUgKi8pIHtcbiAgICBjb25maWd1cmF0aW9uLnNldEZpZWxkVG9FbGVtKGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMuaWQsIGVsZW0sIGlkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBjb25maWd1cmF0aW9uLmdldElkRnJvbUVsZW0gPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uLmdldEZpZWxkRnJvbUVsZW0oY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5pZCwgZWxlbSk7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5pc1ZhbGlkSWQgPSBmdW5jdGlvbiAoZWxlbUlkKSB7XG4gICAgcmV0dXJuICcnICE9PSBlbGVtSWQgJiYgIWlzVW5kZWZpbmVkKGVsZW1JZCkgJiYgIWlzTnVsbChlbGVtSWQpO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uc2V0VXJsVG9FbGVtID0gZnVuY3Rpb24gKGVsZW0sIHVybCAvKiwgcm91dGUgKi8pIHtcbiAgICBjb25maWd1cmF0aW9uLnNldEZpZWxkVG9FbGVtKGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJGaWVsZHMuc2VsZkxpbmssIGVsZW0sIHVybCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5nZXRVcmxGcm9tRWxlbSA9IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0RmllbGRGcm9tRWxlbShjb25maWd1cmF0aW9uLnJlc3Rhbmd1bGFyRmllbGRzLnNlbGZMaW5rLCBlbGVtKTtcbiAgfTtcblxuICBjb25maWd1cmF0aW9uLnVzZUNhbm5vbmljYWxJZCA9IGlzVW5kZWZpbmVkKGNvbmZpZ3VyYXRpb24udXNlQ2Fubm9uaWNhbElkKSA/IGZhbHNlIDogY29uZmlndXJhdGlvbi51c2VDYW5ub25pY2FsSWQ7XG4gIG9iamVjdC5zZXRVc2VDYW5ub25pY2FsSWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBjb25maWd1cmF0aW9uLnVzZUNhbm5vbmljYWxJZCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZ2V0Q2Fubm9uaWNhbElkRnJvbUVsZW0gPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgIGNvbnN0IGNhbm5vbmljYWxJZCA9IGVsZW1bY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5jYW5ub25pY2FsSWRdO1xuICAgIGNvbnN0IGFjdHVhbElkID0gY29uZmlndXJhdGlvbi5pc1ZhbGlkSWQoY2Fubm9uaWNhbElkKSA/IGNhbm5vbmljYWxJZCA6IGNvbmZpZ3VyYXRpb24uZ2V0SWRGcm9tRWxlbShlbGVtKTtcbiAgICByZXR1cm4gYWN0dWFsSWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIFJlc3BvbnNlIHBhcnNlci4gVGhpcyBpcyB1c2VkIGluIGNhc2UgeW91ciByZXNwb25zZSBpc24ndCBkaXJlY3RseSB0aGUgZGF0YS5cbiAgICogRm9yIGV4YW1wbGUgaWYgeW91IGhhdmUgYSByZXNwb25zZSBsaWtlIHttZXRhOiB7J21ldGEnfSwgZGF0YToge25hbWU6ICdHb250byd9fVxuICAgKiB5b3UgY2FuIGV4dHJhY3QgdGhpcyBkYXRhIHdoaWNoIGlzIHRoZSBvbmUgdGhhdCBuZWVkcyB3cmFwcGluZ1xuICAgKlxuICAgKiBUaGUgUmVzcG9uc2VFeHRyYWN0b3IgaXMgYSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSByZXNwb25zZSBhbmQgdGhlIG1ldGhvZCBleGVjdXRlZC5cbiAgICovXG5cbiAgY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9ycyA9IGNvbmZpZ3VyYXRpb24ucmVzcG9uc2VJbnRlcmNlcHRvcnMgPyBbLi4uY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9yc10gOiBbXTtcblxuICBjb25maWd1cmF0aW9uLmRlZmF1bHRSZXNwb25zZUludGVyY2VwdG9yID0gZnVuY3Rpb24gKGRhdGEgLyosIG9wZXJhdGlvbiwgd2hhdCwgdXJsLCByZXNwb25zZSwgc3ViamVjdCAqLykge1xuICAgIHJldHVybiBkYXRhIHx8IHt9O1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24ucmVzcG9uc2VFeHRyYWN0b3IgPSBmdW5jdGlvbiAoZGF0YSwgb3BlcmF0aW9uLCB3aGF0LCB1cmwsIHJlc3BvbnNlLCBzdWJqZWN0KSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gY2xvbmUoY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9ycyk7XG4gICAgaW50ZXJjZXB0b3JzLnB1c2goY29uZmlndXJhdGlvbi5kZWZhdWx0UmVzcG9uc2VJbnRlcmNlcHRvcik7XG4gICAgbGV0IHRoZURhdGEgPSBkYXRhO1xuICAgIGVhY2goaW50ZXJjZXB0b3JzLCBmdW5jdGlvbiAoaW50ZXJjZXB0b3I6IGFueSkge1xuICAgICAgdGhlRGF0YSA9IGludGVyY2VwdG9yKHRoZURhdGEsIG9wZXJhdGlvbixcbiAgICAgICAgd2hhdCwgdXJsLCByZXNwb25zZSwgc3ViamVjdCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoZURhdGE7XG4gIH07XG5cbiAgb2JqZWN0LmFkZFJlc3BvbnNlSW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoZXh0cmFjdG9yKSB7XG4gICAgY29uZmlndXJhdGlvbi5yZXNwb25zZUludGVyY2VwdG9ycy5wdXNoKGV4dHJhY3Rvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5lcnJvckludGVyY2VwdG9ycyA9IGNvbmZpZ3VyYXRpb24uZXJyb3JJbnRlcmNlcHRvcnMgPyBbLi4uY29uZmlndXJhdGlvbi5lcnJvckludGVyY2VwdG9yc10gOiBbXTtcbiAgb2JqZWN0LmFkZEVycm9ySW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICBjb25maWd1cmF0aW9uLmVycm9ySW50ZXJjZXB0b3JzID0gW2ludGVyY2VwdG9yLCAuLi5jb25maWd1cmF0aW9uLmVycm9ySW50ZXJjZXB0b3JzXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBvYmplY3Quc2V0UmVzcG9uc2VJbnRlcmNlcHRvciA9IG9iamVjdC5hZGRSZXNwb25zZUludGVyY2VwdG9yO1xuICBvYmplY3Quc2V0UmVzcG9uc2VFeHRyYWN0b3IgPSBvYmplY3QuYWRkUmVzcG9uc2VJbnRlcmNlcHRvcjtcbiAgb2JqZWN0LnNldEVycm9ySW50ZXJjZXB0b3IgPSBvYmplY3QuYWRkRXJyb3JJbnRlcmNlcHRvcjtcblxuICAvKipcbiAgICogUmVzcG9uc2UgaW50ZXJjZXB0b3IgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHJlc29sdmluZyBwcm9taXNlcy5cbiAgICovXG5cblxuICAvKipcbiAgICogUmVxdWVzdCBpbnRlcmNlcHRvciBpcyBjYWxsZWQgYmVmb3JlIHNlbmRpbmcgYW4gb2JqZWN0IHRvIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBjb25maWd1cmF0aW9uLnJlcXVlc3RJbnRlcmNlcHRvcnMgPSBjb25maWd1cmF0aW9uLnJlcXVlc3RJbnRlcmNlcHRvcnMgPyBbLi4uY29uZmlndXJhdGlvbi5yZXF1ZXN0SW50ZXJjZXB0b3JzXSA6IFtdO1xuXG4gIGNvbmZpZ3VyYXRpb24uZGVmYXVsdEludGVyY2VwdG9yID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wZXJhdGlvbiwgcGF0aCwgdXJsLCBoZWFkZXJzLCBwYXJhbXMsIGh0dHBDb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgIGh0dHBDb25maWc6IGh0dHBDb25maWdcbiAgICB9O1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24uZnVsbFJlcXVlc3RJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcGVyYXRpb24sIHBhdGgsIHVybCwgaGVhZGVycywgcGFyYW1zLCBodHRwQ29uZmlnKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gY2xvbmUoY29uZmlndXJhdGlvbi5yZXF1ZXN0SW50ZXJjZXB0b3JzKTtcbiAgICBjb25zdCBkZWZhdWx0UmVxdWVzdCA9IGNvbmZpZ3VyYXRpb24uZGVmYXVsdEludGVyY2VwdG9yKGVsZW1lbnQsIG9wZXJhdGlvbiwgcGF0aCwgdXJsLCBoZWFkZXJzLCBwYXJhbXMsIGh0dHBDb25maWcpO1xuICAgIHJldHVybiByZWR1Y2UoaW50ZXJjZXB0b3JzLCBmdW5jdGlvbiAocmVxdWVzdDogYW55LCBpbnRlcmNlcHRvcjogYW55KSB7XG5cbiAgICAgIGNvbnN0IHJldHVybkludGVyY2VwdG9yOiBhbnkgPSBpbnRlcmNlcHRvcihcbiAgICAgICAgcmVxdWVzdC5lbGVtZW50LFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHVybCxcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICByZXF1ZXN0LnBhcmFtcyxcbiAgICAgICAgcmVxdWVzdC5odHRwQ29uZmlnXG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4dGVuZChyZXF1ZXN0LCByZXR1cm5JbnRlcmNlcHRvcik7XG4gICAgfSwgZGVmYXVsdFJlcXVlc3QpO1xuICB9O1xuXG4gIG9iamVjdC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IgPSBmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICBjb25maWd1cmF0aW9uLnJlcXVlc3RJbnRlcmNlcHRvcnMucHVzaChmdW5jdGlvbiAoZWxlbSwgb3BlcmF0aW9uLCBwYXRoLCB1cmwsIGhlYWRlcnMsIHBhcmFtcywgaHR0cENvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIGVsZW1lbnQ6IGludGVyY2VwdG9yKGVsZW0sIG9wZXJhdGlvbiwgcGF0aCwgdXJsKSxcbiAgICAgICAgaHR0cENvbmZpZzogaHR0cENvbmZpZ1xuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBvYmplY3Quc2V0UmVxdWVzdEludGVyY2VwdG9yID0gb2JqZWN0LmFkZFJlcXVlc3RJbnRlcmNlcHRvcjtcblxuICBvYmplY3QuYWRkRnVsbFJlcXVlc3RJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChpbnRlcmNlcHRvcikge1xuICAgIGNvbmZpZ3VyYXRpb24ucmVxdWVzdEludGVyY2VwdG9ycy5wdXNoKGludGVyY2VwdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBvYmplY3Quc2V0RnVsbFJlcXVlc3RJbnRlcmNlcHRvciA9IG9iamVjdC5hZGRGdWxsUmVxdWVzdEludGVyY2VwdG9yO1xuXG4gIGNvbmZpZ3VyYXRpb24ub25CZWZvcmVFbGVtUmVzdGFuZ3VsYXJpemVkID0gY29uZmlndXJhdGlvbi5vbkJlZm9yZUVsZW1SZXN0YW5ndWxhcml6ZWQgfHwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbTtcbiAgfTtcbiAgb2JqZWN0LnNldE9uQmVmb3JlRWxlbVJlc3Rhbmd1bGFyaXplZCA9IGZ1bmN0aW9uIChwb3N0KSB7XG4gICAgY29uZmlndXJhdGlvbi5vbkJlZm9yZUVsZW1SZXN0YW5ndWxhcml6ZWQgPSBwb3N0O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIG9iamVjdC5zZXRSZXN0YW5ndWxhcml6ZVByb21pc2VJbnRlcmNlcHRvciA9IGZ1bmN0aW9uIChpbnRlcmNlcHRvcikge1xuICAgIGNvbmZpZ3VyYXRpb24ucmVzdGFuZ3VsYXJpemVQcm9taXNlSW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFuIGVsZW1lbnQgaGFzIGJlZW4gXCJSZXN0YW5ndWxhcml6ZWRcIi5cbiAgICpcbiAgICogSXQgcmVjZWl2ZXMgdGhlIGVsZW1lbnQsIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGl0J3MgYW4gZWxlbWVudCBvciBhIGNvbGxlY3Rpb25cbiAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBtb2RlbFxuICAgKlxuICAgKi9cbiAgY29uZmlndXJhdGlvbi5vbkVsZW1SZXN0YW5ndWxhcml6ZWQgPSBjb25maWd1cmF0aW9uLm9uRWxlbVJlc3Rhbmd1bGFyaXplZCB8fCBmdW5jdGlvbiAoZWxlbSkge1xuICAgIHJldHVybiBlbGVtO1xuICB9O1xuICBvYmplY3Quc2V0T25FbGVtUmVzdGFuZ3VsYXJpemVkID0gZnVuY3Rpb24gKHBvc3QpIHtcbiAgICBjb25maWd1cmF0aW9uLm9uRWxlbVJlc3Rhbmd1bGFyaXplZCA9IHBvc3Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5zaG91bGRTYXZlUGFyZW50ID0gY29uZmlndXJhdGlvbi5zaG91bGRTYXZlUGFyZW50IHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgb2JqZWN0LnNldFBhcmVudGxlc3MgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgY29uZmlndXJhdGlvbi5zaG91bGRTYXZlUGFyZW50ID0gZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgIHJldHVybiAhaW5jbHVkZXModmFsdWVzLCByb3V0ZSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNCb29sZWFuKHZhbHVlcykpIHtcbiAgICAgIGNvbmZpZ3VyYXRpb24uc2hvdWxkU2F2ZVBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZXM7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBsZXRzIHlvdSBzZXQgYSBzdWZmaXggdG8gZXZlcnkgcmVxdWVzdC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdXIgYXBpIHJlcXVpcmVzIHRoYXQgZm9yIEpTb24gcmVxdWVzdHMgeW91IGRvIC91c2Vycy8xMjMuanNvbiwgeW91IGNhbiBzZXQgdGhhdFxuICAgKiBpbiBoZXJlLlxuICAgKlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc3VmZml4IGlzIG51bGxcbiAgICovXG4gIGNvbmZpZ3VyYXRpb24uc3VmZml4ID0gaXNVbmRlZmluZWQoY29uZmlndXJhdGlvbi5zdWZmaXgpID8gbnVsbCA6IGNvbmZpZ3VyYXRpb24uc3VmZml4O1xuICBvYmplY3Quc2V0UmVxdWVzdFN1ZmZpeCA9IGZ1bmN0aW9uIChuZXdTdWZmaXgpIHtcbiAgICBjb25maWd1cmF0aW9uLnN1ZmZpeCA9IG5ld1N1ZmZpeDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGVsZW1lbnQgdHJhbnNmb3JtZXJzIGZvciBjZXJ0YWluIHJvdXRlcy5cbiAgICovXG4gIGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtZXJzID0gY29uZmlndXJhdGlvbi50cmFuc2Zvcm1lcnMgfHwge307XG4gIG9iamVjdC5hZGRFbGVtZW50VHJhbnNmb3JtZXIgPSBmdW5jdGlvbiAodHlwZSwgc2Vjb25kQXJnLCB0aGlyZEFyZykge1xuICAgIGxldCBpc0NvbGxlY3Rpb24gPSBudWxsO1xuICAgIGxldCB0cmFuc2Zvcm1lciA9IG51bGw7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHRyYW5zZm9ybWVyID0gc2Vjb25kQXJnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFuc2Zvcm1lciA9IHRoaXJkQXJnO1xuICAgICAgaXNDb2xsZWN0aW9uID0gc2Vjb25kQXJnO1xuICAgIH1cblxuICAgIGxldCB0eXBlVHJhbnNmb3JtZXJzID0gY29uZmlndXJhdGlvbi50cmFuc2Zvcm1lcnNbdHlwZV07XG4gICAgaWYgKCF0eXBlVHJhbnNmb3JtZXJzKSB7XG4gICAgICB0eXBlVHJhbnNmb3JtZXJzID0gY29uZmlndXJhdGlvbi50cmFuc2Zvcm1lcnNbdHlwZV0gPSBbXTtcbiAgICB9XG5cbiAgICB0eXBlVHJhbnNmb3JtZXJzLnB1c2goZnVuY3Rpb24gKGNvbGwsIGVsZW0pIHtcbiAgICAgIGlmIChpc051bGwoaXNDb2xsZWN0aW9uKSB8fCAoY29sbCA9PT0gaXNDb2xsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIoZWxlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH07XG5cbiAgb2JqZWN0LmV4dGVuZENvbGxlY3Rpb24gPSBmdW5jdGlvbiAocm91dGUsIGZuKSB7XG4gICAgcmV0dXJuIG9iamVjdC5hZGRFbGVtZW50VHJhbnNmb3JtZXIocm91dGUsIHRydWUsIGZuKTtcbiAgfTtcblxuICBvYmplY3QuZXh0ZW5kTW9kZWwgPSBmdW5jdGlvbiAocm91dGUsIGZuKSB7XG4gICAgcmV0dXJuIG9iamVjdC5hZGRFbGVtZW50VHJhbnNmb3JtZXIocm91dGUsIGZhbHNlLCBmbik7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi50cmFuc2Zvcm1FbGVtID0gZnVuY3Rpb24gKGVsZW0sIGlzQ29sbGVjdGlvbiwgcm91dGUsIFJlc3Rhbmd1bGFyLCBmb3JjZSkge1xuICAgIGlmICghZm9yY2UgJiYgIWNvbmZpZ3VyYXRpb24udHJhbnNmb3JtTG9jYWxFbGVtZW50cyAmJiAhZWxlbVtjb25maWd1cmF0aW9uLnJlc3Rhbmd1bGFyRmllbGRzLmZyb21TZXJ2ZXJdKSB7XG4gICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgY29uc3QgdHlwZVRyYW5zZm9ybWVycyA9IGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtZXJzW3JvdXRlXTtcbiAgICBsZXQgY2hhbmdlZEVsZW0gPSBlbGVtO1xuICAgIGlmICh0eXBlVHJhbnNmb3JtZXJzKSB7XG4gICAgICBlYWNoKHR5cGVUcmFuc2Zvcm1lcnMsIGZ1bmN0aW9uICh0cmFuc2Zvcm1lcjogKGlzQ29sbGVjdGlvbjogYm9vbGVhbiwgY2hhbmdlZEVsZW06IGFueSkgPT4gYW55KSB7XG4gICAgICAgIGNoYW5nZWRFbGVtID0gdHJhbnNmb3JtZXIoaXNDb2xsZWN0aW9uLCBjaGFuZ2VkRWxlbSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24ub25FbGVtUmVzdGFuZ3VsYXJpemVkKGNoYW5nZWRFbGVtLCBpc0NvbGxlY3Rpb24sIHJvdXRlLCBSZXN0YW5ndWxhcik7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi50cmFuc2Zvcm1Mb2NhbEVsZW1lbnRzID0gaXNVbmRlZmluZWQoY29uZmlndXJhdGlvbi50cmFuc2Zvcm1Mb2NhbEVsZW1lbnRzKSA/XG4gICAgZmFsc2UgOlxuICAgIGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtTG9jYWxFbGVtZW50cztcblxuICBvYmplY3Quc2V0VHJhbnNmb3JtT25seVNlcnZlckVsZW1lbnRzID0gZnVuY3Rpb24gKGFjdGl2ZSkge1xuICAgIGNvbmZpZ3VyYXRpb24udHJhbnNmb3JtTG9jYWxFbGVtZW50cyA9ICFhY3RpdmU7XG4gIH07XG5cbiAgY29uZmlndXJhdGlvbi5mdWxsUmVzcG9uc2UgPSBpc1VuZGVmaW5lZChjb25maWd1cmF0aW9uLmZ1bGxSZXNwb25zZSkgPyBmYWxzZSA6IGNvbmZpZ3VyYXRpb24uZnVsbFJlc3BvbnNlO1xuICBvYmplY3Quc2V0RnVsbFJlc3BvbnNlID0gZnVuY3Rpb24gKGZ1bGwpIHtcbiAgICBjb25maWd1cmF0aW9uLmZ1bGxSZXNwb25zZSA9IGZ1bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cblxuICAvLyBJbnRlcm5hbCB2YWx1ZXMgYW5kIGZ1bmN0aW9uc1xuICBjb25maWd1cmF0aW9uLnVybENyZWF0b3JGYWN0b3J5ID0ge307XG5cbiAgLyoqXG4gICAqIEJhc2UgVVJMIENyZWF0b3IuIEJhc2UgcHJvdG90eXBlIGZvciBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gaXRcbiAgICoqL1xuXG4gIGNvbnN0IEJhc2VDcmVhdG9yID0gZnVuY3Rpb24gKCkge1xuICB9O1xuXG4gIEJhc2VDcmVhdG9yLnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQmFzZUNyZWF0b3IucHJvdG90eXBlLnBhcmVudHNBcnJheSA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBwYXJlbnRzLnB1c2goY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudFt0aGlzLmNvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV07XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRzLnJldmVyc2UoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBSZXN0YW5ndWxhclJlc291cmNlKGNvbmZpZywgJGh0dHAsIHVybCwgY29uZmlndXJlcikge1xuICAgIGNvbnN0IHJlc291cmNlID0ge307XG4gICAgZWFjaChrZXlzKGNvbmZpZ3VyZXIpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ3VyZXJba2V5XTtcblxuICAgICAgLy8gQWRkIGRlZmF1bHQgcGFyYW1ldGVyc1xuICAgICAgdmFsdWUucGFyYW1zID0gZXh0ZW5kKHt9LCB2YWx1ZS5wYXJhbXMsIGNvbmZpZy5kZWZhdWx0UmVxdWVzdFBhcmFtc1t2YWx1ZS5tZXRob2QudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgPyBpZiBubyBwYXJhbXMgYXJlIHRoZXJlXG4gICAgICBpZiAoaXNFbXB0eSh2YWx1ZS5wYXJhbXMpKSB7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5wYXJhbXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuaXNTYWZlKHZhbHVlLm1ldGhvZCkpIHtcblxuICAgICAgICByZXNvdXJjZVtrZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdENvbmZpZyA9IGV4dGVuZCh2YWx1ZSwge1xuICAgICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gJGh0dHAuY3JlYXRlUmVxdWVzdChyZXN1bHRDb25maWcpO1xuICAgICAgICB9O1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHJlc291cmNlW2tleV0gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdENvbmZpZyA9IGV4dGVuZCh2YWx1ZSwge1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuICRodHRwLmNyZWF0ZVJlcXVlc3QocmVzdWx0Q29uZmlnKTtcbiAgICAgICAgfTtcblxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgQmFzZUNyZWF0b3IucHJvdG90eXBlLnJlc291cmNlID0gZnVuY3Rpb24gKGN1cnJlbnQsICRodHRwLCBsb2NhbEh0dHBDb25maWcsIGNhbGxIZWFkZXJzLCBjYWxsUGFyYW1zLCB3aGF0LCBldGFnLCBvcGVyYXRpb24pIHtcbiAgICBjb25zdCBwYXJhbXMgPSBkZWZhdWx0cyhjYWxsUGFyYW1zIHx8IHt9LCB0aGlzLmNvbmZpZy5kZWZhdWx0UmVxdWVzdFBhcmFtcy5jb21tb24pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBkZWZhdWx0cyhjYWxsSGVhZGVycyB8fCB7fSwgdGhpcy5jb25maWcuZGVmYXVsdEhlYWRlcnMpO1xuXG4gICAgaWYgKGV0YWcpIHtcbiAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1NhZmUob3BlcmF0aW9uKSkge1xuICAgICAgICBoZWFkZXJzWydJZi1NYXRjaCddID0gZXRhZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlcnNbJ0lmLU5vbmUtTWF0Y2gnXSA9IGV0YWc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHVybCA9IHRoaXMuYmFzZShjdXJyZW50KTtcblxuICAgIGlmICh3aGF0KSB7XG4gICAgICBsZXQgYWRkID0gJyc7XG4gICAgICBpZiAoIS9cXC8kLy50ZXN0KHVybCkpIHtcbiAgICAgICAgYWRkICs9ICcvJztcbiAgICAgIH1cbiAgICAgIGFkZCArPSB3aGF0O1xuICAgICAgdXJsICs9IGFkZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuc3VmZml4ICYmXG4gICAgICB1cmwuaW5kZXhPZih0aGlzLmNvbmZpZy5zdWZmaXgsIHVybC5sZW5ndGggLSB0aGlzLmNvbmZpZy5zdWZmaXgubGVuZ3RoKSA9PT0gLTEgJiYgIXRoaXMuY29uZmlnLmdldFVybEZyb21FbGVtKGN1cnJlbnQpKSB7XG4gICAgICB1cmwgKz0gdGhpcy5jb25maWcuc3VmZml4O1xuICAgIH1cblxuICAgIGN1cnJlbnRbdGhpcy5jb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaHR0cENvbmZpZ10gPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gUmVzdGFuZ3VsYXJSZXNvdXJjZSh0aGlzLmNvbmZpZywgJGh0dHAsIHVybCwge1xuICAgICAgZ2V0TGlzdDogdGhpcy5jb25maWcud2l0aEh0dHBWYWx1ZXMobG9jYWxIdHRwQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH0pLFxuXG4gICAgICBnZXQ6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAganNvbnA6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ2pzb25wJyxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH0pLFxuXG4gICAgICBwdXQ6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgcG9zdDogdGhpcy5jb25maWcud2l0aEh0dHBWYWx1ZXMobG9jYWxIdHRwQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgcmVtb3ZlOiB0aGlzLmNvbmZpZy53aXRoSHR0cFZhbHVlcyhsb2NhbEh0dHBDb25maWcsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgICAgfSksXG5cbiAgICAgIGhlYWQ6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgICAgfSksXG5cbiAgICAgIHRyYWNlOiB0aGlzLmNvbmZpZy53aXRoSHR0cFZhbHVlcyhsb2NhbEh0dHBDb25maWcsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6ICdUUkFDRScsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgb3B0aW9uczogdGhpcy5jb25maWcud2l0aEh0dHBWYWx1ZXMobG9jYWxIdHRwQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiAnT1BUSU9OUycsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KSxcblxuICAgICAgcGF0Y2g6IHRoaXMuY29uZmlnLndpdGhIdHRwVmFsdWVzKGxvY2FsSHR0cENvbmZpZyxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIFBhdGggVVJMIGNyZWF0b3IuIEl0IHVzZXMgUGF0aCB0byBzaG93IEhpZXJhcmNoeSBpbiB0aGUgUmVzdCBBUEkuXG4gICAqIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSBhbiBBY2NvdW50IHRoYXQgdGhlbiBoYXMgYSBzZXQgb2YgQnVpbGRpbmdzLCBhIFVSTCB0byBhIGJ1aWxkaW5nXG4gICAqIHdvdWxkIGJlIC9hY2NvdW50cy8xMjMvYnVpbGRpbmdzLzQ1NlxuICAgKiovXG4gIGNvbnN0IFBhdGggPSBmdW5jdGlvbiAoKSB7XG4gIH07XG5cbiAgUGF0aC5wcm90b3R5cGUgPSBuZXcgQmFzZUNyZWF0b3IoKTtcblxuICBQYXRoLnByb3RvdHlwZS5ub3JtYWxpemVVcmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgY29uc3QgcGFydHMgPSAvKCg/Omh0dHBbc10/Oik/XFwvXFwvKT8oLiopPy8uZXhlYyh1cmwpO1xuICAgIHBhcnRzWzJdID0gcGFydHNbMl0ucmVwbGFjZSgvW1xcXFxcXC9dKy9nLCAnLycpO1xuICAgIHJldHVybiAodHlwZW9mIHBhcnRzWzFdICE9PSAndW5kZWZpbmVkJykgPyBwYXJ0c1sxXSArIHBhcnRzWzJdIDogcGFydHNbMl07XG4gIH07XG5cbiAgUGF0aC5wcm90b3R5cGUuYmFzZSA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgY29uc3QgX190aGlzID0gdGhpcztcbiAgICByZXR1cm4gcmVkdWNlKHRoaXMucGFyZW50c0FycmF5KGN1cnJlbnQpLCBmdW5jdGlvbiAoYWN1bTogYW55LCBlbGVtOiBhbnkpIHtcbiAgICAgIGxldCBlbGVtVXJsO1xuICAgICAgY29uc3QgZWxlbVNlbGZMaW5rID0gX190aGlzLmNvbmZpZy5nZXRVcmxGcm9tRWxlbShlbGVtKTtcbiAgICAgIGlmIChlbGVtU2VsZkxpbmspIHtcbiAgICAgICAgaWYgKF9fdGhpcy5jb25maWcuaXNBYnNvbHV0ZVVybChlbGVtU2VsZkxpbmspKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1TZWxmTGluaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtVXJsID0gZWxlbVNlbGZMaW5rO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtVXJsID0gZWxlbVtfX3RoaXMuY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJvdXRlXTtcblxuICAgICAgICBpZiAoZWxlbVtfX3RoaXMuY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBpZHMgPSBlbGVtW19fdGhpcy5jb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaWRzXTtcbiAgICAgICAgICBpZiAoaWRzKSB7XG4gICAgICAgICAgICBlbGVtVXJsICs9ICcvJyArIGlkcy5qb2luKCcsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBlbGVtSWQ6IGFueTtcbiAgICAgICAgICBpZiAoX190aGlzLmNvbmZpZy51c2VDYW5ub25pY2FsSWQpIHtcbiAgICAgICAgICAgIGVsZW1JZCA9IF9fdGhpcy5jb25maWcuZ2V0Q2Fubm9uaWNhbElkRnJvbUVsZW0oZWxlbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1JZCA9IF9fdGhpcy5jb25maWcuZ2V0SWRGcm9tRWxlbShlbGVtKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc1ZhbGlkSWQoZWxlbUlkKSAmJiAhZWxlbS5zaW5nbGVPbmUpIHtcbiAgICAgICAgICAgIGVsZW1VcmwgKz0gJy8nICsgKF9fdGhpcy5jb25maWcuZW5jb2RlSWRzID8gZW5jb2RlVVJJQ29tcG9uZW50KGVsZW1JZCkgOiBlbGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN1bSA9IGFjdW0ucmVwbGFjZSgvXFwvJC8sICcnKSArICcvJyArIGVsZW1Vcmw7XG4gICAgICByZXR1cm4gX190aGlzLm5vcm1hbGl6ZVVybChhY3VtKTtcblxuICAgIH0sIHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICB9O1xuXG5cbiAgUGF0aC5wcm90b3R5cGUuZmV0Y2hVcmwgPSBmdW5jdGlvbiAoY3VycmVudCwgd2hhdCkge1xuICAgIGxldCBiYXNlVXJsID0gdGhpcy5iYXNlKGN1cnJlbnQpO1xuICAgIGlmICh3aGF0KSB7XG4gICAgICBiYXNlVXJsICs9ICcvJyArIHdoYXQ7XG4gICAgfVxuICAgIHJldHVybiBiYXNlVXJsO1xuICB9O1xuXG4gIFBhdGgucHJvdG90eXBlLmZldGNoUmVxdWVzdGVkVXJsID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdoYXQpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmZldGNoVXJsKGN1cnJlbnQsIHdoYXQpO1xuICAgIGNvbnN0IHBhcmFtcyA9IGN1cnJlbnRbY29uZmlndXJhdGlvbi5yZXN0YW5ndWxhckZpZWxkcy5yZXFQYXJhbXNdO1xuXG4gICAgLy8gRnJvbSBoZXJlIG9uIGFuZCB1bnRpbCB0aGUgZW5kIG9mIGZldGNoUmVxdWVzdGVkVXJsLFxuICAgIC8vIHRoZSBjb2RlIGhhcyBiZWVuIGtpbmRseSBib3Jyb3dlZCBmcm9tIGFuZ3VsYXIuanNcbiAgICAvLyBUaGUgcmVhc29uIGZvciBzdWNoIGNvZGUgYmxvYXRpbmcgaXMgY29oZXJlbmNlOlxuICAgIC8vICAgSWYgdGhlIHVzZXIgd2VyZSB0byB1c2UgdGhpcyBmb3IgY2FjaGUgbWFuYWdlbWVudCwgdGhlXG4gICAgLy8gICBzZXJpYWxpemF0aW9uIG9mIHBhcmFtZXRlcnMgd291bGQgbmVlZCB0byBiZSBpZGVudGljYWxcbiAgICAvLyAgIHRvIHRoZSBvbmUgZG9uZSBieSBhbmd1bGFyIGZvciBjYWNoZSBrZXlzIHRvIG1hdGNoLlxuICAgIGZ1bmN0aW9uIHNvcnRlZEtleXMob2JqKSB7XG4gICAgICBjb25zdCByZXN1bHRLZXlzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgcmVzdWx0S2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRLZXlzLnNvcnQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JFYWNoU29ydGVkKG9iaiwgaXRlcmF0b3I/LCBjb250ZXh0Pykge1xuICAgICAgY29uc3Qgc29ydGVkS2V5c0FycmF5ID0gc29ydGVkS2V5cyhvYmopO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRLZXlzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbc29ydGVkS2V5c0FycmF5W2ldXSwgc29ydGVkS2V5c0FycmF5W2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3J0ZWRLZXlzQXJyYXk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5jb2RlVXJpUXVlcnkodmFsLCBwY3RFbmNvZGVTcGFjZXM/KSB7XG4gICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbClcbiAgICAgIC5yZXBsYWNlKC8lNDAvZ2ksICdAJylcbiAgICAgIC5yZXBsYWNlKC8lM0EvZ2ksICc6JylcbiAgICAgIC5yZXBsYWNlKC8lMjQvZywgJyQnKVxuICAgICAgLnJlcGxhY2UoLyUyQy9naSwgJywnKVxuICAgICAgLnJlcGxhY2UoLyUyMC9nLCAocGN0RW5jb2RlU3BhY2VzID8gJyUyMCcgOiAnKycpKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcykge1xuICAgICAgcmV0dXJuIHVybCArICh0aGlzLmNvbmZpZy5zdWZmaXggfHwgJycpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yRWFjaFNvcnRlZChwYXJhbXMsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH1cblxuICAgICAgZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5KSArICc9JyArIGVuY29kZVVyaVF1ZXJ5KHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVybCArICh0aGlzLmNvbmZpZy5zdWZmaXggfHwgJycpICsgKCh1cmwuaW5kZXhPZignPycpID09PSAtMSkgPyAnPycgOiAnJicpICsgcGFydHMuam9pbignJicpO1xuICB9O1xuXG4gIGNvbmZpZ3VyYXRpb24udXJsQ3JlYXRvckZhY3RvcnkucGF0aCA9IFBhdGg7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIEluamVjdG9yLCBPcHRpb25hbCwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnY29yZS1qcy9mbi9vYmplY3QnO1xuaW1wb3J0IHtcbiAgbWFwLFxuICBiaW5kLFxuICB1bmlvbixcbiAgdmFsdWVzLFxuICBwaWNrLFxuICBpc0VtcHR5LFxuICBpc0Z1bmN0aW9uLFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIGlzQXJyYXksXG4gIGlzT2JqZWN0LFxuICBleHRlbmQsXG4gIGVhY2gsXG4gIGV2ZXJ5LFxuICBvbWl0LFxuICBnZXQsXG4gIGRlZmF1bHRzLFxuICBjbG9uZSxcbiAgaW5jbHVkZXNcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJFU1RBTkdVTEFSIH0gZnJvbSAnLi9uZ3gtcmVzdGFuZ3VsYXIuY29uZmlnJztcbmltcG9ydCB7IFJlc3Rhbmd1bGFySHR0cCB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyLWh0dHAnO1xuaW1wb3J0IHsgUmVzdGFuZ3VsYXJDb25maWd1cmVyIH0gZnJvbSAnLi9uZ3gtcmVzdGFuZ3VsYXItY29uZmlnLmZhY3RvcnknO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVzdGFuZ3VsYXIge1xuICBwcm92aWRlcjoge1xuICAgIHNldEJhc2VVcmw6IGFueSxcbiAgICBzZXREZWZhdWx0SGVhZGVyczogYW55LFxuICAgIGNvbmZpZ3VyYXRpb246IGFueSxcbiAgICBzZXRTZWxmTGlua0Fic29sdXRlVXJsOiBhbnksXG4gICAgc2V0RXh0cmFGaWVsZHM6IGFueSxcbiAgICBzZXREZWZhdWx0SHR0cEZpZWxkczogYW55LFxuICAgIHNldFBsYWluQnlEZWZhdWx0OiBhbnksXG4gICAgc2V0RW5jb2RlSWRzOiBhbnksXG4gICAgc2V0RGVmYXVsdFJlcXVlc3RQYXJhbXM6IGFueSxcbiAgICByZXF1ZXN0UGFyYW1zOiBhbnksXG4gICAgZGVmYXVsdEhlYWRlcnM6IGFueSxcbiAgICBzZXREZWZhdWx0UmVzcG9uc2VNZXRob2Q6IGFueSxcbiAgICBkZWZhdWx0UmVzcG9uc2VNZXRob2Q6IGFueSxcbiAgICBzZXRNZXRob2RPdmVycmlkZXJzOiBhbnksXG4gICAgc2V0SnNvbnA6IGFueSxcbiAgICBzZXRVcmxDcmVhdG9yOiBhbnksXG4gICAgc2V0UmVzdGFuZ3VsYXJGaWVsZHM6IGFueSxcbiAgICBzZXRVc2VDYW5ub25pY2FsSWQ6IGFueSxcbiAgICBhZGRSZXNwb25zZUludGVyY2VwdG9yOiBhbnksXG4gICAgYWRkRXJyb3JJbnRlcmNlcHRvcjogYW55LFxuICAgIHNldFJlc3BvbnNlSW50ZXJjZXB0b3I6IGFueSxcbiAgICBzZXRSZXNwb25zZUV4dHJhY3RvcjogYW55LFxuICAgIHNldEVycm9ySW50ZXJjZXB0b3I6IGFueSxcbiAgICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3I6IGFueSxcbiAgICBzZXRSZXF1ZXN0SW50ZXJjZXB0b3I6IGFueSxcbiAgICBzZXRGdWxsUmVxdWVzdEludGVyY2VwdG9yOiBhbnksXG4gICAgYWRkRnVsbFJlcXVlc3RJbnRlcmNlcHRvcjogYW55LFxuICAgIHNldE9uQmVmb3JlRWxlbVJlc3Rhbmd1bGFyaXplZDogYW55LFxuICAgIHNldFJlc3Rhbmd1bGFyaXplUHJvbWlzZUludGVyY2VwdG9yOiBhbnksXG4gICAgc2V0T25FbGVtUmVzdGFuZ3VsYXJpemVkOiBhbnksXG4gICAgc2V0UGFyZW50bGVzczogYW55LFxuICAgIHNldFJlcXVlc3RTdWZmaXg6IGFueSxcbiAgICBhZGRFbGVtZW50VHJhbnNmb3JtZXI6IGFueSxcbiAgICBleHRlbmRDb2xsZWN0aW9uOiBhbnksXG4gICAgZXh0ZW5kTW9kZWw6IGFueSxcbiAgICBzZXRUcmFuc2Zvcm1Pbmx5U2VydmVyRWxlbWVudHM6IGFueSxcbiAgICBzZXRGdWxsUmVzcG9uc2U6IGFueSxcbiAgICAkZ2V0OiBhbnlcbiAgfTtcbiAgYWRkRWxlbWVudFRyYW5zZm9ybWVyOiBhbnk7XG4gIGV4dGVuZENvbGxlY3Rpb246IGFueTtcbiAgZXh0ZW5kTW9kZWw6IGFueTtcbiAgY29weTtcbiAgY29uZmlndXJhdGlvbjtcbiAgc2VydmljZTtcbiAgaWQ7XG4gIHJvdXRlO1xuICBwYXJlbnRSZXNvdXJjZTtcbiAgcmVzdGFuZ3VsYXJDb2xsZWN0aW9uO1xuICBjYW5ub25pY2FsSWQ7XG4gIGV0YWc7XG4gIHNlbGZMaW5rO1xuICBnZXQ7XG4gIGdldExpc3Q7XG4gIHB1dDtcbiAgcG9zdDtcbiAgcmVtb3ZlO1xuICBoZWFkO1xuICB0cmFjZTtcbiAgb3B0aW9ucztcbiAgcGF0Y2g7XG4gIGdldFJlc3Rhbmd1bGFyVXJsO1xuICBnZXRSZXF1ZXN0ZWRVcmw7XG4gIHB1dEVsZW1lbnQ7XG4gIGFkZFJlc3Rhbmd1bGFyTWV0aG9kO1xuICBnZXRQYXJlbnRMaXN0O1xuICBjbG9uZTtcbiAgaWRzO1xuICBodHRwQ29uZmlnO1xuICByZXFQYXJhbXM7XG4gIG9uZTtcbiAgYWxsO1xuICBzZXZlcmFsO1xuICBvbmVVcmw7XG4gIGFsbFVybDtcbiAgY3VzdG9tUFVUO1xuICBjdXN0b21QQVRDSDtcbiAgY3VzdG9tUE9TVDtcbiAgY3VzdG9tREVMRVRFO1xuICBjdXN0b21HRVQ7XG4gIGN1c3RvbUdFVExJU1Q7XG4gIGN1c3RvbU9wZXJhdGlvbjtcbiAgZG9QVVQ7XG4gIGRvUEFUQ0g7XG4gIGRvUE9TVDtcbiAgZG9ERUxFVEU7XG4gIGRvR0VUO1xuICBkb0dFVExJU1Q7XG4gIGZyb21TZXJ2ZXI7XG4gIHdpdGhDb25maWc7XG4gIHdpdGhIdHRwQ29uZmlnO1xuICBzaW5nbGVPbmU7XG4gIHBsYWluO1xuICBzYXZlO1xuICByZXN0YW5ndWxhcml6ZWQ7XG4gIHJlc3Rhbmd1bGFyaXplRWxlbWVudDtcbiAgcmVzdGFuZ3VsYXJpemVDb2xsZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUkVTVEFOR1VMQVIpIHB1YmxpYyBjb25maWdPYmosXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBodHRwOiBSZXN0YW5ndWxhckh0dHBcbiAgKSB7XG4gICAgdGhpcy5wcm92aWRlciA9IG5ldyBwcm92aWRlckNvbmZpZyhodHRwKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wcm92aWRlci4kZ2V0KCk7XG4gICAgYXNzaWduKHRoaXMsIGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zZXREZWZhdWx0Q29uZmlnKCk7XG4gIH1cblxuICBzZXREZWZhdWx0Q29uZmlnKCkge1xuICAgIGlmICghdGhpcy5jb25maWdPYmogfHwgIWlzRnVuY3Rpb24odGhpcy5jb25maWdPYmouZm4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJyREkgPSBtYXAodGhpcy5jb25maWdPYmouYXJyU2VydmljZXMsIChzZXJ2aWNlczogVHlwZTxhbnk+KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoc2VydmljZXMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWdPYmouZm4oLi4uW3RoaXMucHJvdmlkZXIsIC4uLmFyckRJXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvdmlkZXJDb25maWcoJGh0dHApIHtcbiAgY29uc3QgZ2xvYmFsQ29uZmlndXJhdGlvbiA9IHt9O1xuXG4gIFJlc3Rhbmd1bGFyQ29uZmlndXJlcih0aGlzLCBnbG9iYWxDb25maWd1cmF0aW9uKTtcblxuICB0aGlzLiRnZXQgPSAkZ2V0O1xuXG4gIGZ1bmN0aW9uICRnZXQoKSB7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTZXJ2aWNlRm9yQ29uZmlndXJhdGlvbihjb25maWcpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2U6IGFueSA9IHt9O1xuXG4gICAgICBjb25zdCB1cmxIYW5kbGVyID0gbmV3IGNvbmZpZy51cmxDcmVhdG9yRmFjdG9yeVtjb25maWcudXJsQ3JlYXRvcl0oKTtcbiAgICAgIHVybEhhbmRsZXIuc2V0Q29uZmlnKGNvbmZpZyk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3Rhbmd1bGFyaXplQmFzZShwYXJlbnQsIGVsZW0sIHJvdXRlLCByZXFQYXJhbXMsIGZyb21TZXJ2ZXIpIHtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdID0gcm91dGU7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmdldFJlc3Rhbmd1bGFyVXJsXSA9IGJpbmQodXJsSGFuZGxlci5mZXRjaFVybCwgdXJsSGFuZGxlciwgZWxlbSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmdldFJlcXVlc3RlZFVybF0gPSBiaW5kKHVybEhhbmRsZXIuZmV0Y2hSZXF1ZXN0ZWRVcmwsIHVybEhhbmRsZXIsIGVsZW0pO1xuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5hZGRSZXN0YW5ndWxhck1ldGhvZF0gPSBiaW5kKGFkZFJlc3Rhbmd1bGFyTWV0aG9kRnVuY3Rpb24sIGVsZW0pO1xuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5jbG9uZV0gPSBiaW5kKGNvcHlSZXN0YW5ndWxhcml6ZWRFbGVtZW50LCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucmVxUGFyYW1zXSA9IGlzRW1wdHkocmVxUGFyYW1zKSA/IG51bGwgOiByZXFQYXJhbXM7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLndpdGhIdHRwQ29uZmlnXSA9IGJpbmQod2l0aEh0dHBDb25maWcsIGVsZW0pO1xuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wbGFpbl0gPSBiaW5kKHN0cmlwUmVzdGFuZ3VsYXIsIGVsZW0sIGVsZW0pO1xuXG4gICAgICAgIC8vIFRhZyBlbGVtZW50IGFzIHJlc3Rhbmd1bGFyaXplZFxuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhcml6ZWRdID0gdHJ1ZTtcblxuICAgICAgICAvLyBSZXF1ZXN0TGVzcyBjb25uZWN0aW9uXG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLm9uZV0gPSBiaW5kKG9uZSwgZWxlbSwgZWxlbSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmFsbF0gPSBiaW5kKGFsbCwgZWxlbSwgZWxlbSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnNldmVyYWxdID0gYmluZChzZXZlcmFsLCBlbGVtLCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMub25lVXJsXSA9IGJpbmQob25lVXJsLCBlbGVtLCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuYWxsVXJsXSA9IGJpbmQoYWxsVXJsLCBlbGVtLCBlbGVtKTtcblxuICAgICAgICBlbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5mcm9tU2VydmVyXSA9ICEhZnJvbVNlcnZlcjtcblxuICAgICAgICBpZiAocGFyZW50ICYmIGNvbmZpZy5zaG91bGRTYXZlUGFyZW50KHJvdXRlKSkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gY29uZmlnLmdldElkRnJvbUVsZW0ocGFyZW50KTtcbiAgICAgICAgICBjb25zdCBwYXJlbnRVcmwgPSBjb25maWcuZ2V0VXJsRnJvbUVsZW0ocGFyZW50KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3Rhbmd1bGFyRmllbGRzRm9yUGFyZW50ID0gdW5pb24oXG4gICAgICAgICAgICB2YWx1ZXMocGljayhjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMsIFsncm91dGUnLCAnc2luZ2xlT25lJywgJ3BhcmVudFJlc291cmNlJ10pKSxcbiAgICAgICAgICAgIGNvbmZpZy5leHRyYUZpZWxkc1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcGFyZW50UmVzb3VyY2UgPSBwaWNrKHBhcmVudCwgcmVzdGFuZ3VsYXJGaWVsZHNGb3JQYXJlbnQpO1xuXG4gICAgICAgICAgaWYgKGNvbmZpZy5pc1ZhbGlkSWQocGFyZW50SWQpKSB7XG4gICAgICAgICAgICBjb25maWcuc2V0SWRUb0VsZW0ocGFyZW50UmVzb3VyY2UsIHBhcmVudElkLCByb3V0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb25maWcuaXNWYWxpZElkKHBhcmVudFVybCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5zZXRVcmxUb0VsZW0ocGFyZW50UmVzb3VyY2UsIHBhcmVudFVybCwgcm91dGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBhcmVudFJlc291cmNlXSA9IHBhcmVudFJlc291cmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBhcmVudFJlc291cmNlXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uZShwYXJlbnQsIHJvdXRlLCBpZCwgc2luZ2xlT25lKSB7XG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgaWYgKGlzTnVtYmVyKHJvdXRlKSB8fCBpc051bWJlcihwYXJlbnQpKSB7XG4gICAgICAgICAgZXJyb3IgPSAnWW91XFwncmUgY3JlYXRpbmcgYSBSZXN0YW5ndWxhciBlbnRpdHkgd2l0aCB0aGUgbnVtYmVyICc7XG4gICAgICAgICAgZXJyb3IgKz0gJ2luc3RlYWQgb2YgdGhlIHJvdXRlIG9yIHRoZSBwYXJlbnQuIEZvciBleGFtcGxlLCB5b3UgY2FuXFwndCBjYWxsIC5vbmUoMTIpLic7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbmRlZmluZWQocm91dGUpKSB7XG4gICAgICAgICAgZXJyb3IgPSAnWW91XFwncmUgY3JlYXRpbmcgYSBSZXN0YW5ndWxhciBlbnRpdHkgZWl0aGVyIHdpdGhvdXQgdGhlIHBhdGguICc7XG4gICAgICAgICAgZXJyb3IgKz0gJ0ZvciBleGFtcGxlIHlvdSBjYW5cXCd0IGNhbGwgLm9uZSgpLiBQbGVhc2UgY2hlY2sgaWYgeW91ciBhcmd1bWVudHMgYXJlIHZhbGlkLic7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtID0ge307XG4gICAgICAgIGNvbmZpZy5zZXRJZFRvRWxlbShlbGVtLCBpZCwgcm91dGUpO1xuICAgICAgICBjb25maWcuc2V0RmllbGRUb0VsZW0oY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnNpbmdsZU9uZSwgZWxlbSwgc2luZ2xlT25lKTtcbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplRWxlbShwYXJlbnQsIGVsZW0sIHJvdXRlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFsbChwYXJlbnQsIHJvdXRlKSB7XG4gICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24ocGFyZW50LCBbXSwgcm91dGUsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2V2ZXJhbChwYXJlbnQsIHJvdXRlIC8qLCBpZHMgKi8pIHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IFtdO1xuICAgICAgICBjb2xsZWN0aW9uW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5pZHNdID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24ocGFyZW50LCBjb2xsZWN0aW9uLCByb3V0ZSwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvbmVVcmwocGFyZW50LCByb3V0ZSwgdXJsKSB7XG4gICAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JvdXRlIGlzIG1hbmRhdG9yeSB3aGVuIGNyZWF0aW5nIG5ldyBSZXN0YW5ndWxhciBvYmplY3RzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSB7fTtcbiAgICAgICAgY29uZmlnLnNldFVybFRvRWxlbShlbGVtLCB1cmwsIHJvdXRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplRWxlbShwYXJlbnQsIGVsZW0sIHJvdXRlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFsbFVybChwYXJlbnQsIHJvdXRlLCB1cmwpIHtcbiAgICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm91dGUgaXMgbWFuZGF0b3J5IHdoZW4gY3JlYXRpbmcgbmV3IFJlc3Rhbmd1bGFyIG9iamVjdHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbSA9IHt9O1xuICAgICAgICBjb25maWcuc2V0VXJsVG9FbGVtKGVsZW0sIHVybCwgcm91dGUpO1xuICAgICAgICByZXR1cm4gcmVzdGFuZ3VsYXJpemVDb2xsZWN0aW9uKHBhcmVudCwgZWxlbSwgcm91dGUsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvbWlzZXNcbiAgICAgIGZ1bmN0aW9uIHJlc3Rhbmd1bGFyaXplUmVzcG9uc2Uoc3ViamVjdCwgaXNDb2xsZWN0aW9uLCB2YWx1ZVRvRmlsbCkge1xuICAgICAgICByZXR1cm4gc3ViamVjdC5waXBlKGZpbHRlcihyZXMgPT4gISFyZXMpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVzb2x2ZVByb21pc2Uoc3ViamVjdCwgcmVzcG9uc2UsIGRhdGEsIGZpbGxlZFZhbHVlKSB7XG4gICAgICAgIGV4dGVuZChmaWxsZWRWYWx1ZSwgZGF0YSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciB0aGUgZnVsbCByZXNwb25zZSBpbnRlcmNlcHRvci5cbiAgICAgICAgaWYgKGNvbmZpZy5mdWxsUmVzcG9uc2UpIHtcbiAgICAgICAgICBzdWJqZWN0Lm5leHQoZXh0ZW5kKHJlc3BvbnNlLCB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1YmplY3QubmV4dChkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRWxlbWVudHNcbiAgICAgIGZ1bmN0aW9uIHN0cmlwUmVzdGFuZ3VsYXIoZWxlbSkge1xuICAgICAgICBpZiAoaXNBcnJheShlbGVtKSkge1xuICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgICAgICAgZWFjaChlbGVtLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2goY29uZmlnLmlzUmVzdGFuZ3VsYXJpemVkKHZhbHVlKSA/IHN0cmlwUmVzdGFuZ3VsYXIodmFsdWUpIDogdmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb21pdChlbGVtLCB2YWx1ZXMob21pdChjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMsICdpZCcpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYWRkQ3VzdG9tT3BlcmF0aW9uKGVsZW0pIHtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuY3VzdG9tT3BlcmF0aW9uXSA9IGJpbmQoY3VzdG9tRnVuY3Rpb24sIGVsZW0pO1xuICAgICAgICBjb25zdCByZXF1ZXN0TWV0aG9kcyA9IHtnZXQ6IGN1c3RvbUZ1bmN0aW9uLCBkZWxldGU6IGN1c3RvbUZ1bmN0aW9ufTtcbiAgICAgICAgZWFjaChbJ3B1dCcsICdwYXRjaCcsICdwb3N0J10sIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgcmVxdWVzdE1ldGhvZHNbbmFtZV0gPSBmdW5jdGlvbiAob3BlcmF0aW9uLCBlbGVtZW50LCBwYXRoLCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kKGN1c3RvbUZ1bmN0aW9uLCB0aGlzKShvcGVyYXRpb24sIHBhdGgsIHBhcmFtcywgaGVhZGVycywgZWxlbWVudCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVhY2gocmVxdWVzdE1ldGhvZHMsIGZ1bmN0aW9uIChyZXF1ZXN0RnVuYywgbmFtZSkge1xuICAgICAgICAgIGNvbnN0IGNhbGxPcGVyYXRpb24gPSBuYW1lID09PSAnZGVsZXRlJyA/ICdyZW1vdmUnIDogbmFtZTtcbiAgICAgICAgICBlYWNoKFsnZG8nLCAnY3VzdG9tJ10sIGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAgICAgZWxlbVthbGlhcyArIG5hbWUudG9VcHBlckNhc2UoKV0gPSBiaW5kKHJlcXVlc3RGdW5jLCBlbGVtLCBjYWxsT3BlcmF0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmN1c3RvbUdFVExJU1RdID0gYmluZChmZXRjaEZ1bmN0aW9uLCBlbGVtKTtcbiAgICAgICAgZWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuZG9HRVRMSVNUXSA9IGVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmN1c3RvbUdFVExJU1RdO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb3B5UmVzdGFuZ3VsYXJpemVkRWxlbWVudChmcm9tRWxlbWVudCwgdG9FbGVtZW50ID0ge30pIHtcbiAgICAgICAgY29uc3QgY29waWVkRWxlbWVudCA9IGFzc2lnbih0b0VsZW1lbnQsIGZyb21FbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplRWxlbShjb3BpZWRFbGVtZW50W2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV0sXG4gICAgICAgICAgY29waWVkRWxlbWVudCwgY29waWVkRWxlbWVudFtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVzdGFuZ3VsYXJpemVFbGVtKHBhcmVudCwgZWxlbWVudCwgcm91dGUsIGZyb21TZXJ2ZXI/LCBjb2xsZWN0aW9uPywgcmVxUGFyYW1zPykge1xuICAgICAgICBjb25zdCBlbGVtID0gY29uZmlnLm9uQmVmb3JlRWxlbVJlc3Rhbmd1bGFyaXplZChlbGVtZW50LCBmYWxzZSwgcm91dGUpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsRWxlbSA9IHJlc3Rhbmd1bGFyaXplQmFzZShwYXJlbnQsIGVsZW0sIHJvdXRlLCByZXFQYXJhbXMsIGZyb21TZXJ2ZXIpO1xuXG4gICAgICAgIGlmIChjb25maWcudXNlQ2Fubm9uaWNhbElkKSB7XG4gICAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5jYW5ub25pY2FsSWRdID0gY29uZmlnLmdldElkRnJvbUVsZW0obG9jYWxFbGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRQYXJlbnRMaXN0XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0gPSBmYWxzZTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRdID0gYmluZChnZXRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRMaXN0XSA9IGJpbmQoZmV0Y2hGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wdXRdID0gYmluZChwdXRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wb3N0XSA9IGJpbmQocG9zdEZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlbW92ZV0gPSBiaW5kKGRlbGV0ZUZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmhlYWRdID0gYmluZChoZWFkRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMudHJhY2VdID0gYmluZCh0cmFjZUZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLm9wdGlvbnNdID0gYmluZChvcHRpb25zRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucGF0Y2hdID0gYmluZChwYXRjaEZ1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnNhdmVdID0gYmluZChzYXZlLCBsb2NhbEVsZW0pO1xuXG4gICAgICAgIGFkZEN1c3RvbU9wZXJhdGlvbihsb2NhbEVsZW0pO1xuICAgICAgICByZXR1cm4gY29uZmlnLnRyYW5zZm9ybUVsZW0obG9jYWxFbGVtLCBmYWxzZSwgcm91dGUsIHNlcnZpY2UsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24ocGFyZW50LCBlbGVtZW50LCByb3V0ZSwgZnJvbVNlcnZlcj8sIHJlcVBhcmFtcz8pIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IGNvbmZpZy5vbkJlZm9yZUVsZW1SZXN0YW5ndWxhcml6ZWQoZWxlbWVudCwgdHJ1ZSwgcm91dGUpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsRWxlbSA9IHJlc3Rhbmd1bGFyaXplQmFzZShwYXJlbnQsIGVsZW0sIHJvdXRlLCByZXFQYXJhbXMsIGZyb21TZXJ2ZXIpO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0gPSB0cnVlO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBvc3RdID0gYmluZChwb3N0RnVuY3Rpb24sIGxvY2FsRWxlbSwgbnVsbCk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucmVtb3ZlXSA9IGJpbmQoZGVsZXRlRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaGVhZF0gPSBiaW5kKGhlYWRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy50cmFjZV0gPSBiaW5kKHRyYWNlRnVuY3Rpb24sIGxvY2FsRWxlbSk7XG4gICAgICAgIGxvY2FsRWxlbVtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucHV0RWxlbWVudF0gPSBiaW5kKHB1dEVsZW1lbnRGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5vcHRpb25zXSA9IGJpbmQob3B0aW9uc0Z1bmN0aW9uLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnBhdGNoXSA9IGJpbmQocGF0Y2hGdW5jdGlvbiwgbG9jYWxFbGVtKTtcbiAgICAgICAgbG9jYWxFbGVtW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5nZXRdID0gYmluZChnZXRCeUlkLCBsb2NhbEVsZW0pO1xuICAgICAgICBsb2NhbEVsZW1bY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLmdldExpc3RdID0gYmluZChmZXRjaEZ1bmN0aW9uLCBsb2NhbEVsZW0sIG51bGwpO1xuXG4gICAgICAgIGFkZEN1c3RvbU9wZXJhdGlvbihsb2NhbEVsZW0pO1xuICAgICAgICByZXR1cm4gY29uZmlnLnRyYW5zZm9ybUVsZW0obG9jYWxFbGVtLCB0cnVlLCByb3V0ZSwgc2VydmljZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbkFuZEVsZW1lbnRzKHBhcmVudCwgZWxlbWVudCwgcm91dGUpIHtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbihwYXJlbnQsIGVsZW1lbnQsIHJvdXRlLCBmYWxzZSk7XG4gICAgICAgIGVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgICAgcmVzdGFuZ3VsYXJpemVFbGVtKHBhcmVudCwgZWxlbSwgcm91dGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0QnlJZChpZCwgcmVxUGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbUdFVChpZC50b1N0cmluZygpLCByZXFQYXJhbXMsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwdXRFbGVtZW50RnVuY3Rpb24oaWR4LCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgX190aGlzID0gdGhpcztcbiAgICAgICAgY29uc3QgZWxlbVRvUHV0ID0gdGhpc1tpZHhdO1xuICAgICAgICBjb25zdCBzdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICAgICAgbGV0IGZpbGxlZEFycmF5ID0gW107XG4gICAgICAgIGZpbGxlZEFycmF5ID0gY29uZmlnLnRyYW5zZm9ybUVsZW0oZmlsbGVkQXJyYXksIHRydWUsIGVsZW1Ub1B1dFtjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdLCBzZXJ2aWNlKTtcblxuICAgICAgICBlbGVtVG9QdXQucHV0KHBhcmFtcywgaGVhZGVycylcbiAgICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAoc2VydmVyRWxlbSkge1xuICAgICAgICAgIGNvbnN0IG5ld0FycmF5ID0gY29weVJlc3Rhbmd1bGFyaXplZEVsZW1lbnQoX190aGlzKTtcbiAgICAgICAgICBuZXdBcnJheVtpZHhdID0gc2VydmVyRWxlbTtcbiAgICAgICAgICBmaWxsZWRBcnJheSA9IG5ld0FycmF5O1xuICAgICAgICAgIHN1YmplY3QubmV4dChuZXdBcnJheSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIHN1YmplY3QuZXJyb3IocmVzcG9uc2UpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdGFuZ3VsYXJpemVSZXNwb25zZShzdWJqZWN0LCB0cnVlLCBmaWxsZWRBcnJheSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBhcnNlUmVzcG9uc2UocmVzRGF0YSwgb3BlcmF0aW9uLCByb3V0ZSwgZmV0Y2hVcmwsIHJlc3BvbnNlLCBzdWJqZWN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb25maWcucmVzcG9uc2VFeHRyYWN0b3IocmVzRGF0YSwgb3BlcmF0aW9uLCByb3V0ZSwgZmV0Y2hVcmwsIHJlc3BvbnNlLCBzdWJqZWN0KTtcbiAgICAgICAgY29uc3QgZXRhZyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdFVGFnJyk7XG4gICAgICAgIGlmIChkYXRhICYmIGV0YWcpIHtcbiAgICAgICAgICBkYXRhW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSA9IGV0YWc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZldGNoRnVuY3Rpb24od2hhdCwgcmVxUGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IF9fdGhpcyA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSAnZ2V0TGlzdCc7XG4gICAgICAgIGNvbnN0IHVybCA9IHVybEhhbmRsZXIuZmV0Y2hVcmwodGhpcywgd2hhdCk7XG4gICAgICAgIGNvbnN0IHdoYXRGZXRjaGVkID0gd2hhdCB8fCBfX3RoaXNbY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJvdXRlXTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gY29uZmlnLmZ1bGxSZXF1ZXN0SW50ZXJjZXB0b3IobnVsbCwgb3BlcmF0aW9uLFxuICAgICAgICAgIHdoYXRGZXRjaGVkLCB1cmwsIGhlYWRlcnMgfHwge30sIHJlcVBhcmFtcyB8fCB7fSwgdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaHR0cENvbmZpZ10gfHwge30pO1xuXG4gICAgICAgIGxldCBmaWxsZWRBcnJheSA9IFtdO1xuICAgICAgICBmaWxsZWRBcnJheSA9IGNvbmZpZy50cmFuc2Zvcm1FbGVtKGZpbGxlZEFycmF5LCB0cnVlLCB3aGF0RmV0Y2hlZCwgc2VydmljZSk7XG5cbiAgICAgICAgbGV0IG1ldGhvZCA9ICdnZXRMaXN0JztcblxuICAgICAgICBpZiAoY29uZmlnLmpzb25wKSB7XG4gICAgICAgICAgbWV0aG9kID0gJ2pzb25wJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9rQ2FsbGJhY2sgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBjb25zdCByZXNEYXRhID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICBjb25zdCBmdWxsUGFyYW1zID0gcmVzcG9uc2UuY29uZmlnLnBhcmFtcztcbiAgICAgICAgICBsZXQgZGF0YSA9IHBhcnNlUmVzcG9uc2UocmVzRGF0YSwgb3BlcmF0aW9uLCB3aGF0RmV0Y2hlZCwgdXJsLCByZXNwb25zZSwgc3ViamVjdCk7XG5cbiAgICAgICAgICAvLyBzdXBwb3J0IGVtcHR5IHJlc3BvbnNlIGZvciBnZXRMaXN0KCkgY2FsbHMgKHNvbWUgQVBJcyByZXNwb25kIHdpdGggMjA0IGFuZCBlbXB0eSBib2R5KVxuICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChkYXRhKSB8fCAnJyA9PT0gZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgZm9yIGdldExpc3QgU0hPVUxEIGJlIGFuIGFycmF5IGFuZCBub3QgYW4gb2JqZWN0IG9yIHNvbWV0aGluZyBlbHNlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRydWUgPT09IGNvbmZpZy5wbGFpbkJ5RGVmYXVsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKHN1YmplY3QsIHJlc3BvbnNlLCBkYXRhLCBmaWxsZWRBcnJheSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHByb2Nlc3NlZERhdGEgPSBtYXAoZGF0YSwgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICAgIGlmICghX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhckNvbGxlY3Rpb25dKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUVsZW0oX190aGlzLCBlbGVtLCB3aGF0LCB0cnVlLCBkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZUVsZW0oX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV0sXG4gICAgICAgICAgICAgICAgZWxlbSwgX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yb3V0ZV0sIHRydWUsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcHJvY2Vzc2VkRGF0YSA9IGV4dGVuZChkYXRhLCBwcm9jZXNzZWREYXRhKTtcblxuICAgICAgICAgIGlmICghX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yZXN0YW5ndWxhckNvbGxlY3Rpb25dKSB7XG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZShcbiAgICAgICAgICAgICAgc3ViamVjdCxcbiAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgIHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbihcbiAgICAgICAgICAgICAgICBfX3RoaXMsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgICAgICB3aGF0LFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZnVsbFBhcmFtc1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBmaWxsZWRBcnJheVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoXG4gICAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICByZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24oXG4gICAgICAgICAgICAgICAgX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5wYXJlbnRSZXNvdXJjZV0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgICAgICAgICBfX3RoaXNbY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJvdXRlXSxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGZ1bGxQYXJhbXNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZmlsbGVkQXJyYXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHVybEhhbmRsZXIucmVzb3VyY2UodGhpcywgJGh0dHAsIHJlcXVlc3QuaHR0cENvbmZpZywgcmVxdWVzdC5oZWFkZXJzLCByZXF1ZXN0LnBhcmFtcywgd2hhdCxcbiAgICAgICAgICB0aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSwgb3BlcmF0aW9uKVttZXRob2RdKClcbiAgICAgICAgLnN1YnNjcmliZShva0NhbGxiYWNrLCBmdW5jdGlvbiBlcnJvcihyZXNwb25zZSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDMwNCAmJiBfX3RoaXNbY29uZmlnLnJlc3Rhbmd1bGFyRmllbGRzLnJlc3Rhbmd1bGFyQ29sbGVjdGlvbl0pIHtcbiAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHN1YmplY3QsIHJlc3BvbnNlLCBfX3RoaXMsIGZpbGxlZEFycmF5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZXJ5KGNvbmZpZy5lcnJvckludGVyY2VwdG9ycywgZnVuY3Rpb24gKGNiOiBhbnkpIHtcblxuICAgICAgICAgICAgcmV0dXJuIGNiKHJlc3BvbnNlLCBzdWJqZWN0LCBva0NhbGxiYWNrKSAhPT0gZmFsc2U7XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIC8vIHRyaWdnZXJlZCBpZiBubyBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gICAgICAgICAgICBzdWJqZWN0LmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN0YW5ndWxhcml6ZVJlc3BvbnNlKHN1YmplY3QsIHRydWUsIGZpbGxlZEFycmF5KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gd2l0aEh0dHBDb25maWcoaHR0cENvbmZpZykge1xuICAgICAgICB0aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5odHRwQ29uZmlnXSA9IGh0dHBDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzYXZlKHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICBpZiAodGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuZnJvbVNlcnZlcl0pIHtcbiAgICAgICAgICByZXR1cm4gdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucHV0XShwYXJhbXMsIGhlYWRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykoJ3Bvc3QnLCB1bmRlZmluZWQsIHBhcmFtcywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBlbGVtRnVuY3Rpb24ob3BlcmF0aW9uLCB3aGF0LCBwYXJhbXMsIG9iaiwgaGVhZGVycykge1xuICAgICAgICBjb25zdCBfX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCBzdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICAgICAgY29uc3QgcmVzUGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgICBjb25zdCByb3V0ZSA9IHdoYXQgfHwgdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucm91dGVdO1xuICAgICAgICBjb25zdCBmZXRjaFVybCA9IHVybEhhbmRsZXIuZmV0Y2hVcmwodGhpcywgd2hhdCk7XG5cbiAgICAgICAgbGV0IGNhbGxPYmogPSBvYmogfHwgdGhpcztcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gZXRhZyBvbiByZXN0YW5ndWxhciBvYmplY3QgKHNpbmNlIGZvciBjdXN0b20gbWV0aG9kcyB3ZSBwcm9iYWJseSBkb24ndCBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIGV0YWcgZmllbGQpXG4gICAgICAgIGNvbnN0IGV0YWcgPSBjYWxsT2JqW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSB8fCAob3BlcmF0aW9uICE9PSAncG9zdCcgPyB0aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5ldGFnXSA6IG51bGwpO1xuXG4gICAgICAgIGlmIChpc09iamVjdChjYWxsT2JqKSAmJiBjb25maWcuaXNSZXN0YW5ndWxhcml6ZWQoY2FsbE9iaikpIHtcbiAgICAgICAgICBjYWxsT2JqID0gc3RyaXBSZXN0YW5ndWxhcihjYWxsT2JqKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gY29uZmlnLmZ1bGxSZXF1ZXN0SW50ZXJjZXB0b3IoXG4gICAgICAgICAgY2FsbE9iaixcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgZmV0Y2hVcmwsXG4gICAgICAgICAgaGVhZGVycyB8fCB7fSxcbiAgICAgICAgICByZXNQYXJhbXMgfHwge30sXG4gICAgICAgICAgdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMuaHR0cENvbmZpZ10gfHwge31cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZmlsbGVkT2JqZWN0ID0ge307XG4gICAgICAgIGZpbGxlZE9iamVjdCA9IGNvbmZpZy50cmFuc2Zvcm1FbGVtKGZpbGxlZE9iamVjdCwgZmFsc2UsIHJvdXRlLCBzZXJ2aWNlKTtcblxuICAgICAgICBjb25zdCBva0NhbGxiYWNrID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgY29uc3QgcmVzRGF0YSA9IGdldChyZXNwb25zZSwgJ2JvZHknKTtcbiAgICAgICAgICBjb25zdCBmdWxsUGFyYW1zID0gZ2V0KHJlc3BvbnNlLCAnY29uZmlnLnBhcmFtcycpO1xuXG4gICAgICAgICAgY29uc3QgZWxlbSA9IHBhcnNlUmVzcG9uc2UocmVzRGF0YSwgb3BlcmF0aW9uLCByb3V0ZSwgZmV0Y2hVcmwsIHJlc3BvbnNlLCBzdWJqZWN0KTtcblxuICAgICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgIGlmICh0cnVlID09PSBjb25maWcucGxhaW5CeURlZmF1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKHN1YmplY3QsIHJlc3BvbnNlLCBlbGVtLCBmaWxsZWRPYmplY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAncG9zdCcgJiYgIV9fdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucmVzdGFuZ3VsYXJDb2xsZWN0aW9uXSkge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzdGFuZ3VsYXJpemVFbGVtKFxuICAgICAgICAgICAgICAgIF9fdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucGFyZW50UmVzb3VyY2VdLFxuICAgICAgICAgICAgICAgIGVsZW0sXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZ1bGxQYXJhbXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2Uoc3ViamVjdCwgcmVzcG9uc2UsIGRhdGEsIGZpbGxlZE9iamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzdGFuZ3VsYXJpemVFbGVtKFxuICAgICAgICAgICAgICAgIF9fdGhpc1tjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMucGFyZW50UmVzb3VyY2VdLFxuICAgICAgICAgICAgICAgIGVsZW0sXG4gICAgICAgICAgICAgICAgX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5yb3V0ZV0sXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZ1bGxQYXJhbXNcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBkYXRhW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5zaW5nbGVPbmVdID0gX190aGlzW2NvbmZpZy5yZXN0YW5ndWxhckZpZWxkcy5zaW5nbGVPbmVdO1xuICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShzdWJqZWN0LCByZXNwb25zZSwgZGF0YSwgZmlsbGVkT2JqZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlUHJvbWlzZShzdWJqZWN0LCByZXNwb25zZSwgdW5kZWZpbmVkLCBmaWxsZWRPYmplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0ICYmIGNvbmZpZy5pc1NhZmUob3BlcmF0aW9uKSkge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2Uoc3ViamVjdCwgcmVzcG9uc2UsIF9fdGhpcywgZmlsbGVkT2JqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZXJ5KGNvbmZpZy5lcnJvckludGVyY2VwdG9ycywgZnVuY3Rpb24gKGNiOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihyZXNwb25zZSwgc3ViamVjdCwgb2tDYWxsYmFjaykgIT09IGZhbHNlO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAvLyB0cmlnZ2VyZWQgaWYgbm8gY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICAgICAgICAgICAgc3ViamVjdC5lcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBPdmVycmlkaW5nIEhUVFAgTWV0aG9kXG4gICAgICAgIGxldCBjYWxsT3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgICAgICBsZXQgY2FsbEhlYWRlcnMgPSBleHRlbmQoe30sIHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IGlzT3ZlcnJpZGVPcGVyYXRpb24gPSBjb25maWcuaXNPdmVycmlkZW5NZXRob2Qob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlzT3ZlcnJpZGVPcGVyYXRpb24pIHtcbiAgICAgICAgICBjYWxsT3BlcmF0aW9uID0gJ3Bvc3QnO1xuICAgICAgICAgIGNhbGxIZWFkZXJzID0gZXh0ZW5kKGNhbGxIZWFkZXJzLCB7J1gtSFRUUC1NZXRob2QtT3ZlcnJpZGUnOiBvcGVyYXRpb24gPT09ICdyZW1vdmUnID8gJ0RFTEVURScgOiBvcGVyYXRpb24udG9VcHBlckNhc2UoKX0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5qc29ucCAmJiBjYWxsT3BlcmF0aW9uID09PSAnZ2V0Jykge1xuICAgICAgICAgIGNhbGxPcGVyYXRpb24gPSAnanNvbnAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5pc1NhZmUob3BlcmF0aW9uKSkge1xuICAgICAgICAgIGlmIChpc092ZXJyaWRlT3BlcmF0aW9uKSB7XG4gICAgICAgICAgICB1cmxIYW5kbGVyLnJlc291cmNlKHRoaXMsICRodHRwLCByZXF1ZXN0Lmh0dHBDb25maWcsIGNhbGxIZWFkZXJzLCByZXF1ZXN0LnBhcmFtcyxcbiAgICAgICAgICAgICAgd2hhdCwgZXRhZywgY2FsbE9wZXJhdGlvbilbY2FsbE9wZXJhdGlvbl0oe30pLnN1YnNjcmliZShva0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsSGFuZGxlci5yZXNvdXJjZSh0aGlzLCAkaHR0cCwgcmVxdWVzdC5odHRwQ29uZmlnLCBjYWxsSGVhZGVycywgcmVxdWVzdC5wYXJhbXMsXG4gICAgICAgICAgICAgIHdoYXQsIGV0YWcsIGNhbGxPcGVyYXRpb24pW2NhbGxPcGVyYXRpb25dKCkuc3Vic2NyaWJlKG9rQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmxIYW5kbGVyLnJlc291cmNlKHRoaXMsICRodHRwLCByZXF1ZXN0Lmh0dHBDb25maWcsIGNhbGxIZWFkZXJzLCByZXF1ZXN0LnBhcmFtcyxcbiAgICAgICAgICAgIHdoYXQsIGV0YWcsIGNhbGxPcGVyYXRpb24pW2NhbGxPcGVyYXRpb25dKHJlcXVlc3QuZWxlbWVudCkuc3Vic2NyaWJlKG9rQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3Rhbmd1bGFyaXplUmVzcG9uc2Uoc3ViamVjdCwgZmFsc2UsIGZpbGxlZE9iamVjdCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldEZ1bmN0aW9uKHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICByZXR1cm4gYmluZChlbGVtRnVuY3Rpb24sIHRoaXMpKCdnZXQnLCB1bmRlZmluZWQsIHBhcmFtcywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVsZXRlRnVuY3Rpb24ocGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykoJ3JlbW92ZScsIHVuZGVmaW5lZCwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwdXRGdW5jdGlvbihwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgncHV0JywgdW5kZWZpbmVkLCBwYXJhbXMsIHVuZGVmaW5lZCwgaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBvc3RGdW5jdGlvbih3aGF0LCBlbGVtLCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgncG9zdCcsIHdoYXQsIHBhcmFtcywgZWxlbSwgaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhlYWRGdW5jdGlvbihwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgnaGVhZCcsIHVuZGVmaW5lZCwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFjZUZ1bmN0aW9uKHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICByZXR1cm4gYmluZChlbGVtRnVuY3Rpb24sIHRoaXMpKCd0cmFjZScsIHVuZGVmaW5lZCwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvcHRpb25zRnVuY3Rpb24ocGFyYW1zLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykoJ29wdGlvbnMnLCB1bmRlZmluZWQsIHBhcmFtcywgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcGF0Y2hGdW5jdGlvbihlbGVtLCBwYXJhbXMsIGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGJpbmQoZWxlbUZ1bmN0aW9uLCB0aGlzKSgncGF0Y2gnLCB1bmRlZmluZWQsIHBhcmFtcywgZWxlbSwgaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGN1c3RvbUZ1bmN0aW9uKG9wZXJhdGlvbiwgcGF0aCwgcGFyYW1zLCBoZWFkZXJzLCBlbGVtKSB7XG4gICAgICAgIHJldHVybiBiaW5kKGVsZW1GdW5jdGlvbiwgdGhpcykob3BlcmF0aW9uLCBwYXRoLCBwYXJhbXMsIGVsZW0sIGhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhZGRSZXN0YW5ndWxhck1ldGhvZEZ1bmN0aW9uKG5hbWUsIG9wZXJhdGlvbiwgcGF0aCwgZGVmYXVsdFBhcmFtcywgZGVmYXVsdEhlYWRlcnMsIGRlZmF1bHRFbGVtKSB7XG4gICAgICAgIGxldCBiaW5kZWRGdW5jdGlvbjtcbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2dldExpc3QnKSB7XG4gICAgICAgICAgYmluZGVkRnVuY3Rpb24gPSBiaW5kKGZldGNoRnVuY3Rpb24sIHRoaXMsIHBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJpbmRlZEZ1bmN0aW9uID0gYmluZChjdXN0b21GdW5jdGlvbiwgdGhpcywgb3BlcmF0aW9uLCBwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGdW5jdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGhlYWRlcnMsIGVsZW0pIHtcbiAgICAgICAgICBjb25zdCBjYWxsUGFyYW1zID0gZGVmYXVsdHMoe1xuICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgZWxlbTogZWxlbVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhcmFtczogZGVmYXVsdFBhcmFtcyxcbiAgICAgICAgICAgIGhlYWRlcnM6IGRlZmF1bHRIZWFkZXJzLFxuICAgICAgICAgICAgZWxlbTogZGVmYXVsdEVsZW1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gYmluZGVkRnVuY3Rpb24oY2FsbFBhcmFtcy5wYXJhbXMsIGNhbGxQYXJhbXMuaGVhZGVycywgY2FsbFBhcmFtcy5lbGVtKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY29uZmlnLmlzU2FmZShvcGVyYXRpb24pKSB7XG4gICAgICAgICAgdGhpc1tuYW1lXSA9IGNyZWF0ZWRGdW5jdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzW25hbWVdID0gZnVuY3Rpb24gKGVsZW0sIHBhcmFtcywgaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRGdW5jdGlvbihwYXJhbXMsIGhlYWRlcnMsIGVsZW0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gd2l0aENvbmZpZ3VyYXRpb25GdW5jdGlvbihjb25maWd1cmVyKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbmZpZyA9IGNsb25lKG9taXQoY29uZmlnLCAnY29uZmlndXJhdGlvbicpKTtcbiAgICAgICAgUmVzdGFuZ3VsYXJDb25maWd1cmVyKG5ld0NvbmZpZywgbmV3Q29uZmlnKTtcbiAgICAgICAgY29uZmlndXJlcihuZXdDb25maWcpO1xuICAgICAgICByZXR1cm4gY3JlYXRlU2VydmljZUZvckNvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdG9TZXJ2aWNlKHJvdXRlLCBwYXJlbnQpIHtcbiAgICAgICAgY29uc3Qga25vd25Db2xsZWN0aW9uTWV0aG9kcyA9IHZhbHVlcyhjb25maWcucmVzdGFuZ3VsYXJGaWVsZHMpO1xuICAgICAgICBjb25zdCBzZXJ2OiBhbnkgPSB7fTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChwYXJlbnQgfHwgc2VydmljZSkuYWxsKHJvdXRlKTtcbiAgICAgICAgc2Vydi5vbmUgPSBiaW5kKG9uZSwgKHBhcmVudCB8fCBzZXJ2aWNlKSwgcGFyZW50LCByb3V0ZSk7XG4gICAgICAgIHNlcnYuYWxsID0gYmluZChjb2xsZWN0aW9uLmFsbCwgY29sbGVjdGlvbik7XG4gICAgICAgIHNlcnYucG9zdCA9IGJpbmQoY29sbGVjdGlvbi5wb3N0LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgc2Vydi5nZXRMaXN0ID0gYmluZChjb2xsZWN0aW9uLmdldExpc3QsIGNvbGxlY3Rpb24pO1xuICAgICAgICBzZXJ2LndpdGhIdHRwQ29uZmlnID0gYmluZChjb2xsZWN0aW9uLndpdGhIdHRwQ29uZmlnLCBjb2xsZWN0aW9uKTtcbiAgICAgICAgc2Vydi5nZXQgPSBiaW5kKGNvbGxlY3Rpb24uZ2V0LCBjb2xsZWN0aW9uKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY29sbGVjdGlvbikge1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmhhc093blByb3BlcnR5KHByb3ApICYmIGlzRnVuY3Rpb24oY29sbGVjdGlvbltwcm9wXSkgJiYgIWluY2x1ZGVzKGtub3duQ29sbGVjdGlvbk1ldGhvZHMsIHByb3ApKSB7XG4gICAgICAgICAgICBzZXJ2W3Byb3BdID0gYmluZChjb2xsZWN0aW9uW3Byb3BdLCBjb2xsZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VydjtcbiAgICAgIH1cblxuICAgICAgUmVzdGFuZ3VsYXJDb25maWd1cmVyKHNlcnZpY2UsIGNvbmZpZyk7XG5cbiAgICAgIHNlcnZpY2UuY29weSA9IGJpbmQoY29weVJlc3Rhbmd1bGFyaXplZEVsZW1lbnQsIHNlcnZpY2UpO1xuXG4gICAgICBzZXJ2aWNlLnNlcnZpY2UgPSBiaW5kKHRvU2VydmljZSwgc2VydmljZSk7XG5cbiAgICAgIHNlcnZpY2Uud2l0aENvbmZpZyA9IGJpbmQod2l0aENvbmZpZ3VyYXRpb25GdW5jdGlvbiwgc2VydmljZSk7XG5cbiAgICAgIHNlcnZpY2Uub25lID0gYmluZChvbmUsIHNlcnZpY2UsIG51bGwpO1xuXG4gICAgICBzZXJ2aWNlLmFsbCA9IGJpbmQoYWxsLCBzZXJ2aWNlLCBudWxsKTtcblxuICAgICAgc2VydmljZS5zZXZlcmFsID0gYmluZChzZXZlcmFsLCBzZXJ2aWNlLCBudWxsKTtcblxuICAgICAgc2VydmljZS5vbmVVcmwgPSBiaW5kKG9uZVVybCwgc2VydmljZSwgbnVsbCk7XG5cbiAgICAgIHNlcnZpY2UuYWxsVXJsID0gYmluZChhbGxVcmwsIHNlcnZpY2UsIG51bGwpO1xuXG4gICAgICBzZXJ2aWNlLnN0cmlwUmVzdGFuZ3VsYXIgPSBiaW5kKHN0cmlwUmVzdGFuZ3VsYXIsIHNlcnZpY2UpO1xuXG4gICAgICBzZXJ2aWNlLnJlc3Rhbmd1bGFyaXplRWxlbWVudCA9IGJpbmQocmVzdGFuZ3VsYXJpemVFbGVtLCBzZXJ2aWNlKTtcblxuICAgICAgc2VydmljZS5yZXN0YW5ndWxhcml6ZUNvbGxlY3Rpb24gPSBiaW5kKHJlc3Rhbmd1bGFyaXplQ29sbGVjdGlvbkFuZEVsZW1lbnRzLCBzZXJ2aWNlKTtcblxuICAgICAgcmV0dXJuIHNlcnZpY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZVNlcnZpY2VGb3JDb25maWd1cmF0aW9uKGdsb2JhbENvbmZpZ3VyYXRpb24pO1xuICB9XG5cbn1cbiIsImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBPcHRpb25hbCwgU2tpcFNlbGYsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUkVTVEFOR1VMQVIsIFJlc3Rhbmd1bGFyRmFjdG9yeSB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyLmNvbmZpZyc7XG5pbXBvcnQgeyBSZXN0YW5ndWxhciB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyJztcbmltcG9ydCB7IFJlc3Rhbmd1bGFySHR0cCB9IGZyb20gJy4vbmd4LXJlc3Rhbmd1bGFyLWh0dHAnO1xuXG5leHBvcnQgY29uc3QgQ09ORklHX09CSiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdjb25maWdPYmonKTtcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtSZXN0YW5ndWxhckh0dHAsIFJlc3Rhbmd1bGFyXVxufSlcbmV4cG9ydCBjbGFzcyBSZXN0YW5ndWxhck1vZHVsZSB7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcGFyZW50TW9kdWxlOiBSZXN0YW5ndWxhck1vZHVsZSkge1xuICAgIGlmIChwYXJlbnRNb2R1bGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1Jlc3Rhbmd1bGFyTW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkLiBJbXBvcnQgaXQgaW4gdGhlIEFwcE1vZHVsZSBvbmx5Jyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZvclJvb3QoY29uZmlnRnVuY3Rpb24/OiAocHJvdmlkZXI6IGFueSwgLi4uYXJnOiBhbnlbXSkgPT4gdm9pZCk6IE1vZHVsZVdpdGhQcm92aWRlcnM7XG4gIHN0YXRpYyBmb3JSb290KHByb3ZpZGVycz86IGFueVtdLCBjb25maWdGdW5jdGlvbj86IChwcm92aWRlcjogYW55LCAuLi5hcmc6IGFueVtdKSA9PiB2b2lkKTogTW9kdWxlV2l0aFByb3ZpZGVycztcbiAgc3RhdGljIGZvclJvb3QoY29uZmlnMT8sIGNvbmZpZzI/KTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBSZXN0YW5ndWxhck1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7cHJvdmlkZTogQ09ORklHX09CSiwgdXNlVmFsdWU6IFtjb25maWcxLCBjb25maWcyXX0sXG4gICAgICAgIHtwcm92aWRlOiBSRVNUQU5HVUxBUiwgdXNlRmFjdG9yeTogUmVzdGFuZ3VsYXJGYWN0b3J5LCBkZXBzOiBbQ09ORklHX09CSl19LFxuICAgICAgXVxuICAgIH07XG4gIH1cblxufVxuIl0sIm5hbWVzIjpbIkluamVjdGlvblRva2VuIiwiaXNBcnJheSIsIkh0dHBSZXF1ZXN0IiwiYXNzaWduIiwiSHR0cFBhcmFtcyIsIkh0dHBIZWFkZXJzIiwiaHR0cCIsImZpbHRlciIsIkh0dHBSZXNwb25zZSIsIm1hcCIsInRocm93RXJyb3IiLCJIdHRwRXJyb3JSZXNwb25zZSIsImNhdGNoRXJyb3IiLCJJbmplY3RhYmxlIiwiSHR0cEJhY2tlbmQiLCJvYmplY3QiLCJpbmNsdWRlcyIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZGVmYXVsdHMiLCJlYWNoIiwiZXh0ZW5kIiwiZmluZCIsImhhcyIsImluaXRpYWwiLCJsYXN0IiwiY2xvbmUiLCJyZWR1Y2UiLCJpc0Jvb2xlYW4iLCJrZXlzIiwiaXNFbXB0eSIsImZvckVhY2giLCJpc09iamVjdCIsImlzRnVuY3Rpb24iLCJPcHRpb25hbCIsIkluamVjdCIsIkluamVjdG9yIiwiYmluZCIsInVuaW9uIiwidmFsdWVzIiwicGljayIsImlzTnVtYmVyIiwib21pdCIsIkJlaGF2aW9yU3ViamVjdCIsImV2ZXJ5IiwiZ2V0IiwiTmdNb2R1bGUiLCJIdHRwQ2xpZW50TW9kdWxlIiwiU2tpcFNlbGYiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBLGFBdUdnQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIs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
\No newline at end of file