UNPKG

2.97 MBJavaScriptView Raw
1/* onsenui v2.12.2 - 2022-07-25 */
2
3(function (global, factory) {
4 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
5 typeof define === 'function' && define.amd ? define(factory) :
6 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ons = factory());
7})(this, (function () { 'use strict';
8
9 function ownKeys(object, enumerableOnly) {
10 var keys = Object.keys(object);
11
12 if (Object.getOwnPropertySymbols) {
13 var symbols = Object.getOwnPropertySymbols(object);
14 enumerableOnly && (symbols = symbols.filter(function (sym) {
15 return Object.getOwnPropertyDescriptor(object, sym).enumerable;
16 })), keys.push.apply(keys, symbols);
17 }
18
19 return keys;
20 }
21
22 function _objectSpread2(target) {
23 for (var i = 1; i < arguments.length; i++) {
24 var source = null != arguments[i] ? arguments[i] : {};
25 i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
26 _defineProperty(target, key, source[key]);
27 }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
28 Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
29 });
30 }
31
32 return target;
33 }
34
35 function _typeof(obj) {
36 "@babel/helpers - typeof";
37
38 return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
39 return typeof obj;
40 } : function (obj) {
41 return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
42 }, _typeof(obj);
43 }
44
45 function _classCallCheck(instance, Constructor) {
46 if (!(instance instanceof Constructor)) {
47 throw new TypeError("Cannot call a class as a function");
48 }
49 }
50
51 function _defineProperties(target, props) {
52 for (var i = 0; i < props.length; i++) {
53 var descriptor = props[i];
54 descriptor.enumerable = descriptor.enumerable || false;
55 descriptor.configurable = true;
56 if ("value" in descriptor) descriptor.writable = true;
57 Object.defineProperty(target, descriptor.key, descriptor);
58 }
59 }
60
61 function _createClass(Constructor, protoProps, staticProps) {
62 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
63 if (staticProps) _defineProperties(Constructor, staticProps);
64 Object.defineProperty(Constructor, "prototype", {
65 writable: false
66 });
67 return Constructor;
68 }
69
70 function _defineProperty(obj, key, value) {
71 if (key in obj) {
72 Object.defineProperty(obj, key, {
73 value: value,
74 enumerable: true,
75 configurable: true,
76 writable: true
77 });
78 } else {
79 obj[key] = value;
80 }
81
82 return obj;
83 }
84
85 function _inherits(subClass, superClass) {
86 if (typeof superClass !== "function" && superClass !== null) {
87 throw new TypeError("Super expression must either be null or a function");
88 }
89
90 subClass.prototype = Object.create(superClass && superClass.prototype, {
91 constructor: {
92 value: subClass,
93 writable: true,
94 configurable: true
95 }
96 });
97 Object.defineProperty(subClass, "prototype", {
98 writable: false
99 });
100 if (superClass) _setPrototypeOf(subClass, superClass);
101 }
102
103 function _getPrototypeOf(o) {
104 _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
105 return o.__proto__ || Object.getPrototypeOf(o);
106 };
107 return _getPrototypeOf(o);
108 }
109
110 function _setPrototypeOf(o, p) {
111 _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
112 o.__proto__ = p;
113 return o;
114 };
115 return _setPrototypeOf(o, p);
116 }
117
118 function _isNativeReflectConstruct() {
119 if (typeof Reflect === "undefined" || !Reflect.construct) return false;
120 if (Reflect.construct.sham) return false;
121 if (typeof Proxy === "function") return true;
122
123 try {
124 Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
125 return true;
126 } catch (e) {
127 return false;
128 }
129 }
130
131 function _objectWithoutPropertiesLoose(source, excluded) {
132 if (source == null) return {};
133 var target = {};
134 var sourceKeys = Object.keys(source);
135 var key, i;
136
137 for (i = 0; i < sourceKeys.length; i++) {
138 key = sourceKeys[i];
139 if (excluded.indexOf(key) >= 0) continue;
140 target[key] = source[key];
141 }
142
143 return target;
144 }
145
146 function _objectWithoutProperties(source, excluded) {
147 if (source == null) return {};
148
149 var target = _objectWithoutPropertiesLoose(source, excluded);
150
151 var key, i;
152
153 if (Object.getOwnPropertySymbols) {
154 var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
155
156 for (i = 0; i < sourceSymbolKeys.length; i++) {
157 key = sourceSymbolKeys[i];
158 if (excluded.indexOf(key) >= 0) continue;
159 if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
160 target[key] = source[key];
161 }
162 }
163
164 return target;
165 }
166
167 function _assertThisInitialized(self) {
168 if (self === void 0) {
169 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
170 }
171
172 return self;
173 }
174
175 function _possibleConstructorReturn(self, call) {
176 if (call && (typeof call === "object" || typeof call === "function")) {
177 return call;
178 } else if (call !== void 0) {
179 throw new TypeError("Derived constructors may only return object or undefined");
180 }
181
182 return _assertThisInitialized(self);
183 }
184
185 function _createSuper(Derived) {
186 var hasNativeReflectConstruct = _isNativeReflectConstruct();
187
188 return function _createSuperInternal() {
189 var Super = _getPrototypeOf(Derived),
190 result;
191
192 if (hasNativeReflectConstruct) {
193 var NewTarget = _getPrototypeOf(this).constructor;
194
195 result = Reflect.construct(Super, arguments, NewTarget);
196 } else {
197 result = Super.apply(this, arguments);
198 }
199
200 return _possibleConstructorReturn(this, result);
201 };
202 }
203
204 function _superPropBase(object, property) {
205 while (!Object.prototype.hasOwnProperty.call(object, property)) {
206 object = _getPrototypeOf(object);
207 if (object === null) break;
208 }
209
210 return object;
211 }
212
213 function _get() {
214 if (typeof Reflect !== "undefined" && Reflect.get) {
215 _get = Reflect.get.bind();
216 } else {
217 _get = function _get(target, property, receiver) {
218 var base = _superPropBase(target, property);
219
220 if (!base) return;
221 var desc = Object.getOwnPropertyDescriptor(base, property);
222
223 if (desc.get) {
224 return desc.get.call(arguments.length < 3 ? target : receiver);
225 }
226
227 return desc.value;
228 };
229 }
230
231 return _get.apply(this, arguments);
232 }
233
234 function _toConsumableArray(arr) {
235 return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
236 }
237
238 function _arrayWithoutHoles(arr) {
239 if (Array.isArray(arr)) return _arrayLikeToArray(arr);
240 }
241
242 function _iterableToArray(iter) {
243 if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
244 }
245
246 function _unsupportedIterableToArray(o, minLen) {
247 if (!o) return;
248 if (typeof o === "string") return _arrayLikeToArray(o, minLen);
249 var n = Object.prototype.toString.call(o).slice(8, -1);
250 if (n === "Object" && o.constructor) n = o.constructor.name;
251 if (n === "Map" || n === "Set") return Array.from(o);
252 if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
253 }
254
255 function _arrayLikeToArray(arr, len) {
256 if (len == null || len > arr.length) len = arr.length;
257
258 for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
259
260 return arr2;
261 }
262
263 function _nonIterableSpread() {
264 throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
265 }
266
267 /*
268 Copyright 2013-2015 ASIAL CORPORATION
269
270 Licensed under the Apache License, Version 2.0 (the "License");
271 you may not use this file except in compliance with the License.
272 You may obtain a copy of the License at
273
274 http://www.apache.org/licenses/LICENSE-2.0
275
276 Unless required by applicable law or agreed to in writing, software
277 distributed under the License is distributed on an "AS IS" BASIS,
278 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
279 See the License for the specific language governing permissions and
280 limitations under the License.
281
282 */
283 // Save HTMLElement object before Custom Elements polyfill patch global HTMLElement.
284 var NativeHTMLElement = window.HTMLElement;
285 /**
286 * @object ons.platform
287 * @category util
288 * @description
289 * [en]Utility methods to detect current platform.[/en]
290 * [ja]現在実行されているプラットフォームを検知するためのユーティリティメソッドを収めたオブジェクトです。[/ja]
291 */
292
293 var Platform = /*#__PURE__*/function () {
294 /**
295 * All elements will be rendered as if the app was running on this platform.
296 * @type {String}
297 */
298 function Platform() {
299 _classCallCheck(this, Platform);
300
301 this._selectedPlatform = null;
302 this._ignorePlatformSelect = false;
303 }
304 /**
305 * @method select
306 * @signature select(platform)
307 * @param {string} platform Name of the platform.
308 * [en]Possible values are: "opera", "firefox", "safari", "chrome", "ie", "android", "blackberry", "ios" or "wp".[/en]
309 * [ja]"opera", "firefox", "safari", "chrome", "ie", "android", "blackberry", "ios", "wp"のいずれかを指定します。[/ja]
310 * @description
311 * [en]Sets the platform used to render the elements. Useful for testing.[/en]
312 * [ja]要素を描画するために利用するプラットフォーム名を設定します。テストに便利です。[/ja]
313 */
314
315
316 _createClass(Platform, [{
317 key: "select",
318 value: function select(platform) {
319 if (typeof platform === 'string') {
320 this._selectedPlatform = platform.trim().toLowerCase();
321 }
322 }
323 }, {
324 key: "_getSelectedPlatform",
325 value: function _getSelectedPlatform() {
326 return this._ignorePlatformSelect ? null : this._selectedPlatform;
327 }
328 }, {
329 key: "_runOnActualPlatform",
330 value: function _runOnActualPlatform(fn) {
331 this._ignorePlatformSelect = true;
332 var result = fn();
333 this._ignorePlatformSelect = false;
334 return result;
335 } //----------------
336 // General
337 //----------------
338
339 /**
340 * @method isWebView
341 * @signature isWebView()
342 * @description
343 * [en]Returns whether app is running in Cordova.[/en]
344 * [ja]Cordova内で実行されているかどうかを返します。[/ja]
345 * @return {Boolean}
346 */
347
348 }, {
349 key: "isWebView",
350 value: function isWebView() {
351 if (document.readyState === 'loading' || document.readyState == 'uninitialized') {
352 throw new Error('isWebView() method is available after dom contents loaded.');
353 }
354
355 return !!(window.cordova || window.phonegap || window.PhoneGap);
356 } //----------------
357 // iOS devices
358 //----------------
359
360 /**
361 * @method isIPhone
362 * @signature isIPhone()
363 * @description
364 * [en]Returns whether the device is iPhone.[/en]
365 * [ja]iPhone上で実行されているかどうかを返します。[/ja]
366 * @return {Boolean}
367 */
368
369 }, {
370 key: "isIPhone",
371 value: function isIPhone() {
372 return /iPhone/i.test(navigator.userAgent);
373 }
374 /**
375 * @method isIPhoneX
376 * @signature isIPhoneX()
377 * @description
378 * [en]Returns whether the device is iPhone X, XS, XS Max, XR, 11, 11 Pro, 11 Pro Max, 12 Mini, 12, 12 Pro or 12 Pro Max.[/en]
379 * [ja]iPhone X や XS、XS Max、XR、11、11 Pro、11 Pro Max、12 Mini、12、12 Pro、または12 Pro Max上で実行されているかどうかを返します。[/ja]
380 * @return {Boolean}
381 */
382
383 }, {
384 key: "isIPhoneX",
385 value: function isIPhoneX() {
386 // iOS WebViews on the same iOS version have the same user agent.
387 // We cannot avoid using window.screen.
388 // We also cannot use cordova-plugin-device since its behavior is different between simulators and real devices.
389 // This works well both in iOS Safari and (UI|WK)WebView of iPhone X.
390 return this.isIPhone() && ( // X, XS, 11 Pro, 12 Mini
391 window.screen.width === 375 && window.screen.height === 812 || // portrait
392 window.screen.width === 812 && window.screen.height === 375 || // landscape
393 // XS Max, XR, 11, 11 Pro Max
394 window.screen.width === 414 && window.screen.height === 896 || // portrait
395 window.screen.width === 896 && window.screen.height === 414 || // landscape
396 // 12, 12 Pro
397 window.screen.width === 390 && window.screen.height === 844 || // portrait
398 window.screen.width === 844 && window.screen.height === 390 || // landscape
399 // 12 Pro Max
400 window.screen.width === 428 && window.screen.height === 926 || // portrait
401 window.screen.width === 926 && window.screen.height === 428 // landscape
402 );
403 }
404 /**
405 * @method isIPad
406 * @signature isIPad()
407 * @description
408 * [en]Returns whether the device is iPad.[/en]
409 * [ja]iPad上で実行されているかどうかを返します。[/ja]
410 * @return {Boolean}
411 */
412
413 }, {
414 key: "isIPad",
415 value: function isIPad() {
416 return /iPad/i.test(navigator.userAgent) || this.isIPadOS();
417 }
418 /**
419 * @return {Boolean}
420 */
421
422 }, {
423 key: "isIPod",
424 value: function isIPod() {
425 return /iPod/i.test(navigator.userAgent);
426 } //----------------
427 // iOS versions
428 //----------------
429
430 /**
431 * @method isIOS
432 * @signature isIOS([forceActualPlatform])
433 * @param {Boolean} forceActualPlatform
434 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
435 * [ja][/ja]
436 * @description
437 * [en]Returns whether the OS is iOS. By default will return manually selected platform if it is set.[/en]
438 * [ja]iOS上で実行されているかどうかを返します。[/ja]
439 * @return {Boolean}
440 */
441
442 }, {
443 key: "isIOS",
444 value: function isIOS(forceActualPlatform) {
445 if (!forceActualPlatform && this._getSelectedPlatform()) {
446 return this._getSelectedPlatform() === 'ios';
447 }
448
449 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
450 return /iOS/i.test(device.platform);
451 } else {
452 return /iPhone|iPad|iPod/i.test(navigator.userAgent) || this.isIPadOS();
453 }
454 }
455 /**
456 * @method isIOS7above
457 * @signature isIOS7above()
458 * @description
459 * [en]Returns whether the iOS version is 7 or above.[/en]
460 * [ja]iOS7以上で実行されているかどうかを返します。[/ja]
461 * @return {Boolean}
462 */
463
464 }, {
465 key: "isIOS7above",
466 value: function isIOS7above() {
467 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
468 return /iOS/i.test(device.platform) && parseInt(device.version.split('.')[0]) >= 7;
469 } else if (/iPhone|iPad|iPod/i.test(navigator.userAgent)) {
470 var ver = (navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/) || [''])[0].replace(/_/g, '.');
471 return parseInt(ver.split('.')[0]) >= 7;
472 }
473
474 return false;
475 }
476 /**
477 * @method isIPadOS
478 * @signature isIPadOS()
479 * @description
480 * [en]Returns whether the OS is iPadOS.[/en]
481 * [ja][/ja]
482 * @return {Boolean}
483 */
484
485 }, {
486 key: "isIPadOS",
487 value: function isIPadOS() {
488 // The iPadOS User Agent string is the same as MacOS so as a
489 // workaround we test the max touch points, which is 5 for
490 // iPads and 0 for desktop browsers.
491 return !!(/Macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints === 5);
492 } //----------------
493 // iOS browsers
494 //----------------
495
496 /**
497 * @method isIOSSafari
498 * @signature isIOSSafari()
499 * @description
500 * [en]Returns whether app is running in iOS Safari.[/en]
501 * [ja]iOS Safariで実行されているかどうかを返します。[/ja]
502 * @return {Boolean}
503 */
504
505 }, {
506 key: "isIOSSafari",
507 value: function isIOSSafari() {
508 var navigator = window.navigator;
509 var ua = navigator.userAgent;
510 return !!(this.isIOS() && ua.indexOf('Safari') !== -1 && ua.indexOf('Version') !== -1 && !navigator.standalone);
511 }
512 /**
513 * @method isWKWebView
514 * @signature isWKWebView()
515 * @description
516 * [en]Returns whether app is running in WKWebView.[/en]
517 * [ja]WKWebViewで実行されているかどうかを返します。[/ja]
518 * @return {Boolean}
519 */
520
521 }, {
522 key: "isWKWebView",
523 value: function isWKWebView() {
524 var lte9 = /constructor/i.test(NativeHTMLElement);
525 return !!(this.isIOS() && window.webkit && window.webkit.messageHandlers && window.indexedDB && !lte9);
526 } //----------------
527 // Android devices
528 //----------------
529
530 /**
531 * @method isAndroidPhone
532 * @signature isAndroidPhone()
533 * @description
534 * [en]Returns whether the device is Android phone.[/en]
535 * [ja]Android携帯上で実行されているかどうかを返します。[/ja]
536 * @return {Boolean}
537 */
538
539 }, {
540 key: "isAndroidPhone",
541 value: function isAndroidPhone() {
542 return /Android/i.test(navigator.userAgent) && /Mobile/i.test(navigator.userAgent);
543 }
544 /**
545 * @method isAndroidTablet
546 * @signature isAndroidTablet()
547 * @description
548 * [en]Returns whether the device is Android tablet.[/en]
549 * [ja]Androidタブレット上で実行されているかどうかを返します。[/ja]
550 * @return {Boolean}
551 */
552
553 }, {
554 key: "isAndroidTablet",
555 value: function isAndroidTablet() {
556 return /Android/i.test(navigator.userAgent) && !/Mobile/i.test(navigator.userAgent);
557 } //----------------
558 // Android versions
559 //----------------
560
561 /**
562 * @method isAndroid
563 * @signature isAndroid([forceActualPlatform])
564 * @param {Boolean} forceActualPlatform
565 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
566 * [ja][/ja]
567 * @description
568 * [en]Returns whether the OS is Android. By default will return manually selected platform if it is set.[/en]
569 * [ja]Android上で実行されているかどうかを返します。[/ja]
570 * @return {Boolean}
571 */
572
573 }, {
574 key: "isAndroid",
575 value: function isAndroid(forceActualPlatform) {
576 if (!forceActualPlatform && this._getSelectedPlatform()) {
577 return this._getSelectedPlatform() === 'android';
578 }
579
580 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
581 return /Android/i.test(device.platform);
582 } else {
583 return /Android/i.test(navigator.userAgent);
584 }
585 } //----------------
586 // Other devices
587 //----------------
588
589 /**
590 * @method isWP
591 * @signature isWP([forceActualPlatform])
592 * @param {Boolean} forceActualPlatform
593 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
594 * [ja][/ja]
595 * @description
596 * [en]Returns whether the OS is Windows phone. By default will return manually selected platform if it is set.[/en]
597 * [ja][/ja]
598 * @return {Boolean}
599 */
600
601 }, {
602 key: "isWP",
603 value: function isWP(forceActualPlatform) {
604 if (!forceActualPlatform && this._getSelectedPlatform()) {
605 return this._getSelectedPlatform() === 'wp';
606 }
607
608 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
609 return /Win32NT|WinCE/i.test(device.platform);
610 } else {
611 return /Windows Phone|IEMobile|WPDesktop/i.test(navigator.userAgent);
612 }
613 }
614 /**
615 * @method isBlackBerry
616 * @signature isBlackBerry([forceActualPlatform])
617 * @param {Boolean} forceActualPlatform
618 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
619 * [ja][/ja]
620 * @description
621 * [en]Returns whether the device is BlackBerry. By default will return manually selected platform if it is set.[/en]
622 * [ja]BlackBerry上で実行されているかどうかを返します。[/ja]
623 * @return {Boolean}
624 */
625
626 }, {
627 key: "isBlackBerry",
628 value: function isBlackBerry(forceActualPlatform) {
629 if (!forceActualPlatform && this._getSelectedPlatform()) {
630 return this._getSelectedPlatform() === 'blackberry';
631 }
632
633 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
634 return /BlackBerry/i.test(device.platform);
635 } else {
636 return /BlackBerry|RIM Tablet OS|BB10/i.test(navigator.userAgent);
637 }
638 } //----------------
639 // Other browsers
640 //----------------
641
642 /**
643 * @method isOpera
644 * @signature isOpera([forceActualPlatform])
645 * @param {Boolean} forceActualPlatform
646 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
647 * [ja][/ja]
648 * @description
649 * [en]Returns whether the browser is Opera. By default will return manually selected platform if it is set.[/en]
650 * [ja]Opera上で実行されているかどうかを返します。[/ja]
651 * @return {Boolean}
652 */
653
654 }, {
655 key: "isOpera",
656 value: function isOpera(forceActualPlatform) {
657 if (!forceActualPlatform && this._getSelectedPlatform()) {
658 return this._getSelectedPlatform() === 'opera';
659 }
660
661 return !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
662 }
663 /**
664 * @method isFirefox
665 * @signature isFirefox([forceActualPlatform])
666 * @param {Boolean} forceActualPlatform
667 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
668 * [ja][/ja]
669 * @description
670 * [en]Returns whether the browser is Firefox. By default will return manually selected platform if it is set.[/en]
671 * [ja]Firefox上で実行されているかどうかを返します。[/ja]
672 * @return {Boolean}
673 */
674
675 }, {
676 key: "isFirefox",
677 value: function isFirefox(forceActualPlatform) {
678 if (!forceActualPlatform && this._getSelectedPlatform()) {
679 return this._getSelectedPlatform() === 'firefox';
680 }
681
682 return typeof InstallTrigger !== 'undefined';
683 }
684 /**
685 * @method isSafari
686 * @signature isSafari([forceActualPlatform])
687 * @param {Boolean} forceActualPlatform
688 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
689 * [ja][/ja]
690 * @description
691 * [en]Returns whether the browser is Safari. By default will return manually selected platform if it is set.[/en]
692 * [ja]Safari上で実行されているかどうかを返します。[/ja]
693 * @return {Boolean}
694 */
695
696 }, {
697 key: "isSafari",
698 value: function isSafari(forceActualPlatform) {
699 if (!forceActualPlatform && this._getSelectedPlatform()) {
700 return this._getSelectedPlatform() === 'safari';
701 }
702
703 return Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || function (p) {
704 return p.toString() === '[object SafariRemoteNotification]';
705 }(!window['safari'] || safari.pushNotification);
706 }
707 /**
708 * @method isChrome
709 * @signature isChrome([forceActualPlatform])
710 * @param {Boolean} forceActualPlatform
711 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
712 * [ja][/ja]
713 * @description
714 * [en]Returns whether the browser is Chrome. By default will return manually selected platform if it is set.[/en]
715 * [ja]Chrome上で実行されているかどうかを返します。[/ja]
716 * @return {Boolean}
717 */
718
719 }, {
720 key: "isChrome",
721 value: function isChrome(forceActualPlatform) {
722 if (!forceActualPlatform && this._getSelectedPlatform()) {
723 return this._getSelectedPlatform() === 'chrome';
724 }
725
726 return !!window.chrome && !(!!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0) && !(navigator.userAgent.indexOf(' Edge/') >= 0);
727 }
728 /**
729 * @method isIE
730 * @signature isIE([forceActualPlatform])
731 * @param {Boolean} forceActualPlatform
732 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
733 * [ja][/ja]
734 * @description
735 * [en]Returns whether the browser is Internet Explorer. By default will return manually selected platform if it is set.[/en]
736 * [ja]Internet Explorer上で実行されているかどうかを返します。[/ja]
737 * @return {Boolean}
738 */
739
740 }, {
741 key: "isIE",
742 value: function isIE(forceActualPlatform) {
743 if (!forceActualPlatform && this._getSelectedPlatform()) {
744 return this._getSelectedPlatform() === 'ie';
745 }
746
747 return !!document.documentMode;
748 }
749 /**
750 * @method isEdge
751 * @signature isEdge([forceActualPlatform])
752 * @param {Boolean} forceActualPlatform
753 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
754 * [ja][/ja]
755 * @description
756 * [en]Returns whether the browser is Edge. By default will return manually selected platform if it is set.[/en]
757 * [ja]Edge上で実行されているかどうかを返します。[/ja]
758 * @return {Boolean}
759 */
760
761 }, {
762 key: "isEdge",
763 value: function isEdge(forceActualPlatform) {
764 if (!forceActualPlatform && this._getSelectedPlatform()) {
765 return this._getSelectedPlatform() === 'edge';
766 }
767
768 return navigator.userAgent.indexOf(' Edge/') >= 0;
769 } //----------------
770 // Utility functions
771 //----------------
772
773 /**
774 * @return {String}
775 */
776
777 }, {
778 key: "getMobileOS",
779 value: function getMobileOS() {
780 if (this.isAndroid()) {
781 return 'android';
782 } else if (this.isIOS()) {
783 return 'ios';
784 } else if (this.isWP()) {
785 return 'wp';
786 } else {
787 return 'other';
788 }
789 }
790 /**
791 * @return {String}
792 */
793
794 }, {
795 key: "getIOSDevice",
796 value: function getIOSDevice() {
797 if (this.isIPhone()) {
798 return 'iphone';
799 } else if (this.isIPad()) {
800 return 'ipad';
801 } else if (this.isIPod()) {
802 return 'ipod';
803 } else {
804 return 'na';
805 }
806 }
807 }]);
808
809 return Platform;
810 }();
811
812 var platform = new Platform();
813
814 // For @onsenui/custom-elements
815 if (window.customElements) {
816 // even if native CE1 impl exists, use polyfill
817 window.customElements.forcePolyfill = true;
818 }
819
820 (function () {
821
822 var g = new function () {}();
823 var aa = new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));
824
825 function k(b) {
826 var a = aa.has(b);
827 b = /^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(b);
828 return !a && b;
829 }
830
831 function l(b) {
832 var a = b.isConnected;
833 if (void 0 !== a) return a;
834
835 for (; b && !(b.__CE_isImportDocument || b instanceof Document);) {
836 b = b.parentNode || (window.ShadowRoot && b instanceof ShadowRoot ? b.host : void 0);
837 }
838
839 return !(!b || !(b.__CE_isImportDocument || b instanceof Document));
840 }
841
842 function m(b, a) {
843 for (; a && a !== b && !a.nextSibling;) {
844 a = a.parentNode;
845 }
846
847 return a && a !== b ? a.nextSibling : null;
848 }
849
850 function n(b, a, e) {
851 e = e ? e : new Set();
852
853 for (var c = b; c;) {
854 if (c.nodeType === Node.ELEMENT_NODE) {
855 var d = c;
856 a(d);
857 var h = d.localName;
858
859 if ("link" === h && "import" === d.getAttribute("rel")) {
860 c = d.import;
861 if (c instanceof Node && !e.has(c)) for (e.add(c), c = c.firstChild; c; c = c.nextSibling) {
862 n(c, a, e);
863 }
864 c = m(b, d);
865 continue;
866 } else if ("template" === h) {
867 c = m(b, d);
868 continue;
869 }
870
871 if (d = d.__CE_shadowRoot) for (d = d.firstChild; d; d = d.nextSibling) {
872 n(d, a, e);
873 }
874 }
875
876 c = c.firstChild ? c.firstChild : m(b, c);
877 }
878 }
879
880 function q(b, a, e) {
881 b[a] = e;
882 }
883
884 function r() {
885 this.a = new Map();
886 this.f = new Map();
887 this.c = [];
888 this.b = !1;
889 }
890
891 function ba(b, a, e) {
892 b.a.set(a, e);
893 b.f.set(e.constructor, e);
894 }
895
896 function t(b, a) {
897 b.b = !0;
898 b.c.push(a);
899 }
900
901 function v(b, a) {
902 b.b && n(a, function (a) {
903 return w(b, a);
904 });
905 }
906
907 function w(b, a) {
908 if (b.b && !a.__CE_patched) {
909 a.__CE_patched = !0;
910
911 for (var e = 0; e < b.c.length; e++) {
912 b.c[e](a);
913 }
914 }
915 }
916
917 function x(b, a) {
918 var e = [];
919 n(a, function (b) {
920 return e.push(b);
921 });
922
923 for (a = 0; a < e.length; a++) {
924 var c = e[a];
925 1 === c.__CE_state ? l(c) && b.connectedCallback(c) : y(b, c);
926 }
927 }
928
929 function z(b, a) {
930 var e = [];
931 n(a, function (b) {
932 return e.push(b);
933 });
934
935 for (a = 0; a < e.length; a++) {
936 var c = e[a];
937 1 === c.__CE_state && b.disconnectedCallback(c);
938 }
939 }
940
941 function A(b, a, e) {
942 e = e ? e : new Set();
943 var c = [];
944 n(a, function (d) {
945 if ("link" === d.localName && "import" === d.getAttribute("rel")) {
946 var a = d.import;
947 a instanceof Node && "complete" === a.readyState ? (a.__CE_isImportDocument = !0, a.__CE_hasRegistry = !0) : d.addEventListener("load", function () {
948 var a = d.import;
949 a.__CE_documentLoadHandled || (a.__CE_documentLoadHandled = !0, a.__CE_isImportDocument = !0, a.__CE_hasRegistry = !0, e.delete(a), A(b, a, e));
950 });
951 } else c.push(d);
952 }, e);
953 if (b.b) for (a = 0; a < c.length; a++) {
954 w(b, c[a]);
955 }
956
957 for (a = 0; a < c.length; a++) {
958 y(b, c[a]);
959 }
960 }
961
962 function y(b, a) {
963 if (void 0 === a.__CE_state) {
964 var e = b.a.get(a.localName);
965
966 if (e) {
967 e.constructionStack.push(a);
968 var c = e.constructor;
969
970 try {
971 try {
972 if (new c() !== a) throw Error("The custom element constructor did not produce the element being upgraded.");
973 } finally {
974 e.constructionStack.pop();
975 }
976 } catch (f) {
977 throw a.__CE_state = 2, f;
978 }
979
980 a.__CE_state = 1;
981 a.__CE_definition = e;
982 if (e.attributeChangedCallback) for (e = e.observedAttributes, c = 0; c < e.length; c++) {
983 var d = e[c],
984 h = a.getAttribute(d);
985 null !== h && b.attributeChangedCallback(a, d, null, h, null);
986 }
987 l(a) && b.connectedCallback(a);
988 }
989 }
990 }
991
992 r.prototype.connectedCallback = function (b) {
993 var a = b.__CE_definition;
994 a.connectedCallback && a.connectedCallback.call(b);
995 b.i = !0;
996 };
997
998 r.prototype.disconnectedCallback = function (b) {
999 b.i || this.connectedCallback(b);
1000 var a = b.__CE_definition;
1001 a.disconnectedCallback && a.disconnectedCallback.call(b);
1002 b.i = void 0;
1003 };
1004
1005 r.prototype.attributeChangedCallback = function (b, a, e, c, d) {
1006 var h = b.__CE_definition;
1007 h.attributeChangedCallback && -1 < h.observedAttributes.indexOf(a) && h.attributeChangedCallback.call(b, a, e, c, d);
1008 };
1009
1010 function B(b, a) {
1011 this.c = b;
1012 this.a = a;
1013 this.b = void 0;
1014 A(this.c, this.a);
1015 "loading" === this.a.readyState && (this.b = new MutationObserver(this.f.bind(this)), this.b.observe(this.a, {
1016 childList: !0,
1017 subtree: !0
1018 }));
1019 }
1020
1021 function C(b) {
1022 b.b && b.b.disconnect();
1023 }
1024
1025 B.prototype.f = function (b) {
1026 var a = this.a.readyState;
1027 "interactive" !== a && "complete" !== a || C(this);
1028
1029 for (a = 0; a < b.length; a++) {
1030 for (var e = b[a].addedNodes, c = 0; c < e.length; c++) {
1031 A(this.c, e[c]);
1032 }
1033 }
1034 };
1035
1036 function ca() {
1037 var b = this;
1038 this.b = this.a = void 0;
1039 this.c = new Promise(function (a) {
1040 b.b = a;
1041 b.a && a(b.a);
1042 });
1043 }
1044
1045 function D(b) {
1046 if (b.a) throw Error("Already resolved.");
1047 b.a = void 0;
1048 b.b && b.b(void 0);
1049 }
1050
1051 function E(b) {
1052 this.f = !1;
1053 this.a = b;
1054 this.h = new Map();
1055
1056 this.g = function (b) {
1057 return b();
1058 };
1059
1060 this.b = !1;
1061 this.c = [];
1062 this.l = new B(b, document);
1063 }
1064
1065 E.prototype.m = function (b, a) {
1066 var e = this;
1067 if (!(a instanceof Function)) throw new TypeError("Custom element constructors must be functions.");
1068 if (!k(b)) throw new SyntaxError("The element name '" + b + "' is not valid.");
1069 if (this.a.a.get(b)) throw Error("A custom element with name '" + b + "' has already been defined.");
1070 if (this.f) throw Error("A custom element is already being defined.");
1071 this.f = !0;
1072 var c, d, h, f, u;
1073
1074 try {
1075 var p = function p(b) {
1076 var a = P[b];
1077 if (void 0 !== a && !(a instanceof Function)) throw Error("The '" + b + "' callback must be a function.");
1078 return a;
1079 },
1080 P = a.prototype;
1081
1082 if (!(P instanceof Object)) throw new TypeError("The custom element constructor's prototype is not an object.");
1083 c = p("connectedCallback");
1084 d = p("disconnectedCallback");
1085 h = p("adoptedCallback");
1086 f = p("attributeChangedCallback");
1087 u = a.observedAttributes || [];
1088 } catch (va) {
1089 return;
1090 } finally {
1091 this.f = !1;
1092 }
1093
1094 ba(this.a, b, {
1095 localName: b,
1096 constructor: a,
1097 connectedCallback: c,
1098 disconnectedCallback: d,
1099 adoptedCallback: h,
1100 attributeChangedCallback: f,
1101 observedAttributes: u,
1102 constructionStack: []
1103 });
1104 this.c.push(b);
1105 this.b || (this.b = !0, this.g(function () {
1106 if (!1 !== e.b) for (e.b = !1, A(e.a, document); 0 < e.c.length;) {
1107 var b = e.c.shift();
1108 (b = e.h.get(b)) && D(b);
1109 }
1110 }));
1111 };
1112
1113 E.prototype.get = function (b) {
1114 if (b = this.a.a.get(b)) return b.constructor;
1115 };
1116
1117 E.prototype.s = function (b) {
1118 if (!k(b)) return Promise.reject(new SyntaxError("'" + b + "' is not a valid custom element name."));
1119 var a = this.h.get(b);
1120 if (a) return a.c;
1121 a = new ca();
1122 this.h.set(b, a);
1123 this.a.a.get(b) && -1 === this.c.indexOf(b) && D(a);
1124 return a.c;
1125 };
1126
1127 E.prototype.o = function (b) {
1128 C(this.l);
1129 var a = this.g;
1130
1131 this.g = function (e) {
1132 return b(function () {
1133 return a(e);
1134 });
1135 };
1136 };
1137
1138 window.CustomElementRegistry = E;
1139 E.prototype.define = E.prototype.m;
1140 E.prototype.get = E.prototype.get;
1141 E.prototype.whenDefined = E.prototype.s;
1142 E.prototype.polyfillWrapFlushCallback = E.prototype.o;
1143 var F = window.Document.prototype.createElement,
1144 da = window.Document.prototype.createElementNS,
1145 ea = window.Document.prototype.importNode,
1146 fa = window.Document.prototype.prepend,
1147 ga = window.Document.prototype.append,
1148 G = window.Node.prototype.cloneNode,
1149 H = window.Node.prototype.appendChild,
1150 I = window.Node.prototype.insertBefore,
1151 J = window.Node.prototype.removeChild,
1152 K = window.Node.prototype.replaceChild,
1153 L = Object.getOwnPropertyDescriptor(window.Node.prototype, "textContent"),
1154 M = window.Element.prototype.attachShadow,
1155 N = Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML"),
1156 O = window.Element.prototype.getAttribute,
1157 Q = window.Element.prototype.setAttribute,
1158 R = window.Element.prototype.removeAttribute,
1159 S = window.Element.prototype.getAttributeNS,
1160 T = window.Element.prototype.setAttributeNS,
1161 U = window.Element.prototype.removeAttributeNS,
1162 V = window.Element.prototype.insertAdjacentElement,
1163 ha = window.Element.prototype.prepend,
1164 ia = window.Element.prototype.append,
1165 ja = window.Element.prototype.before,
1166 ka = window.Element.prototype.after,
1167 la = window.Element.prototype.replaceWith,
1168 ma = window.Element.prototype.remove,
1169 na = window.HTMLElement,
1170 W = Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, "innerHTML"),
1171 X = window.HTMLElement.prototype.insertAdjacentElement;
1172
1173 function oa() {
1174 var b = Y;
1175
1176 window.HTMLElement = function () {
1177 function a() {
1178 var a = this.constructor,
1179 c = b.f.get(a);
1180 if (!c) throw Error("The custom element being constructed was not registered with `customElements`.");
1181 var d = c.constructionStack;
1182 if (!d.length) return d = F.call(document, c.localName), Object.setPrototypeOf(d, a.prototype), d.__CE_state = 1, d.__CE_definition = c, w(b, d), d;
1183 var c = d.length - 1,
1184 h = d[c];
1185 if (h === g) throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
1186 d[c] = g;
1187 Object.setPrototypeOf(h, a.prototype);
1188 w(b, h);
1189 return h;
1190 }
1191
1192 a.prototype = na.prototype;
1193 return a;
1194 }();
1195 }
1196
1197 function pa(b, a, e) {
1198 a.prepend = function (a) {
1199 for (var d = [], c = 0; c < arguments.length; ++c) {
1200 d[c - 0] = arguments[c];
1201 }
1202
1203 c = d.filter(function (b) {
1204 return b instanceof Node && l(b);
1205 });
1206 e.j.apply(this, d);
1207
1208 for (var f = 0; f < c.length; f++) {
1209 z(b, c[f]);
1210 }
1211
1212 if (l(this)) for (c = 0; c < d.length; c++) {
1213 f = d[c], f instanceof Element && x(b, f);
1214 }
1215 };
1216
1217 a.append = function (a) {
1218 for (var d = [], c = 0; c < arguments.length; ++c) {
1219 d[c - 0] = arguments[c];
1220 }
1221
1222 c = d.filter(function (b) {
1223 return b instanceof Node && l(b);
1224 });
1225 e.append.apply(this, d);
1226
1227 for (var f = 0; f < c.length; f++) {
1228 z(b, c[f]);
1229 }
1230
1231 if (l(this)) for (c = 0; c < d.length; c++) {
1232 f = d[c], f instanceof Element && x(b, f);
1233 }
1234 };
1235 }
1236
1237 function qa() {
1238 var b = Y;
1239 q(Document.prototype, "createElement", function (a) {
1240 if (this.__CE_hasRegistry) {
1241 var e = b.a.get(a);
1242 if (e) return new e.constructor();
1243 }
1244
1245 a = F.call(this, a);
1246 w(b, a);
1247 return a;
1248 });
1249 q(Document.prototype, "importNode", function (a, e) {
1250 a = ea.call(this, a, e);
1251 this.__CE_hasRegistry ? A(b, a) : v(b, a);
1252 return a;
1253 });
1254 q(Document.prototype, "createElementNS", function (a, e) {
1255 if (this.__CE_hasRegistry && (null === a || "http://www.w3.org/1999/xhtml" === a)) {
1256 var c = b.a.get(e);
1257 if (c) return new c.constructor();
1258 }
1259
1260 a = da.call(this, a, e);
1261 w(b, a);
1262 return a;
1263 });
1264 pa(b, Document.prototype, {
1265 j: fa,
1266 append: ga
1267 });
1268 }
1269
1270 function ra() {
1271 var b = Y;
1272
1273 function a(a, c) {
1274 Object.defineProperty(a, "textContent", {
1275 enumerable: c.enumerable,
1276 configurable: !0,
1277 get: c.get,
1278 set: function set(a) {
1279 if (this.nodeType === Node.TEXT_NODE) c.set.call(this, a);else {
1280 var d = void 0;
1281
1282 if (this.firstChild) {
1283 var e = this.childNodes,
1284 u = e.length;
1285 if (0 < u && l(this)) for (var d = Array(u), p = 0; p < u; p++) {
1286 d[p] = e[p];
1287 }
1288 }
1289
1290 c.set.call(this, a);
1291 if (d) for (a = 0; a < d.length; a++) {
1292 z(b, d[a]);
1293 }
1294 }
1295 }
1296 });
1297 }
1298
1299 q(Node.prototype, "insertBefore", function (a, c) {
1300 if (a instanceof DocumentFragment) {
1301 var d = Array.prototype.slice.apply(a.childNodes);
1302 a = I.call(this, a, c);
1303 if (l(this)) for (c = 0; c < d.length; c++) {
1304 x(b, d[c]);
1305 }
1306 return a;
1307 }
1308
1309 d = l(a);
1310 c = I.call(this, a, c);
1311 d && z(b, a);
1312 l(this) && x(b, a);
1313 return c;
1314 });
1315 q(Node.prototype, "appendChild", function (a) {
1316 if (a instanceof DocumentFragment) {
1317 var c = Array.prototype.slice.apply(a.childNodes);
1318 a = H.call(this, a);
1319 if (l(this)) for (var d = 0; d < c.length; d++) {
1320 x(b, c[d]);
1321 }
1322 return a;
1323 }
1324
1325 c = l(a);
1326 d = H.call(this, a);
1327 c && z(b, a);
1328 l(this) && x(b, a);
1329 return d;
1330 });
1331 q(Node.prototype, "cloneNode", function (a) {
1332 a = G.call(this, a);
1333 this.ownerDocument.__CE_hasRegistry ? A(b, a) : v(b, a);
1334 return a;
1335 });
1336 q(Node.prototype, "removeChild", function (a) {
1337 var c = l(a),
1338 d = J.call(this, a);
1339 c && z(b, a);
1340 return d;
1341 });
1342 q(Node.prototype, "replaceChild", function (a, c) {
1343 if (a instanceof DocumentFragment) {
1344 var d = Array.prototype.slice.apply(a.childNodes);
1345 a = K.call(this, a, c);
1346 if (l(this)) for (z(b, c), c = 0; c < d.length; c++) {
1347 x(b, d[c]);
1348 }
1349 return a;
1350 }
1351
1352 var d = l(a),
1353 e = K.call(this, a, c),
1354 f = l(this);
1355 f && z(b, c);
1356 d && z(b, a);
1357 f && x(b, a);
1358 return e;
1359 });
1360 L && L.get ? a(Node.prototype, L) : t(b, function (b) {
1361 a(b, {
1362 enumerable: !0,
1363 configurable: !0,
1364 get: function get() {
1365 for (var a = [], b = 0; b < this.childNodes.length; b++) {
1366 a.push(this.childNodes[b].textContent);
1367 }
1368
1369 return a.join("");
1370 },
1371 set: function set(a) {
1372 for (; this.firstChild;) {
1373 J.call(this, this.firstChild);
1374 }
1375
1376 H.call(this, document.createTextNode(a));
1377 }
1378 });
1379 });
1380 }
1381
1382 function sa(b) {
1383 var a = Element.prototype;
1384
1385 a.before = function (a) {
1386 for (var c = [], d = 0; d < arguments.length; ++d) {
1387 c[d - 0] = arguments[d];
1388 }
1389
1390 d = c.filter(function (a) {
1391 return a instanceof Node && l(a);
1392 });
1393 ja.apply(this, c);
1394
1395 for (var e = 0; e < d.length; e++) {
1396 z(b, d[e]);
1397 }
1398
1399 if (l(this)) for (d = 0; d < c.length; d++) {
1400 e = c[d], e instanceof Element && x(b, e);
1401 }
1402 };
1403
1404 a.after = function (a) {
1405 for (var c = [], d = 0; d < arguments.length; ++d) {
1406 c[d - 0] = arguments[d];
1407 }
1408
1409 d = c.filter(function (a) {
1410 return a instanceof Node && l(a);
1411 });
1412 ka.apply(this, c);
1413
1414 for (var e = 0; e < d.length; e++) {
1415 z(b, d[e]);
1416 }
1417
1418 if (l(this)) for (d = 0; d < c.length; d++) {
1419 e = c[d], e instanceof Element && x(b, e);
1420 }
1421 };
1422
1423 a.replaceWith = function (a) {
1424 for (var c = [], d = 0; d < arguments.length; ++d) {
1425 c[d - 0] = arguments[d];
1426 }
1427
1428 var d = c.filter(function (a) {
1429 return a instanceof Node && l(a);
1430 }),
1431 e = l(this);
1432 la.apply(this, c);
1433
1434 for (var f = 0; f < d.length; f++) {
1435 z(b, d[f]);
1436 }
1437
1438 if (e) for (z(b, this), d = 0; d < c.length; d++) {
1439 e = c[d], e instanceof Element && x(b, e);
1440 }
1441 };
1442
1443 a.remove = function () {
1444 var a = l(this);
1445 ma.call(this);
1446 a && z(b, this);
1447 };
1448 }
1449
1450 function ta() {
1451 var b = Y;
1452
1453 function a(a, c) {
1454 Object.defineProperty(a, "innerHTML", {
1455 enumerable: c.enumerable,
1456 configurable: !0,
1457 get: c.get,
1458 set: function set(a) {
1459 var d = this,
1460 e = void 0;
1461 l(this) && (e = [], n(this, function (a) {
1462 a !== d && e.push(a);
1463 }));
1464 c.set.call(this, a);
1465 if (e) for (var f = 0; f < e.length; f++) {
1466 var h = e[f];
1467 1 === h.__CE_state && b.disconnectedCallback(h);
1468 }
1469 this.ownerDocument.__CE_hasRegistry ? A(b, this) : v(b, this);
1470 return a;
1471 }
1472 });
1473 }
1474
1475 function e(a, c) {
1476 q(a, "insertAdjacentElement", function (a, d) {
1477 var e = l(d);
1478 a = c.call(this, a, d);
1479 e && z(b, d);
1480 l(a) && x(b, d);
1481 return a;
1482 });
1483 }
1484
1485 M ? q(Element.prototype, "attachShadow", function (a) {
1486 return this.__CE_shadowRoot = a = M.call(this, a);
1487 }) : console.warn("Custom Elements: `Element#attachShadow` was not patched.");
1488 if (N && N.get) a(Element.prototype, N);else if (W && W.get) a(HTMLElement.prototype, W);else {
1489 var c = F.call(document, "div");
1490 t(b, function (b) {
1491 a(b, {
1492 enumerable: !0,
1493 configurable: !0,
1494 get: function get() {
1495 return G.call(this, !0).innerHTML;
1496 },
1497 set: function set(a) {
1498 var b = "template" === this.localName ? this.content : this;
1499
1500 for (c.innerHTML = a; 0 < b.childNodes.length;) {
1501 J.call(b, b.childNodes[0]);
1502 }
1503
1504 for (; 0 < c.childNodes.length;) {
1505 H.call(b, c.childNodes[0]);
1506 }
1507 }
1508 });
1509 });
1510 }
1511 q(Element.prototype, "setAttribute", function (a, c) {
1512 if (1 !== this.__CE_state) return Q.call(this, a, c);
1513 var d = O.call(this, a);
1514 Q.call(this, a, c);
1515 c = O.call(this, a);
1516 b.attributeChangedCallback(this, a, d, c, null);
1517 });
1518 q(Element.prototype, "setAttributeNS", function (a, c, e) {
1519 if (1 !== this.__CE_state) return T.call(this, a, c, e);
1520 var d = S.call(this, a, c);
1521 T.call(this, a, c, e);
1522 e = S.call(this, a, c);
1523 b.attributeChangedCallback(this, c, d, e, a);
1524 });
1525 q(Element.prototype, "removeAttribute", function (a) {
1526 if (1 !== this.__CE_state) return R.call(this, a);
1527 var c = O.call(this, a);
1528 R.call(this, a);
1529 null !== c && b.attributeChangedCallback(this, a, c, null, null);
1530 });
1531 q(Element.prototype, "removeAttributeNS", function (a, c) {
1532 if (1 !== this.__CE_state) return U.call(this, a, c);
1533 var d = S.call(this, a, c);
1534 U.call(this, a, c);
1535 var e = S.call(this, a, c);
1536 d !== e && b.attributeChangedCallback(this, c, d, e, a);
1537 });
1538 X ? e(HTMLElement.prototype, X) : V ? e(Element.prototype, V) : console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");
1539 pa(b, Element.prototype, {
1540 j: ha,
1541 append: ia
1542 });
1543 sa(b);
1544 }
1545 /*
1546 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
1547 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
1548 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
1549 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
1550 Code distributed by Google as part of the polymer project is also
1551 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
1552 */
1553
1554 var Z = window.customElements;
1555
1556 if (!Z || Z.forcePolyfill || "function" != typeof Z.define || "function" != typeof Z.get) {
1557 var Y = new r();
1558 oa();
1559 qa();
1560 ra();
1561 ta();
1562 document.__CE_hasRegistry = !0;
1563 var ua = new E(Y);
1564 Object.defineProperty(window, "customElements", {
1565 configurable: !0,
1566 enumerable: !0,
1567 value: ua
1568 });
1569 }
1570 }).call(self);
1571
1572 /**
1573 * @license
1574 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
1575 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
1576 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
1577 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
1578 * Code distributed by Google as part of the polymer project is also
1579 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
1580 */
1581 // @version 0.7.22
1582 (function (global) {
1583 if (global.JsMutationObserver) {
1584 return;
1585 }
1586
1587 var registrationsTable = new WeakMap();
1588 var setImmediate;
1589
1590 if (/Trident|Edge/.test(navigator.userAgent)) {
1591 setImmediate = setTimeout;
1592 } else if (window.setImmediate) {
1593 setImmediate = window.setImmediate;
1594 } else {
1595 var setImmediateQueue = [];
1596 var sentinel = String(Math.random());
1597 window.addEventListener("message", function (e) {
1598 if (e.data === sentinel) {
1599 var queue = setImmediateQueue;
1600 setImmediateQueue = [];
1601 queue.forEach(function (func) {
1602 func();
1603 });
1604 }
1605 });
1606
1607 setImmediate = function setImmediate(func) {
1608 setImmediateQueue.push(func);
1609 window.postMessage(sentinel, "*");
1610 };
1611 }
1612
1613 var isScheduled = false;
1614 var scheduledObservers = [];
1615
1616 function scheduleCallback(observer) {
1617 scheduledObservers.push(observer);
1618
1619 if (!isScheduled) {
1620 isScheduled = true;
1621 setImmediate(dispatchCallbacks);
1622 }
1623 }
1624
1625 function wrapIfNeeded(node) {
1626 return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
1627 }
1628
1629 function dispatchCallbacks() {
1630 isScheduled = false;
1631 var observers = scheduledObservers;
1632 scheduledObservers = [];
1633 observers.sort(function (o1, o2) {
1634 return o1.uid_ - o2.uid_;
1635 });
1636 var anyNonEmpty = false;
1637 observers.forEach(function (observer) {
1638 var queue = observer.takeRecords();
1639 removeTransientObserversFor(observer);
1640
1641 if (queue.length) {
1642 observer.callback_(queue, observer);
1643 anyNonEmpty = true;
1644 }
1645 });
1646 if (anyNonEmpty) dispatchCallbacks();
1647 }
1648
1649 function removeTransientObserversFor(observer) {
1650 observer.nodes_.forEach(function (node) {
1651 var registrations = registrationsTable.get(node);
1652 if (!registrations) return;
1653 registrations.forEach(function (registration) {
1654 if (registration.observer === observer) registration.removeTransientObservers();
1655 });
1656 });
1657 }
1658
1659 function forEachAncestorAndObserverEnqueueRecord(target, callback) {
1660 for (var node = target; node; node = node.parentNode) {
1661 var registrations = registrationsTable.get(node);
1662
1663 if (registrations) {
1664 for (var j = 0; j < registrations.length; j++) {
1665 var registration = registrations[j];
1666 var options = registration.options;
1667 if (node !== target && !options.subtree) continue;
1668 var record = callback(options);
1669 if (record) registration.enqueue(record);
1670 }
1671 }
1672 }
1673 }
1674
1675 var uidCounter = 0;
1676
1677 function JsMutationObserver(callback) {
1678 this.callback_ = callback;
1679 this.nodes_ = [];
1680 this.records_ = [];
1681 this.uid_ = ++uidCounter;
1682 }
1683
1684 JsMutationObserver.prototype = {
1685 observe: function observe(target, options) {
1686 target = wrapIfNeeded(target);
1687
1688 if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
1689 throw new SyntaxError();
1690 }
1691
1692 var registrations = registrationsTable.get(target);
1693 if (!registrations) registrationsTable.set(target, registrations = []);
1694 var registration;
1695
1696 for (var i = 0; i < registrations.length; i++) {
1697 if (registrations[i].observer === this) {
1698 registration = registrations[i];
1699 registration.removeListeners();
1700 registration.options = options;
1701 break;
1702 }
1703 }
1704
1705 if (!registration) {
1706 registration = new Registration(this, target, options);
1707 registrations.push(registration);
1708 this.nodes_.push(target);
1709 }
1710
1711 registration.addListeners();
1712 },
1713 disconnect: function disconnect() {
1714 this.nodes_.forEach(function (node) {
1715 var registrations = registrationsTable.get(node);
1716
1717 for (var i = 0; i < registrations.length; i++) {
1718 var registration = registrations[i];
1719
1720 if (registration.observer === this) {
1721 registration.removeListeners();
1722 registrations.splice(i, 1);
1723 break;
1724 }
1725 }
1726 }, this);
1727 this.records_ = [];
1728 },
1729 takeRecords: function takeRecords() {
1730 var copyOfRecords = this.records_;
1731 this.records_ = [];
1732 return copyOfRecords;
1733 }
1734 };
1735
1736 function MutationRecord(type, target) {
1737 this.type = type;
1738 this.target = target;
1739 this.addedNodes = [];
1740 this.removedNodes = [];
1741 this.previousSibling = null;
1742 this.nextSibling = null;
1743 this.attributeName = null;
1744 this.attributeNamespace = null;
1745 this.oldValue = null;
1746 }
1747
1748 function copyMutationRecord(original) {
1749 var record = new MutationRecord(original.type, original.target);
1750 record.addedNodes = original.addedNodes.slice();
1751 record.removedNodes = original.removedNodes.slice();
1752 record.previousSibling = original.previousSibling;
1753 record.nextSibling = original.nextSibling;
1754 record.attributeName = original.attributeName;
1755 record.attributeNamespace = original.attributeNamespace;
1756 record.oldValue = original.oldValue;
1757 return record;
1758 }
1759
1760 var currentRecord, recordWithOldValue;
1761
1762 function getRecord(type, target) {
1763 return currentRecord = new MutationRecord(type, target);
1764 }
1765
1766 function getRecordWithOldValue(oldValue) {
1767 if (recordWithOldValue) return recordWithOldValue;
1768 recordWithOldValue = copyMutationRecord(currentRecord);
1769 recordWithOldValue.oldValue = oldValue;
1770 return recordWithOldValue;
1771 }
1772
1773 function clearRecords() {
1774 currentRecord = recordWithOldValue = undefined;
1775 }
1776
1777 function recordRepresentsCurrentMutation(record) {
1778 return record === recordWithOldValue || record === currentRecord;
1779 }
1780
1781 function selectRecord(lastRecord, newRecord) {
1782 if (lastRecord === newRecord) return lastRecord;
1783 if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
1784 return null;
1785 }
1786
1787 function Registration(observer, target, options) {
1788 this.observer = observer;
1789 this.target = target;
1790 this.options = options;
1791 this.transientObservedNodes = [];
1792 }
1793
1794 Registration.prototype = {
1795 enqueue: function enqueue(record) {
1796 var records = this.observer.records_;
1797 var length = records.length;
1798
1799 if (records.length > 0) {
1800 var lastRecord = records[length - 1];
1801 var recordToReplaceLast = selectRecord(lastRecord, record);
1802
1803 if (recordToReplaceLast) {
1804 records[length - 1] = recordToReplaceLast;
1805 return;
1806 }
1807 } else {
1808 scheduleCallback(this.observer);
1809 }
1810
1811 records[length] = record;
1812 },
1813 addListeners: function addListeners() {
1814 this.addListeners_(this.target);
1815 },
1816 addListeners_: function addListeners_(node) {
1817 var options = this.options;
1818 if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
1819 if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
1820 if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
1821 if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
1822 },
1823 removeListeners: function removeListeners() {
1824 this.removeListeners_(this.target);
1825 },
1826 removeListeners_: function removeListeners_(node) {
1827 var options = this.options;
1828 if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
1829 if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
1830 if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
1831 if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
1832 },
1833 addTransientObserver: function addTransientObserver(node) {
1834 if (node === this.target) return;
1835 this.addListeners_(node);
1836 this.transientObservedNodes.push(node);
1837 var registrations = registrationsTable.get(node);
1838 if (!registrations) registrationsTable.set(node, registrations = []);
1839 registrations.push(this);
1840 },
1841 removeTransientObservers: function removeTransientObservers() {
1842 var transientObservedNodes = this.transientObservedNodes;
1843 this.transientObservedNodes = [];
1844 transientObservedNodes.forEach(function (node) {
1845 this.removeListeners_(node);
1846 var registrations = registrationsTable.get(node);
1847
1848 for (var i = 0; i < registrations.length; i++) {
1849 if (registrations[i] === this) {
1850 registrations.splice(i, 1);
1851 break;
1852 }
1853 }
1854 }, this);
1855 },
1856 handleEvent: function handleEvent(e) {
1857 e.stopImmediatePropagation();
1858
1859 switch (e.type) {
1860 case "DOMAttrModified":
1861 var name = e.attrName;
1862 var namespace = e.relatedNode.namespaceURI;
1863 var target = e.target;
1864 var record = new getRecord("attributes", target);
1865 record.attributeName = name;
1866 record.attributeNamespace = namespace;
1867 var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
1868 forEachAncestorAndObserverEnqueueRecord(target, function (options) {
1869 if (!options.attributes) return;
1870
1871 if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
1872 return;
1873 }
1874
1875 if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
1876 return record;
1877 });
1878 break;
1879
1880 case "DOMCharacterDataModified":
1881 var target = e.target;
1882 var record = getRecord("characterData", target);
1883 var oldValue = e.prevValue;
1884 forEachAncestorAndObserverEnqueueRecord(target, function (options) {
1885 if (!options.characterData) return;
1886 if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
1887 return record;
1888 });
1889 break;
1890
1891 case "DOMNodeRemoved":
1892 this.addTransientObserver(e.target);
1893
1894 case "DOMNodeInserted":
1895 var changedNode = e.target;
1896 var addedNodes, removedNodes;
1897
1898 if (e.type === "DOMNodeInserted") {
1899 addedNodes = [changedNode];
1900 removedNodes = [];
1901 } else {
1902 addedNodes = [];
1903 removedNodes = [changedNode];
1904 }
1905
1906 var previousSibling = changedNode.previousSibling;
1907 var nextSibling = changedNode.nextSibling;
1908 var record = getRecord("childList", e.target.parentNode);
1909 record.addedNodes = addedNodes;
1910 record.removedNodes = removedNodes;
1911 record.previousSibling = previousSibling;
1912 record.nextSibling = nextSibling;
1913 forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function (options) {
1914 if (!options.childList) return;
1915 return record;
1916 });
1917 }
1918
1919 clearRecords();
1920 }
1921 };
1922 global.JsMutationObserver = JsMutationObserver;
1923
1924 if (!global.MutationObserver) {
1925 global.MutationObserver = JsMutationObserver;
1926 JsMutationObserver._isPolyfilled = true;
1927 }
1928 })(self);
1929
1930 /*
1931 Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola
1932
1933 Permission is hereby granted, free of charge, to any person obtaining
1934 a copy of this software and associated documentation files (the
1935 "Software"), to deal in the Software without restriction, including
1936 without limitation the rights to use, copy, modify, merge, publish,
1937 distribute, sublicense, and/or sell copies of the Software, and to
1938 permit persons to whom the Software is furnished to do so, subject to
1939 the following conditions:
1940
1941 The above copyright notice and this permission notice shall be
1942 included in all copies or substantial portions of the Software.
1943
1944 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1945 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1946 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1947 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1948 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1949 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1950 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1951
1952 */
1953 (function (global, undefined$1) {
1954
1955 if (global.setImmediate) {
1956 return;
1957 }
1958
1959 var nextHandle = 1; // Spec says greater than zero
1960
1961 var tasksByHandle = {};
1962 var currentlyRunningATask = false;
1963 var doc = global.document;
1964 var setImmediate;
1965
1966 function addFromSetImmediateArguments(args) {
1967 tasksByHandle[nextHandle] = partiallyApplied.apply(undefined$1, args);
1968 return nextHandle++;
1969 } // This function accepts the same arguments as setImmediate, but
1970 // returns a function that requires no arguments.
1971
1972
1973 function partiallyApplied(handler) {
1974 var args = [].slice.call(arguments, 1);
1975 return function () {
1976 if (typeof handler === "function") {
1977 handler.apply(undefined$1, args);
1978 } else {
1979 new Function("" + handler)();
1980 }
1981 };
1982 }
1983
1984 function runIfPresent(handle) {
1985 // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
1986 // So if we're currently running a task, we'll need to delay this invocation.
1987 if (currentlyRunningATask) {
1988 // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
1989 // "too much recursion" error.
1990 setTimeout(partiallyApplied(runIfPresent, handle), 0);
1991 } else {
1992 var task = tasksByHandle[handle];
1993
1994 if (task) {
1995 currentlyRunningATask = true;
1996
1997 try {
1998 task();
1999 } finally {
2000 clearImmediate(handle);
2001 currentlyRunningATask = false;
2002 }
2003 }
2004 }
2005 }
2006
2007 function clearImmediate(handle) {
2008 delete tasksByHandle[handle];
2009 }
2010
2011 function installNextTickImplementation() {
2012 setImmediate = function setImmediate() {
2013 var handle = addFromSetImmediateArguments(arguments);
2014 process.nextTick(partiallyApplied(runIfPresent, handle));
2015 return handle;
2016 };
2017 }
2018
2019 function canUsePostMessage() {
2020 // The test against `importScripts` prevents this implementation from being installed inside a web worker,
2021 // where `global.postMessage` means something completely different and can't be used for this purpose.
2022 if (global.postMessage && !global.importScripts) {
2023 var postMessageIsAsynchronous = true;
2024 var oldOnMessage = global.onmessage;
2025
2026 global.onmessage = function () {
2027 postMessageIsAsynchronous = false;
2028 };
2029
2030 global.postMessage("", "*");
2031 global.onmessage = oldOnMessage;
2032 return postMessageIsAsynchronous;
2033 }
2034 }
2035
2036 function installPostMessageImplementation() {
2037 // Installs an event handler on `global` for the `message` event: see
2038 // * https://developer.mozilla.org/en/DOM/window.postMessage
2039 // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
2040 var messagePrefix = "setImmediate$" + Math.random() + "$";
2041
2042 var onGlobalMessage = function onGlobalMessage(event) {
2043 if (event.source === global && typeof event.data === "string" && event.data.indexOf(messagePrefix) === 0) {
2044 runIfPresent(+event.data.slice(messagePrefix.length));
2045 }
2046 };
2047
2048 if (global.addEventListener) {
2049 global.addEventListener("message", onGlobalMessage, false);
2050 } else {
2051 global.attachEvent("onmessage", onGlobalMessage);
2052 }
2053
2054 setImmediate = function setImmediate() {
2055 var handle = addFromSetImmediateArguments(arguments);
2056 global.postMessage(messagePrefix + handle, "*");
2057 return handle;
2058 };
2059 }
2060
2061 function installMessageChannelImplementation() {
2062 var channel = new MessageChannel();
2063
2064 channel.port1.onmessage = function (event) {
2065 var handle = event.data;
2066 runIfPresent(handle);
2067 };
2068
2069 setImmediate = function setImmediate() {
2070 var handle = addFromSetImmediateArguments(arguments);
2071 channel.port2.postMessage(handle);
2072 return handle;
2073 };
2074 }
2075
2076 function installReadyStateChangeImplementation() {
2077 var html = doc.documentElement;
2078
2079 setImmediate = function setImmediate() {
2080 var handle = addFromSetImmediateArguments(arguments); // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
2081 // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
2082
2083 var script = doc.createElement("script");
2084
2085 script.onreadystatechange = function () {
2086 runIfPresent(handle);
2087 script.onreadystatechange = null;
2088 html.removeChild(script);
2089 script = null;
2090 };
2091
2092 html.appendChild(script);
2093 return handle;
2094 };
2095 }
2096
2097 function installSetTimeoutImplementation() {
2098 setImmediate = function setImmediate() {
2099 var handle = addFromSetImmediateArguments(arguments);
2100 setTimeout(partiallyApplied(runIfPresent, handle), 0);
2101 return handle;
2102 };
2103 } // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
2104
2105
2106 var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
2107 attachTo = attachTo && attachTo.setTimeout ? attachTo : global; // Don't get fooled by e.g. browserify environments.
2108
2109 if ({}.toString.call(global.process) === "[object process]") {
2110 // For Node.js before 0.9
2111 installNextTickImplementation();
2112 } else if (canUsePostMessage()) {
2113 // For non-IE10 modern browsers
2114 installPostMessageImplementation();
2115 } else if (global.MessageChannel) {
2116 // For web workers, where supported
2117 installMessageChannelImplementation();
2118 } else if (doc && "onreadystatechange" in doc.createElement("script")) {
2119 // For IE 6–8
2120 installReadyStateChangeImplementation();
2121 } else {
2122 // For older browsers
2123 installSetTimeoutImplementation();
2124 }
2125
2126 attachTo.setImmediate = setImmediate;
2127 attachTo.clearImmediate = clearImmediate;
2128 })(self);
2129
2130 (function () {
2131 var DEFAULT_VIEWPORT = 'width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no';
2132 var Viewport = {
2133 ensureViewportElement: function ensureViewportElement() {
2134 var viewportElement = document.querySelector('meta[name=viewport]');
2135
2136 if (!viewportElement) {
2137 viewportElement = document.createElement('meta');
2138 viewportElement.name = 'viewport';
2139 document.head.appendChild(viewportElement);
2140 }
2141
2142 return viewportElement;
2143 },
2144 setup: function setup() {
2145 var viewportElement = Viewport.ensureViewportElement();
2146
2147 if (!viewportElement) {
2148 return;
2149 }
2150
2151 if (!viewportElement.hasAttribute('content')) {
2152 viewportElement.setAttribute('content', DEFAULT_VIEWPORT);
2153 }
2154 }
2155 };
2156 window.Viewport = Viewport;
2157 })();
2158
2159 /**
2160 * MicroEvent - to make any js object an event emitter (server or browser)
2161 *
2162 * - pure javascript - server compatible, browser compatible
2163 * - dont rely on the browser doms
2164 * - super simple - you get it immediately, no mystery, no magic involved
2165 *
2166 * - create a MicroEventDebug with goodies to debug
2167 * - make it safer to use
2168 */
2169
2170 /** NOTE: This library is customized for Onsen UI. */
2171 var MicroEvent = function MicroEvent() {};
2172
2173 MicroEvent.prototype = {
2174 on: function on(event, fct) {
2175 this._events = this._events || {};
2176 this._events[event] = this._events[event] || [];
2177
2178 this._events[event].push(fct);
2179 },
2180 once: function once(event, fct) {
2181 var self = this;
2182
2183 var wrapper = function wrapper() {
2184 self.off(event, wrapper);
2185 return fct.apply(null, arguments);
2186 };
2187
2188 this.on(event, wrapper);
2189 },
2190 off: function off(event, fct) {
2191 this._events = this._events || {};
2192
2193 if (event in this._events === false) {
2194 return;
2195 }
2196
2197 this._events[event] = this._events[event].filter(function (_fct) {
2198 if (fct) {
2199 return fct !== _fct;
2200 } else {
2201 return false;
2202 }
2203 });
2204 },
2205 emit: function emit(event
2206 /* , args... */
2207 ) {
2208 this._events = this._events || {};
2209
2210 if (event in this._events === false) {
2211 return;
2212 }
2213
2214 for (var i = 0; i < this._events[event].length; i++) {
2215 this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
2216 }
2217 }
2218 };
2219 /**
2220 * mixin will delegate all MicroEvent.js function in the destination object
2221 *
2222 * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent
2223 *
2224 * @param {Object} the object which will support MicroEvent
2225 */
2226
2227 MicroEvent.mixin = function (destObject) {
2228 var props = ['on', 'once', 'off', 'emit'];
2229
2230 for (var i = 0; i < props.length; i++) {
2231 if (typeof destObject === 'function') {
2232 destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
2233 } else {
2234 destObject[props[i]] = MicroEvent.prototype[props[i]];
2235 }
2236 }
2237 };
2238
2239 window.MicroEvent = MicroEvent;
2240
2241 var onsElements = {};
2242
2243 /*
2244 Copyright 2013-2015 ASIAL CORPORATION
2245
2246 Licensed under the Apache License, Version 2.0 (the "License");
2247 you may not use this file except in compliance with the License.
2248 You may obtain a copy of the License at
2249
2250 http://www.apache.org/licenses/LICENSE-2.0
2251
2252 Unless required by applicable law or agreed to in writing, software
2253 distributed under the License is distributed on an "AS IS" BASIS,
2254 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2255 See the License for the specific language governing permissions and
2256 limitations under the License.
2257
2258 */
2259 /**
2260 * Add vendor prefix.
2261 *
2262 * @param {String} name
2263 * @return {String}
2264 */
2265
2266 var prefix = function () {
2267 var styles = window.getComputedStyle(document.documentElement, '');
2268 var prefix = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1];
2269 return function (name) {
2270 return '-' + prefix + '-' + util$4.hyphenate(name);
2271 };
2272 }();
2273 /**
2274 * Minimal utility library for manipulating element's style.
2275 * Set element's style.
2276 *
2277 * @param {Element} element
2278 * @param {Object} styles
2279 * @return {Element}
2280 */
2281
2282
2283 var styler = function styler(element, style) {
2284 Object.keys(style).forEach(function (key) {
2285 if (key in element.style) {
2286 element.style[key] = style[key];
2287 } else if (prefix(key) in element.style) {
2288 element.style[prefix(key)] = style[key];
2289 } else {
2290 util$4.warn('No such style property: ' + key);
2291 }
2292 });
2293 return element;
2294 };
2295 /**
2296 * @param {Element} element
2297 * @param {String} styles Space-separated CSS properties to remove
2298 */
2299
2300
2301 styler.clear = function (element) {
2302 var styles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2303 var clearlist = styles.split(/\s+/).reduce(function (r, s) {
2304 return r.concat([util$4.hyphenate(s), prefix(s)]);
2305 }, []),
2306 keys = [];
2307
2308 var _loop = function _loop(i) {
2309 var key = element.style[i];
2310
2311 if (clearlist.length === 0 || clearlist.some(function (s) {
2312 return key.indexOf(s) === 0;
2313 })) {
2314 keys.push(key); // Store the key to fix Safari style indexes
2315 }
2316 };
2317
2318 for (var i = element.style.length - 1; i >= 0; i--) {
2319 _loop(i);
2320 }
2321
2322 keys.forEach(function (key) {
2323 return element.style[key] = '';
2324 });
2325 element.getAttribute('style') === '' && element.removeAttribute('style');
2326 };
2327
2328 /*
2329 Copyright 2013-2015 ASIAL CORPORATION
2330
2331 Licensed under the Apache License, Version 2.0 (the "License");
2332 you may not use this file except in compliance with the License.
2333 You may obtain a copy of the License at
2334
2335 http://www.apache.org/licenses/LICENSE-2.0
2336
2337 Unless required by applicable law or agreed to in writing, software
2338 distributed under the License is distributed on an "AS IS" BASIS,
2339 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2340 See the License for the specific language governing permissions and
2341 limitations under the License.
2342
2343 */
2344 var autoStyleEnabled = true; // Modifiers
2345
2346 var modifiersMap = {
2347 'quiet': 'material--flat',
2348 'light': 'material--flat',
2349 'outline': 'material--flat',
2350 'cta': '',
2351 'large--quiet': 'material--flat large',
2352 'large--cta': 'large',
2353 'noborder': '',
2354 'tappable': ''
2355 };
2356 var platforms = {};
2357
2358 platforms.android = function (element) {
2359 var elementName = element.tagName.toLowerCase();
2360
2361 if (!util$4.hasModifier(element, 'material')) {
2362 var oldModifier = element.getAttribute('modifier') || '';
2363 var newModifier = oldModifier.trim().split(/\s+/).map(function (e) {
2364 return Object.prototype.hasOwnProperty.call(modifiersMap, e) ? modifiersMap[e] : e;
2365 });
2366 newModifier.unshift('material');
2367 element.setAttribute('modifier', newModifier.join(' ').trim());
2368 }
2369
2370 var elements = ['ons-alert-dialog-button', 'ons-toolbar-button', 'ons-back-button', 'ons-button', 'ons-list-item', 'ons-fab', 'ons-speed-dial', 'ons-speed-dial-item', 'ons-tab']; // Effects
2371
2372 if (elements.indexOf(elementName) !== -1 && !element.hasAttribute('ripple') && !element.querySelector('ons-ripple')) {
2373 if (elementName === 'ons-list-item') {
2374 if (element.hasAttribute('tappable')) {
2375 element.setAttribute('ripple', '');
2376 element.removeAttribute('tappable');
2377 }
2378 } else {
2379 element.setAttribute('ripple', '');
2380 }
2381 }
2382 };
2383
2384 platforms.ios = function (element) {
2385 // Modifiers
2386 if (util$4.removeModifier(element, 'material')) {
2387 if (util$4.removeModifier(element, 'material--flat')) {
2388 util$4.addModifier(element, util$4.removeModifier(element, 'large') ? 'large--quiet' : 'quiet');
2389 }
2390
2391 if (!element.getAttribute('modifier')) {
2392 element.removeAttribute('modifier');
2393 }
2394 } // Effects
2395
2396
2397 if (element.hasAttribute('ripple')) {
2398 if (element.tagName.toLowerCase() === 'ons-list-item') {
2399 element.setAttribute('tappable', '');
2400 }
2401
2402 element.removeAttribute('ripple');
2403 }
2404 };
2405
2406 var unlocked = {
2407 android: true
2408 };
2409
2410 var getPlatform = function getPlatform(element, force) {
2411 if (autoStyleEnabled && !element.hasAttribute('disable-auto-styling')) {
2412 var mobileOS = platform.getMobileOS();
2413
2414 if (Object.prototype.hasOwnProperty.call(platforms, mobileOS) && (Object.prototype.hasOwnProperty.call(unlocked, mobileOS) || force)) {
2415 return mobileOS;
2416 }
2417 }
2418
2419 return null;
2420 };
2421
2422 var prepare = function prepare(element, force) {
2423 var p = getPlatform(element, force);
2424 p && platforms[p](element);
2425 };
2426
2427 var mapModifier = function mapModifier(modifier, element, force) {
2428 if (getPlatform(element, force)) {
2429 return modifier.split(/\s+/).map(function (m) {
2430 return Object.prototype.hasOwnProperty.call(modifiersMap, m) ? modifiersMap[m] : m;
2431 }).join(' ');
2432 }
2433
2434 return modifier;
2435 };
2436
2437 var restoreModifier = function restoreModifier(element) {
2438 if (getPlatform(element) === 'android') {
2439 var modifier = element.getAttribute('modifier') || '';
2440 var newModifier = mapModifier(modifier, element);
2441
2442 if (!/(^|\s+)material($|\s+)/i.test(modifier)) {
2443 newModifier = 'material ' + newModifier;
2444 }
2445
2446 if (newModifier !== modifier) {
2447 element.setAttribute('modifier', newModifier.trim());
2448 return true;
2449 }
2450 }
2451
2452 return false;
2453 };
2454
2455 var autoStyle = {
2456 isEnabled: function isEnabled() {
2457 return autoStyleEnabled;
2458 },
2459 enable: function enable() {
2460 return autoStyleEnabled = true;
2461 },
2462 disable: function disable() {
2463 return autoStyleEnabled = false;
2464 },
2465 prepare: prepare,
2466 mapModifier: mapModifier,
2467 getPlatform: getPlatform,
2468 restoreModifier: restoreModifier
2469 };
2470
2471 var ModifierUtil = /*#__PURE__*/function () {
2472 function ModifierUtil() {
2473 _classCallCheck(this, ModifierUtil);
2474 }
2475
2476 _createClass(ModifierUtil, null, [{
2477 key: "diff",
2478 value:
2479 /**
2480 * @param {String} last
2481 * @param {String} current
2482 */
2483 function diff(last, current) {
2484 last = makeDict(('' + last).trim());
2485 current = makeDict(('' + current).trim());
2486 var removed = Object.keys(last).reduce(function (result, token) {
2487 if (!current[token]) {
2488 result.push(token);
2489 }
2490
2491 return result;
2492 }, []);
2493 var added = Object.keys(current).reduce(function (result, token) {
2494 if (!last[token]) {
2495 result.push(token);
2496 }
2497
2498 return result;
2499 }, []);
2500 return {
2501 added: added,
2502 removed: removed
2503 };
2504
2505 function makeDict(modifier) {
2506 var dict = {};
2507 ModifierUtil.split(modifier).forEach(function (token) {
2508 return dict[token] = token;
2509 });
2510 return dict;
2511 }
2512 }
2513 /**
2514 * @param {Object} diff
2515 * @param {Array} diff.removed
2516 * @param {Array} diff.added
2517 * @param {Object} classList
2518 * @param {String} template
2519 */
2520
2521 }, {
2522 key: "applyDiffToClassList",
2523 value: function applyDiffToClassList(diff, classList, template) {
2524 diff.added.map(function (modifier) {
2525 return template.replace(/\*/g, modifier);
2526 }).forEach(function (klass) {
2527 return klass.split(/\s+/).forEach(function (k) {
2528 return classList.add(k);
2529 });
2530 });
2531 diff.removed.map(function (modifier) {
2532 return template.replace(/\*/g, modifier);
2533 }).forEach(function (klass) {
2534 return klass.split(/\s+/).forEach(function (k) {
2535 return classList.remove(k);
2536 });
2537 });
2538 }
2539 /**
2540 * @param {Object} diff
2541 * @param {Array} diff.removed
2542 * @param {Array} diff.added
2543 * @param {HTMLElement} element
2544 * @param {Object} scheme
2545 */
2546
2547 }, {
2548 key: "applyDiffToElement",
2549 value: function applyDiffToElement(diff, element, scheme) {
2550 Object.keys(scheme).forEach(function (selector) {
2551 var targetElements = !selector || util$4.match(element, selector) ? [element] : Array.prototype.filter.call(element.querySelectorAll(selector), function (targetElement) {
2552 return !util$4.findParent(targetElement, element.tagName, function (parent) {
2553 return parent === element;
2554 });
2555 });
2556
2557 for (var i = 0; i < targetElements.length; i++) {
2558 ModifierUtil.applyDiffToClassList(diff, targetElements[i].classList, scheme[selector]);
2559 }
2560 });
2561 }
2562 /**
2563 * @param {String} last
2564 * @param {String} current
2565 * @param {HTMLElement} element
2566 * @param {Object} scheme
2567 */
2568
2569 }, {
2570 key: "onModifierChanged",
2571 value: function onModifierChanged(last, current, element, scheme) {
2572 ModifierUtil.applyDiffToElement(ModifierUtil.diff(last, current), element, scheme);
2573 autoStyle.restoreModifier(element);
2574 }
2575 }, {
2576 key: "refresh",
2577 value: function refresh(element, scheme) {
2578 ModifierUtil.applyDiffToElement(ModifierUtil.diff('', element.getAttribute('modifier') || ''), element, scheme);
2579 }
2580 /**
2581 * @param {HTMLElement} element
2582 * @param {Object} scheme
2583 */
2584
2585 }, {
2586 key: "initModifier",
2587 value: function initModifier(element, scheme) {
2588 var modifier = element.getAttribute('modifier');
2589
2590 if (typeof modifier !== 'string') {
2591 return;
2592 }
2593
2594 ModifierUtil.applyDiffToElement({
2595 removed: [],
2596 added: ModifierUtil.split(modifier)
2597 }, element, scheme);
2598 }
2599 }, {
2600 key: "split",
2601 value: function split(modifier) {
2602 if (typeof modifier !== 'string') {
2603 return [];
2604 }
2605
2606 return modifier.trim().split(/ +/).filter(function (token) {
2607 return token !== '';
2608 });
2609 }
2610 /**
2611 * Add modifier token to an element.
2612 */
2613
2614 }, {
2615 key: "addModifier",
2616 value: function addModifier(element, modifierToken) {
2617 if (!element.hasAttribute('modifier')) {
2618 element.setAttribute('modifier', modifierToken);
2619 } else {
2620 var tokens = ModifierUtil.split(element.getAttribute('modifier'));
2621
2622 if (tokens.indexOf(modifierToken) == -1) {
2623 tokens.push(modifierToken);
2624 element.setAttribute('modifier', tokens.join(' '));
2625 }
2626 }
2627 }
2628 /**
2629 * Remove modifier token from an element.
2630 */
2631
2632 }, {
2633 key: "removeModifier",
2634 value: function removeModifier(element, modifierToken) {
2635 if (element.hasAttribute('modifier')) {
2636 var tokens = ModifierUtil.split(element.getAttribute('modifier'));
2637 var index = tokens.indexOf(modifierToken);
2638
2639 if (index !== -1) {
2640 tokens.splice(index, 1);
2641 element.setAttribute('modifier', tokens.join(' '));
2642 }
2643 }
2644 }
2645 }]);
2646
2647 return ModifierUtil;
2648 }();
2649
2650 /*
2651 Copyright 2013-2015 ASIAL CORPORATION
2652
2653 Licensed under the Apache License, Version 2.0 (the "License");
2654 you may not use this file except in compliance with the License.
2655 You may obtain a copy of the License at
2656
2657 http://www.apache.org/licenses/LICENSE-2.0
2658
2659 Unless required by applicable law or agreed to in writing, software
2660 distributed under the License is distributed on an "AS IS" BASIS,
2661 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2662 See the License for the specific language governing permissions and
2663 limitations under the License.
2664
2665 */
2666
2667 var startsWith = function startsWith(s, c) {
2668 return s.substr(0, c.length) === c;
2669 };
2670
2671 var endsWith = function endsWith(s, c) {
2672 return s.substr(s.length - c.length, c.length) === c;
2673 };
2674
2675 var unwrap = function unwrap(s) {
2676 return s.slice(1, -1);
2677 };
2678
2679 var isObjectString = function isObjectString(s) {
2680 return startsWith(s, '{') && endsWith(s, '}');
2681 };
2682
2683 var isArrayString = function isArrayString(s) {
2684 return startsWith(s, '[') && endsWith(s, ']');
2685 };
2686
2687 var isQuotedString = function isQuotedString(s) {
2688 return startsWith(s, '\'') && endsWith(s, '\'') || startsWith(s, '"') && endsWith(s, '"');
2689 };
2690
2691 var error$1 = function error(token, string, originalString) {
2692 throw new Error('Unexpected token \'' + token + '\' at position ' + (originalString.length - string.length - 1) + ' in string: \'' + originalString + '\'');
2693 };
2694
2695 var processToken = function processToken(token, string, originalString) {
2696 if (token === 'true' || token === 'false') {
2697 return token === 'true';
2698 } else if (isQuotedString(token)) {
2699 return unwrap(token);
2700 } else if (!isNaN(token)) {
2701 return +token;
2702 } else if (isObjectString(token)) {
2703 return parseObject(unwrap(token));
2704 } else if (isArrayString(token)) {
2705 return parseArray(unwrap(token));
2706 } else {
2707 error$1(token, string, originalString);
2708 }
2709 };
2710
2711 var nextToken = function nextToken(string) {
2712 string = string.trim();
2713 var limit = string.length;
2714
2715 if (string[0] === ':' || string[0] === ',') {
2716 limit = 1;
2717 } else if (string[0] === '{' || string[0] === '[') {
2718 var c = string.charCodeAt(0);
2719 var nestedObject = 1;
2720
2721 for (var i = 1; i < string.length; i++) {
2722 if (string.charCodeAt(i) === c) {
2723 nestedObject++;
2724 } else if (string.charCodeAt(i) === c + 2) {
2725 nestedObject--;
2726
2727 if (nestedObject === 0) {
2728 limit = i + 1;
2729 break;
2730 }
2731 }
2732 }
2733 } else if (string[0] === '\'' || string[0] === '"') {
2734 for (var _i = 1; _i < string.length; _i++) {
2735 if (string[_i] === string[0]) {
2736 limit = _i + 1;
2737 break;
2738 }
2739 }
2740 } else {
2741 for (var _i2 = 1; _i2 < string.length; _i2++) {
2742 if ([' ', ',', ':'].indexOf(string[_i2]) !== -1) {
2743 limit = _i2;
2744 break;
2745 }
2746 }
2747 }
2748
2749 return string.slice(0, limit);
2750 };
2751
2752 var parseObject = function parseObject(string) {
2753 var isValidKey = function isValidKey(key) {
2754 return /^[A-Z_$][A-Z0-9_$]*$/i.test(key);
2755 };
2756
2757 string = string.trim();
2758 var originalString = string;
2759 var object = {};
2760 var readingKey = true,
2761 key,
2762 previousToken,
2763 token;
2764
2765 while (string.length > 0) {
2766 previousToken = token;
2767 token = nextToken(string);
2768 string = string.slice(token.length, string.length).trim();
2769
2770 if (token === ':' && (!readingKey || !previousToken || previousToken === ',') || token === ',' && readingKey || token !== ':' && token !== ',' && previousToken && previousToken !== ',' && previousToken !== ':') {
2771 error$1(token, string, originalString);
2772 } else if (token === ':' && readingKey && previousToken) {
2773 previousToken = isQuotedString(previousToken) ? unwrap(previousToken) : previousToken;
2774
2775 if (isValidKey(previousToken)) {
2776 key = previousToken;
2777 readingKey = false;
2778 } else {
2779 throw new Error('Invalid key token \'' + previousToken + '\' at position 0 in string: \'' + originalString + '\'');
2780 }
2781 } else if (token === ',' && !readingKey && previousToken) {
2782 object[key] = processToken(previousToken, string, originalString);
2783 readingKey = true;
2784 }
2785 }
2786
2787 if (token) {
2788 object[key] = processToken(token, string, originalString);
2789 }
2790
2791 return object;
2792 };
2793
2794 var parseArray = function parseArray(string) {
2795 string = string.trim();
2796 var originalString = string;
2797 var array = [];
2798 var previousToken, token;
2799
2800 while (string.length > 0) {
2801 previousToken = token;
2802 token = nextToken(string);
2803 string = string.slice(token.length, string.length).trim();
2804
2805 if (token === ',' && (!previousToken || previousToken === ',')) {
2806 error$1(token, string, originalString);
2807 } else if (token === ',') {
2808 array.push(processToken(previousToken, string, originalString));
2809 }
2810 }
2811
2812 if (token) {
2813 if (token !== ',') {
2814 array.push(processToken(token, string, originalString));
2815 } else {
2816 error$1(token, string, originalString);
2817 }
2818 }
2819
2820 return array;
2821 };
2822
2823 var parse = function parse(string) {
2824 string = string.trim();
2825
2826 if (isObjectString(string)) {
2827 return parseObject(unwrap(string));
2828 } else if (isArrayString(string)) {
2829 return parseArray(unwrap(string));
2830 } else {
2831 throw new Error('Provided string must be object or array like: ' + string);
2832 }
2833 };
2834
2835 var util$3 = {};
2836 var errorPrefix = '[Onsen UI]';
2837 util$3.globals = {
2838 fabOffset: 0,
2839 errorPrefix: errorPrefix,
2840 supportsPassive: false
2841 };
2842
2843 platform._runOnActualPlatform(function () {
2844 util$3.globals.actualMobileOS = platform.getMobileOS();
2845 util$3.globals.isWKWebView = platform.isWKWebView();
2846 });
2847
2848 try {
2849 var opts = Object.defineProperty({}, 'passive', {
2850 get: function get() {
2851 util$3.globals.supportsPassive = true;
2852 } // eslint-disable-line getter-return
2853
2854 });
2855 window.addEventListener('testPassive', null, opts);
2856 window.removeEventListener('testPassive', null, opts);
2857 } catch (e) {
2858 }
2859 /**
2860 * @param {Element} el Target
2861 * @param {String} name Event name
2862 * @param {Function} handler Event handler
2863 * @param {Object} [opt] Event options (passive, capture...)
2864 * @param {Boolean} [isGD] If comes from GestureDetector. Just for testing.
2865 */
2866
2867
2868 util$3.addEventListener = function (el, name, handler, opt, isGD) {
2869 el.addEventListener(name, handler, util$3.globals.supportsPassive ? opt : (opt || {}).capture);
2870 };
2871
2872 util$3.removeEventListener = function (el, name, handler, opt, isGD) {
2873 el.removeEventListener(name, handler, util$3.globals.supportsPassive ? opt : (opt || {}).capture);
2874 };
2875 /**
2876 * @param {String/Function} query dot class name or node name or matcher function.
2877 * @return {Function}
2878 */
2879
2880
2881 util$3.prepareQuery = function (query) {
2882 return query instanceof Function ? query : function (element) {
2883 return util$3.match(element, query);
2884 };
2885 };
2886 /**
2887 * @param {Element} e
2888 * @param {String/Function} s CSS Selector.
2889 * @return {Boolean}
2890 */
2891
2892
2893 util$3.match = function (e, s) {
2894 return (e.matches || e.webkitMatchesSelector || e.mozMatchesSelector || e.msMatchesSelector).call(e, s);
2895 };
2896 /**
2897 * @param {Element} element
2898 * @param {String/Function} query dot class name or node name or matcher function.
2899 * @return {HTMLElement/null}
2900 */
2901
2902
2903 util$3.findChild = function (element, query) {
2904 var match = util$3.prepareQuery(query); // Caution: `element.children` is `undefined` in some environments if `element` is `svg`
2905
2906 for (var i = 0; i < element.childNodes.length; i++) {
2907 var node = element.childNodes[i];
2908
2909 if (node.nodeType !== Node.ELEMENT_NODE) {
2910 // process only element nodes
2911 continue;
2912 }
2913
2914 if (match(node)) {
2915 return node;
2916 }
2917 }
2918
2919 return null;
2920 };
2921 /**
2922 * @param {Element} element
2923 * @param {String/Function} query dot class name or node name or matcher function.
2924 * @return {HTMLElement/null}
2925 */
2926
2927
2928 util$3.findParent = function (element, query, until) {
2929 var match = util$3.prepareQuery(query);
2930 var parent = element.parentNode;
2931
2932 for (;;) {
2933 if (!parent || parent === document || parent instanceof DocumentFragment || until && until(parent)) {
2934 return null;
2935 } else if (match(parent)) {
2936 return parent;
2937 }
2938
2939 parent = parent.parentNode;
2940 }
2941 };
2942 /**
2943 * @param {Element} element
2944 * @return {boolean}
2945 */
2946
2947
2948 util$3.isAttached = function (element) {
2949 return document.body.contains(element);
2950 };
2951 /**
2952 * @param {Element} element
2953 * @return {boolean}
2954 */
2955
2956
2957 util$3.hasAnyComponentAsParent = function (element) {
2958 while (element && document.documentElement !== element) {
2959 element = element.parentNode;
2960
2961 if (element && element.nodeName.toLowerCase().match(/(ons-navigator|ons-tabbar|ons-modal)/)) {
2962 return true;
2963 }
2964 }
2965
2966 return false;
2967 };
2968 /**
2969 * @param {Object} element
2970 * @return {Array}
2971 */
2972
2973
2974 util$3.getAllChildNodes = function (element) {
2975 var _ref;
2976
2977 return (_ref = [element]).concat.apply(_ref, _toConsumableArray(Array.from(element.children).map(function (childEl) {
2978 return util$3.getAllChildNodes(childEl);
2979 })));
2980 };
2981 /**
2982 * @param {Element} element
2983 * @return {boolean}
2984 */
2985
2986
2987 util$3.isPageControl = function (element) {
2988 return element.nodeName.match(/^ons-(navigator|splitter|tabbar|page)$/i);
2989 };
2990 /**
2991 * @param {Element} element
2992 * @param {String} action to propagate
2993 */
2994
2995
2996 util$3.propagateAction = function (element, action) {
2997 for (var i = 0; i < element.childNodes.length; i++) {
2998 var child = element.childNodes[i];
2999
3000 if (child[action] instanceof Function) {
3001 child[action]();
3002 } else {
3003 util$3.propagateAction(child, action);
3004 }
3005 }
3006 };
3007 /**
3008 * @param {String} string - string to be camelized
3009 * @return {String} Camelized string
3010 */
3011
3012
3013 util$3.camelize = function (string) {
3014 return string.toLowerCase().replace(/-([a-z])/g, function (m, l) {
3015 return l.toUpperCase();
3016 });
3017 };
3018 /**
3019 * @param {String} string - string to be hyphenated
3020 * @return {String} Hyphenated string
3021 */
3022
3023
3024 util$3.hyphenate = function (string) {
3025 return string.replace(/([a-zA-Z])([A-Z])/g, '$1-$2').toLowerCase();
3026 };
3027 /**
3028 * @param {String} selector - tag and class only
3029 * @param {Object} style
3030 * @param {Element}
3031 */
3032
3033
3034 util$3.create = function () {
3035 var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
3036 var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3037 var classList = selector.split('.');
3038 var element = document.createElement(classList.shift() || 'div');
3039
3040 if (classList.length) {
3041 element.className = classList.join(' ');
3042 }
3043
3044 styler(element, style);
3045 return element;
3046 };
3047 /**
3048 * @param {String} html
3049 * @return {Element}
3050 */
3051
3052
3053 util$3.createElement = function (html) {
3054 var wrapper = document.createElement('div');
3055
3056 if (html instanceof DocumentFragment) {
3057 wrapper.appendChild(document.importNode(html, true));
3058 } else {
3059 wrapper.innerHTML = html.trim();
3060 }
3061
3062 if (wrapper.children.length > 1) {
3063 util$3.throw('HTML template must contain a single root element');
3064 }
3065
3066 var element = wrapper.children[0];
3067 wrapper.children[0].remove();
3068 return element;
3069 };
3070 /**
3071 * @param {String} html
3072 * @return {HTMLFragment}
3073 */
3074
3075
3076 util$3.createFragment = function (html) {
3077 var template = document.createElement('template');
3078 template.innerHTML = html;
3079 return document.importNode(template.content, true);
3080 };
3081 /*
3082 * @param {Object} dst Destination object.
3083 * @param {...Object} src Source object(s).
3084 * @returns {Object} Reference to `dst`.
3085 */
3086
3087
3088 util$3.extend = function (dst) {
3089 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
3090 args[_key - 1] = arguments[_key];
3091 }
3092
3093 for (var i = 0; i < args.length; i++) {
3094 if (args[i]) {
3095 var keys = Object.keys(args[i]);
3096
3097 for (var j = 0; j < keys.length; j++) {
3098 var key = keys[j];
3099 dst[key] = args[i][key];
3100 }
3101 }
3102 }
3103
3104 return dst;
3105 };
3106 /**
3107 * @param {Object} arrayLike
3108 * @return {Array}
3109 */
3110
3111
3112 util$3.arrayFrom = function (arrayLike) {
3113 return Array.prototype.slice.apply(arrayLike);
3114 };
3115 /**
3116 * @param {String} jsonString
3117 * @param {Object} [failSafe]
3118 * @return {Object}
3119 */
3120
3121
3122 util$3.parseJSONObjectSafely = function (jsonString) {
3123 var failSafe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3124
3125 try {
3126 var result = JSON.parse('' + jsonString);
3127
3128 if (_typeof(result) === 'object' && result !== null) {
3129 return result;
3130 }
3131 } catch (e) {
3132 return failSafe;
3133 }
3134
3135 return failSafe;
3136 };
3137 /**
3138 * @param {String} path - path such as 'myApp.controllers.data.loadData'
3139 * @return {Any} - whatever is located at that path
3140 */
3141
3142
3143 util$3.findFromPath = function (path) {
3144 path = path.split('.');
3145 var el = window,
3146 key;
3147
3148 while (key = path.shift()) {
3149 // eslint-disable-line no-cond-assign
3150 el = el[key];
3151 }
3152
3153 return el;
3154 };
3155 /**
3156 * @param {HTMLElement} container - Page or page-container that implements 'topPage'
3157 * @return {HTMLElement|null} - Visible page element or null if not found.
3158 */
3159
3160
3161 util$3.getTopPage = function (container) {
3162 return container && (container.tagName.toLowerCase() === 'ons-page' ? container : container.topPage) || null;
3163 };
3164 /**
3165 * @param {HTMLElement} container - Element where the search begins
3166 * @return {HTMLElement|null} - Page element that contains the visible toolbar or null.
3167 */
3168
3169
3170 util$3.findToolbarPage = function (container) {
3171 var page = util$3.getTopPage(container);
3172
3173 if (page) {
3174 if (page._canAnimateToolbar()) {
3175 return page;
3176 }
3177
3178 for (var i = 0; i < page._contentElement.children.length; i++) {
3179 var nextPage = util$3.getTopPage(page._contentElement.children[i]);
3180
3181 if (nextPage && !/ons-tabbar/i.test(page._contentElement.children[i].tagName)) {
3182 return util$3.findToolbarPage(nextPage);
3183 }
3184 }
3185 }
3186
3187 return null;
3188 };
3189 /**
3190 * @param {Element} element
3191 * @param {String} eventName
3192 * @param {Object} [detail]
3193 * @return {CustomEvent}
3194 */
3195
3196
3197 util$3.triggerElementEvent = function (target, eventName) {
3198 var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
3199 var event = new CustomEvent(eventName, {
3200 bubbles: true,
3201 cancelable: true,
3202 detail: detail
3203 });
3204 Object.keys(detail).forEach(function (key) {
3205 event[key] = detail[key];
3206 });
3207 target.dispatchEvent(event);
3208 return event;
3209 };
3210 /**
3211 * @param {Element} target
3212 * @param {String} modifierName
3213 * @return {Boolean}
3214 */
3215
3216
3217 util$3.hasModifier = function (target, modifierName) {
3218 if (!target.hasAttribute('modifier')) {
3219 return false;
3220 }
3221
3222 return RegExp("(^|\\s+)".concat(modifierName, "($|\\s+)"), 'i').test(target.getAttribute('modifier'));
3223 };
3224 /**
3225 * @param {Element} target
3226 * @param {String} modifierName
3227 * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
3228 * @param {Object} options.forceAutoStyle Ignores platform limitation.
3229 * @return {Boolean} Whether it was added or not.
3230 */
3231
3232
3233 util$3.addModifier = function (target, modifierName) {
3234 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
3235
3236 if (options.autoStyle) {
3237 modifierName = autoStyle.mapModifier(modifierName, target, options.forceAutoStyle);
3238 }
3239
3240 if (util$3.hasModifier(target, modifierName)) {
3241 return false;
3242 }
3243
3244 target.setAttribute('modifier', ((target.getAttribute('modifier') || '') + ' ' + modifierName).trim());
3245 return true;
3246 };
3247 /**
3248 * @param {Element} target
3249 * @param {String} modifierName
3250 * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
3251 * @param {Object} options.forceAutoStyle Ignores platform limitation.
3252 * @return {Boolean} Whether it was found or not.
3253 */
3254
3255
3256 util$3.removeModifier = function (target, modifierName) {
3257 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
3258
3259 if (options.autoStyle) {
3260 modifierName = autoStyle.mapModifier(modifierName, target, options.forceAutoStyle);
3261 }
3262
3263 if (!target.getAttribute('modifier') || !util$3.hasModifier(target, modifierName)) {
3264 return false;
3265 }
3266
3267 var newModifiers = target.getAttribute('modifier').split(/\s+/).filter(function (m) {
3268 return m && m !== modifierName;
3269 });
3270 newModifiers.length ? target.setAttribute('modifier', newModifiers.join(' ')) : target.removeAttribute('modifier');
3271 return true;
3272 };
3273 /**
3274 * @param {Element} target
3275 * @param {String} modifierName
3276 * @param {Boolean} options.force Forces modifier to be added or removed.
3277 * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
3278 * @param {Boolean} options.forceAutoStyle Ignores platform limitation.
3279 * @return {Boolean} Whether it was found or not.
3280 */
3281
3282
3283 util$3.toggleModifier = function () {
3284 var options = arguments.length > 2 ? arguments.length <= 2 ? undefined : arguments[2] : {};
3285 var force = typeof options === 'boolean' ? options : options.force;
3286 var toggle = typeof force === 'boolean' ? force : !util$3.hasModifier.apply(util$3, arguments);
3287 toggle ? util$3.addModifier.apply(util$3, arguments) : util$3.removeModifier.apply(util$3, arguments);
3288 };
3289 /**
3290 * @param {Element} el
3291 * @param {String} defaultClass
3292 * @param {Object} scheme
3293 */
3294
3295
3296 util$3.restoreClass = function (el, defaultClass, scheme) {
3297 defaultClass.split(/\s+/).forEach(function (c) {
3298 return c !== '' && !el.classList.contains(c) && el.classList.add(c);
3299 });
3300 el.hasAttribute('modifier') && ModifierUtil.refresh(el, scheme);
3301 }; // TODO: FIX
3302
3303
3304 util$3.updateParentPosition = function (el) {
3305 if (!el._parentUpdated && el.parentElement) {
3306 if (window.getComputedStyle(el.parentElement).getPropertyValue('position') === 'static') {
3307 el.parentElement.style.position = 'relative';
3308 }
3309
3310 el._parentUpdated = true;
3311 }
3312 };
3313
3314 util$3.toggleAttribute = function (element, name, value) {
3315 if (value) {
3316 element.setAttribute(name, typeof value === 'boolean' ? '' : value);
3317 } else {
3318 element.removeAttribute(name);
3319 }
3320 };
3321
3322 util$3.bindListeners = function (element, listenerNames) {
3323 listenerNames.forEach(function (name) {
3324 var boundName = name.replace(/^_[a-z]/, '_bound' + name[1].toUpperCase());
3325 element[boundName] = element[boundName] || element[name].bind(element);
3326 });
3327 };
3328
3329 util$3.each = function (obj, f) {
3330 return Object.keys(obj).forEach(function (key) {
3331 return f(key, obj[key]);
3332 });
3333 };
3334 /**
3335 * @param {Element} target
3336 * @param {boolean} hasRipple
3337 * @param {Object} attrs
3338 */
3339
3340
3341 util$3.updateRipple = function (target, hasRipple) {
3342 var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
3343
3344 if (hasRipple === undefined) {
3345 hasRipple = target.hasAttribute('ripple');
3346 }
3347
3348 var rippleElement = util$3.findChild(target, 'ons-ripple');
3349
3350 if (hasRipple) {
3351 if (!rippleElement) {
3352 var element = document.createElement('ons-ripple');
3353 Object.keys(attrs).forEach(function (key) {
3354 return element.setAttribute(key, attrs[key]);
3355 });
3356 target.insertBefore(element, target.firstChild);
3357 }
3358 } else if (rippleElement) {
3359 rippleElement.remove();
3360 }
3361 };
3362 /**
3363 * @param {String}
3364 * @return {Object}
3365 */
3366
3367
3368 util$3.animationOptionsParse = parse;
3369 /**
3370 * @param {*} value
3371 */
3372
3373 util$3.isInteger = function (value) {
3374 return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
3375 };
3376 /**
3377 * @return {Object} Deferred promise.
3378 */
3379
3380
3381 util$3.defer = function () {
3382 var deferred = {};
3383 deferred.promise = new Promise(function (resolve, reject) {
3384 deferred.resolve = resolve;
3385 deferred.reject = reject;
3386 });
3387 return deferred;
3388 };
3389 /**
3390 * Show warnings when they are enabled.
3391 *
3392 * @param {*} arguments to console.warn
3393 */
3394
3395
3396 util$3.warn = function () {
3397 if (!internal$1.config.warningsDisabled) {
3398 var _console;
3399
3400 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
3401 args[_key2] = arguments[_key2];
3402 }
3403
3404 (_console = console).warn.apply(_console, [errorPrefix].concat(args));
3405 }
3406 };
3407
3408 util$3.throw = function (message) {
3409 throw new Error("".concat(errorPrefix, " ").concat(message));
3410 };
3411
3412 util$3.throwAbstract = function () {
3413 return util$3.throw('Cannot instantiate abstract class');
3414 };
3415
3416 util$3.throwMember = function () {
3417 return util$3.throw('Class member must be implemented');
3418 };
3419
3420 util$3.throwPageLoader = function () {
3421 return util$3.throw('First parameter should be an instance of PageLoader');
3422 };
3423
3424 util$3.throwAnimator = function (el) {
3425 return util$3.throw("\"Animator\" param must inherit ".concat(el, "Animator"));
3426 };
3427
3428 var prevent = function prevent(e) {
3429 return e.cancelable && e.preventDefault();
3430 };
3431 /**
3432 * Prevent scrolling while draging horizontally on iOS.
3433 *
3434 * @param {gd} GestureDetector instance
3435 */
3436
3437
3438 util$3.iosPreventScroll = function (gd) {
3439 if (util$3.globals.actualMobileOS === 'ios') {
3440 var clean = function clean(e) {
3441 gd.off('touchmove', prevent);
3442 gd.off('dragend', clean);
3443 };
3444
3445 gd.on('touchmove', prevent);
3446 gd.on('dragend', clean);
3447 }
3448 };
3449 /**
3450 * Prevents scroll in underlying pages on iOS. See #2220 #2274 #1949
3451 *
3452 * @param {el} HTMLElement that prevents the events
3453 * @param {add} Boolean Add or remove event listeners
3454 */
3455
3456
3457 util$3.iosPageScrollFix = function (add) {
3458 // Full fix - May cause issues with UIWebView's momentum scroll
3459 if (util$3.globals.actualMobileOS === 'ios') {
3460 document.body.classList.toggle('ons-ios-scroll', add); // Allows custom and localized fixes (#2274)
3461
3462 document.body.classList.toggle('ons-ios-scroll-fix', add);
3463 }
3464 };
3465 /**
3466 * Distance and deltaTime filter some weird dragstart events that are not fired immediately.
3467 *
3468 * @param {event}
3469 */
3470
3471
3472 util$3.isValidGesture = function (event) {
3473 return event.gesture !== undefined && (event.gesture.distance <= 15 || event.gesture.deltaTime <= 100);
3474 };
3475
3476 util$3.checkMissingImport = function () {
3477 for (var _len3 = arguments.length, elementNames = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
3478 elementNames[_key3] = arguments[_key3];
3479 }
3480
3481 elementNames.forEach(function (name) {
3482 if (!onsElements[name]) {
3483 util$3.throw("Ons".concat(name, " is required but was not imported (Custom Elements)"));
3484 }
3485 });
3486 };
3487 /**
3488 * Defines a boolean property that reflects an attribute of the same name for a
3489 * given list of attributes.
3490 */
3491
3492
3493 util$3.defineBooleanProperties = function (object, attributeList) {
3494 attributeList.forEach(function (attributeName) {
3495 var propertyName = util$3.camelize(attributeName);
3496 Object.defineProperty(object.prototype, propertyName, {
3497 get: function get() {
3498 return this.hasAttribute(attributeName);
3499 },
3500 set: function set(value) {
3501 if (value) {
3502 this.setAttribute(attributeName, '');
3503 } else {
3504 this.removeAttribute(attributeName);
3505 }
3506 },
3507 configurable: true
3508 });
3509 });
3510 };
3511 /**
3512 * Defines a string property that reflects an attribute of the same name for a
3513 * given list of attributes.
3514 */
3515
3516
3517 util$3.defineStringProperties = function (object, attributeList) {
3518 attributeList.forEach(function (attributeName) {
3519 var propertyName = util$3.camelize(attributeName);
3520 Object.defineProperty(object.prototype, propertyName, {
3521 get: function get() {
3522 return this.getAttribute(attributeName);
3523 },
3524 set: function set(value) {
3525 if (value === null || value === undefined) {
3526 this.removeAttribute(attributeName);
3527 } else {
3528 this.setAttribute(attributeName, value);
3529 }
3530 },
3531 configurable: true
3532 });
3533 });
3534 };
3535 /**
3536 * Makes a property for a listener e.g. onClick.
3537 *
3538 * Returns `onConnected` function which should be called in the element's
3539 * connectedCallback, and `onDisconnected` function which should be called in
3540 * the element's disconnectedCallback.
3541 */
3542
3543
3544 util$3.defineListenerProperty = function (element, eventName) {
3545 var camelized = util$3.camelize(eventName);
3546 var propertyName = 'on' + camelized.charAt(0).toUpperCase() + camelized.slice(1);
3547 var handler;
3548 Object.defineProperty(element, propertyName, {
3549 get: function get() {
3550 return handler;
3551 },
3552 set: function set(newHandler) {
3553 if (element.isConnected) {
3554 if (handler) {
3555 element.removeEventListener(eventName, handler);
3556 }
3557
3558 element.addEventListener(eventName, newHandler);
3559 }
3560
3561 handler = newHandler;
3562 },
3563 configurable: true
3564 });
3565 return {
3566 onConnected: function onConnected() {
3567 if (element[propertyName]) {
3568 element.addEventListener(eventName, element[propertyName]);
3569 }
3570 },
3571 onDisconnected: function onDisconnected() {
3572 if (element[propertyName]) {
3573 element.removeEventListener(eventName, element[propertyName]);
3574 }
3575 }
3576 };
3577 };
3578
3579 var util$4 = util$3;
3580
3581 /*
3582 Copyright 2013-2015 ASIAL CORPORATION
3583
3584 Licensed under the Apache License, Version 2.0 (the "License");
3585 you may not use this file except in compliance with the License.
3586 You may obtain a copy of the License at
3587
3588 http://www.apache.org/licenses/LICENSE-2.0
3589
3590 Unless required by applicable law or agreed to in writing, software
3591 distributed under the License is distributed on an "AS IS" BASIS,
3592 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3593 See the License for the specific language governing permissions and
3594 limitations under the License.
3595
3596 */
3597
3598 var error = function error(message) {
3599 return util$4.throw("In PageAttributeExpression: ".concat(message));
3600 };
3601
3602 var pageAttributeExpression = {
3603 _variables: {},
3604
3605 /**
3606 * Define a variable.
3607 *
3608 * @param {String} name Name of the variable
3609 * @param {String|Function} value Value of the variable. Can be a string or a function. The function must return a string.
3610 * @param {Boolean} overwrite If this value is false, an error will be thrown when trying to define a variable that has already been defined.
3611 */
3612 defineVariable: function defineVariable(name, value) {
3613 var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
3614
3615 if (typeof name !== 'string') {
3616 error('Variable name must be a string');
3617 } else if (typeof value !== 'string' && typeof value !== 'function') {
3618 error('Variable value must be a string or a function');
3619 } else if (Object.prototype.hasOwnProperty.call(this._variables, name) && !overwrite) {
3620 error("\"".concat(name, "\" is already defined"));
3621 }
3622
3623 this._variables[name] = value;
3624 },
3625
3626 /**
3627 * Get a variable.
3628 *
3629 * @param {String} name Name of the variable.
3630 * @return {String|Function|null}
3631 */
3632 getVariable: function getVariable(name) {
3633 if (!Object.prototype.hasOwnProperty.call(this._variables, name)) {
3634 return null;
3635 }
3636
3637 return this._variables[name];
3638 },
3639
3640 /**
3641 * Remove a variable.
3642 *
3643 * @param {String} name Name of the varaible.
3644 */
3645 removeVariable: function removeVariable(name) {
3646 delete this._variables[name];
3647 },
3648
3649 /**
3650 * Get all variables.
3651 *
3652 * @return {Object}
3653 */
3654 getAllVariables: function getAllVariables() {
3655 return this._variables;
3656 },
3657 _parsePart: function _parsePart(part) {
3658 var c,
3659 inInterpolation = false,
3660 currentIndex = 0;
3661 var tokens = [];
3662
3663 if (part.length === 0) {
3664 error('Unable to parse empty string');
3665 }
3666
3667 for (var i = 0; i < part.length; i++) {
3668 c = part.charAt(i);
3669
3670 if (c === '$' && part.charAt(i + 1) === '{') {
3671 if (inInterpolation) {
3672 error('Nested interpolation not supported');
3673 }
3674
3675 var token = part.substring(currentIndex, i);
3676
3677 if (token.length > 0) {
3678 tokens.push(part.substring(currentIndex, i));
3679 }
3680
3681 currentIndex = i;
3682 inInterpolation = true;
3683 } else if (c === '}') {
3684 if (!inInterpolation) {
3685 error('} must be preceeded by ${');
3686 }
3687
3688 var _token = part.substring(currentIndex, i + 1);
3689
3690 if (_token.length > 0) {
3691 tokens.push(part.substring(currentIndex, i + 1));
3692 }
3693
3694 currentIndex = i + 1;
3695 inInterpolation = false;
3696 }
3697 }
3698
3699 if (inInterpolation) {
3700 error('Unterminated interpolation');
3701 }
3702
3703 tokens.push(part.substring(currentIndex, part.length));
3704 return tokens;
3705 },
3706 _replaceToken: function _replaceToken(token) {
3707 var re = /^\${(.*?)}$/,
3708 match = token.match(re);
3709
3710 if (match) {
3711 var name = match[1].trim();
3712 var variable = this.getVariable(name);
3713
3714 if (variable === null) {
3715 error("Variable \"".concat(name, "\" does not exist"));
3716 } else if (typeof variable === 'string') {
3717 return variable;
3718 } else {
3719 var rv = variable();
3720
3721 if (typeof rv !== 'string') {
3722 error('Must return a string');
3723 }
3724
3725 return rv;
3726 }
3727 } else {
3728 return token;
3729 }
3730 },
3731 _replaceTokens: function _replaceTokens(tokens) {
3732 return tokens.map(this._replaceToken.bind(this));
3733 },
3734 _parseExpression: function _parseExpression(expression) {
3735 return expression.split(',').map(function (part) {
3736 return part.trim();
3737 }).map(this._parsePart.bind(this)).map(this._replaceTokens.bind(this)).map(function (part) {
3738 return part.join('');
3739 });
3740 },
3741
3742 /**
3743 * Evaluate an expression.
3744 *
3745 * @param {String} expression An page attribute expression.
3746 * @return {Array}
3747 */
3748 evaluate: function evaluate(expression) {
3749 if (!expression) {
3750 return [];
3751 }
3752
3753 return this._parseExpression(expression);
3754 }
3755 }; // Define default variables.
3756
3757 pageAttributeExpression.defineVariable('mobileOS', platform.getMobileOS());
3758 pageAttributeExpression.defineVariable('iOSDevice', platform.getIOSDevice());
3759 pageAttributeExpression.defineVariable('runtime', function () {
3760 return platform.isWebView() ? 'cordova' : 'browser';
3761 });
3762
3763 var internal = {};
3764 internal.config = {
3765 autoStatusBarFill: true,
3766 animationsDisabled: false,
3767 warningsDisabled: false
3768 };
3769 internal.nullElement = window.document.createElement('div');
3770 /**
3771 * @return {Boolean}
3772 */
3773
3774 internal.isEnabledAutoStatusBarFill = function () {
3775 return !!internal.config.autoStatusBarFill;
3776 };
3777 /**
3778 * @param {String} html
3779 * @return {String}
3780 */
3781
3782
3783 internal.normalizePageHTML = function (html) {
3784 return ('' + html).trim();
3785 };
3786
3787 internal.waitDOMContentLoaded = function (callback) {
3788 if (window.document.readyState === 'loading' || window.document.readyState == 'uninitialized') {
3789 var wrappedCallback = function wrappedCallback() {
3790 callback();
3791 window.document.removeEventListener('DOMContentLoaded', wrappedCallback);
3792 };
3793
3794 window.document.addEventListener('DOMContentLoaded', wrappedCallback);
3795 } else {
3796 setImmediate(callback);
3797 }
3798 };
3799
3800 internal.autoStatusBarFill = function (action) {
3801 var onReady = function onReady() {
3802 if (internal.shouldFillStatusBar()) {
3803 action();
3804 }
3805
3806 document.removeEventListener('deviceready', onReady);
3807 };
3808
3809 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object') {
3810 document.addEventListener('deviceready', onReady);
3811 } else if (['complete', 'interactive'].indexOf(document.readyState) === -1) {
3812 internal.waitDOMContentLoaded(onReady);
3813 } else {
3814 onReady();
3815 }
3816 };
3817
3818 internal.shouldFillStatusBar = function () {
3819 return internal.isEnabledAutoStatusBarFill() && (platform.isWebView() && (platform.isIOS7above() || platform.isIPadOS()) && !platform.isIPhoneX() || document.body.querySelector('.ons-status-bar-mock.ios'));
3820 };
3821
3822 internal.templateStore = {
3823 _storage: {},
3824
3825 /**
3826 * @param {String} key
3827 * @return {String/null} template
3828 */
3829 get: function get(key) {
3830 return internal.templateStore._storage[key] || null;
3831 },
3832
3833 /**
3834 * @param {String} key
3835 * @param {String} template
3836 */
3837 set: function set(key, template) {
3838 internal.templateStore._storage[key] = template;
3839 }
3840 };
3841 /**
3842 * @param {String} page
3843 * @return {Promise}
3844 */
3845
3846 internal.getTemplateHTMLAsync = function (page) {
3847 return new Promise(function (resolve, reject) {
3848 internal.waitDOMContentLoaded(function () {
3849 var cache = internal.templateStore.get(page);
3850
3851 if (cache) {
3852 if (cache instanceof DocumentFragment) {
3853 return resolve(cache);
3854 }
3855
3856 var html = typeof cache === 'string' ? cache : cache[1];
3857 return resolve(internal.normalizePageHTML(html));
3858 }
3859
3860 var local = window.document.getElementById(page);
3861
3862 if (local) {
3863 var _html = local.textContent || local.content;
3864
3865 return resolve(_html);
3866 }
3867
3868 var xhr = new XMLHttpRequest();
3869 xhr.open('GET', page, true);
3870
3871 xhr.onload = function () {
3872 var html = xhr.responseText;
3873
3874 if (xhr.status >= 400 && xhr.status < 600) {
3875 reject(html);
3876 } else {
3877 // Refresh script tags
3878 var fragment = util$4.createFragment(html);
3879 util$4.arrayFrom(fragment.querySelectorAll('script')).forEach(function (el) {
3880 var script = document.createElement('script');
3881 script.type = el.type || 'text/javascript';
3882 script.appendChild(document.createTextNode(el.text || el.textContent || el.innerHTML));
3883 el.parentNode.replaceChild(script, el);
3884 });
3885 internal.templateStore.set(page, fragment);
3886 resolve(fragment);
3887 }
3888 };
3889
3890 xhr.onerror = function () {
3891 util$4.throw("Page template not found: ".concat(page));
3892 };
3893
3894 xhr.send(null);
3895 });
3896 });
3897 };
3898 /**
3899 * @param {String} page
3900 * @return {Promise}
3901 */
3902
3903
3904 internal.getPageHTMLAsync = function (page) {
3905 var pages = pageAttributeExpression.evaluate(page);
3906
3907 var getPage = function getPage(page) {
3908 if (typeof page !== 'string') {
3909 return Promise.reject('Must specify a page.');
3910 }
3911
3912 return internal.getTemplateHTMLAsync(page).catch(function (error) {
3913 if (pages.length === 0) {
3914 return Promise.reject(error);
3915 }
3916
3917 return getPage(pages.shift());
3918 });
3919 };
3920
3921 return getPage(pages.shift());
3922 };
3923
3924 var internal$1 = internal;
3925
3926 var AnimatorFactory = /*#__PURE__*/function () {
3927 /**
3928 * @param {Object} opts
3929 * @param {Object} opts.animators The dictionary for animator classes
3930 * @param {Function} opts.baseClass The base class of animators
3931 * @param {String} [opts.baseClassName] The name of the base class of animators
3932 * @param {String} [opts.defaultAnimation] The default animation name
3933 * @param {Object} [opts.defaultAnimationOptions] The default animation options
3934 */
3935 function AnimatorFactory(opts) {
3936 _classCallCheck(this, AnimatorFactory);
3937
3938 this._animators = opts.animators;
3939 this._baseClass = opts.baseClass;
3940 this._baseClassName = opts.baseClassName || opts.baseClass.name;
3941 this._animation = opts.defaultAnimation || 'default';
3942 this._animationOptions = opts.defaultAnimationOptions || {};
3943
3944 if (!this._animators[this._animation]) {
3945 util$4.throw('No such animation: ' + this._animation);
3946 }
3947 }
3948 /**
3949 * @param {String} jsonString
3950 * @return {Object/null}
3951 */
3952
3953
3954 _createClass(AnimatorFactory, [{
3955 key: "setAnimationOptions",
3956 value:
3957 /**
3958 * @param {Object} options
3959 */
3960 function setAnimationOptions(options) {
3961 this._animationOptions = options;
3962 }
3963 /**
3964 * @param {Object} options
3965 * @param {String} [options.animation] The animation name
3966 * @param {Object} [options.animationOptions] The animation options
3967 * @param {Object} defaultAnimator The default animator instance
3968 * @return {Object} An animator instance
3969 */
3970
3971 }, {
3972 key: "newAnimator",
3973 value: function newAnimator() {
3974 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
3975 var defaultAnimator = arguments.length > 1 ? arguments[1] : undefined;
3976 var animator = null;
3977
3978 if (options.animation instanceof this._baseClass) {
3979 return options.animation;
3980 }
3981
3982 var Animator = null;
3983
3984 if (typeof options.animation === 'string') {
3985 Animator = this._animators[options.animation];
3986 }
3987
3988 if (!Animator && defaultAnimator) {
3989 animator = defaultAnimator;
3990 } else {
3991 Animator = Animator || this._animators[this._animation];
3992 var animationOpts = util$4.extend({}, this._animationOptions, options.animationOptions || {}, internal$1.config.animationsDisabled ? {
3993 duration: 0,
3994 delay: 0
3995 } : {});
3996 animator = new Animator(animationOpts);
3997
3998 if (typeof animator === 'function') {
3999 animator = new animator(animationOpts); // eslint-disable-line new-cap
4000 }
4001 }
4002
4003 if (!(animator instanceof this._baseClass)) {
4004 util$4.throw("\"animator\" is not an instance of ".concat(this._baseClassName));
4005 }
4006
4007 return animator;
4008 }
4009 }], [{
4010 key: "parseAnimationOptionsString",
4011 value: function parseAnimationOptionsString(jsonString) {
4012 try {
4013 if (typeof jsonString === 'string') {
4014 var result = util$4.animationOptionsParse(jsonString);
4015
4016 if (_typeof(result) === 'object' && result !== null) {
4017 return result;
4018 } else {
4019 console.error('"animation-options" attribute must be a JSON object string: ' + jsonString);
4020 }
4021 }
4022
4023 return {};
4024 } catch (e) {
4025 console.error('"animation-options" attribute must be a JSON object string: ' + jsonString);
4026 return {};
4027 }
4028 }
4029 }]);
4030
4031 return AnimatorFactory;
4032 }();
4033
4034 var util$2 = {
4035 _ready: false,
4036 _domContentLoaded: false,
4037 _onDOMContentLoaded: function _onDOMContentLoaded() {
4038 util$2._domContentLoaded = true;
4039
4040 if (platform.isWebView()) {
4041 window.document.addEventListener('deviceready', function () {
4042 util$2._ready = true;
4043 }, false);
4044 } else {
4045 util$2._ready = true;
4046 }
4047 },
4048 addBackButtonListener: function addBackButtonListener(fn) {
4049 if (!this._domContentLoaded) {
4050 throw new Error('This method is available after DOMContentLoaded');
4051 }
4052
4053 if (this._ready) {
4054 window.document.addEventListener('backbutton', fn, false);
4055 } else {
4056 window.document.addEventListener('deviceready', function () {
4057 window.document.addEventListener('backbutton', fn, false);
4058 });
4059 }
4060 },
4061 removeBackButtonListener: function removeBackButtonListener(fn) {
4062 if (!this._domContentLoaded) {
4063 throw new Error('This method is available after DOMContentLoaded');
4064 }
4065
4066 if (this._ready) {
4067 window.document.removeEventListener('backbutton', fn, false);
4068 } else {
4069 window.document.addEventListener('deviceready', function () {
4070 window.document.removeEventListener('backbutton', fn, false);
4071 });
4072 }
4073 }
4074 };
4075 window.addEventListener('DOMContentLoaded', function () {
4076 return util$2._onDOMContentLoaded();
4077 }, false);
4078 var HandlerRepository = {
4079 _store: {},
4080 _genId: function () {
4081 var i = 0;
4082 return function () {
4083 return i++;
4084 };
4085 }(),
4086 set: function set(element, handler) {
4087 if (element.dataset.deviceBackButtonHandlerId) {
4088 this.remove(element);
4089 }
4090
4091 var id = element.dataset.deviceBackButtonHandlerId = HandlerRepository._genId();
4092
4093 this._store[id] = handler;
4094 },
4095 remove: function remove(element) {
4096 if (element.dataset.deviceBackButtonHandlerId) {
4097 delete this._store[element.dataset.deviceBackButtonHandlerId];
4098 delete element.dataset.deviceBackButtonHandlerId;
4099 }
4100 },
4101 get: function get(element) {
4102 if (!element.dataset.deviceBackButtonHandlerId) {
4103 return undefined;
4104 }
4105
4106 var id = element.dataset.deviceBackButtonHandlerId;
4107
4108 if (!this._store[id]) {
4109 throw new Error();
4110 }
4111
4112 return this._store[id];
4113 },
4114 has: function has(element) {
4115 if (!element.dataset) {
4116 return false;
4117 }
4118
4119 var id = element.dataset.deviceBackButtonHandlerId;
4120 return !!this._store[id];
4121 }
4122 };
4123
4124 var DeviceBackButtonDispatcher = /*#__PURE__*/function () {
4125 function DeviceBackButtonDispatcher() {
4126 _classCallCheck(this, DeviceBackButtonDispatcher);
4127
4128 this._isEnabled = false;
4129 this._boundCallback = this._callback.bind(this);
4130 }
4131 /**
4132 * Enable to handle 'backbutton' events.
4133 */
4134
4135
4136 _createClass(DeviceBackButtonDispatcher, [{
4137 key: "enable",
4138 value: function enable() {
4139 if (!this._isEnabled) {
4140 util$2.addBackButtonListener(this._boundCallback);
4141 this._isEnabled = true;
4142 }
4143 }
4144 /**
4145 * Disable to handle 'backbutton' events.
4146 */
4147
4148 }, {
4149 key: "disable",
4150 value: function disable() {
4151 if (this._isEnabled) {
4152 util$2.removeBackButtonListener(this._boundCallback);
4153 this._isEnabled = false;
4154 }
4155 }
4156 /**
4157 * Fire a 'backbutton' event manually.
4158 */
4159
4160 }, {
4161 key: "fireDeviceBackButtonEvent",
4162 value: function fireDeviceBackButtonEvent() {
4163 var event = document.createEvent('Event');
4164 event.initEvent('backbutton', true, true);
4165 document.dispatchEvent(event);
4166 }
4167 }, {
4168 key: "_callback",
4169 value: function _callback() {
4170 this._dispatchDeviceBackButtonEvent();
4171 }
4172 /**
4173 * @param {HTMLElement} element
4174 * @param {Function} callback
4175 */
4176
4177 }, {
4178 key: "createHandler",
4179 value: function createHandler(element, callback) {
4180 if (!(element instanceof HTMLElement)) {
4181 throw new Error('element must be an instance of HTMLElement');
4182 }
4183
4184 if (!(callback instanceof Function)) {
4185 throw new Error('callback must be an instance of Function');
4186 }
4187
4188 var handler = {
4189 _callback: callback,
4190 _element: element,
4191 disable: function disable() {
4192 HandlerRepository.remove(element);
4193 },
4194 setListener: function setListener(callback) {
4195 this._callback = callback;
4196 },
4197 enable: function enable() {
4198 HandlerRepository.set(element, this);
4199 },
4200 isEnabled: function isEnabled() {
4201 return HandlerRepository.get(element) === this;
4202 },
4203 destroy: function destroy() {
4204 HandlerRepository.remove(element);
4205 this._callback = this._element = null;
4206 }
4207 };
4208 handler.enable();
4209 return handler;
4210 }
4211 }, {
4212 key: "_dispatchDeviceBackButtonEvent",
4213 value: function _dispatchDeviceBackButtonEvent() {
4214 var tree = this._captureTree();
4215
4216 var element = this._findHandlerLeafElement(tree);
4217
4218 var handler = HandlerRepository.get(element);
4219
4220 handler._callback(createEvent(element));
4221
4222 function createEvent(element) {
4223 return {
4224 _element: element,
4225 callParentHandler: function callParentHandler() {
4226 var parent = this._element.parentNode;
4227
4228 while (parent) {
4229 handler = HandlerRepository.get(parent);
4230
4231 if (handler) {
4232 return handler._callback(createEvent(parent));
4233 }
4234
4235 parent = parent.parentNode;
4236 }
4237 }
4238 };
4239 }
4240 }
4241 /**
4242 * @return {Object}
4243 */
4244
4245 }, {
4246 key: "_captureTree",
4247 value: function _captureTree() {
4248 return createTree(document.body);
4249
4250 function createTree(element) {
4251 var tree = {
4252 element: element,
4253 children: Array.prototype.concat.apply([], arrayOf(element.children).map(function (childElement) {
4254 if (childElement.style.display === 'none' || childElement._isShown === false) {
4255 return [];
4256 }
4257
4258 if (childElement.children.length === 0 && !HandlerRepository.has(childElement)) {
4259 return [];
4260 }
4261
4262 var result = createTree(childElement);
4263
4264 if (result.children.length === 0 && !HandlerRepository.has(result.element)) {
4265 return [];
4266 }
4267
4268 return [result];
4269 }))
4270 };
4271
4272 if (!HandlerRepository.has(tree.element)) {
4273 for (var i = 0; i < tree.children.length; i++) {
4274 var subTree = tree.children[i];
4275
4276 if (HandlerRepository.has(subTree.element)) {
4277 return subTree;
4278 }
4279 }
4280 }
4281
4282 return tree;
4283 }
4284
4285 function arrayOf(target) {
4286 var result = [];
4287
4288 for (var i = 0; i < target.length; i++) {
4289 result.push(target[i]);
4290 }
4291
4292 return result;
4293 }
4294 }
4295 /**
4296 * @param {Object} tree
4297 * @return {HTMLElement}
4298 */
4299
4300 }, {
4301 key: "_findHandlerLeafElement",
4302 value: function _findHandlerLeafElement(tree) {
4303 return find(tree);
4304
4305 function find(node) {
4306 if (node.children.length === 0) {
4307 return node.element;
4308 }
4309
4310 if (node.children.length === 1) {
4311 return find(node.children[0]);
4312 }
4313
4314 return node.children.map(function (childNode) {
4315 return childNode.element;
4316 }).reduce(function (left, right) {
4317 if (!left) {
4318 return right;
4319 }
4320
4321 var leftZ = parseInt(window.getComputedStyle(left, '').zIndex, 10);
4322 var rightZ = parseInt(window.getComputedStyle(right, '').zIndex, 10);
4323
4324 if (!isNaN(leftZ) && !isNaN(rightZ)) {
4325 return leftZ > rightZ ? left : right;
4326 }
4327
4328 throw new Error('Capturing backbutton-handler is failure.');
4329 }, null);
4330 }
4331 }
4332 }]);
4333
4334 return DeviceBackButtonDispatcher;
4335 }();
4336
4337 var deviceBackButtonDispatcher = new DeviceBackButtonDispatcher();
4338
4339 /*
4340 Copyright 2013-2015 ASIAL CORPORATION
4341
4342 Licensed under the Apache License, Version 2.0 (the "License");
4343 you may not use this file except in compliance with the License.
4344 You may obtain a copy of the License at
4345
4346 http://www.apache.org/licenses/LICENSE-2.0
4347
4348 Unless required by applicable law or agreed to in writing, software
4349 distributed under the License is distributed on an "AS IS" BASIS,
4350 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4351 See the License for the specific language governing permissions and
4352 limitations under the License.
4353
4354 */
4355 internal$1.AnimatorFactory = AnimatorFactory;
4356 internal$1.ModifierUtil = ModifierUtil;
4357 internal$1.dbbDispatcher = deviceBackButtonDispatcher;
4358
4359 function setup$1(ons) {
4360 internal$1.waitDOMContentLoaded(function () {
4361 register('script[type="text/template"]');
4362 register('script[type="text/ng-template"]');
4363 register('template');
4364
4365 function register(query) {
4366 var templates = window.document.querySelectorAll(query);
4367
4368 for (var i = 0; i < templates.length; i++) {
4369 internal$1.templateStore.set(templates[i].getAttribute('id'), templates[i].textContent || templates[i].content);
4370 }
4371 }
4372 });
4373
4374 if (window._onsLoaded) {
4375 ons._util.warn('Onsen UI is loaded more than once.');
4376 }
4377
4378 window._onsLoaded = true;
4379 ons.ready(function () {
4380 ons.enableDeviceBackButtonHandler();
4381 ons._defaultDeviceBackButtonHandler = ons._internal.dbbDispatcher.createHandler(window.document.body, function () {
4382 if (Object.hasOwnProperty.call(navigator, 'app')) {
4383 navigator.app.exitApp();
4384 } else {
4385 console.warn('Could not close the app. Is \'cordova.js\' included?\nError: \'window.navigator.app\' is undefined.');
4386 }
4387 });
4388 document.body._gestureDetector = new ons.GestureDetector(document.body, {
4389 passive: true
4390 }); // Simulate Device Back Button on ESC press
4391
4392 if (!ons.platform.isWebView()) {
4393 document.body.addEventListener('keydown', function (event) {
4394 if (event.keyCode === 27) {
4395 ons.fireDeviceBackButtonEvent();
4396 }
4397 });
4398 } // setup loading placeholder
4399
4400
4401 ons._setupLoadingPlaceHolders();
4402 }); // viewport.js
4403
4404 Viewport.setup();
4405 }
4406
4407 /*
4408 Copyright 2013-2015 ASIAL CORPORATION
4409
4410 Licensed under the Apache License, Version 2.0 (the "License");
4411 you may not use this file except in compliance with the License.
4412 You may obtain a copy of the License at
4413
4414 http://www.apache.org/licenses/LICENSE-2.0
4415
4416 Unless required by applicable law or agreed to in writing, software
4417 distributed under the License is distributed on an "AS IS" BASIS,
4418 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4419 See the License for the specific language governing permissions and
4420 limitations under the License.
4421
4422 */
4423
4424 var TIMEOUT_RATIO = 1.4;
4425 var util$1 = {}; // capitalize string
4426
4427 util$1.capitalize = function (str) {
4428 return str.charAt(0).toUpperCase() + str.slice(1);
4429 };
4430 /**
4431 * @param {Object} params
4432 * @param {String} params.property
4433 * @param {Float} params.duration
4434 * @param {String} params.timing
4435 */
4436
4437
4438 util$1.buildTransitionValue = function (params) {
4439 params.property = params.property || 'all';
4440 params.duration = params.duration || 0.4;
4441 params.timing = params.timing || 'linear';
4442 var props = params.property.split(/ +/);
4443 return props.map(function (prop) {
4444 return prop + ' ' + params.duration + 's ' + params.timing;
4445 }).join(', ');
4446 };
4447 /**
4448 * Add an event handler on "transitionend" event.
4449 */
4450
4451
4452 util$1.onceOnTransitionEnd = function (element, callback) {
4453 if (!element) {
4454 return function () {};
4455 }
4456
4457 var removeListeners = function removeListeners() {
4458 util$1._transitionEndEvents.forEach(function (eventName) {
4459 element.removeEventListener(eventName, fn, false);
4460 });
4461 };
4462
4463 var fn = function fn(event) {
4464 if (element == event.target) {
4465 event.stopPropagation();
4466 removeListeners();
4467 callback();
4468 }
4469 };
4470
4471 util$1._transitionEndEvents.forEach(function (eventName) {
4472 element.addEventListener(eventName, fn, false);
4473 });
4474
4475 return removeListeners;
4476 };
4477
4478 util$1._transitionEndEvents = function () {
4479 if ('ontransitionend' in window) {
4480 return ['transitionend'];
4481 }
4482
4483 if ('onwebkittransitionend' in window) {
4484 return ['webkitTransitionEnd'];
4485 }
4486
4487 if (util$1.vendorPrefix === 'webkit' || util$1.vendorPrefix === 'o' || util$1.vendorPrefix === 'moz' || util$1.vendorPrefix === 'ms') {
4488 return [util$1.vendorPrefix + 'TransitionEnd', 'transitionend'];
4489 }
4490
4491 return [];
4492 }();
4493
4494 util$1._cssPropertyDict = function () {
4495 var styles = window.getComputedStyle(document.documentElement, '');
4496 var dict = {};
4497 var a = 'A'.charCodeAt(0);
4498 var z = 'z'.charCodeAt(0);
4499
4500 var upper = function upper(s) {
4501 return s.substr(1).toUpperCase();
4502 };
4503
4504 for (var i = 0; i < styles.length; i++) {
4505 var key = styles[i].replace(/^[-]+/, '').replace(/[-][a-z]/g, upper).replace(/^moz/, 'Moz');
4506
4507 if (a <= key.charCodeAt(0) && z >= key.charCodeAt(0)) {
4508 if (key !== 'cssText' && key !== 'parentText') {
4509 dict[key] = true;
4510 }
4511 }
4512 }
4513
4514 return dict;
4515 }();
4516
4517 util$1.hasCssProperty = function (name) {
4518 return name in util$1._cssPropertyDict;
4519 };
4520 /**
4521 * Vendor prefix for css property.
4522 */
4523
4524
4525 util$1.vendorPrefix = function () {
4526 var styles = window.getComputedStyle(document.documentElement, ''),
4527 pre = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1];
4528 return pre;
4529 }();
4530
4531 util$1.forceLayoutAtOnce = function (elements, callback) {
4532 this.batchImmediate(function () {
4533 elements.forEach(function (element) {
4534 // force layout
4535 element.offsetHeight;
4536 });
4537 callback();
4538 });
4539 };
4540
4541 util$1.batchImmediate = function () {
4542 var callbacks = [];
4543 return function (callback) {
4544 if (callbacks.length === 0) {
4545 setImmediate(function () {
4546 var concreateCallbacks = callbacks.slice(0);
4547 callbacks = [];
4548 concreateCallbacks.forEach(function (callback) {
4549 callback();
4550 });
4551 });
4552 }
4553
4554 callbacks.push(callback);
4555 };
4556 }();
4557
4558 util$1.batchAnimationFrame = function () {
4559 var callbacks = [];
4560
4561 var raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {
4562 setTimeout(callback, 1000 / 60);
4563 };
4564
4565 return function (callback) {
4566 if (callbacks.length === 0) {
4567 raf(function () {
4568 var concreateCallbacks = callbacks.slice(0);
4569 callbacks = [];
4570 concreateCallbacks.forEach(function (callback) {
4571 callback();
4572 });
4573 });
4574 }
4575
4576 callbacks.push(callback);
4577 };
4578 }();
4579
4580 util$1.transitionPropertyName = function () {
4581 if (util$1.hasCssProperty('transitionDuration')) {
4582 return 'transition';
4583 }
4584
4585 if (util$1.hasCssProperty(util$1.vendorPrefix + 'TransitionDuration')) {
4586 return util$1.vendorPrefix + 'Transition';
4587 }
4588
4589 throw new Error('Invalid state');
4590 }();
4591 /**
4592 * @param {HTMLElement} element
4593 */
4594
4595
4596 var Animit = function Animit(element, defaults) {
4597 if (!(this instanceof Animit)) {
4598 return new Animit(element, defaults);
4599 }
4600
4601 if (element instanceof HTMLElement) {
4602 this.elements = [element];
4603 } else if (Object.prototype.toString.call(element) === '[object Array]') {
4604 this.elements = element;
4605 } else {
4606 throw new Error('First argument must be an array or an instance of HTMLElement.');
4607 }
4608
4609 this.defaults = defaults;
4610 this.transitionQueue = [];
4611 this.lastStyleAttributeDict = [];
4612 };
4613
4614 Animit.prototype = {
4615 /**
4616 * @property {Array}
4617 */
4618 transitionQueue: undefined,
4619
4620 /**
4621 * @property {Array}
4622 */
4623 elements: undefined,
4624
4625 /**
4626 * @property {Object}
4627 */
4628 defaults: undefined,
4629
4630 /**
4631 * Start animation sequence with passed animations.
4632 *
4633 * @param {Function} callback
4634 */
4635 play: function play(callback) {
4636 if (typeof callback === 'function') {
4637 this.transitionQueue.push(function (done) {
4638 callback();
4639 done();
4640 });
4641 }
4642
4643 this.startAnimation();
4644 return this;
4645 },
4646
4647 /**
4648 * Most of the animations follow this default process.
4649 *
4650 * @param {from} css or options object containing css
4651 * @param {to} css or options object containing css
4652 * @param {delay} delay to wait
4653 */
4654 default: function _default(from, to, delay) {
4655 function step(params, duration, timing) {
4656 if (params.duration !== undefined) {
4657 duration = params.duration;
4658 }
4659
4660 if (params.timing !== undefined) {
4661 timing = params.timing;
4662 }
4663
4664 return {
4665 css: params.css || params,
4666 duration: duration,
4667 timing: timing
4668 };
4669 }
4670
4671 return this.saveStyle().queue(step(from, 0, this.defaults.timing)).wait(delay === undefined ? this.defaults.delay : delay).queue(step(to, this.defaults.duration, this.defaults.timing)).restoreStyle();
4672 },
4673
4674 /**
4675 * Queue transition animations or other function.
4676 *
4677 * e.g. animit(elt).queue({color: 'red'})
4678 * e.g. animit(elt).queue({color: 'red'}, {duration: 0.4})
4679 * e.g. animit(elt).queue({css: {color: 'red'}, duration: 0.2})
4680 *
4681 * @param {Object|Animit.Transition|Function} transition
4682 * @param {Object} [options]
4683 */
4684 queue: function queue(transition, options) {
4685 var queue = this.transitionQueue;
4686
4687 if (transition && options) {
4688 options.css = transition;
4689 transition = new Animit.Transition(options);
4690 }
4691
4692 if (!(transition instanceof Function || transition instanceof Animit.Transition)) {
4693 if (transition.css) {
4694 transition = new Animit.Transition(transition);
4695 } else {
4696 transition = new Animit.Transition({
4697 css: transition
4698 });
4699 }
4700 }
4701
4702 if (transition instanceof Function) {
4703 queue.push(transition);
4704 } else if (transition instanceof Animit.Transition) {
4705 queue.push(transition.build());
4706 } else {
4707 throw new Error('Invalid arguments');
4708 }
4709
4710 return this;
4711 },
4712
4713 /**
4714 * Queue transition animations.
4715 *
4716 * @param {Float} seconds
4717 */
4718 wait: function wait(seconds) {
4719 if (seconds > 0) {
4720 this.transitionQueue.push(function (done) {
4721 setTimeout(done, 1000 * seconds);
4722 });
4723 }
4724
4725 return this;
4726 },
4727 saveStyle: function saveStyle() {
4728 this.transitionQueue.push(function (done) {
4729 this.elements.forEach(function (element, index) {
4730 var css = this.lastStyleAttributeDict[index] = {};
4731
4732 for (var i = 0; i < element.style.length; i++) {
4733 css[element.style[i]] = element.style[element.style[i]];
4734 }
4735 }.bind(this));
4736 done();
4737 }.bind(this));
4738 return this;
4739 },
4740
4741 /**
4742 * Restore element's style.
4743 *
4744 * @param {Object} [options]
4745 * @param {Float} [options.duration]
4746 * @param {String} [options.timing]
4747 * @param {String} [options.transition]
4748 */
4749 restoreStyle: function restoreStyle(options) {
4750 options = options || {};
4751 var self = this;
4752
4753 if (options.transition && !options.duration) {
4754 throw new Error('"options.duration" is required when "options.transition" is enabled.');
4755 }
4756
4757 var transitionName = util$1.transitionPropertyName;
4758
4759 if (options.transition || options.duration && options.duration > 0) {
4760 var transitionValue = options.transition || 'all ' + options.duration + 's ' + (options.timing || 'linear');
4761 this.transitionQueue.push(function (done) {
4762 var elements = this.elements;
4763 var timeoutId;
4764
4765 var clearTransition = function clearTransition() {
4766 elements.forEach(function (element) {
4767 element.style[transitionName] = '';
4768 });
4769 }; // add "transitionend" event handler
4770
4771
4772 var removeListeners = util$1.onceOnTransitionEnd(elements[0], function () {
4773 clearTimeout(timeoutId);
4774 clearTransition();
4775 done();
4776 }); // for fail safe.
4777
4778 timeoutId = setTimeout(function () {
4779 removeListeners();
4780 clearTransition();
4781 done();
4782 }, options.duration * 1000 * TIMEOUT_RATIO); // transition and style settings
4783
4784 elements.forEach(function (element, index) {
4785 var css = self.lastStyleAttributeDict[index];
4786
4787 if (!css) {
4788 throw new Error('restoreStyle(): The style is not saved. Invoke saveStyle() before.');
4789 }
4790
4791 self.lastStyleAttributeDict[index] = undefined;
4792 var name;
4793
4794 for (var i = 0, len = element.style.length; i < len; i++) {
4795 name = element.style[i];
4796
4797 if (css[name] === undefined) {
4798 css[name] = '';
4799 }
4800 }
4801
4802 element.style[transitionName] = transitionValue;
4803 Object.keys(css).forEach(function (key) {
4804 if (key !== transitionName) {
4805 element.style[key] = css[key];
4806 }
4807 });
4808 element.style[transitionName] = transitionValue;
4809 });
4810 });
4811 } else {
4812 this.transitionQueue.push(function (done) {
4813 reset();
4814 done();
4815 });
4816 }
4817
4818 return this;
4819
4820 function reset() {
4821 // Clear transition animation settings.
4822 self.elements.forEach(function (element, index) {
4823 element.style[transitionName] = 'none';
4824 var css = self.lastStyleAttributeDict[index];
4825
4826 if (!css) {
4827 throw new Error('restoreStyle(): The style is not saved. Invoke saveStyle() before.');
4828 }
4829
4830 self.lastStyleAttributeDict[index] = undefined;
4831
4832 for (var i = 0, name = ''; i < element.style.length; i++) {
4833 name = element.style[i];
4834
4835 if (typeof css[element.style[i]] === 'undefined') {
4836 css[element.style[i]] = '';
4837 }
4838 }
4839
4840 Object.keys(css).forEach(function (key) {
4841 element.style[key] = css[key];
4842 });
4843 });
4844 }
4845 },
4846
4847 /**
4848 * Start animation sequence.
4849 */
4850 startAnimation: function startAnimation() {
4851 this._dequeueTransition();
4852
4853 return this;
4854 },
4855 _dequeueTransition: function _dequeueTransition() {
4856 var transition = this.transitionQueue.shift();
4857
4858 if (this._currentTransition) {
4859 throw new Error('Current transition exists.');
4860 }
4861
4862 this._currentTransition = transition;
4863 var self = this;
4864 var called = false;
4865
4866 var done = function done() {
4867 if (!called) {
4868 called = true;
4869 self._currentTransition = undefined;
4870
4871 self._dequeueTransition();
4872 } else {
4873 throw new Error('Invalid state: This callback is called twice.');
4874 }
4875 };
4876
4877 if (transition) {
4878 transition.call(this, done);
4879 }
4880 }
4881 };
4882 /**
4883 * @param {Animit} arguments
4884 */
4885
4886 Animit.runAll = function
4887 /* arguments... */
4888 () {
4889 for (var i = 0; i < arguments.length; i++) {
4890 arguments[i].play();
4891 }
4892 };
4893 /**
4894 * @param {Object} options
4895 * @param {Float} [options.duration]
4896 * @param {String} [options.property]
4897 * @param {String} [options.timing]
4898 */
4899
4900
4901 Animit.Transition = function (options) {
4902 this.options = options || {};
4903 this.options.duration = this.options.duration || 0;
4904 this.options.timing = this.options.timing || 'linear';
4905 this.options.css = this.options.css || {};
4906 this.options.property = this.options.property || 'all';
4907 };
4908
4909 Animit.Transition.prototype = {
4910 /**
4911 * @param {HTMLElement} element
4912 * @return {Function}
4913 */
4914 build: function build() {
4915 if (Object.keys(this.options.css).length === 0) {
4916 throw new Error('options.css is required.');
4917 }
4918
4919 var css = createActualCssProps(this.options.css);
4920
4921 if (this.options.duration > 0) {
4922 var transitionValue = util$1.buildTransitionValue(this.options);
4923 var self = this;
4924 return function (callback) {
4925 var elements = this.elements;
4926 var timeout = self.options.duration * 1000 * TIMEOUT_RATIO;
4927 var timeoutId;
4928 var removeListeners = util$1.onceOnTransitionEnd(elements[0], function () {
4929 clearTimeout(timeoutId);
4930 callback();
4931 });
4932 timeoutId = setTimeout(function () {
4933 removeListeners();
4934 callback();
4935 }, timeout);
4936 elements.forEach(function (element) {
4937 element.style[util$1.transitionPropertyName] = transitionValue;
4938 Object.keys(css).forEach(function (name) {
4939 element.style[name] = css[name];
4940 });
4941 });
4942 };
4943 }
4944
4945 if (this.options.duration <= 0) {
4946 return function (callback) {
4947 var elements = this.elements;
4948 elements.forEach(function (element) {
4949 element.style[util$1.transitionPropertyName] = '';
4950 Object.keys(css).forEach(function (name) {
4951 element.style[name] = css[name];
4952 });
4953 });
4954
4955 if (elements.length > 0) {
4956 util$1.forceLayoutAtOnce(elements, function () {
4957 util$1.batchAnimationFrame(callback);
4958 });
4959 } else {
4960 util$1.batchAnimationFrame(callback);
4961 }
4962 };
4963 }
4964
4965 function createActualCssProps(css) {
4966 var result = {};
4967 Object.keys(css).forEach(function (name) {
4968 var value = css[name];
4969
4970 if (util$1.hasCssProperty(name)) {
4971 result[name] = value;
4972 return;
4973 }
4974
4975 var prefixed = util$1.vendorPrefix + util$1.capitalize(name);
4976
4977 if (util$1.hasCssProperty(prefixed)) {
4978 result[prefixed] = value;
4979 } else {
4980 result[prefixed] = value;
4981 result[name] = value;
4982 }
4983 });
4984 return result;
4985 }
4986 }
4987 };
4988
4989 /*
4990 * Gesture detector library that forked from github.com/EightMedia/hammer.js.
4991 */
4992 var Event$1, Utils, Detection, PointerEvent;
4993 /**
4994 * @object ons.GestureDetector
4995 * @category gesture
4996 * @description
4997 * [en]Utility class for gesture detection.[/en]
4998 * [ja]ジェスチャを検知するためのユーティリティクラスです。[/ja]
4999 */
5000
5001 /**
5002 * @method constructor
5003 * @signature constructor(element[, options])
5004 * @description
5005 * [en]Create a new GestureDetector instance.[/en]
5006 * [ja]GestureDetectorのインスタンスを生成します。[/ja]
5007 * @param {Element} element
5008 * [en]Name of the event.[/en]
5009 * [ja]ジェスチャを検知するDOM要素を指定します。[/ja]
5010 * @param {Object} [options]
5011 * [en]Options object.[/en]
5012 * [ja]オプションを指定します。[/ja]
5013 * @return {ons.GestureDetector.Instance}
5014 */
5015
5016 var GestureDetector = function GestureDetector(element, options) {
5017 return new GestureDetector.Instance(element, options || {});
5018 };
5019 /**
5020 * default settings.
5021 * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled
5022 * by setting it's name (like `swipe`) to false.
5023 * You can set the defaults for all instances by changing this object before creating an instance.
5024 * @example
5025 * ````
5026 * GestureDetector.defaults.drag = false;
5027 * GestureDetector.defaults.behavior.touchAction = 'pan-y';
5028 * delete GestureDetector.defaults.behavior.userSelect;
5029 * ````
5030 * @property defaults
5031 * @type {Object}
5032 */
5033
5034
5035 GestureDetector.defaults = {
5036 behavior: {
5037 // userSelect: 'none', // Also disables selection in `input` children
5038 touchAction: 'pan-y',
5039 touchCallout: 'none',
5040 contentZooming: 'none',
5041 userDrag: 'none',
5042 tapHighlightColor: 'rgba(0,0,0,0)'
5043 }
5044 };
5045 /**
5046 * GestureDetector document where the base events are added at
5047 * @property DOCUMENT
5048 * @type {HTMLElement}
5049 * @default window.document
5050 */
5051
5052 GestureDetector.DOCUMENT = document;
5053 /**
5054 * detect support for pointer events
5055 * @property HAS_POINTEREVENTS
5056 * @type {Boolean}
5057 */
5058
5059 GestureDetector.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled;
5060 /**
5061 * detect support for touch events
5062 * @property HAS_TOUCHEVENTS
5063 * @type {Boolean}
5064 */
5065
5066 GestureDetector.HAS_TOUCHEVENTS = 'ontouchstart' in window;
5067 /**
5068 * detect mobile browsers
5069 * @property IS_MOBILE
5070 * @type {Boolean}
5071 */
5072
5073 GestureDetector.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent);
5074 /**
5075 * detect if we want to support mouseevents at all
5076 * @property NO_MOUSEEVENTS
5077 * @type {Boolean}
5078 */
5079
5080 GestureDetector.NO_MOUSEEVENTS = GestureDetector.HAS_TOUCHEVENTS && GestureDetector.IS_MOBILE || GestureDetector.HAS_POINTEREVENTS;
5081 /**
5082 * interval in which GestureDetector recalculates current velocity/direction/angle in ms
5083 * @property CALCULATE_INTERVAL
5084 * @type {Number}
5085 * @default 25
5086 */
5087
5088 GestureDetector.CALCULATE_INTERVAL = 25;
5089 /**
5090 * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup`
5091 * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`)
5092 * @property EVENT_TYPES
5093 * @private
5094 * @writeOnce
5095 * @type {Object}
5096 */
5097
5098 var EVENT_TYPES = {};
5099 /**
5100 * direction strings, for safe comparisons
5101 * @property DIRECTION_DOWN|LEFT|UP|RIGHT
5102 * @final
5103 * @type {String}
5104 * @default 'down' 'left' 'up' 'right'
5105 */
5106
5107 var DIRECTION_DOWN = GestureDetector.DIRECTION_DOWN = 'down';
5108 var DIRECTION_LEFT = GestureDetector.DIRECTION_LEFT = 'left';
5109 var DIRECTION_UP = GestureDetector.DIRECTION_UP = 'up';
5110 var DIRECTION_RIGHT = GestureDetector.DIRECTION_RIGHT = 'right';
5111 /**
5112 * pointertype strings, for safe comparisons
5113 * @property POINTER_MOUSE|TOUCH|PEN
5114 * @final
5115 * @type {String}
5116 * @default 'mouse' 'touch' 'pen'
5117 */
5118
5119 var POINTER_MOUSE = GestureDetector.POINTER_MOUSE = 'mouse';
5120 var POINTER_TOUCH = GestureDetector.POINTER_TOUCH = 'touch';
5121 var POINTER_PEN = GestureDetector.POINTER_PEN = 'pen';
5122 /**
5123 * eventtypes
5124 * @property EVENT_START|MOVE|END|RELEASE|TOUCH
5125 * @final
5126 * @type {String}
5127 * @default 'start' 'change' 'move' 'end' 'release' 'touch'
5128 */
5129
5130 var EVENT_START = GestureDetector.EVENT_START = 'start';
5131 var EVENT_MOVE = GestureDetector.EVENT_MOVE = 'move';
5132 var EVENT_END = GestureDetector.EVENT_END = 'end';
5133 var EVENT_RELEASE = GestureDetector.EVENT_RELEASE = 'release';
5134 var EVENT_TOUCH = GestureDetector.EVENT_TOUCH = 'touch';
5135 /**
5136 * if the window events are set...
5137 * @property READY
5138 * @writeOnce
5139 * @type {Boolean}
5140 * @default false
5141 */
5142
5143 GestureDetector.READY = false;
5144 /**
5145 * plugins namespace
5146 * @property plugins
5147 * @type {Object}
5148 */
5149
5150 GestureDetector.plugins = GestureDetector.plugins || {};
5151 /**
5152 * gestures namespace
5153 * see `/gestures` for the definitions
5154 * @property gestures
5155 * @type {Object}
5156 */
5157
5158 GestureDetector.gestures = GestureDetector.gestures || {};
5159 /**
5160 * setup events to detect gestures on the document
5161 * this function is called when creating an new instance
5162 * @private
5163 */
5164
5165 function setup(opts) {
5166 if (GestureDetector.READY) {
5167 return;
5168 } // find what eventtypes we add listeners to
5169
5170
5171 Event$1.determineEventTypes(); // Register all gestures inside GestureDetector.gestures
5172
5173 Utils.each(GestureDetector.gestures, function (gesture) {
5174 Detection.register(gesture);
5175 }); // Add touch events on the document
5176
5177 Event$1.onTouch(GestureDetector.DOCUMENT, EVENT_MOVE, Detection.detect, opts);
5178 Event$1.onTouch(GestureDetector.DOCUMENT, EVENT_END, Detection.detect, opts); // GestureDetector is ready...!
5179
5180 GestureDetector.READY = true;
5181 }
5182 /**
5183 * @module GestureDetector
5184 *
5185 * @class Utils
5186 * @static
5187 */
5188
5189
5190 Utils = GestureDetector.utils = {
5191 /**
5192 * extend method, could also be used for cloning when `dest` is an empty object.
5193 * changes the dest object
5194 * @param {Object} dest
5195 * @param {Object} src
5196 * @param {Boolean} [merge=false] do a merge
5197 * @return {Object} dest
5198 */
5199 extend: function extend(dest, src, merge) {
5200 for (var key in src) {
5201 if (Object.prototype.hasOwnProperty.call(src, key) && (dest[key] === undefined || !merge)) {
5202 dest[key] = src[key];
5203 }
5204 }
5205
5206 return dest;
5207 },
5208
5209 /**
5210 * simple addEventListener wrapper
5211 * @param {HTMLElement} element
5212 * @param {String} type
5213 * @param {Function} handler
5214 */
5215 on: function on(element, type, handler, opt) {
5216 util$4.addEventListener(element, type, handler, opt, true);
5217 },
5218
5219 /**
5220 * simple removeEventListener wrapper
5221 * @param {HTMLElement} element
5222 * @param {String} type
5223 * @param {Function} handler
5224 */
5225 off: function off(element, type, handler, opt) {
5226 util$4.removeEventListener(element, type, handler, opt, true);
5227 },
5228
5229 /**
5230 * forEach over arrays and objects
5231 * @param {Object|Array} obj
5232 * @param {Function} iterator
5233 * @param {any} iterator.item
5234 * @param {Number} iterator.index
5235 * @param {Object|Array} iterator.obj the source object
5236 * @param {Object} context value to use as `this` in the iterator
5237 */
5238 each: function each(obj, iterator, context) {
5239 var i, len; // native forEach on arrays
5240
5241 if ('forEach' in obj) {
5242 obj.forEach(iterator, context); // arrays
5243 } else if (obj.length !== undefined) {
5244 for (i = 0, len = obj.length; i < len; i++) {
5245 if (iterator.call(context, obj[i], i, obj) === false) {
5246 return;
5247 }
5248 } // objects
5249
5250 } else {
5251 for (i in obj) {
5252 if (Object.prototype.hasOwnProperty.call(obj, i) && iterator.call(context, obj[i], i, obj) === false) {
5253 return;
5254 }
5255 }
5256 }
5257 },
5258
5259 /**
5260 * find if a string contains the string using indexOf
5261 * @param {String} src
5262 * @param {String} find
5263 * @return {Boolean} found
5264 */
5265 inStr: function inStr(src, find) {
5266 return src.indexOf(find) > -1;
5267 },
5268
5269 /**
5270 * find if a array contains the object using indexOf or a simple polyfill
5271 * @param {String} src
5272 * @param {String} find
5273 * @return {Boolean|Number} false when not found, or the index
5274 */
5275 inArray: function inArray(src, find, deep) {
5276 if (deep) {
5277 for (var i = 0, len = src.length; i < len; i++) {
5278 // Array.findIndex
5279 if (Object.keys(find).every(function (key) {
5280 return src[i][key] === find[key];
5281 })) {
5282 return i;
5283 }
5284 }
5285
5286 return -1;
5287 }
5288
5289 if (src.indexOf) {
5290 return src.indexOf(find);
5291 } else {
5292 for (var i = 0, len = src.length; i < len; i++) {
5293 if (src[i] === find) {
5294 return i;
5295 }
5296 }
5297
5298 return -1;
5299 }
5300 },
5301
5302 /**
5303 * convert an array-like object (`arguments`, `touchlist`) to an array
5304 * @param {Object} obj
5305 * @return {Array}
5306 */
5307 toArray: function toArray(obj) {
5308 return Array.prototype.slice.call(obj, 0);
5309 },
5310
5311 /**
5312 * find if a node is in the given parent
5313 * @param {HTMLElement} node
5314 * @param {HTMLElement} parent
5315 * @return {Boolean} found
5316 */
5317 hasParent: function hasParent(node, parent) {
5318 while (node) {
5319 if (node == parent) {
5320 return true;
5321 }
5322
5323 node = node.parentNode;
5324 }
5325
5326 return false;
5327 },
5328
5329 /**
5330 * get the center of all the touches
5331 * @param {Array} touches
5332 * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties
5333 */
5334 getCenter: function getCenter(touches) {
5335 var pageX = [],
5336 pageY = [],
5337 clientX = [],
5338 clientY = [],
5339 min = Math.min,
5340 max = Math.max; // no need to loop when only one touch
5341
5342 if (touches.length === 1) {
5343 return {
5344 pageX: touches[0].pageX,
5345 pageY: touches[0].pageY,
5346 clientX: touches[0].clientX,
5347 clientY: touches[0].clientY
5348 };
5349 }
5350
5351 Utils.each(touches, function (touch) {
5352 pageX.push(touch.pageX);
5353 pageY.push(touch.pageY);
5354 clientX.push(touch.clientX);
5355 clientY.push(touch.clientY);
5356 });
5357 return {
5358 pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2,
5359 pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2,
5360 clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2,
5361 clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2
5362 };
5363 },
5364
5365 /**
5366 * calculate the velocity between two points. unit is in px per ms.
5367 * @param {Number} deltaTime
5368 * @param {Number} deltaX
5369 * @param {Number} deltaY
5370 * @return {Object} velocity `x` and `y`
5371 */
5372 getVelocity: function getVelocity(deltaTime, deltaX, deltaY) {
5373 return {
5374 x: Math.abs(deltaX / deltaTime) || 0,
5375 y: Math.abs(deltaY / deltaTime) || 0
5376 };
5377 },
5378
5379 /**
5380 * calculate the angle between two coordinates
5381 * @param {Touch} touch1
5382 * @param {Touch} touch2
5383 * @return {Number} angle
5384 */
5385 getAngle: function getAngle(touch1, touch2) {
5386 var x = touch2.clientX - touch1.clientX,
5387 y = touch2.clientY - touch1.clientY;
5388 return Math.atan2(y, x) * 180 / Math.PI;
5389 },
5390
5391 /**
5392 * do a small comparison to get the direction between two touches.
5393 * @param {Touch} touch1
5394 * @param {Touch} touch2
5395 * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN`
5396 */
5397 getDirection: function getDirection(touch1, touch2) {
5398 var x = Math.abs(touch1.clientX - touch2.clientX),
5399 y = Math.abs(touch1.clientY - touch2.clientY);
5400
5401 if (x >= y) {
5402 return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
5403 }
5404
5405 return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN;
5406 },
5407
5408 /**
5409 * calculate the distance between two touches
5410 * @param {Touch}touch1
5411 * @param {Touch} touch2
5412 * @return {Number} distance
5413 */
5414 getDistance: function getDistance(touch1, touch2) {
5415 var x = touch2.clientX - touch1.clientX,
5416 y = touch2.clientY - touch1.clientY;
5417 return Math.sqrt(x * x + y * y);
5418 },
5419
5420 /**
5421 * calculate the scale factor between two touchLists
5422 * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out
5423 * @param {Array} start array of touches
5424 * @param {Array} end array of touches
5425 * @return {Number} scale
5426 */
5427 getScale: function getScale(start, end) {
5428 // need two fingers...
5429 if (start.length >= 2 && end.length >= 2) {
5430 return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]);
5431 }
5432
5433 return 1;
5434 },
5435
5436 /**
5437 * calculate the rotation degrees between two touchLists
5438 * @param {Array} start array of touches
5439 * @param {Array} end array of touches
5440 * @return {Number} rotation
5441 */
5442 getRotation: function getRotation(start, end) {
5443 // need two fingers
5444 if (start.length >= 2 && end.length >= 2) {
5445 return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]);
5446 }
5447
5448 return 0;
5449 },
5450
5451 /**
5452 * find out if the direction is vertical *
5453 * @param {String} direction matches `DIRECTION_UP|DOWN`
5454 * @return {Boolean} is_vertical
5455 */
5456 isVertical: function isVertical(direction) {
5457 return direction == DIRECTION_UP || direction == DIRECTION_DOWN;
5458 },
5459
5460 /**
5461 * set css properties with their prefixes
5462 * @param {HTMLElement} element
5463 * @param {String} prop
5464 * @param {String} value
5465 * @param {Boolean} [toggle=true]
5466 * @return {Boolean}
5467 */
5468 setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) {
5469 var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms'];
5470 prop = Utils.toCamelCase(prop);
5471
5472 for (var i = 0; i < prefixes.length; i++) {
5473 var p = prop; // prefixes
5474
5475 if (prefixes[i]) {
5476 p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1);
5477 } // test the style
5478
5479
5480 if (p in element.style) {
5481 element.style[p] = (toggle === null || toggle) && value || '';
5482 break;
5483 }
5484 }
5485 },
5486
5487 /**
5488 * toggle browser default behavior by setting css properties.
5489 * `userSelect='none'` also sets `element.onselectstart` to false
5490 * `userDrag='none'` also sets `element.ondragstart` to false
5491 *
5492 * @param {HtmlElement} element
5493 * @param {Object} props
5494 * @param {Boolean} [toggle=true]
5495 */
5496 toggleBehavior: function toggleBehavior(element, props, toggle) {
5497 if (!props || !element || !element.style) {
5498 return;
5499 } // set the css properties
5500
5501
5502 Utils.each(props, function (value, prop) {
5503 Utils.setPrefixedCss(element, prop, value, toggle);
5504 });
5505
5506 var falseFn = toggle && function () {
5507 return false;
5508 }; // also the disable onselectstart
5509
5510
5511 if (props.userSelect == 'none') {
5512 element.onselectstart = falseFn;
5513 } // and disable ondragstart
5514
5515
5516 if (props.userDrag == 'none') {
5517 element.ondragstart = falseFn;
5518 }
5519 },
5520
5521 /**
5522 * convert a string with underscores to camelCase
5523 * so prevent_default becomes preventDefault
5524 * @param {String} str
5525 * @return {String} camelCaseStr
5526 */
5527 toCamelCase: function toCamelCase(str) {
5528 return str.replace(/[_-]([a-z])/g, function (s) {
5529 return s[1].toUpperCase();
5530 });
5531 }
5532 };
5533 /**
5534 * @module GestureDetector
5535 */
5536
5537 /**
5538 * @class Event
5539 * @static
5540 */
5541
5542 Event$1 = GestureDetector.event = {
5543 /**
5544 * when touch events have been fired, this is true
5545 * this is used to stop mouse events
5546 * @property prevent_mouseevents
5547 * @private
5548 * @type {Boolean}
5549 */
5550 preventMouseEvents: false,
5551
5552 /**
5553 * if EVENT_START has been fired
5554 * @property started
5555 * @private
5556 * @type {Boolean}
5557 */
5558 started: false,
5559
5560 /**
5561 * when the mouse is hold down, this is true
5562 * @property should_detect
5563 * @private
5564 * @type {Boolean}
5565 */
5566 shouldDetect: false,
5567
5568 /**
5569 * simple event binder with a hook and support for multiple types
5570 * @param {HTMLElement} element
5571 * @param {String} type
5572 * @param {Function} handler
5573 * @param {Object} [opt]
5574 * @param {Function} [hook]
5575 * @param {Object} hook.type
5576 */
5577 on: function on(element, type, handler, opt, hook) {
5578 var types = type.split(' ');
5579 Utils.each(types, function (type) {
5580 Utils.on(element, type, handler, opt);
5581 hook && hook(type);
5582 });
5583 },
5584
5585 /**
5586 * simple event unbinder with a hook and support for multiple types
5587 * @param {HTMLElement} element
5588 * @param {String} type
5589 * @param {Function} handler
5590 * @param {Object} [opt]
5591 * @param {Function} [hook]
5592 * @param {Object} hook.type
5593 */
5594 off: function off(element, type, handler, opt, hook) {
5595 var types = type.split(' ');
5596 Utils.each(types, function (type) {
5597 Utils.off(element, type, handler, opt);
5598 hook && hook(type);
5599 });
5600 },
5601
5602 /**
5603 * the core touch event handler.
5604 * this finds out if we should to detect gestures
5605 * @param {HTMLElement} element
5606 * @param {String} eventType matches `EVENT_START|MOVE|END`
5607 * @param {Function} handler
5608 * @return onTouchHandler {Function} the core event handler
5609 */
5610 onTouch: function onTouch(element, eventType, handler, opt) {
5611 var self = this;
5612
5613 var onTouchHandler = function onTouchHandler(ev) {
5614 var srcType = ev.type.toLowerCase(),
5615 isPointer = GestureDetector.HAS_POINTEREVENTS,
5616 isMouse = Utils.inStr(srcType, 'mouse'),
5617 triggerType; // if we are in a mouseevent, but there has been a touchevent triggered in this session
5618 // we want to do nothing. simply break out of the event.
5619
5620 if (isMouse && self.preventMouseEvents) {
5621 return; // mousebutton must be down
5622 } else if (isMouse && eventType == EVENT_START && ev.button === 0) {
5623 self.preventMouseEvents = false;
5624 self.shouldDetect = true;
5625 } else if (isPointer && eventType == EVENT_START) {
5626 self.shouldDetect = ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev); // just a valid start event, but no mouse
5627 } else if (!isMouse && eventType == EVENT_START) {
5628 self.preventMouseEvents = true;
5629 self.shouldDetect = true;
5630 } // update the pointer event before entering the detection
5631
5632
5633 if (isPointer && eventType != EVENT_END) {
5634 PointerEvent.updatePointer(eventType, ev);
5635 } // we are in a touch/down state, so allowed detection of gestures
5636
5637
5638 if (self.shouldDetect) {
5639 triggerType = self.doDetect.call(self, ev, eventType, element, handler);
5640 } // ...and we are done with the detection
5641 // so reset everything to start each detection totally fresh
5642
5643
5644 if (triggerType == EVENT_END) {
5645 self.preventMouseEvents = false;
5646 self.shouldDetect = false;
5647 PointerEvent.reset(); // update the pointerevent object after the detection
5648 }
5649
5650 if (isPointer && eventType == EVENT_END) {
5651 PointerEvent.updatePointer(eventType, ev);
5652 }
5653 };
5654
5655 this.on(element, EVENT_TYPES[eventType], onTouchHandler, opt);
5656 return onTouchHandler;
5657 },
5658
5659 /**
5660 * the core detection method
5661 * this finds out what GestureDetector-touch-events to trigger
5662 * @param {Object} ev
5663 * @param {String} eventType matches `EVENT_START|MOVE|END`
5664 * @param {HTMLElement} element
5665 * @param {Function} handler
5666 * @return {String} triggerType matches `EVENT_START|MOVE|END`
5667 */
5668 doDetect: function doDetect(ev, eventType, element, handler) {
5669 var touchList = this.getTouchList(ev, eventType);
5670 var touchListLength = touchList.length;
5671 var triggerType = eventType;
5672 var triggerChange = touchList.trigger; // used by fakeMultitouch plugin
5673
5674 var changedLength = touchListLength; // at each touchstart-like event we want also want to trigger a TOUCH event...
5675
5676 if (eventType == EVENT_START) {
5677 triggerChange = EVENT_TOUCH; // ...the same for a touchend-like event
5678 } else if (eventType == EVENT_END) {
5679 triggerChange = EVENT_RELEASE; // keep track of how many touches have been removed
5680
5681 changedLength = touchList.length - (ev.changedTouches ? ev.changedTouches.length : 1);
5682 } // after there are still touches on the screen,
5683 // we just want to trigger a MOVE event. so change the START or END to a MOVE
5684 // but only after detection has been started, the first time we actually want a START
5685
5686
5687 if (changedLength > 0 && this.started) {
5688 triggerType = EVENT_MOVE;
5689 } // detection has been started, we keep track of this, see above
5690
5691
5692 this.started = true; // generate some event data, some basic information
5693
5694 var evData = this.collectEventData(element, triggerType, touchList, ev); // trigger the triggerType event before the change (TOUCH, RELEASE) events
5695 // but the END event should be at last
5696
5697 if (eventType != EVENT_END) {
5698 handler.call(Detection, evData);
5699 } // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed
5700
5701
5702 if (triggerChange) {
5703 evData.changedLength = changedLength;
5704 evData.eventType = triggerChange;
5705 handler.call(Detection, evData);
5706 evData.eventType = triggerType;
5707 delete evData.changedLength;
5708 } // trigger the END event
5709
5710
5711 if (triggerType == EVENT_END) {
5712 handler.call(Detection, evData); // ...and we are done with the detection
5713 // so reset everything to start each detection totally fresh
5714
5715 this.started = false;
5716 }
5717
5718 return triggerType;
5719 },
5720
5721 /**
5722 * we have different events for each device/browser
5723 * determine what we need and set them in the EVENT_TYPES constant
5724 * the `onTouch` method is bind to these properties.
5725 * @return {Object} events
5726 */
5727 determineEventTypes: function determineEventTypes() {
5728 var types;
5729
5730 if (GestureDetector.HAS_POINTEREVENTS) {
5731 if (window.PointerEvent) {
5732 types = ['pointerdown', 'pointermove', 'pointerup pointercancel lostpointercapture'];
5733 } else {
5734 types = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp MSPointerCancel MSLostPointerCapture'];
5735 }
5736 } else if (GestureDetector.NO_MOUSEEVENTS) {
5737 types = ['touchstart', 'touchmove', 'touchend touchcancel'];
5738 } else {
5739 types = ['touchstart mousedown', 'touchmove mousemove', 'touchend touchcancel mouseup'];
5740 }
5741
5742 EVENT_TYPES[EVENT_START] = types[0];
5743 EVENT_TYPES[EVENT_MOVE] = types[1];
5744 EVENT_TYPES[EVENT_END] = types[2];
5745 return EVENT_TYPES;
5746 },
5747
5748 /**
5749 * create touchList depending on the event
5750 * @param {Object} ev
5751 * @param {String} eventType
5752 * @return {Array} touches
5753 */
5754 getTouchList: function getTouchList(ev, eventType) {
5755 // get the fake pointerEvent touchlist
5756 if (GestureDetector.HAS_POINTEREVENTS) {
5757 return PointerEvent.getTouchList();
5758 } // get the touchlist
5759
5760
5761 if (ev.touches) {
5762 if (eventType == EVENT_MOVE) {
5763 return ev.touches;
5764 }
5765
5766 var identifiers = [];
5767 var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches));
5768 var touchList = [];
5769 Utils.each(concat, function (touch) {
5770 if (Utils.inArray(identifiers, touch.identifier) === -1) {
5771 touchList.push(touch);
5772 }
5773
5774 identifiers.push(touch.identifier);
5775 });
5776 return touchList;
5777 } // make fake touchList from mouse position
5778
5779
5780 ev.identifier = 1;
5781 return [ev];
5782 },
5783
5784 /**
5785 * collect basic event data
5786 * @param {HTMLElement} element
5787 * @param {String} eventType matches `EVENT_START|MOVE|END`
5788 * @param {Array} touches
5789 * @param {Object} ev
5790 * @return {Object} ev
5791 */
5792 collectEventData: function collectEventData(element, eventType, touches, ev) {
5793 // find out pointerType
5794 var pointerType = POINTER_TOUCH;
5795
5796 if (Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) {
5797 pointerType = POINTER_MOUSE;
5798 } else if (PointerEvent.matchType(POINTER_PEN, ev)) {
5799 pointerType = POINTER_PEN;
5800 }
5801
5802 return {
5803 center: Utils.getCenter(touches),
5804 timeStamp: Date.now(),
5805 target: ev.target,
5806 touches: touches,
5807 eventType: eventType,
5808 pointerType: pointerType,
5809 srcEvent: ev,
5810
5811 /**
5812 * prevent the browser default actions
5813 * mostly used to disable scrolling of the browser
5814 */
5815 preventDefault: function preventDefault() {
5816 var srcEvent = this.srcEvent;
5817 srcEvent.preventManipulation && srcEvent.preventManipulation();
5818 srcEvent.preventDefault && srcEvent.preventDefault();
5819 },
5820
5821 /**
5822 * stop bubbling the event up to its parents
5823 */
5824 stopPropagation: function stopPropagation() {
5825 this.srcEvent.stopPropagation();
5826 },
5827
5828 /**
5829 * immediately stop gesture detection
5830 * might be useful after a swipe was detected
5831 * @return {*}
5832 */
5833 stopDetect: function stopDetect() {
5834 return Detection.stopDetect();
5835 }
5836 };
5837 }
5838 };
5839 /**
5840 * @module GestureDetector
5841 *
5842 * @class PointerEvent
5843 * @static
5844 */
5845
5846 PointerEvent = GestureDetector.PointerEvent = {
5847 /**
5848 * holds all pointers, by `identifier`
5849 * @property pointers
5850 * @type {Object}
5851 */
5852 pointers: {},
5853
5854 /**
5855 * get the pointers as an array
5856 * @return {Array} touchlist
5857 */
5858 getTouchList: function getTouchList() {
5859 var touchlist = []; // we can use forEach since pointerEvents only is in IE10
5860
5861 Utils.each(this.pointers, function (pointer) {
5862 touchlist.push(pointer);
5863 });
5864 return touchlist;
5865 },
5866
5867 /**
5868 * update the position of a pointer
5869 * @param {String} eventType matches `EVENT_START|MOVE|END`
5870 * @param {Object} pointerEvent
5871 */
5872 updatePointer: function updatePointer(eventType, pointerEvent) {
5873 if (eventType == EVENT_END || eventType != EVENT_END && pointerEvent.buttons !== 1) {
5874 delete this.pointers[pointerEvent.pointerId];
5875 } else {
5876 pointerEvent.identifier = pointerEvent.pointerId;
5877 this.pointers[pointerEvent.pointerId] = pointerEvent;
5878 }
5879 },
5880
5881 /**
5882 * check if ev matches pointertype
5883 * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN`
5884 * @param {PointerEvent} ev
5885 */
5886 matchType: function matchType(pointerType, ev) {
5887 if (!ev.pointerType) {
5888 return false;
5889 }
5890
5891 var pt = ev.pointerType,
5892 types = {};
5893 types[POINTER_MOUSE] = pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE);
5894 types[POINTER_TOUCH] = pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH);
5895 types[POINTER_PEN] = pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN);
5896 return types[pointerType];
5897 },
5898
5899 /**
5900 * reset the stored pointers
5901 */
5902 reset: function resetList() {
5903 this.pointers = {};
5904 }
5905 };
5906 /**
5907 * @module GestureDetector
5908 *
5909 * @class Detection
5910 * @static
5911 */
5912
5913 Detection = GestureDetector.detection = {
5914 // contains all registered GestureDetector.gestures in the correct order
5915 gestures: [],
5916 // data of the current GestureDetector.gesture detection session
5917 current: null,
5918 // the previous GestureDetector.gesture session data
5919 // is a full clone of the previous gesture.current object
5920 previous: null,
5921 // when this becomes true, no gestures are fired
5922 stopped: false,
5923
5924 /**
5925 * start GestureDetector.gesture detection
5926 * @param {GestureDetector.Instance} inst
5927 * @param {Object} eventData
5928 */
5929 startDetect: function startDetect(inst, eventData) {
5930 // already busy with a GestureDetector.gesture detection on an element
5931 if (this.current) {
5932 return;
5933 }
5934
5935 this.stopped = false; // holds current session
5936
5937 this.current = {
5938 inst: inst,
5939 // reference to GestureDetectorInstance we're working for
5940 startEvent: Utils.extend({}, eventData),
5941 // start eventData for distances, timing etc
5942 lastEvent: false,
5943 // last eventData
5944 lastCalcEvent: false,
5945 // last eventData for calculations.
5946 futureCalcEvent: false,
5947 // last eventData for calculations.
5948 lastCalcData: {},
5949 // last lastCalcData
5950 name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc
5951
5952 };
5953 this.detect(eventData);
5954 },
5955
5956 /**
5957 * GestureDetector.gesture detection
5958 * @param {Object} eventData
5959 * @return {any}
5960 */
5961 detect: function detect(eventData) {
5962 if (!this.current || this.stopped) {
5963 return;
5964 } // extend event data with calculations about scale, distance etc
5965
5966
5967 eventData = this.extendEventData(eventData); // GestureDetector instance and instance options
5968
5969 var inst = this.current.inst,
5970 instOptions = inst.options; // call GestureDetector.gesture handlers
5971
5972 Utils.each(this.gestures, function triggerGesture(gesture) {
5973 // only when the instance options have enabled this gesture
5974 if (!this.stopped && inst.enabled && instOptions[gesture.name]) {
5975 gesture.handler.call(gesture, eventData, inst);
5976 }
5977 }, this); // store as previous event event
5978
5979 if (this.current) {
5980 this.current.lastEvent = eventData;
5981 }
5982
5983 if (eventData.eventType == EVENT_END) {
5984 this.stopDetect();
5985 }
5986
5987 return eventData; // eslint-disable-line consistent-return
5988 },
5989
5990 /**
5991 * clear the GestureDetector.gesture vars
5992 * this is called on endDetect, but can also be used when a final GestureDetector.gesture has been detected
5993 * to stop other GestureDetector.gestures from being fired
5994 */
5995 stopDetect: function stopDetect() {
5996 // clone current data to the store as the previous gesture
5997 // used for the double tap gesture, since this is an other gesture detect session
5998 this.previous = Utils.extend({}, this.current); // reset the current
5999
6000 this.current = null;
6001 this.stopped = true;
6002 },
6003
6004 /**
6005 * calculate velocity, angle and direction
6006 * @param {Object} ev
6007 * @param {Object} center
6008 * @param {Number} deltaTime
6009 * @param {Number} deltaX
6010 * @param {Number} deltaY
6011 */
6012 getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) {
6013 var cur = this.current,
6014 recalc = false,
6015 calcEv = cur.lastCalcEvent,
6016 calcData = cur.lastCalcData;
6017
6018 if (calcEv && ev.timeStamp - calcEv.timeStamp > GestureDetector.CALCULATE_INTERVAL) {
6019 center = calcEv.center;
6020 deltaTime = ev.timeStamp - calcEv.timeStamp;
6021 deltaX = ev.center.clientX - calcEv.center.clientX;
6022 deltaY = ev.center.clientY - calcEv.center.clientY;
6023 recalc = true;
6024 }
6025
6026 if (ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) {
6027 cur.futureCalcEvent = ev;
6028 }
6029
6030 if (!cur.lastCalcEvent || recalc) {
6031 calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY);
6032 calcData.angle = Utils.getAngle(center, ev.center);
6033 calcData.direction = Utils.getDirection(center, ev.center);
6034 cur.lastCalcEvent = cur.futureCalcEvent || ev;
6035 cur.futureCalcEvent = ev;
6036 }
6037
6038 ev.velocityX = calcData.velocity.x;
6039 ev.velocityY = calcData.velocity.y;
6040 ev.interimAngle = calcData.angle;
6041 ev.interimDirection = calcData.direction;
6042 },
6043
6044 /**
6045 * extend eventData for GestureDetector.gestures
6046 * @param {Object} ev
6047 * @return {Object} ev
6048 */
6049 extendEventData: function extendEventData(ev) {
6050 var cur = this.current,
6051 startEv = cur.startEvent,
6052 lastEv = cur.lastEvent || startEv; // update the start touchlist to calculate the scale/rotation
6053
6054 if (ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) {
6055 startEv.touches = [];
6056 Utils.each(ev.touches, function (touch) {
6057 startEv.touches.push({
6058 clientX: touch.clientX,
6059 clientY: touch.clientY
6060 });
6061 });
6062 }
6063
6064 var deltaTime = ev.timeStamp - startEv.timeStamp,
6065 deltaX = ev.center.clientX - startEv.center.clientX,
6066 deltaY = ev.center.clientY - startEv.center.clientY;
6067 this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY);
6068 Utils.extend(ev, {
6069 startEvent: startEv,
6070 deltaTime: deltaTime,
6071 deltaX: deltaX,
6072 deltaY: deltaY,
6073 distance: Utils.getDistance(startEv.center, ev.center),
6074 angle: Utils.getAngle(startEv.center, ev.center),
6075 direction: Utils.getDirection(startEv.center, ev.center),
6076 scale: Utils.getScale(startEv.touches, ev.touches),
6077 rotation: Utils.getRotation(startEv.touches, ev.touches)
6078 });
6079 return ev;
6080 },
6081
6082 /**
6083 * register new gesture
6084 * @param {Object} gesture object, see `gestures/` for documentation
6085 * @return {Array} gestures
6086 */
6087 register: function register(gesture) {
6088 // add an enable gesture options if there is no given
6089 var options = gesture.defaults || {};
6090
6091 if (options[gesture.name] === undefined) {
6092 options[gesture.name] = true;
6093 } // extend GestureDetector default options with the GestureDetector.gesture options
6094
6095
6096 Utils.extend(GestureDetector.defaults, options, true); // set its index
6097
6098 gesture.index = gesture.index || 1000; // add GestureDetector.gesture to the list
6099
6100 this.gestures.push(gesture); // sort the list by index
6101
6102 this.gestures.sort(function (a, b) {
6103 if (a.index < b.index) {
6104 return -1;
6105 }
6106
6107 if (a.index > b.index) {
6108 return 1;
6109 }
6110
6111 return 0;
6112 });
6113 return this.gestures;
6114 }
6115 };
6116 /**
6117 * @module GestureDetector
6118 */
6119
6120 /**
6121 * create new GestureDetector instance
6122 * all methods should return the instance itself, so it is chainable.
6123 *
6124 * @class Instance
6125 * @constructor
6126 * @param {HTMLElement} element
6127 * @param {Object} [options={}] options are merged with `GestureDetector.defaults`
6128 * @return {GestureDetector.Instance}
6129 */
6130
6131 GestureDetector.Instance = function (element, options) {
6132 var self = this;
6133 var listenerOptions = options && options.passive ? {
6134 passive: true
6135 } : undefined; // setup GestureDetectorJS window events and register all gestures
6136 // this also sets up the default options
6137
6138 setup(listenerOptions);
6139 /**
6140 * @property element
6141 * @type {HTMLElement}
6142 */
6143
6144 this.element = element;
6145 /**
6146 * @property enabled
6147 * @type {Boolean}
6148 * @protected
6149 */
6150
6151 this.enabled = true;
6152 /**
6153 * options, merged with the defaults
6154 * options with an _ are converted to camelCase
6155 * @property options
6156 * @type {Object}
6157 */
6158
6159 Utils.each(options, function (value, name) {
6160 delete options[name];
6161 options[Utils.toCamelCase(name)] = value;
6162 });
6163 this.options = Utils.extend(Utils.extend({}, GestureDetector.defaults), options || {});
6164 this.options.listenerOptions = listenerOptions; // add some css to the element to prevent the browser from doing its native behavior
6165
6166 if (this.options.behavior) {
6167 Utils.toggleBehavior(this.element, this.options.behavior, true);
6168 }
6169 /**
6170 * event start handler on the element to start the detection
6171 * @property eventStartHandler
6172 * @type {Object}
6173 */
6174
6175
6176 this.eventStartHandler = Event$1.onTouch(element, EVENT_START, function (ev) {
6177 if (self.enabled && ev.eventType == EVENT_START) {
6178 Detection.startDetect(self, ev);
6179 } else if (ev.eventType == EVENT_TOUCH) {
6180 Detection.detect(ev);
6181 }
6182 }, listenerOptions);
6183 /**
6184 * keep a list of user event handlers which needs to be removed when calling 'dispose'
6185 * @property eventHandlers
6186 * @type {Array}
6187 */
6188
6189 this.eventHandlers = [];
6190 };
6191
6192 GestureDetector.Instance.prototype = {
6193 /**
6194 * @method on
6195 * @signature on(gestures, handler)
6196 * @description
6197 * [en]Adds an event handler for a gesture. Available gestures are: drag, dragleft, dragright, dragup, dragdown, hold, release, swipe, swipeleft, swiperight, swipeup, swipedown, tap, doubletap, touch, transform, pinch, pinchin, pinchout and rotate. [/en]
6198 * [ja]ジェスチャに対するイベントハンドラを追加します。指定できるジェスチャ名は、drag dragleft dragright dragup dragdown hold release swipe swipeleft swiperight swipeup swipedown tap doubletap touch transform pinch pinchin pinchout rotate です。[/ja]
6199 * @param {String} gestures
6200 * [en]A space separated list of gestures.[/en]
6201 * [ja]検知するジェスチャ名を指定します。スペースで複数指定することができます。[/ja]
6202 * @param {Function} handler
6203 * [en]An event handling function.[/en]
6204 * [ja]イベントハンドラとなる関数オブジェクトを指定します。[/ja]
6205 */
6206 on: function onEvent(gestures, handler, opt) {
6207 var self = this;
6208 Event$1.on(self.element, gestures, handler, util$4.extend({}, self.options.listenerOptions, opt), function (type) {
6209 self.eventHandlers.push({
6210 gesture: type,
6211 handler: handler
6212 });
6213 });
6214 return self;
6215 },
6216
6217 /**
6218 * @method off
6219 * @signature off(gestures, handler)
6220 * @description
6221 * [en]Remove an event listener.[/en]
6222 * [ja]イベントリスナーを削除します。[/ja]
6223 * @param {String} gestures
6224 * [en]A space separated list of gestures.[/en]
6225 * [ja]ジェスチャ名を指定します。スペースで複数指定することができます。[/ja]
6226 * @param {Function} handler
6227 * [en]An event handling function.[/en]
6228 * [ja]イベントハンドラとなる関数オブジェクトを指定します。[/ja]
6229 */
6230 off: function offEvent(gestures, handler, opt) {
6231 var self = this;
6232 Event$1.off(self.element, gestures, handler, util$4.extend({}, self.options.listenerOptions, opt), function (type) {
6233 var index = Utils.inArray(self.eventHandlers, {
6234 gesture: type,
6235 handler: handler
6236 }, true);
6237
6238 if (index >= 0) {
6239 self.eventHandlers.splice(index, 1);
6240 }
6241 });
6242 return self;
6243 },
6244
6245 /**
6246 * trigger gesture event
6247 * @method trigger
6248 * @signature trigger(gesture, eventData)
6249 * @param {String} gesture
6250 * @param {Object} [eventData]
6251 */
6252 trigger: function triggerEvent(gesture, eventData) {
6253 // optional
6254 if (!eventData) {
6255 eventData = {};
6256 } // create DOM event
6257
6258
6259 var event = GestureDetector.DOCUMENT.createEvent('Event');
6260 event.initEvent(gesture, true, true);
6261 event.gesture = eventData; // trigger on the target if it is in the instance element,
6262 // this is for event delegation tricks
6263
6264 var element = this.element;
6265
6266 if (Utils.hasParent(eventData.target, element)) {
6267 element = eventData.target;
6268 }
6269
6270 element.dispatchEvent(event);
6271 return this;
6272 },
6273
6274 /**
6275 * @method enable
6276 * @signature enable(state)
6277 * @description
6278 * [en]Enable or disable gesture detection.[/en]
6279 * [ja]ジェスチャ検知を有効化/無効化します。[/ja]
6280 * @param {Boolean} state
6281 * [en]Specify if it should be enabled or not.[/en]
6282 * [ja]有効にするかどうかを指定します。[/ja]
6283 */
6284 enable: function enable(state) {
6285 this.enabled = state;
6286 return this;
6287 },
6288
6289 /**
6290 * @method dispose
6291 * @signature dispose()
6292 * @description
6293 * [en]Remove and destroy all event handlers for this instance.[/en]
6294 * [ja]このインスタンスでのジェスチャの検知や、イベントハンドラを全て解除して廃棄します。[/ja]
6295 */
6296 dispose: function dispose() {
6297 var i, eh; // undo all changes made by stop_browser_behavior
6298
6299 Utils.toggleBehavior(this.element, this.options.behavior, false); // unbind all custom event handlers
6300
6301 for (i = -1; eh = this.eventHandlers[++i];) {
6302 // eslint-disable-line no-cond-assign
6303 Utils.off(this.element, eh.gesture, eh.handler);
6304 }
6305
6306 this.eventHandlers = []; // unbind the start event listener
6307
6308 Event$1.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler);
6309 return null;
6310 }
6311 };
6312 /**
6313 * @module gestures
6314 */
6315
6316 /**
6317 * Move with x fingers (default 1) around on the page.
6318 * Preventing the default browser behavior is a good way to improve feel and working.
6319 * ````
6320 * GestureDetectortime.on("drag", function(ev) {
6321 * console.log(ev);
6322 * ev.gesture.preventDefault();
6323 * });
6324 * ````
6325 *
6326 * @class Drag
6327 * @static
6328 */
6329
6330 /**
6331 * @event drag
6332 * @param {Object} ev
6333 */
6334
6335 /**
6336 * @event dragstart
6337 * @param {Object} ev
6338 */
6339
6340 /**
6341 * @event dragend
6342 * @param {Object} ev
6343 */
6344
6345 /**
6346 * @event drapleft
6347 * @param {Object} ev
6348 */
6349
6350 /**
6351 * @event dragright
6352 * @param {Object} ev
6353 */
6354
6355 /**
6356 * @event dragup
6357 * @param {Object} ev
6358 */
6359
6360 /**
6361 * @event dragdown
6362 * @param {Object} ev
6363 */
6364
6365 /**
6366 * @param {String} name
6367 */
6368
6369 (function (name) {
6370 var triggered = false;
6371
6372 function dragGesture(ev, inst) {
6373 var cur = Detection.current; // max touches
6374
6375 if (inst.options.dragMaxTouches > 0 && ev.touches.length > inst.options.dragMaxTouches) {
6376 return;
6377 }
6378
6379 switch (ev.eventType) {
6380 case EVENT_START:
6381 triggered = false;
6382 break;
6383
6384 case EVENT_MOVE:
6385 // when the distance we moved is too small we skip this gesture
6386 // or we can be already in dragging
6387 if (ev.distance < inst.options.dragMinDistance && cur.name != name) {
6388 return;
6389 }
6390
6391 var startCenter = cur.startEvent.center; // we are dragging!
6392
6393 if (cur.name != name) {
6394 cur.name = name;
6395
6396 if (inst.options.dragDistanceCorrection && ev.distance > 0) {
6397 // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center.
6398 // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0.
6399 // It might be useful to save the original start point somewhere
6400 var factor = Math.abs(inst.options.dragMinDistance / ev.distance);
6401 startCenter.pageX += ev.deltaX * factor;
6402 startCenter.pageY += ev.deltaY * factor;
6403 startCenter.clientX += ev.deltaX * factor;
6404 startCenter.clientY += ev.deltaY * factor; // recalculate event data using new start point
6405
6406 ev = Detection.extendEventData(ev);
6407 }
6408 } // lock drag to axis?
6409
6410
6411 if (cur.lastEvent.dragLockToAxis || inst.options.dragLockToAxis && inst.options.dragLockMinDistance <= ev.distance) {
6412 ev.dragLockToAxis = true;
6413 } // keep direction on the axis that the drag gesture started on
6414
6415
6416 var lastDirection = cur.lastEvent.direction;
6417
6418 if (ev.dragLockToAxis && lastDirection !== ev.direction) {
6419 if (Utils.isVertical(lastDirection)) {
6420 ev.direction = ev.deltaY < 0 ? DIRECTION_UP : DIRECTION_DOWN;
6421 } else {
6422 ev.direction = ev.deltaX < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
6423 }
6424 } // first time, trigger dragstart event
6425
6426
6427 if (!triggered) {
6428 inst.trigger(name + 'start', ev);
6429 triggered = true;
6430 } // trigger events
6431
6432
6433 inst.trigger(name, ev);
6434 inst.trigger(name + ev.direction, ev);
6435 var isVertical = Utils.isVertical(ev.direction); // block the browser events
6436
6437 if (inst.options.dragBlockVertical && isVertical || inst.options.dragBlockHorizontal && !isVertical) {
6438 ev.preventDefault();
6439 }
6440
6441 break;
6442
6443 case EVENT_RELEASE:
6444 if (triggered && ev.changedLength <= inst.options.dragMaxTouches) {
6445 inst.trigger(name + 'end', ev);
6446 triggered = false;
6447 }
6448
6449 break;
6450
6451 case EVENT_END:
6452 triggered = false;
6453 break;
6454 }
6455 }
6456
6457 GestureDetector.gestures.Drag = {
6458 name: name,
6459 index: 50,
6460 handler: dragGesture,
6461 defaults: {
6462 /**
6463 * minimal movement that have to be made before the drag event gets triggered
6464 * @property dragMinDistance
6465 * @type {Number}
6466 * @default 10
6467 */
6468 dragMinDistance: 10,
6469
6470 /**
6471 * Set dragDistanceCorrection to true to make the starting point of the drag
6472 * be calculated from where the drag was triggered, not from where the touch started.
6473 * Useful to avoid a jerk-starting drag, which can make fine-adjustments
6474 * through dragging difficult, and be visually unappealing.
6475 * @property dragDistanceCorrection
6476 * @type {Boolean}
6477 * @default true
6478 */
6479 dragDistanceCorrection: true,
6480
6481 /**
6482 * set 0 for unlimited, but this can conflict with transform
6483 * @property dragMaxTouches
6484 * @type {Number}
6485 * @default 1
6486 */
6487 dragMaxTouches: 1,
6488
6489 /**
6490 * prevent default browser behavior when dragging occurs
6491 * be careful with it, it makes the element a blocking element
6492 * when you are using the drag gesture, it is a good practice to set this true
6493 * @property dragBlockHorizontal
6494 * @type {Boolean}
6495 * @default false
6496 */
6497 dragBlockHorizontal: false,
6498
6499 /**
6500 * same as `dragBlockHorizontal`, but for vertical movement
6501 * @property dragBlockVertical
6502 * @type {Boolean}
6503 * @default false
6504 */
6505 dragBlockVertical: false,
6506
6507 /**
6508 * dragLockToAxis keeps the drag gesture on the axis that it started on,
6509 * It disallows vertical directions if the initial direction was horizontal, and vice versa.
6510 * @property dragLockToAxis
6511 * @type {Boolean}
6512 * @default false
6513 */
6514 dragLockToAxis: false,
6515
6516 /**
6517 * drag lock only kicks in when distance > dragLockMinDistance
6518 * This way, locking occurs only when the distance has become large enough to reliably determine the direction
6519 * @property dragLockMinDistance
6520 * @type {Number}
6521 * @default 25
6522 */
6523 dragLockMinDistance: 25
6524 }
6525 };
6526 })('drag');
6527 /**
6528 * @module gestures
6529 */
6530
6531 /**
6532 * trigger a simple gesture event, so you can do anything in your handler.
6533 * only usable if you know what your doing...
6534 *
6535 * @class Gesture
6536 * @static
6537 */
6538
6539 /**
6540 * @event gesture
6541 * @param {Object} ev
6542 */
6543
6544
6545 GestureDetector.gestures.Gesture = {
6546 name: 'gesture',
6547 index: 1337,
6548 handler: function releaseGesture(ev, inst) {
6549 inst.trigger(this.name, ev);
6550 }
6551 };
6552 /**
6553 * @module gestures
6554 */
6555
6556 /**
6557 * Touch stays at the same place for x time
6558 *
6559 * @class Hold
6560 * @static
6561 */
6562
6563 /**
6564 * @event hold
6565 * @param {Object} ev
6566 */
6567
6568 /**
6569 * @param {String} name
6570 */
6571
6572 (function (name) {
6573 var timer;
6574
6575 function holdGesture(ev, inst) {
6576 var options = inst.options,
6577 current = Detection.current;
6578
6579 switch (ev.eventType) {
6580 case EVENT_START:
6581 clearTimeout(timer); // set the gesture so we can check in the timeout if it still is
6582
6583 current.name = name; // set timer and if after the timeout it still is hold,
6584 // we trigger the hold event
6585
6586 timer = setTimeout(function () {
6587 if (current && current.name == name) {
6588 inst.trigger(name, ev);
6589 }
6590 }, options.holdTimeout);
6591 break;
6592
6593 case EVENT_MOVE:
6594 if (ev.distance > options.holdThreshold) {
6595 clearTimeout(timer);
6596 }
6597
6598 break;
6599
6600 case EVENT_RELEASE:
6601 clearTimeout(timer);
6602 break;
6603 }
6604 }
6605
6606 GestureDetector.gestures.Hold = {
6607 name: name,
6608 index: 10,
6609 defaults: {
6610 /**
6611 * @property holdTimeout
6612 * @type {Number}
6613 * @default 500
6614 */
6615 holdTimeout: 500,
6616
6617 /**
6618 * movement allowed while holding
6619 * @property holdThreshold
6620 * @type {Number}
6621 * @default 2
6622 */
6623 holdThreshold: 2
6624 },
6625 handler: holdGesture
6626 };
6627 })('hold');
6628 /**
6629 * @module gestures
6630 */
6631
6632 /**
6633 * when a touch is being released from the page
6634 *
6635 * @class Release
6636 * @static
6637 */
6638
6639 /**
6640 * @event release
6641 * @param {Object} ev
6642 */
6643
6644
6645 GestureDetector.gestures.Release = {
6646 name: 'release',
6647 index: Infinity,
6648 handler: function releaseGesture(ev, inst) {
6649 if (ev.eventType == EVENT_RELEASE) {
6650 inst.trigger(this.name, ev);
6651 }
6652 }
6653 };
6654 /**
6655 * @module gestures
6656 */
6657
6658 /**
6659 * triggers swipe events when the end velocity is above the threshold
6660 * for best usage, set `preventDefault` (on the drag gesture) to `true`
6661 * ````
6662 * GestureDetectortime.on("dragleft swipeleft", function(ev) {
6663 * console.log(ev);
6664 * ev.gesture.preventDefault();
6665 * });
6666 * ````
6667 *
6668 * @class Swipe
6669 * @static
6670 */
6671
6672 /**
6673 * @event swipe
6674 * @param {Object} ev
6675 */
6676
6677 /**
6678 * @event swipeleft
6679 * @param {Object} ev
6680 */
6681
6682 /**
6683 * @event swiperight
6684 * @param {Object} ev
6685 */
6686
6687 /**
6688 * @event swipeup
6689 * @param {Object} ev
6690 */
6691
6692 /**
6693 * @event swipedown
6694 * @param {Object} ev
6695 */
6696
6697 GestureDetector.gestures.Swipe = {
6698 name: 'swipe',
6699 index: 40,
6700 defaults: {
6701 /**
6702 * @property swipeMinTouches
6703 * @type {Number}
6704 * @default 1
6705 */
6706 swipeMinTouches: 1,
6707
6708 /**
6709 * @property swipeMaxTouches
6710 * @type {Number}
6711 * @default 1
6712 */
6713 swipeMaxTouches: 1,
6714
6715 /**
6716 * horizontal swipe velocity
6717 * @property swipeVelocityX
6718 * @type {Number}
6719 * @default 0.6
6720 */
6721 swipeVelocityX: 0.6,
6722
6723 /**
6724 * vertical swipe velocity
6725 * @property swipeVelocityY
6726 * @type {Number}
6727 * @default 0.6
6728 */
6729 swipeVelocityY: 0.6
6730 },
6731 handler: function swipeGesture(ev, inst) {
6732 if (ev.eventType == EVENT_RELEASE) {
6733 var touches = ev.touches.length,
6734 options = inst.options; // max touches
6735
6736 if (touches < options.swipeMinTouches || touches > options.swipeMaxTouches) {
6737 return;
6738 } // when the distance we moved is too small we skip this gesture
6739 // or we can be already in dragging
6740
6741
6742 if (ev.velocityX > options.swipeVelocityX || ev.velocityY > options.swipeVelocityY) {
6743 // trigger swipe events
6744 inst.trigger(this.name, ev);
6745 inst.trigger(this.name + ev.direction, ev);
6746 }
6747 }
6748 }
6749 };
6750 /**
6751 * @module gestures
6752 */
6753
6754 /**
6755 * Single tap and a double tap on a place
6756 *
6757 * @class Tap
6758 * @static
6759 */
6760
6761 /**
6762 * @event tap
6763 * @param {Object} ev
6764 */
6765
6766 /**
6767 * @event doubletap
6768 * @param {Object} ev
6769 */
6770
6771 /**
6772 * @param {String} name
6773 */
6774
6775 (function (name) {
6776 var hasMoved = false;
6777
6778 function tapGesture(ev, inst) {
6779 var options = inst.options,
6780 current = Detection.current,
6781 prev = Detection.previous,
6782 sincePrev,
6783 didDoubleTap;
6784
6785 switch (ev.eventType) {
6786 case EVENT_START:
6787 hasMoved = false;
6788 break;
6789
6790 case EVENT_MOVE:
6791 hasMoved = hasMoved || ev.distance > options.tapMaxDistance;
6792 break;
6793
6794 case EVENT_END:
6795 if (!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) {
6796 // previous gesture, for the double tap since these are two different gesture detections
6797 sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp;
6798 didDoubleTap = false; // check if double tap
6799
6800 if (prev && prev.name == name && sincePrev && sincePrev < options.doubleTapInterval && ev.distance < options.doubleTapDistance) {
6801 inst.trigger('doubletap', ev);
6802 didDoubleTap = true;
6803 } // do a single tap
6804
6805
6806 if (!didDoubleTap || options.tapAlways) {
6807 current.name = name;
6808 inst.trigger(current.name, ev);
6809 }
6810 }
6811
6812 break;
6813 }
6814 }
6815
6816 GestureDetector.gestures.Tap = {
6817 name: name,
6818 index: 100,
6819 handler: tapGesture,
6820 defaults: {
6821 /**
6822 * max time of a tap, this is for the slow tappers
6823 * @property tapMaxTime
6824 * @type {Number}
6825 * @default 250
6826 */
6827 tapMaxTime: 250,
6828
6829 /**
6830 * max distance of movement of a tap, this is for the slow tappers
6831 * @property tapMaxDistance
6832 * @type {Number}
6833 * @default 10
6834 */
6835 tapMaxDistance: 10,
6836
6837 /**
6838 * always trigger the `tap` event, even while double-tapping
6839 * @property tapAlways
6840 * @type {Boolean}
6841 * @default true
6842 */
6843 tapAlways: true,
6844
6845 /**
6846 * max distance between two taps
6847 * @property doubleTapDistance
6848 * @type {Number}
6849 * @default 20
6850 */
6851 doubleTapDistance: 20,
6852
6853 /**
6854 * max time between two taps
6855 * @property doubleTapInterval
6856 * @type {Number}
6857 * @default 300
6858 */
6859 doubleTapInterval: 300
6860 }
6861 };
6862 })('tap');
6863 /**
6864 * @module gestures
6865 */
6866
6867 /**
6868 * when a touch is being touched at the page
6869 *
6870 * @class Touch
6871 * @static
6872 */
6873
6874 /**
6875 * @event touch
6876 * @param {Object} ev
6877 */
6878
6879
6880 GestureDetector.gestures.Touch = {
6881 name: 'touch',
6882 index: -Infinity,
6883 defaults: {
6884 /**
6885 * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page,
6886 * but it improves gestures like transforming and dragging.
6887 * be careful with using this, it can be very annoying for users to be stuck on the page
6888 * @property preventDefault
6889 * @type {Boolean}
6890 * @default false
6891 */
6892 preventDefault: false,
6893
6894 /**
6895 * disable mouse events, so only touch (or pen!) input triggers events
6896 * @property preventMouse
6897 * @type {Boolean}
6898 * @default false
6899 */
6900 preventMouse: false
6901 },
6902 handler: function touchGesture(ev, inst) {
6903 if (inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) {
6904 ev.stopDetect();
6905 return;
6906 }
6907
6908 if (inst.options.preventDefault) {
6909 ev.preventDefault();
6910 }
6911
6912 if (ev.eventType == EVENT_TOUCH) {
6913 inst.trigger('touch', ev);
6914 }
6915 }
6916 };
6917 /**
6918 * @module gestures
6919 */
6920
6921 /**
6922 * User want to scale or rotate with 2 fingers
6923 * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the
6924 * `preventDefault` option.
6925 *
6926 * @class Transform
6927 * @static
6928 */
6929
6930 /**
6931 * @event transform
6932 * @param {Object} ev
6933 */
6934
6935 /**
6936 * @event transformstart
6937 * @param {Object} ev
6938 */
6939
6940 /**
6941 * @event transformend
6942 * @param {Object} ev
6943 */
6944
6945 /**
6946 * @event pinchin
6947 * @param {Object} ev
6948 */
6949
6950 /**
6951 * @event pinchout
6952 * @param {Object} ev
6953 */
6954
6955 /**
6956 * @event rotate
6957 * @param {Object} ev
6958 */
6959
6960 /**
6961 * @param {String} name
6962 */
6963
6964 (function (name) {
6965 var triggered = false;
6966
6967 function transformGesture(ev, inst) {
6968 switch (ev.eventType) {
6969 case EVENT_START:
6970 triggered = false;
6971 break;
6972
6973 case EVENT_MOVE:
6974 // at least multitouch
6975 if (ev.touches.length < 2) {
6976 return;
6977 }
6978
6979 var scaleThreshold = Math.abs(1 - ev.scale);
6980 var rotationThreshold = Math.abs(ev.rotation); // when the distance we moved is too small we skip this gesture
6981 // or we can be already in dragging
6982
6983 if (scaleThreshold < inst.options.transformMinScale && rotationThreshold < inst.options.transformMinRotation) {
6984 return;
6985 } // we are transforming!
6986
6987
6988 Detection.current.name = name; // first time, trigger dragstart event
6989
6990 if (!triggered) {
6991 inst.trigger(name + 'start', ev);
6992 triggered = true;
6993 }
6994
6995 inst.trigger(name, ev); // basic transform event
6996 // trigger rotate event
6997
6998 if (rotationThreshold > inst.options.transformMinRotation) {
6999 inst.trigger('rotate', ev);
7000 } // trigger pinch event
7001
7002
7003 if (scaleThreshold > inst.options.transformMinScale) {
7004 inst.trigger('pinch', ev);
7005 inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev);
7006 }
7007
7008 break;
7009
7010 case EVENT_RELEASE:
7011 if (triggered && ev.changedLength < 2) {
7012 inst.trigger(name + 'end', ev);
7013 triggered = false;
7014 }
7015
7016 break;
7017 }
7018 }
7019
7020 GestureDetector.gestures.Transform = {
7021 name: name,
7022 index: 45,
7023 defaults: {
7024 /**
7025 * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1
7026 * @property transformMinScale
7027 * @type {Number}
7028 * @default 0.01
7029 */
7030 transformMinScale: 0.01,
7031
7032 /**
7033 * rotation in degrees
7034 * @property transformMinRotation
7035 * @type {Number}
7036 * @default 1
7037 */
7038 transformMinRotation: 1
7039 },
7040 handler: transformGesture
7041 };
7042 })('transform');
7043
7044 /*
7045 Copyright 2013-2015 ASIAL CORPORATION
7046
7047 Licensed under the Apache License, Version 2.0 (the "License");
7048 you may not use this file except in compliance with the License.
7049 You may obtain a copy of the License at
7050
7051 http://www.apache.org/licenses/LICENSE-2.0
7052
7053 Unless required by applicable law or agreed to in writing, software
7054 distributed under the License is distributed on an "AS IS" BASIS,
7055 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7056 See the License for the specific language governing permissions and
7057 limitations under the License.
7058
7059 */
7060 var readyMap, queueMap;
7061
7062 function isContentReady(element) {
7063 if (element.childNodes.length > 0) {
7064 setContentReady(element);
7065 }
7066
7067 return readyMap.has(element);
7068 }
7069
7070 function setContentReady(element) {
7071 readyMap.set(element, true);
7072 }
7073
7074 function addCallback(element, fn) {
7075 if (!queueMap.has(element)) {
7076 queueMap.set(element, []);
7077 }
7078
7079 queueMap.get(element).push(fn);
7080 }
7081
7082 function consumeQueue(element) {
7083 var callbacks = queueMap.get(element, []) || [];
7084 queueMap.delete(element);
7085 callbacks.forEach(function (callback) {
7086 return callback();
7087 });
7088 }
7089
7090 function contentReady(element) {
7091 var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
7092
7093 if (readyMap === undefined) {
7094 readyMap = new WeakMap();
7095 queueMap = new WeakMap();
7096 }
7097
7098 addCallback(element, fn);
7099
7100 if (isContentReady(element)) {
7101 consumeQueue(element);
7102 return;
7103 }
7104
7105 var observer = new MutationObserver(function (changes) {
7106 setContentReady(element);
7107 consumeQueue(element);
7108 });
7109 observer.observe(element, {
7110 childList: true,
7111 characterData: true
7112 }); // failback for elements has empty content.
7113
7114 setImmediate(function () {
7115 setContentReady(element);
7116 consumeQueue(element);
7117 });
7118 }
7119
7120 /*
7121 Copyright 2013-2015 ASIAL CORPORATION
7122
7123 Licensed under the Apache License, Version 2.0 (the "License");
7124 you may not use this file except in compliance with the License.
7125 You may obtain a copy of the License at
7126
7127 http://www.apache.org/licenses/LICENSE-2.0
7128
7129 Unless required by applicable law or agreed to in writing, software
7130 distributed under the License is distributed on an "AS IS" BASIS,
7131 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7132 See the License for the specific language governing permissions and
7133 limitations under the License.
7134
7135 */
7136 var ToastQueue = /*#__PURE__*/function () {
7137 function ToastQueue() {
7138 _classCallCheck(this, ToastQueue);
7139
7140 this.queue = [];
7141 }
7142
7143 _createClass(ToastQueue, [{
7144 key: "add",
7145 value: function add(fn, promise) {
7146 var _this = this;
7147
7148 this.queue.push(fn);
7149
7150 if (this.queue.length === 1) {
7151 setImmediate(this.queue[0]);
7152 }
7153
7154 promise.then(function () {
7155 _this.queue.shift();
7156
7157 if (_this.queue.length > 0) {
7158 setTimeout(_this.queue[0], 1000 / 30); // Apply some visual delay
7159 }
7160 });
7161 }
7162 }]);
7163
7164 return ToastQueue;
7165 }();
7166
7167 var ToastQueue$1 = new ToastQueue();
7168
7169 var _setAttributes = function _setAttributes(element, options) {
7170 ['id', 'class', 'animation'].forEach(function (a) {
7171 return Object.prototype.hasOwnProperty.call(options, a) && element.setAttribute(a, options[a]);
7172 });
7173
7174 if (options.modifier) {
7175 util$4.addModifier(element, options.modifier);
7176 }
7177 };
7178
7179 var _normalizeArguments = function _normalizeArguments(message) {
7180 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7181 var defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
7182 options = _objectSpread2({}, options);
7183 typeof message === 'string' ? options.message = message : options = message;
7184
7185 if (!options || !options.message && !options.messageHTML) {
7186 util$4.throw('Notifications must contain a message');
7187 }
7188
7189 if (Object.prototype.hasOwnProperty.call(options, 'buttonLabels') || Object.prototype.hasOwnProperty.call(options, 'buttonLabel')) {
7190 options.buttonLabels = options.buttonLabels || options.buttonLabel;
7191
7192 if (!Array.isArray(options.buttonLabels)) {
7193 options.buttonLabels = [options.buttonLabels || ''];
7194 }
7195 }
7196
7197 return util$4.extend({
7198 compile: function compile(param) {
7199 return param;
7200 },
7201 callback: function callback(param) {
7202 return param;
7203 },
7204 animation: 'default',
7205 cancelable: false,
7206 primaryButtonIndex: (options.buttonLabels || defaults.buttonLabels || []).length - 1
7207 }, defaults, options);
7208 };
7209 /**
7210 * @object ons.notification
7211 * @category dialog
7212 * @tutorial vanilla/Reference/notification
7213 * @description
7214 * [en]
7215 * Utility methods to create different kinds of notifications. There are three methods available:
7216 *
7217 * * `ons.notification.alert()`
7218 * * `ons.notification.confirm()`
7219 * * `ons.notification.prompt()`
7220 * * `ons.notification.toast()`
7221 *
7222 * It will automatically display a Material Design dialog on Android devices.
7223 * [/en]
7224 * [ja]いくつかの種類のアラートダイアログを作成するためのユーティリティメソッドを収めたオブジェクトです。[/ja]
7225 * @example
7226 * ons.notification.alert('Hello, world!');
7227 *
7228 * ons.notification.confirm('Are you ready?')
7229 * .then(
7230 * function(answer) {
7231 * if (answer === 1) {
7232 * ons.notification.alert('Let\'s go!');
7233 * }
7234 * }
7235 * );
7236 *
7237 * ons.notification.prompt('How old are ?')
7238 * .then(
7239 * function(age) {
7240 * ons.notification.alert('You are ' + age + ' years old.');
7241 * }
7242 * );
7243 */
7244
7245
7246 var notification = {};
7247
7248 notification._createAlertDialog = function () {
7249 for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
7250 params[_key] = arguments[_key];
7251 }
7252
7253 return new Promise(function (resolve) {
7254 var options = _normalizeArguments.apply(void 0, params);
7255
7256 util$4.checkMissingImport('AlertDialog', 'AlertDialogButton'); // Prompt input string
7257
7258 var inputString = '';
7259
7260 if (options.isPrompt) {
7261 inputString = "\n <input\n class=\"text-input text-input--underbar\"\n type=\"".concat(options.inputType || 'text', "\"\n placeholder=\"").concat(options.placeholder || '', "\"\n value=\"").concat(options.defaultValue || '', "\"\n style=\"width: 100%; margin-top: 10px;\"\n />\n ");
7262 } // Buttons string
7263
7264
7265 var buttons = '';
7266 options.buttonLabels.forEach(function (label, index) {
7267 buttons += "\n <ons-alert-dialog-button\n class=\"\n ".concat(index === options.primaryButtonIndex ? ' alert-dialog-button--primal' : '', "\n ").concat(options.buttonLabels.length <= 2 ? ' alert-dialog-button--rowfooter' : '', "\n \"\n style=\"position: relative;\">\n ").concat(label, "\n </ons-alert-dialog-button>\n ");
7268 }); // Dialog Element
7269
7270 var el = {};
7271
7272 var _destroyDialog = function _destroyDialog() {
7273 if (el.dialog.onDialogCancel) {
7274 el.dialog.removeEventListener('dialogcancel', el.dialog.onDialogCancel);
7275 }
7276
7277 Object.keys(el).forEach(function (key) {
7278 return delete el[key];
7279 });
7280 el = null;
7281
7282 if (options.destroy instanceof Function) {
7283 options.destroy();
7284 }
7285 };
7286
7287 el.dialog = document.createElement('ons-alert-dialog');
7288 el.dialog.innerHTML = "\n <div class=\"alert-dialog-mask\"\n style=\"\n ".concat(options.maskColor ? 'background-color: ' + options.maskColor : '', "\n \"></div>\n <div class=\"alert-dialog\">\n <div class=\"alert-dialog-container\">\n <div class=\"alert-dialog-title\">\n ").concat(options.title || '', "\n </div>\n <div class=\"alert-dialog-content\">\n ").concat(options.message || options.messageHTML, "\n ").concat(inputString, "\n </div>\n <div class=\"\n alert-dialog-footer\n ").concat(options.buttonLabels.length <= 2 ? ' alert-dialog-footer--rowfooter' : '', "\n \">\n ").concat(buttons, "\n </div>\n </div>\n </div>\n ");
7289 contentReady(el.dialog); // Set attributes
7290
7291 _setAttributes(el.dialog, options); // Prompt events
7292
7293
7294 if (options.isPrompt) {
7295 el.input = el.dialog.querySelector('.text-input');
7296
7297 if (options.submitOnEnter) {
7298 el.input.onkeypress = function (event) {
7299 if (event.keyCode === 13) {
7300 el.dialog.hide().then(function () {
7301 if (el) {
7302 var resolveValue = el.input.value;
7303
7304 _destroyDialog();
7305
7306 options.callback(resolveValue);
7307 resolve(resolveValue);
7308 }
7309 });
7310 }
7311 };
7312 }
7313 } // Button events
7314
7315
7316 el.footer = el.dialog.querySelector('.alert-dialog-footer');
7317 util$4.arrayFrom(el.dialog.querySelectorAll('.alert-dialog-button')).forEach(function (buttonElement, index) {
7318 buttonElement.onclick = function () {
7319 el.dialog.hide().then(function () {
7320 if (el) {
7321 var resolveValue = index;
7322
7323 if (options.isPrompt) {
7324 resolveValue = index === options.primaryButtonIndex ? el.input.value : null;
7325 }
7326
7327 el.dialog.remove();
7328
7329 _destroyDialog();
7330
7331 options.callback(resolveValue);
7332 resolve(resolveValue);
7333 }
7334 });
7335 };
7336
7337 el.footer.appendChild(buttonElement);
7338 }); // Cancel events
7339
7340 if (options.cancelable) {
7341 el.dialog.cancelable = true;
7342
7343 el.dialog.onDialogCancel = function () {
7344 setImmediate(function () {
7345 el.dialog.remove();
7346
7347 _destroyDialog();
7348 });
7349 var resolveValue = options.isPrompt ? null : -1;
7350 options.callback(resolveValue);
7351 resolve(resolveValue);
7352 };
7353
7354 el.dialog.addEventListener('dialogcancel', el.dialog.onDialogCancel, false);
7355 } // Show dialog
7356
7357
7358 document.body.appendChild(el.dialog);
7359 options.compile(el.dialog);
7360 setImmediate(function () {
7361 el.dialog.show().then(function () {
7362 if (el.input && options.isPrompt && options.autofocus) {
7363 var strLength = el.input.value.length;
7364 el.input.focus();
7365
7366 if (el.input.type && ['text', 'search', 'url', 'tel', 'password'].includes(el.input.type)) {
7367 el.input.setSelectionRange(strLength, strLength);
7368 }
7369 }
7370 });
7371 });
7372 });
7373 };
7374 /**
7375 * @method alert
7376 * @signature alert(message [, options] | options)
7377 * @return {Promise}
7378 * [en]Will resolve to the index of the button that was pressed or `-1` when canceled.[/en]
7379 * [ja][/ja]
7380 * @param {String} message
7381 * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
7382 * [ja][/ja]
7383 * @param {Object} options
7384 * [en]Parameter object.[/en]
7385 * [ja]オプションを指定するオブジェクトです。[/ja]
7386 * @param {String} [options.message]
7387 * [en]Notification message.[/en]
7388 * [ja]アラートダイアログに表示する文字列を指定します。[/ja]
7389 * @param {String} [options.messageHTML]
7390 * [en]Notification message in HTML.[/en]
7391 * [ja]アラートダイアログに表示するHTMLを指定します。[/ja]
7392 * @param {String | Array} [options.buttonLabels]
7393 * [en]Labels for the buttons. Default is `"OK"`.[/en]
7394 * [ja]確認ボタンのラベルを指定します。"OK"がデフォルトです。[/ja]
7395 * @param {Number} [options.primaryButtonIndex]
7396 * [en]Index of primary button. Default is the last one.[/en]
7397 * [ja]プライマリボタンのインデックスを指定します。デフォルトは 0 です。[/ja]
7398 * @param {Boolean} [options.cancelable]
7399 * [en]Whether the dialog is cancelable or not. Default is `false`. If the dialog is cancelable it can be closed by clicking the background or pressing the Android back button.[/en]
7400 * [ja]ダイアログがキャンセル可能かどうかを指定します。[/ja]
7401 * @param {String} [options.animation]
7402 * [en]Animation name. Available animations are `none` and `fade`. Default is `fade`.[/en]
7403 * [ja]アラートダイアログを表示する際のアニメーション名を指定します。"none", "fade"のいずれかを指定できます。[/ja]
7404 * @param {String} [options.id]
7405 * [en]The `<ons-alert-dialog>` element's ID.[/en]
7406 * [ja]ons-alert-dialog要素のID。[/ja]
7407 * @param {String} [options.class]
7408 * [en]The `<ons-alert-dialog>` element's class.[/en]
7409 * [ja]ons-alert-dialog要素のclass。[/ja]
7410 * @param {String} [options.title]
7411 * [en]Dialog title. Default is `"Alert"`.[/en]
7412 * [ja]アラートダイアログの上部に表示するタイトルを指定します。"Alert"がデフォルトです。[/ja]
7413 * @param {String} [options.modifier]
7414 * [en]Modifier for the dialog.[/en]
7415 * [ja]アラートダイアログのmodifier属性の値を指定します。[/ja]
7416 * @param {String} [options.maskColor]
7417 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)" ("rgba(0, 0, 0, 0.3)" for Material).[/en]
7418 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
7419 * @param {Function} [options.callback]
7420 * [en]Function that executes after dialog has been closed.[/en]
7421 * [ja]アラートダイアログが閉じられた時に呼び出される関数オブジェクトを指定します。[/ja]
7422 * @description
7423 * [en]
7424 * Display an alert dialog to show the user a message.
7425 *
7426 * The content of the message can be either simple text or HTML.
7427 *
7428 * It can be called in the following ways:
7429 *
7430 * ```
7431 * ons.notification.alert(message, options);
7432 * ons.notification.alert(options);
7433 * ```
7434 *
7435 * Must specify either `message` or `messageHTML`.
7436 * [/en]
7437 * [ja]
7438 * ユーザーへメッセージを見せるためのアラートダイアログを表示します。
7439 * 表示するメッセージは、テキストかもしくはHTMLを指定できます。
7440 * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
7441 * [/ja]
7442 */
7443
7444
7445 notification.alert = function (message, options) {
7446 return notification._createAlertDialog(message, options, {
7447 buttonLabels: ['OK'],
7448 title: 'Alert'
7449 });
7450 };
7451 /**
7452 * @method confirm
7453 * @signature confirm(message [, options] | options)
7454 * @return {Promise}
7455 * [en]Will resolve to the index of the button that was pressed or `-1` when canceled.[/en]
7456 * [ja][/ja]
7457 * @param {String} message
7458 * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
7459 * [ja][/ja]
7460 * @param {Object} options
7461 * [en]Parameter object.[/en]
7462 * @param {Array} [options.buttonLabels]
7463 * [en]Labels for the buttons. Default is `["Cancel", "OK"]`.[/en]
7464 * [ja]ボタンのラベルの配列を指定します。["Cancel", "OK"]がデフォルトです。[/ja]
7465 * @param {Number} [options.primaryButtonIndex]
7466 * [en]Index of primary button. Default is the last one.[/en]
7467 * [ja]プライマリボタンのインデックスを指定します。デフォルトは 1 です。[/ja]
7468 * @description
7469 * [en]
7470 * Display a dialog to ask the user for confirmation. Extends `alert()` parameters.
7471 * The default button labels are `"Cancel"` and `"OK"` but they can be customized.
7472 *
7473 * It can be called in the following ways:
7474 *
7475 * ```
7476 * ons.notification.confirm(message, options);
7477 * ons.notification.confirm(options);
7478 * ```
7479 *
7480 * Must specify either `message` or `messageHTML`.
7481 * [/en]
7482 * [ja]
7483 * ユーザに確認を促すダイアログを表示します。
7484 * デオルとのボタンラベルは、"Cancel"と"OK"ですが、これはこのメソッドの引数でカスタマイズできます。
7485 * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
7486 * [/ja]
7487 */
7488
7489
7490 notification.confirm = function (message, options) {
7491 return notification._createAlertDialog(message, options, {
7492 buttonLabels: ['Cancel', 'OK'],
7493 title: 'Confirm'
7494 });
7495 };
7496 /**
7497 * @method prompt
7498 * @signature prompt(message [, options] | options)
7499 * @param {String} message
7500 * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
7501 * [ja][/ja]
7502 * @return {Promise}
7503 * [en]Will resolve to the input value when the dialog is closed or `null` when canceled.[/en]
7504 * [ja][/ja]
7505 * @param {Object} options
7506 * [en]Parameter object.[/en]
7507 * [ja]オプションを指定するオブジェクトです。[/ja]
7508 * @param {String | Array} [options.buttonLabels]
7509 * [en]Labels for the buttons. Default is `"OK"`.[/en]
7510 * [ja]確認ボタンのラベルを指定します。"OK"がデフォルトです。[/ja]
7511 * @param {Number} [options.primaryButtonIndex]
7512 * [en]Index of primary button. Default is the last one.[/en]
7513 * [ja]プライマリボタンのインデックスを指定します。デフォルトは 0 です。[/ja]
7514 * @param {String} [options.placeholder]
7515 * [en]Placeholder for the text input.[/en]
7516 * [ja]テキスト欄のプレースホルダに表示するテキストを指定します。[/ja]
7517 * @param {String} [options.defaultValue]
7518 * [en]Default value for the text input.[/en]
7519 * [ja]テキスト欄のデフォルトの値を指定します。[/ja]
7520 * @param {String} [options.inputType]
7521 * [en]Type of the input element (`password`, `date`...). Default is `text`.[/en]
7522 * [ja][/ja]
7523 * @param {Boolean} [options.autofocus]
7524 * [en]Autofocus the input element. Default is `true`. In Cordova, `KeyboardDisplayRequiresUserAction` in `config.xml` must be `false` to activate this feature.[/en]
7525 * [ja]input要素に自動的にフォーカスするかどうかを指定します。デフォルトはtrueです。Cordova環境では、この機能を有効にするためには `config.xml` で `KeyboardDisplayRequiresUserAction` を `false` に設定する必要があります。[/ja]
7526 * @param {Boolean} [options.submitOnEnter]
7527 * [en]Submit automatically when enter is pressed. Default is `true`.[/en]
7528 * [ja]Enterが押された際にそのformをsubmitするかどうかを指定します。デフォルトはtrueです。[/ja]
7529 * @description
7530 * [en]
7531 * Display a dialog with a prompt to ask the user a question. Extends `alert()` parameters.
7532 *
7533 * It can be called in the following ways:
7534 *
7535 * ```
7536 * ons.notification.prompt(message, options);
7537 * ons.notification.prompt(options);
7538 * ```
7539 *
7540 * Must specify either `message` or `messageHTML`.
7541 * [/en]
7542 * [ja]
7543 * ユーザーに入力を促すダイアログを表示します。
7544 * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
7545 * [/ja]
7546 */
7547
7548
7549 notification.prompt = function (message, options) {
7550 return notification._createAlertDialog(message, options, {
7551 buttonLabels: ['OK'],
7552 title: 'Alert',
7553 isPrompt: true,
7554 autofocus: true,
7555 submitOnEnter: true
7556 });
7557 };
7558 /**
7559 * @method toast
7560 * @signature toast(message [, options] | options)
7561 * @return {Promise}
7562 * [en]Will resolve when the toast is hidden.[/en]
7563 * [ja][/ja]
7564 * @param {String} message
7565 * [en]Toast message. This argument is optional but if it's not defined then `options.message` must be defined instead.[/en]
7566 * [ja][/ja]
7567 * @param {Object} options
7568 * [en]Parameter object.[/en]
7569 * [ja]オプションを指定するオブジェクトです。[/ja]
7570 * @param {String} [options.message]
7571 * [en]Notification message.[/en]
7572 * [ja]トーストに表示する文字列を指定します。[/ja]
7573 * @param {String} [options.buttonLabel]
7574 * [en]Label for the button.[/en]
7575 * [ja]確認ボタンのラベルを指定します。[/ja]
7576 * @param {String} [options.animation]
7577 * [en]Animation name. Available animations are `none`, `fade`, `ascend`, `lift` and `fall`. Default is `ascend` for Android and `lift` for iOS.[/en]
7578 * [ja]トーストを表示する際のアニメーション名を指定します。"none", "fade", "ascend", "lift", "fall"のいずれかを指定できます。[/ja]
7579 * @param {Number} [options.timeout]
7580 * [en]Number of miliseconds where the toast is visible before hiding automatically.[/en]
7581 * [ja][/ja]
7582 * @param {Boolean} [options.force]
7583 * [en]If `true`, the toast skips the notification queue and is shown immediately. Defaults to `false`.[/en]
7584 * [ja][/ja]
7585 * @param {String} [options.id]
7586 * [en]The `<ons-toast>` element's ID.[/en]
7587 * [ja]ons-toast要素のID。[/ja]
7588 * @param {String} [options.class]
7589 * [en]The `<ons-toast>` element's class.[/en]
7590 * [ja]ons-toast要素のclass。[/ja]
7591 * @param {String} [options.modifier]
7592 * [en]Modifier for the element.[/en]
7593 * [ja]トーストのmodifier属性の値を指定します。[/ja]
7594 * @param {Function} [options.callback]
7595 * [en]Function that executes after toast has been hidden.[/en]
7596 * [ja]トーストが閉じられた時に呼び出される関数オブジェクトを指定します。[/ja]
7597 * @description
7598 * [en]
7599 * Display a simple notification toast with an optional button that can be used for simple actions.
7600 *
7601 * It can be called in the following ways:
7602 *
7603 * ```
7604 * ons.notification.toast(message, options);
7605 * ons.notification.toast(options);
7606 * ```
7607 * [/en]
7608 * [ja][/ja]
7609 */
7610
7611
7612 notification.toast = function (message, options) {
7613 var promise = new Promise(function (resolve) {
7614 util$4.checkMissingImport('Toast'); // Throws error, must be inside promise
7615
7616 options = _normalizeArguments(message, options, {
7617 timeout: 0,
7618 force: false
7619 });
7620 var toast = util$4.createElement("\n <ons-toast>\n ".concat(options.message, "\n ").concat(options.buttonLabels ? "<button>".concat(options.buttonLabels[0], "</button>") : '', "\n </ons-toast>\n "));
7621
7622 _setAttributes(toast, options);
7623
7624 var originalHide = toast.hide.bind(toast);
7625
7626 var finish = function finish(value) {
7627 if (toast) {
7628 originalHide().then(function () {
7629 if (toast) {
7630 toast.remove();
7631 toast = null;
7632 options.callback(value);
7633 resolve(value);
7634 }
7635 });
7636 }
7637 };
7638
7639 if (options.buttonLabels) {
7640 util$4.findChild(toast._toast, 'button').onclick = function () {
7641 return finish(0);
7642 };
7643 } // overwrite so that ons.notification.hide resolves when toast.hide is called
7644
7645
7646 toast.hide = function () {
7647 return finish(-1);
7648 };
7649
7650 document.body.appendChild(toast);
7651 options.compile(toast);
7652
7653 var show = function show() {
7654 toast.parentElement && toast.show(options).then(function () {
7655 if (options.timeout) {
7656 setTimeout(function () {
7657 return finish(-1);
7658 }, options.timeout);
7659 }
7660 });
7661 };
7662
7663 setImmediate(function () {
7664 return options.force ? show() : ToastQueue$1.add(show, promise);
7665 });
7666 });
7667 return promise;
7668 };
7669
7670 var checkOptions = function checkOptions(options) {
7671 var err = function err(prop) {
7672 var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Function';
7673 return util$4.throw("\"options.".concat(prop, "\" must be an instance of ").concat(type));
7674 };
7675
7676 var hasOwnProperty = function hasOwnProperty(prop) {
7677 return Object.hasOwnProperty.call(options, prop);
7678 };
7679
7680 var instanceOf = function instanceOf(prop) {
7681 var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Function;
7682 return options[prop] instanceof type;
7683 };
7684
7685 var b = 'buttons',
7686 cb = 'callback',
7687 c = 'compile',
7688 d = 'destroy';
7689 (!hasOwnProperty(b) || !instanceOf(b, Array)) && err(b, 'Array');
7690 hasOwnProperty(cb) && !instanceOf(cb) && err(cb);
7691 hasOwnProperty(c) && !instanceOf(c) && err(c);
7692 hasOwnProperty(d) && !instanceOf(d) && err(d);
7693 }; // Action Sheet
7694
7695
7696 var actionSheet = (function () {
7697 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
7698 return new Promise(function (resolve) {
7699 util$4.checkMissingImport('ActionSheet');
7700 checkOptions(options); // Main component
7701
7702 var actionSheet = util$4.createElement("\n <ons-action-sheet\n ".concat(options.title ? "title=\"".concat(options.title, "\"") : '', "\n ").concat(options.cancelable ? 'cancelable' : '', "\n ").concat(options.modifier ? "modifier=\"".concat(options.modifier, "\"") : '', "\n ").concat(options.maskColor ? "mask-color=\"".concat(options.maskColor, "\"") : '', "\n ").concat(options.id ? "id=\"".concat(options.id, "\"") : '', "\n ").concat(options.class ? "class=\"".concat(options.class, "\"") : '', "\n >\n <div class=\"action-sheet\"></div>\n </ons-action-sheet>\n ")); // Resolve action and clean up
7703
7704 var finish = function finish(event) {
7705 var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
7706
7707 if (actionSheet) {
7708 options.destroy && options.destroy(actionSheet);
7709 actionSheet.removeEventListener('dialogcancel', finish, false);
7710 actionSheet.remove();
7711 actionSheet = null;
7712 options.callback && options.callback(index);
7713 resolve(index);
7714 }
7715 }; // Link cancel handler
7716
7717
7718 actionSheet.addEventListener('dialogcancel', finish, false); // Create buttons and link action handler
7719
7720 var buttons = document.createDocumentFragment();
7721 options.buttons.forEach(function (item, index) {
7722 var buttonOptions = typeof item === 'string' ? {
7723 label: item
7724 } : _objectSpread2({}, item);
7725
7726 if (options.destructive === index) {
7727 buttonOptions.modifier = (buttonOptions.modifier || '') + ' destructive';
7728 }
7729
7730 var button = util$4.createElement("\n <ons-action-sheet-button\n ".concat(buttonOptions.icon ? "icon=\"".concat(buttonOptions.icon, "\"") : '', "\n ").concat(buttonOptions.modifier ? "modifier=\"".concat(buttonOptions.modifier, "\"") : '', "\n >\n ").concat(buttonOptions.label, "\n </ons-action-sheet-button>\n "));
7731
7732 button.onclick = function (event) {
7733 return actionSheet.hide().then(function () {
7734 return finish(event, index);
7735 });
7736 };
7737
7738 buttons.appendChild(button);
7739 }); // Finish component and attach
7740
7741 util$4.findChild(actionSheet, '.action-sheet').appendChild(buttons);
7742 document.body.appendChild(actionSheet);
7743 options.compile && options.compile(el.dialog); // Show
7744
7745 setImmediate(function () {
7746 return actionSheet.show({
7747 animation: options.animation,
7748 animationOptions: options.animationOptions
7749 });
7750 });
7751 });
7752 });
7753
7754 /*
7755 Copyright 2013-2015 ASIAL CORPORATION
7756
7757 Licensed under the Apache License, Version 2.0 (the "License");
7758 you may not use this file except in compliance with the License.
7759 You may obtain a copy of the License at
7760
7761 http://www.apache.org/licenses/LICENSE-2.0
7762
7763 Unless required by applicable law or agreed to in writing, software
7764 distributed under the License is distributed on an "AS IS" BASIS,
7765 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7766 See the License for the specific language governing permissions and
7767 limitations under the License.
7768
7769 */
7770
7771 var create = function create() {
7772 /**
7773 * @object ons.orientation
7774 * @category util
7775 * @description
7776 * [en]Utility methods for orientation detection.[/en]
7777 * [ja]画面のオリエンテーション検知のためのユーティリティメソッドを収めているオブジェクトです。[/ja]
7778 */
7779 var obj = {
7780 /**
7781 * @event change
7782 * @description
7783 * [en]Fired when the device orientation changes.[/en]
7784 * [ja]デバイスのオリエンテーションが変化した際に発火します。[/ja]
7785 * @param {Object} event
7786 * [en]Event object.[/en]
7787 * [ja]イベントオブジェクトです。[/ja]
7788 * @param {Boolean} event.isPortrait
7789 * [en]Will be true if the current orientation is portrait mode.[/en]
7790 * [ja]現在のオリエンテーションがportraitの場合にtrueを返します。[/ja]
7791 */
7792
7793 /**
7794 * @method on
7795 * @signature on(eventName, listener)
7796 * @description
7797 * [en]Add an event listener.[/en]
7798 * [ja]イベントリスナーを追加します。[/ja]
7799 * @param {String} eventName
7800 * [en]Name of the event.[/en]
7801 * [ja]イベント名を指定します。[/ja]
7802 * @param {Function} listener
7803 * [en]Function to execute when the event is triggered.[/en]
7804 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
7805 */
7806
7807 /**
7808 * @method once
7809 * @signature once(eventName, listener)
7810 * @description
7811 * [en]Add an event listener that's only triggered once.[/en]
7812 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
7813 * @param {String} eventName
7814 * [en]Name of the event.[/en]
7815 * [ja]イベント名を指定します。[/ja]
7816 * @param {Function} listener
7817 * [en]Function to execute when the event is triggered.[/en]
7818 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
7819 */
7820
7821 /**
7822 * @method off
7823 * @signature off(eventName, [listener])
7824 * @description
7825 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
7826 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
7827 * @param {String} eventName
7828 * [en]Name of the event.[/en]
7829 * [ja]イベント名を指定します。[/ja]
7830 * @param {Function} listener
7831 * [en]Function to execute when the event is triggered.[/en]
7832 * [ja]削除するイベントリスナーを指定します。[/ja]
7833 */
7834 // actual implementation to detect if whether current screen is portrait or not
7835 _isPortrait: false,
7836
7837 /**
7838 * @method isPortrait
7839 * @signature isPortrait()
7840 * @return {Boolean}
7841 * [en]Will be true if the current orientation is portrait mode.[/en]
7842 * [ja]オリエンテーションがportraitモードの場合にtrueになります。[/ja]
7843 * @description
7844 * [en]Returns whether the current screen orientation is portrait or not.[/en]
7845 * [ja]オリエンテーションがportraitモードかどうかを返します。[/ja]
7846 */
7847 isPortrait: function isPortrait() {
7848 return this._isPortrait();
7849 },
7850
7851 /**
7852 * @method isLandscape
7853 * @signature isLandscape()
7854 * @return {Boolean}
7855 * [en]Will be true if the current orientation is landscape mode.[/en]
7856 * [ja]オリエンテーションがlandscapeモードの場合にtrueになります。[/ja]
7857 * @description
7858 * [en]Returns whether the current screen orientation is landscape or not.[/en]
7859 * [ja]オリエンテーションがlandscapeモードかどうかを返します。[/ja]
7860 */
7861 isLandscape: function isLandscape() {
7862 return !this.isPortrait();
7863 },
7864 _init: function _init() {
7865 document.addEventListener('DOMContentLoaded', this._onDOMContentLoaded.bind(this), false);
7866
7867 if ('orientation' in window) {
7868 window.addEventListener('orientationchange', this._onOrientationChange.bind(this), false);
7869 } else {
7870 window.addEventListener('resize', this._onResize.bind(this), false);
7871 }
7872
7873 this._isPortrait = function () {
7874 return window.innerHeight > window.innerWidth;
7875 };
7876
7877 return this;
7878 },
7879 _onDOMContentLoaded: function _onDOMContentLoaded() {
7880 this._installIsPortraitImplementation();
7881
7882 this.emit('change', {
7883 isPortrait: this.isPortrait()
7884 });
7885 },
7886 _installIsPortraitImplementation: function _installIsPortraitImplementation() {
7887 var isPortrait = window.innerWidth < window.innerHeight;
7888
7889 if (!('orientation' in window)) {
7890 this._isPortrait = function () {
7891 return window.innerHeight > window.innerWidth;
7892 };
7893 } else if (window.orientation % 180 === 0) {
7894 this._isPortrait = function () {
7895 return Math.abs(window.orientation % 180) === 0 ? isPortrait : !isPortrait;
7896 };
7897 } else {
7898 this._isPortrait = function () {
7899 return Math.abs(window.orientation % 180) === 90 ? isPortrait : !isPortrait;
7900 };
7901 }
7902 },
7903 _onOrientationChange: function _onOrientationChange() {
7904 var _this = this;
7905
7906 var isPortrait = this._isPortrait(); // Wait for the dimensions to change because
7907 // of Android inconsistency.
7908
7909
7910 var nIter = 0;
7911 var interval = setInterval(function () {
7912 nIter++;
7913 var w = window.innerWidth;
7914 var h = window.innerHeight;
7915
7916 if (isPortrait && w <= h || !isPortrait && w >= h) {
7917 _this.emit('change', {
7918 isPortrait: isPortrait
7919 });
7920
7921 clearInterval(interval);
7922 } else if (nIter === 50) {
7923 _this.emit('change', {
7924 isPortrait: isPortrait
7925 });
7926
7927 clearInterval(interval);
7928 }
7929 }, 20);
7930 },
7931 // Run on not mobile browser.
7932 _onResize: function _onResize() {
7933 this.emit('change', {
7934 isPortrait: this.isPortrait()
7935 });
7936 }
7937 };
7938 MicroEvent.mixin(obj);
7939 return obj;
7940 };
7941
7942 var orientation = create()._init();
7943
7944 /*
7945 Copyright 2013-2015 ASIAL CORPORATION
7946
7947 Licensed under the Apache License, Version 2.0 (the "License");
7948 you may not use this file except in compliance with the License.
7949 You may obtain a copy of the License at
7950
7951 http://www.apache.org/licenses/LICENSE-2.0
7952
7953 Unless required by applicable law or agreed to in writing, software
7954 distributed under the License is distributed on an "AS IS" BASIS,
7955 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7956 See the License for the specific language governing permissions and
7957 limitations under the License.
7958
7959 */
7960 /**
7961 * @object ons.modifier
7962 * @category visual
7963 * @description
7964 * [en]
7965 * Utility methods to change modifier attributes of Onsen UI elements..
7966 * [/en]
7967 * [ja][/ja]
7968 * @example
7969 * ons.modifier.add(myOnsInputElement, 'underbar');
7970 * ons.modifier.toggle(myOnsToastElement, 'custom-modifier');
7971 *
7972 */
7973
7974 var modifier = {
7975 /**
7976 * @method add
7977 * @signature add(element, modifier [, modifier])
7978 * @description
7979 * [en]Add the specified modifiers to the element if they are not already included.[/en]
7980 * [ja][/ja]
7981 * @param {HTMLElement} element
7982 * [en]Target element.[/en]
7983 * [ja][/ja]
7984 * @param {String} modifier
7985 * [en]Name of the modifier.[/en]
7986 * [ja][/ja]
7987 */
7988 add: function add(element) {
7989 for (var _len = arguments.length, modifiers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
7990 modifiers[_key - 1] = arguments[_key];
7991 }
7992
7993 return modifiers.forEach(function (modifier) {
7994 return util$4.addModifier(element, modifier);
7995 });
7996 },
7997
7998 /**
7999 * @method remove
8000 * @signature remove(element, modifier [, modifier])
8001 * @description
8002 * [en]Remove the specified modifiers from the element if they are included.[/en]
8003 * [ja][/ja]
8004 * @param {HTMLElement} element
8005 * [en]Target element.[/en]
8006 * [ja][/ja]
8007 * @param {String} modifier
8008 * [en]Name of the modifier.[/en]
8009 * [ja][/ja]
8010 */
8011 remove: function remove(element) {
8012 for (var _len2 = arguments.length, modifiers = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
8013 modifiers[_key2 - 1] = arguments[_key2];
8014 }
8015
8016 return modifiers.forEach(function (modifier) {
8017 return util$4.removeModifier(element, modifier);
8018 });
8019 },
8020
8021 /**
8022 * @method contains
8023 * @signature contains(element, modifier)
8024 * @description
8025 * [en]Check whether the specified modifier is included in the element.[/en]
8026 * [ja][/ja]
8027 * @param {HTMLElement} element
8028 * [en]Target element.[/en]
8029 * [ja][/ja]
8030 * @param {String} modifier
8031 * [en]Name of the modifier.[/en]
8032 * [ja][/ja]
8033 * @return {Boolean}
8034 * [en]`true` when the specified modifier is found in the element's `modifier` attribute. `false` otherwise.[/en]
8035 * [ja][/ja]
8036 */
8037 contains: util$4.hasModifier,
8038
8039 /**
8040 * @method toggle
8041 * @signature toggle(element, modifier [, force])
8042 * @description
8043 * [en]Toggle the specified modifier.[/en]
8044 * [ja][/ja]
8045 * @param {HTMLElement} element
8046 * [en]Target element.[/en]
8047 * [ja][/ja]
8048 * @param {String} modifier
8049 * [en]Name of the modifier.[/en]
8050 * [ja][/ja]
8051 * @param {String} force
8052 * [en]If it evaluates to true, add specified modifier value, and if it evaluates to false, remove it.[/en]
8053 * [ja][/ja]
8054 */
8055 toggle: util$4.toggleModifier
8056 };
8057
8058 /*
8059 Copyright 2013-2015 ASIAL CORPORATION
8060
8061 Licensed under the Apache License, Version 2.0 (the "License");
8062 you may not use this file except in compliance with the License.
8063 You may obtain a copy of the License at
8064
8065 http://www.apache.org/licenses/LICENSE-2.0
8066
8067 Unless required by applicable law or agreed to in writing, software
8068 distributed under the License is distributed on an "AS IS" BASIS,
8069 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8070 See the License for the specific language governing permissions and
8071 limitations under the License.
8072
8073 */
8074 var softwareKeyboard = new MicroEvent();
8075 softwareKeyboard._visible = false;
8076
8077 var onShow = function onShow() {
8078 softwareKeyboard._visible = true;
8079 softwareKeyboard.emit('show');
8080 };
8081
8082 var onHide = function onHide() {
8083 softwareKeyboard._visible = false;
8084 softwareKeyboard.emit('hide');
8085 };
8086
8087 var bindEvents = function bindEvents() {
8088 if (typeof Keyboard !== 'undefined') {
8089 // https://github.com/martinmose/cordova-keyboard/blob/95f3da3a38d8f8e1fa41fbf40145352c13535a00/README.md
8090 Keyboard.onshow = onShow;
8091 Keyboard.onhide = onHide;
8092 softwareKeyboard.emit('init', {
8093 visible: Keyboard.isVisible
8094 });
8095 return true;
8096 } else if (typeof cordova.plugins !== 'undefined' && typeof cordova.plugins.Keyboard !== 'undefined') {
8097 // https://github.com/driftyco/ionic-plugins-keyboard/blob/ca27ecf/README.md
8098 window.addEventListener('native.keyboardshow', onShow);
8099 window.addEventListener('native.keyboardhide', onHide);
8100 softwareKeyboard.emit('init', {
8101 visible: cordova.plugins.Keyboard.isVisible
8102 });
8103 return true;
8104 }
8105
8106 return false;
8107 };
8108
8109 var noPluginError = function noPluginError() {
8110 util$4.warn('ons-keyboard: Cordova Keyboard plugin is not present.');
8111 };
8112
8113 document.addEventListener('deviceready', function () {
8114 if (!bindEvents()) {
8115 if (document.querySelector('[ons-keyboard-active]') || document.querySelector('[ons-keyboard-inactive]')) {
8116 noPluginError();
8117 }
8118
8119 softwareKeyboard.on = noPluginError;
8120 }
8121 });
8122
8123 /*
8124 Copyright 2013-2015 ASIAL CORPORATION
8125
8126 Licensed under the Apache License, Version 2.0 (the "License");
8127 you may not use this file except in compliance with the License.
8128 You may obtain a copy of the License at
8129
8130 http://www.apache.org/licenses/LICENSE-2.0
8131
8132 Unless required by applicable law or agreed to in writing, software
8133 distributed under the License is distributed on an "AS IS" BASIS,
8134 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8135 See the License for the specific language governing permissions and
8136 limitations under the License.
8137
8138 */
8139 var generateId$1 = function () {
8140 var i = 0;
8141 return function () {
8142 return i++;
8143 };
8144 }();
8145 /**
8146 * Door locking system.
8147 *
8148 * @param {Object} [options]
8149 * @param {Function} [options.log]
8150 */
8151
8152
8153 var DoorLock = /*#__PURE__*/function () {
8154 function DoorLock() {
8155 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8156
8157 _classCallCheck(this, DoorLock);
8158
8159 this._lockList = [];
8160 this._waitList = [];
8161
8162 this._log = options.log || function () {};
8163 }
8164 /**
8165 * Register a lock.
8166 *
8167 * @return {Function} Callback for unlocking.
8168 */
8169
8170
8171 _createClass(DoorLock, [{
8172 key: "lock",
8173 value: function lock() {
8174 var _this = this;
8175
8176 var unlock = function unlock() {
8177 _this._unlock(unlock);
8178 };
8179
8180 unlock.id = generateId$1();
8181
8182 this._lockList.push(unlock);
8183
8184 this._log('lock: ' + unlock.id);
8185
8186 return unlock;
8187 }
8188 }, {
8189 key: "_unlock",
8190 value: function _unlock(fn) {
8191 var index = this._lockList.indexOf(fn);
8192
8193 if (index === -1) {
8194 throw new Error('This function is not registered in the lock list.');
8195 }
8196
8197 this._lockList.splice(index, 1);
8198
8199 this._log('unlock: ' + fn.id);
8200
8201 this._tryToFreeWaitList();
8202 }
8203 }, {
8204 key: "_tryToFreeWaitList",
8205 value: function _tryToFreeWaitList() {
8206 while (!this.isLocked() && this._waitList.length > 0) {
8207 this._waitList.shift()();
8208 }
8209 }
8210 /**
8211 * Register a callback for waiting unlocked door.
8212 *
8213 * @params {Function} callback Callback on unlocking the door completely.
8214 */
8215
8216 }, {
8217 key: "waitUnlock",
8218 value: function waitUnlock(callback) {
8219 if (!(callback instanceof Function)) {
8220 throw new Error('The callback param must be a function.');
8221 }
8222
8223 if (this.isLocked()) {
8224 this._waitList.push(callback);
8225 } else {
8226 callback();
8227 }
8228 }
8229 /**
8230 * @return {Boolean}
8231 */
8232
8233 }, {
8234 key: "isLocked",
8235 value: function isLocked() {
8236 return this._lockList.length > 0;
8237 }
8238 }]);
8239
8240 return DoorLock;
8241 }();
8242
8243 function loadPage(_ref, done, error) {
8244 var page = _ref.page,
8245 parent = _ref.parent;
8246 _ref.params;
8247 internal$1.getPageHTMLAsync(page).then(function (html) {
8248 var pageElement = util$4.createElement(html);
8249 parent.appendChild(pageElement);
8250 done(pageElement);
8251 }).catch(function (e) {
8252 return error(e);
8253 });
8254 }
8255
8256 function unloadPage(element) {
8257 if (element._destroy instanceof Function) {
8258 element._destroy();
8259 } else {
8260 element.remove();
8261 }
8262 }
8263
8264 var PageLoader = /*#__PURE__*/function () {
8265 /**
8266 * @param {Function} [fn] Returns an object that has "element" property and "unload" function.
8267 */
8268 function PageLoader(loader, unloader) {
8269 _classCallCheck(this, PageLoader);
8270
8271 this._loader = loader instanceof Function ? loader : loadPage;
8272 this._unloader = unloader instanceof Function ? unloader : unloadPage;
8273 }
8274 /**
8275 * Set internal loader implementation.
8276 */
8277
8278
8279 _createClass(PageLoader, [{
8280 key: "internalLoader",
8281 get: function get() {
8282 return this._loader;
8283 }
8284 /**
8285 * @param {any} options.page
8286 * @param {Element} options.parent A location to load page.
8287 * @param {Object} [options.params] Extra parameters for ons-page.
8288 * @param {Function} done Take an object that has "element" property and "unload" function.
8289 * @param {Function} error Function called when there is an error.
8290 */
8291 ,
8292 set: function set(fn) {
8293 if (!(fn instanceof Function)) {
8294 throw Error('First parameter must be an instance of Function');
8295 }
8296
8297 this._loader = fn;
8298 }
8299 }, {
8300 key: "load",
8301 value: function load(_ref2, done, error) {
8302 var page = _ref2.page,
8303 parent = _ref2.parent,
8304 _ref2$params = _ref2.params,
8305 params = _ref2$params === void 0 ? {} : _ref2$params;
8306
8307 this._loader({
8308 page: page,
8309 parent: parent,
8310 params: params
8311 }, function (pageElement) {
8312 if (!(pageElement instanceof Element)) {
8313 throw Error('pageElement must be an instance of Element.');
8314 }
8315
8316 done(pageElement);
8317 }, error);
8318 }
8319 }, {
8320 key: "unload",
8321 value: function unload(pageElement) {
8322 if (!(pageElement instanceof Element)) {
8323 throw Error('pageElement must be an instance of Element.');
8324 }
8325
8326 this._unloader(pageElement);
8327 }
8328 }]);
8329
8330 return PageLoader;
8331 }();
8332 var defaultPageLoader = new PageLoader();
8333 var instantPageLoader = new PageLoader(function (_ref3, done) {
8334 var page = _ref3.page,
8335 parent = _ref3.parent;
8336 _ref3.params;
8337 var element = util$4.createElement(page.trim());
8338 parent.appendChild(element);
8339 done(element);
8340 }, unloadPage);
8341
8342 /**
8343 * @object ons
8344 * @category util
8345 * @description
8346 * [ja]Onsen UIで利用できるグローバルなオブジェクトです。[/ja]
8347 * [en]A global object that's used in Onsen UI. [/en]
8348 */
8349
8350 var ons = {
8351 animit: Animit,
8352 defaultPageLoader: defaultPageLoader,
8353 elements: onsElements,
8354 GestureDetector: GestureDetector,
8355 modifier: modifier,
8356 notification: notification,
8357 orientation: orientation,
8358 pageAttributeExpression: pageAttributeExpression,
8359 PageLoader: PageLoader,
8360 platform: platform,
8361 softwareKeyboard: softwareKeyboard,
8362 _autoStyle: autoStyle,
8363 _internal: internal$1,
8364 _readyLock: new DoorLock(),
8365 _util: util$4
8366 };
8367 ons.platform.select((window.location.search.match(/platform=([\w-]+)/) || [])[1]);
8368 waitDeviceReady();
8369
8370 var readyError = function readyError(after) {
8371 return util$4.throw("This method must be called ".concat(after ? 'after' : 'before', " ons.isReady() is true"));
8372 };
8373 /**
8374 * @method isReady
8375 * @signature isReady()
8376 * @return {Boolean}
8377 * [en]Will be true if Onsen UI is initialized.[/en]
8378 * [ja]初期化されているかどうかを返します。[/ja]
8379 * @description
8380 * [en]Returns true if Onsen UI is initialized.[/en]
8381 * [ja]Onsen UIがすでに初期化されているかどうかを返すメソッドです。[/ja]
8382 */
8383
8384
8385 ons.isReady = function () {
8386 return !ons._readyLock.isLocked();
8387 };
8388 /**
8389 * @method isWebView
8390 * @signature isWebView()
8391 * @return {Boolean}
8392 * [en]Will be true if the app is running in Cordova.[/en]
8393 * [ja]Cordovaで実行されている場合にtrueになります。[/ja]
8394 * @description
8395 * [en]Returns true if running inside Cordova.[/en]
8396 * [ja]Cordovaで実行されているかどうかを返すメソッドです。[/ja]
8397 */
8398
8399
8400 ons.isWebView = ons.platform.isWebView;
8401 /**
8402 * @method ready
8403 * @signature ready(callback)
8404 * @description
8405 * [ja]アプリの初期化に利用するメソッドです。渡された関数は、Onsen UIの初期化が終了している時点で必ず呼ばれます。[/ja]
8406 * [en]Method used to wait for app initialization. Waits for `DOMContentLoaded` and `deviceready`, when necessary, before executing the callback.[/en]
8407 * @param {Function} callback
8408 * [en]Function that executes after Onsen UI has been initialized.[/en]
8409 * [ja]Onsen UIが初期化が完了した後に呼び出される関数オブジェクトを指定します。[/ja]
8410 */
8411
8412 ons.ready = function (callback) {
8413 if (ons.isReady()) {
8414 callback();
8415 } else {
8416 ons._readyLock.waitUnlock(callback);
8417 }
8418 };
8419 /**
8420 * @method setDefaultDeviceBackButtonListener
8421 * @signature setDefaultDeviceBackButtonListener(listener)
8422 * @param {Function} listener
8423 * [en]Function that executes when device back button is pressed. Must be called on `ons.ready`.[/en]
8424 * [ja]デバイスのバックボタンが押された時に実行される関数オブジェクトを指定します。[/ja]
8425 * @description
8426 * [en]Set default handler for device back button.[/en]
8427 * [ja]デバイスのバックボタンのためのデフォルトのハンドラを設定します。[/ja]
8428 */
8429
8430
8431 ons.setDefaultDeviceBackButtonListener = function (listener) {
8432 if (!ons.isReady()) {
8433 readyError(true);
8434 }
8435
8436 ons._defaultDeviceBackButtonHandler.setListener(listener);
8437 };
8438 /**
8439 * @method disableDeviceBackButtonHandler
8440 * @signature disableDeviceBackButtonHandler()
8441 * @description
8442 * [en]Disable device back button event handler. Must be called on `ons.ready`.[/en]
8443 * [ja]デバイスのバックボタンのイベントを受け付けないようにします。[/ja]
8444 */
8445
8446
8447 ons.disableDeviceBackButtonHandler = function () {
8448 if (!ons.isReady()) {
8449 readyError(true);
8450 }
8451
8452 internal$1.dbbDispatcher.disable();
8453 };
8454 /**
8455 * @method enableDeviceBackButtonHandler
8456 * @signature enableDeviceBackButtonHandler()
8457 * @description
8458 * [en]Enable device back button event handler. Must be called on `ons.ready`.[/en]
8459 * [ja]デバイスのバックボタンのイベントを受け付けるようにします。[/ja]
8460 */
8461
8462
8463 ons.enableDeviceBackButtonHandler = function () {
8464 if (!ons.isReady()) {
8465 readyError(true);
8466 }
8467
8468 internal$1.dbbDispatcher.enable();
8469 };
8470
8471 ons.fireDeviceBackButtonEvent = function () {
8472 internal$1.dbbDispatcher.fireDeviceBackButtonEvent();
8473 };
8474 /**
8475 * @method enableAutoStatusBarFill
8476 * @signature enableAutoStatusBarFill()
8477 * @description
8478 * [en]Enable status bar fill feature on iOS7 and above (except for iPhone X). Must be called before `ons.ready`.[/en]
8479 * [ja]iOS7以上(iPhone Xは除く)で、ステータスバー部分の高さを自動的に埋める処理を有効にします。[/ja]
8480 */
8481
8482
8483 ons.enableAutoStatusBarFill = function () {
8484 if (ons.isReady()) {
8485 readyError(false);
8486 }
8487
8488 internal$1.config.autoStatusBarFill = true;
8489 };
8490 /**
8491 * @method disableAutoStatusBarFill
8492 * @signature disableAutoStatusBarFill()
8493 * @description
8494 * [en]Disable status bar fill feature on iOS7 and above (except for iPhone X). Must be called before `ons.ready`.[/en]
8495 * [ja]iOS7以上(iPhone Xは除く)で、ステータスバー部分の高さを自動的に埋める処理を無効にします。[/ja]
8496 */
8497
8498
8499 ons.disableAutoStatusBarFill = function () {
8500 if (ons.isReady()) {
8501 readyError(false);
8502 }
8503
8504 internal$1.config.autoStatusBarFill = false;
8505 };
8506 /**
8507 * @method mockStatusBar
8508 * @signature mockStatusBar()
8509 * @description
8510 * [en]Creates a static element similar to iOS status bar. Only useful for browser testing. Must be called before `ons.ready`.[/en]
8511 * [ja][/ja]
8512 */
8513
8514
8515 ons.mockStatusBar = function () {
8516 if (ons.isReady()) {
8517 readyError(false);
8518 }
8519
8520 var mock = function mock() {
8521 if (!document.body.children[0] || !document.body.children[0].classList.contains('ons-status-bar-mock')) {
8522 var android = platform.isAndroid(),
8523 i = function i(_i) {
8524 return "<i class=\"".concat(_i.split('-')[0], " ").concat(_i, "\"></i>");
8525 };
8526
8527 var left = android ? "".concat(i('zmdi-twitter'), " ").concat(i('zmdi-google-play')) : "No SIM ".concat(i('fa-wifi')),
8528 center = android ? '' : '12:28 PM',
8529 right = android ? "".concat(i('zmdi-network'), " ").concat(i('zmdi-wifi'), " ").concat(i('zmdi-battery'), " 12:28 PM") : "80% ".concat(i('fa-battery-three-quarters'));
8530 document.body.insertBefore(util$4.createElement("<div class=\"ons-status-bar-mock ".concat(android ? 'android' : 'ios', "\">") + "<div>".concat(left, "</div><div>").concat(center, "</div><div>").concat(right, "</div>") + "</div>"), document.body.firstChild);
8531 }
8532 };
8533
8534 document.body ? mock() : internal$1.waitDOMContentLoaded(mock);
8535 };
8536 /**
8537 * @method disableAnimations
8538 * @signature disableAnimations()
8539 * @description
8540 * [en]Disable all animations. Could be handy for testing and older devices.[/en]
8541 * [ja]アニメーションを全て無効にします。テストの際に便利です。[/ja]
8542 */
8543
8544
8545 ons.disableAnimations = function () {
8546 internal$1.config.animationsDisabled = true;
8547 };
8548 /**
8549 * @method enableAnimations
8550 * @signature enableAnimations()
8551 * @description
8552 * [en]Enable animations (default).[/en]
8553 * [ja]アニメーションを有効にします。[/ja]
8554 */
8555
8556
8557 ons.enableAnimations = function () {
8558 internal$1.config.animationsDisabled = false;
8559 };
8560
8561 ons._disableWarnings = function () {
8562 internal$1.config.warningsDisabled = true;
8563 };
8564
8565 ons._enableWarnings = function () {
8566 internal$1.config.warningsDisabled = false;
8567 };
8568 /**
8569 * @method disableAutoStyling
8570 * @signature disableAutoStyling()
8571 * @description
8572 * [en]Disable automatic styling.[/en]
8573 * [ja][/ja]
8574 */
8575
8576
8577 ons.disableAutoStyling = autoStyle.disable;
8578 /**
8579 * @method enableAutoStyling
8580 * @signature enableAutoStyling()
8581 * @description
8582 * [en]Enable automatic styling based on OS (default).[/en]
8583 * [ja][/ja]
8584 */
8585
8586 ons.enableAutoStyling = autoStyle.enable;
8587 /**
8588 * @method disableIconAutoPrefix
8589 * @signature disableIconAutoPrefix()
8590 * @description
8591 * [en]Disable adding `fa-` prefix automatically to `ons-icon` classes. Useful when including custom icon packs.[/en]
8592 * [ja][/ja]
8593 */
8594
8595 ons.disableIconAutoPrefix = function () {
8596 util$4.checkMissingImport('Icon');
8597 onsElements.Icon.setAutoPrefix(false);
8598 };
8599 /**
8600 * @method forcePlatformStyling
8601 * @signature forcePlatformStyling(platform)
8602 * @description
8603 * [en]Refresh styling for the given platform. Only useful for demos. Use `ons.platform.select(...)` instead for development and production.[/en]
8604 * [ja][/ja]
8605 * @param {string} platform New platform to style the elements.
8606 */
8607
8608
8609 ons.forcePlatformStyling = function (newPlatform) {
8610 ons.enableAutoStyling();
8611 ons.platform.select(newPlatform || 'ios');
8612
8613 ons._util.arrayFrom(document.querySelectorAll('*')).forEach(function (element) {
8614 if (element.tagName.toLowerCase() === 'ons-if') {
8615 element._platformUpdate();
8616 } else if (element.tagName.match(/^ons-/i)) {
8617 autoStyle.prepare(element, true);
8618
8619 if (element.tagName.toLowerCase() === 'ons-tabbar') {
8620 element._updatePosition();
8621 }
8622 }
8623 });
8624 };
8625 /**
8626 * @method preload
8627 * @signature preload(templatePaths)
8628 * @param {String|Array} templatePaths
8629 * [en]Set of HTML file paths containing 'ons-page' elements.[/en]
8630 * [ja][/ja]
8631 * @return {Promise}
8632 * [en]Promise that resolves when all the templates are cached.[/en]
8633 * [ja][/ja]
8634 * @description
8635 * [en]Separated files need to be requested on demand and this can slightly delay pushing new pages. This method requests and caches templates for later use.[/en]
8636 * [ja][/ja]
8637 */
8638
8639
8640 ons.preload = function () {
8641 var templates = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
8642 return Promise.all((templates instanceof Array ? templates : [templates]).map(function (template) {
8643 if (typeof template !== 'string') {
8644 util$4.throw('Expected string arguments but got ' + _typeof(template));
8645 }
8646
8647 return internal$1.getTemplateHTMLAsync(template);
8648 }));
8649 };
8650 /**
8651 * @method createElement
8652 * @signature createElement(template, options)
8653 * @param {String} template
8654 * [en]Either an HTML file path, a `<template>` id or an HTML string such as `'<div id="foo">hoge</div>'`.[/en]
8655 * [ja][/ja]
8656 * @param {Object} [options]
8657 * [en]Parameter object.[/en]
8658 * [ja]オプションを指定するオブジェクト。[/ja]
8659 * @param {Boolean|HTMLElement} [options.append]
8660 * [en]Whether or not the element should be automatically appended to the DOM. Defaults to `false`. If `true` value is given, `document.body` will be used as the target.[/en]
8661 * [ja][/ja]
8662 * @param {HTMLElement} [options.insertBefore]
8663 * [en]Reference node that becomes the next sibling of the new node (`options.append` element).[/en]
8664 * [ja][/ja]
8665 * @return {HTMLElement|Promise}
8666 * [en]If the provided template was an inline HTML string, it returns the new element. Otherwise, it returns a promise that resolves to the new element.[/en]
8667 * [ja][/ja]
8668 * @description
8669 * [en]Create a new element from a template. Both inline HTML and external files are supported although the return value differs.[/en]
8670 * [ja][/ja]
8671 */
8672
8673
8674 ons.createElement = function (template) {
8675 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8676 template = template.trim();
8677
8678 var create = function create(html) {
8679 var element = ons._util.createElement(html);
8680
8681 element.remove();
8682
8683 if (options.append) {
8684 var target = options.append instanceof HTMLElement ? options.append : document.body;
8685 target.insertBefore(element, options.insertBefore || null);
8686 options.link instanceof Function && options.link(element);
8687 }
8688
8689 return element;
8690 };
8691
8692 return template.charAt(0) === '<' ? create(template) : internal$1.getPageHTMLAsync(template).then(create);
8693 };
8694 /**
8695 * @method createPopover
8696 * @signature createPopover(page, [options])
8697 * @param {String} page
8698 * [en]Page name. Can be either an HTML file or a <template> containing a <ons-dialog> component.[/en]
8699 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
8700 * @param {Object} [options]
8701 * [en]Parameter object.[/en]
8702 * [ja]オプションを指定するオブジェクト。[/ja]
8703 * @param {Object} [options.parentScope]
8704 * [en]Parent scope of the dialog. Used to bind models and access scope methods from the dialog.[/en]
8705 * [ja]ダイアログ内で利用する親スコープを指定します。ダイアログからモデルやスコープのメソッドにアクセスするのに使います。このパラメータはAngularJSバインディングでのみ利用できます。[/ja]
8706 * @return {Promise}
8707 * [en]Promise object that resolves to the popover component object.[/en]
8708 * [ja]ポップオーバーのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
8709 * @description
8710 * [en]Create a popover instance from a template.[/en]
8711 * [ja]テンプレートからポップオーバーのインスタンスを生成します。[/ja]
8712 */
8713
8714 /**
8715 * @method createDialog
8716 * @signature createDialog(page, [options])
8717 * @param {String} page
8718 * [en]Page name. Can be either an HTML file or an `<template>` containing a <ons-dialog> component.[/en]
8719 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
8720 * @param {Object} [options]
8721 * [en]Parameter object.[/en]
8722 * [ja]オプションを指定するオブジェクト。[/ja]
8723 * @return {Promise}
8724 * [en]Promise object that resolves to the dialog component object.[/en]
8725 * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
8726 * @description
8727 * [en]Create a dialog instance from a template.[/en]
8728 * [ja]テンプレートからダイアログのインスタンスを生成します。[/ja]
8729 */
8730
8731 /**
8732 * @method createAlertDialog
8733 * @signature createAlertDialog(page, [options])
8734 * @param {String} page
8735 * [en]Page name. Can be either an HTML file or an `<template>` containing a <ons-alert-dialog> component.[/en]
8736 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
8737 * @param {Object} [options]
8738 * [en]Parameter object.[/en]
8739 * [ja]オプションを指定するオブジェクト。[/ja]
8740 * @return {Promise}
8741 * [en]Promise object that resolves to the alert dialog component object.[/en]
8742 * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
8743 * @description
8744 * [en]Create a alert dialog instance from a template.[/en]
8745 * [ja]テンプレートからアラートダイアログのインスタンスを生成します。[/ja]
8746 */
8747
8748
8749 ons.createPopover = ons.createDialog = ons.createAlertDialog = function (template) {
8750 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8751 return ons.createElement(template, _objectSpread2({
8752 append: true
8753 }, options));
8754 };
8755 /**
8756 * @method openActionSheet
8757 * @signature openActionSheet(options)
8758 * @description
8759 * [en]Shows an instant Action Sheet and lets the user choose an action.[/en]
8760 * [ja][/ja]
8761 * @param {Object} [options]
8762 * [en]Parameter object.[/en]
8763 * [ja]オプションを指定するオブジェクト。[/ja]
8764 * @param {Array} [options.buttons]
8765 * [en]Represent each button of the action sheet following the specified order. Every item can be either a string label or an object containing `label`, `icon` and `modifier` properties.[/en]
8766 * [ja][/ja]
8767 * @param {String} [options.title]
8768 * [en]Optional title for the action sheet.[/en]
8769 * [ja][/ja]
8770 * @param {Number} [options.destructive]
8771 * [en]Optional index of the "destructive" button (only for iOS). It can be specified in the button array as well.[/en]
8772 * [ja][/ja]
8773 * @param {Boolean} [options.cancelable]
8774 * [en]Whether the action sheet can be canceled by tapping on the background mask or not.[/en]
8775 * [ja][/ja]
8776 * @param {String} [options.modifier]
8777 * [en]Modifier attribute of the action sheet. E.g. `'destructive'`.[/en]
8778 * [ja][/ja]
8779 * @param {String} [options.maskColor]
8780 * [en]Optionally change the background mask color.[/en]
8781 * [ja][/ja]
8782 * @param {String} [options.id]
8783 * [en]The element's id attribute.[/en]
8784 * [ja][/ja]
8785 * @param {String} [options.class]
8786 * [en]The element's class attribute.[/en]
8787 * [ja][/ja]
8788 * @return {Promise}
8789 * [en]Will resolve when the action sheet is closed. The resolve value is either the index of the tapped button or -1 when canceled.[/en]
8790 * [ja][/ja]
8791 */
8792
8793
8794 ons.openActionSheet = actionSheet;
8795 /**
8796 * @method resolveLoadingPlaceholder
8797 * @signature resolveLoadingPlaceholder(page)
8798 * @param {String} page
8799 * [en]Page name. Can be either an HTML file or a `<template>` id.[/en]
8800 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
8801 * @description
8802 * [en]If no page is defined for the `ons-loading-placeholder` attribute it will wait for this method being called before loading the page.[/en]
8803 * [ja]ons-loading-placeholderの属性値としてページが指定されていない場合は、ページロード前に呼ばれるons.resolveLoadingPlaceholder処理が行われるまで表示されません。[/ja]
8804 */
8805
8806 ons.resolveLoadingPlaceholder = function (page, link) {
8807 var elements = ons._util.arrayFrom(window.document.querySelectorAll('[ons-loading-placeholder]'));
8808
8809 if (elements.length === 0) {
8810 util$4.throw('No ons-loading-placeholder exists');
8811 }
8812
8813 elements.filter(function (element) {
8814 return !element.getAttribute('page');
8815 }).forEach(function (element) {
8816 element.setAttribute('ons-loading-placeholder', page);
8817
8818 ons._resolveLoadingPlaceholder(element, page, link);
8819 });
8820 };
8821
8822 ons._setupLoadingPlaceHolders = function () {
8823 ons.ready(function () {
8824 var elements = ons._util.arrayFrom(window.document.querySelectorAll('[ons-loading-placeholder]'));
8825
8826 elements.forEach(function (element) {
8827 var page = element.getAttribute('ons-loading-placeholder');
8828
8829 if (typeof page === 'string') {
8830 ons._resolveLoadingPlaceholder(element, page);
8831 }
8832 });
8833 });
8834 };
8835
8836 ons._resolveLoadingPlaceholder = function (parent, page) {
8837 var link = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (el, done) {
8838 return done();
8839 };
8840 page && ons.createElement(page).then(function (element) {
8841 element.style.display = 'none';
8842 parent.appendChild(element);
8843 link(element, function () {
8844 while (parent.firstChild && parent.firstChild !== element) {
8845 parent.removeChild(parent.firstChild);
8846 }
8847
8848 element.style.display = '';
8849 });
8850 }).catch(function (error) {
8851 return Promise.reject('Unabled to resolve placeholder: ' + error);
8852 });
8853 };
8854
8855 function waitDeviceReady() {
8856 var unlockDeviceReady = ons._readyLock.lock();
8857
8858 window.addEventListener('DOMContentLoaded', function () {
8859 if (ons.isWebView()) {
8860 window.document.addEventListener('deviceready', unlockDeviceReady, {
8861 once: true
8862 });
8863 } else {
8864 unlockDeviceReady();
8865 }
8866 }, {
8867 once: true
8868 });
8869 }
8870 /**
8871 * @method getScriptPage
8872 * @signature getScriptPage()
8873 * @description
8874 * [en]Access the last created page from the current `script` scope. Only works inside `<script></script>` tags that are direct children of `ons-page` element. Use this to add lifecycle hooks to a page.[/en]
8875 * [ja][/ja]
8876 * @return {HTMLElement}
8877 * [en]Returns the corresponding page element.[/en]
8878 * [ja][/ja]
8879 */
8880
8881
8882 var getCS = 'currentScript' in document ? function () {
8883 return document.currentScript;
8884 } : function () {
8885 return document.scripts[document.scripts.length - 1];
8886 };
8887
8888 ons.getScriptPage = function () {
8889 return getCS() && /ons-page/i.test(getCS().parentElement.tagName) && getCS().parentElement || null;
8890 };
8891
8892 /*
8893 Copyright 2013-2015 ASIAL CORPORATION
8894
8895 Licensed under the Apache License, Version 2.0 (the "License");
8896 you may not use this file except in compliance with the License.
8897 You may obtain a copy of the License at
8898
8899 http://www.apache.org/licenses/LICENSE-2.0
8900
8901 Unless required by applicable law or agreed to in writing, software
8902 distributed under the License is distributed on an "AS IS" BASIS,
8903 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8904 See the License for the specific language governing permissions and
8905 limitations under the License.
8906
8907 */
8908 function getElementClass() {
8909 if (typeof HTMLElement !== 'function') {
8910 // case of Safari
8911 var _BaseElement = function _BaseElement() {};
8912
8913 _BaseElement.prototype = document.createElement('div');
8914 return _BaseElement;
8915 } else {
8916 return HTMLElement;
8917 }
8918 }
8919
8920 var BaseElement = /*#__PURE__*/function (_getElementClass) {
8921 _inherits(BaseElement, _getElementClass);
8922
8923 var _super = _createSuper(BaseElement);
8924
8925 function BaseElement() {
8926 _classCallCheck(this, BaseElement);
8927
8928 return _super.call(this);
8929 }
8930
8931 return _createClass(BaseElement);
8932 }(getElementClass());
8933
8934 /**
8935 * @element ons-if
8936 * @category conditional
8937 * @tutorial vanilla/Reference/if
8938 * @description
8939 * [en]
8940 * Conditionally display content depending on the platform, device orientation or both.
8941 *
8942 * Sometimes it is useful to conditionally hide or show certain components based on platform. When running on iOS the `<ons-if>` element can be used to hide the `<ons-fab>` element.
8943 * [/en]
8944 * [ja][/ja]
8945 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
8946 * @example
8947 * <ons-page>
8948 * <ons-if orientation="landscape">
8949 * Landscape view!
8950 * </ons-if>
8951 * <ons-if platform="android">
8952 * This is Android.
8953 * </ons-if>
8954 * <ons-if platform="ios other">
8955 * This is not Android.
8956 * </ons-if>
8957 * </ons-page>
8958 */
8959
8960 var IfElement = /*#__PURE__*/function (_BaseElement) {
8961 _inherits(IfElement, _BaseElement);
8962
8963 var _super = _createSuper(IfElement);
8964
8965 /**
8966 * @attribute platform
8967 * @initonly
8968 * @type {string}
8969 * @description
8970 * [en]Space-separated platform names. Possible values are `"ios"`, `"android"`, `"windows"` and `"other"`.[/en]
8971 * [ja][/ja]
8972 */
8973
8974 /**
8975 * @attribute orientation
8976 * @type {string}
8977 * @description
8978 * [en]Either `"portrait"` or `"landscape"`.[/en]
8979 * [ja]portraitもしくはlandscapeを指定します[/ja]
8980 */
8981 function IfElement() {
8982 var _this;
8983
8984 _classCallCheck(this, IfElement);
8985
8986 _this = _super.call(this);
8987 contentReady(_assertThisInitialized(_this), function () {
8988 if (platform._getSelectedPlatform() !== null) {
8989 _this._platformUpdate();
8990 } else if (!_this._isAllowedPlatform()) {
8991 while (_this.childNodes[0]) {
8992 _this.childNodes[0].remove();
8993 }
8994
8995 _this._platformUpdate();
8996 }
8997 });
8998
8999 _this._onOrientationChange();
9000
9001 return _this;
9002 }
9003
9004 _createClass(IfElement, [{
9005 key: "connectedCallback",
9006 value: function connectedCallback() {
9007 orientation.on('change', this._onOrientationChange.bind(this));
9008 }
9009 }, {
9010 key: "attributeChangedCallback",
9011 value: function attributeChangedCallback(name) {
9012 if (name === 'orientation') {
9013 this._onOrientationChange();
9014 }
9015 }
9016 }, {
9017 key: "disconnectedCallback",
9018 value: function disconnectedCallback() {
9019 orientation.off('change', this._onOrientationChange);
9020 }
9021 }, {
9022 key: "_platformUpdate",
9023 value: function _platformUpdate() {
9024 this.style.display = this._isAllowedPlatform() ? '' : 'none';
9025 }
9026 }, {
9027 key: "_isAllowedPlatform",
9028 value: function _isAllowedPlatform() {
9029 return !this.getAttribute('platform') || this.getAttribute('platform').split(/\s+/).indexOf(platform.getMobileOS()) >= 0;
9030 }
9031 }, {
9032 key: "_onOrientationChange",
9033 value: function _onOrientationChange() {
9034 if (this.hasAttribute('orientation') && this._isAllowedPlatform()) {
9035 var conditionalOrientation = this.getAttribute('orientation').toLowerCase();
9036 var currentOrientation = orientation.isPortrait() ? 'portrait' : 'landscape';
9037 this.style.display = conditionalOrientation === currentOrientation ? '' : 'none';
9038 }
9039 }
9040 }], [{
9041 key: "observedAttributes",
9042 get: function get() {
9043 return ['orientation'];
9044 }
9045 }]);
9046
9047 return IfElement;
9048 }(BaseElement);
9049 onsElements.If = IfElement;
9050 customElements.define('ons-if', IfElement);
9051
9052 var BaseAnimator = /*#__PURE__*/function () {
9053 /**
9054 * @param {Object} options
9055 * @param {String} options.timing
9056 * @param {Number} options.duration
9057 * @param {Number} options.delay
9058 */
9059 function BaseAnimator() {
9060 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
9061
9062 _classCallCheck(this, BaseAnimator);
9063
9064 this.timing = options.timing || 'linear';
9065 this.duration = options.duration || 0;
9066 this.delay = options.delay || 0;
9067 this.def = {
9068 timing: this.timing,
9069 duration: this.duration,
9070 delay: this.delay
9071 };
9072 }
9073
9074 _createClass(BaseAnimator, null, [{
9075 key: "extend",
9076 value: function extend() {
9077 var properties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
9078 var extendedAnimator = this;
9079
9080 var newAnimator = function newAnimator() {
9081 extendedAnimator.apply(this, arguments);
9082 util$4.extend(this, properties);
9083 };
9084
9085 newAnimator.prototype = this.prototype;
9086 return newAnimator;
9087 }
9088 }]);
9089
9090 return BaseAnimator;
9091 }();
9092
9093 /*
9094 Copyright 2013-2015 ASIAL CORPORATION
9095
9096 Licensed under the Apache License, Version 2.0 (the "License");
9097 you may not use this file except in compliance with the License.
9098 You may obtain a copy of the License at
9099
9100 http://www.apache.org/licenses/LICENSE-2.0
9101
9102 Unless required by applicable law or agreed to in writing, software
9103 distributed under the License is distributed on an "AS IS" BASIS,
9104 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9105 See the License for the specific language governing permissions and
9106 limitations under the License.
9107
9108 */
9109 // This object should not be exposed to users. Please keep this private.
9110 var iPhoneXPatch = {};
9111
9112 iPhoneXPatch.isIPhoneXPortraitPatchActive = function () {
9113 return document.documentElement.getAttribute('onsflag-iphonex-portrait') != null && window.innerWidth < window.innerHeight;
9114 };
9115
9116 iPhoneXPatch.isIPhoneXLandscapePatchActive = function () {
9117 // If width === height, treat it as landscape
9118 return document.documentElement.getAttribute('onsflag-iphonex-landscape') != null && window.innerWidth >= window.innerHeight;
9119 };
9120 /**
9121 * Returns the safe area lengths based on the current state of the safe areas.
9122 */
9123
9124
9125 iPhoneXPatch.getSafeAreaLengths = function () {
9126 var safeAreaLengths;
9127
9128 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
9129 safeAreaLengths = {
9130 top: 44,
9131 right: 0,
9132 bottom: 34,
9133 left: 0
9134 };
9135 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
9136 safeAreaLengths = {
9137 top: 0,
9138 right: 44,
9139 bottom: 21,
9140 left: 44
9141 };
9142 } else {
9143 safeAreaLengths = {
9144 top: 0,
9145 right: 0,
9146 bottom: 0,
9147 left: 0
9148 };
9149 }
9150
9151 return safeAreaLengths;
9152 };
9153 /**
9154 * Returns the safe area rect based on the current state of the safe areas.
9155 */
9156
9157
9158 iPhoneXPatch.getSafeAreaDOMRect = function () {
9159 var safeAreaRect;
9160
9161 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
9162 safeAreaRect = {
9163 x: 0,
9164 y: 44,
9165
9166 /* 0 + 44 (top safe area) */
9167 width: window.innerWidth,
9168 height: window.innerHeight - 78
9169 /* height - 44 (top safe area) - 34 (bottom safe area) */
9170
9171 };
9172 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
9173 safeAreaRect = {
9174 x: 44,
9175
9176 /* 0 + 44 (left safe area) */
9177 y: 0,
9178 width: window.innerWidth - 88,
9179
9180 /* width - 44 (left safe area) - 34 (right safe area) */
9181 height: window.innerHeight - 21
9182 /* height - 21 (bottom safe area) */
9183
9184 };
9185 } else {
9186 safeAreaRect = {
9187 x: 0,
9188 y: 0,
9189 width: window.innerWidth,
9190 height: window.innerHeight
9191 };
9192 }
9193
9194 return _objectSpread2(_objectSpread2({}, safeAreaRect), {}, {
9195 left: safeAreaRect.x,
9196 top: safeAreaRect.y,
9197 right: safeAreaRect.x + safeAreaRect.width,
9198 bottom: safeAreaRect.y + safeAreaRect.height
9199 });
9200 };
9201
9202 var ActionSheetAnimator = /*#__PURE__*/function (_BaseAnimator) {
9203 _inherits(ActionSheetAnimator, _BaseAnimator);
9204
9205 var _super = _createSuper(ActionSheetAnimator);
9206
9207 function ActionSheetAnimator() {
9208 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
9209 _ref$timing = _ref.timing,
9210 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
9211 _ref$delay = _ref.delay,
9212 delay = _ref$delay === void 0 ? 0 : _ref$delay,
9213 _ref$duration = _ref.duration,
9214 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
9215
9216 _classCallCheck(this, ActionSheetAnimator);
9217
9218 return _super.call(this, {
9219 timing: timing,
9220 delay: delay,
9221 duration: duration
9222 });
9223 }
9224 /**
9225 * @param {HTMLElement} dialog
9226 * @param {Function} done
9227 */
9228
9229
9230 _createClass(ActionSheetAnimator, [{
9231 key: "show",
9232 value: function show(dialog, done) {
9233 done();
9234 }
9235 /**
9236 * @param {HTMLElement} dialog
9237 * @param {Function} done
9238 */
9239
9240 }, {
9241 key: "hide",
9242 value: function hide(dialog, done) {
9243 done();
9244 }
9245 }]);
9246
9247 return ActionSheetAnimator;
9248 }(BaseAnimator);
9249 /**
9250 * Android style animator for Action Sheet.
9251 */
9252
9253 var MDActionSheetAnimator = /*#__PURE__*/function (_ActionSheetAnimator) {
9254 _inherits(MDActionSheetAnimator, _ActionSheetAnimator);
9255
9256 var _super2 = _createSuper(MDActionSheetAnimator);
9257
9258 function MDActionSheetAnimator() {
9259 var _this;
9260
9261 var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
9262 _ref2$timing = _ref2.timing,
9263 timing = _ref2$timing === void 0 ? 'ease' : _ref2$timing,
9264 _ref2$delay = _ref2.delay,
9265 delay = _ref2$delay === void 0 ? 0 : _ref2$delay,
9266 _ref2$duration = _ref2.duration,
9267 duration = _ref2$duration === void 0 ? 0.4 : _ref2$duration;
9268
9269 _classCallCheck(this, MDActionSheetAnimator);
9270
9271 _this = _super2.call(this, {
9272 timing: timing,
9273 delay: delay,
9274 duration: duration
9275 });
9276 _this.maskTiming = 'linear';
9277 _this.maskDuration = 0.2;
9278 return _this;
9279 }
9280 /**
9281 * @param {Object} dialog
9282 * @param {Function} callback
9283 */
9284
9285
9286 _createClass(MDActionSheetAnimator, [{
9287 key: "show",
9288 value: function show(dialog, callback) {
9289 Animit.runAll(Animit(dialog._mask).queue({
9290 opacity: 0
9291 }).wait(this.delay).queue({
9292 opacity: 1.0
9293 }, {
9294 duration: this.maskDuration,
9295 timing: this.maskTiming
9296 }), Animit(dialog._sheet, this.def).default({
9297 transform: "translate3d(0, 80%, 0)",
9298 opacity: 0
9299 }, {
9300 transform: 'translate3d(0, 0, 0)',
9301 opacity: 1
9302 }).queue(function (done) {
9303 callback && callback();
9304 done();
9305 }));
9306 }
9307 /**
9308 * @param {Object} dialog
9309 * @param {Function} callback
9310 */
9311
9312 }, {
9313 key: "hide",
9314 value: function hide(dialog, callback) {
9315 Animit.runAll(Animit(dialog._mask).queue({
9316 opacity: 1
9317 }).wait(this.delay).queue({
9318 opacity: 0
9319 }, {
9320 duration: this.maskDuration,
9321 timing: this.maskTiming
9322 }), Animit(dialog._sheet, this.def).default({
9323 transform: 'translate3d(0, 0, 0)',
9324 opacity: 1
9325 }, {
9326 transform: "translate3d(0, 80%, 0)",
9327 opacity: 0
9328 }).queue(function (done) {
9329 callback && callback();
9330 done();
9331 }));
9332 }
9333 }]);
9334
9335 return MDActionSheetAnimator;
9336 }(ActionSheetAnimator);
9337 /**
9338 * iOS style animator for dialog.
9339 */
9340
9341 var IOSActionSheetAnimator = /*#__PURE__*/function (_ActionSheetAnimator2) {
9342 _inherits(IOSActionSheetAnimator, _ActionSheetAnimator2);
9343
9344 var _super3 = _createSuper(IOSActionSheetAnimator);
9345
9346 function IOSActionSheetAnimator() {
9347 var _this2;
9348
9349 var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
9350 _ref3$timing = _ref3.timing,
9351 timing = _ref3$timing === void 0 ? 'ease' : _ref3$timing,
9352 _ref3$delay = _ref3.delay,
9353 delay = _ref3$delay === void 0 ? 0 : _ref3$delay,
9354 _ref3$duration = _ref3.duration,
9355 duration = _ref3$duration === void 0 ? 0.3 : _ref3$duration;
9356
9357 _classCallCheck(this, IOSActionSheetAnimator);
9358
9359 _this2 = _super3.call(this, {
9360 timing: timing,
9361 delay: delay,
9362 duration: duration
9363 });
9364 _this2.maskTiming = 'linear';
9365 _this2.maskDuration = 0.2;
9366
9367 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
9368 _this2.liftAmount = 'calc(100% + 48px)';
9369 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
9370 _this2.liftAmount = 'calc(100% + 33px)';
9371 } else {
9372 _this2.liftAmount = document.body.clientHeight / 2.0 - 1 + 'px'; // avoid Forced Synchronous Layout
9373 }
9374
9375 return _this2;
9376 }
9377 /**
9378 * @param {Object} dialog
9379 * @param {Function} callback
9380 */
9381
9382
9383 _createClass(IOSActionSheetAnimator, [{
9384 key: "show",
9385 value: function show(dialog, callback) {
9386 Animit.runAll(Animit(dialog._mask).queue({
9387 opacity: 0
9388 }).wait(this.delay).queue({
9389 opacity: 1
9390 }, {
9391 duration: this.maskDuration,
9392 timing: this.maskTiming
9393 }), Animit(dialog._sheet, this.def).default({
9394 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)")
9395 }, {
9396 transform: 'translate3d(0, 0, 0)'
9397 }).queue(function (done) {
9398 callback && callback();
9399 done();
9400 }));
9401 }
9402 /**
9403 * @param {Object} dialog
9404 * @param {Function} callback
9405 */
9406
9407 }, {
9408 key: "hide",
9409 value: function hide(dialog, callback) {
9410 Animit.runAll(Animit(dialog._mask).queue({
9411 opacity: 1
9412 }).wait(this.delay).queue({
9413 opacity: 0
9414 }, {
9415 duration: this.maskDuration,
9416 timing: this.maskTiming
9417 }), Animit(dialog._sheet, this.def).default({
9418 transform: 'translate3d(0, 0, 0)'
9419 }, {
9420 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)")
9421 }).queue(function (done) {
9422 callback && callback();
9423 done();
9424 }));
9425 }
9426 }]);
9427
9428 return IOSActionSheetAnimator;
9429 }(ActionSheetAnimator);
9430
9431 var BaseDialogElement = /*#__PURE__*/function (_BaseElement) {
9432 _inherits(BaseDialogElement, _BaseElement);
9433
9434 var _super = _createSuper(BaseDialogElement);
9435
9436 function BaseDialogElement() {
9437 var _this;
9438
9439 _classCallCheck(this, BaseDialogElement);
9440
9441 _this = _super.call(this);
9442
9443 if (_this.constructor === BaseDialogElement) {
9444 util$4.throwAbstract();
9445 }
9446
9447 _this._visible = false;
9448 _this._doorLock = new DoorLock();
9449 _this._cancel = _this._cancel.bind(_assertThisInitialized(_this));
9450 _this._selfCamelName = util$4.camelize(_this.tagName.slice(4));
9451
9452 _this._defaultDBB = function (e) {
9453 return _this.cancelable ? _this._cancel() : e.callParentHandler();
9454 };
9455
9456 _this._animatorFactory = _this._updateAnimatorFactory();
9457 return _this;
9458 }
9459
9460 _createClass(BaseDialogElement, [{
9461 key: "_scheme",
9462 get: function get() {
9463 // eslint-disable-line getter-return
9464 util$4.throwMember();
9465 }
9466 }, {
9467 key: "_updateAnimatorFactory",
9468 value: function _updateAnimatorFactory() {
9469 util$4.throwMember();
9470 }
9471 }, {
9472 key: "_toggleStyle",
9473 value: function _toggleStyle(shouldShow) {
9474 this.style.display = shouldShow ? 'block' : 'none';
9475 }
9476 }, {
9477 key: "onDeviceBackButton",
9478 get: function get() {
9479 return this._backButtonHandler;
9480 },
9481 set: function set(callback) {
9482 if (this._backButtonHandler) {
9483 this._backButtonHandler.destroy();
9484 }
9485
9486 this._backButtonCallback = callback;
9487 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
9488 }
9489 }, {
9490 key: "_cancel",
9491 value: function _cancel() {
9492 var _this2 = this;
9493
9494 if (this.cancelable && !this._running) {
9495 this._running = true;
9496 this.hide().then(function () {
9497 _this2._running = false;
9498 util$4.triggerElementEvent(_this2, 'dialogcancel');
9499 util$4.triggerElementEvent(_this2, 'dialog-cancel'); // dialog-cancel is deprecated but still emit to avoid breaking user code
9500 }, function () {
9501 return _this2._running = false;
9502 });
9503 }
9504 }
9505 }, {
9506 key: "show",
9507 value: function show() {
9508 var _this3 = this;
9509
9510 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
9511 args[_key] = arguments[_key];
9512 }
9513
9514 return this._setVisible.apply(this, [true].concat(args)).then(function (dialog) {
9515 _this3.visible = true;
9516 return dialog;
9517 });
9518 }
9519 }, {
9520 key: "hide",
9521 value: function hide() {
9522 var _this4 = this;
9523
9524 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
9525 args[_key2] = arguments[_key2];
9526 }
9527
9528 return this._setVisible.apply(this, [false].concat(args)).then(function (dialog) {
9529 _this4.visible = false;
9530 return dialog;
9531 });
9532 }
9533 }, {
9534 key: "toggle",
9535 value: function toggle() {
9536 var _this5 = this;
9537
9538 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
9539 args[_key3] = arguments[_key3];
9540 }
9541
9542 return this._setVisible.apply(this, [!this.visible].concat(args)).then(function (dialog) {
9543 _this5.visible = _this5._visible;
9544 return dialog;
9545 });
9546 }
9547 }, {
9548 key: "_setVisible",
9549 value: function _setVisible(shouldShow) {
9550 var _util$triggerElementE,
9551 _this6 = this;
9552
9553 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
9554 var action = shouldShow ? 'show' : 'hide';
9555 options = _objectSpread2({}, options);
9556 options.animationOptions = util$4.extend(options.animationOptions || {}, this.animationOptions);
9557 var canceled = false;
9558 util$4.triggerElementEvent(this, "pre".concat(action), (_util$triggerElementE = {}, _defineProperty(_util$triggerElementE, this._selfCamelName, this), _defineProperty(_util$triggerElementE, "cancel", function cancel() {
9559 return canceled = true;
9560 }), _util$triggerElementE));
9561
9562 if (canceled) {
9563 return Promise.reject("Canceled in pre".concat(action, " event."));
9564 }
9565
9566 return new Promise(function (resolve) {
9567 _this6._doorLock.waitUnlock(function () {
9568 var unlock = _this6._doorLock.lock();
9569
9570 var animator = _this6._animatorFactory.newAnimator(options);
9571
9572 shouldShow && _this6._toggleStyle(true, options);
9573 _this6._visible = shouldShow;
9574 util$4.iosPageScrollFix(shouldShow);
9575 contentReady(_this6, function () {
9576 animator[action](_this6, function () {
9577 !shouldShow && _this6._toggleStyle(false, options);
9578 unlock();
9579 util$4.propagateAction(_this6, '_' + action);
9580 util$4.triggerElementEvent(_this6, 'post' + action, _defineProperty({}, _this6._selfCamelName, _this6)); // postshow posthide
9581
9582 if (options.callback instanceof Function) {
9583 options.callback(_this6);
9584 }
9585
9586 resolve(_this6);
9587 });
9588 });
9589 });
9590 });
9591 }
9592 }, {
9593 key: "maskColor",
9594 get: function get() {
9595 return this.getAttribute('mask-color');
9596 },
9597 set: function set(value) {
9598 if (value === null || value === undefined) {
9599 this.removeAttribute('mask-color');
9600 } else {
9601 this.setAttribute('mask-color', value);
9602 }
9603 }
9604 }, {
9605 key: "animationOptions",
9606 get: function get() {
9607 return AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options'));
9608 },
9609 set: function set(value) {
9610 if (value === undefined || value === null) {
9611 this.removeAttribute('animation-options');
9612 } else {
9613 this.setAttribute('animation-options', JSON.stringify(value));
9614 }
9615 }
9616 }, {
9617 key: "_updateMask",
9618 value: function _updateMask() {
9619 var _this7 = this;
9620
9621 contentReady(this, function () {
9622 if (_this7._mask) {
9623 _this7._mask.style.backgroundColor = _this7.maskColor;
9624 }
9625 });
9626 }
9627 }, {
9628 key: "_updateAnimation",
9629 value: function _updateAnimation() {
9630 this._animatorFactory = this._updateAnimatorFactory();
9631 }
9632 }, {
9633 key: "connectedCallback",
9634 value: function connectedCallback() {
9635 var _this8 = this;
9636
9637 if (typeof this._backButtonCallback === 'function') {
9638 this.onDeviceBackButton = this._backButtonCallback;
9639 } else if (typeof this._defaultDBB === 'function') {
9640 this.onDeviceBackButton = this._defaultDBB.bind(this);
9641 }
9642
9643 contentReady(this, function () {
9644 if (_this8._mask) {
9645 _this8._mask.addEventListener('click', _this8._cancel, false);
9646 }
9647 });
9648 }
9649 }, {
9650 key: "disconnectedCallback",
9651 value: function disconnectedCallback() {
9652 if (this._backButtonHandler) {
9653 this._backButtonHandler.destroy();
9654
9655 this._backButtonHandler = null;
9656 }
9657
9658 if (this._mask) {
9659 this._mask.removeEventListener('click', this._cancel, false);
9660 }
9661 }
9662 }, {
9663 key: "attributeChangedCallback",
9664 value: function attributeChangedCallback(name, last, current) {
9665 var _this9 = this;
9666
9667 switch (name) {
9668 case 'modifier':
9669 ModifierUtil.onModifierChanged(last, current, this, this._scheme);
9670 break;
9671
9672 case 'animation':
9673 this._updateAnimation();
9674
9675 break;
9676
9677 case 'mask-color':
9678 this._updateMask();
9679
9680 break;
9681
9682 case 'visible':
9683 if (this.visible !== this._visible) {
9684 // update the mask and animation early in case `visible` attribute
9685 // changed callback is called before `animation` or `mask-color`
9686 this._updateMask();
9687
9688 this._updateAnimation();
9689
9690 contentReady(this, function () {
9691 _this9._setVisible(_this9.visible);
9692 });
9693 }
9694
9695 break;
9696 }
9697 }
9698 }], [{
9699 key: "observedAttributes",
9700 get: function get() {
9701 return ['modifier', 'animation', 'mask-color', 'visible'];
9702 }
9703 }, {
9704 key: "events",
9705 get: function get() {
9706 return ['preshow', 'postshow', 'prehide', 'posthide', 'dialogcancel', 'dialog-cancel'];
9707 }
9708 }]);
9709
9710 return BaseDialogElement;
9711 }(BaseElement);
9712 util$4.defineBooleanProperties(BaseDialogElement, ['visible', 'disabled', 'cancelable']);
9713
9714 var scheme$v = {
9715 '.action-sheet': 'action-sheet--*',
9716 '.action-sheet-mask': 'action-sheet-mask--*',
9717 '.action-sheet-title': 'action-sheet-title--*'
9718 };
9719 var _animatorDict$8 = {
9720 'default': function _default() {
9721 return platform.isAndroid() ? MDActionSheetAnimator : IOSActionSheetAnimator;
9722 },
9723 'none': ActionSheetAnimator
9724 };
9725 /**
9726 * @element ons-action-sheet
9727 * @category dialog
9728 * @description
9729 * [en]
9730 * Action/bottom sheet that is displayed on top of current screen.
9731 *
9732 * This element can either be attached directly to the `<body>` or dynamically created from a template using the `ons.createElement(template, { append: true })` utility function and the `<template>` tag.
9733 *
9734 * The action sheet is useful for displaying a list of options and asking the user to make a decision. A `ons-action-sheet-button` is provided for this purpose, although it can contain any type of content.
9735 *
9736 * It will automatically be displayed as Material Design (bottom sheet) when running on an Android device.
9737 * [/en]
9738 * [ja]
9739 * アクションシート、もしくはボトムシートを現在のスクリーン上に表示します。
9740 *
9741 * この要素は、`<body>`要素に直接アタッチされるか、もしくは`ons.createElement(template, { append: true })`と`<template>`タグを使ってテンプレートから動的に生成されます。
9742 *
9743 * アクションシートは、選択肢のリストを表示してユーザーに尋ねるのに便利です。`ons-action-sheet-button`は、この要素の中に置くために提供されていますが、それ以外にも他のどのような要素を含むことができます。
9744 *
9745 * Androidデバイスで実行されるときには、自動的にマテリアルデザイン(ボトムシート)として表示されます。
9746 * [/ja]
9747 * @modifier material
9748 * [en]Display a Material Design bottom sheet.[/en]
9749 * [ja]マテリアルデザインのボトムシートを表示します。[/ja]
9750 * @tutorial vanilla/reference/action-sheet
9751 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
9752 * @seealso ons-popover
9753 * [en]`<ons-popover>` component[/en]
9754 * [ja]ons-popoverコンポーネント[/ja]
9755 * @seealso ons-modal
9756 * [en]`<ons-modal>` component[/en]
9757 * [ja]ons-modalコンポーネント[/ja]
9758 * @example
9759 * <ons-action-sheet id="sheet">
9760 * <ons-action-sheet-button>Label</ons-action-sheet-button>
9761 * <ons-action-sheet-button>Label</ons-action-sheet-button>
9762 * </ons-action-sheet>
9763 *
9764 * <script>
9765 * document.getElementById('sheet').show();
9766 * </script>
9767 */
9768
9769 var ActionSheetElement = /*#__PURE__*/function (_BaseDialogElement) {
9770 _inherits(ActionSheetElement, _BaseDialogElement);
9771
9772 var _super = _createSuper(ActionSheetElement);
9773
9774 /**
9775 * @event preshow
9776 * @description
9777 * [en]Fired just before the action sheet is displayed.[/en]
9778 * [ja]ダイアログが表示される直前に発火します。[/ja]
9779 * @param {Object} event [en]Event object.[/en]
9780 * @param {Object} event.actionSheet
9781 * [en]Component object.[/en]
9782 * [ja]コンポーネントのオブジェクト。[/ja]
9783 * @param {Function} event.cancel
9784 * [en]Execute this function to stop the action sheet from being shown.[/en]
9785 * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
9786 */
9787
9788 /**
9789 * @event postshow
9790 * @description
9791 * [en]Fired just after the action sheet is displayed.[/en]
9792 * [ja]ダイアログが表示された直後に発火します。[/ja]
9793 * @param {Object} event [en]Event object.[/en]
9794 * @param {Object} event.actionSheet
9795 * [en]Component object.[/en]
9796 * [ja]コンポーネントのオブジェクト。[/ja]
9797 */
9798
9799 /**
9800 * @event prehide
9801 * @description
9802 * [en]Fired just before the action sheet is hidden.[/en]
9803 * [ja]ダイアログが隠れる直前に発火します。[/ja]
9804 * @param {Object} event [en]Event object.[/en]
9805 * @param {Object} event.actionSheet
9806 * [en]Component object.[/en]
9807 * [ja]コンポーネントのオブジェクト。[/ja]
9808 * @param {Function} event.cancel
9809 * [en]Execute this function to stop the action sheet from being hidden.[/en]
9810 * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
9811 */
9812
9813 /**
9814 * @event posthide
9815 * @description
9816 * [en]Fired just after the action sheet is hidden.[/en]
9817 * [ja]ダイアログが隠れた後に発火します。[/ja]
9818 * @param {Object} event [en]Event object.[/en]
9819 * @param {Object} event.actionSheet
9820 * [en]Component object.[/en]
9821 * [ja]コンポーネントのオブジェクト。[/ja]
9822 */
9823
9824 /**
9825 * @event dialogcancel
9826 * @description
9827 * [en]Fired when the action sheet is canceled.[/en]
9828 * [ja][/ja]
9829 */
9830
9831 /**
9832 * @attribute title
9833 * @type {String}
9834 * @description
9835 * [en]Optional title of the action sheet. A new element will be created containing this string.[/en]
9836 * [ja]アクションシートのタイトルを指定します。ここで指定した文字列を含む新しい要素が作成されます。[/ja]
9837 */
9838
9839 /**
9840 * @property title
9841 * @type {String}
9842 * @description
9843 * [en]Optional title of the action sheet. A new element will be created containing this string.[/en]
9844 * [ja]アクションシートのタイトルを指定します。ここで指定した文字列を含む新しい要素が作成されます。[/ja]
9845 */
9846
9847 /**
9848 * @attribute modifier
9849 * @type {String}
9850 * @description
9851 * [en]The appearance of the action sheet.[/en]
9852 * [ja]ダイアログの表現を指定します。[/ja]
9853 */
9854
9855 /**
9856 * @attribute cancelable
9857 * @description
9858 * [en]If this attribute is set the action sheet can be closed by tapping the background or by pressing the back button on Android devices.[/en]
9859 * [ja]この属性が設定されると、アクションシートの背景やAndroidデバイスのバックボタンを推すことでアクションシートが閉じるようになります。[/ja]
9860 */
9861
9862 /**
9863 * @attribute disabled
9864 * @description
9865 * [en]If this attribute is set the action sheet is disabled.[/en]
9866 * [ja]この属性がある時、ダイアログはdisabled状態になります。[/ja]
9867 */
9868
9869 /**
9870 * @attribute animation
9871 * @type {String}
9872 * @default default
9873 * @description
9874 * [en]The animation used when showing and hiding the action sheet. Can be either `"none"` or `"default"`.[/en]
9875 * [ja]ダイアログを表示する際のアニメーション名を指定します。"none"もしくは"default"を指定できます。[/ja]
9876 */
9877
9878 /**
9879 * @attribute animation-options
9880 * @type {Expression}
9881 * @description
9882 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
9883 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
9884 */
9885
9886 /**
9887 * @property animationOptions
9888 * @type {Object}
9889 * @description
9890 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
9891 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
9892 */
9893
9894 /**
9895 * @attribute mask-color
9896 * @type {String}
9897 * @default rgba(0, 0, 0, 0.2)
9898 * @description
9899 * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
9900 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
9901 */
9902
9903 /**
9904 * @attribute visible
9905 * @type {Boolean}
9906 * @description
9907 * [en]Whether the action sheet is visible or not.[/en]
9908 * [ja]要素が見える場合に`true`。[/ja]
9909 */
9910 function ActionSheetElement() {
9911 var _this;
9912
9913 _classCallCheck(this, ActionSheetElement);
9914
9915 _this = _super.call(this);
9916 contentReady(_assertThisInitialized(_this), function () {
9917 return _this._compile();
9918 });
9919 return _this;
9920 }
9921
9922 _createClass(ActionSheetElement, [{
9923 key: "_scheme",
9924 get: function get() {
9925 return scheme$v;
9926 }
9927 }, {
9928 key: "_mask",
9929 get: function get() {
9930 return util$4.findChild(this, '.action-sheet-mask');
9931 }
9932 }, {
9933 key: "_sheet",
9934 get: function get() {
9935 return util$4.findChild(this, '.action-sheet');
9936 }
9937 }, {
9938 key: "_title",
9939 get: function get() {
9940 return this.querySelector('.action-sheet-title');
9941 }
9942 }, {
9943 key: "_updateAnimatorFactory",
9944 value: function _updateAnimatorFactory() {
9945 return new AnimatorFactory({
9946 animators: _animatorDict$8,
9947 baseClass: ActionSheetAnimator,
9948 baseClassName: 'ActionSheetAnimator',
9949 defaultAnimation: this.getAttribute('animation')
9950 });
9951 }
9952 }, {
9953 key: "_compile",
9954 value: function _compile() {
9955 autoStyle.prepare(this);
9956 this.style.display = 'none';
9957 this.style.zIndex = 10001;
9958 /* Expected result:
9959 * <ons-action-sheet>
9960 * <div class="action-sheet-mask"></div>
9961 * <div class="action-sheet">
9962 * <div class="action-sheet-title></div>
9963 * ...
9964 * </div>
9965 * </ons-action-sheet>
9966 */
9967
9968 if (!this._sheet) {
9969 var sheet = document.createElement('div');
9970 sheet.classList.add('action-sheet');
9971
9972 while (this.firstChild) {
9973 sheet.appendChild(this.firstChild);
9974 }
9975
9976 this.appendChild(sheet);
9977 }
9978
9979 if (!this._title) {
9980 var title = document.createElement('div');
9981 title.classList.add('action-sheet-title');
9982
9983 if (this.title) {
9984 title.innerHTML = this.title;
9985 } else {
9986 title.hidden = true;
9987 }
9988
9989 this._sheet.insertBefore(title, this._sheet.firstChild);
9990 }
9991
9992 if (!this._mask) {
9993 var mask = document.createElement('div');
9994 mask.classList.add('action-sheet-mask');
9995 this.insertBefore(mask, this.firstChild);
9996 }
9997
9998 this._sheet.style.zIndex = 20001;
9999 this._mask.style.zIndex = 20000;
10000 ModifierUtil.initModifier(this, this._scheme);
10001 }
10002 }, {
10003 key: "_updateTitle",
10004 value: function _updateTitle() {
10005 if (this._title) {
10006 if (!this.title) {
10007 this._title.hidden = true;
10008 } else {
10009 this._title.innerHTML = this.title;
10010 this._title.hidden = false;
10011 }
10012 }
10013 }
10014 }, {
10015 key: "title",
10016 get: function get() {
10017 return this.getAttribute('title');
10018 },
10019 set: function set(value) {
10020 if (value === null || value === undefined) {
10021 this.removeAttribute('title');
10022 } else {
10023 this.setAttribute('title', value);
10024 }
10025 }
10026 /**
10027 * @property onDeviceBackButton
10028 * @type {Object}
10029 * @description
10030 * [en]Back-button handler.[/en]
10031 * [ja]バックボタンハンドラ。[/ja]
10032 */
10033
10034 /**
10035 * @property maskColor
10036 * @type {String}
10037 * @default rgba(0, 0, 0, 0.2)
10038 * @description
10039 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
10040 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
10041 */
10042
10043 /**
10044 * @method show
10045 * @signature show([options])
10046 * @param {Object} [options]
10047 * [en]Parameter object.[/en]
10048 * [ja]オプションを指定するオブジェクト。[/ja]
10049 * @param {String} [options.animation]
10050 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
10051 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定します。[/ja]
10052 * @param {String} [options.animationOptions]
10053 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
10054 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
10055 * @param {Function} [options.callback]
10056 * [en]This function is called after the action sheet has been revealed.[/en]
10057 * [ja]ダイアログが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
10058 * @description
10059 * [en]Show the action sheet.[/en]
10060 * [ja]ダイアログを開きます。[/ja]
10061 * @return {Promise} Resolves to the displayed element.
10062 */
10063
10064 /**
10065 * @method hide
10066 * @signature hide([options])
10067 * @param {Object} [options]
10068 * [en]Parameter object.[/en]
10069 * [ja]オプションを指定するオブジェクト。[/ja]
10070 * @param {String} [options.animation]
10071 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
10072 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定できます。[/ja]
10073 * @param {String} [options.animationOptions]
10074 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
10075 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/ja]
10076 * @param {Function} [options.callback]
10077 * [en]This functions is called after the action sheet has been hidden.[/en]
10078 * [ja]ダイアログが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
10079 * @description
10080 * [en]Hide the action sheet.[/en]
10081 * [ja]ダイアログを閉じます。[/ja]
10082 * @return {Promise}
10083 * [en]Resolves to the hidden element[/en]
10084 * [ja]隠れた要素を解決します。[/ja]
10085 */
10086
10087 /**
10088 * @property visible
10089 * @type {Boolean}
10090 * @description
10091 * [en]Whether the action sheet is visible or not.[/en]
10092 * [ja]要素が見える場合に`true`。[/ja]
10093 */
10094
10095 /**
10096 * @property disabled
10097 * @type {Boolean}
10098 * @description
10099 * [en]Whether the action sheet is disabled or not.[/en]
10100 * [ja]無効化されている場合に`true`。[/ja]
10101 */
10102
10103 /**
10104 * @property cancelable
10105 * @type {Boolean}
10106 * @description
10107 * [en]Whether the action sheet is cancelable or not. A cancelable action sheet can be closed by tapping the background or by pressing the back button on Android devices.[/en]
10108 * [ja]アクションシートがキャンセル可能かどうかを設定します。キャンセル可能なアクションシートは、背景をタップしたりAndroidデバイスのバックボタンを推すことで閉じるようになります。[/ja]
10109 */
10110
10111 }, {
10112 key: "attributeChangedCallback",
10113 value: function attributeChangedCallback(name, last, current) {
10114 if (name === 'title') {
10115 this._updateTitle();
10116 } else {
10117 _get(_getPrototypeOf(ActionSheetElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
10118 }
10119 }
10120 /**
10121 * @param {String} name
10122 * @param {ActionSheetAnimator} Animator
10123 */
10124
10125 }], [{
10126 key: "observedAttributes",
10127 get: function get() {
10128 return [].concat(_toConsumableArray(_get(_getPrototypeOf(ActionSheetElement), "observedAttributes", this)), ['title']);
10129 }
10130 }, {
10131 key: "registerAnimator",
10132 value: function registerAnimator(name, Animator) {
10133 if (!(Animator.prototype instanceof ActionSheetAnimator)) {
10134 util$4.throwAnimator('ActionSheet');
10135 }
10136
10137 _animatorDict$8[name] = Animator;
10138 }
10139 }, {
10140 key: "animators",
10141 get: function get() {
10142 return _animatorDict$8;
10143 }
10144 }, {
10145 key: "ActionSheetAnimator",
10146 get: function get() {
10147 return ActionSheetAnimator;
10148 }
10149 }]);
10150
10151 return ActionSheetElement;
10152 }(BaseDialogElement);
10153 onsElements.ActionSheet = ActionSheetElement;
10154 customElements.define('ons-action-sheet', ActionSheetElement);
10155
10156 /**
10157 * @class AnimatorCSS - implementation of Animator class using css transitions
10158 */
10159
10160 var AnimatorCSS = /*#__PURE__*/function () {
10161 function AnimatorCSS() {
10162 _classCallCheck(this, AnimatorCSS);
10163
10164 this._queue = [];
10165 this._index = 0;
10166 }
10167
10168 _createClass(AnimatorCSS, [{
10169 key: "animate",
10170 value:
10171 /**
10172 * @method animate
10173 * @desc main animation function
10174 * @param {Element} element
10175 * @param {Object} finalCSS
10176 * @param {number} [duration=200] - duration in milliseconds
10177 * @return {Object} result
10178 * @return {Function} result.then(callback) - sets a callback to be executed after the animation has stopped
10179 * @return {Function} result.stop(options) - stops the animation; if options.stopNext is true then it doesn't call the callback
10180 * @return {Function} result.finish(ms) - finishes the animation in the specified time in milliseconds
10181 * @return {Function} result.speed(ms) - sets the animation speed so that it finishes as if the original duration was the one specified here
10182 * @example
10183 * ````
10184 * var result = animator.animate(el, {opacity: 0.5}, 1000);
10185 *
10186 * el.addEventListener('click', function(e){
10187 * result.speed(200).then(function(){
10188 * console.log('done');
10189 * });
10190 * }, 300);
10191 * ````
10192 */
10193 function animate(el, final) {
10194 var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 200;
10195 var start = new Date().getTime(),
10196 initial = {},
10197 stopped = false,
10198 next = false,
10199 timeout = false,
10200 properties = Object.keys(final);
10201
10202 var updateStyles = function updateStyles() {
10203 var s = window.getComputedStyle(el);
10204 properties.forEach(s.getPropertyValue.bind(s));
10205 s = el.offsetHeight;
10206 };
10207
10208 var result = {
10209 stop: function stop() {
10210 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10211 timeout && clearTimeout(timeout);
10212 var k = Math.min(1, (new Date().getTime() - start) / duration);
10213 properties.forEach(function (i) {
10214 el.style[i] = (1 - k) * initial[i] + k * final[i] + (i == 'opacity' ? '' : 'px');
10215 });
10216 el.style.transitionDuration = '0s';
10217
10218 if (options.stopNext) {
10219 next = false;
10220 } else if (!stopped) {
10221 stopped = true;
10222 next && next();
10223 }
10224
10225 return result;
10226 },
10227 then: function then(cb) {
10228 next = cb;
10229
10230 if (stopped) {
10231 next && next();
10232 }
10233
10234 return result;
10235 },
10236 speed: function speed(newDuration) {
10237 if (internal$1.config.animationsDisabled) {
10238 newDuration = 0;
10239 }
10240
10241 if (!stopped) {
10242 timeout && clearTimeout(timeout);
10243 var passed = new Date().getTime() - start;
10244 var k = passed / duration;
10245 var remaining = newDuration * (1 - k);
10246 properties.forEach(function (i) {
10247 el.style[i] = (1 - k) * initial[i] + k * final[i] + (i == 'opacity' ? '' : 'px');
10248 });
10249 updateStyles();
10250 start = el.speedUpTime;
10251 duration = remaining;
10252 el.style.transitionDuration = duration / 1000 + 's';
10253 properties.forEach(function (i) {
10254 el.style[i] = final[i] + (i == 'opacity' ? '' : 'px');
10255 });
10256 timeout = setTimeout(result.stop, remaining);
10257 }
10258
10259 return result;
10260 },
10261 finish: function finish() {
10262 var milliseconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 50;
10263 var k = (new Date().getTime() - start) / duration;
10264 result.speed(milliseconds / (1 - k));
10265 return result;
10266 }
10267 };
10268
10269 if (el.hasAttribute('disabled') || stopped || internal$1.config.animationsDisabled) {
10270 return result;
10271 }
10272
10273 var style = window.getComputedStyle(el);
10274 properties.forEach(function (e) {
10275 var v = parseFloat(style.getPropertyValue(e));
10276 initial[e] = isNaN(v) ? 0 : v;
10277 });
10278
10279 if (!stopped) {
10280 el.style.transitionProperty = properties.join(',');
10281 el.style.transitionDuration = duration / 1000 + 's';
10282 properties.forEach(function (e) {
10283 el.style[e] = final[e] + (e == 'opacity' ? '' : 'px');
10284 });
10285 }
10286
10287 timeout = setTimeout(result.stop, duration);
10288
10289 this._onStopAnimations(el, result.stop);
10290
10291 return result;
10292 }
10293 }, {
10294 key: "_onStopAnimations",
10295 value: function _onStopAnimations(el, listener) {
10296 var queue = this._queue;
10297 var i = this._index++;
10298 queue[el] = queue[el] || [];
10299
10300 queue[el][i] = function (options) {
10301 delete queue[el][i];
10302
10303 if (queue[el] && queue[el].length == 0) {
10304 delete queue[el];
10305 }
10306
10307 return listener(options);
10308 };
10309 }
10310 /**
10311 * @method stopAnimations
10312 * @desc stops active animations on a specified element
10313 * @param {Element|Array} element - element or array of elements
10314 * @param {Object} [options={}]
10315 * @param {Boolean} [options.stopNext] - the callbacks after the animations won't be called if this option is true
10316 */
10317
10318 }, {
10319 key: "stopAnimations",
10320 value: function stopAnimations(el) {
10321 var _this = this;
10322
10323 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
10324
10325 if (Array.isArray(el)) {
10326 return el.forEach(function (el) {
10327 _this.stopAnimations(el, options);
10328 });
10329 }
10330
10331 (this._queue[el] || []).forEach(function (e) {
10332 e(options || {});
10333 });
10334 }
10335 /**
10336 * @method stopAll
10337 * @desc stops all active animations
10338 * @param {Object} [options={}]
10339 * @param {Boolean} [options.stopNext] - the callbacks after the animations won't be called if this option is true
10340 */
10341
10342 }, {
10343 key: "stopAll",
10344 value: function stopAll() {
10345 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10346 this.stopAnimations(Object.keys(this._queue), options);
10347 }
10348 /**
10349 * @method fade
10350 * @desc fades the element (short version for animate(el, {opacity: 0}))
10351 * @param {Element} element
10352 * @param {number} [duration=200]
10353 */
10354
10355 }, {
10356 key: "fade",
10357 value: function fade(el) {
10358 var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;
10359 return this.animate(el, {
10360 opacity: 0
10361 }, duration);
10362 }
10363 }]);
10364
10365 return AnimatorCSS;
10366 }();
10367
10368 var defaultClassName$h = 'ripple';
10369 var scheme$u = {
10370 '': 'ripple--*',
10371 '.ripple__wave': 'ripple--*__wave',
10372 '.ripple__background': 'ripple--*__background'
10373 };
10374 /**
10375 * @element ons-ripple
10376 * @category visual
10377 * @description
10378 * [en]
10379 * Adds a Material Design "ripple" effect to an element. The ripple effect will spread from the position where the user taps.
10380 *
10381 * Some elements such as `<ons-button>` and `<ons-fab>` support a `ripple` attribute.
10382 * [/en]
10383 * [ja]マテリアルデザインのリップル効果をDOM要素に追加します。[/ja]
10384 * @codepen wKQWdZ
10385 * @tutorial vanilla/Reference/ripple
10386 * @modifier light-gray
10387 * [en]Change the color of effects to light gray.[/en]
10388 * [ja]エフェクトの色が明るい灰色になります。[/ja]
10389 * @guide theming.html#cross-platform-styling-autostyling
10390 * [en]Cross platform styling[/en]
10391 * [ja]Cross platform styling[/ja]
10392 * @example
10393 * <div class="my-div">
10394 * <ons-ripple></ons-ripple>
10395 * </div>
10396 *
10397 * @example
10398 * <ons-button ripple>Click me!</ons-button>
10399 */
10400
10401 var RippleElement = /*#__PURE__*/function (_BaseElement) {
10402 _inherits(RippleElement, _BaseElement);
10403
10404 var _super = _createSuper(RippleElement);
10405
10406 /**
10407 * @attribute color
10408 * @type {String}
10409 * @description
10410 * [en]Color of the ripple effect.[/en]
10411 * [ja]リップルエフェクトの色を指定します。[/ja]
10412 */
10413
10414 /**
10415 * @attribute modifier
10416 * @type {String}
10417 * @description
10418 * [en]The appearance of the ripple effect.[/en]
10419 * [ja]エフェクトの表現を指定します。[/ja]
10420 */
10421
10422 /**
10423 * @attribute background
10424 * @type {String}
10425 * @description
10426 * [en]Color of the background.[/en]
10427 * [ja]背景の色を設定します。[/ja]
10428 */
10429
10430 /**
10431 * @attribute size
10432 * @type {String}
10433 * @description
10434 * [en]Sizing of the wave on ripple effect. Set "cover" or "contain". Default is "cover".[/en]
10435 * [ja]エフェクトのサイズを指定します。"cover"もしくは"contain"を指定します。デフォルトは"cover"です。[/ja]
10436 */
10437
10438 /**
10439 * @attribute center
10440 * @type {Boolean}
10441 * @description
10442 * [en]If this attribute presents, change the position of wave effect to center of the target element.[/en]
10443 * [ja]この要素を設定すると、エフェクトの位置が要素の真ん中から始まります。[/ja]
10444 */
10445
10446 /**
10447 * @property center
10448 * @type {Boolean}
10449 * @description
10450 * [en]If this attribute presents, change the position of wave effect to center of the target element.[/en]
10451 * [ja]この要素を設定すると、エフェクトの位置が要素の真ん中から始まります。[/ja]
10452 */
10453
10454 /**
10455 * @attribute disabled
10456 * @description
10457 * [en]If this attribute is set, the ripple effect will be disabled.[/en]
10458 * [ja]この属性が設定された場合、リップルエフェクトは無効になります。[/ja]
10459 */
10460 function RippleElement() {
10461 var _this;
10462
10463 _classCallCheck(this, RippleElement);
10464
10465 _this = _super.call(this);
10466 _this._onTap = _this._onTap.bind(_assertThisInitialized(_this));
10467 _this._onHold = _this._onHold.bind(_assertThisInitialized(_this));
10468 _this._onDragStart = _this._onDragStart.bind(_assertThisInitialized(_this));
10469 _this._onRelease = _this._onRelease.bind(_assertThisInitialized(_this));
10470 contentReady(_assertThisInitialized(_this), function () {
10471 return _this._compile();
10472 });
10473 _this._animator = new AnimatorCSS();
10474 ['color', 'center', 'start-radius', 'background', 'modifier'].forEach(function (e) {
10475 _this.attributeChangedCallback(e, null, _this.getAttribute(e));
10476 });
10477 return _this;
10478 }
10479
10480 _createClass(RippleElement, [{
10481 key: "_compile",
10482 value: function _compile() {
10483 this.classList.add(defaultClassName$h);
10484 this._wave = this.getElementsByClassName('ripple__wave')[0];
10485 this._background = this.getElementsByClassName('ripple__background')[0];
10486
10487 if (!(this._background && this._wave)) {
10488 this._wave = util$4.create('.ripple__wave');
10489 this._background = util$4.create('.ripple__background');
10490 this.appendChild(this._wave);
10491 this.appendChild(this._background);
10492 }
10493
10494 ModifierUtil.initModifier(this, scheme$u);
10495 }
10496 }, {
10497 key: "_getEffectSize",
10498 value: function _getEffectSize() {
10499 var sizes = ['cover', 'contain'];
10500
10501 if (this.hasAttribute('size')) {
10502 var size = this.getAttribute('size');
10503
10504 if (sizes.indexOf(size) !== -1) {
10505 return size;
10506 }
10507 }
10508
10509 return 'cover';
10510 }
10511 }, {
10512 key: "_calculateCoords",
10513 value: function _calculateCoords(e) {
10514 var x, y, h, w, r;
10515 var b = this.getBoundingClientRect();
10516
10517 var size = this._getEffectSize();
10518
10519 var error = function error() {
10520 return util$4.throw('Ripple invalid state');
10521 };
10522
10523 if (this._center) {
10524 x = b.width / 2;
10525 y = b.height / 2;
10526
10527 if (size === 'cover') {
10528 r = Math.sqrt(x * x + y * y);
10529 } else if (size === 'contain') {
10530 r = Math.min(x, y);
10531 } else {
10532 error();
10533 }
10534 } else {
10535 x = (typeof e.clientX === 'number' ? e.clientX : e.changedTouches[0].clientX) - b.left;
10536 y = (typeof e.clientY === 'number' ? e.clientY : e.changedTouches[0].clientY) - b.top;
10537 h = Math.max(y, b.height - y);
10538 w = Math.max(x, b.width - x);
10539
10540 if (size === 'cover') {
10541 r = Math.sqrt(h * h + w * w);
10542 } else if (size === 'contain') {
10543 r = Math.min(Math.round(h / 2), Math.round(w / 2));
10544 } else {
10545 error();
10546 }
10547 }
10548
10549 return {
10550 x: x,
10551 y: y,
10552 r: r
10553 };
10554 }
10555 }, {
10556 key: "_rippleAnimation",
10557 value: function _rippleAnimation(e) {
10558 var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 300;
10559 var _animator = this._animator,
10560 _wave = this._wave,
10561 _background = this._background,
10562 _minR = this._minR;
10563
10564 var _this$_calculateCoord = this._calculateCoords(e),
10565 x = _this$_calculateCoord.x,
10566 y = _this$_calculateCoord.y,
10567 r = _this$_calculateCoord.r;
10568
10569 _animator.stopAll({
10570 stopNext: 1
10571 });
10572
10573 _animator.animate(_background, {
10574 opacity: 1
10575 }, duration);
10576
10577 util$4.extend(_wave.style, {
10578 opacity: 1,
10579 top: y - _minR + 'px',
10580 left: x - _minR + 'px',
10581 width: 2 * _minR + 'px',
10582 height: 2 * _minR + 'px'
10583 });
10584 return _animator.animate(_wave, {
10585 top: y - r,
10586 left: x - r,
10587 height: 2 * r,
10588 width: 2 * r
10589 }, duration);
10590 }
10591 }, {
10592 key: "_updateParent",
10593 value: function _updateParent() {
10594 if (!this._parentUpdated && this.parentNode) {
10595 var computedStyle = window.getComputedStyle(this.parentNode);
10596
10597 if (computedStyle.getPropertyValue('position') === 'static') {
10598 this.parentNode.style.position = 'relative';
10599 }
10600
10601 this._parentUpdated = true;
10602 }
10603 }
10604 }, {
10605 key: "_onTap",
10606 value: function _onTap(e) {
10607 var _this2 = this;
10608
10609 if (!this.disabled && !e.ripple) {
10610 e.ripple = true;
10611
10612 this._updateParent();
10613
10614 this._rippleAnimation(e.gesture.srcEvent).then(function () {
10615 _this2._animator.fade(_this2._wave);
10616
10617 _this2._animator.fade(_this2._background);
10618 });
10619 }
10620 }
10621 }, {
10622 key: "_onHold",
10623 value: function _onHold(e) {
10624 if (!this.disabled && !e.ripple) {
10625 e.ripple = true;
10626
10627 this._updateParent();
10628
10629 this._holding = this._rippleAnimation(e.gesture.srcEvent, 2000);
10630 document.addEventListener('release', this._onRelease);
10631 }
10632 }
10633 }, {
10634 key: "_onRelease",
10635 value: function _onRelease(e) {
10636 var _this3 = this;
10637
10638 if (this._holding && !e.ripple) {
10639 e.ripple = true;
10640
10641 this._holding.speed(300).then(function () {
10642 _this3._animator.stopAll({
10643 stopNext: true
10644 });
10645
10646 _this3._animator.fade(_this3._wave);
10647
10648 _this3._animator.fade(_this3._background);
10649 });
10650
10651 this._holding = false;
10652 }
10653
10654 document.removeEventListener('release', this._onRelease);
10655 }
10656 }, {
10657 key: "_onDragStart",
10658 value: function _onDragStart(e) {
10659 if (this._holding) {
10660 return this._onRelease(e);
10661 }
10662
10663 if (['left', 'right'].indexOf(e.gesture.direction) != -1) {
10664 this._onTap(e);
10665 }
10666 }
10667 }, {
10668 key: "connectedCallback",
10669 value: function connectedCallback() {
10670 this._parentNode = this.parentNode;
10671
10672 if (internal$1.config.animationsDisabled) {
10673 this.disabled = true;
10674 } else {
10675 this._parentNode.addEventListener('tap', this._onTap);
10676
10677 this._parentNode.addEventListener('hold', this._onHold);
10678
10679 this._parentNode.addEventListener('dragstart', this._onDragStart);
10680 }
10681 }
10682 }, {
10683 key: "disconnectedCallback",
10684 value: function disconnectedCallback() {
10685 var pn = this._parentNode || this.parentNode;
10686 pn.removeEventListener('tap', this._onTap);
10687 pn.removeEventListener('hold', this._onHold);
10688 pn.removeEventListener('dragstart', this._onDragStart);
10689 }
10690 }, {
10691 key: "attributeChangedCallback",
10692 value: function attributeChangedCallback(name, last, current) {
10693 var _this4 = this;
10694
10695 switch (name) {
10696 case 'class':
10697 util$4.restoreClass(this, defaultClassName$h, scheme$u);
10698 break;
10699
10700 case 'modifier':
10701 ModifierUtil.onModifierChanged(last, current, this, scheme$u);
10702 break;
10703
10704 case 'start-radius':
10705 this._minR = Math.max(0, parseFloat(current) || 0);
10706 break;
10707
10708 case 'color':
10709 if (current) {
10710 contentReady(this, function () {
10711 _this4._wave.style.background = current;
10712
10713 if (!_this4.hasAttribute('background')) {
10714 _this4._background.style.background = current;
10715 }
10716 });
10717 }
10718
10719 break;
10720
10721 case 'background':
10722 if (current || last) {
10723 if (current === 'none') {
10724 contentReady(this, function () {
10725 _this4._background.setAttribute('disabled', 'disabled');
10726
10727 _this4._background.style.background = 'transparent';
10728 });
10729 } else {
10730 contentReady(this, function () {
10731 if (_this4._background.hasAttribute('disabled')) {
10732 _this4._background.removeAttribute('disabled');
10733 }
10734
10735 _this4._background.style.background = current;
10736 });
10737 }
10738 }
10739
10740 break;
10741
10742 case 'center':
10743 if (name === 'center') {
10744 this._center = current != null && current != 'false';
10745 }
10746
10747 break;
10748 }
10749 }
10750 /**
10751 * @property disabled
10752 * @type {Boolean}
10753 * @description
10754 * [en]Whether the element is disabled or not.[/en]
10755 * [ja]無効化されている場合に`true`。[/ja]
10756 */
10757
10758 }], [{
10759 key: "observedAttributes",
10760 get: function get() {
10761 return ['start-radius', 'color', 'background', 'center', 'class', 'modifier'];
10762 }
10763 }]);
10764
10765 return RippleElement;
10766 }(BaseElement);
10767 util$4.defineBooleanProperties(RippleElement, ['disabled', 'center']);
10768 onsElements.Ripple = RippleElement;
10769 customElements.define('ons-ripple', RippleElement);
10770
10771 var BaseButtonElement = /*#__PURE__*/function (_BaseElement) {
10772 _inherits(BaseButtonElement, _BaseElement);
10773
10774 var _super = _createSuper(BaseButtonElement);
10775
10776 function BaseButtonElement() {
10777 var _this;
10778
10779 _classCallCheck(this, BaseButtonElement);
10780
10781 _this = _super.call(this);
10782
10783 if (_this.constructor === BaseButtonElement) {
10784 util$4.throwAbstract();
10785 }
10786
10787 contentReady(_assertThisInitialized(_this), function () {
10788 return _this._compile();
10789 });
10790 return _this;
10791 }
10792
10793 _createClass(BaseButtonElement, [{
10794 key: "_scheme",
10795 get: function get() {
10796 // eslint-disable-line getter-return
10797 util$4.throwMember();
10798 }
10799 }, {
10800 key: "_defaultClassName",
10801 get: function get() {
10802 // eslint-disable-line getter-return
10803 util$4.throwMember();
10804 }
10805 }, {
10806 key: "_rippleOpt",
10807 get: function get() {
10808 return [this];
10809 }
10810 }, {
10811 key: "_icon",
10812 get: function get() {
10813 return util$4.findChild(this, 'ons-icon');
10814 }
10815 }, {
10816 key: "_hiddenButton",
10817 get: function get() {
10818 return util$4.findChild(this, 'button');
10819 }
10820 }, {
10821 key: "_compile",
10822 value: function _compile() {
10823 autoStyle.prepare(this);
10824 this.classList.add(this._defaultClassName);
10825
10826 if (!this._icon && this.hasAttribute('icon')) {
10827 util$4.checkMissingImport('Icon');
10828 var icon = util$4.createElement("<ons-icon icon=\"".concat(this.getAttribute('icon'), "\"></ons-icon>"));
10829 icon.classList.add(this._defaultClassName.replace('button', 'icon'));
10830 this.insertBefore(icon, this.firstChild);
10831 } // Add hidden button to allow form submission
10832
10833
10834 if (!this._hiddenButton) {
10835 var button = util$4.createElement('<button hidden></button>');
10836 this.appendChild(button);
10837 }
10838
10839 this._updateRipple();
10840
10841 ModifierUtil.initModifier(this, this._scheme);
10842 }
10843 }, {
10844 key: "_updateIcon",
10845 value: function _updateIcon() {
10846 if (this._icon) {
10847 this._icon.setAttribute('icon', this.getAttribute('icon'));
10848 }
10849 }
10850 }, {
10851 key: "_updateRipple",
10852 value: function _updateRipple() {
10853 this._rippleOpt && util$4.updateRipple.apply(util$4, _toConsumableArray(this._rippleOpt));
10854 }
10855 }, {
10856 key: "attributeChangedCallback",
10857 value: function attributeChangedCallback(name, last, current) {
10858 switch (name) {
10859 case 'class':
10860 util$4.restoreClass(this, this._defaultClassName, this._scheme);
10861 break;
10862
10863 case 'modifier':
10864 ModifierUtil.onModifierChanged(last, current, this, this._scheme);
10865 break;
10866
10867 case 'icon':
10868 this._updateIcon();
10869
10870 break;
10871
10872 case 'ripple':
10873 this.classList.contains(this._defaultClassName) && this._updateRipple();
10874 break;
10875 }
10876 }
10877 }], [{
10878 key: "observedAttributes",
10879 get: function get() {
10880 return ['modifier', 'class', 'icon', 'ripple'];
10881 }
10882 }]);
10883
10884 return BaseButtonElement;
10885 }(BaseElement);
10886 util$4.defineBooleanProperties(BaseButtonElement, ['ripple', 'disabled']);
10887
10888 /**
10889 * @element ons-action-sheet-button
10890 * @category dialog
10891 * @modifier destructive
10892 * [en]Shows a "destructive" button (only for iOS).[/en]
10893 * [ja]"destructive"なボタンを表示します(iOSでのみ有効)。[/ja]
10894 * @description
10895 * [en]Component that represent each button of the action sheet.[/en]
10896 * [ja]アクションシートに表示される各ボタンを表現するコンポーネントです。[/ja]
10897 * @seealso ons-action-sheet
10898 * [en]The `<ons-action-sheet>` component[/en]
10899 * [ja]ons-action-sheetコンポーネント[/ja]
10900 * @seealso ons-list-item
10901 * [en]The `<ons-list-item>` component[/en]
10902 * [ja]ons-list-itemコンポーネント[/ja]
10903 * @seealso ons-icon
10904 * [en]The `<ons-icon>` component[/en]
10905 * [ja]ons-iconコンポーネント[/ja]
10906 * @tutorial vanilla/Reference/action-sheet
10907 * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
10908 * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
10909 * @modifier material
10910 * [en]Display a Material Design action sheet button.[/en]
10911 * [ja]マテリアルデザインのアクションシート用のボタンを表示します。[/ja]
10912 * @example
10913 * <ons-action-sheet id="sheet">
10914 * <ons-action-sheet-button>Label</ons-action-sheet-button>
10915 * <ons-action-sheet-button>Label</ons-action-sheet-button>
10916 * </ons-action-sheet>
10917 *
10918 * <script>
10919 * document.getElementById('sheet').show();
10920 * </script>
10921 */
10922
10923 var ActionSheetButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
10924 _inherits(ActionSheetButtonElement, _BaseButtonElement);
10925
10926 var _super = _createSuper(ActionSheetButtonElement);
10927
10928 function ActionSheetButtonElement() {
10929 _classCallCheck(this, ActionSheetButtonElement);
10930
10931 return _super.apply(this, arguments);
10932 }
10933
10934 _createClass(ActionSheetButtonElement, [{
10935 key: "_scheme",
10936 get:
10937 /**
10938 * @attribute icon
10939 * @type {String}
10940 * @description
10941 * [en]Creates an `ons-icon` component with this string. Only visible on Android. Check [See also](#seealso) section for more information.[/en]
10942 * [ja]`ons-icon`コンポーネントを悪性します。Androidでのみ表示されます。[/ja]
10943 */
10944
10945 /**
10946 * @attribute modifier
10947 * @type {String}
10948 * @description
10949 * [en]The appearance of the action sheet button.[/en]
10950 * [ja]アクションシートボタンの見た目を設定します。[/ja]
10951 */
10952 function get() {
10953 return {
10954 '': 'action-sheet-button--*',
10955 '.action-sheet-icon': 'action-sheet-icon--*'
10956 };
10957 }
10958 }, {
10959 key: "_defaultClassName",
10960 get: function get() {
10961 return 'action-sheet-button';
10962 }
10963 }, {
10964 key: "_rippleOpt",
10965 get: function get() {
10966 return undefined;
10967 }
10968 }]);
10969
10970 return ActionSheetButtonElement;
10971 }(BaseButtonElement);
10972 onsElements.ActionSheetButton = ActionSheetButtonElement;
10973 customElements.define('ons-action-sheet-button', ActionSheetButtonElement);
10974
10975 var AlertDialogAnimator = /*#__PURE__*/function (_BaseAnimator) {
10976 _inherits(AlertDialogAnimator, _BaseAnimator);
10977
10978 var _super = _createSuper(AlertDialogAnimator);
10979
10980 function AlertDialogAnimator() {
10981 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
10982 _ref$timing = _ref.timing,
10983 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
10984 _ref$delay = _ref.delay,
10985 delay = _ref$delay === void 0 ? 0 : _ref$delay,
10986 _ref$duration = _ref.duration,
10987 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
10988
10989 _classCallCheck(this, AlertDialogAnimator);
10990
10991 return _super.call(this, {
10992 timing: timing,
10993 delay: delay,
10994 duration: duration
10995 });
10996 }
10997 /**
10998 * @param {HTMLElement} dialog
10999 * @param {Function} done
11000 */
11001
11002
11003 _createClass(AlertDialogAnimator, [{
11004 key: "show",
11005 value: function show(dialog, done) {
11006 done();
11007 }
11008 /**
11009 * @param {HTMLElement} dialog
11010 * @param {Function} done
11011 */
11012
11013 }, {
11014 key: "hide",
11015 value: function hide(dialog, done) {
11016 done();
11017 }
11018 }]);
11019
11020 return AlertDialogAnimator;
11021 }(BaseAnimator);
11022 /**
11023 * Android style animator for alert dialog.
11024 */
11025
11026 var AndroidAlertDialogAnimator = /*#__PURE__*/function (_AlertDialogAnimator) {
11027 _inherits(AndroidAlertDialogAnimator, _AlertDialogAnimator);
11028
11029 var _super2 = _createSuper(AndroidAlertDialogAnimator);
11030
11031 function AndroidAlertDialogAnimator() {
11032 var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
11033 _ref2$timing = _ref2.timing,
11034 timing = _ref2$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref2$timing,
11035 _ref2$duration = _ref2.duration,
11036 duration = _ref2$duration === void 0 ? 0.2 : _ref2$duration,
11037 _ref2$delay = _ref2.delay,
11038 delay = _ref2$delay === void 0 ? 0 : _ref2$delay;
11039
11040 _classCallCheck(this, AndroidAlertDialogAnimator);
11041
11042 return _super2.call(this, {
11043 duration: duration,
11044 timing: timing,
11045 delay: delay
11046 });
11047 }
11048 /**
11049 * @param {Object} dialog
11050 * @param {Function} callback
11051 */
11052
11053
11054 _createClass(AndroidAlertDialogAnimator, [{
11055 key: "show",
11056 value: function show(dialog, callback) {
11057 callback = callback ? callback : function () {};
11058 Animit.runAll(Animit(dialog._mask, this.def).default({
11059 opacity: 0
11060 }, {
11061 opacity: 1
11062 }), Animit(dialog._dialog, this.def).default({
11063 transform: 'translate3d(-50%, -50%, 0) scale3d(.9, .9, 1)',
11064 opacity: 0
11065 }, {
11066 transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
11067 opacity: 1
11068 }).queue(function (done) {
11069 callback();
11070 done();
11071 }));
11072 }
11073 /**
11074 * @param {Object} dialog
11075 * @param {Function} callback
11076 */
11077
11078 }, {
11079 key: "hide",
11080 value: function hide(dialog, callback) {
11081 callback = callback ? callback : function () {};
11082 Animit.runAll(Animit(dialog._mask, this.def).default({
11083 opacity: 1
11084 }, {
11085 opacity: 0
11086 }), Animit(dialog._dialog, this.def).default({
11087 transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
11088 opacity: 1
11089 }, {
11090 transform: 'translate3d(-50%, -50%, 0) scale3d(.9, .9, 1)',
11091 opacity: 0
11092 }).queue(function (done) {
11093 callback();
11094 done();
11095 }));
11096 }
11097 }]);
11098
11099 return AndroidAlertDialogAnimator;
11100 }(AlertDialogAnimator);
11101 /**
11102 * iOS style animator for alert dialog.
11103 */
11104
11105 var IOSAlertDialogAnimator = /*#__PURE__*/function (_AlertDialogAnimator2) {
11106 _inherits(IOSAlertDialogAnimator, _AlertDialogAnimator2);
11107
11108 var _super3 = _createSuper(IOSAlertDialogAnimator);
11109
11110 function IOSAlertDialogAnimator() {
11111 var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
11112 _ref3$timing = _ref3.timing,
11113 timing = _ref3$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref3$timing,
11114 _ref3$duration = _ref3.duration,
11115 duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration,
11116 _ref3$delay = _ref3.delay,
11117 delay = _ref3$delay === void 0 ? 0 : _ref3$delay;
11118
11119 _classCallCheck(this, IOSAlertDialogAnimator);
11120
11121 return _super3.call(this, {
11122 duration: duration,
11123 timing: timing,
11124 delay: delay
11125 });
11126 }
11127 /*
11128 * @param {Object} dialog
11129 * @param {Function} callback
11130 */
11131
11132
11133 _createClass(IOSAlertDialogAnimator, [{
11134 key: "show",
11135 value: function show(dialog, callback) {
11136 callback = callback ? callback : function () {};
11137 Animit.runAll(Animit(dialog._mask, this.def).default({
11138 opacity: 0
11139 }, {
11140 opacity: 1
11141 }), Animit(dialog._dialog, this.def).default({
11142 transform: 'translate3d(-50%, -50%, 0) scale3d(1.3, 1.3, 1)',
11143 opacity: 0
11144 }, {
11145 transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
11146 opacity: 1
11147 }).queue(function (done) {
11148 callback();
11149 done();
11150 }));
11151 }
11152 /**
11153 * @param {Object} dialog
11154 * @param {Function} callback
11155 */
11156
11157 }, {
11158 key: "hide",
11159 value: function hide(dialog, callback) {
11160 callback = callback ? callback : function () {};
11161 Animit.runAll(Animit(dialog._mask, this.def).default({
11162 opacity: 1
11163 }, {
11164 opacity: 0
11165 }), Animit(dialog._dialog, this.def).default({
11166 opacity: 1
11167 }, {
11168 opacity: 0
11169 }).queue(function (done) {
11170 callback();
11171 done();
11172 }));
11173 }
11174 }]);
11175
11176 return IOSAlertDialogAnimator;
11177 }(AlertDialogAnimator);
11178
11179 var scheme$t = {
11180 '.alert-dialog': 'alert-dialog--*',
11181 '.alert-dialog-container': 'alert-dialog-container--*',
11182 '.alert-dialog-title': 'alert-dialog-title--*',
11183 '.alert-dialog-content': 'alert-dialog-content--*',
11184 '.alert-dialog-footer': 'alert-dialog-footer--*',
11185 '.alert-dialog-footer--rowfooter': 'alert-dialog-footer--rowfooter--*',
11186 '.alert-dialog-button--rowfooter': 'alert-dialog-button--rowfooter--*',
11187 '.alert-dialog-button--primal': 'alert-dialog-button--primal--*',
11188 '.alert-dialog-button': 'alert-dialog-button--*',
11189 'ons-alert-dialog-button': 'alert-dialog-button--*',
11190 '.alert-dialog-mask': 'alert-dialog-mask--*',
11191 '.text-input': 'text-input--*'
11192 };
11193 var _animatorDict$7 = {
11194 'none': AlertDialogAnimator,
11195 'default': function _default() {
11196 return platform.isAndroid() ? AndroidAlertDialogAnimator : IOSAlertDialogAnimator;
11197 },
11198 'fade': function fade() {
11199 return platform.isAndroid() ? AndroidAlertDialogAnimator : IOSAlertDialogAnimator;
11200 }
11201 };
11202 /**
11203 * @element ons-alert-dialog
11204 * @category dialog
11205 * @description
11206 * [en]
11207 * Alert dialog that is displayed on top of the current screen. Useful for displaying questions, warnings or error messages to the user. The title, content and buttons can be easily customized and it will automatically switch style based on the platform.
11208 *
11209 * To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createAlertDialog(template)` utility function and the `<template>` tag.
11210 * [/en]
11211 * [ja]
11212 * 現在のスクリーンの上に表示するアラートダイアログです。ユーザに対する問いかけ、警告、エラーメッセージを表示するのに利用できます。タイトルやコンテンツやボタンは簡単にカスタマイズでき、実行しているプラットフォームに併せてスタイルが自動的に切り替わります。
11213 * [/ja]
11214 * @codepen Qwwxyp
11215 * @tutorial vanilla/Reference/alert-dialog
11216 * @modifier material
11217 * [en]Material Design style[/en]
11218 * [ja]マテリアルデザインのスタイル[/ja]
11219 * @modifier rowfooter
11220 * [en]Horizontally aligns the footer buttons.[/en]
11221 * [ja]フッターの複数のボタンを水平に配置[/ja]
11222 * @seealso ons-dialog
11223 * [en]ons-dialog component[/en]
11224 * [ja]ons-dialogコンポーネント[/ja]
11225 * @seealso ons-popover
11226 * [en]ons-popover component[/en]
11227 * [ja]ons-dialogコンポーネント[/ja]
11228 * @seealso ons.notification
11229 * [en]Using ons.notification utility functions.[/en]
11230 * [ja]アラートダイアログを表示するには、ons.notificationオブジェクトのメソッドを使うこともできます。[/ja]
11231 * @example
11232 * <ons-alert-dialog id="alert-dialog">
11233 * <div class="alert-dialog-title">Warning!</div>
11234 * <div class="alert-dialog-content">
11235 * An error has occurred!
11236 * </div>
11237 * <div class="alert-dialog-footer">
11238 * <button id="alert-dialog-button" class="alert-dialog-button">OK</button>
11239 * </div>
11240 * </ons-alert-dialog>
11241 * <script>
11242 * document.getElementById('alert-dialog').show();
11243 * </script>
11244 */
11245
11246 var AlertDialogElement = /*#__PURE__*/function (_BaseDialogElement) {
11247 _inherits(AlertDialogElement, _BaseDialogElement);
11248
11249 var _super = _createSuper(AlertDialogElement);
11250
11251 /**
11252 * @event preshow
11253 * @description
11254 * [en]Fired just before the alert dialog is displayed.[/en]
11255 * [ja]アラートダイアログが表示される直前に発火します。[/ja]
11256 * @param {Object} event [en]Event object.[/en]
11257 * @param {Object} event.alertDialog
11258 * [en]Alert dialog object.[/en]
11259 * [ja]アラートダイアログのオブジェクト。[/ja]
11260 * @param {Function} event.cancel
11261 * [en]Execute to stop the dialog from showing.[/en]
11262 * [ja]この関数を実行すると、アラートダイアログの表示を止めます。[/ja]
11263 */
11264
11265 /**
11266 * @event postshow
11267 * @description
11268 * [en]Fired just after the alert dialog is displayed.[/en]
11269 * [ja]アラートダイアログが表示された直後に発火します。[/ja]
11270 * @param {Object} event [en]Event object.[/en]
11271 * @param {Object} event.alertDialog
11272 * [en]Alert dialog object.[/en]
11273 * [ja]アラートダイアログのオブジェクト。[/ja]
11274 */
11275
11276 /**
11277 * @event prehide
11278 * @description
11279 * [en]Fired just before the alert dialog is hidden.[/en]
11280 * [ja]アラートダイアログが隠れる直前に発火します。[/ja]
11281 * @param {Object} event [en]Event object.[/en]
11282 * @param {Object} event.alertDialog
11283 * [en]Alert dialog object.[/en]
11284 * [ja]アラートダイアログのオブジェクト。[/ja]
11285 * @param {Function} event.cancel
11286 * [en]Execute to stop the dialog from hiding.[/en]
11287 * [ja]この関数を実行すると、アラートダイアログが閉じようとするのを止めます。[/ja]
11288 */
11289
11290 /**
11291 * @event posthide
11292 * @description
11293 * [en]Fired just after the alert dialog is hidden.[/en]
11294 * [ja]アラートダイアログが隠れた後に発火します。[/ja]
11295 * @param {Object} event [en]Event object.[/en]
11296 * @param {Object} event.alertDialog
11297 * [en]Alert dialog object.[/en]
11298 * [ja]アラートダイアログのオブジェクト。[/ja]
11299 */
11300
11301 /**
11302 * @event dialogcancel
11303 * @description
11304 * [en]Fired when the dialog is canceled.[/en]
11305 * [ja][/ja]
11306 */
11307
11308 /**
11309 * @attribute modifier
11310 * @type {String}
11311 * @description
11312 * [en]The appearance of the dialog.[/en]
11313 * [ja]ダイアログの見た目を指定します。[/ja]
11314 */
11315
11316 /**
11317 * @attribute cancelable
11318 * @description
11319 * [en]If this attribute is set the dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
11320 * [ja]この属性を設定すると、ダイアログの背景をタップしたりAndroidデバイスのバックボタンを押すとダイアログが閉じるようになります。[/ja]
11321 */
11322
11323 /**
11324 * @attribute disabled
11325 * @description
11326 * [en]If this attribute is set the dialog is disabled.[/en]
11327 * [ja]この属性がある時、アラートダイアログはdisabled状態になります。[/ja]
11328 */
11329
11330 /**
11331 * @attribute animation
11332 * @type {String}
11333 * @default default
11334 * @description
11335 * [en]The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.[/en]
11336 * [ja]ダイアログを表示する際のアニメーション名を指定します。デフォルトでは"none"か"default"が指定できます。[/ja]
11337 */
11338
11339 /**
11340 * @attribute animation-options
11341 * @type {Expression}
11342 * @description
11343 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
11344 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
11345 */
11346
11347 /**
11348 * @attribute mask-color
11349 * @type {String}
11350 * @default rgba(0, 0, 0, 0.2)
11351 * @description
11352 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
11353 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
11354 */
11355
11356 /**
11357 * @attribute visible
11358 * @type {Boolean}
11359 * @description
11360 * [en]Whether the alert dialog is visible or not.[/en]
11361 * [ja]要素が見える場合に`true`。[/ja]
11362 */
11363 function AlertDialogElement() {
11364 var _this;
11365
11366 _classCallCheck(this, AlertDialogElement);
11367
11368 _this = _super.call(this);
11369 contentReady(_assertThisInitialized(_this), function () {
11370 return _this._compile();
11371 });
11372 return _this;
11373 }
11374
11375 _createClass(AlertDialogElement, [{
11376 key: "_scheme",
11377 get: function get() {
11378 return scheme$t;
11379 }
11380 /**
11381 * @return {Element}
11382 */
11383
11384 }, {
11385 key: "_mask",
11386 get: function get() {
11387 return util$4.findChild(this, '.alert-dialog-mask');
11388 }
11389 /**
11390 * @return {Element}
11391 */
11392
11393 }, {
11394 key: "_dialog",
11395 get: function get() {
11396 return util$4.findChild(this, '.alert-dialog');
11397 }
11398 /**
11399 * @return {Element}
11400 */
11401
11402 }, {
11403 key: "_titleElement",
11404 get: function get() {
11405 return util$4.findChild(this._dialog.children[0], '.alert-dialog-title');
11406 }
11407 /**
11408 * @return {Element}
11409 */
11410
11411 }, {
11412 key: "_contentElement",
11413 get: function get() {
11414 return util$4.findChild(this._dialog.children[0], '.alert-dialog-content');
11415 }
11416 }, {
11417 key: "_updateAnimatorFactory",
11418 value: function _updateAnimatorFactory() {
11419 return new AnimatorFactory({
11420 animators: _animatorDict$7,
11421 baseClass: AlertDialogAnimator,
11422 baseClassName: 'AlertDialogAnimator',
11423 defaultAnimation: this.getAttribute('animation')
11424 });
11425 }
11426 }, {
11427 key: "_compile",
11428 value: function _compile() {
11429 autoStyle.prepare(this);
11430 this.style.display = 'none';
11431 this.style.zIndex = 10001;
11432 /**
11433 * Expected result after compile:
11434 *
11435 * <ons-alert-dialog style="none">
11436 * <div class="alert-dialog-mask"></div>
11437 * <div class="alert-dialog">
11438 * <div class="alert-dialog-container">...</div>
11439 * </div>
11440 * </ons-alert-dialog>
11441 */
11442
11443 var content = document.createDocumentFragment();
11444
11445 if (!this._mask && !this._dialog) {
11446 while (this.firstChild) {
11447 content.appendChild(this.firstChild);
11448 }
11449 }
11450
11451 if (!this._mask) {
11452 var mask = document.createElement('div');
11453 mask.classList.add('alert-dialog-mask');
11454 this.insertBefore(mask, this.children[0]);
11455 }
11456
11457 if (!this._dialog) {
11458 var dialog = document.createElement('div');
11459 dialog.classList.add('alert-dialog');
11460 this.insertBefore(dialog, null);
11461 }
11462
11463 if (!util$4.findChild(this._dialog, '.alert-dialog-container')) {
11464 var container = document.createElement('div');
11465 container.classList.add('alert-dialog-container');
11466
11467 this._dialog.appendChild(container);
11468 }
11469
11470 this._dialog.children[0].appendChild(content);
11471
11472 this._dialog.style.zIndex = 20001;
11473 this._mask.style.zIndex = 20000;
11474 ModifierUtil.initModifier(this, this._scheme);
11475 }
11476 /**
11477 * @property disabled
11478 * @type {Boolean}
11479 * @description
11480 * [en]Whether the element is disabled or not.[/en]
11481 * [ja]無効化されている場合に`true`。[/ja]
11482 */
11483
11484 /**
11485 * @property cancelable
11486 * @type {Boolean}
11487 * @description
11488 * [en]Whether the dialog is cancelable or not. A cancelable dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
11489 * [ja]そのダイアログがキャンセル可能かどうかを表します。キャンセル可能なダイアログは、背景をタップするかAndroidデバイスのバックボタンを押すことで閉じることが出来るようになります。[/ja]
11490 */
11491
11492 /**
11493 * @property maskColor
11494 * @type {String}
11495 * @default rgba(0, 0, 0, 0.2)
11496 * @description
11497 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
11498 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
11499 */
11500
11501 /**
11502 * @method show
11503 * @signature show([options])
11504 * @param {Object} [options]
11505 * [en]Parameter object.[/en]
11506 * [ja]オプションを指定するオブジェクトです。[/ja]
11507 * @param {String} [options.animation]
11508 * [en]Animation name. Available animations are `"fade"` and `"none"`.[/en]
11509 * [ja]アニメーション名を指定します。指定できるのは、"fade", "none"のいずれかです。[/ja]
11510 * @param {String} [options.animationOptions]
11511 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
11512 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code> [/ja]
11513 * @param {Function} [options.callback]
11514 * [en]Function to execute after the dialog has been revealed.[/en]
11515 * [ja]ダイアログが表示され終わった時に呼び出されるコールバックを指定します。[/ja]
11516 * @description
11517 * [en]Show the alert dialog.[/en]
11518 * [ja]ダイアログを表示します。[/ja]
11519 * @return {Promise}
11520 * [en]A `Promise` object that resolves to the displayed element.[/en]
11521 * [ja]表示される要素を解決する`Promise`オブジェクトを返します。[/ja]
11522 */
11523
11524 /**
11525 * @method hide
11526 * @signature hide([options])
11527 * @param {Object} [options]
11528 * [en]Parameter object.[/en]
11529 * [ja]オプションを指定するオブジェクト。[/ja]
11530 * @param {String} [options.animation]
11531 * [en]Animation name. Available animations are `"fade"` and `"none"`.[/en]
11532 * [ja]アニメーション名を指定します。"fade", "none"のいずれかを指定します。[/ja]
11533 * @param {String} [options.animationOptions]
11534 * [en]Specify the animation's duration, delay and timing. E.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code>[/en]
11535 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code> [/ja]
11536 * @param {Function} [options.callback]
11537 * [en]Function to execute after the dialog has been hidden.[/en]
11538 * [ja]このダイアログが閉じた時に呼び出されるコールバックを指定します。[/ja]
11539 * @description
11540 * [en]Hide the alert dialog.[/en]
11541 * [ja]ダイアログを閉じます。[/ja]
11542 * @return {Promise}
11543 * [en]Resolves to the hidden element[/en]
11544 * [ja]隠れた要素を解決する`Promise`オブジェクトを返します。[/ja]
11545 */
11546
11547 /**
11548 * @property visible
11549 * @type {Boolean}
11550 * @description
11551 * [en]Whether the dialog is visible or not.[/en]
11552 * [ja]要素が見える場合に`true`。[/ja]
11553 */
11554
11555 /**
11556 * @property onDeviceBackButton
11557 * @type {Object}
11558 * @description
11559 * [en]Back-button handler.[/en]
11560 * [ja]バックボタンハンドラ。[/ja]
11561 */
11562
11563 /**
11564 * @property animationOptions
11565 * @type {Object}
11566 * @description
11567 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
11568 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
11569 */
11570
11571 /**
11572 * @param {String} name
11573 * @param {DialogAnimator} Animator
11574 */
11575
11576 }], [{
11577 key: "registerAnimator",
11578 value: function registerAnimator(name, Animator) {
11579 if (!(Animator.prototype instanceof AlertDialogAnimator)) {
11580 util$4.throwAnimator('AlertDialog');
11581 }
11582
11583 _animatorDict$7[name] = Animator;
11584 }
11585 }, {
11586 key: "animators",
11587 get: function get() {
11588 return _animatorDict$7;
11589 }
11590 }, {
11591 key: "AlertDialogAnimator",
11592 get: function get() {
11593 return AlertDialogAnimator;
11594 }
11595 }]);
11596
11597 return AlertDialogElement;
11598 }(BaseDialogElement);
11599 onsElements.AlertDialog = AlertDialogElement;
11600 customElements.define('ons-alert-dialog', AlertDialogElement);
11601
11602 /**
11603 * @element ons-alert-dialog-button
11604 * @modifier material
11605 * [en]Material Design alert-dialog button.[/en]
11606 * [ja]マテリアルデザインのボタンを表示します。[/ja]
11607 * @description
11608 * [en][/en]
11609 * [ja][/ja]
11610 * @seealso ons-alert-dialog
11611 * [en]The `<ons-alert-dialog>` component displays a alert dialog.[/en]
11612 * [ja]ons-alert-dialogコンポーネント[/ja]
11613 * @example
11614 * <ons-alert-dialog>
11615 * <div class="alert-dialog-title">Warning!</div>
11616 * <div class="alert-dialog-content">
11617 * An error has occurred!
11618 * </div>
11619 * <div class="alert-dialog-footer">
11620 * <alert-dialog-button onclick="app.close()">Cancel</alert-dialog-button>
11621 * <alert-dialog-button class="alert-dialog-button" onclick="app.close()">OK</alert-dialog-button>
11622 * </div>
11623 * </ons-alert-dialog>
11624 */
11625
11626 var AlertDialogButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
11627 _inherits(AlertDialogButtonElement, _BaseButtonElement);
11628
11629 var _super = _createSuper(AlertDialogButtonElement);
11630
11631 function AlertDialogButtonElement() {
11632 _classCallCheck(this, AlertDialogButtonElement);
11633
11634 return _super.apply(this, arguments);
11635 }
11636
11637 _createClass(AlertDialogButtonElement, [{
11638 key: "_scheme",
11639 get:
11640 /**
11641 * @attribute modifier
11642 * @type {String}
11643 * @description
11644 * [en]The appearance of the button.[/en]
11645 * [ja]ボタンの表現を指定します。[/ja]
11646 */
11647
11648 /**
11649 * @attribute disabled
11650 * @description
11651 * [en]Specify if button should be disabled.[/en]
11652 * [ja]ボタンを無効化する場合は指定してください。[/ja]
11653 */
11654
11655 /**
11656 * @property disabled
11657 * @type {Boolean}
11658 * @description
11659 * [en]Whether the element is disabled or not.[/en]
11660 * [ja]無効化されている場合に`true`。[/ja]
11661 */
11662 function get() {
11663 return {
11664 '': 'alert-dialog-button--*'
11665 };
11666 }
11667 }, {
11668 key: "_defaultClassName",
11669 get: function get() {
11670 return 'alert-dialog-button';
11671 }
11672 }, {
11673 key: "_rippleOpt",
11674 get: function get() {
11675 return [this, undefined, {
11676 'modifier': 'light-gray'
11677 }];
11678 }
11679 }]);
11680
11681 return AlertDialogButtonElement;
11682 }(BaseButtonElement);
11683 onsElements.AlertDialogButton = AlertDialogButtonElement;
11684 customElements.define('ons-alert-dialog-button', AlertDialogButtonElement);
11685
11686 var defaultClassName$g = 'back-button';
11687 var scheme$s = {
11688 '': 'back-button--*',
11689 '.back-button__icon': 'back-button--*__icon',
11690 '.back-button__label': 'back-button--*__label'
11691 }; // original image file at misc/images/ios-back-button-icon.svg
11692
11693 var iosBackButtonIcon = "\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <svg width=\"13px\" height=\"21px\" viewBox=\"0 0 13 21\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>ios-back-button-icon</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"toolbar-back-button\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\n <g id=\"ios\" transform=\"translate(-34.000000, -30.000000)\">\n <polygon id=\"ios-back-button-icon\" points=\"34 40.5 44.5 30 46.5 32 38 40.5 46.5 49 44.5 51\"></polygon>\n </g>\n </g>\n </svg>\n"; // original image file at misc/images/md-back-button-icon.svg
11694
11695 var mdBackButtonIcon = "\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <svg width=\"16px\" height=\"16px\" viewBox=\"0 0 16 16\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>md-back-button-icon</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"toolbar-back-button\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\n <g id=\"android\" transform=\"translate(-32.000000, -32.000000)\" fill-rule=\"nonzero\">\n <polygon id=\"md-back-button-icon\" points=\"48 39 35.83 39 41.42 33.41 40 32 32 40 40 48 41.41 46.59 35.83 41 48 41\"></polygon>\n </g>\n </g>\n </svg>\n";
11696 /**
11697 * @element ons-back-button
11698 * @category navigation
11699 * @description
11700 * [en]
11701 * Back button component for `<ons-toolbar>`. Put it in the left part of the `<ons-toolbar>`.
11702 *
11703 * It will find the parent `<ons-navigator>` element and pop a page when clicked. This behavior can be overriden by specifying the `onClick` property and calling event.preventDefault in its callback.
11704 * [/en]
11705 * [ja][/ja]
11706 * @codepen aHmGL
11707 * @tutorial vanilla/Reference/back-button
11708 * @modifier material
11709 * [en]Material Design style[/en]
11710 * [ja][/ja]
11711 * @seealso ons-toolbar
11712 * [en]ons-toolbar component[/en]
11713 * [ja]ons-toolbarコンポーネント[/ja]
11714 * @seealso ons-navigator
11715 * [en]ons-navigator component[/en]
11716 * [ja]ons-navigatorコンポーネント[/ja]
11717 * @example
11718 * <ons-toolbar>
11719 * <div class="left">
11720 * <ons-back-button>Back</ons-back-button>
11721 * </div>
11722 * <div class="center">
11723 * Title
11724 * <div>
11725 * </ons-toolbar>
11726 */
11727
11728 var BackButtonElement = /*#__PURE__*/function (_BaseElement) {
11729 _inherits(BackButtonElement, _BaseElement);
11730
11731 var _super = _createSuper(BackButtonElement);
11732
11733 /**
11734 * @attribute modifier
11735 * @type {String}
11736 * @description
11737 * [en]The appearance of the back button.[/en]
11738 * [ja]バックボタンの見た目を指定します。[/ja]
11739 */
11740 function BackButtonElement() {
11741 var _this;
11742
11743 _classCallCheck(this, BackButtonElement);
11744
11745 _this = _super.call(this);
11746 contentReady(_assertThisInitialized(_this), function () {
11747 _this._compile();
11748 });
11749 _this._options = {};
11750 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
11751
11752 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
11753 onConnected = _util$defineListenerP.onConnected,
11754 onDisconnected = _util$defineListenerP.onDisconnected;
11755
11756 _this._connectOnClick = onConnected;
11757 _this._disconnectOnClick = onDisconnected;
11758 return _this;
11759 }
11760
11761 _createClass(BackButtonElement, [{
11762 key: "_updateIcon",
11763 value: function _updateIcon() {
11764 var icon = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : util$4.findChild(this, '.back-button__icon');
11765 icon.innerHTML = autoStyle.getPlatform(this) === 'android' || util$4.hasModifier(this, 'material') ? mdBackButtonIcon : iosBackButtonIcon;
11766 }
11767 }, {
11768 key: "_compile",
11769 value: function _compile() {
11770 autoStyle.prepare(this);
11771 this.classList.add(defaultClassName$g);
11772
11773 if (!util$4.findChild(this, '.back-button__label')) {
11774 var label = util$4.create('span.back-button__label');
11775
11776 while (this.childNodes[0]) {
11777 label.appendChild(this.childNodes[0]);
11778 }
11779
11780 this.appendChild(label);
11781 }
11782
11783 if (!util$4.findChild(this, '.back-button__icon')) {
11784 var icon = util$4.create('span.back-button__icon');
11785
11786 this._updateIcon(icon);
11787
11788 this.insertBefore(icon, this.children[0]);
11789 }
11790
11791 util$4.updateRipple(this, undefined, {
11792 center: '',
11793 'size': 'contain',
11794 'background': 'transparent'
11795 });
11796 ModifierUtil.initModifier(this, scheme$s);
11797 }
11798 /**
11799 * @property options
11800 * @type {Object}
11801 * @description
11802 * [en]Options object.[/en]
11803 * [ja]オプションを指定するオブジェクト。[/ja]
11804 */
11805
11806 /**
11807 * @property options.animation
11808 * @type {String}
11809 * @description
11810 * [en]Animation name. Available animations are "slide", "lift", "fade" and "none".
11811 * These are platform based animations. For fixed animations, add "-ios" or "-md"
11812 * suffix to the animation name. E.g. "lift-ios", "lift-md". Defaults values are "slide-ios" and "fade-md".
11813 * [/en]
11814 * [ja][/ja]
11815 */
11816
11817 /**
11818 * @property options.animationOptions
11819 * @type {String}
11820 * @description
11821 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/en]
11822 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
11823 */
11824
11825 /**
11826 * @property options.callback
11827 * @type {String}
11828 * @description
11829 * [en]Function that is called when the transition has ended.[/en]
11830 * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
11831 */
11832
11833 }, {
11834 key: "options",
11835 get: function get() {
11836 return this._options;
11837 },
11838 set: function set(object) {
11839 this._options = object;
11840 }
11841 /**
11842 * @property onClick
11843 * @type {Function}
11844 * @description
11845 * [en]Used to override the default back button behavior.[/en]
11846 * [ja][/ja]
11847 */
11848
11849 }, {
11850 key: "_onClick",
11851 value: function _onClick(event) {
11852 var _this2 = this;
11853
11854 setTimeout(function () {
11855 if (!event.defaultPrevented) {
11856 var navigator = util$4.findParent(_this2, 'ons-navigator');
11857
11858 if (navigator) {
11859 navigator.popPage(_objectSpread2(_objectSpread2({}, _this2.options), {}, {
11860 onsBackButton: true
11861 }));
11862 }
11863 }
11864 });
11865 }
11866 }, {
11867 key: "connectedCallback",
11868 value: function connectedCallback() {
11869 this.addEventListener('click', this._boundOnClick, false);
11870
11871 this._connectOnClick();
11872 }
11873 }, {
11874 key: "attributeChangedCallback",
11875 value: function attributeChangedCallback(name, last, current) {
11876 switch (name) {
11877 case 'class':
11878 util$4.restoreClass(this, defaultClassName$g, scheme$s);
11879 break;
11880
11881 case 'modifier':
11882 {
11883 ModifierUtil.onModifierChanged(last, current, this, scheme$s) && this._updateIcon();
11884 break;
11885 }
11886 }
11887 }
11888 }, {
11889 key: "disconnectedCallback",
11890 value: function disconnectedCallback() {
11891 this.removeEventListener('click', this._boundOnClick, false);
11892
11893 this._disconnectOnClick();
11894 }
11895 }, {
11896 key: "show",
11897 value: function show() {
11898 this.style.display = 'inline-block';
11899 }
11900 }, {
11901 key: "hide",
11902 value: function hide() {
11903 this.style.display = 'none';
11904 }
11905 }], [{
11906 key: "observedAttributes",
11907 get: function get() {
11908 return ['modifier', 'class'];
11909 }
11910 }]);
11911
11912 return BackButtonElement;
11913 }(BaseElement);
11914 onsElements.BackButton = BackButtonElement;
11915 customElements.define('ons-back-button', BackButtonElement);
11916
11917 var defaultClassName$f = 'bottom-bar';
11918 var scheme$r = {
11919 '': 'bottom-bar--*'
11920 };
11921 /**
11922 * @element ons-bottom-toolbar
11923 * @category page
11924 * @description
11925 * [en]Toolbar component that is positioned at the bottom of the page. Since bottom toolbars are very versatile elements, `ons-bottom-toolbar` does not provide any specific layout syntax for its children. Modifiers or custom CSS must be used.[/en]
11926 * [ja]ページ下部に配置されるツールバー用コンポーネントです。[/ja]
11927 * @modifier transparent
11928 * [en]Make the toolbar transparent.[/en]
11929 * [ja]ツールバーの背景を透明にして表示します。[/ja]
11930 * @modifier aligned
11931 * [en]Vertically aligns its children and applies flexbox for block elements. `justify-content` CSS rule can be used to change horizontal align.[/en]
11932 * [ja]ツールバーの背景を透明にして表示します。[/ja]
11933 * @seealso ons-toolbar [en]ons-toolbar component[/en][ja]ons-toolbarコンポーネント[/ja]
11934 * @example
11935 * <ons-bottom-toolbar>
11936 * Content
11937 * </ons-bottom-toolbar>
11938 */
11939
11940 var BottomToolbarElement = /*#__PURE__*/function (_BaseElement) {
11941 _inherits(BottomToolbarElement, _BaseElement);
11942
11943 var _super = _createSuper(BottomToolbarElement);
11944
11945 /**
11946 * @attribute modifier
11947 * @type {String}
11948 * @description
11949 * [en]The appearance of the toolbar.[/en]
11950 * [ja]ツールバーの見た目の表現を指定します。[/ja]
11951 */
11952 function BottomToolbarElement() {
11953 var _this;
11954
11955 _classCallCheck(this, BottomToolbarElement);
11956
11957 _this = _super.call(this);
11958
11959 _this.classList.add(defaultClassName$f);
11960
11961 ModifierUtil.initModifier(_assertThisInitialized(_this), scheme$r);
11962 return _this;
11963 }
11964
11965 _createClass(BottomToolbarElement, [{
11966 key: "attributeChangedCallback",
11967 value: function attributeChangedCallback(name, last, current) {
11968 switch (name) {
11969 case 'class':
11970 util$4.restoreClass(this, defaultClassName$f, scheme$r);
11971 break;
11972
11973 case 'modifier':
11974 ModifierUtil.onModifierChanged(last, current, this, scheme$r);
11975 break;
11976 }
11977 }
11978 }], [{
11979 key: "observedAttributes",
11980 get: function get() {
11981 return ['modifier', 'class'];
11982 }
11983 }]);
11984
11985 return BottomToolbarElement;
11986 }(BaseElement);
11987 onsElements.BottomToolbar = BottomToolbarElement;
11988 customElements.define('ons-bottom-toolbar', BottomToolbarElement);
11989
11990 /**
11991 * @element ons-button
11992 * @category form
11993 * @modifier outline
11994 * [en]Button with outline and transparent background[/en]
11995 * [ja]アウトラインを持ったボタンを表示します。[/ja]
11996 * @modifier light
11997 * [en]Button that doesn't stand out.[/en]
11998 * [ja]目立たないボタンを表示します。[/ja]
11999 * @modifier quiet
12000 * [en]Button with no outline and or background..[/en]
12001 * [ja]枠線や背景が無い文字だけのボタンを表示します。[/ja]
12002 * @modifier cta
12003 * [en]Button that really stands out.[/en]
12004 * [ja]目立つボタンを表示します。[/ja]
12005 * @modifier large
12006 * [en]Large button that covers the width of the screen.[/en]
12007 * [ja]横いっぱいに広がる大きなボタンを表示します。[/ja]
12008 * @modifier large--quiet
12009 * [en]Large quiet button.[/en]
12010 * [ja]横いっぱいに広がるquietボタンを表示します。[/ja]
12011 * @modifier large--cta
12012 * [en]Large call to action button.[/en]
12013 * [ja]横いっぱいに広がるctaボタンを表示します。[/ja]
12014 * @modifier material
12015 * [en]Material Design button[/en]
12016 * [ja]マテリアルデザインのボタン[/ja]
12017 * @modifier material--flat
12018 * [en]Material Design flat button[/en]
12019 * [ja]マテリアルデザインのフラットボタン[/ja]
12020 * @description
12021 * [en]
12022 * Button component. If you want to place a button in a toolbar, use `<ons-toolbar-button>` or `<ons-back-button>` instead.
12023 *
12024 * Will automatically display as a Material Design button with a ripple effect on Android.
12025 * [/en]
12026 * [ja]ボタン用コンポーネント。ツールバーにボタンを設置する場合は、ons-toolbar-buttonもしくはons-back-buttonコンポーネントを使用します。[/ja]
12027 * @codepen hLayx
12028 * @tutorial vanilla/Reference/button
12029 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
12030 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
12031 * @example
12032 * <ons-button modifier="large--cta">
12033 * Tap Me
12034 * </ons-button>
12035 */
12036
12037 var ButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
12038 _inherits(ButtonElement, _BaseButtonElement);
12039
12040 var _super = _createSuper(ButtonElement);
12041
12042 function ButtonElement() {
12043 _classCallCheck(this, ButtonElement);
12044
12045 return _super.apply(this, arguments);
12046 }
12047
12048 _createClass(ButtonElement, [{
12049 key: "_scheme",
12050 get:
12051 /**
12052 * @attribute modifier
12053 * @type {String}
12054 * @description
12055 * [en]The appearance of the button.[/en]
12056 * [ja]ボタンの表現を指定します。[/ja]
12057 */
12058
12059 /**
12060 * @attribute ripple
12061 * @description
12062 * [en]If this attribute is defined, the button will have a ripple effect.[/en]
12063 * [ja][/ja]
12064 */
12065
12066 /**
12067 * @property ripple
12068 * @type {Boolean}
12069 * @description
12070 * [en]Whether the button has a ripple effect or not.[/en]
12071 * [ja][/ja]
12072 */
12073
12074 /**
12075 * @attribute disabled
12076 * @description
12077 * [en]Specify if button should be disabled.[/en]
12078 * [ja]ボタンを無効化する場合は指定します。[/ja]
12079 */
12080
12081 /**
12082 * @property disabled
12083 * @type {Boolean}
12084 * @description
12085 * [en]Whether the button is disabled or not.[/en]
12086 * [ja]無効化されている場合に`true`。[/ja]
12087 */
12088 function get() {
12089 return {
12090 '': 'button--*'
12091 };
12092 }
12093 }, {
12094 key: "_defaultClassName",
12095 get: function get() {
12096 return 'button';
12097 }
12098 }]);
12099
12100 return ButtonElement;
12101 }(BaseButtonElement);
12102 onsElements.Button = ButtonElement;
12103 customElements.define('ons-button', ButtonElement);
12104
12105 var defaultClassName$e = 'card';
12106 var scheme$q = {
12107 '': 'card--*',
12108 '.card__title': 'card--*__title',
12109 '.card__content': 'card--*__content'
12110 };
12111 /**
12112 * @element ons-card
12113 * @category visual
12114 * @modifier material
12115 * [en]A card with material design.[/en]
12116 * [ja]リストの上下のボーダーが無いリストを表示します。[/ja]
12117 * @description
12118 * [en]
12119 * Component to create a card that displays some information.
12120 *
12121 * The card may be composed by divs with specially prepared classes `title` and/or `content`. You can also add your own content as you please.[/en]
12122 * [ja][/ja]
12123 * @tutorial vanilla/Reference/card
12124 * @example
12125 * <ons-card>
12126 * <p>Some content</p>
12127 * </ons-card>
12128 */
12129
12130 var CardElement = /*#__PURE__*/function (_BaseElement) {
12131 _inherits(CardElement, _BaseElement);
12132
12133 var _super = _createSuper(CardElement);
12134
12135 /**
12136 * @attribute modifier
12137 * @type {String}
12138 * @description
12139 * [en]The appearance of the card.[/en]
12140 * [ja]リストの表現を指定します。[/ja]
12141 */
12142 function CardElement() {
12143 var _this;
12144
12145 _classCallCheck(this, CardElement);
12146
12147 _this = _super.call(this);
12148 contentReady(_assertThisInitialized(_this), function () {
12149 _this._compile();
12150 });
12151 return _this;
12152 }
12153
12154 _createClass(CardElement, [{
12155 key: "_compile",
12156 value: function _compile() {
12157
12158 for (var i = 0; i < this.children.length; i++) {
12159 var el = this.children[i];
12160
12161 if (el.classList.contains('title')) {
12162 el.classList.add('card__title');
12163 } else if (el.classList.contains('content')) {
12164 el.classList.add('card__content');
12165 }
12166 }
12167
12168 autoStyle.prepare(this);
12169 this.classList.add(defaultClassName$e);
12170 ModifierUtil.initModifier(this, scheme$q);
12171 }
12172 }, {
12173 key: "attributeChangedCallback",
12174 value: function attributeChangedCallback(name, last, current) {
12175 switch (name) {
12176 case 'class':
12177 util$4.restoreClass(this, defaultClassName$e, scheme$q);
12178 break;
12179
12180 case 'modifier':
12181 ModifierUtil.onModifierChanged(last, current, this, scheme$q);
12182 break;
12183 }
12184 }
12185 }], [{
12186 key: "observedAttributes",
12187 get: function get() {
12188 return ['modifier', 'class'];
12189 }
12190 }]);
12191
12192 return CardElement;
12193 }(BaseElement);
12194 onsElements.Card = CardElement;
12195 customElements.define('ons-card', CardElement);
12196
12197 var scheme$p = {
12198 '': 'carousel-item--*'
12199 };
12200 /**
12201 * @element ons-carousel-item
12202 * @category carousel
12203 * @description
12204 * [en]
12205 * Carousel item component. Used as a child of the `<ons-carousel>` element.
12206 * [/en]
12207 * [ja][/ja]
12208 * @codepen xbbzOQ
12209 * @tutorial vanilla/Reference/carousel
12210 * @seealso ons-carousel
12211 * [en]`<ons-carousel>` components[/en]
12212 * [ja]<ons-carousel>コンポーネント[/ja]
12213 * @example
12214 * <ons-carousel style="width: 100%; height: 200px">
12215 * <ons-carousel-item>
12216 * ...
12217 * </ons-carousel-item>
12218 * <ons-carousel-item>
12219 * ...
12220 * </ons-carousel-item>
12221 * </ons-carousel>
12222 */
12223
12224 var CarouselItemElement = /*#__PURE__*/function (_BaseElement) {
12225 _inherits(CarouselItemElement, _BaseElement);
12226
12227 var _super = _createSuper(CarouselItemElement);
12228
12229 function CarouselItemElement() {
12230 var _this;
12231
12232 _classCallCheck(this, CarouselItemElement);
12233
12234 _this = _super.call(this);
12235 _this.style.width = '100%';
12236 ModifierUtil.initModifier(_assertThisInitialized(_this), scheme$p);
12237 return _this;
12238 }
12239
12240 _createClass(CarouselItemElement, [{
12241 key: "attributeChangedCallback",
12242 value: function attributeChangedCallback(name, last, current) {
12243 if (name === 'modifier') {
12244 return ModifierUtil.onModifierChanged(last, current, this, scheme$p);
12245 }
12246 }
12247 }], [{
12248 key: "observedAttributes",
12249 get: function get() {
12250 return ['modifier'];
12251 }
12252 }]);
12253
12254 return CarouselItemElement;
12255 }(BaseElement);
12256 onsElements.CarouselItem = CarouselItemElement;
12257 customElements.define('ons-carousel-item', CarouselItemElement);
12258
12259 var directionMap = {
12260 vertical: {
12261 axis: 'Y',
12262 size: 'Height',
12263 dir: ['up', 'down'],
12264 t3d: ['0px, ', 'px, 0px']
12265 },
12266 horizontal: {
12267 axis: 'X',
12268 size: 'Width',
12269 dir: ['left', 'right'],
12270 t3d: ['', 'px, 0px, 0px']
12271 }
12272 };
12273
12274 var Swiper = /*#__PURE__*/function () {
12275 function Swiper(params) {
12276 var _this = this;
12277
12278 _classCallCheck(this, Swiper);
12279
12280 // Parameters
12281 var FALSE = function FALSE() {
12282 return false;
12283 };
12284
12285 "getInitialIndex getBubbleWidth isVertical isOverScrollable isCentered\n isAutoScrollable refreshHook preChangeHook postChangeHook overScrollHook".split(/\s+/).forEach(function (key) {
12286 return _this[key] = params[key] || FALSE;
12287 });
12288 this.getElement = params.getElement; // Required
12289
12290 this.scrollHook = params.scrollHook; // Optional
12291
12292 this.itemSize = params.itemSize || '100%';
12293
12294 this.getAutoScrollRatio = function () {
12295 var ratio = params.getAutoScrollRatio && params.getAutoScrollRatio.apply(params, arguments);
12296 ratio = typeof ratio === 'number' && ratio === ratio ? ratio : .5;
12297
12298 if (ratio < 0.0 || ratio > 1.0) {
12299 util$4.throw('Invalid auto-scroll-ratio ' + ratio + '. Must be between 0 and 1');
12300 }
12301
12302 return ratio;
12303 }; // Prevent clicks only on desktop
12304
12305
12306 this.shouldBlock = util$4.globals.actualMobileOS === 'other'; // Bind handlers
12307
12308 this.onDragStart = this.onDragStart.bind(this);
12309 this.onDrag = this.onDrag.bind(this);
12310 this.onDragEnd = this.onDragEnd.bind(this);
12311 this.onResize = this.onResize.bind(this);
12312 this._shouldFixScroll = util$4.globals.actualMobileOS === 'ios';
12313 }
12314
12315 _createClass(Swiper, [{
12316 key: "init",
12317 value: function init() {
12318 var _this2 = this;
12319
12320 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
12321 swipeable = _ref.swipeable,
12322 autoRefresh = _ref.autoRefresh;
12323
12324 this.initialized = true;
12325 this.target = this.getElement().children[0];
12326 this.blocker = this.getElement().children[1];
12327
12328 if (!this.target || !this.blocker) {
12329 util$4.throw('Expected "target" and "blocker" elements to exist before initializing Swiper');
12330 }
12331
12332 if (!this.shouldBlock) {
12333 this.blocker.style.display = 'none';
12334 } // Add classes
12335
12336
12337 this.getElement().classList.add('ons-swiper');
12338 this.target.classList.add('ons-swiper-target');
12339 this.blocker.classList.add('ons-swiper-blocker'); // Setup listeners
12340
12341 this._gestureDetector = new GestureDetector(this.getElement(), {
12342 dragMinDistance: 1,
12343 dragLockToAxis: true,
12344 passive: !this._shouldFixScroll
12345 });
12346 this._mutationObserver = new MutationObserver(function () {
12347 return _this2.refresh();
12348 });
12349 this.updateSwipeable(swipeable);
12350 this.updateAutoRefresh(autoRefresh); // Setup initial layout
12351
12352 this._scroll = this._offset = this._lastActiveIndex = 0;
12353
12354 this._updateLayout();
12355
12356 this._setupInitialIndex();
12357
12358 setImmediate(function () {
12359 return _this2.initialized && _this2._setupInitialIndex();
12360 }); // Fix rendering glitch on Android 4.1
12361 // Fix for iframes where the width is inconsistent at the beginning
12362
12363 if (window !== window.parent || this.offsetHeight === 0) {
12364 window.requestAnimationFrame(function () {
12365 return _this2.initialized && _this2.onResize();
12366 });
12367 }
12368 }
12369 }, {
12370 key: "dispose",
12371 value: function dispose() {
12372 this.initialized = false;
12373 this.updateSwipeable(false);
12374 this.updateAutoRefresh(false);
12375 this._gestureDetector && this._gestureDetector.dispose();
12376 this.target = this.blocker = this._gestureDetector = this._mutationObserver = null;
12377 this.setupResize(false);
12378 }
12379 }, {
12380 key: "onResize",
12381 value: function onResize() {
12382 var i = this._scroll / this.itemNumSize;
12383
12384 this._reset();
12385
12386 this.setActiveIndex(i);
12387 this.refresh();
12388 }
12389 }, {
12390 key: "itemCount",
12391 get: function get() {
12392 return this.target.children.length;
12393 }
12394 }, {
12395 key: "itemNumSize",
12396 get: function get() {
12397 if (typeof this._itemNumSize !== 'number' || this._itemNumSize !== this._itemNumSize) {
12398 this._itemNumSize = this._calculateItemSize();
12399 }
12400
12401 return this._itemNumSize;
12402 }
12403 }, {
12404 key: "maxScroll",
12405 get: function get() {
12406 var max = this.itemCount * this.itemNumSize - this.targetSize;
12407 return Math.ceil(max < 0 ? 0 : max); // Need to return an integer value.
12408 }
12409 }, {
12410 key: "_calculateItemSize",
12411 value: function _calculateItemSize() {
12412 var matches = this.itemSize.match(/^(\d+)(px|%)/);
12413
12414 if (!matches) {
12415 util$4.throw("Invalid state: swiper's size unit must be '%' or 'px'");
12416 }
12417
12418 var value = parseInt(matches[1], 10);
12419 return matches[2] === '%' ? Math.round(value / 100 * this.targetSize) : value;
12420 }
12421 }, {
12422 key: "_setupInitialIndex",
12423 value: function _setupInitialIndex() {
12424 this._reset();
12425
12426 this._lastActiveIndex = Math.max(Math.min(Number(this.getInitialIndex()), this.itemCount), 0);
12427 this._scroll = this._offset + this.itemNumSize * this._lastActiveIndex;
12428
12429 this._scrollTo(this._scroll);
12430 }
12431 }, {
12432 key: "_setSwiping",
12433 value: function _setSwiping(toggle) {
12434 this.target.classList.toggle('swiping', toggle); // Hides everything except shown pages
12435 }
12436 }, {
12437 key: "setActiveIndex",
12438 value: function setActiveIndex(index) {
12439 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12440
12441 this._setSwiping(true);
12442
12443 index = Math.max(0, Math.min(index, this.itemCount - 1));
12444 var scroll = Math.max(0, Math.min(this.maxScroll, this._offset + this.itemNumSize * index));
12445 return this._changeTo(scroll, options);
12446 }
12447 }, {
12448 key: "getActiveIndex",
12449 value: function getActiveIndex() {
12450 var scroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._scroll;
12451 scroll -= this._offset;
12452 var count = this.itemCount,
12453 size = this.itemNumSize;
12454
12455 if (this.itemNumSize === 0 || !util$4.isInteger(scroll)) {
12456 return this._lastActiveIndex;
12457 }
12458
12459 if (scroll <= 0) {
12460 return 0;
12461 }
12462
12463 for (var i = 0; i < count; i++) {
12464 if (size * i <= scroll && size * (i + 1) > scroll) {
12465 return i;
12466 }
12467 }
12468
12469 return count - 1;
12470 }
12471 }, {
12472 key: "setupResize",
12473 value: function setupResize(add) {
12474 window[(add ? 'add' : 'remove') + 'EventListener']('resize', this.onResize, true);
12475 }
12476 }, {
12477 key: "show",
12478 value: function show() {
12479 var _this3 = this;
12480
12481 this.setupResize(true);
12482 this.onResize();
12483 setTimeout(function () {
12484 return _this3.target && _this3.target.classList.add('active');
12485 }, 1000 / 60); // Hide elements after animations
12486 }
12487 }, {
12488 key: "hide",
12489 value: function hide() {
12490 this.setupResize(false);
12491 this.target.classList.remove('active'); // Show elements before animations
12492 }
12493 }, {
12494 key: "updateSwipeable",
12495 value: function updateSwipeable(shouldUpdate) {
12496 if (this._gestureDetector) {
12497 var action = shouldUpdate ? 'on' : 'off';
12498
12499 this._gestureDetector[action]('drag', this.onDrag);
12500
12501 this._gestureDetector[action]('dragstart', this.onDragStart);
12502
12503 this._gestureDetector[action]('dragend', this.onDragEnd);
12504 }
12505 }
12506 }, {
12507 key: "updateAutoRefresh",
12508 value: function updateAutoRefresh(shouldWatch) {
12509 if (this._mutationObserver) {
12510 shouldWatch ? this._mutationObserver.observe(this.target, {
12511 childList: true
12512 }) : this._mutationObserver.disconnect();
12513 }
12514 }
12515 }, {
12516 key: "updateItemSize",
12517 value: function updateItemSize(newSize) {
12518 this.itemSize = newSize || '100%';
12519 this.refresh();
12520 }
12521 }, {
12522 key: "toggleBlocker",
12523 value: function toggleBlocker(block) {
12524 this.blocker.style.pointerEvents = block ? 'auto' : 'none';
12525 }
12526 }, {
12527 key: "_canConsumeGesture",
12528 value: function _canConsumeGesture(gesture) {
12529 var d = gesture.direction;
12530 var isFirst = this._scroll === 0 && !this.isOverScrollable();
12531 var isLast = this._scroll === this.maxScroll && !this.isOverScrollable();
12532 return this.isVertical() ? d === 'down' && !isFirst || d === 'up' && !isLast : d === 'right' && !isFirst || d === 'left' && !isLast;
12533 }
12534 }, {
12535 key: "onDragStart",
12536 value: function onDragStart(event) {
12537 var _this4 = this;
12538
12539 this._ignoreDrag = event.consumed || !util$4.isValidGesture(event);
12540
12541 if (!this._ignoreDrag) {
12542 var consume = event.consume;
12543
12544 event.consume = function () {
12545 consume && consume();
12546 _this4._ignoreDrag = true;
12547 };
12548
12549 if (this._canConsumeGesture(event.gesture)) {
12550 var startX = event.gesture.center && event.gesture.center.clientX || 0,
12551 distFromEdge = this.getBubbleWidth() || 0,
12552 start = function start() {
12553 consume && consume();
12554 event.consumed = true;
12555 _this4._started = true; // Avoid starting drag from outside
12556
12557 _this4.shouldBlock && _this4.toggleBlocker(true);
12558
12559 _this4._setSwiping(true);
12560
12561 util$4.iosPreventScroll(_this4._gestureDetector);
12562 }; // Let parent elements consume the gesture or consume it right away
12563
12564
12565 startX < distFromEdge || startX > this.targetSize - distFromEdge ? setImmediate(function () {
12566 return !_this4._ignoreDrag && start();
12567 }) : start();
12568 }
12569 }
12570 }
12571 }, {
12572 key: "onDrag",
12573 value: function onDrag(event) {
12574 if (!event.gesture || this._ignoreDrag || !this._started) {
12575 return;
12576 }
12577
12578 this._continued = true; // Fix for random 'dragend' without 'drag'
12579
12580 event.stopPropagation();
12581
12582 this._scrollTo(this._scroll - this._getDelta(event), {
12583 throttle: true
12584 });
12585 }
12586 }, {
12587 key: "onDragEnd",
12588 value: function onDragEnd(event) {
12589 this._started = false;
12590
12591 if (!event.gesture || this._ignoreDrag || !this._continued) {
12592 this._ignoreDrag = true; // onDragEnd might fire before onDragStart's setImmediate
12593
12594 return;
12595 }
12596
12597 this._continued = false;
12598 event.stopPropagation();
12599
12600 var scroll = this._scroll - this._getDelta(event);
12601
12602 var normalizedScroll = this._normalizeScroll(scroll);
12603
12604 scroll === normalizedScroll ? this._startMomentumScroll(scroll, event) : this._killOverScroll(normalizedScroll);
12605 this.shouldBlock && this.toggleBlocker(false);
12606 }
12607 }, {
12608 key: "_startMomentumScroll",
12609 value: function _startMomentumScroll(scroll, event) {
12610 var velocity = this._getVelocity(event),
12611 matchesDirection = event.gesture.interimDirection === this.dM.dir[this._getDelta(event) < 0 ? 0 : 1];
12612
12613 var nextScroll = this._getAutoScroll(scroll, velocity, matchesDirection);
12614
12615 var duration = Math.abs(nextScroll - scroll) / (velocity + 0.01) / 1000;
12616 duration = Math.min(.25, Math.max(.1, duration));
12617
12618 this._changeTo(nextScroll, {
12619 swipe: true,
12620 animationOptions: {
12621 duration: duration,
12622 timing: 'cubic-bezier(.4, .7, .5, 1)'
12623 }
12624 });
12625 }
12626 }, {
12627 key: "_killOverScroll",
12628 value: function _killOverScroll(scroll) {
12629 var _this5 = this;
12630
12631 this._scroll = scroll;
12632 var direction = this.dM.dir[Number(scroll > 0)];
12633
12634 var killOverScroll = function killOverScroll() {
12635 return _this5._changeTo(scroll, {
12636 animationOptions: {
12637 duration: .4,
12638 timing: 'cubic-bezier(.1, .4, .1, 1)'
12639 }
12640 });
12641 };
12642
12643 this.overScrollHook({
12644 direction: direction,
12645 killOverScroll: killOverScroll
12646 }) || killOverScroll();
12647 }
12648 }, {
12649 key: "_changeTo",
12650 value: function _changeTo(scroll) {
12651 var _this6 = this;
12652
12653 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12654 var e = {
12655 activeIndex: this.getActiveIndex(scroll),
12656 lastActiveIndex: this._lastActiveIndex,
12657 swipe: options.swipe || false
12658 };
12659 var change = e.activeIndex !== e.lastActiveIndex;
12660 var canceled = change ? this.preChangeHook(e) : false;
12661 this._scroll = canceled ? this._offset + e.lastActiveIndex * this.itemNumSize : scroll;
12662 this._lastActiveIndex = canceled ? e.lastActiveIndex : e.activeIndex;
12663 return this._scrollTo(this._scroll, options).then(function () {
12664 if (scroll === _this6._scroll && !canceled) {
12665 _this6._setSwiping(false);
12666
12667 change && _this6.postChangeHook(e);
12668 } else if (options.reject) {
12669 _this6._setSwiping(false);
12670
12671 return Promise.reject('Canceled');
12672 }
12673 });
12674 }
12675 }, {
12676 key: "_scrollTo",
12677 value: function _scrollTo(scroll) {
12678 var _this7 = this;
12679
12680 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12681
12682 if (options.throttle) {
12683 var ratio = 0.35;
12684
12685 if (scroll < 0) {
12686 scroll = this.isOverScrollable() ? Math.round(scroll * ratio) : 0;
12687 } else {
12688 var maxScroll = this.maxScroll;
12689
12690 if (maxScroll < scroll) {
12691 scroll = this.isOverScrollable() ? maxScroll + Math.round((scroll - maxScroll) * ratio) : maxScroll;
12692 }
12693 }
12694 }
12695
12696 var opt = options.animation === 'none' ? {} : options.animationOptions;
12697 this.scrollHook && this.itemNumSize > 0 && this.scrollHook((scroll / this.itemNumSize).toFixed(2), options.animationOptions || {});
12698 return new Promise(function (resolve) {
12699 return Animit(_this7.target).queue({
12700 transform: _this7._getTransform(scroll)
12701 }, opt).play(resolve);
12702 });
12703 }
12704 }, {
12705 key: "_getAutoScroll",
12706 value: function _getAutoScroll(scroll, velocity, matchesDirection) {
12707 var max = this.maxScroll,
12708 offset = this._offset,
12709 size = this.itemNumSize;
12710
12711 if (!this.isAutoScrollable()) {
12712 return Math.max(0, Math.min(max, scroll));
12713 }
12714
12715 var arr = [];
12716
12717 for (var s = offset; s < max; s += size) {
12718 arr.push(s);
12719 }
12720
12721 arr.push(max);
12722 arr = arr.sort(function (left, right) {
12723 return Math.abs(left - scroll) - Math.abs(right - scroll);
12724 }).filter(function (item, pos) {
12725 return !pos || item !== arr[pos - 1];
12726 });
12727 var result = arr[0];
12728 var lastScroll = this._lastActiveIndex * size + offset;
12729 var scrollRatio = Math.abs(scroll - lastScroll) / size;
12730
12731 if (scrollRatio <= this.getAutoScrollRatio(matchesDirection, velocity, size)) {
12732 result = lastScroll;
12733 } else {
12734 if (scrollRatio < 1.0 && arr[0] === lastScroll && arr.length > 1) {
12735 result = arr[1];
12736 }
12737 }
12738
12739 return Math.max(0, Math.min(max, result));
12740 }
12741 }, {
12742 key: "_reset",
12743 value: function _reset() {
12744 this._targetSize = this._itemNumSize = undefined;
12745 }
12746 }, {
12747 key: "_normalizeScroll",
12748 value: function _normalizeScroll(scroll) {
12749 return Math.max(Math.min(scroll, this.maxScroll), 0);
12750 }
12751 }, {
12752 key: "refresh",
12753 value: function refresh() {
12754 this._reset();
12755
12756 this._updateLayout();
12757
12758 if (util$4.isInteger(this._scroll)) {
12759 var scroll = this._normalizeScroll(this._scroll);
12760
12761 scroll !== this._scroll ? this._killOverScroll(scroll) : this._changeTo(scroll);
12762 } else {
12763 this._setupInitialIndex();
12764 }
12765
12766 this.refreshHook();
12767 }
12768 }, {
12769 key: "targetSize",
12770 get: function get() {
12771 if (!this._targetSize) {
12772 this._targetSize = this.target["offset".concat(this.dM.size)];
12773 }
12774
12775 return this._targetSize;
12776 }
12777 }, {
12778 key: "_getDelta",
12779 value: function _getDelta(event) {
12780 return event.gesture["delta".concat(this.dM.axis)];
12781 }
12782 }, {
12783 key: "_getVelocity",
12784 value: function _getVelocity(event) {
12785 return event.gesture["velocity".concat(this.dM.axis)];
12786 }
12787 }, {
12788 key: "_getTransform",
12789 value: function _getTransform(scroll) {
12790 return "translate3d(".concat(this.dM.t3d[0]).concat(-scroll).concat(this.dM.t3d[1], ")");
12791 }
12792 }, {
12793 key: "_updateLayout",
12794 value: function _updateLayout() {
12795 this.dM = directionMap[this.isVertical() ? 'vertical' : 'horizontal'];
12796 this.target.classList.toggle('ons-swiper-target--vertical', this.isVertical());
12797
12798 for (var c = this.target.children[0]; c; c = c.nextElementSibling) {
12799 c.style[this.dM.size.toLowerCase()] = this.itemSize;
12800 }
12801
12802 if (this.isCentered()) {
12803 this._offset = (this.targetSize - this.itemNumSize) / -2 || 0;
12804 }
12805 }
12806 }]);
12807
12808 return Swiper;
12809 }();
12810
12811 /**
12812 * @element ons-carousel
12813 * @category carousel
12814 * @description
12815 * [en]
12816 * Carousel component. A carousel can be used to display several items in the same space.
12817 *
12818 * The component supports displaying content both horizontally and vertically. The user can scroll through the items by dragging and it can also be controller programmatically.
12819 * [/en]
12820 * [ja][/ja]
12821 * @codepen xbbzOQ
12822 * @tutorial vanilla/Reference/carousel
12823 * @seealso ons-carousel-item
12824 * [en]`<ons-carousel-item>` component[/en]
12825 * [ja]ons-carousel-itemコンポーネント[/ja]
12826 * @example
12827 * <ons-carousel style="width: 100%; height: 200px">
12828 * <ons-carousel-item>
12829 * ...
12830 * </ons-carousel-item>
12831 * <ons-carousel-item>
12832 * ...
12833 * </ons-carousel-item>
12834 * </ons-carousel>
12835 */
12836
12837 var CarouselElement = /*#__PURE__*/function (_BaseElement) {
12838 _inherits(CarouselElement, _BaseElement);
12839
12840 var _super = _createSuper(CarouselElement);
12841
12842 /**
12843 * @event postchange
12844 * @description
12845 * [en]Fired just after the current carousel item has changed.[/en]
12846 * [ja]現在表示しているカルーセルの要素が変わった時に発火します。[/ja]
12847 * @param {Object} event
12848 * [en]Event object.[/en]
12849 * [ja]イベントオブジェクトです。[/ja]
12850 * @param {Object} event.carousel
12851 * [en]Carousel object.[/en]
12852 * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
12853 * @param {Number} event.activeIndex
12854 * [en]Current active index.[/en]
12855 * [ja]現在アクティブになっている要素のインデックス。[/ja]
12856 * @param {Number} event.lastActiveIndex
12857 * [en]Previous active index.[/en]
12858 * [ja]以前アクティブだった要素のインデックス。[/ja]
12859 */
12860
12861 /**
12862 * @event prechange
12863 * @description
12864 * [en]Fired just before the current carousel item changes.[/en]
12865 * [ja][/ja]
12866 * @param {Object} event
12867 * [en]Event object.[/en]
12868 * [ja]イベントオブジェクトです。[/ja]
12869 * @param {Object} event.carousel
12870 * [en]Carousel object.[/en]
12871 * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
12872 * @param {Number} event.activeIndex
12873 * [en]Current active index.[/en]
12874 * [ja]現在アクティブになっている要素のインデックス。[/ja]
12875 * @param {Number} event.lastActiveIndex
12876 * [en]Previous active index.[/en]
12877 * [ja]以前アクティブだった要素のインデックス。[/ja]
12878 */
12879
12880 /**
12881 * @event refresh
12882 * @description
12883 * [en]Fired when the carousel has been refreshed.[/en]
12884 * [ja]カルーセルが更新された時に発火します。[/ja]
12885 * @param {Object} event
12886 * [en]Event object.[/en]
12887 * [ja]イベントオブジェクトです。[/ja]
12888 * @param {Object} event.carousel
12889 * [en]Carousel object.[/en]
12890 * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
12891 */
12892
12893 /**
12894 * @event overscroll
12895 * @description
12896 * [en]Fired when the carousel has been overscrolled.[/en]
12897 * [ja]カルーセルがオーバースクロールした時に発火します。[/ja]
12898 * @param {Object} event
12899 * [en]Event object.[/en]
12900 * [ja]イベントオブジェクトです。[/ja]
12901 * @param {Object} event.carousel
12902 * [en]Fired when the carousel has been refreshed.[/en]
12903 * [ja]カルーセルが更新された時に発火します。[/ja]
12904 * @param {Number} event.activeIndex
12905 * [en]Current active index.[/en]
12906 * [ja]現在アクティブになっている要素のインデックス。[/ja]
12907 * @param {String} event.direction
12908 * [en]Can be one of either "up", "down", "left" or "right".[/en]
12909 * [ja]オーバースクロールされた方向が得られます。"up", "down", "left", "right"のいずれかの方向が渡されます。[/ja]
12910 * @param {Function} event.waitToReturn
12911 * [en]Takes a <code>Promise</code> object as an argument. The carousel will not scroll back until the promise has been resolved or rejected.[/en]
12912 * [ja]この関数はPromiseオブジェクトを引数として受け取ります。渡したPromiseオブジェクトがresolveされるかrejectされるまで、カルーセルはスクロールバックしません。[/ja]
12913 */
12914
12915 /**
12916 * @event swipe
12917 * @description
12918 * [en]Fires when the carousel swipes.[/en]
12919 * [ja][/ja]
12920 * @param {Object} event
12921 * [en]Event object.[/en]
12922 * [ja]イベントオブジェクト。[/ja]
12923 * @param {Number} event.index
12924 * [en]Current index.[/en]
12925 * [ja]現在アクティブになっているons-carouselのインデックスを返します。[/ja]
12926 * @param {Object} event.options
12927 * [en]Animation options object.[/en]
12928 * [ja][/ja]
12929 */
12930
12931 /**
12932 * @attribute direction
12933 * @type {String}
12934 * @description
12935 * [en]The direction of the carousel. Can be either "horizontal" or "vertical". Default is "horizontal".[/en]
12936 * [ja]カルーセルの方向を指定します。"horizontal"か"vertical"を指定できます。"horizontal"がデフォルト値です。[/ja]
12937 */
12938
12939 /**
12940 * @attribute fullscreen
12941 * @description
12942 * [en]If this attribute is set the carousel will cover the whole screen.[/en]
12943 * [ja]この属性があると、absoluteポジションを使ってカルーセルが自動的に画面いっぱいに広がります。[/ja]
12944 */
12945
12946 /**
12947 * @property fullscreen
12948 * @type {Boolean}
12949 * @description
12950 * [en]If this property is set the carousel will cover the whole screen.[/en]
12951 * [ja]この属性があると、absoluteポジションを使ってカルーセルが自動的に画面いっぱいに広がります。[/ja]
12952 */
12953
12954 /**
12955 * @attribute overscrollable
12956 * @description
12957 * [en]If this attribute is set the carousel will be scrollable over the edge. It will bounce back when released.[/en]
12958 * [ja]この属性がある時、タッチやドラッグで端までスクロールした時に、バウンドするような効果が当たります。[/ja]
12959 */
12960
12961 /**
12962 * @attribute centered
12963 * @description
12964 * [en]If this attribute is set the carousel then the selected item will be in the center of the carousel instead of the beginning. Useful only when the items are smaller than the carousel. [/en]
12965 * [ja]この属性がある時、選んでいるons-carousel-itemはカルーセルの真ん中へ行きます。項目がカルーセルよりも小さい場合にのみ、これは便利です。[/ja]
12966 */
12967
12968 /**
12969 * @attribute item-width
12970 * @type {String}
12971 * @description
12972 * [en]ons-carousel-item's width. Only works when the direction is set to "horizontal".[/en]
12973 * [ja]ons-carousel-itemの幅を指定します。この属性は、direction属性に"horizontal"を指定した時のみ有効になります。[/ja]
12974 */
12975
12976 /**
12977 * @attribute item-height
12978 * @type {String}
12979 * @description
12980 * [en]ons-carousel-item's height. Only works when the direction is set to "vertical".[/en]
12981 * [ja]ons-carousel-itemの高さを指定します。この属性は、direction属性に"vertical"を指定した時のみ有効になります。[/ja]
12982 */
12983
12984 /**
12985 * @attribute auto-scroll
12986 * @description
12987 * [en]If this attribute is set the carousel will be automatically scrolled to the closest item border when released.[/en]
12988 * [ja]この属性がある時、一番近いcarousel-itemの境界まで自動的にスクロールするようになります。[/ja]
12989 */
12990
12991 /**
12992 * @attribute auto-scroll-ratio
12993 * @type {Number}
12994 * @description
12995 * [en]A number between 0.0 and 1.0 that specifies how much the user must drag the carousel in order for it to auto scroll to the next item.[/en]
12996 * [ja]0.0から1.0までの値を指定します。カルーセルの要素をどれぐらいの割合までドラッグすると次の要素に自動的にスクロールするかを指定します。[/ja]
12997 */
12998
12999 /**
13000 * @attribute swipeable
13001 * @description
13002 * [en]If this attribute is set the carousel can be scrolled by drag or swipe.[/en]
13003 * [ja]この属性がある時、カルーセルをスワイプやドラッグで移動できるようになります。[/ja]
13004 */
13005
13006 /**
13007 * @attribute disabled
13008 * @description
13009 * [en]If this attribute is set the carousel is disabled.[/en]
13010 * [ja]この属性がある時、dragやtouchやswipeを受け付けなくなります。[/ja]
13011 */
13012
13013 /**
13014 * @attribute initial-index
13015 * @initonly
13016 * @default 0
13017 * @type {Number}
13018 * @description
13019 * [en]Specify the index of the ons-carousel-item to show initially. Default is 0. If active-index is set, initial-index is ignored.[/en]
13020 * [ja]最初に表示するons-carousel-itemを0始まりのインデックスで指定します。デフォルト値は 0 です。[/ja]
13021 */
13022
13023 /**
13024 * @attribute auto-refresh
13025 * @description
13026 * [en]When this attribute is set the carousel will automatically refresh when the number of child nodes change.[/en]
13027 * [ja]この属性がある時、子要素の数が変わるとカルーセルは自動的に更新されるようになります。[/ja]
13028 */
13029
13030 /**
13031 * @property autoRefresh
13032 * @type {Boolean}
13033 * @description
13034 * [en]When this property is set the carousel will automatically refresh when the number of child nodes change.[/en]
13035 * [ja]この属性がある時、子要素の数が変わるとカルーセルは自動的に更新されるようになります。[/ja]
13036 */
13037
13038 /**
13039 * @attribute animation
13040 * @type {String}
13041 * @description
13042 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
13043 * [ja][/ja]
13044 */
13045
13046 /**
13047 * @attribute animation-options
13048 * @type {Expression}
13049 * @description
13050 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
13051 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
13052 */
13053 function CarouselElement() {
13054 var _this;
13055
13056 _classCallCheck(this, CarouselElement);
13057
13058 _this = _super.call(this);
13059
13060 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'swipe'),
13061 onConnected = _util$defineListenerP.onConnected,
13062 onDisconnected = _util$defineListenerP.onDisconnected;
13063
13064 _this._connectOnSwipe = onConnected;
13065 _this._disconnectOnSwipe = onDisconnected;
13066 contentReady(_assertThisInitialized(_this), function () {
13067 return _this._compile();
13068 });
13069 return _this;
13070 }
13071
13072 _createClass(CarouselElement, [{
13073 key: "_compile",
13074 value: function _compile() {
13075 var target = this.children[0] && this.children[0].tagName !== 'ONS-CAROUSEL-ITEM' && this.children[0] || document.createElement('div');
13076
13077 if (!target.parentNode) {
13078 while (this.firstChild) {
13079 target.appendChild(this.firstChild);
13080 }
13081
13082 this.appendChild(target);
13083 }
13084
13085 !this.children[1] && this.appendChild(document.createElement('div'));
13086 this.appendChild = this.appendChild.bind(target);
13087 this.insertBefore = this.insertBefore.bind(target);
13088 }
13089 }, {
13090 key: "connectedCallback",
13091 value: function connectedCallback() {
13092 var _this2 = this;
13093
13094 if (!this._swiper) {
13095 this._swiper = new Swiper({
13096 getElement: function getElement() {
13097 return _this2;
13098 },
13099 getInitialIndex: function getInitialIndex() {
13100 return _this2.getAttribute('active-index') || _this2.getAttribute('initial-index');
13101 },
13102 getAutoScrollRatio: function getAutoScrollRatio() {
13103 return _this2.autoScrollRatio;
13104 },
13105 isVertical: function isVertical() {
13106 return _this2.vertical;
13107 },
13108 isOverScrollable: function isOverScrollable() {
13109 return _this2.overscrollable;
13110 },
13111 isCentered: function isCentered() {
13112 return _this2.centered;
13113 },
13114 isAutoScrollable: function isAutoScrollable() {
13115 return _this2.autoScroll;
13116 },
13117 itemSize: this.itemSize,
13118 overScrollHook: this._onOverScroll.bind(this),
13119 preChangeHook: this._onPreChange.bind(this),
13120 postChangeHook: this._onPostChange.bind(this),
13121 refreshHook: this._onRefresh.bind(this),
13122 scrollHook: function scrollHook(index, options) {
13123 return util$4.triggerElementEvent(_this2, 'swipe', {
13124 index: index,
13125 options: options
13126 });
13127 }
13128 });
13129 contentReady(this, function () {
13130 return _this2._swiper.init({
13131 swipeable: _this2.hasAttribute('swipeable'),
13132 autoRefresh: _this2.hasAttribute('auto-refresh')
13133 });
13134 });
13135 }
13136
13137 this._connectOnSwipe();
13138 }
13139 }, {
13140 key: "disconnectedCallback",
13141 value: function disconnectedCallback() {
13142 if (this._swiper && this._swiper.initialized) {
13143 this._swiper.dispose();
13144
13145 this._swiper = null;
13146 }
13147
13148 this._disconnectOnSwipe();
13149 }
13150 }, {
13151 key: "attributeChangedCallback",
13152 value: function attributeChangedCallback(name, last, current) {
13153 if (!this._swiper) {
13154 return;
13155 }
13156
13157 switch (name) {
13158 case 'swipeable':
13159 this._swiper.updateSwipeable(this.hasAttribute('swipeable'));
13160
13161 break;
13162
13163 case 'auto-refresh':
13164 this._swiper.updateAutoRefresh(this.hasAttribute('auto-refresh'));
13165
13166 break;
13167
13168 case 'item-height':
13169 this.vertical && this._swiper.updateItemSize(this.itemSize);
13170 break;
13171
13172 case 'item-width':
13173 this.vertical || this._swiper.updateItemSize(this.itemSize);
13174 break;
13175
13176 case 'direction':
13177 this._swiper.refresh();
13178
13179 break;
13180
13181 case 'active-index':
13182 if (this.getActiveIndex() !== this.activeIndex) {
13183 this.setActiveIndex(this.activeIndex);
13184 }
13185
13186 break;
13187 }
13188 }
13189 }, {
13190 key: "_show",
13191 value: function _show() {
13192 this._swiper.show();
13193 }
13194 }, {
13195 key: "_hide",
13196 value: function _hide() {
13197 this._swiper.hide();
13198 }
13199 }, {
13200 key: "_onOverScroll",
13201 value: function _onOverScroll(_ref) {
13202 var direction = _ref.direction,
13203 killOverScroll = _ref.killOverScroll;
13204 var waitForAction = false;
13205 util$4.triggerElementEvent(this, 'overscroll', {
13206 carousel: this,
13207 activeIndex: this.getActiveIndex(),
13208 direction: direction,
13209 waitToReturn: function waitToReturn(promise) {
13210 waitForAction = true;
13211 promise.then(killOverScroll);
13212 }
13213 });
13214 return waitForAction;
13215 }
13216 }, {
13217 key: "_onPreChange",
13218 value: function _onPreChange(_ref2) {
13219 var activeIndex = _ref2.activeIndex,
13220 lastActiveIndex = _ref2.lastActiveIndex;
13221 util$4.triggerElementEvent(this, 'prechange', {
13222 carousel: this,
13223 activeIndex: activeIndex,
13224 lastActiveIndex: lastActiveIndex
13225 });
13226 }
13227 }, {
13228 key: "_onPostChange",
13229 value: function _onPostChange(_ref3) {
13230 var activeIndex = _ref3.activeIndex,
13231 lastActiveIndex = _ref3.lastActiveIndex;
13232 this.activeIndex = activeIndex;
13233 util$4.triggerElementEvent(this, 'postchange', {
13234 carousel: this,
13235 activeIndex: activeIndex,
13236 lastActiveIndex: lastActiveIndex
13237 });
13238 }
13239 }, {
13240 key: "_onRefresh",
13241 value: function _onRefresh() {
13242 util$4.triggerElementEvent(this, 'refresh', {
13243 carousel: this
13244 });
13245 }
13246 /**
13247 * @method setActiveIndex
13248 * @signature setActiveIndex(index, [options])
13249 * @param {Number} index
13250 * [en]The index that the carousel should be set to.[/en]
13251 * [ja]carousel要素のインデックスを指定します。[/ja]
13252 * @param {Object} [options]
13253 * [en]Parameter object.[/en]
13254 * [ja][/ja]
13255 * @param {Function} [options.callback]
13256 * [en]A function that will be called after the animation is finished.[/en]
13257 * [ja][/ja]
13258 * @param {String} [options.animation]
13259 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
13260 * [ja][/ja]
13261 * @param {Object} [options.animationOptions]
13262 * [en]An object that can be used to specify duration, delay and timing function of the animation.[/en]
13263 * [ja][/ja]
13264 * @description
13265 * [en]Specify the index of the `<ons-carousel-item>` to show.[/en]
13266 * [ja]表示するons-carousel-itemをindexで指定します。[/ja]
13267 * @return {Promise}
13268 * [en]Resolves to the carousel element.[/en]
13269 * [ja][/ja]
13270 */
13271
13272 }, {
13273 key: "setActiveIndex",
13274 value: function setActiveIndex(index) {
13275 var _this3 = this;
13276
13277 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
13278 options = _objectSpread2({
13279 animation: this.getAttribute('animation'),
13280 animationOptions: this.animationOptions || {
13281 duration: .3,
13282 timing: 'cubic-bezier(.4, .7, .5, 1)'
13283 }
13284 }, options);
13285 return this._swiper.setActiveIndex(index, options).then(function () {
13286 options.callback instanceof Function && options.callback(_this3);
13287 return Promise.resolve(_this3);
13288 });
13289 }
13290 /**
13291 * @method getActiveIndex
13292 * @signature getActiveIndex()
13293 * @return {Number}
13294 * [en]The current carousel item index.[/en]
13295 * [ja]現在表示しているカルーセル要素のインデックスが返されます。[/ja]
13296 * @description
13297 * [en]Returns the index of the currently visible `<ons-carousel-item>`.[/en]
13298 * [ja]現在表示されているons-carousel-item要素のインデックスを返します。[/ja]
13299 */
13300
13301 }, {
13302 key: "getActiveIndex",
13303 value: function getActiveIndex() {
13304 return this._swiper.getActiveIndex();
13305 }
13306 /**
13307 * @method next
13308 * @signature next([options])
13309 * @param {Object} [options]
13310 * [en]Parameter object.[/en]
13311 * [ja][/ja]
13312 * @param {Function} [options.callback]
13313 * [en]A function that will be executed after the animation has finished.[/en]
13314 * [ja][/ja]
13315 * @param {String} [options.animation]
13316 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
13317 * [ja][/ja]
13318 * @param {Object} [options.animationOptions]
13319 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
13320 * [ja][/ja]
13321 * @return {Promise}
13322 * [en]Resolves to the carousel element[/en]
13323 * [ja][/ja]
13324 * @description
13325 * [en]Show next `<ons-carousel-item>`.[/en]
13326 * [ja]次のons-carousel-itemを表示します。[/ja]
13327 */
13328
13329 }, {
13330 key: "next",
13331 value: function next(options) {
13332 return this.setActiveIndex(this.getActiveIndex() + 1, options);
13333 }
13334 /**
13335 * @method prev
13336 * @signature prev([options])
13337 * @param {Object} [options]
13338 * [en]Parameter object.[/en]
13339 * [ja][/ja]
13340 * @param {Function} [options.callback]
13341 * [en]A function that will be executed after the animation has finished.[/en]
13342 * [ja][/ja]
13343 * @param {String} [options.animation]
13344 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
13345 * [ja][/ja]
13346 * @param {Object} [options.animationOptions]
13347 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
13348 * [ja][/ja]
13349 * @return {Promise}
13350 * [en]Resolves to the carousel element[/en]
13351 * [ja][/ja]
13352 * @description
13353 * [en]Show previous `<ons-carousel-item>`.[/en]
13354 * [ja]前のons-carousel-itemを表示します。[/ja]
13355 */
13356
13357 }, {
13358 key: "prev",
13359 value: function prev(options) {
13360 return this.setActiveIndex(this.getActiveIndex() - 1, options);
13361 }
13362 /**
13363 * @method first
13364 * @signature first()
13365 * @param {Object} [options]
13366 * [en]Parameter object.[/en]
13367 * [ja][/ja]
13368 * @param {Function} [options.callback]
13369 * [en]A function that will be executed after the animation has finished.[/en]
13370 * [ja][/ja]
13371 * @param {String} [options.animation]
13372 * [en]If this is set to `"none"`, the transitions will not be animated.[/en]
13373 * [ja][/ja]
13374 * @param {Object} [options.animationOptions]
13375 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
13376 * [ja][/ja]
13377 * @return {Promise}
13378 * [en]Resolves to the carousel element[/en]
13379 * [ja][/ja]
13380 * @description
13381 * [en]Show first `<ons-carousel-item>`.[/en]
13382 * [ja]最初のons-carousel-itemを表示します。[/ja]
13383 */
13384
13385 }, {
13386 key: "first",
13387 value: function first(options) {
13388 return this.setActiveIndex(0, options);
13389 }
13390 /**
13391 * @method last
13392 * @signature last()
13393 * @param {Object} [options]
13394 * [en]Parameter object.[/en]
13395 * [ja][/ja]
13396 * @param {Function} [options.callback]
13397 * [en]A function that will be executed after the animation has finished.[/en]
13398 * [ja][/ja]
13399 * @param {String} [options.animation]
13400 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
13401 * [ja][/ja]
13402 * @param {Object} [options.animationOptions]
13403 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
13404 * [ja][/ja]
13405 * @return {Promise}
13406 * [en]Resolves to the carousel element[/en]
13407 * [ja]Resolves to the carousel element[/ja]
13408 * @description
13409 * [en]Show last ons-carousel item.[/en]
13410 * [ja]最後のons-carousel-itemを表示します。[/ja]
13411 */
13412
13413 }, {
13414 key: "last",
13415 value: function last(options) {
13416 this.setActiveIndex(Math.max(this.itemCount - 1, 0), options);
13417 }
13418 /**
13419 * @method refresh
13420 * @signature refresh()
13421 * @description
13422 * [en]Update the layout of the carousel. Used when adding `<ons-carousel-items>` dynamically or to automatically adjust the size.[/en]
13423 * [ja]レイアウトや内部の状態を最新のものに更新します。ons-carousel-itemを動的に増やしたり、ons-carouselの大きさを動的に変える際に利用します。[/ja]
13424 */
13425
13426 }, {
13427 key: "refresh",
13428 value: function refresh() {
13429 this._swiper.refresh();
13430 }
13431 /**
13432 * @property itemCount
13433 * @readonly
13434 * @type {Number}
13435 * @description
13436 * [en]The number of carousel items.[/en]
13437 * [ja]カルーセル要素の数です。[/ja]
13438 */
13439
13440 }, {
13441 key: "itemCount",
13442 get: function get() {
13443 return this._swiper.itemCount;
13444 }
13445 /**
13446 * @property swipeable
13447 * @type {Boolean}
13448 * @description
13449 * [en]true if the carousel is swipeable.[/en]
13450 * [ja]swipeableであればtrueを返します。[/ja]
13451 */
13452
13453 /**
13454 * @property onSwipe
13455 * @type {Function}
13456 * @description
13457 * [en]Hook called whenever the user slides the carousel. It gets a decimal index and an animationOptions object as arguments.[/en]
13458 * [ja][/ja]
13459 */
13460
13461 /**
13462 * @property autoScroll
13463 * @type {Boolean}
13464 * @description
13465 * [en]true if auto scroll is enabled.[/en]
13466 * [ja]オートスクロールが有効であればtrueを返します。[/ja]
13467 */
13468
13469 }, {
13470 key: "vertical",
13471 get: function get() {
13472 return this.getAttribute('direction') === 'vertical';
13473 }
13474 }, {
13475 key: "itemSize",
13476 get: function get() {
13477 var itemSizeAttr = (this.getAttribute("item-".concat(this.vertical ? 'height' : 'width')) || '').trim();
13478 return itemSizeAttr.match(/^\d+(px|%)$/) ? itemSizeAttr : '100%';
13479 }
13480 /**
13481 * @property autoScrollRatio
13482 * @type {Number}
13483 * @description
13484 * [en]The current auto scroll ratio. [/en]
13485 * [ja]現在のオートスクロールのratio値。[/ja]
13486 */
13487
13488 }, {
13489 key: "autoScrollRatio",
13490 get: function get() {
13491 return parseFloat(this.getAttribute('auto-scroll-ratio'));
13492 },
13493 set: function set(ratio) {
13494 this.setAttribute('auto-scroll-ratio', ratio);
13495 }
13496 /**
13497 * @property disabled
13498 * @type {Boolean}
13499 * @description
13500 * [en]Whether the carousel is disabled or not.[/en]
13501 * [ja]無効化されている場合に`true`。[/ja]
13502 */
13503
13504 /**
13505 * @property overscrollable
13506 * @type {Boolean}
13507 * @description
13508 * [en]Whether the carousel is overscrollable or not.[/en]
13509 * [ja]overscrollできればtrueを返します。[/ja]
13510 */
13511
13512 /**
13513 * @property centered
13514 * @type {Boolean}
13515 * @description
13516 * [en]Whether the carousel is centered or not.[/en]
13517 * [ja]centered状態になっていればtrueを返します。[/ja]
13518 */
13519
13520 }, {
13521 key: "animationOptions",
13522 get:
13523 /**
13524 * @property animationOptions
13525 * @type {Object}
13526 * @description
13527 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
13528 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
13529 */
13530 function get() {
13531 var attr = this.getAttribute('animation-options');
13532
13533 if (attr) {
13534 return util$4.animationOptionsParse(attr);
13535 } else {
13536 return attr;
13537 }
13538 },
13539 set: function set(value) {
13540 if (value === undefined || value === null) {
13541 this.removeAttribute('animation-options');
13542 } else {
13543 this.setAttribute('animation-options', JSON.stringify(value));
13544 }
13545 }
13546 /**
13547 * @attribute active-index
13548 * @type {Number}
13549 * @description
13550 * [en]Specify the index of the carousel item that should be shown.[/en]
13551 * [ja][/ja]
13552 */
13553
13554 /**
13555 * @property activeIndex
13556 * @type {Number}
13557 * @description
13558 * [en]Specify the index of the carousel item that should be shown.[/en]
13559 * [ja][/ja]
13560 */
13561
13562 }, {
13563 key: "activeIndex",
13564 get: function get() {
13565 return parseInt(this.getAttribute('active-index'));
13566 },
13567 set: function set(value) {
13568 if (value !== undefined && value !== null) {
13569 this.setAttribute('active-index', value);
13570 }
13571 }
13572 }], [{
13573 key: "observedAttributes",
13574 get: function get() {
13575 return ['swipeable', 'auto-refresh', 'direction', 'item-height', 'item-width', 'active-index'];
13576 }
13577 }, {
13578 key: "events",
13579 get: function get() {
13580 return ['postchange', 'refresh', 'overscroll', 'prechange', 'swipe'];
13581 }
13582 }]);
13583
13584 return CarouselElement;
13585 }(BaseElement);
13586 util$4.defineBooleanProperties(CarouselElement, ['swipeable', 'disabled', 'overscrollable', 'auto-scroll', 'centered', 'fullscreen', 'auto-refresh']);
13587 onsElements.Carousel = CarouselElement;
13588 customElements.define('ons-carousel', CarouselElement);
13589
13590 /**
13591 * @element ons-col
13592 * @category grid
13593 * @description
13594 * [en]Represents a column in the grid system. Use with `<ons-row>` to layout components.[/en]
13595 * [ja]グリッドシステムにて列を定義します。ons-rowとともに使用し、コンポーネントのレイアウトに利用します。[/ja]
13596 * @note
13597 * [en]For Android 4.3 and earlier, and iOS6 and earlier, when using mixed alignment with ons-row and ons-column, they may not be displayed correctly. You can use only one alignment.[/en]
13598 * [ja]Android 4.3以前、もしくはiOS 6以前のOSの場合、ons-rowとons-columnを組み合わせた場合に描画が崩れる場合があります。[/ja]
13599 * @codepen GgujC {wide}
13600 * @guide theming.html [en]Layouting guide[/en][ja]レイアウト機能[/ja]
13601 * @seealso ons-row
13602 * [en]The `<ons-row>` component is the parent of `<ons-col>`.[/en]
13603 * [ja]ons-rowコンポーネント[/ja]
13604 * @example
13605 * <ons-row>
13606 * <ons-col width="50px"><ons-icon icon="fa-twitter"></ons-icon></ons-col>
13607 * <ons-col>Text</ons-col>
13608 * </ons-row>
13609 */
13610
13611 /**
13612 * @attribute vertical-align
13613 * @type {String}
13614 * @description
13615 * [en]Vertical alignment of the column. Valid values are "top", "center", and "bottom".[/en]
13616 * [ja]縦の配置を指定する。"top", "center", "bottom"のいずれかを指定します。[/ja]
13617 */
13618
13619 /**
13620 * @attribute width
13621 * @type {String}
13622 * @description
13623 * [en]The width of the column. Valid values are css width values ("10%", "50px").[/en]
13624 * [ja]カラムの横幅を指定する。パーセントもしくはピクセルで指定します(10%や50px)。[/ja]
13625 */
13626
13627 var ColElement = /*#__PURE__*/function (_BaseElement) {
13628 _inherits(ColElement, _BaseElement);
13629
13630 var _super = _createSuper(ColElement);
13631
13632 function ColElement() {
13633 var _this;
13634
13635 _classCallCheck(this, ColElement);
13636
13637 _this = _super.call(this);
13638
13639 if (_this.getAttribute('width')) {
13640 _this._updateWidth();
13641 }
13642
13643 return _this;
13644 }
13645
13646 _createClass(ColElement, [{
13647 key: "attributeChangedCallback",
13648 value: function attributeChangedCallback(name, last, current) {
13649 if (name === 'width') {
13650 this._updateWidth();
13651 }
13652 }
13653 }, {
13654 key: "_updateWidth",
13655 value: function _updateWidth() {
13656 var width = this.getAttribute('width');
13657
13658 if (!width) {
13659 styler.clear(this, 'flex maxWidth');
13660 } else {
13661 width = width.trim().match(/^\d+$/) ? width + '%' : width;
13662 styler(this, {
13663 flex: '0 0 ' + width,
13664 maxWidth: width
13665 });
13666 }
13667 }
13668 }], [{
13669 key: "observedAttributes",
13670 get: function get() {
13671 return ['width'];
13672 }
13673 }]);
13674
13675 return ColElement;
13676 }(BaseElement);
13677 onsElements.Col = ColElement;
13678 customElements.define('ons-col', ColElement);
13679
13680 var DialogAnimator = /*#__PURE__*/function (_BaseAnimator) {
13681 _inherits(DialogAnimator, _BaseAnimator);
13682
13683 var _super = _createSuper(DialogAnimator);
13684
13685 function DialogAnimator() {
13686 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
13687 _ref$timing = _ref.timing,
13688 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
13689 _ref$delay = _ref.delay,
13690 delay = _ref$delay === void 0 ? 0 : _ref$delay,
13691 _ref$duration = _ref.duration,
13692 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
13693
13694 _classCallCheck(this, DialogAnimator);
13695
13696 return _super.call(this, {
13697 timing: timing,
13698 delay: delay,
13699 duration: duration
13700 });
13701 }
13702 /**
13703 * @param {HTMLElement} dialog
13704 * @param {Function} done
13705 */
13706
13707
13708 _createClass(DialogAnimator, [{
13709 key: "show",
13710 value: function show(dialog, done) {
13711 done();
13712 }
13713 /**
13714 * @param {HTMLElement} dialog
13715 * @param {Function} done
13716 */
13717
13718 }, {
13719 key: "hide",
13720 value: function hide(dialog, done) {
13721 done();
13722 }
13723 }]);
13724
13725 return DialogAnimator;
13726 }(BaseAnimator);
13727 /**
13728 * Android style animator for dialog.
13729 */
13730
13731 var AndroidDialogAnimator = /*#__PURE__*/function (_DialogAnimator) {
13732 _inherits(AndroidDialogAnimator, _DialogAnimator);
13733
13734 var _super2 = _createSuper(AndroidDialogAnimator);
13735
13736 function AndroidDialogAnimator() {
13737 var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
13738 _ref2$timing = _ref2.timing,
13739 timing = _ref2$timing === void 0 ? 'ease-in-out' : _ref2$timing,
13740 _ref2$delay = _ref2.delay,
13741 delay = _ref2$delay === void 0 ? 0 : _ref2$delay,
13742 _ref2$duration = _ref2.duration,
13743 duration = _ref2$duration === void 0 ? 0.3 : _ref2$duration;
13744
13745 _classCallCheck(this, AndroidDialogAnimator);
13746
13747 return _super2.call(this, {
13748 timing: timing,
13749 delay: delay,
13750 duration: duration
13751 });
13752 }
13753 /**
13754 * @param {Object} dialog
13755 * @param {Function} callback
13756 */
13757
13758
13759 _createClass(AndroidDialogAnimator, [{
13760 key: "show",
13761 value: function show(dialog, callback) {
13762 callback = callback ? callback : function () {};
13763 Animit.runAll(Animit(dialog._mask, this.def).default({
13764 opacity: 0
13765 }, {
13766 opacity: 1
13767 }), Animit(dialog._dialog, this.def).default({
13768 transform: 'translate3d(-50%, -60%, 0)',
13769 opacity: 0
13770 }, {
13771 transform: 'translate3d(-50%, -50%, 0)',
13772 opacity: 1
13773 }).queue(function (done) {
13774 callback();
13775 done();
13776 }));
13777 }
13778 /**
13779 * @param {Object} dialog
13780 * @param {Function} callback
13781 */
13782
13783 }, {
13784 key: "hide",
13785 value: function hide(dialog, callback) {
13786 callback = callback ? callback : function () {};
13787 Animit.runAll(Animit(dialog._mask, this.def).default({
13788 opacity: 1
13789 }, {
13790 opacity: 0
13791 }), Animit(dialog._dialog, this.def).default({
13792 transform: 'translate3d(-50%, -50%, 0)',
13793 opacity: 1
13794 }, {
13795 transform: 'translate3d(-50%, -60%, 0)',
13796 opacity: 0
13797 }).queue(function (done) {
13798 callback();
13799 done();
13800 }));
13801 }
13802 }]);
13803
13804 return AndroidDialogAnimator;
13805 }(DialogAnimator);
13806 /**
13807 * iOS style animator for dialog.
13808 */
13809
13810 var IOSDialogAnimator = /*#__PURE__*/function (_DialogAnimator2) {
13811 _inherits(IOSDialogAnimator, _DialogAnimator2);
13812
13813 var _super3 = _createSuper(IOSDialogAnimator);
13814
13815 function IOSDialogAnimator() {
13816 var _this;
13817
13818 var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
13819 _ref3$timing = _ref3.timing,
13820 timing = _ref3$timing === void 0 ? 'ease-in-out' : _ref3$timing,
13821 _ref3$delay = _ref3.delay,
13822 delay = _ref3$delay === void 0 ? 0 : _ref3$delay,
13823 _ref3$duration = _ref3.duration,
13824 duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration;
13825
13826 _classCallCheck(this, IOSDialogAnimator);
13827
13828 _this = _super3.call(this, {
13829 timing: timing,
13830 delay: delay,
13831 duration: duration
13832 });
13833 _this.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
13834
13835 return _this;
13836 }
13837 /**
13838 * @param {Object} dialog
13839 * @param {Function} callback
13840 */
13841
13842
13843 _createClass(IOSDialogAnimator, [{
13844 key: "show",
13845 value: function show(dialog, callback) {
13846 callback = callback ? callback : function () {};
13847 Animit.runAll(Animit(dialog._mask, this.def).default({
13848 opacity: 0
13849 }, {
13850 opacity: 1
13851 }), Animit(dialog._dialog, this.def).default({
13852 transform: "translate3d(-50%, ".concat(this.bodyHeight / 2.0 - 1, "px, 0)")
13853 }, {
13854 transform: 'translate3d(-50%, -50%, 0)'
13855 }).queue(function (done) {
13856 callback();
13857 done();
13858 }));
13859 }
13860 /**
13861 * @param {Object} dialog
13862 * @param {Function} callback
13863 */
13864
13865 }, {
13866 key: "hide",
13867 value: function hide(dialog, callback) {
13868 callback = callback ? callback : function () {};
13869 Animit.runAll(Animit(dialog._mask, this.def).default({
13870 opacity: 1
13871 }, {
13872 opacity: 0
13873 }), Animit(dialog._dialog, this.def).default({
13874 transform: 'translate3d(-50%, -50%, 0)'
13875 }, {
13876 transform: "translate3d(-50%, ".concat(this.bodyHeight / 2.0 - 1, "px, 0)")
13877 }).queue(function (done) {
13878 callback();
13879 done();
13880 }));
13881 }
13882 }]);
13883
13884 return IOSDialogAnimator;
13885 }(DialogAnimator);
13886 /**
13887 * Slide animator for dialog.
13888 */
13889
13890 var SlideDialogAnimator = /*#__PURE__*/function (_DialogAnimator3) {
13891 _inherits(SlideDialogAnimator, _DialogAnimator3);
13892
13893 var _super4 = _createSuper(SlideDialogAnimator);
13894
13895 function SlideDialogAnimator() {
13896 var _this2;
13897
13898 var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
13899 _ref4$timing = _ref4.timing,
13900 timing = _ref4$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref4$timing,
13901 _ref4$delay = _ref4.delay,
13902 delay = _ref4$delay === void 0 ? 0 : _ref4$delay,
13903 _ref4$duration = _ref4.duration,
13904 duration = _ref4$duration === void 0 ? 0.2 : _ref4$duration;
13905
13906 _classCallCheck(this, SlideDialogAnimator);
13907
13908 _this2 = _super4.call(this, {
13909 timing: timing,
13910 delay: delay,
13911 duration: duration
13912 });
13913 _this2.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
13914
13915 return _this2;
13916 }
13917 /**
13918 * @param {Object} dialog
13919 * @param {Function} callback
13920 */
13921
13922
13923 _createClass(SlideDialogAnimator, [{
13924 key: "show",
13925 value: function show(dialog, callback) {
13926 callback = callback ? callback : function () {};
13927 Animit.runAll(Animit(dialog._mask, this.def).default({
13928 opacity: 0
13929 }, {
13930 opacity: 1
13931 }), Animit(dialog._dialog, this.def).default( // FIXME: This should avoid Forced Synchronous Layout. Otherwise, fade animation of mask will be broken.
13932 {
13933 transform: "translate3d(-50%, ".concat(-(this.bodyHeight / 2.0) + 1 - dialog._dialog.clientHeight, "px, 0)")
13934 }, {
13935 transform: 'translate3d(-50%, -50%, 0)'
13936 }).queue(function (done) {
13937 callback();
13938 done();
13939 }));
13940 }
13941 /**
13942 * @param {Object} dialog
13943 * @param {Function} callback
13944 */
13945
13946 }, {
13947 key: "hide",
13948 value: function hide(dialog, callback) {
13949 callback = callback ? callback : function () {};
13950 Animit.runAll(Animit(dialog._mask, this.def).default({
13951 opacity: 1
13952 }, {
13953 opacity: 0
13954 }), Animit(dialog._dialog, this.def).default({
13955 transform: 'translate3d(-50%, -50%, 0)'
13956 }, // FIXME: This should avoid Forced Synchronous Layout. Otherwise, fade animation of mask will be broken.
13957 {
13958 transform: "translate3d(-50%, ".concat(-(this.bodyHeight / 2.0) + 1 - dialog._dialog.clientHeight, "px, 0)")
13959 }).queue(function (done) {
13960 callback();
13961 done();
13962 }));
13963 }
13964 }]);
13965
13966 return SlideDialogAnimator;
13967 }(DialogAnimator);
13968
13969 var scheme$o = {
13970 '.dialog': 'dialog--*',
13971 '.dialog-container': 'dialog-container--*',
13972 '.dialog-mask': 'dialog-mask--*'
13973 };
13974 var _animatorDict$6 = {
13975 'default': function _default() {
13976 return platform.isAndroid() ? AndroidDialogAnimator : IOSDialogAnimator;
13977 },
13978 'slide': SlideDialogAnimator,
13979 'none': DialogAnimator
13980 };
13981 /**
13982 * @element ons-dialog
13983 * @category dialog
13984 * @description
13985 * [en]
13986 * Dialog that is displayed on top of current screen. As opposed to the `<ons-alert-dialog>` element, this component can contain any kind of content.
13987 *
13988 * To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createDialog(template)` utility function and the `<template>` tag.
13989 *
13990 * The dialog is useful for displaying menus, additional information or to ask the user to make a decision.
13991 *
13992 * It will automatically be displayed as Material Design when running on an Android device.
13993 * [/en]
13994 * [ja][/ja]
13995 * @modifier material
13996 * [en]Display a Material Design dialog.[/en]
13997 * [ja]マテリアルデザインのダイアログを表示します。[/ja]
13998 * @codepen zxxaGa
13999 * @tutorial vanilla/Reference/dialog
14000 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
14001 * @seealso ons-alert-dialog
14002 * [en]`<ons-alert-dialog>` component[/en]
14003 * [ja]ons-alert-dialogコンポーネント[/ja]
14004 * @seealso ons-popover
14005 * [en]`<ons-popover>` component[/en]
14006 * [ja]ons-popoverコンポーネント[/ja]
14007 * @seealso ons-modal
14008 * [en]`<ons-modal>` component[/en]
14009 * [ja]ons-modalコンポーネント[/ja]
14010 * @example
14011 * <ons-dialog id="dialog">
14012 * <p>This is a dialog!</p>
14013 * </ons-dialog>
14014 *
14015 * <script>
14016 * document.getElementById('dialog').show();
14017 * </script>
14018 */
14019
14020 var DialogElement = /*#__PURE__*/function (_BaseDialogElement) {
14021 _inherits(DialogElement, _BaseDialogElement);
14022
14023 var _super = _createSuper(DialogElement);
14024
14025 /**
14026 * @event preshow
14027 * @description
14028 * [en]Fired just before the dialog is displayed.[/en]
14029 * [ja]ダイアログが表示される直前に発火します。[/ja]
14030 * @param {Object} event [en]Event object.[/en]
14031 * @param {Object} event.dialog
14032 * [en]Component object.[/en]
14033 * [ja]コンポーネントのオブジェクト。[/ja]
14034 * @param {Function} event.cancel
14035 * [en]Execute this function to stop the dialog from being shown.[/en]
14036 * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
14037 */
14038
14039 /**
14040 * @event postshow
14041 * @description
14042 * [en]Fired just after the dialog is displayed.[/en]
14043 * [ja]ダイアログが表示された直後に発火します。[/ja]
14044 * @param {Object} event [en]Event object.[/en]
14045 * @param {Object} event.dialog
14046 * [en]Component object.[/en]
14047 * [ja]コンポーネントのオブジェクト。[/ja]
14048 */
14049
14050 /**
14051 * @event prehide
14052 * @description
14053 * [en]Fired just before the dialog is hidden.[/en]
14054 * [ja]ダイアログが隠れる直前に発火します。[/ja]
14055 * @param {Object} event [en]Event object.[/en]
14056 * @param {Object} event.dialog
14057 * [en]Component object.[/en]
14058 * [ja]コンポーネントのオブジェクト。[/ja]
14059 * @param {Function} event.cancel
14060 * [en]Execute this function to stop the dialog from being hidden.[/en]
14061 * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
14062 */
14063
14064 /**
14065 * @event posthide
14066 * @description
14067 * [en]Fired just after the dialog is hidden.[/en]
14068 * [ja]ダイアログが隠れた後に発火します。[/ja]
14069 * @param {Object} event [en]Event object.[/en]
14070 * @param {Object} event.dialog
14071 * [en]Component object.[/en]
14072 * [ja]コンポーネントのオブジェクト。[/ja]
14073 */
14074
14075 /**
14076 * @event dialogcancel
14077 * @description
14078 * [en]Fired when the dialog is canceled.[/en]
14079 * [ja][/ja]
14080 */
14081
14082 /**
14083 * @attribute modifier
14084 * @type {String}
14085 * @description
14086 * [en]The appearance of the dialog.[/en]
14087 * [ja]ダイアログの表現を指定します。[/ja]
14088 */
14089
14090 /**
14091 * @attribute cancelable
14092 * @description
14093 * [en]If this attribute is set the dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
14094 * [ja][/ja]
14095 */
14096
14097 /**
14098 * @attribute disabled
14099 * @description
14100 * [en]If this attribute is set the dialog is disabled.[/en]
14101 * [ja]この属性がある時、ダイアログはdisabled状態になります。[/ja]
14102 */
14103
14104 /**
14105 * @attribute animation
14106 * @type {String}
14107 * @default default
14108 * @description
14109 * [en]The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.[/en]
14110 * [ja]ダイアログを表示する際のアニメーション名を指定します。"none"もしくは"default"を指定できます。[/ja]
14111 */
14112
14113 /**
14114 * @attribute animation-options
14115 * @type {Expression}
14116 * @description
14117 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
14118 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
14119 */
14120
14121 /**
14122 * @property animationOptions
14123 * @type {Object}
14124 * @description
14125 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
14126 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
14127 */
14128
14129 /**
14130 * @attribute mask-color
14131 * @type {String}
14132 * @default rgba(0, 0, 0, 0.2)
14133 * @description
14134 * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
14135 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
14136 */
14137
14138 /**
14139 * @attribute visible
14140 * @type {Boolean}
14141 * @description
14142 * [en]Whether the dialog is visible or not.[/en]
14143 * [ja]要素が見える場合に`true`。[/ja]
14144 */
14145 function DialogElement() {
14146 var _this;
14147
14148 _classCallCheck(this, DialogElement);
14149
14150 _this = _super.call(this);
14151 contentReady(_assertThisInitialized(_this), function () {
14152 return _this._compile();
14153 });
14154 return _this;
14155 }
14156
14157 _createClass(DialogElement, [{
14158 key: "_scheme",
14159 get: function get() {
14160 return scheme$o;
14161 }
14162 }, {
14163 key: "_mask",
14164 get: function get() {
14165 return util$4.findChild(this, '.dialog-mask');
14166 }
14167 }, {
14168 key: "_dialog",
14169 get: function get() {
14170 return util$4.findChild(this, '.dialog');
14171 }
14172 }, {
14173 key: "_updateAnimatorFactory",
14174 value: function _updateAnimatorFactory() {
14175 return new AnimatorFactory({
14176 animators: _animatorDict$6,
14177 baseClass: DialogAnimator,
14178 baseClassName: 'DialogAnimator',
14179 defaultAnimation: this.getAttribute('animation')
14180 });
14181 }
14182 }, {
14183 key: "_compile",
14184 value: function _compile() {
14185 autoStyle.prepare(this);
14186 this.style.display = 'none';
14187 this.style.zIndex = 10001;
14188 /* Expected result:
14189 * <ons-dialog>
14190 * <div class="dialog-mask"></div>
14191 * <div class="dialog">
14192 * <div class="dialog-container">...</div>
14193 * </div>
14194 * </ons-dialog>
14195 */
14196
14197 if (!this._dialog) {
14198 var dialog = document.createElement('div');
14199 dialog.classList.add('dialog');
14200 var container = document.createElement('div');
14201 container.classList.add('dialog-container');
14202
14203 while (this.firstChild) {
14204 container.appendChild(this.firstChild);
14205 }
14206
14207 dialog.appendChild(container);
14208 this.appendChild(dialog);
14209 }
14210
14211 if (!this._mask) {
14212 var mask = document.createElement('div');
14213 mask.classList.add('dialog-mask');
14214 this.insertBefore(mask, this.firstChild);
14215 }
14216
14217 this._dialog.style.zIndex = 20001;
14218 this._mask.style.zIndex = 20000;
14219 this.setAttribute('status-bar-fill', '');
14220 ModifierUtil.initModifier(this, this._scheme);
14221 }
14222 /**
14223 * @property onDeviceBackButton
14224 * @type {Object}
14225 * @description
14226 * [en]Back-button handler.[/en]
14227 * [ja]バックボタンハンドラ。[/ja]
14228 */
14229
14230 /**
14231 * @method show
14232 * @signature show([options])
14233 * @param {Object} [options]
14234 * [en]Parameter object.[/en]
14235 * [ja]オプションを指定するオブジェクト。[/ja]
14236 * @param {String} [options.animation]
14237 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
14238 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定します。[/ja]
14239 * @param {String} [options.animationOptions]
14240 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
14241 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
14242 * @param {Function} [options.callback]
14243 * [en]This function is called after the dialog has been revealed.[/en]
14244 * [ja]ダイアログが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
14245 * @description
14246 * [en]Show the dialog.[/en]
14247 * [ja]ダイアログを開きます。[/ja]
14248 * @return {Promise} Resolves to the displayed element.
14249 */
14250
14251 /**
14252 * @method hide
14253 * @signature hide([options])
14254 * @param {Object} [options]
14255 * [en]Parameter object.[/en]
14256 * [ja]オプションを指定するオブジェクト。[/ja]
14257 * @param {String} [options.animation]
14258 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
14259 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定できます。[/ja]
14260 * @param {String} [options.animationOptions]
14261 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
14262 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/ja]
14263 * @param {Function} [options.callback]
14264 * [en]This functions is called after the dialog has been hidden.[/en]
14265 * [ja]ダイアログが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
14266 * @description
14267 * [en]Hide the dialog.[/en]
14268 * [ja]ダイアログを閉じます。[/ja]
14269 * @return {Promise}
14270 * [en]Resolves to the hidden element[/en]
14271 * [ja][/ja]
14272 */
14273
14274 /**
14275 * @property visible
14276 * @type {Boolean}
14277 * @description
14278 * [en]Whether the dialog is visible or not.[/en]
14279 * [ja]要素が見える場合に`true`。[/ja]
14280 */
14281
14282 /**
14283 * @property disabled
14284 * @type {Boolean}
14285 * @description
14286 * [en]Whether the dialog is disabled or not.[/en]
14287 * [ja]無効化されている場合に`true`。[/ja]
14288 */
14289
14290 /**
14291 * @property cancelable
14292 * @type {Boolean}
14293 * @description
14294 * [en]Whether the dialog is cancelable or not. A cancelable dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
14295 * [ja][/ja]
14296 */
14297
14298 /**
14299 * @property maskColor
14300 * @type {String}
14301 * @default rgba(0, 0, 0, 0.2)
14302 * @description
14303 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
14304 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
14305 */
14306
14307 /**
14308 * @param {String} name
14309 * @param {DialogAnimator} Animator
14310 */
14311
14312 }], [{
14313 key: "registerAnimator",
14314 value: function registerAnimator(name, Animator) {
14315 if (!(Animator.prototype instanceof DialogAnimator)) {
14316 util$4.throwAnimator('Dialog');
14317 }
14318
14319 _animatorDict$6[name] = Animator;
14320 }
14321 }, {
14322 key: "animators",
14323 get: function get() {
14324 return _animatorDict$6;
14325 }
14326 }, {
14327 key: "DialogAnimator",
14328 get: function get() {
14329 return DialogAnimator;
14330 }
14331 }]);
14332
14333 return DialogElement;
14334 }(BaseDialogElement);
14335 onsElements.Dialog = DialogElement;
14336 customElements.define('ons-dialog', DialogElement);
14337
14338 var defaultClassName$d = 'fab';
14339 var scheme$n = {
14340 '': 'fab--*',
14341 '.fab__icon': 'fab--*__icon'
14342 };
14343 /**
14344 * @element ons-fab
14345 * @category form
14346 * @description
14347 * [en]
14348 * The Floating action button is a circular button defined in the [Material Design specification](https://www.google.com/design/spec/components/buttons-floating-action-button.html). They are often used to promote the primary action of the app.
14349 *
14350 * It can be displayed either as an inline element or in one of the corners. Normally it will be positioned in the lower right corner of the screen.
14351 * [/en]
14352 * [ja][/ja]
14353 * @tutorial vanilla/Reference/fab
14354 * @modifier mini
14355 * [en]Makes the `ons-fab` smaller.[/en]
14356 * [ja][/ja]
14357 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
14358 * @seealso ons-speed-dial
14359 * [en]The `<ons-speed-dial>` component is a Floating action button that displays a menu when tapped.[/en]
14360 * [ja][/ja]
14361 */
14362
14363 var FabElement = /*#__PURE__*/function (_BaseElement) {
14364 _inherits(FabElement, _BaseElement);
14365
14366 var _super = _createSuper(FabElement);
14367
14368 /**
14369 * @attribute modifier
14370 * @type {String}
14371 * @description
14372 * [en]The appearance of the button.[/en]
14373 * [ja]ボタンの表現を指定します。[/ja]
14374 */
14375
14376 /**
14377 * @attribute ripple
14378 * @description
14379 * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
14380 * [ja][/ja]
14381 */
14382
14383 /**
14384 * @property ripple
14385 * @type {Boolean}
14386 * @description
14387 * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
14388 * [ja][/ja]
14389 */
14390
14391 /**
14392 * @attribute position
14393 * @type {String}
14394 * @description
14395 * [en]The position of the button. Should be a string like `"bottom right"` or `"top left"`. If this attribute is not defined it will be displayed as an inline element.[/en]
14396 * [ja][/ja]
14397 */
14398
14399 /**
14400 * @attribute disabled
14401 * @description
14402 * [en]Specify if button should be disabled.[/en]
14403 * [ja]ボタンを無効化する場合は指定します。[/ja]
14404 */
14405 function FabElement() {
14406 var _this;
14407
14408 _classCallCheck(this, FabElement);
14409
14410 _this = _super.call(this); // The following statements can be executed before contentReady
14411 // since these do not access the children
14412
14413 _this._hide();
14414
14415 _this.classList.add(defaultClassName$d);
14416
14417 contentReady(_assertThisInitialized(_this), function () {
14418 _this._compile();
14419 });
14420 return _this;
14421 }
14422
14423 _createClass(FabElement, [{
14424 key: "_compile",
14425 value: function _compile() {
14426 autoStyle.prepare(this);
14427
14428 if (!util$4.findChild(this, '.fab__icon')) {
14429 var content = document.createElement('span');
14430 content.classList.add('fab__icon');
14431 util$4.arrayFrom(this.childNodes).forEach(function (element) {
14432 if (!element.tagName || element.tagName.toLowerCase() !== 'ons-ripple') {
14433 content.appendChild(element);
14434 }
14435 });
14436 this.appendChild(content);
14437 }
14438
14439 this._updateRipple();
14440
14441 ModifierUtil.initModifier(this, scheme$n);
14442
14443 this._updatePosition();
14444 }
14445 }, {
14446 key: "connectedCallback",
14447 value: function connectedCallback() {
14448 var _this2 = this;
14449
14450 setImmediate(function () {
14451 return _this2._show();
14452 });
14453 }
14454 }, {
14455 key: "attributeChangedCallback",
14456 value: function attributeChangedCallback(name, last, current) {
14457 switch (name) {
14458 case 'class':
14459 util$4.restoreClass(this, defaultClassName$d, scheme$n);
14460 break;
14461
14462 case 'modifier':
14463 ModifierUtil.onModifierChanged(last, current, this, scheme$n);
14464 break;
14465
14466 case 'ripple':
14467 this._updateRipple();
14468
14469 break;
14470
14471 case 'position':
14472 this._updatePosition();
14473
14474 break;
14475 }
14476 }
14477 }, {
14478 key: "_show",
14479 value: function _show() {
14480 if (!this._manuallyHidden) {
14481 // if user has not called ons-fab.hide()
14482 this._toggle(true);
14483 }
14484 }
14485 }, {
14486 key: "_hide",
14487 value: function _hide() {
14488 var _this3 = this;
14489
14490 setImmediate(function () {
14491 return _this3._toggle(false);
14492 });
14493 }
14494 }, {
14495 key: "_updateRipple",
14496 value: function _updateRipple() {
14497 util$4.updateRipple(this);
14498 }
14499 }, {
14500 key: "_updatePosition",
14501 value: function _updatePosition() {
14502 var position = this.getAttribute('position');
14503 this.classList.remove('fab--top__left', 'fab--bottom__right', 'fab--bottom__left', 'fab--top__right', 'fab--top__center', 'fab--bottom__center');
14504
14505 switch (position) {
14506 case 'top right':
14507 case 'right top':
14508 this.classList.add('fab--top__right');
14509 break;
14510
14511 case 'top left':
14512 case 'left top':
14513 this.classList.add('fab--top__left');
14514 break;
14515
14516 case 'bottom right':
14517 case 'right bottom':
14518 this.classList.add('fab--bottom__right');
14519 break;
14520
14521 case 'bottom left':
14522 case 'left bottom':
14523 this.classList.add('fab--bottom__left');
14524 break;
14525
14526 case 'center top':
14527 case 'top center':
14528 this.classList.add('fab--top__center');
14529 break;
14530
14531 case 'center bottom':
14532 case 'bottom center':
14533 this.classList.add('fab--bottom__center');
14534 break;
14535 }
14536 }
14537 /**
14538 * @method show
14539 * @signature show()
14540 * @description
14541 * [en]Show the floating action button.[/en]
14542 * [ja][/ja]
14543 */
14544
14545 }, {
14546 key: "show",
14547 value: function show() {
14548 this.toggle(true);
14549 }
14550 /**
14551 * @method hide
14552 * @signature hide()
14553 * @description
14554 * [en]Hide the floating action button.[/en]
14555 * [ja][/ja]
14556 */
14557
14558 }, {
14559 key: "hide",
14560 value: function hide() {
14561 this.toggle(false);
14562 }
14563 /**
14564 * @method toggle
14565 * @signature toggle()
14566 * @description
14567 * [en]Toggle the visibility of the button.[/en]
14568 * [ja][/ja]
14569 */
14570
14571 }, {
14572 key: "toggle",
14573 value: function toggle() {
14574 var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : !this.visible;
14575 this._manuallyHidden = !action;
14576
14577 this._toggle(action);
14578 }
14579 }, {
14580 key: "_toggle",
14581 value: function _toggle() {
14582 var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : !this.visible;
14583 var isBottom = (this.getAttribute('position') || '').indexOf('bottom') >= 0;
14584 var translate = isBottom ? "translate3d(0px, -".concat(util$4.globals.fabOffset || 0, "px, 0px)") : '';
14585 styler(this, {
14586 transform: "".concat(translate, " scale(").concat(Number(action), ")")
14587 });
14588 }
14589 /**
14590 * @property disabled
14591 * @type {Boolean}
14592 * @description
14593 * [en]Whether the element is disabled or not.[/en]
14594 * [ja]無効化されている場合に`true`。[/ja]
14595 */
14596
14597 /**
14598 * @property visible
14599 * @readonly
14600 * @type {Boolean}
14601 * @description
14602 * [en]Whether the element is visible or not.[/en]
14603 * [ja]要素が見える場合に`true`。[/ja]
14604 */
14605
14606 }, {
14607 key: "visible",
14608 get: function get() {
14609 return this.style.transform.indexOf('scale(0)') === -1 && this.style.display !== 'none';
14610 }
14611 }], [{
14612 key: "observedAttributes",
14613 get: function get() {
14614 return ['modifier', 'ripple', 'position', 'class'];
14615 }
14616 }]);
14617
14618 return FabElement;
14619 }(BaseElement);
14620 util$4.defineBooleanProperties(FabElement, ['disabled', 'ripple']);
14621 onsElements.Fab = FabElement;
14622 customElements.define('ons-fab', FabElement);
14623
14624 /**
14625 * @element ons-gesture-detector
14626 * @category gesture
14627 * @description
14628 * [en]
14629 * Component to detect finger gestures within the wrapped element. Following gestures are supported:
14630 * - Drag gestures: `drag`, `dragleft`, `dragright`, `dragup`, `dragdown`
14631 * - Hold gestures: `hold`, `release`
14632 * - Swipe gestures: `swipe`, `swipeleft`, `swiperight`, `swipeup`, `swipedown`
14633 * - Tap gestures: `tap`, `doubletap`
14634 * - Pinch gestures: `pinch`, `pinchin`, `pinchout`
14635 * - Other gestures: `touch`, `transform`, `rotate`
14636 * [/en]
14637 * [ja]要素内のジェスチャー操作を検知します。詳しくはガイドを参照してください。[/ja]
14638 * @guide features.html#gesture-detection
14639 * [en]Detecting finger gestures[/en]
14640 * [ja]ジェスチャー操作の検知[/ja]
14641 * @example
14642 * <ons-gesture-detector>
14643 * <div id="detect-area" style="width: 100px; height: 100px;">
14644 * Swipe Here
14645 * </div>
14646 * </ons-gesture-detector>
14647 *
14648 * <script>
14649 * document.addEventListener('swipeleft', function(event) {
14650 * if (event.target.matches('#detect-area')) {
14651 * console.log('Swipe left is detected.');
14652 * }
14653 * });
14654 * </script>
14655 */
14656
14657 var GestureDetectorElement = /*#__PURE__*/function (_BaseElement) {
14658 _inherits(GestureDetectorElement, _BaseElement);
14659
14660 var _super = _createSuper(GestureDetectorElement);
14661
14662 function GestureDetectorElement() {
14663 var _this;
14664
14665 _classCallCheck(this, GestureDetectorElement);
14666
14667 _this = _super.call(this);
14668 _this._gestureDetector = new GestureDetector(_assertThisInitialized(_this), {
14669 passive: true
14670 });
14671 return _this;
14672 }
14673
14674 return _createClass(GestureDetectorElement);
14675 }(BaseElement);
14676 onsElements.GestureDetector = GestureDetectorElement;
14677 customElements.define('ons-gesture-detector', GestureDetectorElement);
14678
14679 var autoPrefix = 'fa'; // FIXME: To be removed in v3
14680
14681 /**
14682 * @element ons-icon
14683 * @category visual
14684 * @description
14685 * [en]
14686 * Displays an icon. The following icon suites are available:
14687 *
14688 * * [Font Awesome](https://fortawesome.github.io/Font-Awesome/)
14689 * * [Ionicons](http://ionicons.com/)
14690 * * [Material Design Iconic Font](http://zavoloklom.github.io/material-design-iconic-font/)
14691 * [/en]
14692 * [ja][/ja]
14693 * @codepen xAhvg
14694 * @tutorial vanilla/Reference/icon
14695 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja][/ja]
14696 * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
14697 * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
14698 * @example
14699 * <ons-icon
14700 * icon="md-car"
14701 * size="20px"
14702 * style="color: red">
14703 * </ons-icon>
14704 *
14705 * <ons-button>
14706 * <ons-icon icon="md-car"></ons-icon>
14707 * Car
14708 * </ons-button>
14709 */
14710
14711 var IconElement = /*#__PURE__*/function (_BaseElement) {
14712 _inherits(IconElement, _BaseElement);
14713
14714 var _super = _createSuper(IconElement);
14715
14716 /**
14717 * @attribute icon
14718 * @type {String}
14719 * @description
14720 * [en]
14721 * The icon name. `"md-"` prefix for Material Icons, `"fa-"` for Font Awesome and `"ion-"` prefix for Ionicons.
14722 *
14723 * See all available icons on the element description (at the top).
14724 *
14725 * Icons can also be styled based on modifier presence. Add comma-separated icons with `"modifierName:"` prefix.
14726 *
14727 * The code `<ons-icon icon="ion-edit, material:md-edit"></ons-icon>` will display `"md-edit"` for Material Design and `"ion-edit"` as the default icon.
14728 *
14729 * `fa-` prefix is added automatically if none is provided. Check [See also](#seealso) section for more information.
14730 * [/en]
14731 * [ja][/ja]
14732 */
14733
14734 /**
14735 * @attribute size
14736 * @type {String}
14737 * @description
14738 * [en]
14739 * The sizes of the icon. Valid values are lg, 2x, 3x, 4x, 5x, or in the size in pixels.
14740 * Icons can also be styled based on modifier presence. Add comma-separated icons with `"modifierName:"` prefix.
14741 *
14742 * The code:
14743 *
14744 * ```
14745 * <ons-icon
14746 * icon="ion-edit"
14747 * size="32px, material:24px">
14748 * </ons-icon>
14749 * ```
14750 *
14751 * will render as a `24px` icon if the `"material"` modifier is present and `32px` otherwise.
14752 * [/en]
14753 * [ja][/ja]
14754 */
14755
14756 /**
14757 * @attribute rotate
14758 * @type {Number}
14759 * @description
14760 * [en]Number of degrees to rotate the icon. Valid values are 90, 180 and 270.[/en]
14761 * [ja]アイコンを回転して表示します。90, 180, 270から指定できます。[/ja]
14762 */
14763
14764 /**
14765 * @attribute fixed-width
14766 * @type {Boolean}
14767 * @default false
14768 * @description
14769 * [en]When used in a list, you want the icons to have the same width so that they align vertically by defining this attribute.[/en]
14770 * [ja][/ja]
14771 */
14772
14773 /**
14774 * @property fixedWidth
14775 * @type {Boolean}
14776 * @default false
14777 * @description
14778 * [en]When used in a list, you want the icons to have the same width so that they align vertically by defining this attribute.[/en]
14779 * [ja][/ja]
14780 */
14781
14782 /**
14783 * @attribute spin
14784 * @description
14785 * [en]Specify whether the icon should be spinning.[/en]
14786 * [ja]アイコンを回転するかどうかを指定します。[/ja]
14787 */
14788
14789 /**
14790 * @property spin
14791 * @type {Boolean}
14792 * @description
14793 * [en]Specify whether the icon should be spinning.[/en]
14794 * [ja]アイコンを回転するかどうかを指定します。[/ja]
14795 */
14796 function IconElement() {
14797 var _this;
14798
14799 _classCallCheck(this, IconElement);
14800
14801 _this = _super.call(this);
14802 contentReady(_assertThisInitialized(_this), function () {
14803 _this._compile();
14804 });
14805 return _this;
14806 }
14807
14808 _createClass(IconElement, [{
14809 key: "attributeChangedCallback",
14810 value: function attributeChangedCallback(name, last, current) {
14811 this._cleanClassAttribute(name === 'icon' ? last : this.getAttribute('icon'), name === 'modifier' ? last : undefined);
14812
14813 this._update();
14814 }
14815 }, {
14816 key: "_compile",
14817 value: function _compile() {
14818 autoStyle.prepare(this);
14819
14820 this._update();
14821 }
14822 }, {
14823 key: "_update",
14824 value: function _update() {
14825 var _this2 = this;
14826
14827 var _this$_buildClassAndS = this._buildClassAndStyle(this._parseAttr('icon'), this._parseAttr('size')),
14828 classList = _this$_buildClassAndS.classList,
14829 style = _this$_buildClassAndS.style;
14830
14831 util$4.extend(this.style, style);
14832 classList.forEach(function (className) {
14833 return _this2.classList.add(className);
14834 });
14835 }
14836 }, {
14837 key: "_parseAttr",
14838 value: function _parseAttr(attrName) {
14839 var modifier = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getAttribute('modifier') || '';
14840 var attr = this.getAttribute(attrName) || attrName || '';
14841 var parts = attr.split(/\s*,\s*/);
14842 var def = parts[0];
14843 var md = parts[1];
14844 md = (md || '').split(/\s*:\s*/);
14845 return (modifier && RegExp("(^|\\s+)".concat(md[0], "($|\\s+)"), 'i').test(modifier) ? md[1] : def) || '';
14846 }
14847 /**
14848 * Remove unneeded class value.
14849 */
14850
14851 }, {
14852 key: "_cleanClassAttribute",
14853 value: function _cleanClassAttribute(lastIcon, lastModifier) {
14854 var _this3 = this;
14855
14856 var _this$_prefixIcon = this._prefixIcon(this._parseAttr(lastIcon, lastModifier)),
14857 className = _this$_prefixIcon.className,
14858 prefix = _this$_prefixIcon.prefix;
14859
14860 var customPrefixRE = className !== prefix ? "|".concat(prefix, "$|").concat(prefix, "-") : "|".concat(className, "$") || '';
14861 var re = new RegExp("^(fa$|fa-|ion-|zmdi$|zmdi-|ons-icon--".concat(customPrefixRE, ")"));
14862 util$4.arrayFrom(this.classList).filter(function (className) {
14863 return re.test(className);
14864 }).forEach(function (className) {
14865 return _this3.classList.remove(className);
14866 });
14867 }
14868 }, {
14869 key: "_prefixIcon",
14870 value: function _prefixIcon(iconName) {
14871 var className = autoPrefix + (autoPrefix ? '-' : '') + iconName;
14872 return {
14873 className: className,
14874 prefix: className.split('-')[0]
14875 };
14876 }
14877 }, {
14878 key: "_buildClassAndStyle",
14879 value: function _buildClassAndStyle(iconName, size) {
14880 var classList = ['ons-icon'];
14881 var style = {}; // Icon
14882
14883 if (iconName.indexOf('ion-') === 0) {
14884 classList.push(iconName);
14885 classList.push('ons-icon--ion');
14886 } else if (iconName.indexOf('fa-') === 0) {
14887 classList.push(iconName); // default icon style to Font Awesome Solid if icon style is not specified already
14888
14889 if (!(this.classList.contains('far') || this.classList.contains('fab') || this.classList.contains('fal'))) {
14890 classList.push('fa');
14891 }
14892 } else if (iconName.indexOf('md-') === 0) {
14893 classList.push('zmdi');
14894 classList.push('zmdi-' + iconName.split(/-(.+)?/)[1]);
14895 } else {
14896 var _this$_prefixIcon2 = this._prefixIcon(iconName),
14897 className = _this$_prefixIcon2.className,
14898 prefix = _this$_prefixIcon2.prefix;
14899
14900 prefix && classList.push(prefix);
14901 className && classList.push(className);
14902 } // Size
14903
14904
14905 if (size.match(/^[1-5]x|lg$/)) {
14906 classList.push('ons-icon--' + size);
14907 this.style.removeProperty('font-size');
14908 } else {
14909 style.fontSize = size;
14910 }
14911
14912 return {
14913 classList: classList,
14914 style: style
14915 };
14916 }
14917 }], [{
14918 key: "observedAttributes",
14919 get: function get() {
14920 return ['icon', 'size', 'modifier', 'class'];
14921 }
14922 }, {
14923 key: "setAutoPrefix",
14924 value: function setAutoPrefix(prefix) {
14925 autoPrefix = prefix ? typeof prefix === 'string' && prefix || 'fa' : '';
14926 }
14927 }]);
14928
14929 return IconElement;
14930 }(BaseElement);
14931 util$4.defineBooleanProperties(IconElement, ['fixed-width', 'spin']);
14932 onsElements.Icon = IconElement;
14933 customElements.define('ons-icon', IconElement);
14934
14935 var LazyRepeatDelegate = /*#__PURE__*/function () {
14936 function LazyRepeatDelegate(userDelegate) {
14937 var templateElement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
14938
14939 _classCallCheck(this, LazyRepeatDelegate);
14940
14941 if (_typeof(userDelegate) !== 'object' || userDelegate === null) {
14942 util$4.throw('"delegate" parameter must be an object');
14943 }
14944
14945 this._userDelegate = userDelegate;
14946
14947 if (!(templateElement instanceof Element) && templateElement !== null) {
14948 util$4.throw('"templateElement" parameter must be an instance of Element or null');
14949 }
14950
14951 this._templateElement = templateElement;
14952 }
14953
14954 _createClass(LazyRepeatDelegate, [{
14955 key: "itemHeight",
14956 get: function get() {
14957 return this._userDelegate.itemHeight;
14958 }
14959 /**
14960 * @return {Boolean}
14961 */
14962
14963 }, {
14964 key: "hasRenderFunction",
14965 value: function hasRenderFunction() {
14966 return this._userDelegate._render instanceof Function;
14967 }
14968 /**
14969 * @return {void}
14970 */
14971
14972 }, {
14973 key: "_render",
14974 value: function _render() {
14975 this._userDelegate._render.apply(this._userDelegate, arguments);
14976 }
14977 /**
14978 * @param {Number} index
14979 * @param {Function} done A function that take item object as parameter.
14980 */
14981
14982 }, {
14983 key: "loadItemElement",
14984 value: function loadItemElement(index, done) {
14985 if (this._userDelegate.loadItemElement instanceof Function) {
14986 this._userDelegate.loadItemElement(index, done);
14987 } else {
14988 var element = this._userDelegate.createItemContent(index, this._templateElement);
14989
14990 if (!(element instanceof Element)) {
14991 util$4.throw('"createItemContent" must return an instance of Element');
14992 }
14993
14994 done({
14995 element: element
14996 });
14997 }
14998 }
14999 /**
15000 * @return {Number}
15001 */
15002
15003 }, {
15004 key: "countItems",
15005 value: function countItems() {
15006 var count = this._userDelegate.countItems();
15007
15008 if (typeof count !== 'number') {
15009 util$4.throw('"countItems" must return a number');
15010 }
15011
15012 return count;
15013 }
15014 /**
15015 * @param {Number} index
15016 * @param {Object} item
15017 * @param {Element} item.element
15018 */
15019
15020 }, {
15021 key: "updateItem",
15022 value: function updateItem(index, item) {
15023 if (this._userDelegate.updateItemContent instanceof Function) {
15024 this._userDelegate.updateItemContent(index, item);
15025 }
15026 }
15027 /**
15028 * @return {Number}
15029 */
15030
15031 }, {
15032 key: "calculateItemHeight",
15033 value: function calculateItemHeight(index) {
15034 if (this._userDelegate.calculateItemHeight instanceof Function) {
15035 var height = this._userDelegate.calculateItemHeight(index);
15036
15037 if (typeof height !== 'number') {
15038 util$4.throw('"calculateItemHeight" must return a number');
15039 }
15040
15041 return height;
15042 }
15043
15044 return 0;
15045 }
15046 /**
15047 * @param {Number} index
15048 * @param {Object} item
15049 */
15050
15051 }, {
15052 key: "destroyItem",
15053 value: function destroyItem(index, item) {
15054 if (this._userDelegate.destroyItem instanceof Function) {
15055 this._userDelegate.destroyItem(index, item);
15056 }
15057 }
15058 /**
15059 * @return {void}
15060 */
15061
15062 }, {
15063 key: "destroy",
15064 value: function destroy() {
15065 if (this._userDelegate.destroy instanceof Function) {
15066 this._userDelegate.destroy();
15067 }
15068
15069 this._userDelegate = this._templateElement = null;
15070 }
15071 }]);
15072
15073 return LazyRepeatDelegate;
15074 }();
15075 /**
15076 * This class provide core functions for ons-lazy-repeat.
15077 */
15078
15079 var LazyRepeatProvider = /*#__PURE__*/function () {
15080 /**
15081 * @param {Element} wrapperElement
15082 * @param {LazyRepeatDelegate} delegate
15083 */
15084 function LazyRepeatProvider(wrapperElement, delegate) {
15085 _classCallCheck(this, LazyRepeatProvider);
15086
15087 if (!(delegate instanceof LazyRepeatDelegate)) {
15088 util$4.throw('"delegate" parameter must be an instance of LazyRepeatDelegate');
15089 }
15090
15091 this._wrapperElement = wrapperElement;
15092 this._delegate = delegate;
15093 this._insertIndex = this._wrapperElement.children[0] && this._wrapperElement.children[0].tagName === 'ONS-LAZY-REPEAT' ? 1 : 0;
15094
15095 if (wrapperElement.tagName.toLowerCase() === 'ons-list') {
15096 wrapperElement.classList.add('lazy-list');
15097 }
15098
15099 this._pageContent = this._findPageContentElement(wrapperElement);
15100
15101 if (!this._pageContent) {
15102 util$4.throw('LazyRepeat must be descendant of a Page element');
15103 }
15104
15105 this.lastScrollTop = this._pageContent.scrollTop;
15106 this.padding = 0;
15107 this._topPositions = [0];
15108 this._renderedItems = {};
15109
15110 if (!this._delegate.itemHeight && !this._delegate.calculateItemHeight(0)) {
15111 this._unknownItemHeight = true;
15112 }
15113
15114 this._addEventListeners();
15115
15116 this._onChange();
15117 }
15118
15119 _createClass(LazyRepeatProvider, [{
15120 key: "padding",
15121 get: function get() {
15122 return parseInt(this._wrapperElement.style.paddingTop, 10);
15123 },
15124 set: function set(newValue) {
15125 this._wrapperElement.style.paddingTop = newValue + 'px';
15126 }
15127 }, {
15128 key: "_findPageContentElement",
15129 value: function _findPageContentElement(wrapperElement) {
15130 var pageContent = util$4.findParent(wrapperElement, '.page__content');
15131
15132 if (pageContent) {
15133 return pageContent;
15134 }
15135
15136 var page = util$4.findParent(wrapperElement, 'ons-page');
15137
15138 if (page) {
15139 var content = util$4.findChild(page, '.content');
15140
15141 if (content) {
15142 return content;
15143 }
15144 }
15145
15146 return null;
15147 }
15148 }, {
15149 key: "_checkItemHeight",
15150 value: function _checkItemHeight(callback) {
15151 var _this = this;
15152
15153 this._delegate.loadItemElement(0, function (item) {
15154 if (!_this._unknownItemHeight) {
15155 util$4.throw('Invalid state');
15156 }
15157
15158 _this._wrapperElement.appendChild(item.element);
15159
15160 var done = function done() {
15161 _this._delegate.destroyItem(0, item);
15162
15163 item.element && item.element.remove();
15164 delete _this._unknownItemHeight;
15165 callback();
15166 };
15167
15168 _this._itemHeight = item.element.offsetHeight;
15169
15170 if (_this._itemHeight > 0) {
15171 done();
15172 return;
15173 } // retry to measure offset height
15174 // dirty fix for angular2 directive
15175
15176
15177 _this._wrapperElement.style.visibility = 'hidden';
15178 item.element.style.visibility = 'hidden';
15179 setImmediate(function () {
15180 _this._itemHeight = item.element.offsetHeight;
15181
15182 if (_this._itemHeight == 0) {
15183 util$4.throw('Invalid state: "itemHeight" must be greater than zero');
15184 }
15185
15186 _this._wrapperElement.style.visibility = '';
15187 done();
15188 });
15189 });
15190 }
15191 }, {
15192 key: "staticItemHeight",
15193 get: function get() {
15194 return this._delegate.itemHeight || this._itemHeight;
15195 }
15196 }, {
15197 key: "_countItems",
15198 value: function _countItems() {
15199 return this._delegate.countItems();
15200 }
15201 }, {
15202 key: "_getItemHeight",
15203 value: function _getItemHeight(i) {
15204 // Item is rendered
15205 if (Object.prototype.hasOwnProperty.call(this._renderedItems, i)) {
15206 if (!Object.prototype.hasOwnProperty.call(this._renderedItems[i], 'height')) {
15207 this._renderedItems[i].height = this._renderedItems[i].element.offsetHeight;
15208 }
15209
15210 return this._renderedItems[i].height;
15211 } // Item is not rendered, scroll up
15212
15213
15214 if (this._topPositions[i + 1] && this._topPositions[i]) {
15215 return this._topPositions[i + 1] - this._topPositions[i];
15216 } // Item is not rendered, scroll down
15217
15218
15219 return this.staticItemHeight || this._delegate.calculateItemHeight(i);
15220 }
15221 }, {
15222 key: "_calculateRenderedHeight",
15223 value: function _calculateRenderedHeight() {
15224 var _this2 = this;
15225
15226 return Object.keys(this._renderedItems).reduce(function (a, b) {
15227 return a + _this2._getItemHeight(+b);
15228 }, 0);
15229 }
15230 }, {
15231 key: "_onChange",
15232 value: function _onChange() {
15233 this._render();
15234 }
15235 }, {
15236 key: "_lastItemRendered",
15237 value: function _lastItemRendered() {
15238 return Math.max.apply(Math, _toConsumableArray(Object.keys(this._renderedItems)));
15239 }
15240 }, {
15241 key: "_firstItemRendered",
15242 value: function _firstItemRendered() {
15243 return Math.min.apply(Math, _toConsumableArray(Object.keys(this._renderedItems)));
15244 }
15245 }, {
15246 key: "refresh",
15247 value: function refresh() {
15248 var forceRender = {
15249 forceScrollDown: true
15250 };
15251
15252 var firstItemIndex = this._firstItemRendered();
15253
15254 if (util$4.isInteger(firstItemIndex)) {
15255 this._wrapperElement.style.height = this._topPositions[firstItemIndex] + this._calculateRenderedHeight() + 'px';
15256 this.padding = this._topPositions[firstItemIndex];
15257 forceRender.forceFirstIndex = firstItemIndex;
15258 }
15259
15260 this._removeAllElements();
15261
15262 this._render(forceRender);
15263
15264 this._wrapperElement.style.height = 'inherit';
15265 }
15266 }, {
15267 key: "_render",
15268 value: function _render() {
15269 var _this3 = this;
15270
15271 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
15272 _ref$forceScrollDown = _ref.forceScrollDown,
15273 forceScrollDown = _ref$forceScrollDown === void 0 ? false : _ref$forceScrollDown,
15274 forceFirstIndex = _ref.forceFirstIndex,
15275 forceLastIndex = _ref.forceLastIndex;
15276
15277 if (this._unknownItemHeight) {
15278 return this._checkItemHeight(this._render.bind(this, arguments[0]));
15279 }
15280
15281 var isScrollUp = !forceScrollDown && this.lastScrollTop > this._pageContent.scrollTop;
15282 this.lastScrollTop = this._pageContent.scrollTop;
15283 var keep = {};
15284
15285 var offset = this._wrapperElement.getBoundingClientRect().top;
15286
15287 var limit = 4 * window.innerHeight - offset;
15288
15289 var count = this._countItems();
15290 var start = forceFirstIndex || Math.max(0, this._calculateStartIndex(offset) - 30); // Recalculate for 0 or undefined
15291
15292 var i = start;
15293
15294 for (var top = this._topPositions[i]; i < count && top < limit; i++) {
15295 if (i >= this._topPositions.length) {
15296 // perf optimization
15297 this._topPositions.length += 100;
15298 }
15299
15300 this._topPositions[i] = top;
15301 top += this._getItemHeight(i);
15302 }
15303
15304 if (this._delegate.hasRenderFunction && this._delegate.hasRenderFunction()) {
15305 return this._delegate._render(start, i, function () {
15306 _this3.padding = _this3._topPositions[start];
15307 });
15308 }
15309
15310 if (isScrollUp) {
15311 for (var j = i - 1; j >= start; j--) {
15312 keep[j] = true;
15313
15314 this._renderElement(j, isScrollUp);
15315 }
15316 } else {
15317 var lastIndex = forceLastIndex || Math.max.apply(Math, [i - 1].concat(_toConsumableArray(Object.keys(this._renderedItems)))); // Recalculate for 0 or undefined
15318
15319 for (var _j = start; _j <= lastIndex; _j++) {
15320 keep[_j] = true;
15321
15322 this._renderElement(_j, isScrollUp);
15323 }
15324 }
15325
15326 Object.keys(this._renderedItems).forEach(function (key) {
15327 return keep[key] || _this3._removeElement(key, isScrollUp);
15328 });
15329 }
15330 /**
15331 * @param {Number} index
15332 * @param {Boolean} isScrollUp
15333 */
15334
15335 }, {
15336 key: "_renderElement",
15337 value: function _renderElement(index, isScrollUp) {
15338 var _this4 = this;
15339
15340 var item = this._renderedItems[index];
15341
15342 if (item) {
15343 this._delegate.updateItem(index, item); // update if it exists
15344
15345
15346 return;
15347 }
15348
15349 this._delegate.loadItemElement(index, function (item) {
15350 if (isScrollUp) {
15351 _this4._wrapperElement.insertBefore(item.element, _this4._wrapperElement.children[_this4._insertIndex]);
15352
15353 _this4.padding = _this4._topPositions[index];
15354 item.height = _this4._topPositions[index + 1] - _this4._topPositions[index];
15355 } else {
15356 _this4._wrapperElement.appendChild(item.element);
15357 }
15358
15359 _this4._renderedItems[index] = item;
15360 });
15361 }
15362 /**
15363 * @param {Number} index
15364 * @param {Boolean} isScrollUp
15365 */
15366
15367 }, {
15368 key: "_removeElement",
15369 value: function _removeElement(index) {
15370 var isScrollUp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
15371 index = +index;
15372 var item = this._renderedItems[index];
15373
15374 this._delegate.destroyItem(index, item);
15375
15376 if (isScrollUp) {
15377 this._topPositions[index + 1] = undefined;
15378 } else {
15379 this.padding = this.padding + this._getItemHeight(index);
15380 }
15381
15382 if (item.element.parentElement) {
15383 item.element.parentElement.removeChild(item.element);
15384 }
15385
15386 delete this._renderedItems[index];
15387 }
15388 }, {
15389 key: "_removeAllElements",
15390 value: function _removeAllElements() {
15391 var _this5 = this;
15392
15393 Object.keys(this._renderedItems).forEach(function (key) {
15394 return _this5._removeElement(key);
15395 });
15396 }
15397 }, {
15398 key: "_recalculateTopPositions",
15399 value: function _recalculateTopPositions(start, end) {
15400 for (var i = start; i <= end; i++) {
15401 this._topPositions[i + 1] = this._topPositions[i] + this._getItemHeight(i);
15402 }
15403 }
15404 }, {
15405 key: "_calculateStartIndex",
15406 value: function _calculateStartIndex(current) {
15407 var firstItemIndex = this._firstItemRendered();
15408
15409 var lastItemIndex = this._lastItemRendered(); // Fix for Safari scroll and Angular 2
15410
15411
15412 this._recalculateTopPositions(firstItemIndex, lastItemIndex);
15413
15414 var start = 0;
15415 var end = this._countItems() - 1; // Binary search for index at top of screen so we can speed up rendering.
15416
15417 for (;;) {
15418 var middle = Math.floor((start + end) / 2);
15419 var value = current + this._topPositions[middle];
15420
15421 if (end < start) {
15422 return 0;
15423 } else if (value <= 0 && value + this._getItemHeight(middle) > 0) {
15424 return middle;
15425 } else if (isNaN(value) || value >= 0) {
15426 end = middle - 1;
15427 } else {
15428 start = middle + 1;
15429 }
15430 }
15431 }
15432 }, {
15433 key: "_debounce",
15434 value: function _debounce(func, wait, immediate) {
15435 var timeout;
15436 return function () {
15437 var _arguments = arguments,
15438 _this6 = this;
15439
15440 var callNow = immediate && !timeout;
15441 clearTimeout(timeout);
15442
15443 if (callNow) {
15444 func.apply(this, arguments);
15445 } else {
15446 timeout = setTimeout(function () {
15447 timeout = null;
15448 func.apply(_this6, _arguments);
15449 }, wait);
15450 }
15451 };
15452 }
15453 }, {
15454 key: "_doubleFireOnTouchend",
15455 value: function _doubleFireOnTouchend() {
15456 this._render();
15457
15458 this._debounce(this._render.bind(this), 100);
15459 }
15460 }, {
15461 key: "_addEventListeners",
15462 value: function _addEventListeners() {
15463 util$4.bindListeners(this, ['_onChange', '_doubleFireOnTouchend']);
15464
15465 if (platform.isIOS()) {
15466 this._boundOnChange = this._debounce(this._boundOnChange, 30);
15467 }
15468
15469 this._pageContent.addEventListener('scroll', this._boundOnChange, true);
15470
15471 if (platform.isIOS()) {
15472 util$4.addEventListener(this._pageContent, 'touchmove', this._boundOnChange, {
15473 capture: true,
15474 passive: true
15475 });
15476
15477 this._pageContent.addEventListener('touchend', this._boundDoubleFireOnTouchend, true);
15478 }
15479
15480 window.document.addEventListener('resize', this._boundOnChange, true);
15481 }
15482 }, {
15483 key: "_removeEventListeners",
15484 value: function _removeEventListeners() {
15485 this._pageContent.removeEventListener('scroll', this._boundOnChange, true);
15486
15487 if (platform.isIOS()) {
15488 util$4.removeEventListener(this._pageContent, 'touchmove', this._boundOnChange, {
15489 capture: true,
15490 passive: true
15491 });
15492
15493 this._pageContent.removeEventListener('touchend', this._boundDoubleFireOnTouchend, true);
15494 }
15495
15496 window.document.removeEventListener('resize', this._boundOnChange, true);
15497 }
15498 }, {
15499 key: "destroy",
15500 value: function destroy() {
15501 this._removeAllElements();
15502
15503 this._delegate.destroy();
15504
15505 this._parentElement = this._delegate = this._renderedItems = null;
15506
15507 this._removeEventListeners();
15508 }
15509 }]);
15510
15511 return LazyRepeatProvider;
15512 }();
15513
15514 /**
15515 * @element ons-lazy-repeat
15516 * @category list
15517 * @description
15518 * [en]
15519 * Using this component a list with millions of items can be rendered without a drop in performance.
15520 * It does that by "lazily" loading elements into the DOM when they come into view and
15521 * removing items from the DOM when they are not visible.
15522 * [/en]
15523 * [ja]
15524 * このコンポーネント内で描画されるアイテムのDOM要素の読み込みは、画面に見えそうになった時まで自動的に遅延され、
15525 * 画面から見えなくなった場合にはその要素は動的にアンロードされます。
15526 * このコンポーネントを使うことで、パフォーマンスを劣化させること無しに巨大な数の要素を描画できます。
15527 * [/ja]
15528 * @codepen QwrGBm
15529 * @tutorial vanilla/Reference/lazy-repeat
15530 * @seealso ons-list
15531 * [en]The `<ons-list>` element is used to render a list.[/en]
15532 * [ja]`<ons-list>`要素はリストを描画するのに使われます。[/ja]
15533 * @example
15534 * <script>
15535 * window.addEventListener('load', function() {
15536 * var lazyRepeat = document.querySelector('#list');
15537 * lazyRepeat.delegate = {
15538 * createItemContent: function(i, template) {
15539 * var dom = template.cloneNode(true);
15540 * dom.innerText = i;
15541 *
15542 * return dom;
15543 * },
15544 * countItems: function() {
15545 * return 10000000;
15546 * },
15547 * destroyItem: function(index, item) {
15548 * console.log('Destroyed item with index: ' + index);
15549 * }
15550 * };
15551 * });
15552 * </script>
15553 *
15554 * <ons-list id="list">
15555 * <ons-lazy-repeat>
15556 * <ons-list-item></ons-list-item>
15557 * </ons-lazy-repeat>
15558 * </ons-list>
15559 */
15560
15561 var LazyRepeatElement = /*#__PURE__*/function (_BaseElement) {
15562 _inherits(LazyRepeatElement, _BaseElement);
15563
15564 var _super = _createSuper(LazyRepeatElement);
15565
15566 function LazyRepeatElement() {
15567 _classCallCheck(this, LazyRepeatElement);
15568
15569 return _super.apply(this, arguments);
15570 }
15571
15572 _createClass(LazyRepeatElement, [{
15573 key: "connectedCallback",
15574 value: function connectedCallback() {
15575 // not very good idea and also not documented
15576 if (this.hasAttribute('delegate')) {
15577 this.delegate = window[this.getAttribute('delegate')];
15578 }
15579 }
15580 /**
15581 * @property delegate
15582 * @type {Object}
15583 * @description
15584 * [en]Specify a delegate object to load and unload item elements.[/en]
15585 * [ja]要素のロード、アンロードなどの処理を委譲するオブジェクトを指定します。[/ja]
15586 */
15587
15588 /**
15589 * @property delegate.createItemContent
15590 * @type {Function}
15591 * @description
15592 * [en]
15593 * This function should return a `HTMLElement`.
15594 *
15595 * To help rendering the element, the current index and a template is supplied as arguments. The template is the initial content of the `<ons-lazy-repeat>` element.
15596 * [/en]
15597 * [ja]
15598 * この関数は`HTMLElement`を返してください。
15599 * 要素を生成しやすくするために、現在のアイテムのインデックスとテンプレートが引数に渡されます。
15600 * このテンプレートは、`<ons-lazy-repeat>`要素のコンテンツが渡されます。
15601 * [/ja]
15602 */
15603
15604 /**
15605 * @property delegate.countItems
15606 * @type {Function}
15607 * @description
15608 * [en]Should return the number of items in the list.[/en]
15609 * [ja]リスト内のアイテム数を返してください。[/ja]
15610 */
15611
15612 /**
15613 * @property delegate.calculateItemHeight
15614 * @type {Function}
15615 * @description
15616 * [en]
15617 * Should return the height of an item. The index is provided as an argument.
15618 *
15619 * This is important when rendering lists where the items have different height.
15620 *
15621 * The function is optional and if it isn't present the height of the first item will be automatically calculated and used for all other items.
15622 * [/en]
15623 * [ja]
15624 * アイテムの高さ(ピクセル)を返してください。アイテムのインデックス値は引数で渡されます。
15625 * この関数は、それぞれのアイムが違った高さを持つリストをレンダリングする際に重要です。
15626 * この関数はオプショナルです。もしこの関数が無い場合には、
15627 * 最初のアイテムの高さが他のすべてのアイテムの高さとして利用されます。
15628 * [/ja]
15629 */
15630
15631 /**
15632 * @property delegate.destroyItem
15633 * @type {Function}
15634 * @description
15635 * [en]
15636 * This function is used called when an item is removed from the DOM. The index and DOM element is provided as arguments.
15637 *
15638 * The function is optional but may be important in order to avoid memory leaks.
15639 * [/en]
15640 * [ja]
15641 * この関数は、あるアイテムがDOMツリーから除かれた時に呼び出されます。
15642 * アイテムのインデックス値とDOM要素が引数として渡されます。
15643 * この関数はオプショナルですが、各アイテムの後処理が必要な場合にはメモリーリークを避けるために重要です。
15644 * [/ja]
15645 */
15646
15647 }, {
15648 key: "delegate",
15649 get: function get() {
15650 // eslint-disable-line getter-return
15651 util$4.throw('No delegate getter');
15652 }
15653 /**
15654 * @method refresh
15655 * @signature refresh()
15656 * @description
15657 * [en]Refresh the list. Use this method when the data has changed.[/en]
15658 * [ja]リストを更新します。もしデータが変わった場合にはこのメソッドを使ってください。[/ja]
15659 */
15660 ,
15661 set: function set(userDelegate) {
15662 this._lazyRepeatProvider && this._lazyRepeatProvider.destroy();
15663
15664 if (!this._templateElement && this.children[0]) {
15665 this._templateElement = this.removeChild(this.children[0]);
15666 }
15667
15668 var delegate = new LazyRepeatDelegate(userDelegate, this._templateElement || null);
15669 this._lazyRepeatProvider = new LazyRepeatProvider(this.parentElement, delegate);
15670 }
15671 }, {
15672 key: "refresh",
15673 value: function refresh() {
15674 this._lazyRepeatProvider && this._lazyRepeatProvider.refresh();
15675 }
15676 }, {
15677 key: "attributeChangedCallback",
15678 value: function attributeChangedCallback(name, last, current) {}
15679 }, {
15680 key: "disconnectedCallback",
15681 value: function disconnectedCallback() {
15682 if (this._lazyRepeatProvider) {
15683 this._lazyRepeatProvider.destroy();
15684
15685 this._lazyRepeatProvider = null;
15686 }
15687 }
15688 }]);
15689
15690 return LazyRepeatElement;
15691 }(BaseElement);
15692 internal$1.LazyRepeatDelegate = LazyRepeatDelegate;
15693 internal$1.LazyRepeatProvider = LazyRepeatProvider;
15694 onsElements.LazyRepeat = LazyRepeatElement;
15695 customElements.define('ons-lazy-repeat', LazyRepeatElement);
15696
15697 var defaultClassName$c = 'list-header';
15698 var scheme$m = {
15699 '': 'list-header--*'
15700 };
15701 /**
15702 * @element ons-list-header
15703 * @category list
15704 * @description
15705 * [en]Header element for list items. Must be put inside the `<ons-list>` component.[/en]
15706 * [ja]リスト要素に使用するヘッダー用コンポーネント。ons-listと共に使用します。[/ja]
15707 * @seealso ons-list
15708 * [en]The `<ons-list>` component[/en]
15709 * [ja]ons-listコンポーネント[/ja]
15710 * @seealso ons-list-item
15711 * [en]The `<ons-list-item>` component[/en]
15712 * [ja]ons-list-itemコンポーネント[/ja]
15713 * @codepen yxcCt
15714 * @tutorial vanilla/Reference/list
15715 * @modifier material
15716 * [en]Display a Material Design list header.[/en]
15717 * [ja][/ja]
15718 * @example
15719 * <ons-list>
15720 * <ons-list-header>Header Text</ons-list-header>
15721 * <ons-list-item>Item</ons-list-item>
15722 * <ons-list-item>Item</ons-list-item>
15723 * </ons-list>
15724 */
15725
15726 var ListHeaderElement = /*#__PURE__*/function (_BaseElement) {
15727 _inherits(ListHeaderElement, _BaseElement);
15728
15729 var _super = _createSuper(ListHeaderElement);
15730
15731 /**
15732 * @attribute modifier
15733 * @type {String}
15734 * @description
15735 * [en]The appearance of the list header.[/en]
15736 * [ja]ヘッダーの表現を指定します。[/ja]
15737 */
15738 function ListHeaderElement() {
15739 var _this;
15740
15741 _classCallCheck(this, ListHeaderElement);
15742
15743 _this = _super.call(this);
15744
15745 _this._compile();
15746
15747 return _this;
15748 }
15749
15750 _createClass(ListHeaderElement, [{
15751 key: "_compile",
15752 value: function _compile() {
15753 autoStyle.prepare(this);
15754 this.classList.add(defaultClassName$c);
15755 ModifierUtil.initModifier(this, scheme$m);
15756 }
15757 }, {
15758 key: "attributeChangedCallback",
15759 value: function attributeChangedCallback(name, last, current) {
15760 switch (name) {
15761 case 'class':
15762 util$4.restoreClass(this, defaultClassName$c, scheme$m);
15763 break;
15764
15765 case 'modifier':
15766 ModifierUtil.onModifierChanged(last, current, this, scheme$m);
15767 break;
15768 }
15769 }
15770 }], [{
15771 key: "observedAttributes",
15772 get: function get() {
15773 return ['modifier', 'class'];
15774 }
15775 }]);
15776
15777 return ListHeaderElement;
15778 }(BaseElement);
15779 onsElements.ListHeader = ListHeaderElement;
15780 customElements.define('ons-list-header', ListHeaderElement);
15781
15782 var defaultClassName$b = 'list-title';
15783 var scheme$l = {
15784 '': 'list-title--*'
15785 };
15786 /**
15787 * @element ons-list-title
15788 * @category list
15789 * @description
15790 * [en]Represents a list title.[/en]
15791 * [ja]リストのタイトルを表現します。[/ja]
15792 * @example
15793 * <ons-list-title>List Title</ons-list-title>
15794 * <ons-list>
15795 * <ons-list-item>Item</ons-list-item>
15796 * </ons-list>
15797 * @modifier material
15798 * [en]Display a Material Design list title.[/en]
15799 * [ja][/ja]
15800 */
15801
15802 var ListTitleElement = /*#__PURE__*/function (_BaseElement) {
15803 _inherits(ListTitleElement, _BaseElement);
15804
15805 var _super = _createSuper(ListTitleElement);
15806
15807 function ListTitleElement() {
15808 var _this;
15809
15810 _classCallCheck(this, ListTitleElement);
15811
15812 _this = _super.call(this);
15813
15814 _this._compile();
15815
15816 return _this;
15817 }
15818
15819 _createClass(ListTitleElement, [{
15820 key: "_compile",
15821 value: function _compile() {
15822 autoStyle.prepare(this);
15823 this.classList.add(defaultClassName$b);
15824 ModifierUtil.initModifier(this, scheme$l);
15825 }
15826 }, {
15827 key: "attributeChangedCallback",
15828 value: function attributeChangedCallback(name, last, current) {
15829 switch (name) {
15830 case 'class':
15831 util$4.restoreClass(this, defaultClassName$b, scheme$l);
15832 break;
15833
15834 case 'modifier':
15835 ModifierUtil.onModifierChanged(last, current, this, scheme$l);
15836 break;
15837 }
15838 }
15839 }], [{
15840 key: "observedAttributes",
15841 get: function get() {
15842 return ['modifier', 'class'];
15843 }
15844 }]);
15845
15846 return ListTitleElement;
15847 }(BaseElement);
15848 onsElements.ListTitle = ListTitleElement;
15849 customElements.define('ons-list-title', ListTitleElement);
15850
15851 var ListItemAnimator = /*#__PURE__*/function (_BaseAnimator) {
15852 _inherits(ListItemAnimator, _BaseAnimator);
15853
15854 var _super = _createSuper(ListItemAnimator);
15855
15856 function ListItemAnimator() {
15857 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
15858 _ref$timing = _ref.timing,
15859 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
15860 _ref$delay = _ref.delay,
15861 delay = _ref$delay === void 0 ? 0 : _ref$delay,
15862 _ref$duration = _ref.duration,
15863 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
15864
15865 _classCallCheck(this, ListItemAnimator);
15866
15867 return _super.call(this, {
15868 timing: timing,
15869 delay: delay,
15870 duration: duration
15871 });
15872 }
15873
15874 _createClass(ListItemAnimator, [{
15875 key: "showExpansion",
15876 value: function showExpansion(listItem, callback) {
15877 callback();
15878 }
15879 }, {
15880 key: "hideExpansion",
15881 value: function hideExpansion(listItem, callback) {
15882 callback();
15883 }
15884 }]);
15885
15886 return ListItemAnimator;
15887 }(BaseAnimator);
15888 var SlideListItemAnimator = /*#__PURE__*/function (_ListItemAnimator) {
15889 _inherits(SlideListItemAnimator, _ListItemAnimator);
15890
15891 var _super2 = _createSuper(SlideListItemAnimator);
15892
15893 function SlideListItemAnimator() {
15894 _classCallCheck(this, SlideListItemAnimator);
15895
15896 return _super2.apply(this, arguments);
15897 }
15898
15899 _createClass(SlideListItemAnimator, [{
15900 key: "showExpansion",
15901 value: function showExpansion(listItem, callback) {
15902 this._animateExpansion(listItem, true, callback);
15903 }
15904 }, {
15905 key: "hideExpansion",
15906 value: function hideExpansion(listItem, callback) {
15907 this._animateExpansion(listItem, false, callback);
15908 }
15909 }, {
15910 key: "_animateExpansion",
15911 value: function _animateExpansion(listItem, shouldOpen, callback) {
15912 var _animit;
15913
15914 // To animate the opening of the expansion panel correctly, we need to know its
15915 // height. To calculate this, we set its height to auto, and then get the computed
15916 // height and padding. Once this is done, we set the height back to its original value.
15917 var oldHeight = listItem.expandableContent.style.height;
15918 var oldDisplay = listItem.expandableContent.style.display;
15919 listItem.expandableContent.style.height = 'auto';
15920 listItem.expandableContent.style.display = 'block';
15921 var computedStyle = window.getComputedStyle(listItem.expandableContent);
15922 var expansionOpenTransition = [{
15923 height: 0,
15924 paddingTop: 0,
15925 paddingBottom: 0
15926 }, {
15927 height: computedStyle.height,
15928 paddingTop: computedStyle.paddingTop,
15929 paddingBottom: computedStyle.paddingBottom
15930 }];
15931 var iconOpenTransition = [{
15932 transform: 'rotate(45deg)'
15933 }, {
15934 transform: 'rotate(225deg)'
15935 }]; // Now that we have the values we need, reset the height back to its original state
15936
15937 listItem.expandableContent.style.height = oldHeight;
15938
15939 (_animit = Animit(listItem.expandableContent, {
15940 duration: this.duration,
15941 property: 'height padding-top padding-bottom'
15942 })).default.apply(_animit, _toConsumableArray(shouldOpen ? expansionOpenTransition : expansionOpenTransition.reverse())).play(function () {
15943 listItem.expandableContent.style.display = oldDisplay;
15944 callback && callback();
15945 });
15946
15947 if (listItem.expandChevron) {
15948 var _animit2;
15949
15950 (_animit2 = Animit(listItem.expandChevron, {
15951 duration: this.duration,
15952 property: 'transform'
15953 })).default.apply(_animit2, _toConsumableArray(shouldOpen ? iconOpenTransition : iconOpenTransition.reverse())).play();
15954 }
15955 }
15956 }]);
15957
15958 return SlideListItemAnimator;
15959 }(ListItemAnimator);
15960
15961 var defaultClassName$a = 'list-item';
15962 var scheme$k = {
15963 '.list-item': 'list-item--*',
15964 '.list-item__left': 'list-item--*__left',
15965 '.list-item__center': 'list-item--*__center',
15966 '.list-item__right': 'list-item--*__right',
15967 '.list-item__label': 'list-item--*__label',
15968 '.list-item__title': 'list-item--*__title',
15969 '.list-item__subtitle': 'list-item--*__subtitle',
15970 '.list-item__thumbnail': 'list-item--*__thumbnail',
15971 '.list-item__icon': 'list-item--*__icon'
15972 };
15973 var _animatorDict$5 = {
15974 'default': SlideListItemAnimator,
15975 'none': ListItemAnimator
15976 };
15977 /**
15978 * @element ons-list-item
15979 * @category list
15980 * @modifier tappable
15981 * [en]Make the list item change appearance when it's tapped. On iOS it is better to use the "tappable" and "tap-background-color" attribute for better behavior when scrolling.[/en]
15982 * [ja]タップやクリックした時に効果が表示されるようになります。[/ja]
15983 * @modifier chevron
15984 * [en]Display a chevron at the right end of the list item and make it change appearance when tapped.[/en]
15985 * [ja][/ja]
15986 * @modifier longdivider
15987 * [en]Displays a long horizontal divider between items.[/en]
15988 * [ja][/ja]
15989 * @modifier nodivider
15990 * [en]Removes the divider between list items.[/en]
15991 * [ja][/ja]
15992 * @modifier material
15993 * [en]Display a Material Design list item.[/en]
15994 * [ja][/ja]
15995 * @description
15996 * [en]
15997 * Component that represents each item in a list. The list item is composed of four parts that are represented with the `left`, `center`, `right` and `expandable-content` classes. These classes can be used to ensure that the content of the list items is properly aligned.
15998 *
15999 * ```
16000 * <ons-list-item>
16001 * <div class="left">Left</div>
16002 * <div class="center">Center</div>
16003 * <div class="right">Right</div>
16004 * <div class="expandable-content">Expandable content</div>
16005 * </ons-list-item>
16006 * ```
16007 *
16008 * There are also a number of classes (prefixed with `list-item__*`) that help when putting things like icons and thumbnails into the list items.
16009 * [/en]
16010 * [ja][/ja]
16011 * @seealso ons-list
16012 * [en]ons-list component[/en]
16013 * [ja]ons-listコンポーネント[/ja]
16014 * @seealso ons-list-header
16015 * [en]ons-list-header component[/en]
16016 * [ja]ons-list-headerコンポーネント[/ja]
16017 * @codepen yxcCt
16018 * @tutorial vanilla/Reference/list
16019 * @example
16020 * <ons-list-item>
16021 * <div class="left">
16022 * <ons-icon icon="md-face" class="list-item__icon"></ons-icon>
16023 * </div>
16024 * <div class="center">
16025 * <div class="list-item__title">Title</div>
16026 * <div class="list-item__subtitle">Subtitle</div>
16027 * </div>
16028 * <div class="right">
16029 * <ons-switch></ons-switch>
16030 * </div>
16031 * </ons-list-item>
16032 */
16033
16034 var ListItemElement = /*#__PURE__*/function (_BaseElement) {
16035 _inherits(ListItemElement, _BaseElement);
16036
16037 var _super = _createSuper(ListItemElement);
16038
16039 /**
16040 * @attribute modifier
16041 * @type {String}
16042 * @description
16043 * [en]The appearance of the list item.[/en]
16044 * [ja]各要素の表現を指定します。[/ja]
16045 */
16046
16047 /**
16048 * @attribute lock-on-drag
16049 * @type {Boolean}
16050 * @description
16051 * [en]Prevent vertical scrolling when the user drags horizontally.[/en]
16052 * [ja]この属性があると、ユーザーがこの要素を横方向にドラッグしている時に、縦方向のスクロールが起きないようになります。[/ja]
16053 */
16054
16055 /**
16056 * @property lockOnDrag
16057 * @type {Boolean}
16058 * @description
16059 * [en]Prevent vertical scrolling when the user drags horizontally.[/en]
16060 * [ja]この属性があると、ユーザーがこの要素を横方向にドラッグしている時に、縦方向のスクロールが起きないようになります。[/ja]
16061 */
16062
16063 /**
16064 * @attribute tappable
16065 * @type {Boolean}
16066 * @description
16067 * [en]Makes the element react to taps. `prevent-tap` attribute can be added to child elements like buttons or inputs to prevent this effect. `ons-*` elements are ignored by default.[/en]
16068 * [ja][/ja]
16069 */
16070
16071 /**
16072 * @property tappable
16073 * @type {Boolean}
16074 * @description
16075 * [en]Makes the element react to taps. `prevent-tap` attribute can be added to child elements like buttons or inputs to prevent this effect. `ons-*` elements are ignored by default.[/en]
16076 * [ja][/ja]
16077 */
16078
16079 /**
16080 * @attribute tap-background-color
16081 * @type {Color}
16082 * @description
16083 * [en] Changes the background color when tapped. For this to work, the attribute "tappable" needs to be set. The default color is "#d9d9d9". It will display as a ripple effect on Android.[/en]
16084 * [ja][/ja]
16085 */
16086
16087 /**
16088 * @property tapBackgroundColor
16089 * @type {Color}
16090 * @description
16091 * [en] Changes the background color when tapped. For this to work, the attribute "tappable" needs to be set. The default color is "#d9d9d9". It will display as a ripple effect on Android.[/en]
16092 * [ja][/ja]
16093 */
16094
16095 /**
16096 * @attribute expandable
16097 * @type {Boolean}
16098 * @description
16099 * [en]Makes the element able to be expanded to reveal extra content. For this to work, the expandable content must be defined in `div.expandable-content`.[/en]
16100 * [ja][/ja]
16101 */
16102
16103 /**
16104 * @property expandable
16105 * @initonly
16106 * @type {Boolean}
16107 * @description
16108 * [en]Makes the element able to be expanded to reveal extra content. For this to work, the expandable content must be defined in `div.expandable-content`.[/en]
16109 * [ja][/ja]
16110 */
16111
16112 /**
16113 * @attribute expanded
16114 * @type {Boolean}
16115 * @description
16116 * [en]For expandable list items, specifies whether the expandable content is expanded or not.[/en]
16117 * [ja][/ja]
16118 */
16119
16120 /**
16121 * @property expanded
16122 * @type {Boolean}
16123 * @description
16124 * [en]For expandable list items, specifies whether the expandable content is expanded or not.[/en]
16125 * [ja][/ja]
16126 */
16127
16128 /**
16129 * @event expand
16130 * @description
16131 * [en]For expandable list items, fires when the list item is expanded or contracted.[/en]
16132 * [ja][/ja]
16133 */
16134
16135 /**
16136 * @attribute animation
16137 * @type {String}
16138 * @default default
16139 * @description
16140 * [en]The animation used when showing and hiding the expandable content. Can be either `"default"` or `"none"`.[/en]
16141 * [ja][/ja]
16142 */
16143
16144 /**
16145 * @property animation
16146 * @type {String}
16147 * @default default
16148 * @description
16149 * [en]The animation used when showing and hiding the expandable content. Can be either `"default"` or `"none"`.[/en]
16150 * [ja][/ja]
16151 */
16152 function ListItemElement() {
16153 var _this;
16154
16155 _classCallCheck(this, ListItemElement);
16156
16157 _this = _super.call(this);
16158 _this._animatorFactory = _this._updateAnimatorFactory(); // Elements ignored when tapping
16159
16160 var re = /^ons-(?!col$|row$|if$)/i;
16161
16162 _this._shouldIgnoreTap = function (e) {
16163 return e.hasAttribute('prevent-tap') || re.test(e.tagName);
16164 }; // show and hide functions for Vue hidable mixin
16165
16166
16167 _this.show = _this.showExpansion;
16168 _this.hide = _this.hideExpansion;
16169 contentReady(_assertThisInitialized(_this), function () {
16170 _this._compile();
16171 });
16172 return _this;
16173 }
16174 /**
16175 * Compiles the list item.
16176 *
16177 * Various elements are allowed in the body of a list item:
16178 *
16179 * - div.left, div.right, and div.center are allowed as direct children
16180 * - if div.center is not defined, anything that isn't div.left, div.right or div.expandable-content will be put in a div.center
16181 * - if div.center is defined, anything that isn't div.left, div.right or div.expandable-content will be ignored
16182 * - if list item has expandable attribute:
16183 * - div.expandable-content is allowed as a direct child
16184 * - div.top is allowed as direct child
16185 * - if div.top is defined, anything that isn't div.expandable-content should be inside div.top - anything else will be ignored
16186 * - if div.right is not defined, a div.right will be created with a drop-down chevron
16187 *
16188 * See the tests for examples.
16189 */
16190
16191
16192 _createClass(ListItemElement, [{
16193 key: "_compile",
16194 value: function _compile() {
16195 autoStyle.prepare(this);
16196 this.classList.add(defaultClassName$a);
16197 var top, expandableContent;
16198 var topContent = [];
16199 Array.from(this.childNodes).forEach(function (node) {
16200 if (node.nodeType !== Node.ELEMENT_NODE) {
16201 topContent.push(node);
16202 } else if (node.classList.contains('top')) {
16203 top = node;
16204 } else if (node.classList.contains('expandable-content')) {
16205 expandableContent = node;
16206 } else {
16207 topContent.push(node);
16208 }
16209
16210 if (node.nodeName !== 'ONS-RIPPLE') {
16211 node.remove();
16212 }
16213 });
16214 topContent = top ? Array.from(top.childNodes) : topContent;
16215 var left, right, center;
16216 var centerContent = [];
16217 topContent.forEach(function (node) {
16218 if (node.nodeType !== Node.ELEMENT_NODE) {
16219 centerContent.push(node);
16220 } else if (node.classList.contains('left')) {
16221 left = node;
16222 } else if (node.classList.contains('right')) {
16223 right = node;
16224 } else if (node.classList.contains('center')) {
16225 center = node;
16226 } else {
16227 centerContent.push(node);
16228 }
16229 });
16230
16231 if (this.hasAttribute('expandable')) {
16232 this.classList.add('list-item--expandable');
16233
16234 if (!top) {
16235 top = document.createElement('div');
16236 top.classList.add('top');
16237 }
16238
16239 top.classList.add('list-item__top');
16240 this.appendChild(top);
16241 this._top = top;
16242
16243 if (expandableContent) {
16244 expandableContent.classList.add('list-item__expandable-content');
16245 this.appendChild(expandableContent);
16246 }
16247
16248 if (!right) {
16249 right = document.createElement('div');
16250 right.classList.add('list-item__right', 'right'); // We cannot use a pseudo-element for this chevron, as we cannot animate it using
16251 // JS. So, we make a chevron span instead.
16252
16253 var chevron = document.createElement('span');
16254 chevron.classList.add('list-item__expand-chevron');
16255 right.appendChild(chevron);
16256 } // The case where the list item should already start expanded.
16257 // Adding the class early stops the animation from running at startup.
16258
16259
16260 if (this.expanded) {
16261 this.classList.add('list-item--expanded');
16262 }
16263 } else {
16264 top = this;
16265 }
16266
16267 if (!center) {
16268 center = document.createElement('div');
16269 center.classList.add('center');
16270 centerContent.forEach(function (node) {
16271 return center.appendChild(node);
16272 });
16273 }
16274
16275 center.classList.add('list-item__center');
16276 top.appendChild(center);
16277
16278 if (left) {
16279 left.classList.add('list-item__left');
16280 top.appendChild(left);
16281 }
16282
16283 if (right) {
16284 right.classList.add('list-item__right');
16285 top.appendChild(right);
16286 }
16287
16288 util$4.updateRipple(this);
16289 ModifierUtil.initModifier(this, scheme$k);
16290 }
16291 /**
16292 * @method showExpansion
16293 * @signature showExpansion()
16294 * @description
16295 * [en]Show the expandable content if the element is expandable.[/en]
16296 * [ja][/ja]
16297 */
16298
16299 }, {
16300 key: "showExpansion",
16301 value: function showExpansion() {
16302 this.expanded = true;
16303 }
16304 /**
16305 * @method hideExpansion
16306 * @signature hideExpansion()
16307 * @description
16308 * [en]Hide the expandable content if the element expandable.[/en]
16309 * [ja][/ja]
16310 */
16311
16312 }, {
16313 key: "hideExpansion",
16314 value: function hideExpansion() {
16315 this.expanded = false;
16316 }
16317 }, {
16318 key: "toggleExpansion",
16319 value: function toggleExpansion() {
16320 this.expanded = !this.expanded;
16321 }
16322 }, {
16323 key: "_animateExpansion",
16324 value: function _animateExpansion() {
16325 var _this2 = this;
16326
16327 // Stops the animation from running in the case where the list item should start already expanded
16328 var expandedAtStartup = this.expanded && this.classList.contains('list-item--expanded');
16329
16330 if (!this.hasAttribute('expandable') || this._expanding || expandedAtStartup) {
16331 return;
16332 }
16333
16334 this._expanding = true;
16335
16336 var expandedCallback = function expandedCallback() {
16337 _this2._expanding = false;
16338
16339 if (_this2.expanded) {
16340 _this2.classList.add('list-item--expanded');
16341 } else {
16342 _this2.classList.remove('list-item--expanded');
16343 }
16344 };
16345
16346 var animator = this._animatorFactory.newAnimator();
16347
16348 if (animator._animateExpansion) {
16349 animator._animateExpansion(this, this.expanded, expandedCallback);
16350 } else {
16351 expandedCallback();
16352 }
16353 }
16354 }, {
16355 key: "_updateAnimatorFactory",
16356 value: function _updateAnimatorFactory() {
16357 return new AnimatorFactory({
16358 animators: _animatorDict$5,
16359 baseClass: ListItemAnimator,
16360 baseClassName: 'ListItemAnimator',
16361 defaultAnimation: this.getAttribute('animation') || 'default'
16362 });
16363 }
16364 }, {
16365 key: "expandableContent",
16366 get: function get() {
16367 return this.querySelector('.list-item__expandable-content');
16368 }
16369 }, {
16370 key: "expandChevron",
16371 get: function get() {
16372 return this.querySelector('.list-item__expand-chevron');
16373 }
16374 }, {
16375 key: "attributeChangedCallback",
16376 value: function attributeChangedCallback(name, last, current) {
16377 var _this3 = this;
16378
16379 switch (name) {
16380 case 'class':
16381 util$4.restoreClass(this, defaultClassName$a, scheme$k);
16382 break;
16383
16384 case 'modifier':
16385 ModifierUtil.onModifierChanged(last, current, this, scheme$k);
16386 break;
16387
16388 case 'ripple':
16389 util$4.updateRipple(this);
16390 break;
16391
16392 case 'animation':
16393 this._animatorFactory = this._updateAnimatorFactory();
16394 break;
16395
16396 case 'expanded':
16397 contentReady(this, function () {
16398 return _this3._animateExpansion();
16399 });
16400 break;
16401 }
16402 }
16403 }, {
16404 key: "connectedCallback",
16405 value: function connectedCallback() {
16406 var _this4 = this;
16407
16408 contentReady(this, function () {
16409 _this4._setupListeners(true);
16410
16411 _this4._originalBackgroundColor = _this4.style.backgroundColor;
16412 _this4.tapped = false;
16413 });
16414 }
16415 }, {
16416 key: "disconnectedCallback",
16417 value: function disconnectedCallback() {
16418 this._setupListeners(false);
16419 }
16420 }, {
16421 key: "_setupListeners",
16422 value: function _setupListeners(add) {
16423 var action = (add ? 'add' : 'remove') + 'EventListener';
16424 util$4[action](this, 'touchstart', this._onTouch, {
16425 passive: true
16426 });
16427 util$4[action](this, 'touchmove', this._onRelease, {
16428 passive: true
16429 });
16430 this[action]('touchcancel', this._onRelease);
16431 this[action]('touchend', this._onRelease);
16432 this[action]('touchleave', this._onRelease);
16433 this[action]('drag', this._onDrag);
16434 this[action]('mousedown', this._onTouch);
16435 this[action]('mouseup', this._onRelease);
16436 this[action]('mouseout', this._onRelease);
16437
16438 if (this._top) {
16439 this._top[action]('click', this._onClickTop.bind(this));
16440 }
16441 }
16442 }, {
16443 key: "_onClickTop",
16444 value: function _onClickTop() {
16445 if (!this._expanding) {
16446 this.toggleExpansion();
16447 this.dispatchEvent(new Event('expand'));
16448 this.dispatchEvent(new Event('expansion')); // expansion is deprecated but emit to avoid breaking user code
16449 }
16450 }
16451 }, {
16452 key: "_onDrag",
16453 value: function _onDrag(event) {
16454 var gesture = event.gesture; // Prevent vertical scrolling if the users pans left or right.
16455
16456 if (this.hasAttribute('lock-on-drag') && ['left', 'right'].indexOf(gesture.direction) > -1) {
16457 gesture.preventDefault();
16458 }
16459 }
16460 }, {
16461 key: "_onTouch",
16462 value: function _onTouch(e) {
16463 var _this5 = this;
16464
16465 if (this.tapped || this !== e.target && (this._shouldIgnoreTap(e.target) || util$4.findParent(e.target, this._shouldIgnoreTap, function (p) {
16466 return p === _this5;
16467 }))) {
16468 return; // Ignore tap
16469 }
16470
16471 this.tapped = true;
16472 var touchStyle = {
16473 transition: 'background-color 0.0s linear 0.02s, box-shadow 0.0s linear 0.02s'
16474 };
16475
16476 if (this.hasAttribute('tappable')) {
16477 if (this.style.backgroundColor) {
16478 this._originalBackgroundColor = this.style.backgroundColor;
16479 }
16480
16481 touchStyle.backgroundColor = this.getAttribute('tap-background-color') || '#d9d9d9';
16482 touchStyle.boxShadow = "0px -1px 0px 0px ".concat(touchStyle.backgroundColor);
16483 }
16484
16485 styler(this, touchStyle);
16486 }
16487 }, {
16488 key: "_onRelease",
16489 value: function _onRelease() {
16490 this.tapped = false;
16491 this.style.backgroundColor = this._originalBackgroundColor || '';
16492 styler.clear(this, 'transition boxShadow');
16493 }
16494 }], [{
16495 key: "observedAttributes",
16496 get: function get() {
16497 return ['modifier', 'class', 'ripple', 'animation', 'expanded'];
16498 }
16499 }]);
16500
16501 return ListItemElement;
16502 }(BaseElement);
16503 util$4.defineBooleanProperties(ListItemElement, ['expanded', 'expandable', 'tappable', 'lock-on-drag']);
16504 util$4.defineStringProperties(ListItemElement, ['animation', 'tap-background-color']);
16505 onsElements.ListItem = ListItemElement;
16506 customElements.define('ons-list-item', ListItemElement);
16507
16508 var defaultClassName$9 = 'list';
16509 var scheme$j = {
16510 '': 'list--*'
16511 };
16512 /**
16513 * @element ons-list
16514 * @category list
16515 * @modifier inset
16516 * [en]Inset list that doesn't cover the whole width of the parent.[/en]
16517 * [ja]親要素の画面いっぱいに広がらないリストを表示します。[/ja]
16518 * @modifier noborder
16519 * [en]A list with no borders at the top and bottom.[/en]
16520 * [ja]リストの上下のボーダーが無いリストを表示します。[/ja]
16521 * @description
16522 * [en]Component to define a list, and the container for ons-list-item(s).[/en]
16523 * [ja]リストを表現するためのコンポーネント。ons-list-itemのコンテナとして使用します。[/ja]
16524 * @seealso ons-list-item
16525 * [en]ons-list-item component[/en]
16526 * [ja]ons-list-itemコンポーネント[/ja]
16527 * @seealso ons-list-header
16528 * [en]ons-list-header component[/en]
16529 * [ja]ons-list-headerコンポーネント[/ja]
16530 * @seealso ons-lazy-repeat
16531 * [en]ons-lazy-repeat component[/en]
16532 * [ja]ons-lazy-repeatコンポーネント[/ja]
16533 * @codepen yxcCt
16534 * @tutorial vanilla/Reference/list
16535 * @example
16536 * <ons-list>
16537 * <ons-list-header>Header Text</ons-list-header>
16538 * <ons-list-item>Item</ons-list-item>
16539 * <ons-list-item>Item</ons-list-item>
16540 * </ons-list>
16541 */
16542
16543 var ListElement = /*#__PURE__*/function (_BaseElement) {
16544 _inherits(ListElement, _BaseElement);
16545
16546 var _super = _createSuper(ListElement);
16547
16548 /**
16549 * @attribute modifier
16550 * @type {String}
16551 * @description
16552 * [en]The appearance of the list.[/en]
16553 * [ja]リストの表現を指定します。[/ja]
16554 */
16555 function ListElement() {
16556 var _this;
16557
16558 _classCallCheck(this, ListElement);
16559
16560 _this = _super.call(this);
16561
16562 _this._compile();
16563
16564 return _this;
16565 }
16566
16567 _createClass(ListElement, [{
16568 key: "_compile",
16569 value: function _compile() {
16570 autoStyle.prepare(this);
16571 this.classList.add(defaultClassName$9);
16572 ModifierUtil.initModifier(this, scheme$j);
16573 }
16574 }, {
16575 key: "attributeChangedCallback",
16576 value: function attributeChangedCallback(name, last, current) {
16577 switch (name) {
16578 case 'class':
16579 util$4.restoreClass(this, defaultClassName$9, scheme$j);
16580 break;
16581
16582 case 'modifier':
16583 ModifierUtil.onModifierChanged(last, current, this, scheme$j);
16584 break;
16585 }
16586 }
16587 }], [{
16588 key: "observedAttributes",
16589 get: function get() {
16590 return ['modifier', 'class'];
16591 }
16592 }]);
16593
16594 return ListElement;
16595 }(BaseElement);
16596 onsElements.List = ListElement;
16597 customElements.define('ons-list', ListElement);
16598
16599 var INPUT_ATTRIBUTES$1 = ['autocapitalize', 'autocomplete', 'autocorrect', 'autofocus', 'disabled', 'inputmode', 'max', 'maxlength', 'min', 'minlength', 'name', 'pattern', 'placeholder', 'readonly', 'required', 'size', 'spellcheck', 'step', 'validator', 'value'];
16600
16601 var BaseInputElement = /*#__PURE__*/function (_BaseElement) {
16602 _inherits(BaseInputElement, _BaseElement);
16603
16604 var _super = _createSuper(BaseInputElement);
16605
16606 function BaseInputElement() {
16607 var _this;
16608
16609 _classCallCheck(this, BaseInputElement);
16610
16611 _this = _super.call(this);
16612
16613 if (_this.constructor === BaseInputElement) {
16614 util$4.throwAbstract();
16615 }
16616
16617 contentReady(_assertThisInitialized(_this), function () {
16618 return _this._compile();
16619 });
16620 _this._boundDelegateEvent = _this._delegateEvent.bind(_assertThisInitialized(_this));
16621 return _this;
16622 }
16623
16624 _createClass(BaseInputElement, [{
16625 key: "_update",
16626 value: function _update() {} // Optionally implemented
16627
16628 }, {
16629 key: "_scheme",
16630 get: function get() {
16631 // eslint-disable-line getter-return
16632 util$4.throwMember();
16633 }
16634 }, {
16635 key: "_template",
16636 get: function get() {
16637 // eslint-disable-line getter-return
16638 util$4.throwMember();
16639 }
16640 }, {
16641 key: "type",
16642 get: function get() {
16643 // eslint-disable-line getter-return
16644 util$4.throwMember();
16645 }
16646 }, {
16647 key: "_compile",
16648 value: function _compile() {
16649 autoStyle.prepare(this);
16650 this._defaultClassName && this.classList.add(this._defaultClassName);
16651
16652 if (this.children.length !== 0) {
16653 return;
16654 }
16655
16656 this.appendChild(util$4.createFragment(this._template));
16657
16658 this._setInputId();
16659
16660 this._updateBoundAttributes();
16661
16662 ModifierUtil.initModifier(this, this._scheme);
16663 }
16664 }, {
16665 key: "_updateBoundAttributes",
16666 value: function _updateBoundAttributes() {
16667 var _this2 = this;
16668
16669 INPUT_ATTRIBUTES$1.forEach(function (attr) {
16670 if (_this2.hasAttribute(attr)) {
16671 _this2._input.setAttribute(attr, _this2.getAttribute(attr));
16672 } else {
16673 _this2._input.removeAttribute(attr);
16674 }
16675 });
16676
16677 this._update();
16678 }
16679 }, {
16680 key: "_delegateEvent",
16681 value: function _delegateEvent(event) {
16682 var e = new CustomEvent(event.type, {
16683 bubbles: false,
16684 cancelable: true
16685 });
16686 return this.dispatchEvent(e);
16687 }
16688 }, {
16689 key: "_setInputId",
16690 value: function _setInputId() {
16691 if (this.hasAttribute('input-id')) {
16692 this._input.id = this.getAttribute('input-id');
16693 }
16694 }
16695 }, {
16696 key: "_defaultClassName",
16697 get: function get() {
16698 return '';
16699 }
16700 }, {
16701 key: "_input",
16702 get: function get() {
16703 return this.querySelector('input');
16704 }
16705 }, {
16706 key: "value",
16707 get: function get() {
16708 return this._input === null ? this.getAttribute('value') : this._input.value;
16709 },
16710 set: function set(val) {
16711 var _this3 = this;
16712
16713 contentReady(this, function () {
16714 if (val instanceof Date) {
16715 val = val.toISOString().substring(0, 10);
16716 }
16717
16718 _this3._input.value = val;
16719
16720 _this3._update();
16721 });
16722 }
16723 }, {
16724 key: "connectedCallback",
16725 value: function connectedCallback() {
16726 var _this4 = this;
16727
16728 contentReady(this, function () {
16729 _this4._input.addEventListener('focus', _this4._boundDelegateEvent);
16730
16731 _this4._input.addEventListener('blur', _this4._boundDelegateEvent);
16732 });
16733 }
16734 }, {
16735 key: "disconnectedCallback",
16736 value: function disconnectedCallback() {
16737 var _this5 = this;
16738
16739 contentReady(this, function () {
16740 _this5._input.removeEventListener('focus', _this5._boundDelegateEvent);
16741
16742 _this5._input.removeEventListener('blur', _this5._boundDelegateEvent);
16743 });
16744 }
16745 }, {
16746 key: "attributeChangedCallback",
16747 value: function attributeChangedCallback(name, last, current) {
16748 var _this6 = this;
16749
16750 switch (name) {
16751 case 'modifier':
16752 contentReady(this, function () {
16753 return ModifierUtil.onModifierChanged(last, current, _this6, _this6._scheme);
16754 });
16755 break;
16756
16757 case 'input-id':
16758 contentReady(this, function () {
16759 return _this6._setInputId();
16760 });
16761 break;
16762
16763 case 'class':
16764 util$4.restoreClass(this, this._defaultClassName, this._scheme);
16765 break;
16766 }
16767
16768 if (INPUT_ATTRIBUTES$1.indexOf(name) >= 0) {
16769 contentReady(this, function () {
16770 return _this6._updateBoundAttributes();
16771 });
16772 }
16773 }
16774 }, {
16775 key: "blur",
16776 value: function blur() {
16777 this._input.blur();
16778 }
16779 }, {
16780 key: "focus",
16781 value: function focus() {
16782 this._input.focus();
16783 }
16784 }], [{
16785 key: "observedAttributes",
16786 get: function get() {
16787 return ['modifier', 'input-id', 'class'].concat(INPUT_ATTRIBUTES$1);
16788 }
16789 }]);
16790
16791 return BaseInputElement;
16792 }(BaseElement);
16793 util$4.defineBooleanProperties(BaseInputElement, ['disabled']);
16794
16795 var scheme$i = {
16796 '.text-input': 'text-input--*',
16797 '.text-input__label': 'text-input--*__label'
16798 };
16799 /**
16800 * @element ons-input
16801 * @category form
16802 * @modifier material
16803 * [en]Displays a Material Design input.[/en]
16804 * [ja][/ja]
16805 * @modifier underbar
16806 * [en]Displays a horizontal line underneath a text input.[/en]
16807 * [ja][/ja]
16808 * @modifier transparent
16809 * [en]Displays a transparent input. Works for Material Design.[/en]
16810 * [ja][/ja]
16811 * @description
16812 * [en]
16813 * An input element. The `type` attribute can be used to change the input type. All text input types are supported.
16814 *
16815 * The component will automatically render as a Material Design input on Android devices.
16816 *
16817 * Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-input>` element.
16818 * [/en]
16819 * [ja][/ja]
16820 * @tutorial vanilla/Reference/input
16821 * @seealso ons-checkbox
16822 * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
16823 * [ja][/ja]
16824 * @seealso ons-radio
16825 * [en]The `<ons-radio>` element is used to display a radio button.[/en]
16826 * [ja][/ja]
16827 * @seealso ons-range
16828 * [en]The `<ons-range>` element is used to display a range slider.[/en]
16829 * [ja][/ja]
16830 * @seealso ons-switch
16831 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
16832 * [ja][/ja]
16833 * @seealso ons-select
16834 * [en]The `<ons-select>` element is used to display a select box.[/en]
16835 * [ja][/ja]
16836 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
16837 * @example
16838 * <ons-input placeholder="Username" float></ons-input>
16839 */
16840
16841 var InputElement = /*#__PURE__*/function (_BaseInputElement) {
16842 _inherits(InputElement, _BaseInputElement);
16843
16844 var _super = _createSuper(InputElement);
16845
16846 function InputElement() {
16847 var _this;
16848
16849 _classCallCheck(this, InputElement);
16850
16851 _this = _super.call(this);
16852 _this._boundOnInput = _this._update.bind(_assertThisInitialized(_this));
16853 _this._boundOnFocusin = _this._update.bind(_assertThisInitialized(_this));
16854 return _this;
16855 }
16856 /* Inherited props */
16857
16858
16859 _createClass(InputElement, [{
16860 key: "_update",
16861 value: function _update() {
16862 this._updateLabel();
16863
16864 this._updateLabelClass();
16865 }
16866 }, {
16867 key: "_scheme",
16868 get: function get() {
16869 return scheme$i;
16870 }
16871 }, {
16872 key: "_template",
16873 get: function get() {
16874 return "\n <input type=\"".concat(this.type, "\" class=\"text-input\">\n <span class=\"text-input__label\"></span>\n ");
16875 }
16876 }, {
16877 key: "type",
16878 get: function get() {
16879 var type = this.getAttribute('type');
16880 return ['checkbox', 'radio'].indexOf(type) < 0 && type || 'text';
16881 },
16882 set: function set(value) {
16883 this.setAttribute('type', value);
16884 }
16885 /* Own props */
16886
16887 }, {
16888 key: "_updateLabel",
16889 value: function _updateLabel() {
16890 var label = this.getAttribute('placeholder') || '';
16891
16892 if (typeof this._helper.textContent !== 'undefined') {
16893 this._helper.textContent = label;
16894 } else {
16895 this._helper.innerText = label;
16896 }
16897 }
16898 }, {
16899 key: "_updateLabelClass",
16900 value: function _updateLabelClass() {
16901 if (this.value === '') {
16902 this._helper.classList.remove('text-input--material__label--active');
16903 } else {
16904 this._helper.classList.add('text-input--material__label--active');
16905 }
16906 }
16907 }, {
16908 key: "_helper",
16909 get: function get() {
16910 return this.querySelector('span');
16911 }
16912 }, {
16913 key: "connectedCallback",
16914 value: function connectedCallback() {
16915 var _this2 = this;
16916
16917 _get(_getPrototypeOf(InputElement.prototype), "connectedCallback", this).call(this);
16918
16919 contentReady(this, function () {
16920 _this2._input.addEventListener('input', _this2._boundOnInput);
16921
16922 _this2._input.addEventListener('focusin', _this2._boundOnFocusin);
16923 });
16924 var type = this.getAttribute('type');
16925
16926 if (['checkbox', 'radio'].indexOf(type) >= 0) {
16927 util$4.warn("Warn: <ons-input type=\"".concat(type, "\"> is deprecated since v2.4.0. Use <ons-").concat(type, "> instead."));
16928 }
16929 }
16930 }, {
16931 key: "disconnectedCallback",
16932 value: function disconnectedCallback() {
16933 var _this3 = this;
16934
16935 _get(_getPrototypeOf(InputElement.prototype), "disconnectedCallback", this).call(this);
16936
16937 contentReady(this, function () {
16938 _this3._input.removeEventListener('input', _this3._boundOnInput);
16939
16940 _this3._input.removeEventListener('focusin', _this3._boundOnFocusin);
16941 });
16942 }
16943 }, {
16944 key: "attributeChangedCallback",
16945 value: function attributeChangedCallback(name, last, current) {
16946 var _this4 = this;
16947
16948 switch (name) {
16949 case 'type':
16950 contentReady(this, function () {
16951 return _this4._input.setAttribute('type', _this4.type);
16952 });
16953 break;
16954
16955 default:
16956 _get(_getPrototypeOf(InputElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
16957
16958 }
16959 }
16960 /**
16961 * @attribute placeholder
16962 * @type {String}
16963 * @description
16964 * [en]Placeholder text. In Material Design, this placeholder will be a floating label.[/en]
16965 * [ja][/ja]
16966 */
16967
16968 /**
16969 * @attribute float
16970 * @description
16971 * [en]If this attribute is present, the placeholder will be animated in Material Design.[/en]
16972 * [ja]この属性が設定された時、ラベルはアニメーションするようになります。[/ja]
16973 */
16974
16975 /**
16976 * @property float
16977 * @type {Boolean}
16978 * @description
16979 * [en]If this property is present, the placeholder will be animated in Material Design.[/en]
16980 * [ja]この属性が設定された時、ラベルはアニメーションするようになります。[/ja]
16981 */
16982
16983 /**
16984 * @attribute type
16985 * @type {String}
16986 * @description
16987 * [en]
16988 * Specify the input type. This is the same as the "type" attribute for normal inputs. It expects strict text types such as `text`, `password`, etc. For checkbox, radio button, select or range, please have a look at the corresponding elements.
16989 *
16990 * Please take a look at [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type) for an exhaustive list of possible values. Depending on the platform and browser version some of these might not work.
16991 * [/en]
16992 * [ja][/ja]
16993 */
16994
16995 /**
16996 * @attribute input-id
16997 * @type {String}
16998 * @description
16999 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
17000 * [ja][/ja]
17001 */
17002
17003 /**
17004 * @property value
17005 * @type {String}
17006 * @description
17007 * [en]The current value of the input.[/en]
17008 * [ja][/ja]
17009 */
17010
17011 /**
17012 * @property disabled
17013 * @type {Boolean}
17014 * @description
17015 * [en]Whether the input is disabled or not.[/en]
17016 * [ja]無効化されている場合に`true`。[/ja]
17017 */
17018
17019 /**
17020 * @method focus
17021 * @signature focus()
17022 * @description
17023 * [en]Focuses the input.[/en]
17024 * [ja][/ja]
17025 */
17026
17027 /**
17028 * @method blur
17029 * @signature blur()
17030 * @description
17031 * [en]Removes focus from the input.[/en]
17032 * [ja][/ja]
17033 */
17034
17035 }], [{
17036 key: "observedAttributes",
17037 get: function get() {
17038 return [].concat(_toConsumableArray(_get(_getPrototypeOf(InputElement), "observedAttributes", this)), ['type']);
17039 }
17040 }]);
17041
17042 return InputElement;
17043 }(BaseInputElement);
17044 util$4.defineBooleanProperties(InputElement, ['float']);
17045 onsElements.Input = InputElement;
17046 customElements.define('ons-input', InputElement);
17047
17048 var BaseCheckboxElement = /*#__PURE__*/function (_BaseInputElement) {
17049 _inherits(BaseCheckboxElement, _BaseInputElement);
17050
17051 var _super = _createSuper(BaseCheckboxElement);
17052
17053 function BaseCheckboxElement() {
17054 var _this;
17055
17056 _classCallCheck(this, BaseCheckboxElement);
17057
17058 _this = _super.call(this);
17059
17060 if (_this.constructor === BaseCheckboxElement) {
17061 util.throwAbstract();
17062 }
17063
17064 contentReady(_assertThisInitialized(_this), function () {
17065 _this.attributeChangedCallback('checked', null, _this.getAttribute('checked'));
17066 });
17067 return _this;
17068 }
17069 /* Inherited props */
17070
17071
17072 _createClass(BaseCheckboxElement, [{
17073 key: "_template",
17074 get: function get() {
17075 return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <span class=\"").concat(this._defaultClassName, "__checkmark\"></span>\n ");
17076 }
17077 /* Own props */
17078
17079 }, {
17080 key: "_helper",
17081 get: function get() {
17082 return this.querySelector('span');
17083 }
17084 }, {
17085 key: "checked",
17086 get: function get() {
17087 return this._input.checked;
17088 },
17089 set: function set(val) {
17090 var _this2 = this;
17091
17092 contentReady(this, function () {
17093 _this2._input.checked = val;
17094 });
17095 }
17096 }, {
17097 key: "attributeChangedCallback",
17098 value: function attributeChangedCallback(name, last, current) {
17099 switch (name) {
17100 case 'checked':
17101 this.checked = current !== null;
17102 break;
17103
17104 default:
17105 _get(_getPrototypeOf(BaseCheckboxElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
17106
17107 }
17108 }
17109 }], [{
17110 key: "observedAttributes",
17111 get: function get() {
17112 return [].concat(_toConsumableArray(_get(_getPrototypeOf(BaseCheckboxElement), "observedAttributes", this)), ['checked']);
17113 }
17114 }]);
17115
17116 return BaseCheckboxElement;
17117 }(BaseInputElement);
17118
17119 var scheme$h = {
17120 '.checkbox': 'checkbox--*',
17121 '.checkbox__input': 'checkbox--*__input',
17122 '.checkbox__checkmark': 'checkbox--*__checkmark'
17123 };
17124 /**
17125 * @element ons-checkbox
17126 * @category form
17127 * @modifier material
17128 * [en]Displays a Material Design checkbox.[/en]
17129 * [ja][/ja]
17130 * @modifier noborder
17131 * [en]iOS borderless checkbox.[/en]
17132 * [ja][/ja]
17133 * @description
17134 * [en]
17135 * A checkbox element. The component will automatically render as a Material Design checkbox on Android devices.
17136 *
17137 * Most attributes that can be used for a normal `<input type="checkbox">` element can also be used on the `<ons-checkbox>` element.
17138 * [/en]
17139 * [ja][/ja]
17140 * @tutorial vanilla/Reference/checkbox
17141 * @seealso ons-switch
17142 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
17143 * [ja][/ja]
17144 * @seealso ons-radio
17145 * [en]The `<ons-radio>` element is used to display a radio button.[/en]
17146 * [ja][/ja]
17147 * @seealso ons-input
17148 * [en]The `<ons-input>` element is used to display a text input.[/en]
17149 * [ja][/ja]
17150 * @seealso ons-search-input
17151 * [en]The `<ons-search-input>` element is used to display a search input.[/en]
17152 * [ja][/ja]
17153 * @seealso ons-range
17154 * [en]The `<ons-range>` element is used to display a range slider.[/en]
17155 * [ja][/ja]
17156 * @seealso ons-select
17157 * [en]The `<ons-select>` element is used to display a select box.[/en]
17158 * [ja][/ja]
17159 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
17160 * @example
17161 * <ons-checkbox checked></ons-checkbox>
17162 */
17163
17164 var CheckboxElement = /*#__PURE__*/function (_BaseCheckboxElement) {
17165 _inherits(CheckboxElement, _BaseCheckboxElement);
17166
17167 var _super = _createSuper(CheckboxElement);
17168
17169 function CheckboxElement() {
17170 _classCallCheck(this, CheckboxElement);
17171
17172 return _super.apply(this, arguments);
17173 }
17174
17175 _createClass(CheckboxElement, [{
17176 key: "_scheme",
17177 get: function get() {
17178 return scheme$h;
17179 }
17180 }, {
17181 key: "_defaultClassName",
17182 get: function get() {
17183 return 'checkbox';
17184 }
17185 }, {
17186 key: "type",
17187 get: function get() {
17188 return 'checkbox';
17189 }
17190 /**
17191 * @attribute input-id
17192 * @type {String}
17193 * @description
17194 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
17195 * [ja][/ja]
17196 */
17197
17198 /**
17199 * @property value
17200 * @type {String}
17201 * @description
17202 * [en]The current value of the checkbox.[/en]
17203 * [ja][/ja]
17204 */
17205
17206 /**
17207 * @property checked
17208 * @type {Boolean}
17209 * @description
17210 * [en]Whether the checkbox is checked or not.[/en]
17211 * [ja][/ja]
17212 */
17213
17214 /**
17215 * @property disabled
17216 * @type {Boolean}
17217 * @description
17218 * [en]Whether the checkbox is disabled or not.[/en]
17219 * [ja]無効化されている場合に`true`。[/ja]
17220 */
17221
17222 /**
17223 * @method focus
17224 * @signature focus()
17225 * @description
17226 * [en]Focuses the checkbox.[/en]
17227 * [ja][/ja]
17228 */
17229
17230 /**
17231 * @method blur
17232 * @signature blur()
17233 * @description
17234 * [en]Removes focus from the checkbox.[/en]
17235 * [ja][/ja]
17236 */
17237
17238 }]);
17239
17240 return CheckboxElement;
17241 }(BaseCheckboxElement);
17242 onsElements.Checkbox = CheckboxElement;
17243 customElements.define('ons-checkbox', CheckboxElement);
17244
17245 var scheme$g = {
17246 '.radio-button': 'radio-button--*',
17247 '.radio-button__input': 'radio-button--*__input',
17248 '.radio-button__checkmark': 'radio-button--*__checkmark'
17249 };
17250 /**
17251 * @element ons-radio
17252 * @category form
17253 * @modifier material
17254 * [en]Displays a Material Design radio button.[/en]
17255 * [ja][/ja]
17256 * @description
17257 * [en]
17258 * A radio button element. The component will automatically render as a Material Design radio button on Android devices.
17259 *
17260 * Most attributes that can be used for a normal `<input type="radio">` element can also be used on the `<ons-radio>` element.
17261 * [/en]
17262 * [ja][/ja]
17263 * @tutorial vanilla/Reference/radio
17264 * @seealso ons-select
17265 * [en]The `<ons-select>` element is used to display a select box.[/en]
17266 * [ja][/ja]
17267 * @seealso ons-checkbox
17268 * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
17269 * [ja][/ja]
17270 * @seealso ons-switch
17271 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
17272 * [ja][/ja]
17273 * @seealso ons-input
17274 * [en]The `<ons-input>` element is used to display a text input.[/en]
17275 * [ja][/ja]
17276 * @seealso ons-search-input
17277 * [en]The `<ons-search-input>` element is used to display a search input.[/en]
17278 * [ja][/ja]
17279 * @seealso ons-range
17280 * [en]The `<ons-range>` element is used to display a range slider.[/en]
17281 * [ja][/ja]
17282 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
17283 * @example
17284 * <ons-radio checked></ons-radio>
17285 */
17286
17287 var RadioElement = /*#__PURE__*/function (_BaseCheckboxElement) {
17288 _inherits(RadioElement, _BaseCheckboxElement);
17289
17290 var _super = _createSuper(RadioElement);
17291
17292 function RadioElement() {
17293 _classCallCheck(this, RadioElement);
17294
17295 return _super.apply(this, arguments);
17296 }
17297
17298 _createClass(RadioElement, [{
17299 key: "_scheme",
17300 get: function get() {
17301 return scheme$g;
17302 }
17303 }, {
17304 key: "_defaultClassName",
17305 get: function get() {
17306 return 'radio-button';
17307 }
17308 }, {
17309 key: "type",
17310 get: function get() {
17311 return 'radio';
17312 }
17313 /**
17314 * @attribute input-id
17315 * @type {String}
17316 * @description
17317 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
17318 * [ja][/ja]
17319 */
17320
17321 /**
17322 * @property value
17323 * @type {String}
17324 * @description
17325 * [en]The current value of the radio button.[/en]
17326 * [ja][/ja]
17327 */
17328
17329 /**
17330 * @property checked
17331 * @type {Boolean}
17332 * @description
17333 * [en]Whether the radio button is checked or not.[/en]
17334 * [ja][/ja]
17335 */
17336
17337 /**
17338 * @property disabled
17339 * @type {Boolean}
17340 * @description
17341 * [en]Whether the radio button is disabled or not.[/en]
17342 * [ja]無効化されている場合に`true`。[/ja]
17343 */
17344
17345 /**
17346 * @method focus
17347 * @signature focus()
17348 * @description
17349 * [en]Focuses the radio button.[/en]
17350 * [ja][/ja]
17351 */
17352
17353 /**
17354 * @method blur
17355 * @signature blur()
17356 * @description
17357 * [en]Removes focus from the radio button.[/en]
17358 * [ja][/ja]
17359 */
17360
17361 }]);
17362
17363 return RadioElement;
17364 }(BaseCheckboxElement);
17365 onsElements.Radio = RadioElement;
17366 customElements.define('ons-radio', RadioElement);
17367
17368 var scheme$f = {
17369 '.search-input': 'search-input--*'
17370 };
17371 /**
17372 * @element ons-search-input
17373 * @category form
17374 * @modifier material
17375 * [en]Displays a Material Design search input.[/en]
17376 * [ja][/ja]
17377 * @description
17378 * [en]
17379 * A search input element. The component will automatically render as a Material Design search input on Android devices.
17380 *
17381 * Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-search-input>` element.
17382 * [/en]
17383 * [ja][/ja]
17384 * @tutorial vanilla/Reference/search-input
17385 * @seealso ons-input
17386 * [en]The `<ons-input>` element is used to display a text input.[/en]
17387 * [ja][/ja]
17388 * @seealso ons-range
17389 * [en]The `<ons-range>` element is used to display a range slider.[/en]
17390 * [ja][/ja]
17391 * @seealso ons-switch
17392 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
17393 * [ja][/ja]
17394 * @seealso ons-select
17395 * [en]The `<ons-select>` element is used to display a select box.[/en]
17396 * [ja][/ja]
17397 * @seealso ons-checkbox
17398 * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
17399 * [ja][/ja]
17400 * @seealso ons-radio
17401 * [en]The `<ons-radio>` element is used to display a radio button.[/en]
17402 * [ja][/ja]
17403 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
17404 * @example
17405 * <ons-search-input placeholder="Search"></ons-search-input>
17406 */
17407
17408 var SearchInputElement = /*#__PURE__*/function (_BaseInputElement) {
17409 _inherits(SearchInputElement, _BaseInputElement);
17410
17411 var _super = _createSuper(SearchInputElement);
17412
17413 function SearchInputElement() {
17414 _classCallCheck(this, SearchInputElement);
17415
17416 return _super.apply(this, arguments);
17417 }
17418
17419 _createClass(SearchInputElement, [{
17420 key: "_scheme",
17421 get: function get() {
17422 return scheme$f;
17423 }
17424 }, {
17425 key: "_template",
17426 get: function get() {
17427 return "\n <input type=\"".concat(this.type, "\" class=\"search-input\">\n ");
17428 }
17429 }, {
17430 key: "type",
17431 get: function get() {
17432 return 'search';
17433 }
17434 /**
17435 * @attribute input-id
17436 * @type {String}
17437 * @description
17438 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
17439 * [ja][/ja]
17440 */
17441
17442 /**
17443 * @property value
17444 * @type {String}
17445 * @description
17446 * [en]The current value of the input.[/en]
17447 * [ja][/ja]
17448 */
17449
17450 /**
17451 * @property disabled
17452 * @type {Boolean}
17453 * @description
17454 * [en]Whether the input is disabled or not.[/en]
17455 * [ja]無効化されている場合に`true`。[/ja]
17456 */
17457
17458 /**
17459 * @method focus
17460 * @signature focus()
17461 * @description
17462 * [en]Focuses the input.[/en]
17463 * [ja][/ja]
17464 */
17465
17466 /**
17467 * @method blur
17468 * @signature blur()
17469 * @description
17470 * [en]Removes focus from the input.[/en]
17471 * [ja][/ja]
17472 */
17473
17474 }]);
17475
17476 return SearchInputElement;
17477 }(BaseInputElement);
17478 onsElements.SearchInput = SearchInputElement;
17479 customElements.define('ons-search-input', SearchInputElement);
17480
17481 var ModalAnimator = /*#__PURE__*/function (_BaseAnimator) {
17482 _inherits(ModalAnimator, _BaseAnimator);
17483
17484 var _super = _createSuper(ModalAnimator);
17485
17486 /**
17487 * @param {Object} options
17488 * @param {String} options.timing
17489 * @param {Number} options.duration
17490 * @param {Number} options.delay
17491 */
17492 function ModalAnimator() {
17493 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17494 _ref$timing = _ref.timing,
17495 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
17496 _ref$delay = _ref.delay,
17497 delay = _ref$delay === void 0 ? 0 : _ref$delay,
17498 _ref$duration = _ref.duration,
17499 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
17500
17501 _classCallCheck(this, ModalAnimator);
17502
17503 return _super.call(this, {
17504 timing: timing,
17505 delay: delay,
17506 duration: duration
17507 });
17508 }
17509 /**
17510 * @param {HTMLElement} modal
17511 * @param {Function} callback
17512 */
17513
17514
17515 _createClass(ModalAnimator, [{
17516 key: "show",
17517 value: function show(modal, callback) {
17518 callback();
17519 }
17520 /**
17521 * @param {HTMLElement} modal
17522 * @param {Function} callback
17523 */
17524
17525 }, {
17526 key: "hide",
17527 value: function hide(modal, callback) {
17528 callback();
17529 }
17530 }]);
17531
17532 return ModalAnimator;
17533 }(BaseAnimator);
17534
17535 /**
17536 * iOS style animator for dialog.
17537 */
17538
17539 var FadeModalAnimator = /*#__PURE__*/function (_ModalAnimator) {
17540 _inherits(FadeModalAnimator, _ModalAnimator);
17541
17542 var _super = _createSuper(FadeModalAnimator);
17543
17544 function FadeModalAnimator() {
17545 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17546 _ref$timing = _ref.timing,
17547 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
17548 _ref$delay = _ref.delay,
17549 delay = _ref$delay === void 0 ? 0 : _ref$delay,
17550 _ref$duration = _ref.duration,
17551 duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
17552
17553 _classCallCheck(this, FadeModalAnimator);
17554
17555 return _super.call(this, {
17556 timing: timing,
17557 delay: delay,
17558 duration: duration
17559 });
17560 }
17561 /**
17562 * @param {HTMLElement} modal
17563 * @param {Function} callback
17564 */
17565
17566
17567 _createClass(FadeModalAnimator, [{
17568 key: "show",
17569 value: function show(modal, callback) {
17570 callback = callback ? callback : function () {};
17571 Animit(modal, this.def).default({
17572 opacity: 0
17573 }, {
17574 opacity: 1
17575 }).queue(function (done) {
17576 callback();
17577 done();
17578 }).play();
17579 }
17580 /**
17581 * @param {HTMLElement} modal
17582 * @param {Function} callback
17583 */
17584
17585 }, {
17586 key: "hide",
17587 value: function hide(modal, callback) {
17588 callback = callback ? callback : function () {};
17589 Animit(modal, this.def).default({
17590 opacity: 1
17591 }, {
17592 opacity: 0
17593 }).queue(function (done) {
17594 callback();
17595 done();
17596 }).play();
17597 }
17598 }]);
17599
17600 return FadeModalAnimator;
17601 }(ModalAnimator);
17602
17603 /**
17604 * iOS style animator for modal.
17605 */
17606
17607 var LiftModalAnimator = /*#__PURE__*/function (_ModalAnimator) {
17608 _inherits(LiftModalAnimator, _ModalAnimator);
17609
17610 var _super = _createSuper(LiftModalAnimator);
17611
17612 function LiftModalAnimator() {
17613 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17614 _ref$timing = _ref.timing,
17615 timing = _ref$timing === void 0 ? 'cubic-bezier( .1, .7, .1, 1)' : _ref$timing,
17616 _ref$delay = _ref.delay,
17617 delay = _ref$delay === void 0 ? 0 : _ref$delay,
17618 _ref$duration = _ref.duration,
17619 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
17620
17621 _classCallCheck(this, LiftModalAnimator);
17622
17623 return _super.call(this, {
17624 timing: timing,
17625 delay: delay,
17626 duration: duration
17627 });
17628 }
17629 /**
17630 * @param {HTMLElement} modal
17631 * @param {Function} callback
17632 */
17633
17634
17635 _createClass(LiftModalAnimator, [{
17636 key: "show",
17637 value: function show(modal, callback) {
17638 callback = callback ? callback : function () {};
17639 Animit(modal, this.def).default({
17640 transform: 'translate3d(0, 100%, 0)'
17641 }, {
17642 transform: 'translate3d(0, 0, 0)'
17643 }).queue(function (done) {
17644 callback();
17645 done();
17646 }).play();
17647 }
17648 /**
17649 * @param {HTMLElement} modal
17650 * @param {Function} callback
17651 */
17652
17653 }, {
17654 key: "hide",
17655 value: function hide(modal, callback) {
17656 callback = callback ? callback : function () {};
17657 Animit(modal, this.def).default({
17658 transform: 'translate3d(0, 0, 0)'
17659 }, {
17660 transform: 'translate3d(0, 100%, 0)'
17661 }).queue(function (done) {
17662 callback();
17663 done();
17664 }).play();
17665 }
17666 }]);
17667
17668 return LiftModalAnimator;
17669 }(ModalAnimator);
17670
17671 var scheme$e = {
17672 '': 'modal--*',
17673 'modal__content': 'modal--*__content'
17674 };
17675 var defaultClassName$8 = 'modal';
17676 var _animatorDict$4 = {
17677 'default': ModalAnimator,
17678 'fade': FadeModalAnimator,
17679 'lift': LiftModalAnimator,
17680 'none': ModalAnimator
17681 };
17682 /**
17683 * @element ons-modal
17684 * @category dialog
17685 * @description
17686 * [en]
17687 * Modal component that masks current screen. Underlying components are not subject to any events while the modal component is shown.
17688 *
17689 * This component can be used to block user input while some operation is running or to show some information to the user.
17690 * [/en]
17691 * [ja]
17692 * 画面全体をマスクするモーダル用コンポーネントです。下側にあるコンポーネントは、
17693 * モーダルが表示されている間はイベント通知が行われません。
17694 * [/ja]
17695 * @seealso ons-dialog
17696 * [en]The `<ons-dialog>` component can be used to create a modal dialog.[/en]
17697 * [ja][/ja]
17698 * @codepen devIg
17699 * @tutorial vanilla/reference/modal
17700 * @example
17701 * <ons-modal id="modal">
17702 * Modal content
17703 * </ons-modal>
17704 * <script>
17705 * var modal = document.getElementById('modal');
17706 * modal.show();
17707 * </script>
17708 */
17709
17710 var ModalElement = /*#__PURE__*/function (_BaseDialogElement) {
17711 _inherits(ModalElement, _BaseDialogElement);
17712
17713 var _super = _createSuper(ModalElement);
17714
17715 /**
17716 * @event preshow
17717 * @description
17718 * [en]Fired just before the modal is displayed.[/en]
17719 * [ja]モーダルが表示される直前に発火します。[/ja]
17720 * @param {Object} event [en]Event object.[/en]
17721 * @param {Object} event.modal
17722 * [en]Component object.[/en]
17723 * [ja]コンポーネントのオブジェクト。[/ja]
17724 * @param {Function} event.cancel
17725 * [en]Execute this function to stop the modal from being shown.[/en]
17726 * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
17727 */
17728
17729 /**
17730 * @event postshow
17731 * @description
17732 * [en]Fired just after the modal is displayed.[/en]
17733 * [ja]モーダルが表示された直後に発火します。[/ja]
17734 * @param {Object} event [en]Event object.[/en]
17735 * @param {Object} event.modal
17736 * [en]Component object.[/en]
17737 * [ja]コンポーネントのオブジェクト。[/ja]
17738 */
17739
17740 /**
17741 * @event prehide
17742 * @description
17743 * [en]Fired just before the modal is hidden.[/en]
17744 * [ja]モーダルが隠れる直前に発火します。[/ja]
17745 * @param {Object} event [en]Event object.[/en]
17746 * @param {Object} event.modal
17747 * [en]Component object.[/en]
17748 * [ja]コンポーネントのオブジェクト。[/ja]
17749 * @param {Function} event.cancel
17750 * [en]Execute this function to stop the modal from being hidden.[/en]
17751 * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
17752 */
17753
17754 /**
17755 * @event posthide
17756 * @description
17757 * [en]Fired just after the modal is hidden.[/en]
17758 * [ja]モーダルが隠れた後に発火します。[/ja]
17759 * @param {Object} event [en]Event object.[/en]
17760 * @param {Object} event.modal
17761 * [en]Component object.[/en]
17762 * [ja]コンポーネントのオブジェクト。[/ja]
17763 */
17764
17765 /**
17766 * @attribute animation
17767 * @type {String}
17768 * @default default
17769 * @description
17770 * [en]The animation used when showing and hiding the modal. Can be either `"none"`, `"fade"` or `"lift"`.[/en]
17771 * [ja]モーダルを表示する際のアニメーション名を指定します。"none"もしくは"fade","lift"を指定できます。[/ja]
17772 */
17773
17774 /**
17775 * @attribute animation-options
17776 * @type {Expression}
17777 * @description
17778 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
17779 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. <code>{duration: 0.2, delay: 1, timing: 'ease-in'}</code>[/ja]
17780 */
17781
17782 /**
17783 * @property animationOptions
17784 * @type {Object}
17785 * @description
17786 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
17787 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
17788 */
17789
17790 /**
17791 * @attribute visible
17792 * @type {Boolean}
17793 * @description
17794 * [en]Whether the modal is visible or not.[/en]
17795 * [ja]要素が見える場合に`true`。[/ja]
17796 */
17797 function ModalElement() {
17798 var _this;
17799
17800 _classCallCheck(this, ModalElement);
17801
17802 _this = _super.call(this);
17803
17804 _this._defaultDBB = function () {
17805 return undefined;
17806 };
17807
17808 contentReady(_assertThisInitialized(_this), function () {
17809 return _this._compile();
17810 });
17811 return _this;
17812 }
17813
17814 _createClass(ModalElement, [{
17815 key: "_scheme",
17816 get: function get() {
17817 return scheme$e;
17818 }
17819 }, {
17820 key: "_updateAnimatorFactory",
17821 value: function _updateAnimatorFactory() {
17822 return new AnimatorFactory({
17823 animators: _animatorDict$4,
17824 baseClass: ModalAnimator,
17825 baseClassName: 'ModalAnimator',
17826 defaultAnimation: this.getAttribute('animation')
17827 });
17828 }
17829 /**
17830 * @property onDeviceBackButton
17831 * @type {Object}
17832 * @description
17833 * [en]Back-button handler.[/en]
17834 * [ja]バックボタンハンドラ。[/ja]
17835 */
17836
17837 }, {
17838 key: "_compile",
17839 value: function _compile() {
17840 this.style.display = 'none';
17841 this.style.zIndex = 10001;
17842 this.classList.add(defaultClassName$8);
17843
17844 if (!util$4.findChild(this, '.modal__content')) {
17845 var content = document.createElement('div');
17846 content.classList.add('modal__content');
17847
17848 while (this.childNodes[0]) {
17849 var node = this.childNodes[0];
17850 this.removeChild(node);
17851 content.insertBefore(node, null);
17852 }
17853
17854 this.appendChild(content);
17855 }
17856
17857 ModifierUtil.initModifier(this, this._scheme);
17858 }
17859 }, {
17860 key: "_toggleStyle",
17861 value: function _toggleStyle(shouldShow) {
17862 this.style.display = shouldShow ? 'table' : 'none';
17863 }
17864 }, {
17865 key: "connectedCallback",
17866 value: function connectedCallback() {
17867 _get(_getPrototypeOf(ModalElement.prototype), "connectedCallback", this).call(this);
17868 }
17869 }, {
17870 key: "disconnectedCallback",
17871 value: function disconnectedCallback() {
17872 _get(_getPrototypeOf(ModalElement.prototype), "disconnectedCallback", this).call(this);
17873 }
17874 /**
17875 * @property visible
17876 * @type {Boolean}
17877 * @description
17878 * [en]Whether the element is visible or not.[/en]
17879 * [ja]要素が見える場合に`true`。[/ja]
17880 */
17881
17882 /**
17883 * @method show
17884 * @signature show([options])
17885 * @param {Object} [options]
17886 * [en]Parameter object.[/en]
17887 * [ja]オプションを指定するオブジェクト。[/ja]
17888 * @param {String} [options.animation]
17889 * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
17890 * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
17891 * @param {String} [options.animationOptions]
17892 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
17893 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
17894 * @param {Function} [options.callback]
17895 * [en]This function is called after the modal has been revealed.[/en]
17896 * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
17897 * @description
17898 * [en]Show modal.[/en]
17899 * [ja]モーダルを表示します。[/ja]
17900 * @return {Promise}
17901 * [en]Resolves to the displayed element[/en]
17902 * [ja][/ja]
17903 */
17904
17905 /**
17906 * @method toggle
17907 * @signature toggle([options])
17908 * @param {Object} [options]
17909 * [en]Parameter object.[/en]
17910 * [ja]オプションを指定するオブジェクト。[/ja]
17911 * @param {String} [options.animation]
17912 * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
17913 * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
17914 * @param {String} [options.animationOptions]
17915 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
17916 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
17917 * @param {Function} [options.callback]
17918 * [en]This function is called after the modal has been revealed.[/en]
17919 * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
17920 * @description
17921 * [en]Toggle modal visibility.[/en]
17922 * [ja]モーダルの表示を切り替えます。[/ja]
17923 */
17924
17925 /**
17926 * @method hide
17927 * @signature hide([options])
17928 * @param {Object} [options]
17929 * [en]Parameter object.[/en]
17930 * [ja]オプションを指定するオブジェクト。[/ja]
17931 * @param {String} [options.animation]
17932 * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
17933 * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
17934 * @param {String} [options.animationOptions]
17935 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
17936 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
17937 * @param {Function} [options.callback]
17938 * [en]This function is called after the modal has been revealed.[/en]
17939 * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
17940 * @description
17941 * [en]Hide modal.[/en]
17942 * [ja]モーダルを非表示にします。[/ja]
17943 * @return {Promise}
17944 * [en]Resolves to the hidden element[/en]
17945 * [ja][/ja]
17946 */
17947
17948 }, {
17949 key: "attributeChangedCallback",
17950 value: function attributeChangedCallback(name, last, current) {
17951 if (name === 'class') {
17952 util$4.restoreClass(this, defaultClassName$8, scheme$e);
17953 } else {
17954 _get(_getPrototypeOf(ModalElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
17955 }
17956 }
17957 /**
17958 * @param {String} name
17959 * @param {Function} Animator
17960 */
17961
17962 }], [{
17963 key: "observedAttributes",
17964 get: function get() {
17965 return [].concat(_toConsumableArray(_get(_getPrototypeOf(ModalElement), "observedAttributes", this)), ['class']);
17966 }
17967 }, {
17968 key: "registerAnimator",
17969 value: function registerAnimator(name, Animator) {
17970 if (!(Animator.prototype instanceof ModalAnimator)) {
17971 util$4.throwAnimator('Modal');
17972 }
17973
17974 _animatorDict$4[name] = Animator;
17975 }
17976 }, {
17977 key: "animators",
17978 get: function get() {
17979 return _animatorDict$4;
17980 }
17981 }, {
17982 key: "ModalAnimator",
17983 get: function get() {
17984 return ModalAnimator;
17985 }
17986 }]);
17987
17988 return ModalElement;
17989 }(BaseDialogElement);
17990 onsElements.Modal = ModalElement;
17991 customElements.define('ons-modal', ModalElement);
17992
17993 var widthToPx = function widthToPx(width) {
17994 var _ref = [parseInt(width, 10), /px/.test(width)],
17995 value = _ref[0],
17996 px = _ref[1];
17997 return px ? value : Math.round(document.body.offsetWidth * value / 100);
17998 };
17999
18000 var SwipeReveal = /*#__PURE__*/function () {
18001 function SwipeReveal(params) {
18002 var _this = this;
18003
18004 _classCallCheck(this, SwipeReveal);
18005
18006 'element ignoreSwipe isInitialState onDragCallback swipeMax swipeMin swipeMid'.split(/\s+/).forEach(function (key) {
18007 return _this[key] = params[key];
18008 });
18009 this.elementHandler = params.elementHandler || params.element;
18010
18011 this.getThreshold = params.getThreshold || function () {
18012 return .5;
18013 };
18014
18015 this.getSide = params.getSide || function () {
18016 return 'left';
18017 };
18018
18019 this.handleGesture = this.handleGesture.bind(this);
18020 this._shouldFixScroll = util$4.globals.actualMobileOS === 'ios';
18021 }
18022
18023 _createClass(SwipeReveal, [{
18024 key: "update",
18025 value: function update() {
18026 var swipeable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.element.hasAttribute('swipeable');
18027
18028 if (!this.gestureDetector) {
18029 this.gestureDetector = new GestureDetector(this.elementHandler, {
18030 dragMinDistance: 1,
18031 passive: !this._shouldFixScroll
18032 });
18033 }
18034
18035 var action = swipeable ? 'on' : 'off';
18036 this.gestureDetector[action]('drag dragstart dragend', this.handleGesture);
18037 }
18038 }, {
18039 key: "handleGesture",
18040 value: function handleGesture(e) {
18041 if (e.gesture) {
18042 if (e.type === 'dragstart') {
18043 this.onDragStart(e);
18044 } else if (!this._ignoreDrag) {
18045 e.type === 'dragend' ? this.onDragEnd(e) : this.onDrag(e);
18046 }
18047 }
18048 }
18049 }, {
18050 key: "onDragStart",
18051 value: function onDragStart(event) {
18052 var _this2 = this;
18053
18054 var getDistance = function getDistance() {
18055 return _this2.getSide() === 'left' ? event.gesture.center.clientX : window.innerWidth - event.gesture.center.clientX;
18056 };
18057
18058 this._ignoreDrag = event.consumed || !util$4.isValidGesture(event) || this.ignoreSwipe(event, getDistance());
18059
18060 if (!this._ignoreDrag) {
18061 event.consume && event.consume();
18062 event.consumed = true;
18063 this._width = widthToPx(this.element.style.width || '100%');
18064 this._startDistance = this._distance = !(this.isInitialState instanceof Function) || this.isInitialState() ? 0 : this._width;
18065 util$4.iosPreventScroll(this.gestureDetector);
18066 }
18067 }
18068 }, {
18069 key: "onDrag",
18070 value: function onDrag(event) {
18071 event.stopPropagation();
18072 var delta = this.getSide() === 'left' ? event.gesture.deltaX : -event.gesture.deltaX;
18073 var distance = Math.max(0, Math.min(this._width, this._startDistance + delta));
18074
18075 if (distance !== this._distance) {
18076 this._distance = distance;
18077 this.swipeMid(this._distance, this._width);
18078 }
18079 }
18080 }, {
18081 key: "onDragEnd",
18082 value: function onDragEnd(event) {
18083 event.stopPropagation();
18084 var direction = event.gesture.interimDirection;
18085 var isSwipeMax = this.getSide() !== direction && this._distance > this._width * this.getThreshold();
18086 isSwipeMax ? this.swipeMax() : this.swipeMin();
18087 }
18088 }, {
18089 key: "dispose",
18090 value: function dispose() {
18091 this.gestureDetector && this.gestureDetector.dispose();
18092 this.gestureDetector = this.element = this.elementHandler = null;
18093 }
18094 }]);
18095
18096 return SwipeReveal;
18097 }();
18098
18099 var NavigatorAnimator = /*#__PURE__*/function (_BaseAnimator) {
18100 _inherits(NavigatorAnimator, _BaseAnimator);
18101
18102 var _super = _createSuper(NavigatorAnimator);
18103
18104 /**
18105 * @param {Object} options
18106 * @param {String} options.timing
18107 * @param {Number} options.duration
18108 * @param {Number} options.delay
18109 */
18110 function NavigatorAnimator(options) {
18111 _classCallCheck(this, NavigatorAnimator);
18112
18113 options = util$4.extend({
18114 timing: 'linear',
18115 duration: '0.4',
18116 delay: '0'
18117 }, options || {});
18118 return _super.call(this, options);
18119 }
18120
18121 _createClass(NavigatorAnimator, [{
18122 key: "push",
18123 value: function push(enterPage, leavePage, callback) {
18124 callback();
18125 }
18126 }, {
18127 key: "pop",
18128 value: function pop(enterPage, leavePage, callback) {
18129 callback();
18130 }
18131 }, {
18132 key: "block",
18133 value: function block(page) {
18134 var blocker = util$4.createElement("\n <div style=\"position: absolute; background-color: transparent; width: 100%; height: 100%; z-index: 100000\"></div>\n ");
18135 page.parentNode.appendChild(blocker);
18136 return function () {
18137 return blocker.remove();
18138 };
18139 }
18140 }]);
18141
18142 return NavigatorAnimator;
18143 }(BaseAnimator);
18144
18145 var _excluded$1 = ["durationRestore", "durationSwipe", "timingSwipe"];
18146 /**
18147 * Abstract swipe animator for iOS navigator transition.
18148 */
18149
18150 var IOSSwipeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
18151 _inherits(IOSSwipeNavigatorAnimator, _NavigatorAnimator);
18152
18153 var _super = _createSuper(IOSSwipeNavigatorAnimator);
18154
18155 function IOSSwipeNavigatorAnimator() {
18156 var _this;
18157
18158 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
18159 _ref$durationRestore = _ref.durationRestore,
18160 durationRestore = _ref$durationRestore === void 0 ? 0.1 : _ref$durationRestore,
18161 _ref$durationSwipe = _ref.durationSwipe,
18162 durationSwipe = _ref$durationSwipe === void 0 ? 0.15 : _ref$durationSwipe,
18163 _ref$timingSwipe = _ref.timingSwipe,
18164 timingSwipe = _ref$timingSwipe === void 0 ? 'linear' : _ref$timingSwipe,
18165 rest = _objectWithoutProperties(_ref, _excluded$1);
18166
18167 _classCallCheck(this, IOSSwipeNavigatorAnimator);
18168
18169 _this = _super.call(this, _objectSpread2({}, rest));
18170
18171 if (_this.constructor === IOSSwipeNavigatorAnimator) {
18172 util$4.throwAbstract();
18173 }
18174
18175 _this.durationRestore = durationRestore;
18176 _this.durationSwipe = durationSwipe;
18177 _this.timingSwipe = timingSwipe;
18178 _this.optSwipe = {
18179 timing: timingSwipe,
18180 duration: durationSwipe
18181 };
18182 _this.optRestore = {
18183 timing: timingSwipe,
18184 duration: durationRestore
18185 };
18186 _this.swipeShadow = util$4.createElement("<div style=\"position: absolute; height: 100%; width: 12px; right: 100%; top: 0; bottom: 0; z-index: -1;" + "background: linear-gradient(to right, transparent 0, rgba(0,0,0,.04) 40%, rgba(0,0,0,.12) 80%, rgba(0,0,0,.16) 100%);\"></div>");
18187 _this.isDragStart = true;
18188 return _this;
18189 }
18190
18191 _createClass(IOSSwipeNavigatorAnimator, [{
18192 key: "_decompose",
18193 value: function _decompose() {
18194 util$4.throwMember();
18195 }
18196 }, {
18197 key: "_shouldAnimateToolbar",
18198 value: function _shouldAnimateToolbar() {
18199 util$4.throwMember();
18200 }
18201 }, {
18202 key: "_calculateDelta",
18203 value: function _calculateDelta() {
18204 util$4.throwMember();
18205 }
18206 }, {
18207 key: "_dragStartSetup",
18208 value: function _dragStartSetup(enterPage, leavePage) {
18209 this.isDragStart = false; // Avoid content clicks
18210
18211 this.unblock = _get(_getPrototypeOf(IOSSwipeNavigatorAnimator.prototype), "block", this).call(this, leavePage); // Mask
18212
18213 enterPage.parentElement.insertBefore(this.backgroundMask, enterPage); // Decomposition
18214
18215 this.target = {
18216 enter: util$4.findToolbarPage(enterPage) || enterPage,
18217 leave: util$4.findToolbarPage(leavePage) || leavePage
18218 };
18219 this.decomp = {
18220 enter: this._decompose(this.target.enter),
18221 leave: this._decompose(this.target.leave)
18222 }; // Animation values
18223
18224 this.delta = this._calculateDelta(leavePage, this.decomp.leave);
18225 this.shouldAnimateToolbar = this._shouldAnimateToolbar(this.target.enter, this.target.leave); // Shadow && styles
18226
18227 if (this.shouldAnimateToolbar) {
18228 this.swipeShadow.style.top = this.decomp.leave.toolbar.offsetHeight + 'px';
18229 this.target.leave.appendChild(this.swipeShadow);
18230
18231 this._saveStyle(this.target.enter, this.target.leave);
18232 } else {
18233 leavePage.appendChild(this.swipeShadow);
18234
18235 this._saveStyle(enterPage, leavePage);
18236 }
18237
18238 leavePage.classList.add('overflow-visible');
18239 this.overflowElement = leavePage;
18240 this.decomp.leave.content.classList.add('content-swiping');
18241 }
18242 }, {
18243 key: "translate",
18244 value: function translate(distance, maxWidth, enterPage, leavePage) {
18245 this.isSwiping = true;
18246
18247 if (enterPage.style.display === 'none') {
18248 enterPage.style.display = '';
18249 }
18250
18251 if (this.isDragStart) {
18252 this.maxWidth = maxWidth;
18253
18254 this._dragStartSetup(enterPage, leavePage);
18255 }
18256
18257 var swipeRatio = (distance - maxWidth) / maxWidth;
18258
18259 if (this.shouldAnimateToolbar) {
18260 Animit.runAll(
18261 /* Enter page */
18262 Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
18263 transform: "translate3d(".concat(swipeRatio * 25, "%, 0, 0)"),
18264 opacity: 1 + swipeRatio * 10 / 100 // 0.9 -> 1
18265
18266 }), Animit(this.decomp.enter.toolbarCenter).queue({
18267 transform: "translate3d(".concat(this.delta.title * swipeRatio, "px, 0, 0)"),
18268 opacity: 1 + swipeRatio // 0 -> 1
18269
18270 }), Animit(this.decomp.enter.backButtonLabel).queue({
18271 opacity: 1 + swipeRatio * 10 / 100,
18272 // 0.9 -> 1
18273 transform: "translate3d(".concat(this.delta.label * swipeRatio, "px, 0, 0)")
18274 }), Animit(this.decomp.enter.other).queue({
18275 opacity: 1 + swipeRatio // 0 -> 1
18276
18277 }),
18278 /* Leave page */
18279 Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background, this.swipeShadow]).queue({
18280 transform: "translate3d(".concat(distance, "px, 0, 0)")
18281 }), Animit(this.decomp.leave.toolbar).queue({
18282 opacity: -1 * swipeRatio // 1 -> 0
18283
18284 }), Animit(this.decomp.leave.toolbarCenter).queue({
18285 transform: "translate3d(".concat((1 + swipeRatio) * 125, "%, 0, 0)")
18286 }), Animit(this.decomp.leave.backButtonLabel).queue({
18287 opacity: -1 * swipeRatio,
18288 // 1 -> 0
18289 transform: "translate3d(".concat(this.delta.title * (1 + swipeRatio), "px, 0, 0)")
18290 }),
18291 /* Other */
18292 Animit(this.swipeShadow).queue({
18293 opacity: -1 * swipeRatio // 1 -> 0
18294
18295 }));
18296 } else {
18297 Animit.runAll(Animit(leavePage).queue({
18298 transform: "translate3d(".concat(distance, "px, 0, 0)")
18299 }), Animit(enterPage).queue({
18300 transform: "translate3d(".concat(swipeRatio * 25, "%, 0, 0)"),
18301 opacity: 1 + swipeRatio * 10 / 100 // 0.9 -> 1
18302
18303 }), Animit(this.swipeShadow).queue({
18304 opacity: -1 * swipeRatio // 1 -> 0
18305
18306 }));
18307 }
18308 }
18309 }, {
18310 key: "restore",
18311 value: function restore(enterPage, leavePage, callback) {
18312 var _this2 = this;
18313
18314 if (this.isDragStart) {
18315 return;
18316 }
18317
18318 if (this.shouldAnimateToolbar) {
18319 Animit.runAll(
18320 /* Enter page */
18321 Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
18322 transform: 'translate3d(-25%, 0, 0)',
18323 opacity: 0.9
18324 }, this.optRestore), Animit(this.decomp.enter.toolbarCenter).queue({
18325 transform: "translate3d(-".concat(this.delta.title, "px, 0, 0)"),
18326 transition: "opacity ".concat(this.durationRestore, "s linear, transform ").concat(this.durationRestore, "s ").concat(this.timingSwipe),
18327 opacity: 0
18328 }), Animit(this.decomp.enter.backButtonLabel).queue({
18329 transform: "translate3d(-".concat(this.delta.label, "px, 0, 0)")
18330 }, this.optRestore), Animit(this.decomp.enter.other).queue({
18331 opacity: 0
18332 }, this.optRestore),
18333 /* Leave page */
18334 Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background, this.swipeShadow]).queue({
18335 transform: "translate3d(0, 0, 0)"
18336 }, this.optRestore), Animit(this.decomp.leave.toolbar).queue({
18337 opacity: 1
18338 }, this.optRestore), Animit(this.decomp.leave.toolbarCenter).queue({
18339 transform: "translate3d(0, 0, 0)"
18340 }, this.optRestore), Animit(this.decomp.leave.backButtonLabel).queue({
18341 opacity: 1,
18342 transform: "translate3d(0, 0, 0)",
18343 transition: "opacity ".concat(this.durationRestore, "s linear, transform ").concat(this.durationRestore, "s ").concat(this.timingSwipe)
18344 }),
18345 /* Other */
18346 Animit(this.swipeShadow).queue({
18347 opacity: 0
18348 }, this.optRestore).queue(function (done) {
18349 _this2._reset(_this2.target.enter, _this2.target.leave);
18350
18351 enterPage.style.display = 'none';
18352 callback && callback();
18353 done();
18354 }));
18355 } else {
18356 Animit.runAll(Animit(enterPage).queue({
18357 transform: 'translate3D(-25%, 0, 0)',
18358 opacity: 0.9
18359 }, this.optRestore), Animit(leavePage).queue({
18360 transform: 'translate3D(0, 0, 0)'
18361 }, this.optRestore).queue(function (done) {
18362 _this2._reset(enterPage, leavePage);
18363
18364 enterPage.style.display = 'none';
18365 callback && callback();
18366 done();
18367 }));
18368 }
18369 }
18370 }, {
18371 key: "popSwipe",
18372 value: function popSwipe(enterPage, leavePage, callback) {
18373 var _this3 = this;
18374
18375 if (this.isDragStart) {
18376 return;
18377 }
18378
18379 if (this.shouldAnimateToolbar) {
18380 Animit.runAll(
18381 /* Enter page */
18382 Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
18383 transform: 'translate3d(0, 0, 0)',
18384 opacity: 1
18385 }, this.optSwipe), Animit(this.decomp.enter.toolbarCenter).queue({
18386 transform: "translate3d(0, 0, 0)",
18387 transition: "opacity ".concat(this.durationSwipe, "s linear, transform ").concat(this.durationSwipe, "s ").concat(this.timingSwipe),
18388 opacity: 1
18389 }), Animit(this.decomp.enter.backButtonLabel).queue({
18390 transform: "translate3d(0, 0, 0)"
18391 }, this.optSwipe), Animit(this.decomp.enter.other).queue({
18392 opacity: 1
18393 }, this.optSwipe),
18394 /* Leave page */
18395 Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background]).queue({
18396 transform: "translate3d(100%, 0, 0)"
18397 }, this.optSwipe), Animit(this.decomp.leave.toolbar).queue({
18398 opacity: 0
18399 }, this.optSwipe), Animit(this.decomp.leave.toolbarCenter).queue({
18400 transform: "translate3d(125%, 0, 0)"
18401 }, this.optSwipe), Animit(this.decomp.leave.backButtonLabel).queue({
18402 opacity: 0,
18403 transform: "translate3d(".concat(this.delta.title, "px, 0, 0)"),
18404 transition: "opacity ".concat(this.durationSwipe, "s linear, transform ").concat(this.durationSwipe, "s ").concat(this.timingSwipe)
18405 }),
18406 /* Other */
18407 Animit(this.swipeShadow).queue({
18408 opacity: 0,
18409 transform: "translate3d(".concat(this.maxWidth, "px, 0, 0)")
18410 }, this.optSwipe).queue(function (done) {
18411 _this3._reset(_this3.target.enter, _this3.target.leave);
18412
18413 callback && callback();
18414 done();
18415 }));
18416 } else {
18417 Animit.runAll(Animit(enterPage).queue({
18418 transform: 'translate3D(0, 0, 0)',
18419 opacity: 1.0
18420 }, this.optSwipe), Animit(leavePage).queue({
18421 transform: 'translate3D(100%, 0, 0)'
18422 }, this.optSwipe).queue(function (done) {
18423 _this3._reset(enterPage, leavePage);
18424
18425 callback && callback();
18426 done();
18427 }));
18428 }
18429 }
18430 }, {
18431 key: "_saveStyle",
18432 value: function _saveStyle() {
18433 var _this4 = this;
18434
18435 this._savedStyle = new WeakMap();
18436
18437 var save = function save(el) {
18438 return _this4._savedStyle.set(el, el.getAttribute('style'));
18439 };
18440
18441 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
18442 args[_key] = arguments[_key];
18443 }
18444
18445 args.forEach(save);
18446 Object.keys(this.decomp).forEach(function (p) {
18447 Object.keys(_this4.decomp[p]).forEach(function (k) {
18448 (_this4.decomp[p][k] instanceof Array ? _this4.decomp[p][k] : [_this4.decomp[p][k]]).forEach(save);
18449 });
18450 });
18451 }
18452 }, {
18453 key: "_restoreStyle",
18454 value: function _restoreStyle() {
18455 var _this5 = this;
18456
18457 var restore = function restore(el) {
18458 _this5._savedStyle.get(el) === null ? el.removeAttribute('style') : el.setAttribute('style', _this5._savedStyle.get(el));
18459
18460 _this5._savedStyle.delete(el);
18461 };
18462
18463 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
18464 args[_key2] = arguments[_key2];
18465 }
18466
18467 args.forEach(restore);
18468 Object.keys(this.decomp).forEach(function (p) {
18469 Object.keys(_this5.decomp[p]).forEach(function (k) {
18470 (_this5.decomp[p][k] instanceof Array ? _this5.decomp[p][k] : [_this5.decomp[p][k]]).forEach(restore);
18471 });
18472 });
18473 }
18474 }, {
18475 key: "_reset",
18476 value: function _reset() {
18477 this.isSwiping = false;
18478 this._savedStyle && this._restoreStyle.apply(this, arguments);
18479 this.unblock && this.unblock();
18480 this.swipeShadow.remove();
18481 this.backgroundMask.remove();
18482 this.overflowElement.classList.remove('overflow-visible');
18483 this.decomp.leave.content.classList.remove('content-swiping');
18484 this.decomp = this.target = this.overflowElement = this._savedStyle = null;
18485 this.isDragStart = true;
18486 }
18487 }], [{
18488 key: "swipeable",
18489 get: function get() {
18490 return true;
18491 }
18492 }]);
18493
18494 return IOSSwipeNavigatorAnimator;
18495 }(NavigatorAnimator);
18496
18497 var _excluded = ["timing", "delay", "duration"];
18498
18499 var translate3d = function translate3d() {
18500 var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
18501 var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
18502 var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
18503 return "translate3d(".concat(x, ", ").concat(y, ", ").concat(z, ")");
18504 };
18505 /**
18506 * Slide animator for navigator transition like iOS's screen slide transition.
18507 */
18508
18509
18510 var IOSSlideNavigatorAnimator = /*#__PURE__*/function (_IOSSwipeNavigatorAni) {
18511 _inherits(IOSSlideNavigatorAnimator, _IOSSwipeNavigatorAni);
18512
18513 var _super = _createSuper(IOSSlideNavigatorAnimator);
18514
18515 function IOSSlideNavigatorAnimator() {
18516 var _this;
18517
18518 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
18519 _ref$timing = _ref.timing,
18520 timing = _ref$timing === void 0 ? 'cubic-bezier(0.3, .4, 0, .9)' : _ref$timing,
18521 _ref$delay = _ref.delay,
18522 delay = _ref$delay === void 0 ? 0 : _ref$delay,
18523 _ref$duration = _ref.duration,
18524 duration = _ref$duration === void 0 ? 0.4 : _ref$duration,
18525 rest = _objectWithoutProperties(_ref, _excluded);
18526
18527 _classCallCheck(this, IOSSlideNavigatorAnimator);
18528
18529 _this = _super.call(this, _objectSpread2({
18530 timing: timing,
18531 delay: delay,
18532 duration: duration
18533 }, rest));
18534 _this.backgroundMask = util$4.createElement("<div style=\"position: absolute; width: 100%; height: 100%;" + "background-color: black; z-index: 2\"></div>");
18535 return _this;
18536 }
18537
18538 _createClass(IOSSlideNavigatorAnimator, [{
18539 key: "_decompose",
18540 value: function _decompose(page) {
18541 var toolbar = page._getToolbarElement();
18542
18543 var left = toolbar._getToolbarLeftItemsElement();
18544
18545 var right = toolbar._getToolbarRightItemsElement();
18546
18547 var excludeBackButton = function excludeBackButton(elements) {
18548 var result = [];
18549
18550 for (var i = 0; i < elements.length; i++) {
18551 if (elements[i].nodeName.toLowerCase() !== 'ons-back-button') {
18552 result.push(elements[i]);
18553 }
18554 }
18555
18556 return result;
18557 };
18558
18559 var other = [].concat(left.children.length === 0 ? left : excludeBackButton(left.children)).concat(right.children.length === 0 ? right : excludeBackButton(right.children));
18560 return {
18561 toolbarCenter: toolbar._getToolbarCenterItemsElement(),
18562 backButtonIcon: toolbar._getToolbarBackButtonIconElement(),
18563 backButtonLabel: toolbar._getToolbarBackButtonLabelElement(),
18564 other: other,
18565 content: page._getContentElement(),
18566 background: page._getBackgroundElement(),
18567 toolbar: toolbar,
18568 bottomToolbar: page._getBottomToolbarElement()
18569 };
18570 }
18571 }, {
18572 key: "_shouldAnimateToolbar",
18573 value: function _shouldAnimateToolbar(enterPage, leavePage) {
18574 var toolbars = enterPage._canAnimateToolbar() && leavePage._canAnimateToolbar();
18575
18576 var enterToolbar = enterPage._getToolbarElement();
18577
18578 var leaveToolbar = leavePage._getToolbarElement();
18579
18580 var isStatic = enterToolbar.hasAttribute('static') || leaveToolbar.hasAttribute('static');
18581 var isMaterial = util$4.hasModifier(enterToolbar, 'material') || util$4.hasModifier(leaveToolbar, 'material');
18582 var isTransparent = util$4.hasModifier(enterToolbar, 'transparent') || util$4.hasModifier(leaveToolbar, 'transparent');
18583 return toolbars && !isStatic && !isMaterial && !isTransparent;
18584 }
18585 }, {
18586 key: "_calculateDelta",
18587 value: function _calculateDelta(element, decomposition) {
18588 var title, label;
18589 var pageRect = element.getBoundingClientRect();
18590
18591 if (decomposition.backButtonLabel.classList.contains('back-button__label')) {
18592 var labelRect = decomposition.backButtonLabel.getBoundingClientRect();
18593 title = Math.round(pageRect.width / 2 - labelRect.width / 2 - labelRect.left);
18594 } else {
18595 title = Math.round(pageRect.width / 2 * 0.6);
18596 }
18597
18598 if (decomposition.backButtonIcon.classList.contains('back-button__icon')) {
18599 label = decomposition.backButtonIcon.getBoundingClientRect().right - 2;
18600 }
18601
18602 return {
18603 title: title,
18604 label: label
18605 };
18606 }
18607 /**
18608 * @param {Object} enterPage
18609 * @param {Object} leavePage
18610 * @param {Function} callback
18611 */
18612
18613 }, {
18614 key: "push",
18615 value: function push(enterPage, leavePage, callback) {
18616 var _this2 = this;
18617
18618 this.backgroundMask.remove();
18619 leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
18620
18621 var unblock = _get(_getPrototypeOf(IOSSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
18622
18623 contentReady(enterPage, function () {
18624 var enterPageTarget = util$4.findToolbarPage(enterPage) || enterPage;
18625 var leavePageTarget = util$4.findToolbarPage(leavePage) || leavePage;
18626
18627 var enterPageDecomposition = _this2._decompose(enterPageTarget);
18628
18629 var leavePageDecomposition = _this2._decompose(leavePageTarget);
18630
18631 var delta = _this2._calculateDelta(leavePage, enterPageDecomposition);
18632
18633 var shouldAnimateToolbar = _this2._shouldAnimateToolbar(enterPageTarget, leavePageTarget);
18634
18635 if (shouldAnimateToolbar) {
18636 Animit.runAll(Animit([enterPageDecomposition.content, enterPageDecomposition.bottomToolbar, enterPageDecomposition.background], _this2.def).default({
18637 transform: translate3d('100%')
18638 }, {
18639 transform: translate3d()
18640 }), Animit(enterPageDecomposition.toolbar, _this2.def).default({
18641 opacity: 0
18642 }, {
18643 opacity: 1
18644 }), Animit(enterPageDecomposition.toolbarCenter, _this2.def).default({
18645 transform: translate3d('125%'),
18646 opacity: 1
18647 }, {
18648 transform: translate3d(),
18649 opacity: 1
18650 }), Animit(enterPageDecomposition.backButtonLabel, _this2.def).default({
18651 transform: translate3d("".concat(delta.title, "px")),
18652 opacity: 0
18653 }, {
18654 transform: translate3d(),
18655 opacity: 1,
18656 transition: "opacity ".concat(_this2.duration, "s linear, transform ").concat(_this2.duration, "s ").concat(_this2.timing)
18657 }), Animit(enterPageDecomposition.other, _this2.def).default({
18658 opacity: 0
18659 }, {
18660 css: {
18661 opacity: 1
18662 },
18663 timing: 'linear'
18664 }), Animit([leavePageDecomposition.content, leavePageDecomposition.bottomToolbar, leavePageDecomposition.background], _this2.def).default({
18665 transform: translate3d(),
18666 opacity: 1
18667 }, {
18668 transform: translate3d('-25%'),
18669 opacity: 0.9
18670 }).queue(function (done) {
18671 _this2.backgroundMask.remove();
18672
18673 unblock();
18674 callback();
18675 done();
18676 }), Animit(leavePageDecomposition.toolbarCenter, _this2.def).default({
18677 transform: translate3d(),
18678 opacity: 1
18679 }, {
18680 transform: translate3d("-".concat(delta.title, "px")),
18681 opacity: 0,
18682 transition: "opacity ".concat(_this2.duration, "s linear, transform ").concat(_this2.duration, "s ").concat(_this2.timing)
18683 }), Animit(leavePageDecomposition.backButtonLabel, _this2.def).default({
18684 transform: translate3d(),
18685 opacity: 1
18686 }, {
18687 transform: translate3d("-".concat(delta.label, "px")),
18688 opacity: 0
18689 }), Animit(leavePageDecomposition.other, _this2.def).default({
18690 opacity: 1
18691 }, {
18692 css: {
18693 opacity: 0
18694 },
18695 timing: 'linear'
18696 }));
18697 } else {
18698 Animit.runAll(Animit(enterPage, _this2.def).default({
18699 transform: translate3d('100%')
18700 }, {
18701 transform: translate3d()
18702 }), Animit(leavePage, _this2.def).default({
18703 transform: translate3d(),
18704 opacity: 1
18705 }, {
18706 transform: translate3d('-25%'),
18707 opacity: .9
18708 }).queue(function (done) {
18709 _this2.backgroundMask.remove();
18710
18711 unblock();
18712 callback();
18713 done();
18714 }));
18715 }
18716 });
18717 }
18718 /**
18719 * @param {Object} enterPage
18720 * @param {Object} leavePage
18721 * @param {Function} callback
18722 */
18723
18724 }, {
18725 key: "pop",
18726 value: function pop(enterPage, leavePage, callback) {
18727 var _this3 = this;
18728
18729 if (this.isSwiping) {
18730 return this.popSwipe(enterPage, leavePage, callback);
18731 }
18732
18733 this.backgroundMask.remove();
18734 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
18735
18736 var unblock = _get(_getPrototypeOf(IOSSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
18737
18738 var enterPageTarget = util$4.findToolbarPage(enterPage) || enterPage;
18739 var leavePageTarget = util$4.findToolbarPage(leavePage) || leavePage;
18740
18741 var enterPageDecomposition = this._decompose(enterPageTarget);
18742
18743 var leavePageDecomposition = this._decompose(leavePageTarget);
18744
18745 var delta = this._calculateDelta(leavePage, leavePageDecomposition);
18746
18747 var shouldAnimateToolbar = this._shouldAnimateToolbar(enterPageTarget, leavePageTarget);
18748
18749 if (shouldAnimateToolbar) {
18750 Animit.runAll(Animit([enterPageDecomposition.content, enterPageDecomposition.bottomToolbar, enterPageDecomposition.background], this.def).default({
18751 transform: translate3d('-25%'),
18752 opacity: .9
18753 }, {
18754 transform: translate3d(),
18755 opacity: 1
18756 }), Animit(enterPageDecomposition.toolbarCenter, this.def).default({
18757 transform: translate3d("-".concat(delta.title, "px")),
18758 opacity: 0
18759 }, {
18760 transform: translate3d(),
18761 opacity: 1,
18762 transition: "opacity ".concat(this.duration, "s linear, transform ").concat(this.duration, "s ").concat(this.timing)
18763 }), Animit(enterPageDecomposition.backButtonLabel, this.def).default({
18764 transform: translate3d("-".concat(delta.label, "px"))
18765 }, {
18766 transform: translate3d()
18767 }), Animit(enterPageDecomposition.other, this.def).default({
18768 opacity: 0
18769 }, {
18770 css: {
18771 opacity: 1
18772 },
18773 timing: 'linear'
18774 }), Animit([leavePageDecomposition.content, leavePageDecomposition.bottomToolbar, leavePageDecomposition.background], this.def).default({
18775 transform: translate3d()
18776 }, {
18777 transform: translate3d('100%')
18778 }).wait(0).queue(function (done) {
18779 _this3.backgroundMask.remove();
18780
18781 unblock();
18782 callback();
18783 done();
18784 }), Animit(leavePageDecomposition.toolbar, this.def).default({
18785 opacity: 1
18786 }, {
18787 opacity: 0
18788 }), Animit(leavePageDecomposition.toolbarCenter, this.def).default({
18789 transform: translate3d()
18790 }, {
18791 transform: translate3d('125%')
18792 }), Animit(leavePageDecomposition.backButtonLabel, this.def).default({
18793 transform: translate3d(),
18794 opacity: 1
18795 }, {
18796 transform: translate3d("".concat(delta.title, "px")),
18797 opacity: 0,
18798 transition: "opacity ".concat(this.duration, "s linear, transform ").concat(this.duration, "s ").concat(this.timing)
18799 }));
18800 } else {
18801 Animit.runAll(Animit(enterPage, this.def).default({
18802 transform: translate3d('-25%'),
18803 opacity: .9
18804 }, {
18805 transform: translate3d(),
18806 opacity: 1
18807 }), Animit(leavePage, this.def).default({
18808 transform: translate3d()
18809 }, {
18810 transform: translate3d('100%')
18811 }).queue(function (done) {
18812 _this3.backgroundMask.remove();
18813
18814 unblock();
18815 callback();
18816 done();
18817 }));
18818 }
18819 }
18820 }]);
18821
18822 return IOSSlideNavigatorAnimator;
18823 }(IOSSwipeNavigatorAnimator);
18824
18825 /**
18826 * Lift screen transition.
18827 */
18828
18829 var IOSLiftNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
18830 _inherits(IOSLiftNavigatorAnimator, _NavigatorAnimator);
18831
18832 var _super = _createSuper(IOSLiftNavigatorAnimator);
18833
18834 function IOSLiftNavigatorAnimator() {
18835 var _this;
18836
18837 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
18838 _ref$timing = _ref.timing,
18839 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
18840 _ref$delay = _ref.delay,
18841 delay = _ref$delay === void 0 ? 0 : _ref$delay,
18842 _ref$duration = _ref.duration,
18843 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
18844
18845 _classCallCheck(this, IOSLiftNavigatorAnimator);
18846
18847 _this = _super.call(this, {
18848 timing: timing,
18849 delay: delay,
18850 duration: duration
18851 });
18852 _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%;' + 'background: linear-gradient(black, white);"></div>');
18853 return _this;
18854 }
18855 /**
18856 * @param {Object} enterPage
18857 * @param {Object} leavePage
18858 * @param {Function} callback
18859 */
18860
18861
18862 _createClass(IOSLiftNavigatorAnimator, [{
18863 key: "push",
18864 value: function push(enterPage, leavePage, callback) {
18865 var _this2 = this;
18866
18867 this.backgroundMask.remove();
18868 leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
18869
18870 var unblock = _get(_getPrototypeOf(IOSLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
18871
18872 Animit.runAll(Animit(enterPage, this.def).default({
18873 transform: 'translate3D(0, 100%, 0)'
18874 }, {
18875 transform: 'translate3D(0, 0, 0)'
18876 }), Animit(leavePage, this.def).default({
18877 transform: 'translate3D(0, 0, 0)',
18878 opacity: 1
18879 }, {
18880 transform: 'translate3D(0, -10%, 0)',
18881 opacity: .9
18882 }).queue(function (done) {
18883 _this2.backgroundMask.remove();
18884
18885 unblock();
18886 callback();
18887 done();
18888 }));
18889 }
18890 /**
18891 * @param {Object} enterPage
18892 * @param {Object} leavePage
18893 * @param {Function} callback
18894 */
18895
18896 }, {
18897 key: "pop",
18898 value: function pop(enterPage, leavePage, callback) {
18899 var _this3 = this;
18900
18901 this.backgroundMask.remove();
18902 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
18903
18904 var unblock = _get(_getPrototypeOf(IOSLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
18905
18906 Animit.runAll(Animit(enterPage, this.def).default({
18907 transform: 'translate3D(0, -43px, 0)',
18908 opacity: .9
18909 }, {
18910 transform: 'translate3D(0, 0, 0)',
18911 opacity: 1
18912 }).queue(function (done) {
18913 _this3.backgroundMask.remove();
18914
18915 unblock();
18916 callback();
18917 done();
18918 }), Animit(leavePage, this.def).default({
18919 transform: 'translate3D(0, 0, 0)'
18920 }, {
18921 transform: 'translate3D(0, 100%, 0)'
18922 }));
18923 }
18924 }]);
18925
18926 return IOSLiftNavigatorAnimator;
18927 }(NavigatorAnimator);
18928
18929 var transform = 'translate3d(0, 0, 0)';
18930 /**
18931 * Fade-in screen transition.
18932 */
18933
18934 var IOSFadeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
18935 _inherits(IOSFadeNavigatorAnimator, _NavigatorAnimator);
18936
18937 var _super = _createSuper(IOSFadeNavigatorAnimator);
18938
18939 function IOSFadeNavigatorAnimator() {
18940 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
18941 _ref$timing = _ref.timing,
18942 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
18943 _ref$delay = _ref.delay,
18944 delay = _ref$delay === void 0 ? 0 : _ref$delay,
18945 _ref$duration = _ref.duration,
18946 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
18947
18948 _classCallCheck(this, IOSFadeNavigatorAnimator);
18949
18950 return _super.call(this, {
18951 timing: timing,
18952 delay: delay,
18953 duration: duration
18954 });
18955 }
18956 /**
18957 * @param {Object} enterPage
18958 * @param {Object} leavePage
18959 * @param {Function} callback
18960 */
18961
18962
18963 _createClass(IOSFadeNavigatorAnimator, [{
18964 key: "push",
18965 value: function push(enterPage, leavePage, callback) {
18966 var unblock = _get(_getPrototypeOf(IOSFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
18967
18968 Animit.runAll(Animit(enterPage, this.def).default({
18969 transform: transform,
18970 opacity: 0
18971 }, {
18972 transform: transform,
18973 opacity: 1
18974 }).queue(function (done) {
18975 unblock();
18976 callback();
18977 done();
18978 }));
18979 }
18980 /**
18981 * @param {Object} enterPage
18982 * @param {Object} leavePage
18983 * @param {Function} done
18984 */
18985
18986 }, {
18987 key: "pop",
18988 value: function pop(enterPage, leavePage, callback) {
18989 var unblock = _get(_getPrototypeOf(IOSFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
18990
18991 Animit.runAll(Animit(leavePage, this.def).default({
18992 transform: transform,
18993 opacity: 1
18994 }, {
18995 transform: transform,
18996 opacity: 0
18997 }).queue(function (done) {
18998 unblock();
18999 callback();
19000 done();
19001 }));
19002 }
19003 }]);
19004
19005 return IOSFadeNavigatorAnimator;
19006 }(NavigatorAnimator);
19007
19008 /**
19009 * Slide animator for navigator transition.
19010 */
19011
19012 var MDSlideNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
19013 _inherits(MDSlideNavigatorAnimator, _NavigatorAnimator);
19014
19015 var _super = _createSuper(MDSlideNavigatorAnimator);
19016
19017 function MDSlideNavigatorAnimator() {
19018 var _this;
19019
19020 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
19021 _ref$timing = _ref.timing,
19022 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref$timing,
19023 _ref$delay = _ref.delay,
19024 delay = _ref$delay === void 0 ? 0 : _ref$delay,
19025 _ref$duration = _ref.duration,
19026 duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
19027
19028 _classCallCheck(this, MDSlideNavigatorAnimator);
19029
19030 _this = _super.call(this, {
19031 timing: timing,
19032 delay: delay,
19033 duration: duration
19034 });
19035 _this.blackMaskOpacity = 0.4;
19036 _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%; z-index: 2;' + 'background-color: black; opacity: 0;"></div>');
19037 return _this;
19038 }
19039 /**
19040 * @param {Object} enterPage
19041 * @param {Object} leavePage
19042 * @param {Function} callback
19043 */
19044
19045
19046 _createClass(MDSlideNavigatorAnimator, [{
19047 key: "push",
19048 value: function push(enterPage, leavePage, callback) {
19049 var _this2 = this;
19050
19051 this.backgroundMask.remove();
19052 leavePage.parentElement.insertBefore(this.backgroundMask, leavePage.nextSibling);
19053
19054 var unblock = _get(_getPrototypeOf(MDSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
19055
19056 Animit.runAll(Animit(this.backgroundMask, this.def).default({
19057 transform: 'translate3d(0, 0, 0)',
19058 opacity: 0
19059 }, {
19060 opacity: this.blackMaskOpacity
19061 }).queue(function (done) {
19062 _this2.backgroundMask.remove();
19063
19064 done();
19065 }), Animit(enterPage, this.def).default({
19066 transform: 'translate3d(100%, 0, 0)'
19067 }, {
19068 transform: 'translate3d(0, 0, 0)'
19069 }), Animit(leavePage, this.def).default({
19070 transform: 'translate3d(0, 0, 0)'
19071 }, {
19072 transform: 'translate3d(-45%, 0, 0)'
19073 }).queue(function (done) {
19074 unblock();
19075 callback();
19076 done();
19077 }));
19078 }
19079 /**
19080 * @param {Object} enterPage
19081 * @param {Object} leavePage
19082 * @param {Function} callback
19083 */
19084
19085 }, {
19086 key: "pop",
19087 value: function pop(enterPage, leavePage, callback) {
19088 var _this3 = this;
19089
19090 this.backgroundMask.remove();
19091 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage.nextSibling);
19092
19093 var unblock = _get(_getPrototypeOf(MDSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
19094
19095 Animit.runAll(Animit(this.backgroundMask, this.def).default({
19096 transform: 'translate3d(0, 0, 0)',
19097 opacity: this.blackMaskOpacity
19098 }, {
19099 opacity: 0
19100 }).queue(function (done) {
19101 _this3.backgroundMask.remove();
19102
19103 done();
19104 }), Animit(enterPage, this.def).default({
19105 transform: 'translate3d(-45%, 0, 0)',
19106 opacity: .9
19107 }, {
19108 transform: 'translate3d(0, 0, 0)',
19109 opacity: 1
19110 }), Animit(leavePage, this.def).default({
19111 transform: 'translate3d(0, 0, 0)'
19112 }, {
19113 transform: 'translate3d(100%, 0, 0)'
19114 }).queue(function (done) {
19115 unblock();
19116 callback();
19117 done();
19118 }));
19119 }
19120 }]);
19121
19122 return MDSlideNavigatorAnimator;
19123 }(NavigatorAnimator);
19124
19125 /**
19126 * Lift screen transition.
19127 */
19128
19129 var MDLiftNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
19130 _inherits(MDLiftNavigatorAnimator, _NavigatorAnimator);
19131
19132 var _super = _createSuper(MDLiftNavigatorAnimator);
19133
19134 function MDLiftNavigatorAnimator() {
19135 var _this;
19136
19137 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
19138 _ref$timing = _ref.timing,
19139 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
19140 _ref$delay = _ref.delay,
19141 delay = _ref$delay === void 0 ? 0.05 : _ref$delay,
19142 _ref$duration = _ref.duration,
19143 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
19144
19145 _classCallCheck(this, MDLiftNavigatorAnimator);
19146
19147 _this = _super.call(this, {
19148 timing: timing,
19149 delay: delay,
19150 duration: duration
19151 });
19152 _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%;' + 'background-color: black;"></div>');
19153 return _this;
19154 }
19155 /**
19156 * @param {Object} enterPage
19157 * @param {Object} leavePage
19158 * @param {Function} callback
19159 */
19160
19161
19162 _createClass(MDLiftNavigatorAnimator, [{
19163 key: "push",
19164 value: function push(enterPage, leavePage, callback) {
19165 var _this2 = this;
19166
19167 this.backgroundMask.remove();
19168 leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
19169
19170 var unblock = _get(_getPrototypeOf(MDLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
19171
19172 var maskClear = Animit(this.backgroundMask).wait(this.delay + this.duration).queue(function (done) {
19173 _this2.backgroundMask.remove();
19174
19175 done();
19176 });
19177 Animit.runAll(maskClear, Animit(enterPage, this.def).default({
19178 transform: 'translate3d(0, 100%, 0)'
19179 }, {
19180 transform: 'translate3d(0, 0, 0)'
19181 }), Animit(leavePage, this.def).default({
19182 opacity: 1
19183 }, {
19184 opacity: .4
19185 }).queue(function (done) {
19186 unblock();
19187 callback();
19188 done();
19189 }));
19190 }
19191 /**
19192 * @param {Object} enterPage
19193 * @param {Object} leavePage
19194 * @param {Function} callback
19195 */
19196
19197 }, {
19198 key: "pop",
19199 value: function pop(enterPage, leavePage, callback) {
19200 var _this3 = this;
19201
19202 this.backgroundMask.remove();
19203 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
19204
19205 var unblock = _get(_getPrototypeOf(MDLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
19206
19207 Animit.runAll(Animit(this.backgroundMask).wait(this.delay + this.duration).queue(function (done) {
19208 _this3.backgroundMask.remove();
19209
19210 done();
19211 }), Animit(enterPage, this.def).default({
19212 opacity: .4
19213 }, {
19214 opacity: 1
19215 }).queue(function (done) {
19216 unblock();
19217 callback();
19218 done();
19219 }), Animit(leavePage, this.def).default({
19220 transform: 'translate3d(0, 0, 0)'
19221 }, {
19222 transform: 'translate3d(0, 100%, 0)'
19223 }));
19224 }
19225 }]);
19226
19227 return MDLiftNavigatorAnimator;
19228 }(NavigatorAnimator);
19229
19230 /**
19231 * Fade-in + Lift screen transition.
19232 */
19233
19234 var MDFadeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
19235 _inherits(MDFadeNavigatorAnimator, _NavigatorAnimator);
19236
19237 var _super = _createSuper(MDFadeNavigatorAnimator);
19238
19239 function MDFadeNavigatorAnimator() {
19240 var _this;
19241
19242 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
19243 _ref$timing = _ref.timing,
19244 timing = _ref$timing === void 0 ? 'cubic-bezier(0.4, 0, 0.2, 1)' : _ref$timing,
19245 _ref$timingPop = _ref.timingPop,
19246 timingPop = _ref$timingPop === void 0 ? 'cubic-bezier(0.4, 0, 1, 1)' : _ref$timingPop,
19247 _ref$delay = _ref.delay,
19248 delay = _ref$delay === void 0 ? 0 : _ref$delay,
19249 _ref$duration = _ref.duration,
19250 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
19251
19252 _classCallCheck(this, MDFadeNavigatorAnimator);
19253
19254 _this = _super.call(this, {
19255 timing: timing,
19256 delay: delay,
19257 duration: duration
19258 });
19259 _this.timingPop = timingPop;
19260 return _this;
19261 }
19262 /**
19263 * @param {Object} enterPage
19264 * @param {Object} leavePage
19265 * @param {Function} callback
19266 */
19267
19268
19269 _createClass(MDFadeNavigatorAnimator, [{
19270 key: "push",
19271 value: function push(enterPage, leavePage, callback) {
19272 var unblock = _get(_getPrototypeOf(MDFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
19273
19274 Animit.runAll(Animit(enterPage, this.def).default({
19275 transform: 'translate3D(0, 42px, 0)',
19276 opacity: 0
19277 }, {
19278 transform: 'translate3D(0, 0, 0)',
19279 opacity: 1
19280 }).queue(function (done) {
19281 unblock();
19282 callback();
19283 done();
19284 }));
19285 }
19286 /**
19287 * @param {Object} enterPage
19288 * @param {Object} leavePage
19289 * @param {Function} done
19290 */
19291
19292 }, {
19293 key: "pop",
19294 value: function pop(enterPage, leavePage, callback) {
19295 var unblock = _get(_getPrototypeOf(MDFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
19296
19297 Animit.runAll(Animit(leavePage, this.def).default({
19298 transform: 'translate3D(0, 0, 0)',
19299 opacity: 1
19300 }, {
19301 css: {
19302 transform: 'translate3D(0, 38px, 0)',
19303 opacity: 0
19304 },
19305 timing: this.timingPop
19306 }).queue(function (done) {
19307 unblock();
19308 callback();
19309 done();
19310 }));
19311 }
19312 }]);
19313
19314 return MDFadeNavigatorAnimator;
19315 }(NavigatorAnimator);
19316
19317 var NoneNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
19318 _inherits(NoneNavigatorAnimator, _NavigatorAnimator);
19319
19320 var _super = _createSuper(NoneNavigatorAnimator);
19321
19322 function NoneNavigatorAnimator(options) {
19323 _classCallCheck(this, NoneNavigatorAnimator);
19324
19325 return _super.call(this, options);
19326 }
19327
19328 _createClass(NoneNavigatorAnimator, [{
19329 key: "push",
19330 value: function push(enterPage, leavePage, callback) {
19331 callback();
19332 }
19333 }, {
19334 key: "pop",
19335 value: function pop(enterPage, leavePage, callback) {
19336 callback();
19337 }
19338 }]);
19339
19340 return NoneNavigatorAnimator;
19341 }(NavigatorAnimator);
19342
19343 var _animatorDict$3 = {
19344 'default': function _default() {
19345 return platform.isAndroid() ? MDFadeNavigatorAnimator : IOSSlideNavigatorAnimator;
19346 },
19347 'slide': function slide() {
19348 return platform.isAndroid() ? MDSlideNavigatorAnimator : IOSSlideNavigatorAnimator;
19349 },
19350 'lift': function lift() {
19351 return platform.isAndroid() ? MDLiftNavigatorAnimator : IOSLiftNavigatorAnimator;
19352 },
19353 'fade': function fade() {
19354 return platform.isAndroid() ? MDFadeNavigatorAnimator : IOSFadeNavigatorAnimator;
19355 },
19356 'slide-ios': IOSSlideNavigatorAnimator,
19357 'slide-md': MDSlideNavigatorAnimator,
19358 'lift-ios': IOSLiftNavigatorAnimator,
19359 'lift-md': MDLiftNavigatorAnimator,
19360 'fade-ios': IOSFadeNavigatorAnimator,
19361 'fade-md': MDFadeNavigatorAnimator,
19362 'none': NoneNavigatorAnimator
19363 };
19364 var rewritables$3 = {
19365 /**
19366 * @param {Element} navigatorSideElement
19367 * @param {Function} callback
19368 */
19369 ready: function ready(navigatorElement, callback) {
19370 callback();
19371 }
19372 };
19373
19374 var verifyPageElement = function verifyPageElement(el) {
19375 return el.nodeName !== 'ONS-PAGE' && util$4.throw('Only page elements can be children of navigator');
19376 };
19377 /**
19378 * @element ons-navigator
19379 * @category navigation
19380 * @description
19381 * [en]
19382 * A component that provides page stack management and navigation. Stack navigation is the most common navigation pattern for mobile apps.
19383 *
19384 * When a page is pushed on top of the stack it is displayed with a transition animation. When the user returns to the previous page the top page will be popped from the top of the stack and hidden with an opposite transition animation.
19385 * [/en]
19386 * [ja][/ja]
19387 * @codepen yrhtv
19388 * @tutorial vanilla/Reference/navigator
19389 * @guide lifecycle.html#events
19390 * [en]Overview of page events[/en]
19391 * [ja]Overview of page events[/ja]
19392 * @seealso ons-toolbar
19393 * [en]The `<ons-toolbar>` component is used to display a toolbar on the top of a page.[/en]
19394 * [ja][/ja]
19395 * @seealso ons-back-button
19396 * [en]The `<ons-back-button>` component lets the user return to the previous page.[/en]
19397 * [ja][/ja]
19398 * @example
19399 * <ons-navigator id="navigator">
19400 * <ons-page>
19401 * <ons-toolbar>
19402 * <div class="center">
19403 * Title
19404 * </div>
19405 * </ons-toolbar>
19406 * <p>
19407 * <ons-button
19408 * onclick="document.getElementById('navigator').pushPage('page.html')">
19409 * Push page
19410 * </ons-button>
19411 * </p>
19412 * </ons-page>
19413 * </ons-navigator>
19414 *
19415 * <template id="page.html">
19416 * <ons-page>
19417 * <ons-toolbar>
19418 * <div class="left">
19419 * <ons-back-button>Back</ons-back-button>
19420 * </div>
19421 * <div class="center">
19422 * Another page
19423 * </div>
19424 * </ons-toolbar>
19425 * </ons-page>
19426 * </template>
19427 */
19428
19429
19430 var NavigatorElement = /*#__PURE__*/function (_BaseElement) {
19431 _inherits(NavigatorElement, _BaseElement);
19432
19433 var _super = _createSuper(NavigatorElement);
19434
19435 function NavigatorElement() {
19436 var _this;
19437
19438 _classCallCheck(this, NavigatorElement);
19439
19440 _this = _super.call(this);
19441 _this._isRunning = false;
19442 _this._initialized = false;
19443 _this._pageLoader = defaultPageLoader;
19444 _this._pageMap = new WeakMap();
19445
19446 _this._updateAnimatorFactory();
19447
19448 return _this;
19449 }
19450 /**
19451 * @property pageLoader
19452 * @type {PageLoader}
19453 * @description
19454 * [en]PageLoader instance. It can be overriden to change the way pages are loaded by this element. Useful for lib developers.[/en]
19455 * [ja]PageLoaderインスタンスを格納しています。[/ja]
19456 */
19457
19458
19459 _createClass(NavigatorElement, [{
19460 key: "animatorFactory",
19461 get:
19462 /**
19463 * @attribute page
19464 * @initonly
19465 * @type {String}
19466 * @description
19467 * [en]First page to show when navigator is initialized.[/en]
19468 * [ja]ナビゲーターが初期化された時に表示するページを指定します。[/ja]
19469 */
19470
19471 /**
19472 * @attribute swipeable
19473 * @type {Boolean}
19474 * @description
19475 * [en]Enable iOS "swipe to pop" feature.[/en]
19476 * [ja][/ja]
19477 */
19478
19479 /**
19480 * @attribute swipe-target-width
19481 * @type {String}
19482 * @default 20px
19483 * @description
19484 * [en]The width of swipeable area calculated from the edge (in pixels). Use this to enable swipe only when the finger touch on the screen edge.[/en]
19485 * [ja]スワイプの判定領域をピクセル単位で指定します。画面の端から指定した距離に達するとページが表示されます。[/ja]
19486 */
19487
19488 /**
19489 * @attribute swipe-threshold
19490 * @type {Number}
19491 * @default 0.2
19492 * @description
19493 * [en]Specify how much the page needs to be swiped before popping. A value between `0` and `1`.[/en]
19494 * [ja][/ja]
19495 */
19496
19497 /**
19498 * @attribute animation
19499 * @type {String}
19500 * @default default
19501 * @description
19502 * [en]
19503 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
19504 *
19505 * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"` depending on the platform.
19506 * [/en]
19507 * [ja][/ja]
19508 */
19509
19510 /**
19511 * @attribute animation-options
19512 * @type {Expression}
19513 * @description
19514 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/en]
19515 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
19516 */
19517
19518 /**
19519 * @property animationOptions
19520 * @type {Object}
19521 * @description
19522 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/en]
19523 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
19524 */
19525
19526 /**
19527 * @event prepush
19528 * @description
19529 * [en]Fired just before a page is pushed.[/en]
19530 * [ja]pageがpushされる直前に発火されます。[/ja]
19531 * @param {Object} event [en]Event object.[/en]
19532 * @param {Object} event.navigator
19533 * [en]Component object.[/en]
19534 * [ja]コンポーネントのオブジェクト。[/ja]
19535 * @param {Object} event.currentPage
19536 * [en]Current page object.[/en]
19537 * [ja]現在のpageオブジェクト。[/ja]
19538 * @param {Function} event.cancel
19539 * [en]Call this function to cancel the push.[/en]
19540 * [ja]この関数を呼び出すと、push処理がキャンセルされます。[/ja]
19541 */
19542
19543 /**
19544 * @event prepop
19545 * @description
19546 * [en]Fired just before a page is popped.[/en]
19547 * [ja]pageがpopされる直前に発火されます。[/ja]
19548 * @param {Object} event [en]Event object.[/en]
19549 * @param {Object} event.navigator
19550 * [en]Component object.[/en]
19551 * [ja]コンポーネントのオブジェクト。[/ja]
19552 * @param {Object} event.currentPage
19553 * [en]Current page object.[/en]
19554 * [ja]現在のpageオブジェクト。[/ja]
19555 * @param {Function} event.cancel
19556 * [en]Call this function to cancel the pop.[/en]
19557 * [ja]この関数を呼び出すと、pageのpopがキャンセルされます。[/ja]
19558 */
19559
19560 /**
19561 * @event postpush
19562 * @description
19563 * [en]Fired just after a page is pushed.[/en]
19564 * [ja]pageがpushされてアニメーションが終了してから発火されます。[/ja]
19565 * @param {Object} event [en]Event object.[/en]
19566 * @param {Object} event.navigator
19567 * [en]Component object.[/en]
19568 * [ja]コンポーネントのオブジェクト。[/ja]
19569 * @param {Object} event.enterPage
19570 * [en]Object of the next page.[/en]
19571 * [ja]pushされたpageオブジェクト。[/ja]
19572 * @param {Object} event.leavePage
19573 * [en]Object of the previous page.[/en]
19574 * [ja]以前のpageオブジェクト。[/ja]
19575 */
19576
19577 /**
19578 * @event postpop
19579 * @description
19580 * [en]Fired just after a page is popped.[/en]
19581 * [ja]pageがpopされてアニメーションが終わった後に発火されます。[/ja]
19582 * @param {Object} event [en]Event object.[/en]
19583 * @param {Object} event.navigator
19584 * [en]Component object.[/en]
19585 * [ja]コンポーネントのオブジェクト。[/ja]
19586 * @param {Object} event.enterPage
19587 * [en]Object of the next page.[/en]
19588 * [ja]popされて表示されるページのオブジェクト。[/ja]
19589 * @param {Object} event.leavePage
19590 * [en]Object of the previous page.[/en]
19591 * [ja]popされて消えるページのオブジェクト。[/ja]
19592 * @param {Object} event.swipeToPop
19593 * [en]True if the pop was triggered by the user swiping to pop.[/en]
19594 * [ja][/ja]
19595 * @param {Object} event.onsBackButton
19596 * [en]True if the pop was caused by pressing an ons-back-button.[/en]
19597 * [ja][/ja]
19598 */
19599
19600 /**
19601 * @event swipe
19602 * @description
19603 * [en]Fired whenever the user slides the navigator (swipe-to-pop).[/en]
19604 * [ja][/ja]
19605 * @param {Object} event [en]Event object.[/en]
19606 * @param {Object} event.ratio
19607 * [en]Decimal ratio (0-1).[/en]
19608 * [ja][/ja]
19609 * @param {Object} event.animationOptions
19610 * [en][/en]
19611 * [ja][/ja]
19612 */
19613 function get() {
19614 return this._animatorFactory;
19615 }
19616 }, {
19617 key: "pageLoader",
19618 get: function get() {
19619 return this._pageLoader;
19620 },
19621 set: function set(pageLoader) {
19622 if (!(pageLoader instanceof PageLoader)) {
19623 util$4.throwPageLoader();
19624 }
19625
19626 this._pageLoader = pageLoader;
19627 }
19628 }, {
19629 key: "_getPageTarget",
19630 value: function _getPageTarget() {
19631 return this._page || this.getAttribute('page');
19632 }
19633 /**
19634 * @property page
19635 * @type {*}
19636 * @description
19637 * [en]Specify the page to be loaded during initialization. This value takes precedence over the `page` attribute. Useful for lib developers.[/en]
19638 * [ja]初期化時に読み込むページを指定します。`page`属性で指定した値よりも`page`プロパティに指定した値を優先します。[/ja]
19639 */
19640
19641 }, {
19642 key: "page",
19643 get: function get() {
19644 return this._page;
19645 },
19646 set: function set(page) {
19647 this._page = page;
19648 }
19649 }, {
19650 key: "connectedCallback",
19651 value: function connectedCallback() {
19652 var _this2 = this;
19653
19654 this.onDeviceBackButton = this._onDeviceBackButton.bind(this);
19655
19656 if (!platform.isAndroid() || this.getAttribute('swipeable') === 'force') {
19657 var swipeAnimator;
19658 this._swipe = new SwipeReveal({
19659 element: this,
19660 getThreshold: function getThreshold() {
19661 return Math.max(0.2, parseFloat(_this2.getAttribute('swipe-threshold')) || 0);
19662 },
19663 swipeMax: function swipeMax() {
19664 var ratio = 1;
19665 var animationOptions = {
19666 duration: swipeAnimator.durationSwipe,
19667 timing: swipeAnimator.timingSwipe
19668 };
19669 _this2._onSwipe && _this2._onSwipe(ratio, animationOptions);
19670 util$4.triggerElementEvent(_this2, 'swipe', {
19671 ratio: ratio,
19672 animationOptions: animationOptions
19673 });
19674
19675 _this2[_this2.swipeMax ? 'swipeMax' : 'popPage']({
19676 animator: swipeAnimator,
19677 swipeToPop: true
19678 });
19679
19680 swipeAnimator = null;
19681 },
19682 swipeMid: function swipeMid(distance, width) {
19683 var ratio = distance / width;
19684 _this2._onSwipe && _this2._onSwipe(ratio);
19685 util$4.triggerElementEvent(_this2, 'swipe', {
19686 ratio: ratio
19687 });
19688 swipeAnimator.translate(distance, width, _this2.topPage.previousElementSibling, _this2.topPage);
19689 },
19690 swipeMin: function swipeMin() {
19691 var ratio = 0;
19692 var animationOptions = {
19693 duration: swipeAnimator.durationRestore,
19694 timing: swipeAnimator.timingSwipe
19695 };
19696 _this2._onSwipe && _this2._onSwipe(ratio, animationOptions);
19697 util$4.triggerElementEvent(_this2, 'swipe', {
19698 ratio: ratio,
19699 animationOptions: animationOptions
19700 });
19701 swipeAnimator.restore(_this2.topPage.previousElementSibling, _this2.topPage);
19702 swipeAnimator = null;
19703 },
19704 ignoreSwipe: function ignoreSwipe(event, distance) {
19705 // Basic conditions
19706 if (!_this2._isRunning && _this2.children.length > 1) {
19707 // Area or directional issues
19708 var area = parseInt(_this2.getAttribute('swipe-target-width') || 25, 10);
19709
19710 if (event.gesture.direction === 'right' && area > distance) {
19711 // Swipes on ons-back-button and its children
19712 var isBB = function isBB(el) {
19713 return /ons-back-button/i.test(el.tagName);
19714 };
19715
19716 if (!isBB(event.target) && !util$4.findParent(event.target, isBB, function (p) {
19717 return /ons-page/i.test(p.tagName);
19718 })) {
19719 // Animator is swipeable
19720 var animation = (_this2.topPage.pushedOptions || {}).animation || _this2.animatorFactory._animation;
19721 var Animator = _animatorDict$3[animation] instanceof Function ? _animatorDict$3[animation].call() : _animatorDict$3[animation];
19722
19723 if (typeof Animator !== 'undefined' && Animator.swipeable) {
19724 swipeAnimator = new Animator(); // Prepare for the swipe
19725
19726 return false;
19727 }
19728 }
19729 }
19730 }
19731
19732 return true; // Ignore swipe
19733 }
19734 });
19735 this.attributeChangedCallback('swipeable');
19736 }
19737
19738 if (this._initialized) {
19739 return;
19740 }
19741
19742 this._initialized = true;
19743 var deferred = util$4.defer();
19744 this.loaded = deferred.promise;
19745 rewritables$3.ready(this, function () {
19746 var show = !util$4.hasAnyComponentAsParent(_this2);
19747 var options = {
19748 animation: 'none',
19749 show: show
19750 };
19751
19752 if (_this2.pages.length === 0 && _this2._getPageTarget()) {
19753 _this2.pushPage(_this2._getPageTarget(), options).then(function () {
19754 return deferred.resolve();
19755 });
19756 } else if (_this2.pages.length > 0) {
19757 for (var i = 0; i < _this2.pages.length; i++) {
19758 verifyPageElement(_this2.pages[i]);
19759 }
19760
19761 if (_this2.topPage) {
19762 contentReady(_this2.topPage, function () {
19763 return setTimeout(function () {
19764 deferred.resolve();
19765 show && _this2.topPage._show();
19766
19767 _this2._updateLastPageBackButton();
19768 }, 0);
19769 });
19770 }
19771 } else {
19772 contentReady(_this2, function () {
19773 if (_this2.pages.length === 0 && _this2._getPageTarget()) {
19774 _this2.pushPage(_this2._getPageTarget(), options).then(function () {
19775 return deferred.resolve();
19776 });
19777 } else {
19778 deferred.resolve();
19779 }
19780 });
19781 }
19782 });
19783 }
19784 }, {
19785 key: "_updateAnimatorFactory",
19786 value: function _updateAnimatorFactory() {
19787 this._animatorFactory = new AnimatorFactory({
19788 animators: _animatorDict$3,
19789 baseClass: NavigatorAnimator,
19790 baseClassName: 'NavigatorAnimator',
19791 defaultAnimation: this.getAttribute('animation')
19792 });
19793 }
19794 }, {
19795 key: "disconnectedCallback",
19796 value: function disconnectedCallback() {
19797 this._backButtonHandler.destroy();
19798
19799 this._backButtonHandler = null;
19800 this._swipe && this._swipe.dispose();
19801 this._swipe = null;
19802 }
19803 }, {
19804 key: "attributeChangedCallback",
19805 value: function attributeChangedCallback(name, last, current) {
19806 switch (name) {
19807 case 'animation':
19808 this._updateAnimatorFactory();
19809
19810 break;
19811
19812 case 'swipeable':
19813 this._swipe && this._swipe.update();
19814 break;
19815 }
19816 }
19817 /**
19818 * @method popPage
19819 * @signature popPage([options])
19820 * @param {Object} [options]
19821 * [en]Parameter object.[/en]
19822 * [ja]オプションを指定するオブジェクト。[/ja]
19823 * @param {String} [options.animation]
19824 * [en]
19825 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
19826 *
19827 * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
19828 * [/en]
19829 * [ja][/ja]
19830 * @param {String} [options.animationOptions]
19831 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
19832 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
19833 * @param {Function} [options.callback]
19834 * [en]Function that is called when the transition has ended.[/en]
19835 * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
19836 * @param {Object} [options.data]
19837 * [en]Custom data that will be stored in the new page element.[/en]
19838 * [ja][/ja]
19839 * @param {Number} [options.times]
19840 * [en]Number of pages to be popped. Only one animation will be shown.[/en]
19841 * [ja][/ja]
19842 * @return {Promise}
19843 * [en]Promise which resolves to the revealed page.[/en]
19844 * [ja]明らかにしたページを解決するPromiseを返します。[/ja]
19845 * @description
19846 * [en]Pops the current page from the page stack. The previous page will be displayed.[/en]
19847 * [ja]現在表示中のページをページスタックから取り除きます。一つ前のページに戻ります。[/ja]
19848 */
19849
19850 }, {
19851 key: "popPage",
19852 value: function popPage() {
19853 var _this3 = this;
19854
19855 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
19856
19857 var _this$_preparePageAnd = this._preparePageAndOptions(null, options);
19858
19859 options = _this$_preparePageAnd.options;
19860
19861 if (util$4.isInteger(options.times) && options.times > 1) {
19862 this._removePages(options.times);
19863 }
19864
19865 var popUpdate = function popUpdate() {
19866 return new Promise(function (resolve) {
19867 _this3._pageLoader.unload(_this3.pages[_this3.pages.length - 1]);
19868
19869 resolve();
19870 });
19871 };
19872
19873 return this._popPage(options, popUpdate);
19874 }
19875 }, {
19876 key: "_popPage",
19877 value: function _popPage(options) {
19878 var _this4 = this;
19879
19880 var update = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
19881 return Promise.resolve();
19882 };
19883
19884 if (this._isRunning) {
19885 return Promise.reject('popPage is already running.');
19886 }
19887
19888 if (this.pages.length <= 1) {
19889 return Promise.reject('ons-navigator\'s page stack is empty.');
19890 }
19891
19892 if (this._emitPrePopEvent()) {
19893 return Promise.reject('Canceled in prepop event.');
19894 }
19895
19896 var length = this.pages.length;
19897 this._isRunning = true;
19898 this.pages[length - 2].updateBackButton(length - 2 > 0);
19899 return new Promise(function (resolve) {
19900 var leavePage = _this4.pages[length - 1];
19901 var enterPage = _this4.pages[length - 2];
19902 options = util$4.extend({}, _this4.options || {}, options);
19903
19904 if (options.data) {
19905 enterPage.data = util$4.extend({}, enterPage.data || {}, options.data || {});
19906 }
19907
19908 var done = function done() {
19909 update().then(function () {
19910 _this4._isRunning = false;
19911
19912 enterPage._show();
19913
19914 util$4.triggerElementEvent(_this4, 'postpop', {
19915 leavePage: leavePage,
19916 enterPage: enterPage,
19917 navigator: _this4,
19918 swipeToPop: !!options.swipeToPop,
19919 // whether the pop was triggered by the user swiping
19920 onsBackButton: !!options.onsBackButton // whether the pop was triggered by clicking ons-back-button
19921
19922 });
19923 options.callback && options.callback(enterPage);
19924 resolve(enterPage);
19925 });
19926 };
19927
19928 leavePage._hide();
19929
19930 enterPage.style.display = '';
19931
19932 var animator = options.animator || _this4._animatorFactory.newAnimator(options);
19933
19934 animator.pop(_this4.pages[length - 2], _this4.pages[length - 1], done);
19935 }).catch(function () {
19936 return _this4._isRunning = false;
19937 });
19938 }
19939 /**
19940 * @method pushPage
19941 * @signature pushPage(page, [options])
19942 * @param {String} page
19943 * [en]Page URL. Can be either a HTML document or a template defined with the `<template>` tag.[/en]
19944 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
19945 * @param {Object} [options]
19946 * [en]Parameter object.[/en]
19947 * [ja]オプションを指定するオブジェクト。[/ja]
19948 * @param {String} [options.page]
19949 * [en]Page URL. Only necessary if `page` parameter is null or undefined.[/en]
19950 * [ja][/ja]
19951 * @param {String} [options.pageHTML]
19952 * [en]HTML code that will be computed as a new page. Overwrites `page` parameter.[/en]
19953 * [ja][/ja]
19954 * @param {String} [options.animation]
19955 * [en]
19956 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
19957 *
19958 * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
19959 * [/en]
19960 * [ja][/ja]
19961 * @param {String} [options.animationOptions]
19962 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/en]
19963 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
19964 * @param {Function} [options.callback]
19965 * [en]Function that is called when the transition has ended.[/en]
19966 * [ja]pushPage()による画面遷移が終了した時に呼び出される関数オブジェクトを指定します。[/ja]
19967 * @param {Object} [options.data]
19968 * [en]Custom data that will be stored in the new page element.[/en]
19969 * [ja][/ja]
19970 * @return {Promise}
19971 * [en]Promise which resolves to the pushed page.[/en]
19972 * [ja]追加したページを解決するPromiseを返します。[/ja]
19973 * @description
19974 * [en]Pushes the specified page into the stack.[/en]
19975 * [ja]指定したpageを新しいページスタックに追加します。新しいページが表示されます。[/ja]
19976 */
19977
19978 }, {
19979 key: "pushPage",
19980 value: function pushPage(page) {
19981 var _this5 = this;
19982
19983 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
19984
19985 var _this$_preparePageAnd2 = this._preparePageAndOptions(page, options);
19986
19987 page = _this$_preparePageAnd2.page;
19988 options = _this$_preparePageAnd2.options;
19989
19990 var prepare = function prepare(pageElement) {
19991 verifyPageElement(pageElement);
19992
19993 _this5._pageMap.set(pageElement, page);
19994
19995 pageElement = util$4.extend(pageElement, {
19996 data: options.data
19997 });
19998 pageElement.style.visibility = 'hidden';
19999 };
20000
20001 if (options.pageHTML) {
20002 return this._pushPage(options, function () {
20003 return new Promise(function (resolve) {
20004 instantPageLoader.load({
20005 page: options.pageHTML,
20006 parent: _this5,
20007 params: options.data
20008 }, function (pageElement) {
20009 prepare(pageElement);
20010 resolve();
20011 });
20012 });
20013 });
20014 }
20015
20016 return this._pushPage(options, function () {
20017 return new Promise(function (resolve) {
20018 _this5._pageLoader.load({
20019 page: page,
20020 parent: _this5,
20021 params: options.data
20022 }, function (pageElement) {
20023 prepare(pageElement);
20024 resolve();
20025 }, function (error) {
20026 _this5._isRunning = false;
20027 throw error;
20028 });
20029 });
20030 });
20031 }
20032 }, {
20033 key: "_pushPage",
20034 value: function _pushPage() {
20035 var _this6 = this;
20036
20037 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
20038 var update = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
20039 return Promise.resolve();
20040 };
20041
20042 if (this._isRunning) {
20043 return Promise.reject('pushPage is already running.');
20044 }
20045
20046 if (this._emitPrePushEvent()) {
20047 return Promise.reject('Canceled in prepush event.');
20048 }
20049
20050 this._isRunning = true;
20051 var animationOptions = this.animationOptions;
20052 options = util$4.extend({}, this.options || {}, {
20053 animationOptions: animationOptions
20054 }, options);
20055
20056 var animator = this._animatorFactory.newAnimator(options);
20057
20058 return update().then(function () {
20059 var pageLength = _this6.pages.length;
20060 var enterPage = _this6.pages[pageLength - 1];
20061 var leavePage = options.leavePage || _this6.pages[pageLength - 2];
20062 verifyPageElement(enterPage);
20063 enterPage.updateBackButton(pageLength > (options._replacePage ? 2 : 1));
20064 enterPage.pushedOptions = util$4.extend({}, enterPage.pushedOptions || {}, options || {});
20065 enterPage.data = util$4.extend({}, enterPage.data || {}, options.data || {});
20066 enterPage.unload = enterPage.unload || options.unload;
20067 return new Promise(function (resolve) {
20068 var done = function done() {
20069 _this6._isRunning = false;
20070 options.show !== false && setImmediate(function () {
20071 return enterPage._show();
20072 });
20073 util$4.triggerElementEvent(_this6, 'postpush', {
20074 leavePage: leavePage,
20075 enterPage: enterPage,
20076 navigator: _this6
20077 });
20078
20079 if (leavePage) {
20080 leavePage.style.display = 'none';
20081 }
20082
20083 options.callback && options.callback(enterPage);
20084 resolve(enterPage);
20085 };
20086
20087 enterPage.style.visibility = '';
20088
20089 if (leavePage) {
20090 leavePage._hide();
20091
20092 animator.push(enterPage, leavePage, done);
20093 } else {
20094 done();
20095 }
20096 });
20097 }).catch(function (error) {
20098 _this6._isRunning = false;
20099 throw error;
20100 });
20101 }
20102 /**
20103 * @method replacePage
20104 * @signature replacePage(page, [options])
20105 * @return {Promise}
20106 * [en]Promise which resolves to the new page.[/en]
20107 * [ja]新しいページを解決するPromiseを返します。[/ja]
20108 * @description
20109 * [en]Replaces the current top page with the specified one. Extends `pushPage()` parameters.[/en]
20110 * [ja]現在表示中のページをを指定したページに置き換えます。[/ja]
20111 */
20112
20113 }, {
20114 key: "replacePage",
20115 value: function replacePage(page) {
20116 var _this7 = this;
20117
20118 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20119 return this.pushPage(page, options).then(function (resolvedValue) {
20120 if (_this7.pages.length > 1) {
20121 _this7._pageLoader.unload(_this7.pages[_this7.pages.length - 2]);
20122 }
20123
20124 _this7._updateLastPageBackButton();
20125
20126 return Promise.resolve(resolvedValue);
20127 });
20128 }
20129 /**
20130 * @method insertPage
20131 * @signature insertPage(index, page, [options])
20132 * @param {Number} index
20133 * [en]The index where it should be inserted.[/en]
20134 * [ja]スタックに挿入する位置のインデックスを指定します。[/ja]
20135 * @return {Promise}
20136 * [en]Promise which resolves to the inserted page.[/en]
20137 * [ja]指定したページを解決するPromiseを返します。[/ja]
20138 * @description
20139 * [en]Insert the specified page into the stack with at a position defined by the `index` argument. Extends `pushPage()` parameters.[/en]
20140 * [ja]指定したpageをページスタックのindexで指定した位置に追加します。[/ja]
20141 */
20142
20143 }, {
20144 key: "insertPage",
20145 value: function insertPage(index, page) {
20146 var _this8 = this;
20147
20148 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
20149
20150 var _this$_preparePageAnd3 = this._preparePageAndOptions(page, options);
20151
20152 page = _this$_preparePageAnd3.page;
20153 options = _this$_preparePageAnd3.options;
20154 index = this._normalizeIndex(index);
20155
20156 if (index >= this.pages.length) {
20157 return this.pushPage(page, options);
20158 }
20159
20160 page = typeof options.pageHTML === 'string' ? options.pageHTML : page;
20161 var loader = typeof options.pageHTML === 'string' ? instantPageLoader : this._pageLoader;
20162 return new Promise(function (resolve) {
20163 loader.load({
20164 page: page,
20165 parent: _this8
20166 }, function (pageElement) {
20167 verifyPageElement(pageElement);
20168
20169 _this8._pageMap.set(pageElement, page);
20170
20171 pageElement = util$4.extend(pageElement, {
20172 data: options.data,
20173 pushedOptions: options
20174 });
20175 options.animationOptions = util$4.extend({}, _this8.animationOptions, options.animationOptions || {});
20176 pageElement.style.display = 'none';
20177
20178 _this8.insertBefore(pageElement, _this8.pages[index]);
20179
20180 _this8.topPage.updateBackButton(true);
20181
20182 setTimeout(function () {
20183 pageElement = null;
20184 resolve(_this8.pages[index]);
20185 }, 1000 / 60);
20186 });
20187 });
20188 }
20189 /**
20190 * @method removePage
20191 * @signature removePage(index, [options])
20192 * @param {Number} index
20193 * [en]The index where it should be removed.[/en]
20194 * [ja]スタックから削除するページのインデックスを指定します。[/ja]
20195 * @return {Promise}
20196 * [en]Promise which resolves to the revealed page.[/en]
20197 * [ja]削除によって表示されたページを解決するPromiseを返します。[/ja]
20198 * @description
20199 * [en]Remove the specified page at a position in the stack defined by the `index` argument. Extends `popPage()` parameters.[/en]
20200 * [ja]指定したインデックスにあるページを削除します。[/ja]
20201 */
20202
20203 }, {
20204 key: "removePage",
20205 value: function removePage(index) {
20206 var _this9 = this;
20207
20208 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20209 index = this._normalizeIndex(index);
20210
20211 if (index < this.pages.length - 1) {
20212 return new Promise(function (resolve) {
20213 var leavePage = _this9.pages[index];
20214 var enterPage = _this9.topPage;
20215
20216 _this9._pageMap.delete(leavePage);
20217
20218 _this9._pageLoader.unload(leavePage);
20219
20220 if (_this9.pages.length === 1) {
20221 // edge case
20222 _this9.topPage.updateBackButton(false);
20223 }
20224
20225 resolve(enterPage);
20226 });
20227 } else {
20228 return this.popPage(options);
20229 }
20230 }
20231 /**
20232 * @method resetToPage
20233 * @signature resetToPage(page, [options])
20234 * @return {Promise}
20235 * [en]Promise which resolves to the new top page.[/en]
20236 * [ja]新しいトップページを解決するPromiseを返します。[/ja]
20237 * @param {Boolean} [options.pop]
20238 * [en]Performs 'pop' effect if `true` instead of 'push' or none. This also sets `options.animation` value to `default` instead of `none`.[/en]
20239 * [ja][/ja]
20240 * @description
20241 * [en]Clears page stack and adds the specified page to the stack. Extends `pushPage()` parameters.[/en]
20242 * [ja]ページスタックをリセットし、指定したページを表示します。[/ja]
20243 */
20244
20245 }, {
20246 key: "resetToPage",
20247 value: function resetToPage(page) {
20248 var _this10 = this;
20249
20250 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20251
20252 var _this$_preparePageAnd4 = this._preparePageAndOptions(page, options);
20253
20254 page = _this$_preparePageAnd4.page;
20255 options = _this$_preparePageAnd4.options;
20256
20257 if (!options.animator && !options.animation && !options.pop) {
20258 options.animation = 'none';
20259 }
20260
20261 if (!options.page && !options.pageHTML && this._getPageTarget()) {
20262 page = options.page = this._getPageTarget();
20263 }
20264
20265 if (options.pop) {
20266 this._removePages();
20267
20268 return this.insertPage(0, page, {
20269 data: options.data
20270 }).then(function () {
20271 return _this10.popPage(options);
20272 });
20273 } // Tip: callback runs before resolved promise
20274
20275
20276 var callback = options.callback;
20277
20278 options.callback = function (newPage) {
20279 _this10._removePages();
20280
20281 newPage.updateBackButton(false);
20282 callback && callback(newPage);
20283 };
20284
20285 return this.pushPage(page, options);
20286 }
20287 /**
20288 * @method bringPageTop
20289 * @signature bringPageTop(item, [options])
20290 * @param {String|Number} item
20291 * [en]Page URL or index of an existing page in navigator's stack.[/en]
20292 * [ja]ページのURLかもしくはons-navigatorのページスタックのインデックス値を指定します。[/ja]
20293 * @return {Promise}
20294 * [en]Promise which resolves to the new top page.[/en]
20295 * [ja]新しいトップページを解決するPromiseを返します。[/ja]
20296 * @description
20297 * [en]Brings the given page to the top of the page stack if it already exists or pushes it into the stack if doesn't. Extends `pushPage()` parameters.[/en]
20298 * [ja]指定したページをページスタックの一番上に移動します。もし指定したページが無かった場合新しくpushされます。[/ja]
20299 */
20300
20301 }, {
20302 key: "bringPageTop",
20303 value: function bringPageTop(item) {
20304 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20305
20306 if (['number', 'string'].indexOf(_typeof(item)) === -1) {
20307 util$4.throw('First argument must be a page name or the index of an existing page. You supplied ' + item);
20308 }
20309
20310 var index = typeof item === 'number' ? this._normalizeIndex(item) : this._lastIndexOfPage(item);
20311 var page = this.pages[index];
20312
20313 if (index < 0) {
20314 return this.pushPage(item, options);
20315 }
20316
20317 var _this$_preparePageAnd5 = this._preparePageAndOptions(page, options);
20318
20319 options = _this$_preparePageAnd5.options;
20320
20321 if (index === this.pages.length - 1) {
20322 return Promise.resolve(page);
20323 }
20324
20325 if (!page) {
20326 util$4.throw('Failed to find item ' + item);
20327 }
20328
20329 if (this._isRunning) {
20330 return Promise.reject('pushPage is already running.');
20331 }
20332
20333 if (this._emitPrePushEvent()) {
20334 return Promise.reject('Canceled in prepush event.');
20335 }
20336
20337 page.style.display = '';
20338 page.style.visibility = 'hidden';
20339 page.parentNode.appendChild(page);
20340 return this._pushPage(options);
20341 }
20342 }, {
20343 key: "_preparePageAndOptions",
20344 value: function _preparePageAndOptions(page) {
20345 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20346
20347 if (_typeof(options) != 'object') {
20348 util$4.throw('options must be an object. You supplied ' + options);
20349 }
20350
20351 if ((page === null || page === undefined) && options.page) {
20352 page = options.page;
20353 }
20354
20355 options = util$4.extend({}, this.options || {}, options, {
20356 page: page
20357 });
20358 return {
20359 page: page,
20360 options: options
20361 };
20362 }
20363 }, {
20364 key: "_removePages",
20365 value: function _removePages(times) {
20366 var pages = this.pages;
20367 var until = times === undefined ? 0 : pages.length - times;
20368 until = until < 0 ? 1 : until;
20369
20370 for (var i = pages.length - 2; i >= until; i--) {
20371 this._pageMap.delete(pages[i]);
20372
20373 this._pageLoader.unload(pages[i]);
20374 }
20375 }
20376 }, {
20377 key: "_updateLastPageBackButton",
20378 value: function _updateLastPageBackButton() {
20379 var index = this.pages.length - 1;
20380
20381 if (index >= 0) {
20382 this.pages[index].updateBackButton(index > 0);
20383 }
20384 }
20385 }, {
20386 key: "_normalizeIndex",
20387 value: function _normalizeIndex(index) {
20388 return index >= 0 ? index : Math.abs(this.pages.length + index) % this.pages.length;
20389 }
20390 }, {
20391 key: "_onDeviceBackButton",
20392 value: function _onDeviceBackButton(event) {
20393 if (this.pages.length > 1) {
20394 this.popPage();
20395 } else {
20396 event.callParentHandler();
20397 }
20398 }
20399 }, {
20400 key: "_lastIndexOfPage",
20401 value: function _lastIndexOfPage(pageName) {
20402 var index;
20403
20404 for (index = this.pages.length - 1; index >= 0; index--) {
20405 if (pageName === this._pageMap.get(this.pages[index])) {
20406 break;
20407 }
20408 }
20409
20410 return index;
20411 }
20412 }, {
20413 key: "_emitPreEvent",
20414 value: function _emitPreEvent(name) {
20415 var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20416 var isCanceled = false;
20417 util$4.triggerElementEvent(this, 'pre' + name, util$4.extend({
20418 navigator: this,
20419 currentPage: this.pages[this.pages.length - 1],
20420 cancel: function cancel() {
20421 return isCanceled = true;
20422 }
20423 }, data));
20424 return isCanceled;
20425 }
20426 }, {
20427 key: "_emitPrePushEvent",
20428 value: function _emitPrePushEvent() {
20429 return this._emitPreEvent('push');
20430 }
20431 }, {
20432 key: "_emitPrePopEvent",
20433 value: function _emitPrePopEvent() {
20434 var l = this.pages.length;
20435 return this._emitPreEvent('pop', {
20436 leavePage: this.pages[l - 1],
20437 enterPage: this.pages[l - 2]
20438 });
20439 } // TODO: 書き直す
20440
20441 }, {
20442 key: "_createPageElement",
20443 value: function _createPageElement(templateHTML) {
20444 var pageElement = util$4.createElement(internal$1.normalizePageHTML(templateHTML));
20445 verifyPageElement(pageElement);
20446 return pageElement;
20447 }
20448 /**
20449 * @property onDeviceBackButton
20450 * @type {Object}
20451 * @description
20452 * [en]Back-button handler.[/en]
20453 * [ja]バックボタンハンドラ。[/ja]
20454 */
20455
20456 }, {
20457 key: "onDeviceBackButton",
20458 get: function get() {
20459 return this._backButtonHandler;
20460 },
20461 set: function set(callback) {
20462 if (this._backButtonHandler) {
20463 this._backButtonHandler.destroy();
20464 }
20465
20466 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
20467 }
20468 /**
20469 * @property topPage
20470 * @readonly
20471 * @type {HTMLElement}
20472 * @description
20473 * [en]Current top page element. Use this method to access options passed by `pushPage()`-like methods.[/en]
20474 * [ja]現在のページを取得します。pushPage()やresetToPage()メソッドの引数を取得できます。[/ja]
20475 */
20476
20477 }, {
20478 key: "topPage",
20479 get: function get() {
20480 var last = this.lastElementChild;
20481
20482 while (last && last.tagName !== 'ONS-PAGE') {
20483 last = last.previousElementSibling;
20484 }
20485
20486 return last;
20487 }
20488 /**
20489 * @property pages
20490 * @readonly
20491 * @type {Array}
20492 * @description
20493 * [en]Copy of the navigator's page stack.[/en]
20494 * [ja][/ja]
20495 */
20496
20497 }, {
20498 key: "pages",
20499 get: function get() {
20500 return util$4.arrayFrom(this.children).filter(function (element) {
20501 return element.tagName === 'ONS-PAGE';
20502 });
20503 }
20504 /**
20505 * @property onSwipe
20506 * @type {Function}
20507 * @description
20508 * [en]Hook called whenever the user slides the navigator (swipe-to-pop). It gets a decimal ratio (0-1) and an animationOptions object as arguments.[/en]
20509 * [ja][/ja]
20510 */
20511
20512 }, {
20513 key: "onSwipe",
20514 get: function get() {
20515 return this._onSwipe;
20516 },
20517 set: function set(value) {
20518 if (value && !(value instanceof Function)) {
20519 util$4.throw('"onSwipe" must be a function');
20520 }
20521
20522 this._onSwipe = value;
20523 }
20524 /**
20525 * @property options
20526 * @type {Object}
20527 * @description
20528 * [en]Default options object. Attributes have priority over this property.[/en]
20529 * [ja][/ja]
20530 */
20531
20532 /**
20533 * @property options.animation
20534 * @type {String}
20535 * @description
20536 * [en]
20537 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
20538 * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
20539 * [/en]
20540 * [ja][/ja]
20541 */
20542
20543 /**
20544 * @property options.animationOptions
20545 * @type {String}
20546 * @description
20547 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
20548 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
20549 */
20550
20551 /**
20552 * @property options.callback
20553 * @type {String}
20554 * @description
20555 * [en]Function that is called when the transition has ended.[/en]
20556 * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
20557 */
20558
20559 }, {
20560 key: "options",
20561 get: function get() {
20562 return this._options;
20563 },
20564 set: function set(object) {
20565 this._options = object;
20566 }
20567 }, {
20568 key: "animationOptions",
20569 get: function get() {
20570 return this.hasAttribute('animation-options') ? AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options')) : {};
20571 },
20572 set: function set(value) {
20573 if (value === undefined || value === null) {
20574 this.removeAttribute('animation-options');
20575 } else {
20576 this.setAttribute('animation-options', JSON.stringify(value));
20577 }
20578 }
20579 }, {
20580 key: "_isRunning",
20581 get: function get() {
20582 return JSON.parse(this.getAttribute('_is-running'));
20583 },
20584 set: function set(value) {
20585 this.setAttribute('_is-running', value ? 'true' : 'false');
20586 }
20587 }, {
20588 key: "_show",
20589 value: function _show() {
20590 var _this11 = this;
20591
20592 this.loaded.then(function () {
20593 return _this11.topPage && _this11.topPage._show();
20594 });
20595 }
20596 }, {
20597 key: "_hide",
20598 value: function _hide() {
20599 this.topPage && this.topPage._hide();
20600 }
20601 }, {
20602 key: "_destroy",
20603 value: function _destroy() {
20604 for (var i = this.pages.length - 1; i >= 0; i--) {
20605 this._pageLoader.unload(this.pages[i]);
20606 }
20607
20608 this.remove();
20609 }
20610 /**
20611 * @param {String} name
20612 * @param {Function} Animator
20613 */
20614
20615 }], [{
20616 key: "observedAttributes",
20617 get: function get() {
20618 return ['animation', 'swipeable'];
20619 }
20620 }, {
20621 key: "registerAnimator",
20622 value: function registerAnimator(name, Animator) {
20623 if (!(Animator.prototype instanceof NavigatorAnimator)) {
20624 util$4.throwAnimator('Navigator');
20625 }
20626
20627 _animatorDict$3[name] = Animator;
20628 }
20629 }, {
20630 key: "animators",
20631 get: function get() {
20632 return _animatorDict$3;
20633 }
20634 }, {
20635 key: "NavigatorAnimator",
20636 get: function get() {
20637 return NavigatorAnimator;
20638 }
20639 }, {
20640 key: "events",
20641 get: function get() {
20642 return ['prepush', 'postpush', 'prepop', 'postpop', 'swipe'];
20643 }
20644 }, {
20645 key: "rewritables",
20646 get: function get() {
20647 return rewritables$3;
20648 }
20649 }]);
20650
20651 return NavigatorElement;
20652 }(BaseElement);
20653 onsElements.Navigator = NavigatorElement;
20654 customElements.define('ons-navigator', NavigatorElement);
20655
20656 var defaultClassName$7 = 'toolbar';
20657 var scheme$d = {
20658 '': 'toolbar--*',
20659 '.toolbar__left': 'toolbar--*__left',
20660 '.toolbar__center': 'toolbar--*__center',
20661 '.toolbar__right': 'toolbar--*__right'
20662 };
20663 /**
20664 * @element ons-toolbar
20665 * @category page
20666 * @modifier material
20667 * [en]Material Design toolbar.[/en]
20668 * [ja][/ja]
20669 * @modifier transparent
20670 * [en]Transparent toolbar.[/en]
20671 * [ja]透明な背景を持つツールバーを表示します。[/ja]
20672 * @modifier cover-content
20673 * [en]Displays the toolbar on top of the page's content. Should be combined with `transparent` modifier.[/en]
20674 * [ja][/ja]
20675 * @modifier noshadow
20676 * [en]Toolbar without shadow.[/en]
20677 * [ja]ツールバーに影を付けずに表示します。[/ja]
20678 * @description
20679 * [en]
20680 * Toolbar component that can be used with navigation.
20681 *
20682 * Left, center and right containers can be specified by class names.
20683 *
20684 * This component will automatically display as a Material Design toolbar when running on Android devices.
20685 * [/en]
20686 * [ja]ナビゲーションで使用するツールバー用コンポーネントです。クラス名により、左、中央、右のコンテナを指定できます。[/ja]
20687 * @codepen aHmGL
20688 * @tutorial vanilla/Reference/toolbar
20689 * @guide compilation.html#toolbar-compilation [en]Adding a toolbar[/en][ja]ツールバーの追加[/ja]
20690 * @seealso ons-bottom-toolbar
20691 * [en]The `<ons-bottom-toolbar>` displays a toolbar on the bottom of the page.[/en]
20692 * [ja]ons-bottom-toolbarコンポーネント[/ja]
20693 * @seealso ons-back-button
20694 * [en]The `<ons-back-button>` component displays a back button inside the toolbar.[/en]
20695 * [ja]ons-back-buttonコンポーネント[/ja]
20696 * @seealso ons-toolbar-button
20697 * [en]The `<ons-toolbar-button>` component displays a toolbar button inside the toolbar.[/en]
20698 * [ja]ons-toolbar-buttonコンポーネント[/ja]
20699 * @example
20700 * <ons-page>
20701 * <ons-toolbar>
20702 * <div class="left">
20703 * <ons-back-button>
20704 * Back
20705 * </ons-back-button>
20706 * </div>
20707 * <div class="center">
20708 * Title
20709 * </div>
20710 * <div class="right">
20711 * <ons-toolbar-button>
20712 * <ons-icon icon="md-menu"></ons-icon>
20713 * </ons-toolbar-button>
20714 * </div>
20715 * </ons-toolbar>
20716 * </ons-page>
20717 */
20718
20719 var ToolbarElement = /*#__PURE__*/function (_BaseElement) {
20720 _inherits(ToolbarElement, _BaseElement);
20721
20722 var _super = _createSuper(ToolbarElement);
20723
20724 /**
20725 * @attribute inline
20726 * @initonly
20727 * @description
20728 * [en]Display the toolbar as an inline element.[/en]
20729 * [ja]ツールバーをインラインに置きます。スクロール領域内にそのまま表示されます。[/ja]
20730 */
20731
20732 /**
20733 * @attribute static
20734 * @description
20735 * [en]Static toolbars are not animated by `ons-navigator` when pushing or popping pages. This can be useful to improve performance in some situations.[/en]
20736 * [ja][/ja]
20737 */
20738
20739 /**
20740 * @property static
20741 * @type {Boolean}
20742 * @description
20743 * [en]Static toolbars are not animated by `ons-navigator` when pushing or popping pages. This can be useful to improve performance in some situations.[/en]
20744 * [ja][/ja]
20745 */
20746
20747 /**
20748 * @attribute modifier
20749 * @description
20750 * [en]The appearance of the toolbar.[/en]
20751 * [ja]ツールバーの表現を指定します。[/ja]
20752 */
20753
20754 /**
20755 * @property visible
20756 * @description
20757 * [en]Whether the toolbar is shown or not.[/en]
20758 * [ja][/ja]
20759 */
20760 function ToolbarElement() {
20761 var _this;
20762
20763 _classCallCheck(this, ToolbarElement);
20764
20765 _this = _super.call(this);
20766 _this._visible = true;
20767 contentReady(_assertThisInitialized(_this), function () {
20768 _this._compile();
20769 });
20770 return _this;
20771 }
20772
20773 _createClass(ToolbarElement, [{
20774 key: "attributeChangedCallback",
20775 value: function attributeChangedCallback(name, last, current) {
20776 switch (name) {
20777 case 'class':
20778 util$4.restoreClass(this, defaultClassName$7, scheme$d);
20779 break;
20780
20781 case 'modifier':
20782 ModifierUtil.onModifierChanged(last, current, this, scheme$d);
20783 break;
20784 }
20785 }
20786 /**
20787 * @method setVisibility
20788 * @signature setVisibility(visible)
20789 * @param {Boolean} visible
20790 * [en]Set to true to show the toolbar, false to hide it[/en]
20791 * [ja][/ja]
20792 * @description
20793 * [en]Shows the toolbar if visible is true, otherwise hides it.[/en]
20794 * [ja][/ja]
20795 */
20796
20797 }, {
20798 key: "setVisibility",
20799 value: function setVisibility(visible) {
20800 var _this2 = this;
20801
20802 contentReady(this, function () {
20803 _this2._visible = visible;
20804 _this2.style.display = visible ? '' : 'none';
20805
20806 if (_this2.parentNode) {
20807 var siblingBackground = util$4.findChild(_this2.parentNode, '.page__background');
20808
20809 if (siblingBackground) {
20810 siblingBackground.style.top = visible ? null : 0;
20811 }
20812
20813 var siblingContent = util$4.findChild(_this2.parentNode, '.page__content');
20814
20815 if (siblingContent) {
20816 siblingContent.style.top = visible ? null : 0;
20817 }
20818 }
20819 });
20820 }
20821 /**
20822 * @method show
20823 * @signature show()
20824 * @description
20825 * [en]Show the toolbar.[/en]
20826 * [ja][/ja]
20827 */
20828
20829 }, {
20830 key: "show",
20831 value: function show() {
20832 this.setVisibility(true);
20833 }
20834 /**
20835 * @method hide
20836 * @signature hide()
20837 * @description
20838 * [en]Hide the toolbar.[/en]
20839 * [ja][/ja]
20840 */
20841
20842 }, {
20843 key: "hide",
20844 value: function hide() {
20845 this.setVisibility(false);
20846 }
20847 }, {
20848 key: "visible",
20849 get: function get() {
20850 return this._visible;
20851 },
20852 set: function set(value) {
20853 this.setVisibility(value);
20854 }
20855 /**
20856 * @return {HTMLElement}
20857 */
20858
20859 }, {
20860 key: "_getToolbarLeftItemsElement",
20861 value: function _getToolbarLeftItemsElement() {
20862 return this.querySelector('.left') || internal$1.nullElement;
20863 }
20864 /**
20865 * @return {HTMLElement}
20866 */
20867
20868 }, {
20869 key: "_getToolbarCenterItemsElement",
20870 value: function _getToolbarCenterItemsElement() {
20871 return this.querySelector('.center') || internal$1.nullElement;
20872 }
20873 /**
20874 * @return {HTMLElement}
20875 */
20876
20877 }, {
20878 key: "_getToolbarRightItemsElement",
20879 value: function _getToolbarRightItemsElement() {
20880 return this.querySelector('.right') || internal$1.nullElement;
20881 }
20882 /**
20883 * @return {HTMLElement}
20884 */
20885
20886 }, {
20887 key: "_getToolbarBackButtonLabelElement",
20888 value: function _getToolbarBackButtonLabelElement() {
20889 return this.querySelector('ons-back-button .back-button__label') || internal$1.nullElement;
20890 }
20891 /**
20892 * @return {HTMLElement}
20893 */
20894
20895 }, {
20896 key: "_getToolbarBackButtonIconElement",
20897 value: function _getToolbarBackButtonIconElement() {
20898 return this.querySelector('ons-back-button .back-button__icon') || internal$1.nullElement;
20899 }
20900 }, {
20901 key: "_compile",
20902 value: function _compile() {
20903 autoStyle.prepare(this);
20904 this.classList.add(defaultClassName$7);
20905
20906 this._ensureToolbarItemElements();
20907
20908 ModifierUtil.initModifier(this, scheme$d);
20909 }
20910 }, {
20911 key: "_ensureToolbarItemElements",
20912 value: function _ensureToolbarItemElements() {
20913 for (var i = this.childNodes.length - 1; i >= 0; i--) {
20914 // case of not element
20915 if (this.childNodes[i].nodeType != 1) {
20916 this.removeChild(this.childNodes[i]);
20917 }
20918 }
20919
20920 var center = this._ensureToolbarElement('center');
20921
20922 center.classList.add('toolbar__title');
20923
20924 if (this.children.length !== 1 || !this.children[0].classList.contains('center')) {
20925 var left = this._ensureToolbarElement('left');
20926
20927 var right = this._ensureToolbarElement('right');
20928
20929 if (this.children[0] !== left || this.children[1] !== center || this.children[2] !== right) {
20930 this.appendChild(left);
20931 this.appendChild(center);
20932 this.appendChild(right);
20933 }
20934 }
20935 }
20936 }, {
20937 key: "_ensureToolbarElement",
20938 value: function _ensureToolbarElement(name) {
20939 if (util$4.findChild(this, '.toolbar__' + name)) {
20940 var _element = util$4.findChild(this, '.toolbar__' + name);
20941
20942 _element.classList.add(name);
20943
20944 return _element;
20945 }
20946
20947 var element = util$4.findChild(this, '.' + name) || util$4.create('.' + name);
20948 element.classList.add('toolbar__' + name);
20949 return element;
20950 }
20951 }], [{
20952 key: "observedAttributes",
20953 get: function get() {
20954 return ['modifier', 'class'];
20955 }
20956 }]);
20957
20958 return ToolbarElement;
20959 }(BaseElement);
20960 util$4.defineBooleanProperties(ToolbarElement, ['static']);
20961 onsElements.Toolbar = ToolbarElement;
20962 customElements.define('ons-toolbar', ToolbarElement);
20963
20964 var defaultClassName$6 = 'page';
20965 var scheme$c = {
20966 '': 'page--*',
20967 '.page__content': 'page--*__content',
20968 '.page__background': 'page--*__background'
20969 };
20970 /**
20971 * @element ons-page
20972 * @category page
20973 * @modifier material
20974 * [en]Material Design style[/en]
20975 * [ja][/ja]
20976 * @description
20977 * [en]
20978 * This component defines the root of each page. If the content is large it will become scrollable.
20979 *
20980 * A navigation bar can be added to the top of the page using the `<ons-toolbar>` element.
20981 * [/en]
20982 * [ja]ページ定義のためのコンポーネントです。このコンポーネントの内容はスクロールが許可されます。[/ja]
20983 * @tutorial vanilla/Reference/page
20984 * @guide lifecycle.html#events
20985 * [en]Overview of page events[/en]
20986 * [ja]Overview of page events[/ja]
20987 * @guide fundamentals.html#managing-pages
20988 * [en]Managing multiple pages[/en]
20989 * [ja]複数のページを管理する[/ja]
20990 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
20991 * @seealso ons-toolbar
20992 * [en]Use the `<ons-toolbar>` element to add a navigation bar to the top of the page.[/en]
20993 * [ja][/ja]
20994 * @example
20995 * <ons-page>
20996 * <ons-toolbar>
20997 * <div class="left">
20998 * <ons-back-button>Back</ons-back-button>
20999 * </div>
21000 * <div class="center">Title</div>
21001 * <div class="right">
21002 * <ons-toolbar-button>
21003 * <ons-icon icon="md-menu"></ons-icon>
21004 * </ons-toolbar-button>
21005 * </div>
21006 * </ons-toolbar>
21007 *
21008 * <p>Page content</p>
21009 * </ons-page>
21010 *
21011 * @example
21012 * <script>
21013 * myApp.handler = function(done) {
21014 * loadMore().then(done);
21015 * }
21016 * </script>
21017 *
21018 * <ons-page on-infinite-scroll="myApp.handler">
21019 * <ons-toolbar>
21020 * <div class="center">List</div>
21021 * </ons-toolbar>
21022 *
21023 * <ons-list>
21024 * <ons-list-item>#1</ons-list-item>
21025 * <ons-list-item>#2</ons-list-item>
21026 * <ons-list-item>#3</ons-list-item>
21027 * ...
21028 * </ons-list>
21029 * </ons-page>
21030 */
21031
21032 var PageElement = /*#__PURE__*/function (_BaseElement) {
21033 _inherits(PageElement, _BaseElement);
21034
21035 var _super = _createSuper(PageElement);
21036
21037 /**
21038 * @event init
21039 * @description
21040 * [en]Fired right after the page is attached.[/en]
21041 * [ja]ページがアタッチされた後に発火します。[/ja]
21042 * @param {Object} event [en]Event object.[/en]
21043 */
21044
21045 /**
21046 * @event show
21047 * @description
21048 * [en]Fired right after the page is shown.[/en]
21049 * [ja]ページが表示された後に発火します。[/ja]
21050 * @param {Object} event [en]Event object.[/en]
21051 */
21052
21053 /**
21054 * @event hide
21055 * @description
21056 * [en]Fired right after the page is hidden.[/en]
21057 * [ja]ページが隠れた後に発火します。[/ja]
21058 * @param {Object} event [en]Event object.[/en]
21059 */
21060
21061 /**
21062 * @event destroy
21063 * @description
21064 * [en]Fired right before the page is destroyed.[/en]
21065 * [ja]ページが破棄される前に発火します。[/ja]
21066 * @param {Object} event [en]Event object.[/en]
21067 */
21068
21069 /**
21070 * @attribute modifier
21071 * @type {String}
21072 * @description
21073 * [en]Specify modifier name to specify custom styles.[/en]
21074 * [ja]スタイル定義をカスタマイズするための名前を指定します。[/ja]
21075 */
21076
21077 /**
21078 * @attribute on-infinite-scroll
21079 * @type {String}
21080 * @description
21081 * [en]Path of the function to be executed on infinite scrolling. Example: `app.loadData`. The function receives a done callback that must be called when it's finished.[/en]
21082 * [ja][/ja]
21083 */
21084 function PageElement() {
21085 var _this;
21086
21087 _classCallCheck(this, PageElement);
21088
21089 _this = _super.call(this);
21090
21091 _this._deriveHooks();
21092
21093 _this._defaultClassName = defaultClassName$6;
21094
21095 _this.classList.add(defaultClassName$6);
21096
21097 _this._initialized = false;
21098 contentReady(_assertThisInitialized(_this), function () {
21099 _this._compile();
21100
21101 _this._isShown = false;
21102 _this._contentElement = _this._getContentElement();
21103 _this._backgroundElement = _this._getBackgroundElement();
21104 });
21105 return _this;
21106 }
21107
21108 _createClass(PageElement, [{
21109 key: "_compile",
21110 value: function _compile() {
21111 var _this2 = this;
21112
21113 autoStyle.prepare(this);
21114 var toolbar = util$4.findChild(this, 'ons-toolbar');
21115 var background = util$4.findChild(this, '.page__background') || util$4.findChild(this, '.background') || document.createElement('div');
21116 background.classList.add('page__background');
21117 this.insertBefore(background, !toolbar && this.firstChild || toolbar && toolbar.nextSibling);
21118 var content = util$4.findChild(this, '.page__content') || util$4.findChild(this, '.content') || document.createElement('div');
21119 content.classList.add('page__content');
21120
21121 if (!content.parentElement) {
21122 util$4.arrayFrom(this.childNodes).forEach(function (node) {
21123 if (node.nodeType !== 1 || _this2._elementShouldBeMoved(node)) {
21124 content.appendChild(node); // Can trigger detached connectedCallbacks
21125 }
21126 });
21127 }
21128
21129 this._tryToFillStatusBar(content); // Must run before child pages try to fill status bar.
21130
21131
21132 this.insertBefore(content, background.nextSibling); // Can trigger attached connectedCallbacks
21133
21134 if ((!toolbar || !util$4.hasModifier(toolbar, 'transparent')) && content.children.length === 1 && util$4.isPageControl(content.children[0])) {
21135 this._defaultClassName += ' page--wrapper';
21136 this.attributeChangedCallback('class');
21137 }
21138
21139 var bottomToolbar = util$4.findChild(this, 'ons-bottom-toolbar');
21140
21141 if (bottomToolbar) {
21142 this._defaultClassName += ' page-with-bottom-toolbar';
21143 this.attributeChangedCallback('class');
21144 }
21145
21146 ModifierUtil.initModifier(this, scheme$c);
21147 }
21148 }, {
21149 key: "_elementShouldBeMoved",
21150 value: function _elementShouldBeMoved(el) {
21151 if (el.classList.contains('page__background')) {
21152 return false;
21153 }
21154
21155 var tagName = el.tagName.toLowerCase();
21156
21157 if (tagName === 'ons-fab') {
21158 return !el.hasAttribute('position');
21159 }
21160
21161 var fixedElements = ['script', 'ons-toolbar', 'ons-bottom-toolbar', 'ons-modal', 'ons-speed-dial', 'ons-dialog', 'ons-alert-dialog', 'ons-popover', 'ons-action-sheet'];
21162 return el.hasAttribute('inline') || fixedElements.indexOf(tagName) === -1;
21163 }
21164 }, {
21165 key: "_tryToFillStatusBar",
21166 value: function _tryToFillStatusBar() {
21167 var _this3 = this;
21168
21169 var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._contentElement;
21170 internal$1.autoStatusBarFill(function () {
21171 util$4.toggleAttribute(_this3, 'status-bar-fill', !util$4.findParent(_this3, function (e) {
21172 return e.hasAttribute('status-bar-fill');
21173 }) // Not already filled
21174 && (_this3._canAnimateToolbar(content) || !util$4.findChild(content, util$4.isPageControl)) // Has toolbar or cannot delegate
21175 );
21176 });
21177 }
21178 }, {
21179 key: "_canAnimateToolbar",
21180 value: function _canAnimateToolbar() {
21181 var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._contentElement;
21182
21183 if (util$4.findChild(this, 'ons-toolbar')) {
21184 return true;
21185 }
21186
21187 return !!util$4.findChild(content, function (el) {
21188 return util$4.match(el, 'ons-toolbar') && !el.hasAttribute('inline');
21189 });
21190 }
21191 }, {
21192 key: "connectedCallback",
21193 value: function connectedCallback() {
21194 var _this4 = this;
21195
21196 if (!util$4.isAttached(this)) {
21197 // Avoid detached calls
21198 return;
21199 }
21200
21201 contentReady(this, function () {
21202 _this4._tryToFillStatusBar(); // Ensure status bar when the element was compiled before connected
21203
21204
21205 if (_this4.hasAttribute('on-infinite-scroll')) {
21206 _this4.attributeChangedCallback('on-infinite-scroll', null, _this4.getAttribute('on-infinite-scroll'));
21207 }
21208
21209 if (!_this4._initialized) {
21210 _this4._initialized = true;
21211 setImmediate(function () {
21212 _this4.onInit && _this4.onInit();
21213 util$4.triggerElementEvent(_this4, 'init');
21214 });
21215
21216 if (!util$4.hasAnyComponentAsParent(_this4)) {
21217 setImmediate(function () {
21218 return _this4._show();
21219 });
21220 }
21221 }
21222 });
21223 }
21224 }, {
21225 key: "updateBackButton",
21226 value: function updateBackButton(show) {
21227 if (this.backButton) {
21228 show ? this.backButton.show() : this.backButton.hide();
21229 }
21230 }
21231 }, {
21232 key: "name",
21233 get: function get() {
21234 return this.getAttribute('name');
21235 },
21236 set: function set(str) {
21237 this.setAttribute('name', str);
21238 }
21239 }, {
21240 key: "backButton",
21241 get: function get() {
21242 return this.querySelector('ons-back-button');
21243 }
21244 /**
21245 * @property onInfiniteScroll
21246 * @description
21247 * [en]Function to be executed when scrolling to the bottom of the page. The function receives a done callback as an argument that must be called when it's finished.[/en]
21248 * [ja][/ja]
21249 */
21250
21251 }, {
21252 key: "onInfiniteScroll",
21253 get: function get() {
21254 return this._onInfiniteScroll;
21255 },
21256 set: function set(value) {
21257 var _this5 = this;
21258
21259 if (value && !(value instanceof Function)) {
21260 util$4.throw('"onInfiniteScroll" must be function or null');
21261 }
21262
21263 contentReady(this, function () {
21264 if (!value) {
21265 _this5._contentElement.removeEventListener('scroll', _this5._boundOnScroll);
21266 } else if (!_this5._onInfiniteScroll) {
21267 _this5._infiniteScrollLimit = 0.9;
21268 _this5._boundOnScroll = _this5._onScroll.bind(_this5);
21269 setImmediate(function () {
21270 return _this5._contentElement.addEventListener('scroll', _this5._boundOnScroll);
21271 });
21272 }
21273
21274 _this5._onInfiniteScroll = value;
21275 });
21276 }
21277 }, {
21278 key: "_onScroll",
21279 value: function _onScroll() {
21280 var _this6 = this;
21281
21282 var c = this._contentElement,
21283 overLimit = (c.scrollTop + c.clientHeight) / c.scrollHeight >= this._infiniteScrollLimit;
21284
21285 if (this._onInfiniteScroll && !this._loadingContent && overLimit) {
21286 this._loadingContent = true;
21287
21288 this._onInfiniteScroll(function () {
21289 return _this6._loadingContent = false;
21290 });
21291 }
21292 }
21293 /**
21294 * @property onDeviceBackButton
21295 * @type {Object}
21296 * @description
21297 * [en]Back-button handler.[/en]
21298 * [ja]バックボタンハンドラ。[/ja]
21299 */
21300
21301 }, {
21302 key: "onDeviceBackButton",
21303 get: function get() {
21304 return this._backButtonHandler;
21305 },
21306 set: function set(callback) {
21307 if (this._backButtonHandler) {
21308 this._backButtonHandler.destroy();
21309 }
21310
21311 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
21312 }
21313 }, {
21314 key: "scrollTop",
21315 get: function get() {
21316 return this._contentElement.scrollTop;
21317 },
21318 set: function set(newValue) {
21319 this._contentElement.scrollTop = newValue;
21320 }
21321 }, {
21322 key: "_getContentElement",
21323 value: function _getContentElement() {
21324 var result = util$4.findChild(this, '.page__content');
21325
21326 if (result) {
21327 return result;
21328 }
21329
21330 util$4.throw('Fail to get ".page__content" element');
21331 }
21332 }, {
21333 key: "_getBackgroundElement",
21334 value: function _getBackgroundElement() {
21335 var result = util$4.findChild(this, '.page__background');
21336
21337 if (result) {
21338 return result;
21339 }
21340
21341 util$4.throw('Fail to get ".page__background" element');
21342 }
21343 }, {
21344 key: "_getBottomToolbarElement",
21345 value: function _getBottomToolbarElement() {
21346 return util$4.findChild(this, 'ons-bottom-toolbar') || internal$1.nullElement;
21347 }
21348 }, {
21349 key: "_getToolbarElement",
21350 value: function _getToolbarElement() {
21351 return util$4.findChild(this, 'ons-toolbar') || document.createElement('ons-toolbar');
21352 }
21353 }, {
21354 key: "attributeChangedCallback",
21355 value: function attributeChangedCallback(name, last, current) {
21356 var _this7 = this;
21357
21358 switch (name) {
21359 case 'class':
21360 util$4.restoreClass(this, this._defaultClassName, scheme$c);
21361 break;
21362
21363 case 'modifier':
21364 ModifierUtil.onModifierChanged(last, current, this, scheme$c);
21365 break;
21366
21367 case 'on-infinite-scroll':
21368 if (current === null) {
21369 this.onInfiniteScroll = null;
21370 } else {
21371 this.onInfiniteScroll = function (done) {
21372 var f = util$4.findFromPath(current);
21373 _this7.onInfiniteScroll = f;
21374 f(done);
21375 };
21376 }
21377
21378 break;
21379 }
21380 }
21381 }, {
21382 key: "_show",
21383 value: function _show() {
21384 if (!this._isShown && util$4.isAttached(this)) {
21385 this._isShown = true;
21386 this.setAttribute('shown', '');
21387 this.onShow && this.onShow();
21388 util$4.triggerElementEvent(this, 'show');
21389 util$4.propagateAction(this, '_show');
21390 }
21391 }
21392 }, {
21393 key: "_hide",
21394 value: function _hide() {
21395 if (this._isShown) {
21396 this._isShown = false;
21397 this.removeAttribute('shown');
21398 this.onHide && this.onHide();
21399 util$4.triggerElementEvent(this, 'hide');
21400 util$4.propagateAction(this, '_hide');
21401 }
21402 }
21403 }, {
21404 key: "_destroy",
21405 value: function _destroy() {
21406 this._hide();
21407
21408 this.onDestroy && this.onDestroy();
21409 util$4.triggerElementEvent(this, 'destroy');
21410
21411 if (this.onDeviceBackButton) {
21412 this.onDeviceBackButton.destroy();
21413 }
21414
21415 util$4.propagateAction(this, '_destroy');
21416 this.remove();
21417 }
21418 }, {
21419 key: "_deriveHooks",
21420 value: function _deriveHooks() {
21421 var _this8 = this;
21422
21423 this.constructor.events.forEach(function (event) {
21424 var key = 'on' + event.charAt(0).toUpperCase() + event.slice(1);
21425 Object.defineProperty(_this8, key, {
21426 configurable: true,
21427 enumerable: true,
21428 get: function get() {
21429 return _this8["_".concat(key)];
21430 },
21431 set: function set(value) {
21432 if (!(value instanceof Function)) {
21433 util$4.throw("\"".concat(key, "\" hook must be a function"));
21434 }
21435
21436 _this8["_".concat(key)] = value.bind(_this8);
21437 }
21438 });
21439 });
21440 }
21441 }], [{
21442 key: "observedAttributes",
21443 get: function get() {
21444 return ['modifier', 'on-infinite-scroll', 'class'];
21445 }
21446 }, {
21447 key: "events",
21448 get: function get() {
21449 return ['init', 'show', 'hide', 'destroy'];
21450 }
21451 /**
21452 * @property data
21453 * @type {*}
21454 * @description
21455 * [en]User's custom data passed to `pushPage()`-like methods.[/en]
21456 * [ja][/ja]
21457 */
21458
21459 }]);
21460
21461 return PageElement;
21462 }(BaseElement);
21463 onsElements.Page = PageElement;
21464 customElements.define('ons-page', PageElement);
21465
21466 var PopoverAnimator = /*#__PURE__*/function (_BaseAnimator) {
21467 _inherits(PopoverAnimator, _BaseAnimator);
21468
21469 var _super = _createSuper(PopoverAnimator);
21470
21471 /**
21472 * @param {Object} options
21473 * @param {String} options.timing
21474 * @param {Number} options.duration
21475 * @param {Number} options.delay
21476 */
21477 function PopoverAnimator() {
21478 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
21479 _ref$timing = _ref.timing,
21480 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref$timing,
21481 _ref$delay = _ref.delay,
21482 delay = _ref$delay === void 0 ? 0 : _ref$delay,
21483 _ref$duration = _ref.duration,
21484 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
21485
21486 _classCallCheck(this, PopoverAnimator);
21487
21488 return _super.call(this, {
21489 timing: timing,
21490 delay: delay,
21491 duration: duration
21492 });
21493 }
21494
21495 _createClass(PopoverAnimator, [{
21496 key: "show",
21497 value: function show(popover, callback) {
21498 callback();
21499 }
21500 }, {
21501 key: "hide",
21502 value: function hide(popover, callback) {
21503 callback();
21504 }
21505 }, {
21506 key: "_animate",
21507 value: function _animate(element, _ref2) {
21508 var from = _ref2.from,
21509 to = _ref2.to,
21510 options = _ref2.options,
21511 callback = _ref2.callback,
21512 _ref2$restore = _ref2.restore,
21513 restore = _ref2$restore === void 0 ? false : _ref2$restore,
21514 animation = _ref2.animation;
21515 options = util$4.extend({}, this.options, options);
21516
21517 if (animation) {
21518 from = animation.from;
21519 to = animation.to;
21520 }
21521
21522 animation = Animit(element);
21523
21524 if (restore) {
21525 animation = animation.saveStyle();
21526 }
21527
21528 animation = animation.queue(from).wait(this.delay).queue({
21529 css: to,
21530 duration: this.duration,
21531 timing: this.timing
21532 });
21533
21534 if (restore) {
21535 animation = animation.restoreStyle();
21536 }
21537
21538 if (callback) {
21539 animation = animation.queue(function (done) {
21540 callback();
21541 done();
21542 });
21543 }
21544
21545 return animation;
21546 }
21547 }, {
21548 key: "_animateAll",
21549 value: function _animateAll(element, animations) {
21550 var _this = this;
21551
21552 Object.keys(animations).forEach(function (key) {
21553 return _this._animate(element[key], animations[key]).play();
21554 });
21555 }
21556 }]);
21557
21558 return PopoverAnimator;
21559 }(BaseAnimator);
21560 var fade = {
21561 out: {
21562 from: {
21563 opacity: 1.0
21564 },
21565 to: {
21566 opacity: 0
21567 }
21568 },
21569 in: {
21570 from: {
21571 opacity: 0
21572 },
21573 to: {
21574 opacity: 1.0
21575 }
21576 }
21577 };
21578 var MDFadePopoverAnimator = /*#__PURE__*/function (_PopoverAnimator) {
21579 _inherits(MDFadePopoverAnimator, _PopoverAnimator);
21580
21581 var _super2 = _createSuper(MDFadePopoverAnimator);
21582
21583 function MDFadePopoverAnimator() {
21584 _classCallCheck(this, MDFadePopoverAnimator);
21585
21586 return _super2.apply(this, arguments);
21587 }
21588
21589 _createClass(MDFadePopoverAnimator, [{
21590 key: "show",
21591 value: function show(popover, callback) {
21592 this._animateAll(popover, {
21593 _mask: fade.in,
21594 _popover: {
21595 animation: fade.in,
21596 restore: true,
21597 callback: callback
21598 }
21599 });
21600 }
21601 }, {
21602 key: "hide",
21603 value: function hide(popover, callback) {
21604 this._animateAll(popover, {
21605 _mask: fade.out,
21606 _popover: {
21607 animation: fade.out,
21608 restore: true,
21609 callback: callback
21610 }
21611 });
21612 }
21613 }]);
21614
21615 return MDFadePopoverAnimator;
21616 }(PopoverAnimator);
21617 var IOSFadePopoverAnimator = /*#__PURE__*/function (_MDFadePopoverAnimato) {
21618 _inherits(IOSFadePopoverAnimator, _MDFadePopoverAnimato);
21619
21620 var _super3 = _createSuper(IOSFadePopoverAnimator);
21621
21622 function IOSFadePopoverAnimator() {
21623 _classCallCheck(this, IOSFadePopoverAnimator);
21624
21625 return _super3.apply(this, arguments);
21626 }
21627
21628 _createClass(IOSFadePopoverAnimator, [{
21629 key: "show",
21630 value: function show(popover, callback) {
21631 this._animateAll(popover, {
21632 _mask: fade.in,
21633 _popover: {
21634 from: {
21635 transform: 'scale3d(1.3, 1.3, 1.0)',
21636 opacity: 0
21637 },
21638 to: {
21639 transform: 'scale3d(1.0, 1.0, 1.0)',
21640 opacity: 1.0
21641 },
21642 restore: true,
21643 callback: callback
21644 }
21645 });
21646 }
21647 }]);
21648
21649 return IOSFadePopoverAnimator;
21650 }(MDFadePopoverAnimator);
21651
21652 var scheme$b = {
21653 '.popover': 'popover--*',
21654 '.popover-mask': 'popover-mask--*',
21655 '.popover__content': 'popover--*__content',
21656 '.popover__arrow': 'popover--*__arrow'
21657 };
21658 var _animatorDict$2 = {
21659 'default': function _default() {
21660 return platform.isAndroid() ? MDFadePopoverAnimator : IOSFadePopoverAnimator;
21661 },
21662 'none': PopoverAnimator,
21663 'fade-ios': IOSFadePopoverAnimator,
21664 'fade-md': MDFadePopoverAnimator
21665 };
21666 var positions = {
21667 up: 'bottom',
21668 left: 'right',
21669 down: 'top',
21670 right: 'left'
21671 };
21672 /**
21673 * @element ons-popover
21674 * @category dialog
21675 * @description
21676 * [en]
21677 * A component that displays a popover next to an element. The popover can be used to display extra information about a component or a tooltip.
21678 *
21679 * To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createPopover(template)` utility function and the `<template>` tag.
21680 *
21681 * Another common way to use the popover is to display a menu when a button on the screen is tapped. For Material Design, popover looks exactly as a dropdown menu.
21682 * [/en]
21683 * [ja]ある要素を対象とするポップオーバーを表示するコンポーネントです。[/ja]
21684 * @codepen ZYYRKo
21685 * @tutorial vanilla/Reference/popover
21686 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
21687 * @example
21688 * <ons-button onclick="showPopover(this)">
21689 * Click me!
21690 * </ons-button>
21691 *
21692 * <ons-popover direction="down" id="popover">
21693 * <p>This is a popover!</p>
21694 * </ons-popover>
21695 *
21696 * <script>
21697 * var showPopover = function(element) {
21698 * var popover = document.getElementById('popover');
21699 * popover.show(element);
21700 * };
21701 * </script>
21702 */
21703
21704 var PopoverElement = /*#__PURE__*/function (_BaseDialogElement) {
21705 _inherits(PopoverElement, _BaseDialogElement);
21706
21707 var _super = _createSuper(PopoverElement);
21708
21709 /**
21710 * @event preshow
21711 * @description
21712 * [en]Fired just before the popover is displayed.[/en]
21713 * [ja]ポップオーバーが表示される直前に発火します。[/ja]
21714 * @param {Object} event [en]Event object.[/en]
21715 * @param {Object} event.popover
21716 * [en]Component object.[/en]
21717 * [ja]コンポーネントのオブジェクト。[/ja]
21718 * @param {Function} event.cancel
21719 * [en]Call this function to stop the popover from being shown.[/en]
21720 * [ja]この関数を呼び出すと、ポップオーバーの表示がキャンセルされます。[/ja]
21721 */
21722
21723 /**
21724 * @event postshow
21725 * @description
21726 * [en]Fired just after the popover is displayed.[/en]
21727 * [ja]ポップオーバーが表示された直後に発火します。[/ja]
21728 * @param {Object} event [en]Event object.[/en]
21729 * @param {Object} event.popover
21730 * [en]Component object.[/en]
21731 * [ja]コンポーネントのオブジェクト。[/ja]
21732 */
21733
21734 /**
21735 * @event prehide
21736 * @description
21737 * [en]Fired just before the popover is hidden.[/en]
21738 * [ja]ポップオーバーが隠れる直前に発火します。[/ja]
21739 * @param {Object} event [en]Event object.[/en]
21740 * @param {Object} event.popover
21741 * [en]Component object.[/en]
21742 * [ja]コンポーネントのオブジェクト。[/ja]
21743 * @param {Function} event.cancel
21744 * [en]Call this function to stop the popover from being hidden.[/en]
21745 * [ja]この関数を呼び出すと、ポップオーバーが隠れる処理をキャンセルします。[/ja]
21746 */
21747
21748 /**
21749 * @event posthide
21750 * @description
21751 * [en]Fired just after the popover is hidden.[/en]
21752 * [ja]ポップオーバーが隠れた後に発火します。[/ja]
21753 * @param {Object} event [en]Event object.[/en]
21754 * @param {Object} event.popover
21755 * [en]Component object.[/en]
21756 * [ja]コンポーネントのオブジェクト。[/ja]
21757 */
21758
21759 /**
21760 * @event dialogcancel
21761 * @description
21762 * [en]Fired when the popover is canceled.[/en]
21763 * [ja][/ja]
21764 */
21765
21766 /**
21767 * @attribute modifier
21768 * @type {String}
21769 * @description
21770 * [en]The appearance of the popover.[/en]
21771 * [ja]ポップオーバーの表現を指定します。[/ja]
21772 */
21773
21774 /**
21775 * @attribute direction
21776 * @type {String}
21777 * @description
21778 * [en]
21779 * A space separated list of directions. If more than one direction is specified,
21780 * it will be chosen automatically. Valid directions are `"up"`, `"down"`, `"left"` and `"right"`.
21781 * [/en]
21782 * [ja]
21783 * ポップオーバーを表示する方向を空白区切りで複数指定できます。
21784 * 指定できる方向は、"up", "down", "left", "right"の4つです。空白区切りで複数指定することもできます。
21785 * 複数指定された場合、対象とする要素に合わせて指定した値から自動的に選択されます。
21786 * [/ja]
21787 */
21788
21789 /**
21790 * @attribute cancelable
21791 * @description
21792 * [en]If this attribute is set the popover can be closed by tapping the background or by pressing the back button.[/en]
21793 * [ja]この属性があると、ポップオーバーが表示された時に、背景やバックボタンをタップした時にをポップオーバー閉じます。[/ja]
21794 */
21795
21796 /**
21797 * @attribute cover-target
21798 * @description
21799 * [en]If set the popover will cover the target on the screen.[/en]
21800 * [ja][/ja]
21801 */
21802
21803 /**
21804 * @property coverTarget
21805 * @description
21806 * [en]If set the popover will cover the target on the screen.[/en]
21807 * [ja][/ja]
21808 */
21809
21810 /**
21811 * @attribute animation
21812 * @type {String}
21813 * @description
21814 * [en]The animation used when showing an hiding the popover. Can be either `"none"`, `"default"`, `"fade-ios"` or `"fade-md"`.[/en]
21815 * [ja]ポップオーバーを表示する際のアニメーション名を指定します。[/ja]
21816 */
21817
21818 /**
21819 * @attribute animation-options
21820 * @type {Expression}
21821 * @description
21822 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
21823 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
21824 */
21825
21826 /**
21827 * @property animationOptions
21828 * @type {Object}
21829 * @description
21830 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
21831 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
21832 */
21833
21834 /**
21835 * @attribute mask-color
21836 * @type {Color}
21837 * @description
21838 * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
21839 * [ja]背景のマスクの色を指定します。デフォルトは"rgba(0, 0, 0, 0.2)"です。[/ja]
21840 */
21841
21842 /**
21843 * @attribute visible
21844 * @type {Boolean}
21845 * @description
21846 * [en]Whether the popover is visible or not.[/en]
21847 * [ja]要素が見える場合に`true`。[/ja]
21848 */
21849 function PopoverElement() {
21850 var _this;
21851
21852 _classCallCheck(this, PopoverElement);
21853
21854 _this = _super.call(this);
21855 _this._boundOnChange = _this._onChange.bind(_assertThisInitialized(_this));
21856 contentReady(_assertThisInitialized(_this), function () {
21857 _this._compile();
21858
21859 _this.style.display = 'none';
21860 });
21861 return _this;
21862 }
21863
21864 _createClass(PopoverElement, [{
21865 key: "_scheme",
21866 get: function get() {
21867 return scheme$b;
21868 }
21869 }, {
21870 key: "_mask",
21871 get: function get() {
21872 return util$4.findChild(this, '.popover-mask');
21873 }
21874 }, {
21875 key: "_popover",
21876 get: function get() {
21877 return util$4.findChild(this, '.popover');
21878 }
21879 }, {
21880 key: "_content",
21881 get: function get() {
21882 return util$4.findChild(this._popover, '.popover__content');
21883 }
21884 }, {
21885 key: "_arrow",
21886 get: function get() {
21887 return util$4.findChild(this._popover, '.popover__arrow');
21888 }
21889 }, {
21890 key: "_updateAnimatorFactory",
21891 value: function _updateAnimatorFactory() {
21892 return new AnimatorFactory({
21893 animators: _animatorDict$2,
21894 baseClass: PopoverAnimator,
21895 baseClassName: 'PopoverAnimator',
21896 defaultAnimation: this.getAttribute('animation') || 'default'
21897 });
21898 }
21899 }, {
21900 key: "_toggleStyle",
21901 value: function _toggleStyle(shouldShow) {
21902 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
21903
21904 if (shouldShow) {
21905 this.style.display = 'block';
21906 this._currentTarget = options.target;
21907
21908 this._positionPopover(options.target);
21909 } else {
21910 this.style.display = 'none';
21911
21912 this._clearStyles();
21913 }
21914 }
21915 }, {
21916 key: "_positionPopover",
21917 value: function _positionPopover(target) {
21918 var radius = this._radius,
21919 contentElement = this._content,
21920 margin = this._margin;
21921 var safeAreaLengths = iPhoneXPatch.getSafeAreaLengths();
21922 var safeAreaRect = iPhoneXPatch.getSafeAreaDOMRect();
21923 var targetRect = target.getBoundingClientRect();
21924 var isMD = util$4.hasModifier(this, 'material');
21925 var cover = isMD && this.hasAttribute('cover-target');
21926 var parent = util$4.findParent(this, 'ons-page') || document.body;
21927 var parentDimensions = parent.getBoundingClientRect();
21928 var maxPositions = {
21929 top: Math.max(parentDimensions.top, safeAreaRect.top),
21930 left: Math.max(parentDimensions.left, safeAreaRect.left),
21931 bottom: Math.min(parentDimensions.bottom, safeAreaRect.bottom),
21932 right: Math.min(parentDimensions.right, safeAreaRect.right)
21933 }; // Distance from each side of the safe area (with margin) to the target element
21934
21935 var targetDistance = {
21936 top: targetRect.top - (maxPositions.top + margin),
21937 left: targetRect.left - (maxPositions.left + margin),
21938 bottom: maxPositions.bottom - margin - targetRect.bottom,
21939 right: maxPositions.right - margin - targetRect.right
21940 }; // Distance from each side of the safe area (with margin) to the geometric center of the target element
21941
21942 var targetCenterDistanceFrom = {
21943 top: targetRect.top + Math.round(targetRect.height / 2) - (maxPositions.top + margin),
21944 left: targetRect.left + Math.round(targetRect.width / 2) - (maxPositions.left + margin),
21945 bottom: maxPositions.bottom - margin - targetRect.bottom + Math.round(targetRect.height / 2),
21946 right: maxPositions.right - margin - targetRect.right + Math.round(targetRect.width / 2)
21947 };
21948
21949 var _this$_calculateDirec = this._calculateDirections(targetDistance),
21950 vertical = _this$_calculateDirec.vertical,
21951 primaryDirection = _this$_calculateDirec.primary,
21952 secondaryDirection = _this$_calculateDirec.secondary;
21953
21954 this._currentDirection = primaryDirection;
21955 util$4.addModifier(this, primaryDirection);
21956 var sizeName = vertical ? 'width' : 'height'; // Get .popover__content size
21957
21958 var contentSize = function (style) {
21959 return {
21960 width: parseInt(style.getPropertyValue('width'), 10),
21961 height: parseInt(style.getPropertyValue('height'), 10)
21962 };
21963 }(window.getComputedStyle(contentElement)); // Setting .popover position.
21964
21965
21966 var targetAndArrowLength = cover ? 0 : (vertical ? targetRect.height : targetRect.width) + (isMD ? 0 : 14);
21967 var primaryOffset = Math.max(safeAreaLengths[primaryDirection] + margin, safeAreaLengths[primaryDirection] + margin + targetDistance[primaryDirection] + targetAndArrowLength);
21968 var secondaryOffset = Math.max(safeAreaLengths[secondaryDirection] + margin, safeAreaLengths[secondaryDirection] + margin + targetCenterDistanceFrom[secondaryDirection] - contentSize[sizeName] / 2);
21969 this._popover.style[primaryDirection] = primaryOffset + 'px';
21970 this._popover.style[secondaryDirection] = secondaryOffset + 'px'; // Setting .popover__arrow position.
21971
21972 this._arrow.style[secondaryDirection] = Math.max(radius, safeAreaLengths[secondaryDirection] + margin + targetCenterDistanceFrom[secondaryDirection] - secondaryOffset) + 'px';
21973 }
21974 }, {
21975 key: "_calculateDirections",
21976 value: function _calculateDirections(distance) {
21977 var options = (this.getAttribute('direction') || 'up down left right').split(/\s+/).map(function (e) {
21978 return positions[e];
21979 });
21980 var primary = options.sort(function (a, b) {
21981 return distance[a] - distance[b];
21982 })[0];
21983 var vertical = 'top' == primary || 'bottom' == primary;
21984 var secondary;
21985
21986 if (vertical) {
21987 secondary = distance.left < distance.right ? 'left' : 'right';
21988 } else {
21989 secondary = distance.top < distance.bottom ? 'top' : 'bottom';
21990 }
21991
21992 return {
21993 vertical: vertical,
21994 primary: primary,
21995 secondary: secondary
21996 };
21997 }
21998 }, {
21999 key: "_clearStyles",
22000 value: function _clearStyles() {
22001 var _this2 = this;
22002
22003 this._currentDirection = null;
22004 ['top', 'bottom', 'left', 'right'].forEach(function (e) {
22005 _this2._arrow.style[e] = _this2._content.style[e] = _this2._popover.style[e] = '';
22006 util$4.removeModifier(_this2, e);
22007 });
22008 }
22009 }, {
22010 key: "_onChange",
22011 value: function _onChange() {
22012 var _this3 = this;
22013
22014 setImmediate(function () {
22015 if (_this3._currentTarget) {
22016 _this3._positionPopover(_this3._currentTarget);
22017 }
22018 });
22019 }
22020 }, {
22021 key: "_compile",
22022 value: function _compile() {
22023 autoStyle.prepare(this);
22024
22025 if (this._popover && this._mask) {
22026 return;
22027 }
22028
22029 var hasDefaultContainer = this._popover && this._content;
22030
22031 if (hasDefaultContainer) {
22032 if (!this._mask) {
22033 var mask = document.createElement('div');
22034 mask.classList.add('popover-mask');
22035 this.insertBefore(mask, this.firstChild);
22036 }
22037
22038 if (!this._arrow) {
22039 var arrow = document.createElement('div');
22040 arrow.classList.add('popover__arrow');
22041
22042 this._popover.appendChild(arrow);
22043 }
22044 } else {
22045 var template = util$4.createFragment("\n <div class=\"popover-mask\"></div>\n <div class=\"popover\">\n <div class=\"popover__content\"></div>\n <div class=\"popover__arrow\"></div>\n </div>\n ");
22046 var content = template.querySelector('.popover__content');
22047
22048 while (this.childNodes[0]) {
22049 content.appendChild(this.childNodes[0]);
22050 }
22051
22052 this.appendChild(template);
22053 } // FIXME!
22054
22055
22056 if (this.hasAttribute('style')) {
22057 this._popover.setAttribute('style', this.getAttribute('style'));
22058
22059 this.removeAttribute('style');
22060 }
22061
22062 ModifierUtil.initModifier(this, this._scheme);
22063 }
22064 /**
22065 * @method show
22066 * @signature show(target, [options])
22067 * @param {String|Event|HTMLElement} target
22068 * [en]Target element. Can be either a CSS selector, an event object or a DOM element. It can be also provided as 'options.target' instead. [/en]
22069 * [ja]ポップオーバーのターゲットとなる要素を指定します。CSSセレクタかeventオブジェクトかDOM要素のいずれかを渡せます。[/ja]
22070 * @param {Object} [options]
22071 * [en]Parameter object.[/en]
22072 * [ja]オプションを指定するオブジェクト。[/ja]
22073 * @param {String} [options.animation]
22074 * [en]Animation name. Use one of `"fade-ios"`, `"fade-md"`, `"none"` and `"default"`.[/en]
22075 * [ja]アニメーション名を指定します。"fade-ios", "fade-md", "none", "default"のいずれかを指定できます。[/ja]
22076 * @param {String} [options.animationOptions]
22077 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
22078 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
22079 * @param {Function} [options.callback]
22080 * [en]This function is called after the popover has been revealed.[/en]
22081 * [ja]ポップオーバーが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
22082 * @description
22083 * [en]Open the popover and point it at a target. The target can be either an event, a CSS selector or a DOM element..[/en]
22084 * [ja]対象とする要素にポップオーバーを表示します。target引数には、$eventオブジェクトやDOMエレメントやCSSセレクタを渡すことが出来ます。[/ja]
22085 * @return {Promise}
22086 * [en]Resolves to the displayed element[/en]
22087 * [ja][/ja]
22088 */
22089
22090 }, {
22091 key: "show",
22092 value: function show(target) {
22093 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
22094
22095 // Copy options and include options.target
22096 if (target && _typeof(target) === 'object' && !(target instanceof Event) && !(target instanceof HTMLElement)) {
22097 options = _objectSpread2({}, target);
22098 } else {
22099 options = _objectSpread2(_objectSpread2({}, options), {}, {
22100 target: target
22101 });
22102 }
22103
22104 if (typeof options.target === 'string') {
22105 options.target = document.querySelector(options.target);
22106 } else if (options.target instanceof Event) {
22107 options.target = options.target.target;
22108 }
22109
22110 if (!(options.target instanceof HTMLElement)) {
22111 util$4.throw('Invalid target type or undefined');
22112 }
22113
22114 return _get(_getPrototypeOf(PopoverElement.prototype), "show", this).call(this, options);
22115 }
22116 /**
22117 * @method hide
22118 * @signature hide([options])
22119 * @param {Object} [options]
22120 * [en]Parameter object.[/en]
22121 * [ja]オプションを指定するオブジェクト。[/ja]
22122 * @param {String} [options.animation]
22123 * [en]Animation name. Use one of `"fade-ios"`, `"fade-md"`, `"none"` and `"default"`.[/en]
22124 * [ja]アニメーション名を指定します。"fade-ios", "fade-md", "none", "default"のいずれかを指定できます。[/ja]
22125 * @param {String} [options.animationOptions]
22126 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
22127 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
22128 * @param {Function} [options.callback]
22129 * [en]This functions is called after the popover has been hidden.[/en]
22130 * [ja]ポップオーバーが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
22131 * @description
22132 * [en]Close the popover.[/en]
22133 * [ja]ポップオーバーを閉じます。[/ja]
22134 * @return {Promise}
22135 * [en]Resolves to the hidden element[/en]
22136 * [ja][/ja]
22137 */
22138
22139 /**
22140 * @property visible
22141 * @type {Boolean}
22142 * @description
22143 * [en]Whether the element is visible or not.[/en]
22144 * [ja]要素が見える場合に`true`。[/ja]
22145 */
22146
22147 /**
22148 * @property cancelable
22149 * @type {Boolean}
22150 * @description
22151 * [en]
22152 * A boolean value that specifies whether the popover is cancelable or not.
22153 *
22154 * When the popover is cancelable it can be closed by tapping the background or by pressing the back button on Android devices.
22155 * [/en]
22156 * [ja][/ja]
22157 */
22158
22159 /**
22160 * @property onDeviceBackButton
22161 * @type {Object}
22162 * @description
22163 * [en]Back-button handler.[/en]
22164 * [ja]バックボタンハンドラ。[/ja]
22165 */
22166
22167 /**
22168 * @property maskColor
22169 * @type {String}
22170 * @default rgba(0, 0, 0, 0.2)
22171 * @description
22172 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
22173 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
22174 */
22175
22176 }, {
22177 key: "connectedCallback",
22178 value: function connectedCallback() {
22179 var _this4 = this;
22180
22181 _get(_getPrototypeOf(PopoverElement.prototype), "connectedCallback", this).call(this);
22182
22183 window.addEventListener('resize', this._boundOnChange, false);
22184 this._margin = this._margin || parseInt(window.getComputedStyle(this).getPropertyValue('top'));
22185 this._margin = this._margin || 6; // Fix for iframes
22186
22187 contentReady(this, function () {
22188 _this4._radius = parseInt(window.getComputedStyle(_this4._content).getPropertyValue('border-top-left-radius'));
22189 });
22190 }
22191 }, {
22192 key: "disconnectedCallback",
22193 value: function disconnectedCallback() {
22194 _get(_getPrototypeOf(PopoverElement.prototype), "disconnectedCallback", this).call(this);
22195
22196 window.removeEventListener('resize', this._boundOnChange, false);
22197 }
22198 }, {
22199 key: "attributeChangedCallback",
22200 value: function attributeChangedCallback(name, last, current) {
22201 if (name === 'direction') {
22202 return this._boundOnChange();
22203 } else if (name === 'modifier') {
22204 this._currentDirection && util$4.addModifier(this, this._currentDirection);
22205 }
22206
22207 _get(_getPrototypeOf(PopoverElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
22208 }
22209 /**
22210 * @param {String} name
22211 * @param {PopoverAnimator} Animator
22212 */
22213
22214 }], [{
22215 key: "observedAttributes",
22216 get: function get() {
22217 return [].concat(_toConsumableArray(_get(_getPrototypeOf(PopoverElement), "observedAttributes", this)), ['direction']);
22218 }
22219 }, {
22220 key: "registerAnimator",
22221 value: function registerAnimator(name, Animator) {
22222 if (!(Animator.prototype instanceof PopoverAnimator)) {
22223 util$4.throwAnimator('Popover');
22224 }
22225
22226 _animatorDict$2[name] = Animator;
22227 }
22228 }, {
22229 key: "animators",
22230 get: function get() {
22231 return _animatorDict$2;
22232 }
22233 }, {
22234 key: "PopoverAnimator",
22235 get: function get() {
22236 return PopoverAnimator;
22237 }
22238 }]);
22239
22240 return PopoverElement;
22241 }(BaseDialogElement);
22242 util$4.defineBooleanProperties(PopoverElement, ['cover-target']);
22243 onsElements.Popover = PopoverElement;
22244 customElements.define('ons-popover', PopoverElement);
22245
22246 var scheme$a = {
22247 '.progress-bar': 'progress-bar--*',
22248 '.progress-bar__primary': 'progress-bar--*__primary',
22249 '.progress-bar__secondary': 'progress-bar--*__secondary'
22250 };
22251 var template$1 = util$4.createElement("\n <div class=\"progress-bar\">\n <div class=\"progress-bar__secondary\"></div>\n <div class=\"progress-bar__primary\"></div>\n </div>\n");
22252 var INDET$1 = 'indeterminate';
22253 /**
22254 * @element ons-progress-bar
22255 * @category visual
22256 * @modifier material
22257 * [en]Display a Material Design progress bar.[/en]
22258 * [ja]マテリアルデザインのスタイルでプログレスバーを表示します。[/ja]
22259 * @description
22260 * [en]
22261 * The component is used to display a linear progress bar. It can either display a progress bar that shows the user how much of a task has been completed. In the case where the percentage is not known it can be used to display an animated progress bar so the user can see that an operation is in progress.
22262 * [/en]
22263 * [ja][/ja]
22264 * @codepen zvQbGj
22265 * @tutorial vanilla/Reference/progress
22266 * @seealso ons-progress-circular
22267 * [en]The `<ons-progress-circular>` component displays a circular progress indicator.[/en]
22268 * [ja][/ja]
22269 * @example
22270 * <ons-progress-bar
22271 * value="55"
22272 * secondary-value="87">
22273 * </ons-progress-bar>
22274 *
22275 * <ons-progress-bar
22276 * indeterminate>
22277 * </ons-progress-bar>
22278 */
22279
22280 var ProgressBarElement = /*#__PURE__*/function (_BaseElement) {
22281 _inherits(ProgressBarElement, _BaseElement);
22282
22283 var _super = _createSuper(ProgressBarElement);
22284
22285 /**
22286 * @attribute modifier
22287 * @type {String}
22288 * @description
22289 * [en]Change the appearance of the progress indicator.[/en]
22290 * [ja]プログレスインジケータの見た目を変更します。[/ja]
22291 */
22292
22293 /**
22294 * @attribute value
22295 * @type {Number}
22296 * @description
22297 * [en]Current progress. Should be a value between 0 and 100.[/en]
22298 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22299 */
22300
22301 /**
22302 * @attribute secondary-value
22303 * @type {Number}
22304 * @description
22305 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
22306 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22307 */
22308
22309 /**
22310 * @attribute indeterminate
22311 * @description
22312 * [en]If this attribute is set, an infinite looping animation will be shown.[/en]
22313 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
22314 */
22315 function ProgressBarElement() {
22316 var _this;
22317
22318 _classCallCheck(this, ProgressBarElement);
22319
22320 _this = _super.call(this);
22321 contentReady(_assertThisInitialized(_this), function () {
22322 return _this._compile();
22323 });
22324 return _this;
22325 }
22326
22327 _createClass(ProgressBarElement, [{
22328 key: "_compile",
22329 value: function _compile() {
22330 if (!this._isCompiled()) {
22331 this._template = template$1.cloneNode(true);
22332 } else {
22333 this._template = util$4.findChild(this, '.progress-bar');
22334 }
22335
22336 this._primary = util$4.findChild(this._template, '.progress-bar__primary');
22337 this._secondary = util$4.findChild(this._template, '.progress-bar__secondary');
22338
22339 this._updateDeterminate();
22340
22341 this._updateValue();
22342
22343 this.appendChild(this._template);
22344 autoStyle.prepare(this);
22345 ModifierUtil.initModifier(this, scheme$a);
22346 }
22347 }, {
22348 key: "_isCompiled",
22349 value: function _isCompiled() {
22350 if (!util$4.findChild(this, '.progress-bar')) {
22351 return false;
22352 }
22353
22354 var barElement = util$4.findChild(this, '.progress-bar');
22355
22356 if (!util$4.findChild(barElement, '.progress-bar__secondary')) {
22357 return false;
22358 }
22359
22360 if (!util$4.findChild(barElement, '.progress-bar__primary')) {
22361 return false;
22362 }
22363
22364 return true;
22365 }
22366 }, {
22367 key: "attributeChangedCallback",
22368 value: function attributeChangedCallback(name, last, current) {
22369 if (name === 'modifier') {
22370 ModifierUtil.onModifierChanged(last, current, this, scheme$a);
22371 this.hasAttribute(INDET$1) && this._updateDeterminate();
22372 } else if (name === 'value' || name === 'secondary-value') {
22373 this._updateValue();
22374 } else if (name === INDET$1) {
22375 this._updateDeterminate();
22376 }
22377 }
22378 }, {
22379 key: "_updateDeterminate",
22380 value: function _updateDeterminate() {
22381 var _this2 = this;
22382
22383 contentReady(this, function () {
22384 return util$4.toggleModifier(_this2, INDET$1, {
22385 force: _this2.hasAttribute(INDET$1)
22386 });
22387 });
22388 }
22389 }, {
22390 key: "_updateValue",
22391 value: function _updateValue() {
22392 var _this3 = this;
22393
22394 contentReady(this, function () {
22395 _this3._primary.style.width = _this3.hasAttribute('value') ? _this3.getAttribute('value') + '%' : '0%';
22396 _this3._secondary.style.width = _this3.hasAttribute('secondary-value') ? _this3.getAttribute('secondary-value') + '%' : '0%';
22397 });
22398 }
22399 /**
22400 * @property value
22401 * @type {Number}
22402 * @description
22403 * [en]Current progress. Should be a value between 0 and 100.[/en]
22404 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22405 */
22406
22407 }, {
22408 key: "value",
22409 get: function get() {
22410 return parseInt(this.getAttribute('value') || '0');
22411 }
22412 /**
22413 * @property secondaryValue
22414 * @type {Number}
22415 * @description
22416 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
22417 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22418 */
22419 ,
22420 set: function set(value) {
22421 if (typeof value !== 'number' || value < 0 || value > 100) {
22422 util$4.throw('Invalid value');
22423 }
22424
22425 this.setAttribute('value', Math.floor(value));
22426 }
22427 }, {
22428 key: "secondaryValue",
22429 get: function get() {
22430 return parseInt(this.getAttribute('secondary-value') || '0');
22431 }
22432 /**
22433 * @property indeterminate
22434 * @type {Boolean}
22435 * @description
22436 * [en]If this property is `true`, an infinite looping animation will be shown.[/en]
22437 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
22438 */
22439 ,
22440 set: function set(value) {
22441 if (typeof value !== 'number' || value < 0 || value > 100) {
22442 util$4.throw('Invalid value');
22443 }
22444
22445 this.setAttribute('secondary-value', Math.floor(value));
22446 }
22447 }, {
22448 key: "indeterminate",
22449 get: function get() {
22450 return this.hasAttribute(INDET$1);
22451 },
22452 set: function set(value) {
22453 if (value) {
22454 this.setAttribute(INDET$1, '');
22455 } else {
22456 this.removeAttribute(INDET$1);
22457 }
22458 }
22459 }], [{
22460 key: "observedAttributes",
22461 get: function get() {
22462 return ['modifier', 'value', 'secondary-value', INDET$1];
22463 }
22464 }]);
22465
22466 return ProgressBarElement;
22467 }(BaseElement);
22468 onsElements.ProgressBar = ProgressBarElement;
22469 customElements.define('ons-progress-bar', ProgressBarElement);
22470
22471 var scheme$9 = {
22472 '.progress-circular': 'progress-circular--*',
22473 '.progress-circular__background': 'progress-circular--*__background',
22474 '.progress-circular__primary': 'progress-circular--*__primary',
22475 '.progress-circular__secondary': 'progress-circular--*__secondary'
22476 };
22477 var template = util$4.createElement("\n <svg class=\"progress-circular\">\n <circle class=\"progress-circular__background\" />\n <circle class=\"progress-circular__secondary\" cx=\"50%\" cy=\"50%\" r=\"40%\" />\n <circle class=\"progress-circular__primary\" cx=\"50%\" cy=\"50%\" r=\"40%\" />\n </svg>\n");
22478 var INDET = 'indeterminate';
22479 /**
22480 * @element ons-progress-circular
22481 * @category visual
22482 * @description
22483 * [en]
22484 * This component displays a circular progress indicator. It can either be used to show how much of a task has been completed or to show a looping animation to indicate that an operation is currently running.
22485 * [/en]
22486 * [ja][/ja]
22487 * @codepen EVzMjR
22488 * @tutorial vanilla/Reference/progress-circular
22489 * @seealso ons-progress-bar
22490 * [en]The `<ons-progress-bar>` component displays a bar progress indicator.[/en]
22491 * [ja][/ja]
22492 * @example
22493 * <ons-progress-circular
22494 * value="55"
22495 * secondary-value="87">
22496 * </ons-progress-circular>
22497 *
22498 * <ons-progress-circular
22499 * indeterminate>
22500 * </ons-progress-circular>
22501 */
22502
22503 var ProgressCircularElement = /*#__PURE__*/function (_BaseElement) {
22504 _inherits(ProgressCircularElement, _BaseElement);
22505
22506 var _super = _createSuper(ProgressCircularElement);
22507
22508 /**
22509 * @attribute modifier
22510 * @type {String}
22511 * @description
22512 * [en]Change the appearance of the progress indicator.[/en]
22513 * [ja]プログレスインジケータの見た目を変更します。[/ja]
22514 */
22515
22516 /**
22517 * @attribute value
22518 * @type {Number}
22519 * @description
22520 * [en]Current progress. Should be a value between 0 and 100.[/en]
22521 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22522 */
22523
22524 /**
22525 * @attribute secondary-value
22526 * @type {Number}
22527 * @description
22528 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
22529 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22530 */
22531
22532 /**
22533 * @attribute indeterminate
22534 * @description
22535 * [en]If this attribute is set, an infinite looping animation will be shown.[/en]
22536 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
22537 */
22538 function ProgressCircularElement() {
22539 var _this;
22540
22541 _classCallCheck(this, ProgressCircularElement);
22542
22543 _this = _super.call(this);
22544 contentReady(_assertThisInitialized(_this), function () {
22545 return _this._compile();
22546 });
22547 return _this;
22548 }
22549
22550 _createClass(ProgressCircularElement, [{
22551 key: "attributeChangedCallback",
22552 value: function attributeChangedCallback(name, last, current) {
22553 if (name === 'modifier') {
22554 ModifierUtil.onModifierChanged(last, current, this, scheme$9);
22555 this.hasAttribute(INDET) && this._updateDeterminate();
22556 } else if (name === 'value' || name === 'secondary-value') {
22557 this._updateValue();
22558 } else if (name === INDET) {
22559 this._updateDeterminate();
22560 }
22561 }
22562 }, {
22563 key: "_updateDeterminate",
22564 value: function _updateDeterminate() {
22565 var _this2 = this;
22566
22567 contentReady(this, function () {
22568 return util$4.toggleModifier(_this2, INDET, {
22569 force: _this2.hasAttribute(INDET)
22570 });
22571 });
22572 }
22573 }, {
22574 key: "_updateValue",
22575 value: function _updateValue() {
22576 var _this3 = this;
22577
22578 if (this.hasAttribute('value')) {
22579 contentReady(this, function () {
22580 var per = Math.ceil(_this3.getAttribute('value') * 251.32 * 0.01);
22581 _this3._primary.style['stroke-dasharray'] = per + '%, 251.32%';
22582 });
22583 }
22584
22585 if (this.hasAttribute('secondary-value')) {
22586 contentReady(this, function () {
22587 var per = Math.ceil(_this3.getAttribute('secondary-value') * 251.32 * 0.01);
22588 _this3._secondary.style.display = null;
22589 _this3._secondary.style['stroke-dasharray'] = per + '%, 251.32%';
22590 });
22591 } else {
22592 contentReady(this, function () {
22593 _this3._secondary.style.display = 'none';
22594 });
22595 }
22596 }
22597 /**
22598 * @property value
22599 * @type {Number}
22600 * @description
22601 * [en]Current progress. Should be a value between 0 and 100.[/en]
22602 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22603 */
22604
22605 }, {
22606 key: "value",
22607 get: function get() {
22608 return parseInt(this.getAttribute('value') || '0');
22609 }
22610 /**
22611 * @property secondaryValue
22612 * @type {Number}
22613 * @description
22614 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
22615 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
22616 */
22617 ,
22618 set: function set(value) {
22619 if (typeof value !== 'number' || value < 0 || value > 100) {
22620 util$4.throw('Invalid value');
22621 }
22622
22623 this.setAttribute('value', Math.floor(value));
22624 }
22625 }, {
22626 key: "secondaryValue",
22627 get: function get() {
22628 return parseInt(this.getAttribute('secondary-value') || '0');
22629 }
22630 /**
22631 * @property indeterminate
22632 * @type {Boolean}
22633 * @description
22634 * [en]If this property is `true`, an infinite looping animation will be shown.[/en]
22635 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
22636 */
22637 ,
22638 set: function set(value) {
22639 if (typeof value !== 'number' || value < 0 || value > 100) {
22640 util$4.throw('Invalid value');
22641 }
22642
22643 this.setAttribute('secondary-value', Math.floor(value));
22644 }
22645 }, {
22646 key: "indeterminate",
22647 get: function get() {
22648 return this.hasAttribute(INDET);
22649 },
22650 set: function set(value) {
22651 if (value) {
22652 this.setAttribute(INDET, '');
22653 } else {
22654 this.removeAttribute(INDET);
22655 }
22656 }
22657 }, {
22658 key: "_compile",
22659 value: function _compile() {
22660 if (this._isCompiled()) {
22661 this._template = util$4.findChild(this, '.progress-circular');
22662 } else {
22663 this._template = template.cloneNode(true);
22664 }
22665
22666 this._primary = util$4.findChild(this._template, '.progress-circular__primary');
22667 this._secondary = util$4.findChild(this._template, '.progress-circular__secondary');
22668
22669 this._updateDeterminate();
22670
22671 this._updateValue();
22672
22673 this.appendChild(this._template);
22674 autoStyle.prepare(this);
22675 ModifierUtil.initModifier(this, scheme$9);
22676 }
22677 }, {
22678 key: "_isCompiled",
22679 value: function _isCompiled() {
22680 if (!util$4.findChild(this, '.progress-circular')) {
22681 return false;
22682 }
22683
22684 var svg = util$4.findChild(this, '.progress-circular');
22685
22686 if (!util$4.findChild(svg, '.progress-circular__secondary')) {
22687 return false;
22688 }
22689
22690 if (!util$4.findChild(svg, '.progress-circular__primary')) {
22691 return false;
22692 }
22693
22694 return true;
22695 }
22696 }], [{
22697 key: "observedAttributes",
22698 get: function get() {
22699 return ['modifier', 'value', 'secondary-value', INDET];
22700 }
22701 }]);
22702
22703 return ProgressCircularElement;
22704 }(BaseElement);
22705 onsElements.ProgressCircular = ProgressCircularElement;
22706 customElements.define('ons-progress-circular', ProgressCircularElement);
22707
22708 var STATE_INITIAL = 'initial';
22709 var STATE_PREACTION = 'preaction';
22710 var STATE_ACTION = 'action';
22711
22712 var throwType = function throwType(el, type) {
22713 return util$4.throw("\"".concat(el, "\" must be ").concat(type));
22714 };
22715 /**
22716 * @element ons-pull-hook
22717 * @category control
22718 * @description
22719 * [en]
22720 * Component that adds **Pull to refresh** functionality to an `<ons-page>` element.
22721 *
22722 * It can be used to perform a task when the user pulls down at the top of the page. A common usage is to refresh the data displayed in a page.
22723 * [/en]
22724 * [ja][/ja]
22725 * @codepen WbJogM
22726 * @tutorial vanilla/Reference/pull-hook
22727 * @example
22728 * <ons-page>
22729 * <ons-pull-hook>
22730 * Release to refresh
22731 * </ons-pull-hook>
22732 * </ons-page>
22733 *
22734 * <script>
22735 * document.querySelector('ons-pull-hook').onAction = function(done) {
22736 * setTimeout(done, 1000);
22737 * };
22738 * </script>
22739 */
22740
22741
22742 var PullHookElement = /*#__PURE__*/function (_BaseElement) {
22743 _inherits(PullHookElement, _BaseElement);
22744
22745 var _super = _createSuper(PullHookElement);
22746
22747 /**
22748 * @event changestate
22749 * @description
22750 * [en]Fired when the state is changed. The state can be either "initial", "preaction" or "action".[/en]
22751 * [ja]コンポーネントの状態が変わった場合に発火します。状態は、"initial", "preaction", "action"のいずれかです。[/ja]
22752 * @param {Object} event
22753 * [en]Event object.[/en]
22754 * [ja]イベントオブジェクト。[/ja]
22755 * @param {Object} event.pullHook
22756 * [en]Component object.[/en]
22757 * [ja]コンポーネントのオブジェクト。[/ja]
22758 * @param {String} event.state
22759 * [en]Current state.[/en]
22760 * [ja]現在の状態名を参照できます。[/ja]
22761 */
22762
22763 /**
22764 * @event pull
22765 * @description
22766 * [en]Fired when the pull hook is pulled.[/en]
22767 * [ja][/ja]
22768 * @param {Object} event
22769 * [en]Event object.[/en]
22770 * [ja]イベントオブジェクト。[/ja]
22771 * @param {Object} event.ratio
22772 * [en]The pulled distance ratio (scroll / height).[/en]
22773 * [ja][/ja]
22774 * @param {String} event.animationOptions
22775 * [en]The animation options object.[/en]
22776 * [ja][/ja]
22777 */
22778
22779 /**
22780 * @attribute disabled
22781 * @description
22782 * [en]If this attribute is set the "pull-to-refresh" functionality is disabled.[/en]
22783 * [ja]この属性がある時、disabled状態になりアクションが実行されなくなります[/ja]
22784 */
22785
22786 /**
22787 * @attribute height
22788 * @type {String}
22789 * @description
22790 * [en]Specify the height of the component. When pulled down further than this value it will switch to the "preaction" state. The default value is "64px".[/en]
22791 * [ja]コンポーネントの高さを指定します。この高さ以上にpull downすると"preaction"状態に移行します。デフォルトの値は"64px"です。[/ja]
22792 */
22793
22794 /**
22795 * @attribute threshold-height
22796 * @type {String}
22797 * @description
22798 * [en]Specify the threshold height. The component automatically switches to the "action" state when pulled further than this value. The default value is "96px". A negative value will disable this property. If this value is lower than the height, it will skip "preaction" state.[/en]
22799 * [ja]閾値となる高さを指定します。この値で指定した高さよりもpull downすると、このコンポーネントは自動的に"action"状態に移行します。[/ja]
22800 */
22801
22802 /**
22803 * @attribute fixed-content
22804 * @description
22805 * [en]If this attribute is set the content of the page will not move when pulling.[/en]
22806 * [ja]この属性がある時、プルフックが引き出されている時にもコンテンツは動きません。[/ja]
22807 */
22808
22809 /**
22810 * @property fixedContent
22811 * @type {Boolean}
22812 * @description
22813 * [en]If this property is set the content of the page will not move when pulling.[/en]
22814 * [ja]この属性がある時、プルフックが引き出されている時にもコンテンツは動きません。[/ja]
22815 */
22816 function PullHookElement() {
22817 var _this;
22818
22819 _classCallCheck(this, PullHookElement);
22820
22821 _this = _super.call(this);
22822 _this._onDrag = _this._onDrag.bind(_assertThisInitialized(_this));
22823 _this._onDragStart = _this._onDragStart.bind(_assertThisInitialized(_this));
22824 _this._onDragEnd = _this._onDragEnd.bind(_assertThisInitialized(_this));
22825 _this._onScroll = _this._onScroll.bind(_assertThisInitialized(_this));
22826
22827 _this._setState(STATE_INITIAL, true);
22828
22829 _this._hide(); // Fix for transparent toolbar transitions
22830
22831
22832 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'pull'),
22833 onConnected = _util$defineListenerP.onConnected,
22834 onDisconnected = _util$defineListenerP.onDisconnected;
22835
22836 _this._connectOnPull = onConnected;
22837 _this._disconnectOnPull = onDisconnected;
22838 return _this;
22839 }
22840
22841 _createClass(PullHookElement, [{
22842 key: "_setStyle",
22843 value: function _setStyle() {
22844 var height = this.height + 'px';
22845 styler(this, {
22846 height: height,
22847 lineHeight: height
22848 });
22849 this.style.display === '' && this._show();
22850 }
22851 }, {
22852 key: "_onScroll",
22853 value: function _onScroll(event) {
22854 var element = this._pageElement;
22855
22856 if (element.scrollTop < 0) {
22857 element.scrollTop = 0;
22858 }
22859 }
22860 }, {
22861 key: "_canConsumeGesture",
22862 value: function _canConsumeGesture(gesture) {
22863 return gesture.direction === 'up' || gesture.direction === 'down';
22864 }
22865 }, {
22866 key: "_onDragStart",
22867 value: function _onDragStart(event) {
22868 var _this2 = this;
22869
22870 if (!event.gesture || this.disabled) {
22871 return;
22872 }
22873
22874 var tapY = event.gesture.center.clientY + this._pageElement.scrollTop;
22875 var maxY = window.innerHeight; // Only use drags that start near the pullHook to reduce flickerings
22876
22877 var draggableAreaRatio = 1;
22878 this._ignoreDrag = event.consumed || tapY > maxY * draggableAreaRatio;
22879
22880 if (!this._ignoreDrag) {
22881 var consume = event.consume;
22882
22883 event.consume = function () {
22884 consume && consume();
22885 _this2._ignoreDrag = true; // This elements resizes .page__content so it is safer
22886 // to hide it when other components are dragged.
22887
22888 _this2._hide();
22889 };
22890
22891 if (this._canConsumeGesture(event.gesture)) {
22892 consume && consume();
22893 event.consumed = true;
22894
22895 this._show(); // Not enough due to 'dragLockAxis'
22896
22897 }
22898 }
22899
22900 this._startScroll = this._pageElement.scrollTop;
22901 }
22902 }, {
22903 key: "_onDrag",
22904 value: function _onDrag(event) {
22905 var _this3 = this;
22906
22907 if (!event.gesture || this.disabled || this._ignoreDrag || !this._canConsumeGesture(event.gesture)) {
22908 return;
22909 } // Necessary due to 'dragLockAxis' (25px)
22910
22911
22912 if (this.style.display === 'none') {
22913 this._show();
22914 }
22915
22916 event.stopPropagation();
22917 event.gesture.center.clientY + this._pageElement.scrollTop;
22918 var scroll = Math.max(event.gesture.deltaY - this._startScroll, 0);
22919
22920 if (scroll !== this._currentTranslation) {
22921 var th = this.thresholdHeight;
22922
22923 if (th > 0 && scroll >= th) {
22924 event.gesture.stopDetect();
22925 setImmediate(function () {
22926 return _this3._finish();
22927 });
22928 } else if (scroll >= this.height) {
22929 this._setState(STATE_PREACTION);
22930 } else {
22931 this._setState(STATE_INITIAL);
22932 }
22933
22934 this._translateTo(scroll);
22935 }
22936 }
22937 }, {
22938 key: "_onDragEnd",
22939 value: function _onDragEnd(event) {
22940 if (!event.gesture || this.disabled || this._ignoreDrag) {
22941 return;
22942 }
22943
22944 event.stopPropagation();
22945
22946 if (this._currentTranslation > 0) {
22947 var scroll = this._currentTranslation;
22948
22949 if (scroll > this.height) {
22950 this._finish();
22951 } else {
22952 this._translateTo(0, {
22953 animate: true
22954 });
22955 }
22956 }
22957 }
22958 /**
22959 * @property onAction
22960 * @type {Function}
22961 * @description
22962 * [en]This will be called in the `action` state if it exists. The function will be given a `done` callback as its first argument.[/en]
22963 * [ja][/ja]
22964 */
22965
22966 }, {
22967 key: "onAction",
22968 get: function get() {
22969 return this._onAction;
22970 },
22971 set: function set(value) {
22972 if (value && !(value instanceof Function)) {
22973 throwType('onAction', 'function or null');
22974 }
22975
22976 this._onAction = value;
22977 }
22978 /**
22979 * @property onPull
22980 * @type {Function}
22981 * @description
22982 * [en]Hook called whenever the user pulls the element. It gets the pulled distance ratio (scroll / height) and an animationOptions object as arguments.[/en]
22983 * [ja][/ja]
22984 */
22985
22986 }, {
22987 key: "_finish",
22988 value: function _finish() {
22989 var _this4 = this;
22990
22991 this._setState(STATE_ACTION);
22992
22993 this._translateTo(this.height, {
22994 animate: true
22995 });
22996
22997 var action = this.onAction || function (done) {
22998 return done();
22999 };
23000
23001 action(function () {
23002 _this4._translateTo(0, {
23003 animate: true
23004 });
23005
23006 _this4._setState(STATE_INITIAL);
23007 });
23008 }
23009 /**
23010 * @property height
23011 * @type {Number}
23012 * @description
23013 * [en]The height of the pull hook in pixels. The default value is `64px`.[/en]
23014 * [ja][/ja]
23015 */
23016
23017 }, {
23018 key: "height",
23019 get: function get() {
23020 return parseInt(this.getAttribute('height') || '64', 10);
23021 }
23022 /**
23023 * @property thresholdHeight
23024 * @type {Number}
23025 * @description
23026 * [en]The thresholdHeight of the pull hook in pixels. The default value is `96px`.[/en]
23027 * [ja][/ja]
23028 */
23029 ,
23030 set: function set(value) {
23031 if (!util$4.isInteger(value)) {
23032 throwType('height', 'integer');
23033 }
23034
23035 this.setAttribute('height', "".concat(value, "px"));
23036 }
23037 }, {
23038 key: "thresholdHeight",
23039 get: function get() {
23040 return parseInt(this.getAttribute('threshold-height') || '96', 10);
23041 },
23042 set: function set(value) {
23043 if (!util$4.isInteger(value)) {
23044 throwType('thresholdHeight', 'integer');
23045 }
23046
23047 this.setAttribute('threshold-height', "".concat(value, "px"));
23048 }
23049 }, {
23050 key: "_setState",
23051 value: function _setState(state, noEvent) {
23052 var lastState = this.state;
23053 this.setAttribute('state', state);
23054
23055 if (!noEvent && lastState !== this.state) {
23056 util$4.triggerElementEvent(this, 'changestate', {
23057 pullHook: this,
23058 state: state,
23059 lastState: lastState
23060 });
23061 }
23062 }
23063 /**
23064 * @property state
23065 * @readonly
23066 * @type {String}
23067 * @description
23068 * [en]Current state of the element.[/en]
23069 * [ja][/ja]
23070 */
23071
23072 }, {
23073 key: "state",
23074 get: function get() {
23075 return this.getAttribute('state');
23076 }
23077 /**
23078 * @property pullDistance
23079 * @readonly
23080 * @type {Number}
23081 * @description
23082 * [en]The current number of pixels the pull hook has moved.[/en]
23083 * [ja]現在のプルフックが引き出された距離をピクセル数。[/ja]
23084 */
23085
23086 }, {
23087 key: "pullDistance",
23088 get: function get() {
23089 return this._currentTranslation;
23090 }
23091 /**
23092 * @property disabled
23093 * @type {Boolean}
23094 * @description
23095 * [en]Whether the element is disabled or not.[/en]
23096 * [ja]無効化されている場合に`true`。[/ja]
23097 */
23098
23099 }, {
23100 key: "_show",
23101 value: function _show() {
23102 var _this5 = this;
23103
23104 // Run asyncrhonously to avoid conflicts with Animit's style clean
23105 setImmediate(function () {
23106 _this5.style.display = '';
23107
23108 if (_this5._pageElement) {
23109 _this5._pageElement.style.marginTop = "-".concat(_this5.height, "px");
23110 }
23111 });
23112 }
23113 }, {
23114 key: "_hide",
23115 value: function _hide() {
23116 this.style.display = 'none';
23117
23118 if (this._pageElement) {
23119 this._pageElement.style.marginTop = '';
23120 }
23121 }
23122 /**
23123 * @param {Number} scroll
23124 * @param {Object} options
23125 * @param {Function} [options.callback]
23126 */
23127
23128 }, {
23129 key: "_translateTo",
23130 value: function _translateTo(scroll) {
23131 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
23132
23133 if (this._currentTranslation == 0 && scroll == 0) {
23134 return;
23135 }
23136
23137 this._currentTranslation = scroll;
23138 var opt = options.animate ? {
23139 duration: .3,
23140 timing: 'cubic-bezier(.1, .7, .1, 1)'
23141 } : {};
23142 util$4.triggerElementEvent(this, 'pull', {
23143 ratio: (scroll / this.height).toFixed(2),
23144 animationOptions: opt
23145 });
23146 var scrollElement = this.hasAttribute('fixed-content') ? this : this._pageElement;
23147 Animit(scrollElement).queue({
23148 transform: "translate3d(0px, ".concat(scroll, "px, 0px)")
23149 }, opt).play(function () {
23150 scroll === 0 && styler.clear(scrollElement, 'transition transform');
23151 options.callback instanceof Function && options.callback();
23152 });
23153 }
23154 }, {
23155 key: "_disableDragLock",
23156 value: function _disableDragLock() {
23157 // e2e tests need it
23158 this._dragLockDisabled = true;
23159
23160 this._setupListeners(true);
23161 }
23162 }, {
23163 key: "_setupListeners",
23164 value: function _setupListeners(add) {
23165 var _this6 = this;
23166
23167 var scrollToggle = function scrollToggle(action) {
23168 return _this6._pageElement["".concat(action, "EventListener")]('scroll', _this6._onScroll, false);
23169 };
23170
23171 var gdToggle = function gdToggle(action) {
23172 var passive = {
23173 passive: true
23174 };
23175
23176 _this6._gestureDetector[action]('drag', _this6._onDrag, passive);
23177
23178 _this6._gestureDetector[action]('dragstart', _this6._onDragStart, passive);
23179
23180 _this6._gestureDetector[action]('dragend', _this6._onDragEnd, passive);
23181 };
23182
23183 if (this._gestureDetector) {
23184 gdToggle('off');
23185
23186 this._gestureDetector.dispose();
23187
23188 this._gestureDetector = null;
23189 }
23190
23191 scrollToggle('remove');
23192
23193 if (add) {
23194 this._gestureDetector = new GestureDetector(this._pageElement, {
23195 dragMinDistance: 1,
23196 dragDistanceCorrection: false,
23197 dragLockToAxis: !this._dragLockDisabled,
23198 passive: true
23199 });
23200 gdToggle('on');
23201 scrollToggle('add');
23202 }
23203 }
23204 }, {
23205 key: "connectedCallback",
23206 value: function connectedCallback() {
23207 this._currentTranslation = 0;
23208 this._pageElement = this.parentNode;
23209
23210 this._setupListeners(true);
23211
23212 this._setStyle();
23213
23214 this._connectOnPull();
23215 }
23216 }, {
23217 key: "disconnectedCallback",
23218 value: function disconnectedCallback() {
23219 this._hide();
23220
23221 this._setupListeners(false);
23222
23223 this._disconnectOnPull();
23224 }
23225 }, {
23226 key: "attributeChangedCallback",
23227 value: function attributeChangedCallback(name, last, current) {
23228 if (name === 'height' && this._pageElement) {
23229 this._setStyle();
23230 }
23231 }
23232 }], [{
23233 key: "observedAttributes",
23234 get: function get() {
23235 return ['height'];
23236 }
23237 }, {
23238 key: "events",
23239 get: function get() {
23240 return ['changestate', 'pull'];
23241 }
23242 }]);
23243
23244 return PullHookElement;
23245 }(BaseElement);
23246 util$4.defineBooleanProperties(PullHookElement, ['disabled', 'fixed-content']);
23247 onsElements.PullHook = PullHookElement;
23248 customElements.define('ons-pull-hook', PullHookElement);
23249
23250 var scheme$8 = {
23251 '': 'range--*',
23252 '.range__input': 'range--*__input',
23253 '.range__focus-ring': 'range--*__focus-ring'
23254 };
23255 var activeClassToken = 'range__input--active';
23256 /**
23257 * @element ons-range
23258 * @category form
23259 * @modifier material
23260 * [en]Material Design slider[/en]
23261 * [ja][/ja]
23262 * @description
23263 * [en]
23264 * Range input component. Used to display a draggable slider.
23265 *
23266 * Works very similar to the `<input type="range">` element.
23267 * [/en]
23268 * [ja][/ja]
23269 * @codepen xZQomM
23270 * @tutorial vanilla/Reference/range
23271 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
23272 * @seealso ons-input
23273 * [en]The `<ons-input>` component is used to display text inputs, radio buttons and checkboxes.[/en]
23274 * [ja][/ja]
23275 * @example
23276 * <ons-range value="20"></ons-range>
23277 * <ons-range modifier="material" value="10"></range>
23278 */
23279
23280 var RangeElement = /*#__PURE__*/function (_BaseInputElement) {
23281 _inherits(RangeElement, _BaseInputElement);
23282
23283 var _super = _createSuper(RangeElement);
23284
23285 function RangeElement() {
23286 var _this;
23287
23288 _classCallCheck(this, RangeElement);
23289
23290 _this = _super.call(this);
23291 _this._onMouseDown = _this._onMouseDown.bind(_assertThisInitialized(_this));
23292 _this._onMouseUp = _this._onMouseUp.bind(_assertThisInitialized(_this));
23293 _this._onTouchStart = _this._onTouchStart.bind(_assertThisInitialized(_this));
23294 _this._onTouchEnd = _this._onTouchEnd.bind(_assertThisInitialized(_this));
23295 _this._onInput = _this._update.bind(_assertThisInitialized(_this));
23296 _this._onDragstart = _this._onDragstart.bind(_assertThisInitialized(_this));
23297 _this._onDragend = _this._onDragend.bind(_assertThisInitialized(_this));
23298 return _this;
23299 }
23300
23301 _createClass(RangeElement, [{
23302 key: "_compile",
23303 value: function _compile() {
23304 _get(_getPrototypeOf(RangeElement.prototype), "_compile", this).call(this);
23305
23306 this._updateDisabled(this.hasAttribute('disabled'));
23307 }
23308 /* Inherited props */
23309
23310 }, {
23311 key: "_update",
23312 value: function _update() {
23313 var input = this._input;
23314 var focusRing = this._focusRing;
23315 input.style.backgroundSize = "".concat(100 * this._ratio, "% 2px");
23316 focusRing.value = this.value; // NOTE: "_zero" attribute is used for CSS styling.
23317
23318 if (input.min === '' && input.value === '0' || input.min === input.value) {
23319 input.setAttribute('_zero', '');
23320 } else {
23321 input.removeAttribute('_zero');
23322 }
23323
23324 ['min', 'max'].forEach(function (attr) {
23325 return focusRing[attr] = input[attr];
23326 });
23327 }
23328 }, {
23329 key: "_scheme",
23330 get: function get() {
23331 return scheme$8;
23332 }
23333 }, {
23334 key: "_template",
23335 get: function get() {
23336 return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <input type=\"range\" class=\"range__focus-ring\" tabIndex=\"-1\">\n ");
23337 }
23338 }, {
23339 key: "_defaultClassName",
23340 get: function get() {
23341 return 'range';
23342 }
23343 }, {
23344 key: "type",
23345 get: function get() {
23346 return 'range';
23347 }
23348 /* Own props */
23349
23350 }, {
23351 key: "_onMouseDown",
23352 value: function _onMouseDown(e) {
23353 var _this2 = this;
23354
23355 this._input.classList.add(activeClassToken);
23356
23357 setImmediate(function () {
23358 return _this2._input.focus();
23359 });
23360 }
23361 }, {
23362 key: "_onTouchStart",
23363 value: function _onTouchStart(e) {
23364 this._onMouseDown();
23365 }
23366 }, {
23367 key: "_onMouseUp",
23368 value: function _onMouseUp(e) {
23369 this._input.classList.remove(activeClassToken);
23370 }
23371 }, {
23372 key: "_onTouchEnd",
23373 value: function _onTouchEnd(e) {
23374 this._onMouseUp(e);
23375 }
23376 }, {
23377 key: "_onDragstart",
23378 value: function _onDragstart(e) {
23379 e.consumed = true;
23380 e.gesture.stopPropagation();
23381
23382 this._input.classList.add(activeClassToken);
23383
23384 this.addEventListener('drag', this._onDrag);
23385 }
23386 }, {
23387 key: "_onDrag",
23388 value: function _onDrag(e) {
23389 e.stopPropagation();
23390 }
23391 }, {
23392 key: "_onDragend",
23393 value: function _onDragend(e) {
23394 this._input.classList.remove(activeClassToken);
23395
23396 this.removeEventListener('drag', this._onDrag);
23397 }
23398 }, {
23399 key: "_focusRing",
23400 get: function get() {
23401 return this.children[1];
23402 }
23403 }, {
23404 key: "_ratio",
23405 get: function get() {
23406 // Returns the current ratio.
23407 var min = this._input.min === '' ? 0 : parseInt(this._input.min);
23408 var max = this._input.max === '' ? 100 : parseInt(this._input.max);
23409 return (this.value - min) / (max - min);
23410 }
23411 }, {
23412 key: "attributeChangedCallback",
23413 value: function attributeChangedCallback(name, last, current) {
23414 if (name === 'disabled') {
23415 this._updateDisabled(current);
23416 }
23417
23418 _get(_getPrototypeOf(RangeElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
23419 }
23420 /**
23421 * @param {boolean} disabled
23422 */
23423
23424 }, {
23425 key: "_updateDisabled",
23426 value: function _updateDisabled(disabled) {
23427 if (disabled) {
23428 this.classList.add('range--disabled');
23429 } else {
23430 this.classList.remove('range--disabled');
23431 }
23432 }
23433 }, {
23434 key: "connectedCallback",
23435 value: function connectedCallback() {
23436 this._setupListeners(true);
23437 }
23438 }, {
23439 key: "disconnectedCallback",
23440 value: function disconnectedCallback() {
23441 this._setupListeners(false);
23442 }
23443 }, {
23444 key: "_setupListeners",
23445 value: function _setupListeners(add) {
23446 var action = (add ? 'add' : 'remove') + 'EventListener';
23447 util$4[action](this, 'touchstart', this._onTouchStart, {
23448 passive: true
23449 });
23450 this[action]('mousedown', this._onMouseDown);
23451 this[action]('mouseup', this._onMouseUp);
23452 this[action]('touchend', this._onTouchEnd);
23453 this[action]('dragstart', this._onDragstart);
23454 this[action]('dragend', this._onDragend);
23455 this[action]('input', this._onInput);
23456 }
23457 /**
23458 * @attribute disabled
23459 * @description
23460 * [en]Whether the element is disabled or not.[/en]
23461 * [ja]無効化されている場合に`true`。[/ja]
23462 */
23463
23464 /**
23465 * @property disabled
23466 * @type {Boolean}
23467 * @description
23468 * [en]Whether the element is disabled or not.[/en]
23469 * [ja]無効化されている場合に`true`。[/ja]
23470 */
23471
23472 /**
23473 * @property value
23474 * @type {Number}
23475 * @description
23476 * [en]Current value.[/en]
23477 * [ja][/ja]
23478 */
23479
23480 /**
23481 * @method focus
23482 * @signature focus()
23483 * @description
23484 * [en]Focuses the range.[/en]
23485 * [ja][/ja]
23486 */
23487
23488 /**
23489 * @method blur
23490 * @signature blur()
23491 * @description
23492 * [en]Removes focus from the range.[/en]
23493 * [ja][/ja]
23494 */
23495
23496 }], [{
23497 key: "observedAttributes",
23498 get: function get() {
23499 return ['disabled'].concat(_toConsumableArray(BaseInputElement.observedAttributes));
23500 }
23501 }]);
23502
23503 return RangeElement;
23504 }(BaseInputElement);
23505 onsElements.Range = RangeElement;
23506 customElements.define('ons-range', RangeElement);
23507
23508 /**
23509 * @element ons-row
23510 * @category grid
23511 * @description
23512 * [en]Represents a row in the grid system. Use with `<ons-col>` to layout components.[/en]
23513 * [ja]グリッドシステムにて行を定義します。ons-colとともに使用し、コンポーネントの配置に使用します。[/ja]
23514 * @codepen GgujC {wide}
23515 * @guide features.html
23516 * [en]Layouting guide[/en]
23517 * [ja]レイアウト調整[/ja]
23518 * @seealso ons-col
23519 * [en]The `<ons-col>` component is used as children of `<ons-row>`.[/en]
23520 * [ja]ons-colコンポーネント[/ja]
23521 * @note
23522 * [en]For Android 4.3 and earlier, and iOS6 and earlier, when using mixed alignment with ons-row and ons-col, they may not be displayed correctly. You can use only one vertical-align.[/en]
23523 * [ja]Android 4.3以前、もしくはiOS 6以前のOSの場合、ons-rowとons-colを組み合わせてそれぞれのons-col要素のvertical-align属性の値に別々の値を指定すると、描画が崩れる場合があります。vertical-align属性の値には一つの値だけを指定できます。[/ja]
23524 * @example
23525 * <ons-row>
23526 * <ons-col width="50px"><ons-icon icon="fa-twitter"></ons-icon></ons-col>
23527 * <ons-col>Text</ons-col>
23528 * </ons-row>
23529 */
23530
23531 /**
23532 * @attribute vertical-align
23533 * @type {String}
23534 * @description
23535 * [en]Short hand attribute for aligning vertically. Valid values are top, bottom, and center.[/en]
23536 * [ja]縦に整列するために指定します。top、bottom、centerのいずれかを指定できます。[/ja]
23537 */
23538
23539 var RowElement = /*#__PURE__*/function (_BaseElement) {
23540 _inherits(RowElement, _BaseElement);
23541
23542 var _super = _createSuper(RowElement);
23543
23544 function RowElement() {
23545 _classCallCheck(this, RowElement);
23546
23547 return _super.apply(this, arguments);
23548 }
23549
23550 return _createClass(RowElement);
23551 }(BaseElement);
23552 onsElements.Row = RowElement;
23553 customElements.define('ons-row', RowElement);
23554
23555 var defaultClassName$5 = 'segment';
23556 var scheme$7 = {
23557 '': 'segment--*',
23558 '.segment__item': 'segment--*__item',
23559 '.segment__input': 'segment--*__input',
23560 '.segment__button': 'segment--*__button'
23561 };
23562
23563 var generateId = function () {
23564 var i = 0;
23565 return function () {
23566 return 'ons-segment-gen-' + i++;
23567 };
23568 }();
23569 /**
23570 * @element ons-segment
23571 * @category control
23572 * @modifier material
23573 * [en]Material Design segment[/en]
23574 * [ja][/ja]
23575 * @description
23576 * [en]
23577 * Segment component. Use this component to have a button bar with automatic styles that switch on click of another button.
23578 *
23579 * Will automatically display as a Material Design segment on Android.
23580 * [/en]
23581 * [ja][/ja]
23582 * @codepen hLayx
23583 * @tutorial vanilla/Reference/segment
23584 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
23585 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
23586 * @example
23587 * <ons-segment>
23588 * <ons-button>Label 1</ons-button>
23589 * <ons-button>Label 2</ons-button>
23590 * <ons-button>Label 3</ons-button>
23591 * </ons-segment>
23592 */
23593
23594
23595 var SegmentElement = /*#__PURE__*/function (_BaseElement) {
23596 _inherits(SegmentElement, _BaseElement);
23597
23598 var _super = _createSuper(SegmentElement);
23599
23600 /**
23601 * @event postchange
23602 * @description
23603 * [en]Fires after the active button is changed.[/en]
23604 * [ja][/ja]
23605 * @param {Object} event
23606 * [en]Event object.[/en]
23607 * [ja][/ja]
23608 * @param {Number} event.index
23609 * [en]Tapped button index.[/en]
23610 * [ja][/ja]
23611 * @param {Object} event.segmentItem
23612 * [en]Segment item object.[/en]
23613 * [ja][/ja]
23614 */
23615
23616 /**
23617 * @attribute modifier
23618 * @type {String}
23619 * @description
23620 * [en]The appearance of the segment.[/en]
23621 * [ja][/ja]
23622 */
23623
23624 /**
23625 * @attribute tabbar-id
23626 * @initonly
23627 * @type {String}
23628 * @description
23629 * [en]ID of the tabbar element to "connect" to the segment. Must be inside the same page.[/en]
23630 * [ja][/ja]
23631 */
23632
23633 /**
23634 * @attribute active-index
23635 * @default 0
23636 * @type {Number}
23637 * @description
23638 * [en]Index of the active button. If a tabbar is connected, this will be set to the tabbar's active index.[/en]
23639 * [ja][/ja]
23640 */
23641
23642 /**
23643 * @property activeIndex
23644 * @default 0
23645 * @type {Number}
23646 * @description
23647 * [en]Index of the active button. If a tabbar is connected, this will be set to the tabbar's active index.[/en]
23648 * [ja][/ja]
23649 */
23650
23651 /**
23652 * @attribute disabled
23653 * @description
23654 * [en]Specify if segment should be disabled.[/en]
23655 * [ja]ボタンを無効化する場合は指定します。[/ja]
23656 */
23657 function SegmentElement() {
23658 var _this;
23659
23660 _classCallCheck(this, SegmentElement);
23661
23662 _this = _super.call(this);
23663 _this._segmentId = generateId();
23664 _this._tabbar = null;
23665 _this._onChange = _this._onChange.bind(_assertThisInitialized(_this));
23666 _this._onTabbarPreChange = _this._onTabbarPreChange.bind(_assertThisInitialized(_this));
23667 contentReady(_assertThisInitialized(_this), function () {
23668 _this._compile();
23669
23670 setImmediate(function () {
23671 return _this._lastActiveIndex = _this._tabbar ? _this._tabbar.getActiveTabIndex() : _this.getActiveButtonIndex();
23672 });
23673 });
23674 return _this;
23675 }
23676
23677 _createClass(SegmentElement, [{
23678 key: "_compile",
23679 value: function _compile() {
23680 autoStyle.prepare(this);
23681 this.classList.add(defaultClassName$5);
23682
23683 for (var index = this.children.length - 1; index >= 0; index--) {
23684 var item = this.children[index];
23685 item.classList.add('segment__item');
23686 var input = util$4.findChild(item, '.segment__input') || util$4.create('input.segment__input');
23687 input.type = 'radio';
23688 input.value = index;
23689 input.name = input.name || this._segmentId;
23690 input.checked = !this.hasAttribute('tabbar-id') && index === (this.activeIndex || 0);
23691 var button = util$4.findChild(item, '.segment__button') || util$4.create('.segment__button');
23692
23693 if (button.parentElement !== item) {
23694 while (item.firstChild) {
23695 button.appendChild(item.firstChild);
23696 }
23697 }
23698
23699 item.appendChild(input);
23700 item.appendChild(button);
23701 }
23702
23703 ModifierUtil.initModifier(this, scheme$7);
23704 }
23705 }, {
23706 key: "connectedCallback",
23707 value: function connectedCallback() {
23708 var _this2 = this;
23709
23710 contentReady(this, function () {
23711 if (_this2.hasAttribute('tabbar-id')) {
23712 var page = util$4.findParent(_this2, 'ons-page');
23713 _this2._tabbar = page && page.querySelector('#' + _this2.getAttribute('tabbar-id'));
23714
23715 if (!_this2._tabbar || _this2._tabbar.tagName !== 'ONS-TABBAR') {
23716 util$4.throw("No tabbar with id ".concat(_this2.getAttribute('tabbar-id'), " was found."));
23717 }
23718
23719 _this2._tabbar.setAttribute('hide-tabs', '');
23720
23721 setImmediate(function () {
23722 var index = _this2._tabbar.getActiveTabIndex();
23723
23724 _this2._setChecked(index);
23725
23726 _this2.activeIndex = index;
23727 });
23728
23729 _this2._tabbar.addEventListener('prechange', _this2._onTabbarPreChange);
23730 }
23731 });
23732 this.addEventListener('change', this._onChange);
23733 }
23734 }, {
23735 key: "disconnectedCallback",
23736 value: function disconnectedCallback() {
23737 var _this3 = this;
23738
23739 contentReady(this, function () {
23740 if (_this3._tabbar) {
23741 _this3._tabbar.removeEventListener('prechange', _this3._onTabbarPreChange);
23742
23743 _this3._tabbar = null;
23744 }
23745 });
23746 this.removeEventListener('change', this._onChange);
23747 }
23748 }, {
23749 key: "_setChecked",
23750 value: function _setChecked(index) {
23751 this.children[index].firstElementChild.checked = true;
23752 }
23753 /**
23754 * @method setActiveButton
23755 * @signature setActiveButton(index, [options])
23756 * @param {Number} index
23757 * [en]Button index.[/en]
23758 * [ja][/ja]
23759 * @param {Object} [options]
23760 * [en]Parameter object, works only if there is a connected tabbar. Supports the same options as `ons-tabbar`'s `setActiveTab` method.[/en]
23761 * [ja][/ja]
23762 * @description
23763 * [en]Make button with the specified index active. If there is a connected tabbar it shows the corresponding tab page. In this case animations and their options can be specified by the second parameter.[/en]
23764 * [ja][/ja]
23765 * @return {Promise}
23766 * [en]Resolves to the selected index or to the new page element if there is a connected tabbar.[/en]
23767 * [ja][/ja]
23768 */
23769
23770 }, {
23771 key: "setActiveButton",
23772 value: function setActiveButton(index, options) {
23773 if (this._tabbar) {
23774 return this._tabbar.setActiveTab(index, options);
23775 }
23776
23777 this._setChecked(index);
23778
23779 this._postChange(index);
23780
23781 return Promise.resolve(index);
23782 }
23783 /**
23784 * @method getActiveButtonIndex
23785 * @signature getActiveButtonIndex()
23786 * @return {Number}
23787 * [en]The index of the currently active button.[/en]
23788 * [ja][/ja]
23789 * @description
23790 * [en]Returns button index of current active button. If active button is not found, returns -1.[/en]
23791 * [ja][/ja]
23792 */
23793
23794 }, {
23795 key: "getActiveButtonIndex",
23796 value: function getActiveButtonIndex() {
23797 for (var i = this.children.length - 1; i >= 0; i--) {
23798 // Array.findIndex
23799 if (this.children[i].firstElementChild.checked) {
23800 return i;
23801 }
23802 }
23803
23804 return -1;
23805 }
23806 }, {
23807 key: "_onChange",
23808 value: function _onChange(event) {
23809 event.stopPropagation();
23810 this._tabbar ? this._tabbar.setActiveTab(this.getActiveButtonIndex(), {
23811 reject: false
23812 }) : this._postChange(this.getActiveButtonIndex());
23813 }
23814 }, {
23815 key: "_onTabbarPreChange",
23816 value: function _onTabbarPreChange(event) {
23817 var _this4 = this;
23818
23819 setImmediate(function () {
23820 if (!event.detail.canceled) {
23821 _this4._setChecked(event.index);
23822
23823 _this4._postChange(event.index);
23824 }
23825 });
23826 }
23827 }, {
23828 key: "_postChange",
23829 value: function _postChange(index) {
23830 util$4.triggerElementEvent(this, 'postchange', {
23831 index: index,
23832 activeIndex: index,
23833 lastActiveIndex: this._lastActiveIndex,
23834 segmentItem: this.children[index]
23835 });
23836 this._lastActiveIndex = index;
23837 this.activeIndex = index;
23838 }
23839 /**
23840 * @property disabled
23841 * @type {Boolean}
23842 * @description
23843 * [en]Whether the segment is disabled or not.[/en]
23844 * [ja]無効化されている場合に`true`。[/ja]
23845 */
23846
23847 }, {
23848 key: "activeIndex",
23849 get: function get() {
23850 return parseInt(this.getAttribute('active-index'));
23851 },
23852 set: function set(value) {
23853 if (value !== null && value !== undefined) {
23854 this.setAttribute('active-index', value);
23855 }
23856 }
23857 }, {
23858 key: "attributeChangedCallback",
23859 value: function attributeChangedCallback(name, last, current) {
23860 var _this5 = this;
23861
23862 switch (name) {
23863 case 'class':
23864 util$4.restoreClass(this, defaultClassName$5, scheme$7);
23865 break;
23866
23867 case 'modifier':
23868 ModifierUtil.onModifierChanged(last, current, this, scheme$7);
23869 break;
23870
23871 case 'active-index':
23872 contentReady(this, function () {
23873 if (_this5.getActiveButtonIndex() !== _this5.activeIndex) {
23874 _this5.setActiveButton(_this5.activeIndex);
23875 }
23876 });
23877 break;
23878 }
23879 }
23880 }], [{
23881 key: "observedAttributes",
23882 get: function get() {
23883 return ['class', 'modifier', 'active-index'];
23884 }
23885 }, {
23886 key: "events",
23887 get: function get() {
23888 return ['postchange'];
23889 }
23890 }]);
23891
23892 return SegmentElement;
23893 }(BaseElement);
23894 util$4.defineBooleanProperties(SegmentElement, ['disabled']);
23895 onsElements.Segment = SegmentElement;
23896 customElements.define('ons-segment', SegmentElement);
23897
23898 var scheme$6 = {
23899 '': 'select-* select--*',
23900 '.select-input': 'select-input--*'
23901 };
23902 var defaultClassName$4 = 'select';
23903 var INPUT_ATTRIBUTES = ['autofocus', 'disabled', 'form', 'multiple', 'name', 'required', 'size'];
23904 /**
23905 * @element ons-select
23906 * @category form
23907 * @modifier material
23908 * [en]Displays a Material Design select input.[/en]
23909 * [ja][/ja]
23910 * @modifier underbar
23911 * [en]Displays a horizontal line underneath a select input.[/en]
23912 * [ja][/ja]
23913 * @description
23914 * [en]
23915 * Select component. If you want to place a select with an ID of `my-id` on a page, use `<ons-select select-id="my-id">`.
23916 *
23917 * The component will automatically display as a Material Design select on Android.
23918 *
23919 * Most attributes that can be used for a normal `<select>` element can also be used on the `<ons-select>` element.
23920 * [/en]
23921 * [ja]セレクトボックスを表示するコンポーネントです。`select` 要素に使用できる属性の多くが `ons-select` 要素でも利用できます。[/ja]
23922 * @codepen hLayx
23923 * @tutorial vanilla/Reference/select
23924 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
23925 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
23926 * @example
23927 * <ons-select>
23928 * <option value="1">1</option>
23929 * <option value="2">2nd</option>
23930 * <option value="3">3rd option</option>
23931 * </ons-select>
23932 */
23933
23934 var SelectElement = /*#__PURE__*/function (_BaseElement) {
23935 _inherits(SelectElement, _BaseElement);
23936
23937 var _super = _createSuper(SelectElement);
23938
23939 /**
23940 * @attribute autofocus
23941 * @type {Boolean}
23942 * @default false
23943 * @description
23944 * [en]Element automatically gains focus on page load.[/en]
23945 * [ja]ページロード時にこのセレクトボックスにフォーカスが移るようにします。[/ja]
23946 */
23947
23948 /**
23949 * @attribute disabled
23950 * @type {Boolean}
23951 * @default false
23952 * @description
23953 * [en]Specify if select input should be disabled.[/en]
23954 * [ja]このセレクトボックスを無効化する場合に指定します。[/ja]
23955 */
23956
23957 /**
23958 * @attribute form
23959 * @type {String}
23960 * @description
23961 * [en]Associate a select element to an existing form on the page, even if not nested.[/en]
23962 * [ja]このセレクトボックスを、指定した `form` 要素に紐付けます。セレクトボックスを `form` 要素の外側に配置する際に使用します。[/ja]
23963 */
23964
23965 /**
23966 * @attribute multiple
23967 * @type {Boolean}
23968 * @default false
23969 * @description
23970 * [en]If this attribute is defined, multiple options can be selected at once.[/en]
23971 * [ja]選択肢の複数選択を有効にします。[/ja]
23972 */
23973
23974 /**
23975 * @attribute name
23976 * @type {String}
23977 * @description
23978 * [en]Name the select element, useful for instance if it is part of a form.[/en]
23979 * [ja]このセレクトボックスの名前を指定します。通常 `form` 要素と共に使用します。[/ja]
23980 */
23981
23982 /**
23983 * @attribute required
23984 * @type {Boolean}
23985 * @description
23986 * [en]Make the select input required for submitting the form it is part of.[/en]
23987 * [ja]このセレクトボックスを入力必須にする場合に指定します。通常 `form` 要素と共に使用します。[/ja]
23988 */
23989
23990 /**
23991 * @attribute select-id
23992 * @type {String}
23993 * @description
23994 * [en]ID given to the inner select, useful for dynamic manipulation.[/en]
23995 * [ja]このセレクトボックスが内部に持つ select 要素に与える ID を指定します。セレクトボックスの内容を動的に変更する必要がある場合に使用します。[/ja]
23996 */
23997
23998 /**
23999 * @attribute size
24000 * @type {Number}
24001 * @default 1
24002 * @description
24003 * [en]How many options are displayed; if there are more than the size then a scroll appears to navigate them.[/en]
24004 * [ja]一度に表示する選択肢の個数を指定します。選択肢がこの属性で指定した個数よりも多い場合、スクロールが有効になります。[/ja]
24005 */
24006 function SelectElement() {
24007 var _this;
24008
24009 _classCallCheck(this, SelectElement);
24010
24011 _this = _super.call(this);
24012 contentReady(_assertThisInitialized(_this), function () {
24013 return _this._compile();
24014 });
24015
24016 _this._deriveGetters();
24017
24018 return _this;
24019 }
24020
24021 _createClass(SelectElement, [{
24022 key: "attributeChangedCallback",
24023 value: function attributeChangedCallback(name, last, current) {
24024 var _this2 = this;
24025
24026 switch (name) {
24027 case 'class':
24028 util$4.restoreClass(this, defaultClassName$4, scheme$6);
24029 break;
24030
24031 case 'modifier':
24032 ModifierUtil.onModifierChanged(last, current, this, scheme$6);
24033 break;
24034 }
24035
24036 if (INPUT_ATTRIBUTES.indexOf(name) >= 0) {
24037 contentReady(this, function () {
24038 return _this2._updateBoundAttributes();
24039 });
24040 }
24041 }
24042 }, {
24043 key: "_select",
24044 get: function get() {
24045 return this.querySelector('select');
24046 }
24047 }, {
24048 key: "_updateBoundAttributes",
24049 value: function _updateBoundAttributes() {
24050 var _this3 = this;
24051
24052 INPUT_ATTRIBUTES.forEach(function (attr) {
24053 if (_this3.hasAttribute(attr)) {
24054 _this3._select.setAttribute(attr, _this3.getAttribute(attr));
24055 } else {
24056 _this3._select.removeAttribute(attr);
24057 }
24058 });
24059 }
24060 /**
24061 * @property length
24062 * @description
24063 * [en]Number of options in the select box.[/en]
24064 * [ja]このセレクトボックスに含まれる選択肢の個数を返します。 `select` 要素[/ja]
24065 */
24066
24067 /**
24068 * @property options
24069 * @description
24070 * [en]Several options for handling the select DOM object.[/en]
24071 * [ja]このセレクトボックスに含まれる `option` 要素の配列を返します。[/ja]
24072 */
24073
24074 /**
24075 * @property selectedIndex
24076 * @description
24077 * [en]Index of the currently selected option.[/en]
24078 * [ja]現在選択されている選択肢のインデックスを返します。[/ja]
24079 */
24080
24081 /**
24082 * @property value
24083 * @description
24084 * [en]Value of the currently selected option.[/en]
24085 * [ja]現在選択されている選択肢の値を返します。[/ja]
24086 */
24087
24088 }, {
24089 key: "_compile",
24090 value: function _compile() {
24091 autoStyle.prepare(this);
24092 this.classList.add(defaultClassName$4);
24093 var sel = this._select || document.createElement('select');
24094
24095 if (!sel.id && this.hasAttribute('select-id')) {
24096 sel.id = this.getAttribute('select-id');
24097 }
24098
24099 sel.classList.add('select-input');
24100
24101 if (!this._select) {
24102 util$4.arrayFrom(this.childNodes).forEach(function (element) {
24103 return sel.appendChild(element);
24104 });
24105 this.appendChild(sel);
24106 }
24107
24108 ModifierUtil.initModifier(this, scheme$6);
24109 }
24110 }, {
24111 key: "_deriveGetters",
24112 value: function _deriveGetters() {
24113 var _this4 = this;
24114
24115 ['disabled', 'length', 'multiple', 'name', 'options', 'selectedIndex', 'size', 'value', 'form', 'type'].forEach(function (key) {
24116 Object.defineProperty(_this4, key, {
24117 configurable: true,
24118 enumerable: true,
24119 get: function get() {
24120 return _this4._select[key];
24121 },
24122 set: ['form', 'type'].indexOf(key) === -1 ? function (value) {
24123 return contentReady(_this4, function () {
24124 return _this4._select[key] = value;
24125 });
24126 } : undefined
24127 });
24128 });
24129 }
24130 }, {
24131 key: "add",
24132 value: function add(option) {
24133 var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
24134
24135 this._select.add(option, index);
24136 } // If called with an index argument, removes the option element with the given index.
24137 // If called with no arguments, removes this.
24138 // This behaviour might sound crazy but it is the same as <select>'s `remove` method.
24139 // https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/remove
24140
24141 }, {
24142 key: "remove",
24143 value: function remove(index) {
24144 if (index === undefined) {
24145 Element.prototype.remove.call(this);
24146 } else {
24147 this._select.remove(index);
24148 }
24149 }
24150 }], [{
24151 key: "observedAttributes",
24152 get: function get() {
24153 return ['modifier', 'class'].concat(INPUT_ATTRIBUTES);
24154 }
24155 }]);
24156
24157 return SelectElement;
24158 }(BaseElement);
24159 onsElements.Select = SelectElement;
24160 customElements.define('ons-select', SelectElement);
24161
24162 var defaultClassName$3 = 'fab fab--mini speed-dial__item';
24163 var scheme$5 = {
24164 '': 'fab--* speed-dial__item--*'
24165 };
24166 /**
24167 * @element ons-speed-dial-item
24168 * @category control
24169 * @description
24170 * [en]
24171 * This component displays the child elements of the Material Design Speed dial component.
24172 * [/en]
24173 * [ja]
24174 * Material DesignのSpeed dialの子要素を表現する要素です。
24175 * [/ja]
24176 * @codepen dYQYLg
24177 * @tutorial vanilla/Reference/speed-dial
24178 * @seealso ons-speed-dial
24179 * [en]The `<ons-speed-dial>` component.[/en]
24180 * [ja]ons-speed-dialコンポーネント[/ja]
24181 * @seealso ons-fab
24182 * [en]ons-fab component[/en]
24183 * [ja]ons-fabコンポーネント[/ja]
24184 * @example
24185 * <ons-speed-dial position="left bottom">
24186 * <ons-fab>
24187 * <ons-icon icon="fa-twitter"></ons-icon>
24188 * </ons-fab>
24189 * <ons-speed-dial-item>A</ons-speed-dial-item>
24190 * <ons-speed-dial-item>B</ons-speed-dial-item>
24191 * <ons-speed-dial-item>C</ons-speed-dial-item>
24192 * </ons-speed-dial>
24193 */
24194
24195 var SpeedDialItemElement = /*#__PURE__*/function (_BaseElement) {
24196 _inherits(SpeedDialItemElement, _BaseElement);
24197
24198 var _super = _createSuper(SpeedDialItemElement);
24199
24200 /**
24201 * @attribute modifier
24202 * @type {String}
24203 * @description
24204 * [en]The appearance of the component.[/en]
24205 * [ja]このコンポーネントの表現を指定します。[/ja]
24206 */
24207
24208 /**
24209 * @attribute ripple
24210 * @description
24211 * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
24212 * [ja][/ja]
24213 */
24214
24215 /**
24216 * @property ripple
24217 * @type {Boolean}
24218 * @description
24219 * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
24220 * [ja][/ja]
24221 */
24222 function SpeedDialItemElement() {
24223 var _this;
24224
24225 _classCallCheck(this, SpeedDialItemElement);
24226
24227 _this = _super.call(this);
24228
24229 _this._compile();
24230
24231 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
24232 return _this;
24233 }
24234
24235 _createClass(SpeedDialItemElement, [{
24236 key: "attributeChangedCallback",
24237 value: function attributeChangedCallback(name, last, current) {
24238 switch (name) {
24239 case 'class':
24240 util$4.restoreClass(this, defaultClassName$3, scheme$5);
24241 break;
24242
24243 case 'modifier':
24244 ModifierUtil.onModifierChanged(last, current, this, scheme$5);
24245 util$4.addModifier(this, 'mini');
24246 break;
24247
24248 case 'ripple':
24249 this._updateRipple();
24250
24251 }
24252 }
24253 }, {
24254 key: "connectedCallback",
24255 value: function connectedCallback() {
24256 this.addEventListener('click', this._boundOnClick, false);
24257 }
24258 }, {
24259 key: "disconnectedCallback",
24260 value: function disconnectedCallback() {
24261 this.removeEventListener('click', this._boundOnClick, false);
24262 }
24263 }, {
24264 key: "_updateRipple",
24265 value: function _updateRipple() {
24266 util$4.updateRipple(this);
24267 }
24268 }, {
24269 key: "_onClick",
24270 value: function _onClick(e) {
24271 e.stopPropagation();
24272 }
24273 }, {
24274 key: "_compile",
24275 value: function _compile() {
24276 var _this2 = this;
24277
24278 autoStyle.prepare(this);
24279 defaultClassName$3.split(/\s+/).forEach(function (token) {
24280 return _this2.classList.add(token);
24281 });
24282 util$4.addModifier(this, 'mini');
24283
24284 this._updateRipple();
24285
24286 ModifierUtil.initModifier(this, scheme$5);
24287 }
24288 }], [{
24289 key: "observedAttributes",
24290 get: function get() {
24291 return ['modifier', 'ripple', 'class'];
24292 }
24293 }]);
24294
24295 return SpeedDialItemElement;
24296 }(BaseElement);
24297 util$4.defineBooleanProperties(SpeedDialItemElement, ['ripple']);
24298 onsElements.SpeedDialItem = SpeedDialItemElement;
24299 customElements.define('ons-speed-dial-item', SpeedDialItemElement);
24300
24301 var defaultClassName$2 = 'speed-dial';
24302 var scheme$4 = {
24303 '': 'speed-dial--*'
24304 };
24305 /**
24306 * @element ons-speed-dial
24307 * @category control
24308 * @description
24309 * [en]
24310 * Element that displays a Material Design Speed Dialog component. It is useful when there are more than one primary action that can be performed in a page.
24311 *
24312 * The Speed dial looks like a `<ons-fab>` element but will expand a menu when tapped.
24313 * [/en]
24314 * [ja][/ja]
24315 * @codepen dYQYLg
24316 * @tutorial vanilla/Reference/speed-dial
24317 * @seealso ons-speed-dial-item
24318 * [en]The `<ons-speed-dial-item>` represents a menu item.[/en]
24319 * [ja]ons-speed-dial-itemコンポーネント[/ja]
24320 * @seealso ons-fab
24321 * [en]ons-fab component[/en]
24322 * [ja]ons-fabコンポーネント[/ja]
24323 * @example
24324 * <ons-speed-dial position="left bottom">
24325 * <ons-fab>
24326 * <ons-icon icon="fa-twitter"></ons-icon>
24327 * </ons-fab>
24328 * <ons-speed-dial-item>A</ons-speed-dial-item>
24329 * <ons-speed-dial-item>B</ons-speed-dial-item>
24330 * <ons-speed-dial-item>C</ons-speed-dial-item>
24331 * </ons-speed-dial>
24332 */
24333
24334 var SpeedDialElement = /*#__PURE__*/function (_BaseElement) {
24335 _inherits(SpeedDialElement, _BaseElement);
24336
24337 var _super = _createSuper(SpeedDialElement);
24338
24339 /**
24340 * @event open
24341 * @description
24342 * [en]Fired when the menu items are shown.[/en]
24343 * [ja][/ja]
24344 */
24345
24346 /**
24347 * @event close
24348 * @description
24349 * [en]Fired when the menu items are hidden.[/en]
24350 * [ja][/ja]
24351 */
24352
24353 /**
24354 * @attribute modifier
24355 * @type {String}
24356 * @description
24357 * [en]The appearance of the component.[/en]
24358 * [ja]このコンポーネントの表現を指定します。[/ja]
24359 */
24360
24361 /**
24362 * @attribute ripple
24363 * @description
24364 * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
24365 * [ja][/ja]
24366 */
24367
24368 /**
24369 * @property ripple
24370 * @type {Boolean}
24371 * @description
24372 * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
24373 * [ja][/ja]
24374 */
24375
24376 /**
24377 * @attribute position
24378 * @type {String}
24379 * @description
24380 * [en]
24381 * Specify the vertical and horizontal position of the component.
24382 * I.e. to display it in the top right corner specify "right top".
24383 * Choose from "right", "left", "top" and "bottom".
24384 * [/en]
24385 * [ja]
24386 * この要素を表示する左右と上下の位置を指定します。
24387 * 例えば、右上に表示する場合には"right top"を指定します。
24388 * 左右と上下の位置の指定には、rightとleft、topとbottomがそれぞれ指定できます。
24389 * [/ja]
24390 */
24391
24392 /**
24393 * @attribute direction
24394 * @type {String}
24395 * @description
24396 * [en]Specify the direction the items are displayed. Possible values are "up", "down", "left" and "right".[/en]
24397 * [ja]
24398 * 要素が表示する方向を指定します。up, down, left, rightが指定できます。
24399 * [/ja]
24400 */
24401
24402 /**
24403 * @attribute disabled
24404 * @description
24405 * [en]Specify if button should be disabled.[/en]
24406 * [ja]無効化する場合に指定します。[/ja]
24407 */
24408 function SpeedDialElement() {
24409 var _this;
24410
24411 _classCallCheck(this, SpeedDialElement);
24412
24413 _this = _super.call(this);
24414 contentReady(_assertThisInitialized(_this), function () {
24415 _this._compile();
24416 });
24417 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
24418
24419 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
24420 onConnected = _util$defineListenerP.onConnected,
24421 onDisconnected = _util$defineListenerP.onDisconnected;
24422
24423 _this._connectOnClick = onConnected;
24424 _this._disconnectOnClick = onDisconnected;
24425 return _this;
24426 }
24427
24428 _createClass(SpeedDialElement, [{
24429 key: "_compile",
24430 value: function _compile() {
24431 this.classList.add(defaultClassName$2);
24432 autoStyle.prepare(this);
24433
24434 this._updateRipple();
24435
24436 ModifierUtil.initModifier(this, scheme$4);
24437
24438 if (this.hasAttribute('direction')) {
24439 this._updateDirection(this.getAttribute('direction'));
24440 } else {
24441 this._updateDirection('up');
24442 }
24443
24444 this._updatePosition();
24445 }
24446 }, {
24447 key: "attributeChangedCallback",
24448 value: function attributeChangedCallback(name, last, current) {
24449 var _this2 = this;
24450
24451 switch (name) {
24452 case 'class':
24453 util$4.restoreClass(this, defaultClassName$2, scheme$4);
24454 break;
24455
24456 case 'modifier':
24457 ModifierUtil.onModifierChanged(last, current, this, scheme$4);
24458 break;
24459
24460 case 'ripple':
24461 contentReady(this, function () {
24462 return _this2._updateRipple();
24463 });
24464 break;
24465
24466 case 'direction':
24467 contentReady(this, function () {
24468 return _this2._updateDirection(current);
24469 });
24470 break;
24471
24472 case 'position':
24473 contentReady(this, function () {
24474 return _this2._updatePosition();
24475 });
24476 break;
24477
24478 case 'open':
24479 if (!this._ignoreOpenSideEffect) {
24480 contentReady(this, function () {
24481 return _this2._updateOpen(last);
24482 });
24483 }
24484
24485 break;
24486 }
24487 }
24488 }, {
24489 key: "connectedCallback",
24490 value: function connectedCallback() {
24491 this.addEventListener('click', this._boundOnClick, false);
24492
24493 this._connectOnClick();
24494 }
24495 }, {
24496 key: "disconnectedCallback",
24497 value: function disconnectedCallback() {
24498 this.removeEventListener('click', this._boundOnClick, false);
24499
24500 this._disconnectOnClick();
24501 }
24502 }, {
24503 key: "items",
24504 get: function get() {
24505 return util$4.arrayFrom(this.querySelectorAll('ons-speed-dial-item'));
24506 }
24507 }, {
24508 key: "_fab",
24509 get: function get() {
24510 return util$4.findChild(this, 'ons-fab');
24511 }
24512 }, {
24513 key: "_onClick",
24514 value: function _onClick(event) {
24515 var _this3 = this;
24516
24517 setTimeout(function () {
24518 if (!event.defaultPrevented && !_this3.disabled && _this3.visible) {
24519 return _this3.toggleItems();
24520 }
24521 });
24522 }
24523 }, {
24524 key: "_show",
24525 value: function _show() {
24526 if (!this.inline) {
24527 return this.show();
24528 }
24529
24530 return Promise.resolve();
24531 }
24532 }, {
24533 key: "_hide",
24534 value: function _hide() {
24535 var _this4 = this;
24536
24537 return new Promise(function (resolve) {
24538 if (!_this4.inline) {
24539 setImmediate(function () {
24540 return _this4.hide().then(resolve);
24541 });
24542 } else {
24543 resolve();
24544 }
24545 });
24546 }
24547 }, {
24548 key: "_updateRipple",
24549 value: function _updateRipple() {
24550 if (this._fab) {
24551 this.hasAttribute('ripple') ? this._fab.setAttribute('ripple', '') : this._fab.removeAttribute('ripple');
24552 }
24553 }
24554 }, {
24555 key: "_updateDirection",
24556 value: function _updateDirection(direction) {
24557 var children = this.items;
24558
24559 for (var i = 0; i < children.length; i++) {
24560 styler(children[i], {
24561 transitionDelay: 25 * i + 'ms',
24562 bottom: 'auto',
24563 right: 'auto',
24564 top: 'auto',
24565 left: 'auto'
24566 });
24567 }
24568
24569 switch (direction) {
24570 case 'up':
24571 for (var _i = 0; _i < children.length; _i++) {
24572 children[_i].style.bottom = 72 + 56 * _i + 'px';
24573 children[_i].style.right = '8px';
24574 }
24575
24576 break;
24577
24578 case 'down':
24579 for (var _i2 = 0; _i2 < children.length; _i2++) {
24580 children[_i2].style.top = 72 + 56 * _i2 + 'px';
24581 children[_i2].style.left = '8px';
24582 }
24583
24584 break;
24585
24586 case 'left':
24587 for (var _i3 = 0; _i3 < children.length; _i3++) {
24588 children[_i3].style.top = '8px';
24589 children[_i3].style.right = 72 + 56 * _i3 + 'px';
24590 }
24591
24592 break;
24593
24594 case 'right':
24595 for (var _i4 = 0; _i4 < children.length; _i4++) {
24596 children[_i4].style.top = '8px';
24597 children[_i4].style.left = 72 + 56 * _i4 + 'px';
24598 }
24599
24600 break;
24601
24602 default:
24603 util$4.throw('Argument must be one of up, down, left or right.');
24604 }
24605 }
24606 }, {
24607 key: "_updatePosition",
24608 value: function _updatePosition() {
24609 var position = this.getAttribute('position');
24610 this.classList.remove('fab--top__left', 'fab--bottom__right', 'fab--bottom__left', 'fab--top__right', 'fab--top__center', 'fab--bottom__center');
24611
24612 switch (position) {
24613 case 'top right':
24614 case 'right top':
24615 this.classList.add('fab--top__right');
24616 break;
24617
24618 case 'top left':
24619 case 'left top':
24620 this.classList.add('fab--top__left');
24621 break;
24622
24623 case 'bottom right':
24624 case 'right bottom':
24625 this.classList.add('fab--bottom__right');
24626 break;
24627
24628 case 'bottom left':
24629 case 'left bottom':
24630 this.classList.add('fab--bottom__left');
24631 break;
24632
24633 case 'center top':
24634 case 'top center':
24635 this.classList.add('fab--top__center');
24636 break;
24637
24638 case 'center bottom':
24639 case 'bottom center':
24640 this.classList.add('fab--bottom__center');
24641 break;
24642 }
24643 }
24644 }, {
24645 key: "_getTranslate",
24646 value: function _getTranslate() {
24647 var isBottom = (this.getAttribute('position') || '').indexOf('bottom') >= 0;
24648 var translate = isBottom ? "translate3d(0px, -".concat(util$4.globals.fabOffset || 0, "px, 0px) ") : '';
24649 return translate;
24650 }
24651 /**
24652 * @method show
24653 * @signature show()
24654 * @description
24655 * [en]Show the speed dial.[/en]
24656 * [ja]Speed dialを表示します。[/ja]
24657 */
24658
24659 }, {
24660 key: "show",
24661 value: function show() {
24662 this._fab.show();
24663
24664 styler(this, {
24665 transform: this._getTranslate
24666 });
24667 return Promise.resolve();
24668 }
24669 /**
24670 * @method hide
24671 * @signature hide()
24672 * @description
24673 * [en]Hide the speed dial.[/en]
24674 * [ja]Speed dialを非表示にします。[/ja]
24675 */
24676
24677 }, {
24678 key: "hide",
24679 value: function hide() {
24680 var _this5 = this;
24681
24682 return this.hideItems().then(function () {
24683 return _this5._fab.hide();
24684 });
24685 }
24686 /**
24687 * @method showItems
24688 * @signature showItems()
24689 * @description
24690 * [en]Show the speed dial items.[/en]
24691 * [ja]Speed dialの子要素を表示します。[/ja]
24692 */
24693
24694 }, {
24695 key: "showItems",
24696 value: function showItems() {
24697 var last = this.open;
24698 this._ignoreOpenSideEffect = true;
24699 this.open = true;
24700 this._ignoreOpenSideEffect = false;
24701 return this._updateOpen(last);
24702 }
24703 /**
24704 * @method hideItems
24705 * @signature hideItems()
24706 * @description
24707 * [en]Hide the speed dial items.[/en]
24708 * [ja]Speed dialの子要素を非表示にします。[/ja]
24709 */
24710
24711 }, {
24712 key: "hideItems",
24713 value: function hideItems() {
24714 var last = this.open;
24715 this._ignoreOpenSideEffect = true;
24716 this.open = false;
24717 this._ignoreOpenSideEffect = false;
24718 return this._updateOpen(last);
24719 }
24720 }, {
24721 key: "_updateOpen",
24722 value: function _updateOpen(last) {
24723 // update direction
24724 if (this.open) {
24725 if (this.hasAttribute('direction')) {
24726 this._updateDirection(this.getAttribute('direction'));
24727 } else {
24728 this._updateDirection('up');
24729 }
24730 }
24731
24732 var totalDelay = 0;
24733
24734 if (last !== this.open) {
24735 // do nothing if already open/closed
24736 var children = this.items;
24737
24738 for (var i = 0; i < children.length; i++) {
24739 var delay = 25 * (this.open ? i : children.length - i);
24740 totalDelay += delay;
24741 styler(children[i], {
24742 transform: "scale(".concat(this.open ? 1 : 0, ")"),
24743 transitionDelay: delay + 'ms'
24744 });
24745 }
24746
24747 totalDelay += 50;
24748 util$4.triggerElementEvent(this, this.open ? 'open' : 'close');
24749 }
24750
24751 var deferred = util$4.defer();
24752 setTimeout(deferred.resolve, totalDelay);
24753 return deferred.promise;
24754 }
24755 /**
24756 * @property disabled
24757 * @type {Boolean}
24758 * @description
24759 * [en]Whether the element is disabled or not.[/en]
24760 * [ja]無効化されている場合に`true`。[/ja]
24761 */
24762
24763 }, {
24764 key: "disabled",
24765 get: function get() {
24766 return this.hasAttribute('disabled');
24767 }
24768 /**
24769 * @property inline
24770 * @readonly
24771 * @type {Boolean}
24772 * @description
24773 * [en]Whether the element is inline or not.[/en]
24774 * [ja]インライン要素の場合に`true`。[/ja]
24775 */
24776 ,
24777 set: function set(value) {
24778 if (value) {
24779 this.hideItems();
24780 }
24781
24782 util$4.arrayFrom(this.children).forEach(function (e) {
24783 util$4.match(e, '.fab') && util$4.toggleAttribute(e, 'disabled', value);
24784 });
24785 util$4.toggleAttribute(this, 'disabled', value);
24786 }
24787 }, {
24788 key: "inline",
24789 get: function get() {
24790 return this.hasAttribute('inline');
24791 }
24792 /**
24793 * @property visible
24794 * @readonly
24795 * @type {Boolean}
24796 * @description
24797 * [en]Whether the element is visible or not.[/en]
24798 * [ja]要素が見える場合に`true`。[/ja]
24799 */
24800
24801 }, {
24802 key: "visible",
24803 get: function get() {
24804 return this._fab && this._fab.visible && this.style.display !== 'none';
24805 }
24806 /**
24807 * @method isOpen
24808 * @signature isOpen()
24809 * @description
24810 * [en]Returns whether the menu is open or not.[/en]
24811 * [ja][/ja]
24812 */
24813
24814 }, {
24815 key: "isOpen",
24816 value: function isOpen() {
24817 return this.open;
24818 }
24819 /**
24820 * @attribute open
24821 * @type {Boolean}
24822 * @description
24823 * [en]Returns whether the menu is open or not.[/en]
24824 * [ja][/ja]
24825 */
24826
24827 /**
24828 * @property open
24829 * @type {Boolean}
24830 * @description
24831 * [en]Returns whether the menu is open or not.[/en]
24832 * [ja][/ja]
24833 */
24834
24835 /**
24836 * @method toggle
24837 * @signature toggle()
24838 * @description
24839 * [en]Toggle visibility.[/en]
24840 * [ja]Speed dialの表示非表示を切り替えます。[/ja]
24841 */
24842
24843 }, {
24844 key: "toggle",
24845 value: function toggle() {
24846 return this.visible ? this.hide() : this.show();
24847 }
24848 /**
24849 * @method toggleItems
24850 * @signature toggleItems()
24851 * @description
24852 * [en]Toggle item visibility.[/en]
24853 * [ja]Speed dialの子要素の表示非表示を切り替えます。[/ja]
24854 */
24855
24856 }, {
24857 key: "toggleItems",
24858 value: function toggleItems() {
24859 return this.open ? this.hideItems() : this.showItems();
24860 }
24861 }], [{
24862 key: "observedAttributes",
24863 get: function get() {
24864 return ['class', 'modifier', 'ripple', 'direction', 'position', 'open'];
24865 }
24866 }, {
24867 key: "events",
24868 get: function get() {
24869 return ['open', 'close'];
24870 }
24871 }]);
24872
24873 return SpeedDialElement;
24874 }(BaseElement);
24875 util$4.defineBooleanProperties(SpeedDialElement, ['open', 'ripple']);
24876 onsElements.SpeedDial = SpeedDialElement;
24877 customElements.define('ons-speed-dial', SpeedDialElement);
24878
24879 var rewritables$2 = {
24880 /**
24881 * @param {Element} element
24882 * @param {Function} callback
24883 */
24884 ready: function ready(element, callback) {
24885 setImmediate(callback);
24886 }
24887 };
24888 /**
24889 * @element ons-splitter-content
24890 * @category menu
24891 * @description
24892 * [en]
24893 * The `<ons-splitter-content>` element is used as a child element of `<ons-splitter>`.
24894 *
24895 * It contains the main content of the page while `<ons-splitter-side>` contains the list.
24896 * [/en]
24897 * [ja]ons-splitter-content要素は、ons-splitter要素の子要素として利用します。[/ja]
24898 * @codepen rOQOML
24899 * @tutorial vanilla/Reference/splitter
24900 * @guide fundamentals.html#managing-pages
24901 * [en]Managing multiple pages.[/en]
24902 * [ja]複数のページを管理する[/ja]
24903 * @seealso ons-splitter
24904 * [en]The `<ons-splitter>` component is the parent element.[/en]
24905 * [ja]ons-splitterコンポーネント[/ja]
24906 * @seealso ons-splitter-side
24907 * [en]The `<ons-splitter-side>` component contains the menu.[/en]
24908 * [ja]ons-splitter-sideコンポーネント[/ja]
24909 * @example
24910 * <ons-splitter>
24911 * <ons-splitter-content>
24912 * ...
24913 * </ons-splitter-content>
24914 *
24915 * <ons-splitter-side side="left" width="80%" collapse>
24916 * ...
24917 * </ons-splitter-side>
24918 * </ons-splitter>
24919 */
24920
24921 var SplitterContentElement = /*#__PURE__*/function (_BaseElement) {
24922 _inherits(SplitterContentElement, _BaseElement);
24923
24924 var _super = _createSuper(SplitterContentElement);
24925
24926 /**
24927 * @attribute page
24928 * @type {String}
24929 * @description
24930 * [en]
24931 * The url of the content page. If this attribute is used the content will be loaded from a `<template>` tag or a remote file.
24932 *
24933 * It is also possible to put `<ons-page>` element as a child of the element.
24934 * [/en]
24935 * [ja]ons-splitter-content要素に表示するページのURLを指定します。[/ja]
24936 */
24937 function SplitterContentElement() {
24938 var _this;
24939
24940 _classCallCheck(this, SplitterContentElement);
24941
24942 _this = _super.call(this);
24943 _this._page = null;
24944 _this._pageLoader = defaultPageLoader;
24945 contentReady(_assertThisInitialized(_this), function () {
24946 rewritables$2.ready(_assertThisInitialized(_this), function () {
24947 var page = _this._getPageTarget();
24948
24949 if (page) {
24950 _this.load(page);
24951 }
24952 });
24953 });
24954 return _this;
24955 }
24956
24957 _createClass(SplitterContentElement, [{
24958 key: "connectedCallback",
24959 value: function connectedCallback() {
24960 if (!util$4.match(this.parentNode, 'ons-splitter')) {
24961 util$4.throw('"ons-splitter-content" must have "ons-splitter" as parent');
24962 }
24963 }
24964 }, {
24965 key: "_getPageTarget",
24966 value: function _getPageTarget() {
24967 return this._page || this.getAttribute('page');
24968 }
24969 }, {
24970 key: "disconnectedCallback",
24971 value: function disconnectedCallback() {}
24972 }, {
24973 key: "attributeChangedCallback",
24974 value: function attributeChangedCallback(name, last, current) {}
24975 /**
24976 * @property page
24977 * @type {HTMLElement}
24978 * @description
24979 * [en]The page to load in the splitter content.[/en]
24980 * [ja]この要素内に表示するページを指定します。[/ja]
24981 */
24982
24983 }, {
24984 key: "page",
24985 get: function get() {
24986 return this._page;
24987 }
24988 /**
24989 * @param {*} page
24990 */
24991 ,
24992 set: function set(page) {
24993 this._page = page;
24994 }
24995 }, {
24996 key: "_content",
24997 get: function get() {
24998 return this.children[0];
24999 }
25000 /**
25001 * @property pageLoader
25002 * @type {Function}
25003 * @description
25004 * [en]Page element loaded in the splitter content.[/en]
25005 * [ja]この要素内に表示するページを指定します。[/ja]
25006 */
25007
25008 }, {
25009 key: "pageLoader",
25010 get: function get() {
25011 return this._pageLoader;
25012 },
25013 set: function set(loader) {
25014 if (!(loader instanceof PageLoader)) {
25015 util$4.throwPageLoader();
25016 }
25017
25018 this._pageLoader = loader;
25019 }
25020 /**
25021 * @method load
25022 * @signature load(page, [options])
25023 * @param {String} page, [options]
25024 * [en]Page URL. Can be either an HTML document or an `<template>` id.[/en]
25025 * [ja]pageのURLか、`<template>`で宣言したテンプレートのid属性の値を指定します。[/ja]
25026 * @param {Object} [options]
25027 * @param {Function} [options.callback]
25028 * @description
25029 * [en]Show the page specified in `page` in the content.[/en]
25030 * [ja]指定したURLをメインページを読み込みます。[/ja]
25031 * @return {Promise}
25032 * [en]Resolves to the new `<ons-page>` element[/en]
25033 * [ja]`<ons-page>`要素を解決するPromiseオブジェクトを返します。[/ja]
25034 */
25035
25036 }, {
25037 key: "load",
25038 value: function load(page) {
25039 var _this2 = this;
25040
25041 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
25042 this._page = page;
25043
25044 var callback = options.callback || function () {};
25045
25046 return new Promise(function (resolve) {
25047 var oldContent = _this2._content || null;
25048
25049 _this2._pageLoader.load({
25050 page: page,
25051 parent: _this2
25052 }, function (pageElement) {
25053 if (oldContent) {
25054 _this2._pageLoader.unload(oldContent);
25055
25056 oldContent = null;
25057 }
25058
25059 setImmediate(function () {
25060 return _this2._show();
25061 });
25062 callback(pageElement);
25063 resolve(pageElement);
25064 });
25065 });
25066 }
25067 }, {
25068 key: "_show",
25069 value: function _show() {
25070 if (this._content) {
25071 this._content._show();
25072 }
25073 }
25074 }, {
25075 key: "_hide",
25076 value: function _hide() {
25077 if (this._content) {
25078 this._content._hide();
25079 }
25080 }
25081 }, {
25082 key: "_destroy",
25083 value: function _destroy() {
25084 if (this._content) {
25085 this._pageLoader.unload(this._content);
25086 }
25087
25088 this.remove();
25089 }
25090 }], [{
25091 key: "observedAttributes",
25092 get: function get() {
25093 return [];
25094 }
25095 }, {
25096 key: "rewritables",
25097 get: function get() {
25098 return rewritables$2;
25099 }
25100 }]);
25101
25102 return SplitterContentElement;
25103 }(BaseElement);
25104 onsElements.SplitterContent = SplitterContentElement;
25105 customElements.define('ons-splitter-content', SplitterContentElement);
25106
25107 var SplitterMaskElement = /*#__PURE__*/function (_BaseElement) {
25108 _inherits(SplitterMaskElement, _BaseElement);
25109
25110 var _super = _createSuper(SplitterMaskElement);
25111
25112 function SplitterMaskElement() {
25113 var _this;
25114
25115 _classCallCheck(this, SplitterMaskElement);
25116
25117 _this = _super.call(this);
25118 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
25119 contentReady(_assertThisInitialized(_this), function () {
25120 if (_this.parentNode._sides.every(function (side) {
25121 return side.mode === 'split';
25122 })) {
25123 _this.setAttribute('style', 'display: none !important');
25124 }
25125 });
25126 return _this;
25127 }
25128
25129 _createClass(SplitterMaskElement, [{
25130 key: "_onClick",
25131 value: function _onClick(event) {
25132 if (this.onClick instanceof Function) {
25133 this.onClick();
25134 } else if (util$4.match(this.parentNode, 'ons-splitter')) {
25135 this.parentNode._sides.forEach(function (side) {
25136 return side.close('left').catch(function () {});
25137 });
25138 }
25139
25140 event.stopPropagation();
25141 }
25142 }, {
25143 key: "attributeChangedCallback",
25144 value: function attributeChangedCallback(name, last, current) {}
25145 }, {
25146 key: "connectedCallback",
25147 value: function connectedCallback() {
25148 this.addEventListener('click', this._boundOnClick);
25149 }
25150 }, {
25151 key: "disconnectedCallback",
25152 value: function disconnectedCallback() {
25153 this.removeEventListener('click', this._boundOnClick);
25154 }
25155 }], [{
25156 key: "observedAttributes",
25157 get: function get() {
25158 return [];
25159 }
25160 }]);
25161
25162 return SplitterMaskElement;
25163 }(BaseElement);
25164 onsElements.SplitterMask = SplitterMaskElement;
25165 customElements.define('ons-splitter-mask', SplitterMaskElement);
25166
25167 var SplitterAnimator$1 = /*#__PURE__*/function (_BaseAnimator) {
25168 _inherits(SplitterAnimator, _BaseAnimator);
25169
25170 var _super = _createSuper(SplitterAnimator);
25171
25172 function SplitterAnimator() {
25173 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
25174 _ref$timing = _ref.timing,
25175 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
25176 _ref$duration = _ref.duration,
25177 duration = _ref$duration === void 0 ? 0.3 : _ref$duration,
25178 _ref$delay = _ref.delay,
25179 delay = _ref$delay === void 0 ? 0 : _ref$delay;
25180
25181 _classCallCheck(this, SplitterAnimator);
25182
25183 return _super.call(this, {
25184 timing: timing,
25185 duration: duration,
25186 delay: delay
25187 });
25188 }
25189
25190 _createClass(SplitterAnimator, [{
25191 key: "updateOptions",
25192 value: function updateOptions() {
25193 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
25194 util$4.extend(this, {
25195 timing: this.timing,
25196 duration: this.duration,
25197 delay: this.delay
25198 }, options);
25199 }
25200 /**
25201 * @param {Element} sideElement
25202 */
25203
25204 }, {
25205 key: "activate",
25206 value: function activate(sideElement) {
25207 var _this = this;
25208
25209 var splitter = sideElement.parentNode;
25210 contentReady(splitter, function () {
25211 _this._side = sideElement;
25212 _this._oppositeSide = splitter.right !== sideElement && splitter.right || splitter.left !== sideElement && splitter.left;
25213 _this._content = splitter.content;
25214 _this._mask = splitter.mask;
25215 });
25216 }
25217 }, {
25218 key: "deactivate",
25219 value: function deactivate() {
25220 this.clearTransition();
25221 this._mask && this.clearMask();
25222 this._content = this._side = this._oppositeSide = this._mask = null;
25223 }
25224 }, {
25225 key: "minus",
25226 get: function get() {
25227 return this._side.side === 'right' ? '-' : '';
25228 }
25229 }, {
25230 key: "clearTransition",
25231 value: function clearTransition() {
25232 var _this2 = this;
25233
25234 'side mask content'.split(/\s+/).forEach(function (e) {
25235 return _this2['_' + e] && styler.clear(_this2['_' + e], 'transform transition');
25236 });
25237 }
25238 }, {
25239 key: "clearMask",
25240 value: function clearMask() {
25241 // Check if the other side needs the mask before clearing
25242 if (!this._oppositeSide || this._oppositeSide.mode === 'split' || !this._oppositeSide.isOpen) {
25243 this._mask.style.opacity = '';
25244 this._mask.style.display = 'none';
25245 }
25246 }
25247 /**
25248 * @param {Number} distance
25249 */
25250
25251 }, {
25252 key: "translate",
25253 value: function translate(distance) {}
25254 /**
25255 * @param {Function} done
25256 */
25257
25258 }, {
25259 key: "open",
25260 value: function open(done) {
25261 done();
25262 }
25263 /**
25264 * @param {Function} done
25265 */
25266
25267 }, {
25268 key: "close",
25269 value: function close(done) {
25270 done();
25271 }
25272 }]);
25273
25274 return SplitterAnimator;
25275 }(BaseAnimator);
25276
25277 var OverlaySplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
25278 _inherits(OverlaySplitterAnimator, _SplitterAnimator);
25279
25280 var _super = _createSuper(OverlaySplitterAnimator);
25281
25282 function OverlaySplitterAnimator() {
25283 _classCallCheck(this, OverlaySplitterAnimator);
25284
25285 return _super.apply(this, arguments);
25286 }
25287
25288 _createClass(OverlaySplitterAnimator, [{
25289 key: "translate",
25290 value: function translate(distance) {
25291 this._mask.style.display = 'block'; // Avoid content clicks
25292
25293 Animit(this._side).queue({
25294 transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
25295 }).play();
25296 }
25297 /**
25298 * @param {Function} done
25299 */
25300
25301 }, {
25302 key: "open",
25303 value: function open(done) {
25304 Animit.runAll(Animit(this._side).wait(this.delay).queue({
25305 transform: "translate3d(".concat(this.minus, "100%, 0, 0)")
25306 }, this.def).queue(function (callback) {
25307 callback();
25308 done && done();
25309 }), Animit(this._mask).wait(this.delay).queue({
25310 display: 'block'
25311 }).queue({
25312 opacity: '1'
25313 }, {
25314 duration: this.duration,
25315 timing: 'linear'
25316 }));
25317 }
25318 /**
25319 * @param {Function} done
25320 */
25321
25322 }, {
25323 key: "close",
25324 value: function close(done) {
25325 Animit.runAll(Animit(this._side).wait(this.delay).queue({
25326 transform: 'translate3d(0, 0, 0)'
25327 }, this.def).queue(function (callback) {
25328 done && done();
25329 callback();
25330 }), Animit(this._mask).wait(this.delay).queue({
25331 opacity: '0'
25332 }, {
25333 duration: this.duration,
25334 timing: 'linear'
25335 }).queue({
25336 display: 'none'
25337 }));
25338 }
25339 }]);
25340
25341 return OverlaySplitterAnimator;
25342 }(SplitterAnimator$1);
25343
25344 var PushSplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
25345 _inherits(PushSplitterAnimator, _SplitterAnimator);
25346
25347 var _super = _createSuper(PushSplitterAnimator);
25348
25349 function PushSplitterAnimator() {
25350 _classCallCheck(this, PushSplitterAnimator);
25351
25352 return _super.apply(this, arguments);
25353 }
25354
25355 _createClass(PushSplitterAnimator, [{
25356 key: "_getSlidingElements",
25357 value: function _getSlidingElements() {
25358 var slidingElements = [this._side, this._content];
25359
25360 if (this._oppositeSide && this._oppositeSide.mode === 'split') {
25361 slidingElements.push(this._oppositeSide);
25362 }
25363
25364 return slidingElements;
25365 }
25366 }, {
25367 key: "translate",
25368 value: function translate(distance) {
25369 if (!this._slidingElements) {
25370 this._slidingElements = this._getSlidingElements();
25371 }
25372
25373 this._mask.style.display = 'block'; // Avoid content clicks
25374
25375 Animit(this._slidingElements).queue({
25376 transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
25377 }).play();
25378 }
25379 /**
25380 * @param {Function} done
25381 */
25382
25383 }, {
25384 key: "open",
25385 value: function open(done) {
25386 var _this = this;
25387
25388 var max = this._side.offsetWidth;
25389 this._slidingElements = this._getSlidingElements();
25390 Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
25391 transform: "translate3d(".concat(this.minus + max, "px, 0, 0)")
25392 }, this.def).queue(function (callback) {
25393 _this._slidingElements = null;
25394 callback();
25395 done && done();
25396 }), Animit(this._mask).wait(this.delay).queue({
25397 display: 'block'
25398 }));
25399 }
25400 /**
25401 * @param {Function} done
25402 */
25403
25404 }, {
25405 key: "close",
25406 value: function close(done) {
25407 var _this2 = this;
25408
25409 this._slidingElements = this._getSlidingElements();
25410 Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
25411 transform: 'translate3d(0, 0, 0)'
25412 }, this.def).queue(function (callback) {
25413 _this2._slidingElements = null;
25414
25415 _get(_getPrototypeOf(PushSplitterAnimator.prototype), "clearTransition", _this2).call(_this2);
25416
25417 done && done();
25418 callback();
25419 }), Animit(this._mask).wait(this.delay).queue({
25420 display: 'none'
25421 }));
25422 }
25423 }]);
25424
25425 return PushSplitterAnimator;
25426 }(SplitterAnimator$1);
25427
25428 var RevealSplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
25429 _inherits(RevealSplitterAnimator, _SplitterAnimator);
25430
25431 var _super = _createSuper(RevealSplitterAnimator);
25432
25433 function RevealSplitterAnimator() {
25434 _classCallCheck(this, RevealSplitterAnimator);
25435
25436 return _super.apply(this, arguments);
25437 }
25438
25439 _createClass(RevealSplitterAnimator, [{
25440 key: "_getSlidingElements",
25441 value: function _getSlidingElements() {
25442 var slidingElements = [this._content, this._mask];
25443
25444 if (this._oppositeSide && this._oppositeSide.mode === 'split') {
25445 slidingElements.push(this._oppositeSide);
25446 }
25447
25448 return slidingElements;
25449 }
25450 }, {
25451 key: "activate",
25452 value: function activate(sideElement) {
25453 _get(_getPrototypeOf(RevealSplitterAnimator.prototype), "activate", this).call(this, sideElement);
25454
25455 if (sideElement.mode === 'collapse') {
25456 this._setStyles(sideElement);
25457 }
25458 }
25459 }, {
25460 key: "deactivate",
25461 value: function deactivate() {
25462 this._side && this._unsetStyles(this._side);
25463
25464 _get(_getPrototypeOf(RevealSplitterAnimator.prototype), "deactivate", this).call(this);
25465 }
25466 }, {
25467 key: "_setStyles",
25468 value: function _setStyles(sideElement) {
25469 styler(sideElement, {
25470 left: sideElement.side === 'right' ? 'auto' : 0,
25471 right: sideElement.side === 'right' ? 0 : 'auto',
25472 zIndex: 0,
25473 backgroundColor: 'black',
25474 transform: this._generateBehindPageStyle(0).container.transform,
25475 display: 'none'
25476 });
25477 var splitter = sideElement.parentElement;
25478 contentReady(splitter, function () {
25479 return splitter.content && styler(splitter.content, {
25480 boxShadow: '0 0 12px 0 rgba(0, 0, 0, 0.2)'
25481 });
25482 });
25483 }
25484 }, {
25485 key: "_unsetStyles",
25486 value: function _unsetStyles(sideElement) {
25487 styler.clear(sideElement, 'left right zIndex backgroundColor display');
25488
25489 if (sideElement._content) {
25490 sideElement._content.style.opacity = '';
25491 } // Check if the other side needs the common styles
25492
25493
25494 if (!this._oppositeSide || this._oppositeSide.mode === 'split') {
25495 sideElement.parentElement.content && styler.clear(sideElement.parentElement.content, 'boxShadow');
25496 }
25497 }
25498 }, {
25499 key: "_generateBehindPageStyle",
25500 value: function _generateBehindPageStyle(distance) {
25501 var max = this.maxWidth;
25502 var behindDistance = (distance - max) / max * 10;
25503 behindDistance = isNaN(behindDistance) ? 0 : Math.max(Math.min(behindDistance, 0), -10);
25504 var behindTransform = "translate3d(".concat((this.minus ? -1 : 1) * behindDistance, "%, 0, 0)");
25505 var opacity = 1 + behindDistance / 100;
25506 return {
25507 content: {
25508 opacity: opacity
25509 },
25510 container: {
25511 transform: behindTransform
25512 }
25513 };
25514 }
25515 }, {
25516 key: "translate",
25517 value: function translate(distance) {
25518 this._side.style.display = '';
25519 this._side.style.zIndex = 1;
25520 this.maxWidth = this.maxWidth || this._getMaxWidth();
25521
25522 var menuStyle = this._generateBehindPageStyle(Math.min(distance, this.maxWidth));
25523
25524 if (!this._slidingElements) {
25525 this._slidingElements = this._getSlidingElements();
25526 }
25527
25528 this._mask.style.display = 'block'; // Avoid content clicks
25529
25530 Animit.runAll(Animit(this._slidingElements).queue({
25531 transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
25532 }), Animit(this._side._content).queue(menuStyle.content), Animit(this._side).queue(menuStyle.container));
25533 }
25534 /**
25535 * @param {Function} done
25536 */
25537
25538 }, {
25539 key: "open",
25540 value: function open(done) {
25541 var _this = this;
25542
25543 this._side.style.display = '';
25544 this._side.style.zIndex = 1;
25545 this.maxWidth = this.maxWidth || this._getMaxWidth();
25546
25547 var menuStyle = this._generateBehindPageStyle(this.maxWidth);
25548
25549 this._slidingElements = this._getSlidingElements();
25550 setTimeout(function () {
25551 // Fix: Time to update previous translate3d after changing style.display
25552 Animit.runAll(Animit(_this._slidingElements).wait(_this.delay).queue({
25553 transform: "translate3d(".concat(_this.minus + _this.maxWidth, "px, 0, 0)")
25554 }, _this.def), Animit(_this._mask).wait(_this.delay).queue({
25555 display: 'block'
25556 }), Animit(_this._side._content).wait(_this.delay).queue(menuStyle.content, _this.def), Animit(_this._side).wait(_this.delay).queue(menuStyle.container, _this.def).queue(function (callback) {
25557 _this._slidingElements = null;
25558 callback();
25559 done && done();
25560 }));
25561 }, 1000 / 60);
25562 }
25563 /**
25564 * @param {Function} done
25565 */
25566
25567 }, {
25568 key: "close",
25569 value: function close(done) {
25570 var _this2 = this;
25571
25572 var menuStyle = this._generateBehindPageStyle(0);
25573
25574 this._slidingElements = this._getSlidingElements();
25575 Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
25576 transform: 'translate3d(0, 0, 0)'
25577 }, this.def), Animit(this._mask).wait(this.delay).queue({
25578 display: 'none'
25579 }), Animit(this._side._content).wait(this.delay).queue(menuStyle.content, this.def), Animit(this._side).wait(this.delay).queue(menuStyle.container, this.def).queue(function (callback) {
25580 _this2._slidingElements = null;
25581 _this2._side.style.zIndex = 0;
25582 _this2._side.style.display = 'none';
25583 _this2._side._content.style.opacity = '';
25584 done && done();
25585 callback();
25586 }));
25587 }
25588 }, {
25589 key: "_getMaxWidth",
25590 value: function _getMaxWidth() {
25591 return this._side.offsetWidth;
25592 }
25593 }]);
25594
25595 return RevealSplitterAnimator;
25596 }(SplitterAnimator$1);
25597
25598 var _animatorDict$1 = {
25599 default: OverlaySplitterAnimator,
25600 overlay: OverlaySplitterAnimator,
25601 push: PushSplitterAnimator,
25602 reveal: RevealSplitterAnimator
25603 };
25604 /**
25605 * @element ons-splitter
25606 * @category menu
25607 * @description
25608 * [en]
25609 * A component that enables responsive layout by implementing both a two-column layout and a sliding menu layout.
25610 *
25611 * It can be configured to automatically expand into a column layout on large screens and collapse the menu on smaller screens. When the menu is collapsed the user can open it by swiping.
25612 * [/en]
25613 * [ja][/ja]
25614 * @codepen rOQOML
25615 * @tutorial vanilla/Reference/splitter
25616 * @guide fundamentals.html#managing-pages
25617 * [en]Managing multiple pages.[/en]
25618 * [ja]複数のページを管理する[/ja]
25619 * @seealso ons-splitter-content
25620 * [en]The `<ons-splitter-content>` component contains the main content of the page.[/en]
25621 * [ja]ons-splitter-contentコンポーネント[/ja]
25622 * @seealso ons-splitter-side
25623 * [en]The `<ons-splitter-side>` component contains the menu.[/en]
25624 * [ja]ons-splitter-sideコンポーネント[/ja]
25625 * @example
25626 * <ons-splitter id="splitter">
25627 * <ons-splitter-content>
25628 * ...
25629 * </ons-splitter-content>
25630 *
25631 * <ons-splitter-side side="left" width="80%" collapse swipeable>
25632 * ...
25633 * </ons-splitter-side>
25634 * </ons-splitter>
25635 *
25636 * <script>
25637 * var splitter = document.getElementById('splitter');
25638 * splitter.left.open();
25639 * </script>
25640 */
25641
25642 var SplitterElement = /*#__PURE__*/function (_BaseElement) {
25643 _inherits(SplitterElement, _BaseElement);
25644
25645 var _super = _createSuper(SplitterElement);
25646
25647 function SplitterElement() {
25648 var _this;
25649
25650 _classCallCheck(this, SplitterElement);
25651
25652 _this = _super.call(this);
25653 _this._onModeChange = _this._onModeChange.bind(_assertThisInitialized(_this));
25654 contentReady(_assertThisInitialized(_this), function () {
25655 !_this.mask && _this.appendChild(document.createElement('ons-splitter-mask'));
25656
25657 _this._layout();
25658 });
25659 return _this;
25660 }
25661
25662 _createClass(SplitterElement, [{
25663 key: "_getSide",
25664 value: function _getSide(side) {
25665 var element = util$4.findChild(this, function (e) {
25666 return util$4.match(e, 'ons-splitter-side') && e.getAttribute('side') === side;
25667 });
25668 return element;
25669 }
25670 /**
25671 * @property left
25672 * @readonly
25673 * @type {HTMLElement}
25674 * @description
25675 * [en]Left `<ons-splitter-side>` element.[/en]
25676 * [ja][/ja]
25677 */
25678
25679 }, {
25680 key: "left",
25681 get: function get() {
25682 return this._getSide('left');
25683 }
25684 /**
25685 * @property right
25686 * @readonly
25687 * @type {HTMLElement}
25688 * @description
25689 * [en]Right `<ons-splitter-side>` element.[/en]
25690 * [ja][/ja]
25691 */
25692
25693 }, {
25694 key: "right",
25695 get: function get() {
25696 return this._getSide('right');
25697 }
25698 /**
25699 * @property side
25700 * @readonly
25701 * @type {HTMLElement}
25702 * @description
25703 * [en]First `<ons-splitter-side>` element regardless the actual side.[/en]
25704 * [ja][/ja]
25705 */
25706
25707 }, {
25708 key: "side",
25709 get: function get() {
25710 return util$4.findChild(this, 'ons-splitter-side');
25711 }
25712 }, {
25713 key: "_sides",
25714 get: function get() {
25715 return [this.left, this.right].filter(function (e) {
25716 return e;
25717 });
25718 }
25719 /**
25720 * @property content
25721 * @readonly
25722 * @type {HTMLElement}
25723 * @description
25724 * [en]The `<ons-splitter-content>` element.[/en]
25725 * [ja][/ja]
25726 */
25727
25728 }, {
25729 key: "content",
25730 get: function get() {
25731 return util$4.findChild(this, 'ons-splitter-content');
25732 }
25733 }, {
25734 key: "topPage",
25735 get: function get() {
25736 return this.content._content;
25737 }
25738 }, {
25739 key: "mask",
25740 get: function get() {
25741 return util$4.findChild(this, 'ons-splitter-mask');
25742 }
25743 /**
25744 * @property onDeviceBackButton
25745 * @type {Object}
25746 * @description
25747 * [en]Back-button handler.[/en]
25748 * [ja]バックボタンハンドラ。[/ja]
25749 */
25750
25751 }, {
25752 key: "onDeviceBackButton",
25753 get: function get() {
25754 return this._backButtonHandler;
25755 },
25756 set: function set(callback) {
25757 if (this._backButtonHandler) {
25758 this._backButtonHandler.destroy();
25759 }
25760
25761 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
25762 }
25763 }, {
25764 key: "_onDeviceBackButton",
25765 value: function _onDeviceBackButton(event) {
25766 this._sides.some(function (s) {
25767 return s.isOpen ? s.close() : false;
25768 }) || event.callParentHandler();
25769 }
25770 }, {
25771 key: "_onModeChange",
25772 value: function _onModeChange(e) {
25773 var _this2 = this;
25774
25775 if (e.target.parentNode) {
25776 contentReady(this, function () {
25777 _this2._layout();
25778 });
25779 }
25780 }
25781 }, {
25782 key: "_layout",
25783 value: function _layout() {
25784 var _this3 = this;
25785
25786 this._sides.forEach(function (side) {
25787 if (_this3.content) {
25788 _this3.content.style[side.side] = side.mode === 'split' ? side.style.width : 0;
25789 }
25790 });
25791 }
25792 }, {
25793 key: "connectedCallback",
25794 value: function connectedCallback() {
25795 this.onDeviceBackButton = this._onDeviceBackButton.bind(this);
25796 this.addEventListener('modechange', this._onModeChange, false);
25797 }
25798 }, {
25799 key: "disconnectedCallback",
25800 value: function disconnectedCallback() {
25801 this._backButtonHandler.destroy();
25802
25803 this._backButtonHandler = null;
25804 this.removeEventListener('modechange', this._onModeChange, false);
25805 }
25806 }, {
25807 key: "attributeChangedCallback",
25808 value: function attributeChangedCallback(name, last, current) {}
25809 }, {
25810 key: "_show",
25811 value: function _show() {
25812 util$4.propagateAction(this, '_show');
25813 }
25814 }, {
25815 key: "_hide",
25816 value: function _hide() {
25817 util$4.propagateAction(this, '_hide');
25818 }
25819 }, {
25820 key: "_destroy",
25821 value: function _destroy() {
25822 util$4.propagateAction(this, '_destroy');
25823 this.remove();
25824 }
25825 }], [{
25826 key: "registerAnimator",
25827 value: function registerAnimator(name, Animator) {
25828 if (!(Animator instanceof SplitterAnimator)) {
25829 util$4.throwAnimator('Splitter');
25830 }
25831
25832 _animatorDict$1[name] = Animator;
25833 }
25834 }, {
25835 key: "SplitterAnimator",
25836 get: function get() {
25837 return SplitterAnimator;
25838 }
25839 }, {
25840 key: "animators",
25841 get: function get() {
25842 return _animatorDict$1;
25843 }
25844 }]);
25845
25846 return SplitterElement;
25847 }(BaseElement);
25848 onsElements.Splitter = SplitterElement;
25849 customElements.define('ons-splitter', SplitterElement);
25850
25851 var SPLIT_MODE = 'split';
25852 var COLLAPSE_MODE = 'collapse';
25853 var CLOSED_STATE = 'closed';
25854 var OPEN_STATE = 'open';
25855 var CHANGING_STATE = 'changing';
25856 var rewritables$1 = {
25857 /**
25858 * @param {Element} splitterSideElement
25859 * @param {Function} callback
25860 */
25861 ready: function ready(splitterSideElement, callback) {
25862 setImmediate(callback);
25863 }
25864 };
25865
25866 var CollapseDetection = /*#__PURE__*/function () {
25867 function CollapseDetection(element, target) {
25868 _classCallCheck(this, CollapseDetection);
25869
25870 this._element = element;
25871 this._onChange = this._onChange.bind(this);
25872 target && this.changeTarget(target);
25873 }
25874
25875 _createClass(CollapseDetection, [{
25876 key: "changeTarget",
25877 value: function changeTarget(target) {
25878 this.disable();
25879 this._target = target;
25880
25881 if (target) {
25882 this._orientation = ['portrait', 'landscape'].indexOf(target) !== -1;
25883 this.activate();
25884 }
25885 }
25886 }, {
25887 key: "_match",
25888 value: function _match(value) {
25889 if (this._orientation) {
25890 return this._target === (value.isPortrait ? 'portrait' : 'landscape');
25891 }
25892
25893 return value.matches;
25894 }
25895 }, {
25896 key: "_onChange",
25897 value: function _onChange(value) {
25898 this._element._updateMode(this._match(value) ? COLLAPSE_MODE : SPLIT_MODE);
25899 }
25900 }, {
25901 key: "activate",
25902 value: function activate() {
25903 if (this._orientation) {
25904 orientation.on('change', this._onChange);
25905
25906 this._onChange({
25907 isPortrait: orientation.isPortrait()
25908 });
25909 } else {
25910 this._queryResult = window.matchMedia(this._target);
25911
25912 this._queryResult.addListener(this._onChange);
25913
25914 this._onChange(this._queryResult);
25915 }
25916 }
25917 }, {
25918 key: "disable",
25919 value: function disable() {
25920 if (this._orientation) {
25921 orientation.off('change', this._onChange);
25922 } else if (this._queryResult) {
25923 this._queryResult.removeListener(this._onChange);
25924
25925 this._queryResult = null;
25926 }
25927 }
25928 }]);
25929
25930 return CollapseDetection;
25931 }();
25932 /**
25933 * @element ons-splitter-side
25934 * @category menu
25935 * @description
25936 * [en]
25937 * The `<ons-splitter-side>` element is used as a child element of `<ons-splitter>`.
25938 *
25939 * It will be displayed on either the left or right side of the `<ons-splitter-content>` element.
25940 *
25941 * It supports two modes: collapsed and split. When it's in collapsed mode it will be hidden from view and can be displayed when the user swipes the screen or taps a button. In split mode the element is always shown. It can be configured to automatically switch between the two modes depending on the screen size.
25942 * [/en]
25943 * [ja]ons-splitter-side要素は、ons-splitter要素の子要素として利用します。[/ja]
25944 * @codepen rOQOML
25945 * @tutorial vanilla/Reference/splitter
25946 * @guide fundamentals.html#managing-pages
25947 * [en]Managing multiple pages.[/en]
25948 * [ja]複数のページを管理する[/ja]
25949 * @seealso ons-splitter
25950 * [en]The `<ons-splitter>` is the parent component.[/en]
25951 * [ja]ons-splitterコンポーネント[/ja]
25952 * @seealso ons-splitter-content
25953 * [en]The `<ons-splitter-content>` component contains the main content of the page.[/en]
25954 * [ja]ons-splitter-contentコンポーネント[/ja]
25955 * @example
25956 * <ons-splitter>
25957 * <ons-splitter-content>
25958 * ...
25959 * </ons-splitter-content>
25960 *
25961 * <ons-splitter-side side="left" width="80%" collapse>
25962 * ...
25963 * </ons-splitter-side>
25964 * </ons-splitter>
25965 */
25966
25967
25968 var SplitterSideElement = /*#__PURE__*/function (_BaseElement) {
25969 _inherits(SplitterSideElement, _BaseElement);
25970
25971 var _super = _createSuper(SplitterSideElement);
25972
25973 /**
25974 * @event modechange
25975 * @description
25976 * [en]Fired just after the component's mode changes.[/en]
25977 * [ja]この要素のモードが変化した際に発火します。[/ja]
25978 * @param {Object} event
25979 * [en]Event object.[/en]
25980 * [ja]イベントオブジェクトです。[/ja]
25981 * @param {Object} event.side
25982 * [en]Component object.[/en]
25983 * [ja]コンポーネントのオブジェクト。[/ja]
25984 * @param {String} event.mode
25985 * [en]Returns the current mode. Can be either `"collapse"` or `"split"`.[/en]
25986 * [ja]現在のモードを返します。[/ja]
25987 */
25988
25989 /**
25990 * @event preopen
25991 * @description
25992 * [en]Fired just before the sliding menu is opened.[/en]
25993 * [ja]スライディングメニューが開く前に発火します。[/ja]
25994 * @param {Object} event
25995 * [en]Event object.[/en]
25996 * [ja]イベントオブジェクトです。[/ja]
25997 * @param {Function} event.cancel
25998 * [en]Call to cancel opening sliding menu.[/en]
25999 * [ja]スライディングメニューが開くのをキャンセルします。[/ja]
26000 * @param {Object} event.side
26001 * [en]Component object.[/en]
26002 * [ja]コンポーネントのオブジェクト。[/ja]
26003 */
26004
26005 /**
26006 * @event postopen
26007 * @description
26008 * [en]Fired just after the sliding menu is opened.[/en]
26009 * [ja]スライディングメニューが開いた後に発火します。[/ja]
26010 * @param {Object} event
26011 * [en]Event object.[/en]
26012 * [ja]イベントオブジェクトです。[/ja]
26013 * @param {Object} event.side
26014 * [en]Component object.[/en]
26015 * [ja]コンポーネントのオブジェクト。[/ja]
26016 */
26017
26018 /**
26019 * @event preclose
26020 * @description
26021 * [en]Fired just before the sliding menu is closed.[/en]
26022 * [ja]スライディングメニューが閉じる前に発火します。[/ja]
26023 * @param {Object} event
26024 * [en]Event object.[/en]
26025 * [ja]イベントオブジェクトです。[/ja]
26026 * @param {Object} event.side
26027 * [en]Component object.[/en]
26028 * [ja]コンポーネントのオブジェクト。[/ja]
26029 * @param {Function} event.cancel
26030 * [en]Call to cancel opening sliding-menu.[/en]
26031 * [ja]スライディングメニューが閉じるのをキャンセルします。[/ja]
26032 */
26033
26034 /**
26035 * @event postclose
26036 * @description
26037 * [en]Fired just after the sliding menu is closed.[/en]
26038 * [ja]スライディングメニューが閉じた後に発火します。[/ja]
26039 * @param {Object} event
26040 * [en]Event object.[/en]
26041 * [ja]イベントオブジェクトです。[/ja]
26042 * @param {Object} event.side
26043 * [en]Component object.[/en]
26044 * [ja]コンポーネントのオブジェクト。[/ja]
26045 */
26046
26047 /**
26048 * @event swipe
26049 * @description
26050 * [en]Fired whenever the user slides the splitter.[/en]
26051 * [ja][/ja]
26052 * @param {Object} event [en]Event object.[/en]
26053 * @param {Object} event.ratio
26054 * [en]Decimal ratio (0-1).[/en]
26055 * [ja][/ja]
26056 * @param {Object} event.animationOptions
26057 * [en][/en]
26058 * [ja][/ja]
26059 */
26060
26061 /**
26062 * @attribute animation
26063 * @type {String}
26064 * @default default
26065 * @description
26066 * [en]Specify the animation. Use one of `overlay`, `push`, `reveal` or `default`.[/en]
26067 * [ja]アニメーションを指定します。"overlay", "push", "reveal", "default"のいずれかを指定できます。[/ja]
26068 */
26069
26070 /**
26071 * @attribute animation-options
26072 * @type {Expression}
26073 * @description
26074 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
26075 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
26076 */
26077
26078 /**
26079 * @property animationOptions
26080 * @type {Object}
26081 * @description
26082 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
26083 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
26084 */
26085
26086 /**
26087 * @attribute open-threshold
26088 * @type {Number}
26089 * @default 0.3
26090 * @description
26091 * [en]Specify how much the menu needs to be swiped before opening. A value between `0` and `1`.[/en]
26092 * [ja]どのくらいスワイプすればスライディングメニューを開くかどうかの割合を指定します。0から1の間の数値を指定します。スワイプの距離がここで指定した数値掛けるこの要素の幅よりも大きければ、スワイプが終わった時にこの要素を開きます。デフォルトは0.3です。[/ja]
26093 */
26094
26095 /**
26096 * @attribute collapse
26097 * @type {String}
26098 * @description
26099 * [en]
26100 * Specify the collapse behavior. Valid values are `"portrait"`, `"landscape"` or a media query.
26101 * The string `"portrait"` means the view will collapse when the device is in portrait orientation.
26102 * The string `"landscape"` means the view will collapse when the device is in landscape orientation.
26103 * If the value is a media query, the view will collapse when the media query resolves to `true`.
26104 * If the attribute is set, including as an empty string, the view will always be in `"collapse"` mode.
26105 * If the attribute is not set, the view will be in `"split"` mode.
26106 * [/en]
26107 * [ja]
26108 * 左側のページを非表示にする条件を指定します。portrait, landscape、width #pxもしくはメディアクエリの指定が可能です。
26109 * portraitもしくはlandscapeを指定すると、デバイスの画面が縦向きもしくは横向きになった時に適用されます。
26110 * メディアクエリを指定すると、指定したクエリに適合している場合に適用されます。
26111 * 値に何も指定しない場合には、常にcollapseモードになります。
26112 * [/ja]
26113 */
26114
26115 /**
26116 * @attribute swipe-target-width
26117 * @type {String}
26118 * @description
26119 * [en]The width of swipeable area calculated from the edge (in pixels). Use this to enable swipe only when the finger touch on the screen edge.[/en]
26120 * [ja]スワイプの判定領域をピクセル単位で指定します。画面の端から指定した距離に達するとページが表示されます。[/ja]
26121 */
26122
26123 /**
26124 * @attribute width
26125 * @type {String}
26126 * @description
26127 * [en]Can be specified in either pixels or as a percentage, e.g. `90%` or `200px`.[/en]
26128 * [ja]この要素の横幅を指定します。pxと%での指定が可能です。eg. 90%, 200px[/ja]
26129 */
26130
26131 /**
26132 * @attribute side
26133 * @type {String}
26134 * @default left
26135 * @description
26136 * [en]Specify which side of the screen the `<ons-splitter-side>` element is located. Possible values are `"left"` and `"right"`.[/en]
26137 * [ja]この要素が左か右かを指定します。指定できる値は"left"か"right"のみです。[/ja]
26138 */
26139
26140 /**
26141 * @attribute mode
26142 * @type {String}
26143 * @description
26144 * [en]Current mode. Possible values are `"collapse"` or `"split"`. This attribute is read only.[/en]
26145 * [ja]現在のモードが設定されます。"collapse"もしくは"split"が指定されます。この属性は読み込み専用です。[/ja]
26146 */
26147
26148 /**
26149 * @attribute page
26150 * @initonly
26151 * @type {String}
26152 * @description
26153 * [en]The URL of the menu page.[/en]
26154 * [ja]ons-splitter-side要素に表示するページのURLを指定します。[/ja]
26155 */
26156
26157 /**
26158 * @attribute swipeable
26159 * @type {Boolean}
26160 * @description
26161 * [en]Whether to enable swipe interaction on collapse mode.[/en]
26162 * [ja]collapseモード時にスワイプ操作を有効にする場合に指定します。[/ja]
26163 */
26164
26165 /**
26166 * @property swipeable
26167 * @type {Boolean}
26168 * @description
26169 * [en]Whether to enable swipe interaction on collapse mode.[/en]
26170 * [ja]collapseモード時にスワイプ操作を有効にする場合に指定します。[/ja]
26171 */
26172 function SplitterSideElement() {
26173 var _this;
26174
26175 _classCallCheck(this, SplitterSideElement);
26176
26177 _this = _super.call(this);
26178 _this._page = null;
26179 _this._state = CLOSED_STATE;
26180 _this._lock = new DoorLock();
26181 _this._pageLoader = defaultPageLoader;
26182 _this._collapseDetection = new CollapseDetection(_assertThisInitialized(_this));
26183 _this._animatorFactory = new AnimatorFactory({
26184 animators: SplitterElement.animators,
26185 baseClass: SplitterAnimator$1,
26186 baseClassName: 'SplitterAnimator',
26187 defaultAnimation: _this.getAttribute('animation')
26188 });
26189 contentReady(_assertThisInitialized(_this), function () {
26190 // These attributes are used early by the parent element
26191 _this.attributeChangedCallback('width');
26192
26193 if (!_this.hasAttribute('side')) {
26194 _this.setAttribute('side', 'left');
26195 }
26196
26197 rewritables$1.ready(_assertThisInitialized(_this), function () {
26198 var page = _this._page || _this.getAttribute('page');
26199
26200 page && _this.load(page);
26201 });
26202 });
26203 return _this;
26204 }
26205
26206 _createClass(SplitterSideElement, [{
26207 key: "connectedCallback",
26208 value: function connectedCallback() {
26209 var _this2 = this;
26210
26211 if (!util$4.match(this.parentNode, 'ons-splitter')) {
26212 util$4.throw('Parent must be an ons-splitter element');
26213 }
26214
26215 if (!this._swipe) {
26216 this._swipe = new SwipeReveal({
26217 element: this,
26218 elementHandler: this.parentElement,
26219 swipeMax: function swipeMax() {
26220 var ratio = 1;
26221 _this2._onSwipe && _this2._onSwipe(ratio, _this2._animationOpt);
26222 util$4.triggerElementEvent(_this2, 'swipe', {
26223 ratio: ratio,
26224 animationOptions: _this2._animationOpt
26225 });
26226
26227 _this2.open();
26228 },
26229 swipeMid: function swipeMid(distance, width) {
26230 var ratio = distance / width;
26231 _this2._onSwipe && _this2._onSwipe(ratio);
26232 util$4.triggerElementEvent(_this2, 'swipe', {
26233 ratio: ratio
26234 });
26235
26236 _this2._animator.translate(distance);
26237 },
26238 swipeMin: function swipeMin() {
26239 var ratio = 0;
26240 _this2._onSwipe && _this2._onSwipe(ratio, _this2._animationOpt);
26241 util$4.triggerElementEvent(_this2, 'swipe', {
26242 ratio: ratio,
26243 animationOptions: _this2._animationOpt
26244 });
26245
26246 _this2.close();
26247 },
26248 getThreshold: function getThreshold() {
26249 return Math.max(0, Math.min(1, parseFloat(_this2.getAttribute('open-threshold')) || 0.3));
26250 },
26251 getSide: function getSide() {
26252 return _this2.side;
26253 },
26254 isInitialState: function isInitialState() {
26255 var closed = _this2._state === CLOSED_STATE;
26256 _this2._state = CHANGING_STATE;
26257 return closed;
26258 },
26259 ignoreSwipe: function ignoreSwipe(event, distance) {
26260 var isOpen = _this2.isOpen;
26261
26262 var validDrag = function validDrag(d) {
26263 return _this2.side === 'left' ? d === 'left' && isOpen || d === 'right' && !isOpen : d === 'left' && !isOpen || d === 'right' && isOpen;
26264 };
26265
26266 var area = Math.max(0, parseInt(_this2.getAttribute('swipe-target-width'), 10) || 0);
26267 return _this2._mode === SPLIT_MODE || _this2._lock.isLocked() || _this2._isOtherSideOpen() || !validDrag(event.gesture.direction) || !isOpen && area !== 0 && distance > area;
26268 }
26269 });
26270 this.attributeChangedCallback('swipeable');
26271 }
26272
26273 contentReady(this, function () {
26274 _this2.constructor.observedAttributes.forEach(function (attr) {
26275 return _this2.attributeChangedCallback(attr, null, _this2.getAttribute(attr));
26276 });
26277 });
26278 }
26279 }, {
26280 key: "side",
26281 get: function get() {
26282 return this.getAttribute('side') === 'right' ? 'right' : 'left';
26283 },
26284 set: function set(value) {
26285 if (value) {
26286 this.setAttribute('side', value);
26287 } else {
26288 tihs.removeAttribute('side');
26289 }
26290 }
26291 }, {
26292 key: "disconnectedCallback",
26293 value: function disconnectedCallback() {
26294 this._swipe && this._swipe.dispose();
26295 this._animator = this._animationOpt = this._swipe = null;
26296 }
26297 }, {
26298 key: "attributeChangedCallback",
26299 value: function attributeChangedCallback(name, last, current) {
26300 switch (name) {
26301 case 'swipeable':
26302 this._swipe && this._swipe.update();
26303 break;
26304
26305 case 'width':
26306 current = this.getAttribute('width'); // Sometimes undefined. CE bug?
26307
26308 this.style.width = /^\d+(px|%)$/.test(current) ? current : '80%';
26309 break;
26310
26311 case 'animation':
26312 case 'animation-options':
26313 this._updateAnimation();
26314
26315 break;
26316
26317 default:
26318 this[util$4.camelize("_update-".concat(name))](current);
26319 }
26320 }
26321 }, {
26322 key: "_emitEvent",
26323 value: function _emitEvent(name) {
26324 if (name.slice(0, 3) !== 'pre') {
26325 return util$4.triggerElementEvent(this, name, {
26326 side: this
26327 });
26328 }
26329
26330 var isCanceled = false;
26331 util$4.triggerElementEvent(this, name, {
26332 side: this,
26333 cancel: function cancel() {
26334 return isCanceled = true;
26335 }
26336 });
26337 return isCanceled;
26338 }
26339 }, {
26340 key: "_isOtherSideOpen",
26341 value: function _isOtherSideOpen() {
26342 var _this3 = this;
26343
26344 return !!util$4.findChild(this.parentElement, function (el) {
26345 return el instanceof _this3.constructor && el !== _this3 && el._mode === COLLAPSE_MODE && el.isOpen;
26346 });
26347 }
26348 }, {
26349 key: "_updateCollapse",
26350 value: function _updateCollapse() {
26351 var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('collapse');
26352
26353 if (value === null || value === 'split') {
26354 this._collapseDetection.disable();
26355
26356 return this._updateMode(SPLIT_MODE);
26357 }
26358
26359 if (value === '' || value === 'collapse') {
26360 this._collapseDetection.disable();
26361
26362 return this._updateMode(COLLAPSE_MODE);
26363 }
26364
26365 this._collapseDetection.changeTarget(value);
26366 }
26367 }, {
26368 key: "_updateMode",
26369 value: function _updateMode(mode) {
26370 if (mode !== this._mode) {
26371 this._mode = mode;
26372 this.setAttribute('mode', mode); // readonly attribute for the users
26373
26374 if (mode === SPLIT_MODE) {
26375 this._animator && this._animator.deactivate();
26376 this._state = CLOSED_STATE;
26377 } else {
26378 this._animator && this._animator.activate(this);
26379 this._state === OPEN_STATE && this._animator.open();
26380 }
26381
26382 util$4.triggerElementEvent(this, 'modechange', {
26383 side: this,
26384 mode: mode
26385 });
26386 }
26387 }
26388 }, {
26389 key: "_updateAnimation",
26390 value: function _updateAnimation() {
26391 var animation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('animation');
26392
26393 if (this.parentNode) {
26394 this._animator && this._animator.deactivate();
26395 this._animator = this._animatorFactory.newAnimator({
26396 animation: animation
26397 });
26398
26399 this._animator.activate(this);
26400
26401 this._animationOpt = {
26402 timing: this._animator.duration,
26403 duration: this._animator.duration
26404 };
26405
26406 this._animator.updateOptions(this.animationOptions);
26407 }
26408 }
26409 /**
26410 * @property page
26411 * @type {*}
26412 * @description
26413 * [en]Page location to load in the splitter side.[/en]
26414 * [ja]この要素内に表示するページを指定します。[/ja]
26415 */
26416
26417 }, {
26418 key: "page",
26419 get: function get() {
26420 return this._page;
26421 }
26422 /**
26423 * @param {*} page
26424 */
26425 ,
26426 set: function set(page) {
26427 this._page = page;
26428 }
26429 }, {
26430 key: "_content",
26431 get: function get() {
26432 return this.children[0];
26433 }
26434 /**
26435 * @property pageLoader
26436 * @description
26437 * [en][/en]
26438 * [ja][/ja]
26439 */
26440
26441 }, {
26442 key: "pageLoader",
26443 get: function get() {
26444 return this._pageLoader;
26445 },
26446 set: function set(loader) {
26447 if (!(loader instanceof PageLoader)) {
26448 util$4.throwPageLoader();
26449 }
26450
26451 this._pageLoader = loader;
26452 }
26453 /**
26454 * @property mode
26455 * @readonly
26456 * @type {String}
26457 * @description
26458 * [en]Current mode. Possible values are "split", "collapse", "closed", "open" or "changing".[/en]
26459 * [ja][/ja]
26460 */
26461
26462 }, {
26463 key: "mode",
26464 get: function get() {
26465 return this._mode;
26466 }
26467 /**
26468 * @property onSwipe
26469 * @type {Function}
26470 * @description
26471 * [en]Hook called whenever the user slides the splitter. It gets a decimal ratio (0-1) and an animationOptions object as arguments.[/en]
26472 * [ja][/ja]
26473 */
26474
26475 }, {
26476 key: "onSwipe",
26477 get: function get() {
26478 return this._onSwipe;
26479 },
26480 set: function set(value) {
26481 if (value && !(value instanceof Function)) {
26482 util$4.throw('"onSwipe" must be a function');
26483 }
26484
26485 this._onSwipe = value;
26486 }
26487 }, {
26488 key: "animationOptions",
26489 get: function get() {
26490 return this.hasAttribute('animation-options') ? AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options')) : {};
26491 },
26492 set: function set(value) {
26493 if (value === undefined || value === null) {
26494 this.removeAttribute('animation-options');
26495 } else {
26496 this.setAttribute('animation-options', JSON.stringify(value));
26497 }
26498 }
26499 /**
26500 * @property isOpen
26501 * @type {Boolean}
26502 * @description
26503 * [en]Specifies whether the menu is opened.[/en]
26504 * [ja][/ja]
26505 */
26506
26507 }, {
26508 key: "isOpen",
26509 get: function get() {
26510 return this._mode === COLLAPSE_MODE && this._state !== CLOSED_STATE;
26511 },
26512 set: function set(value) {
26513 this.toggle({}, value);
26514 }
26515 /**
26516 * @method open
26517 * @signature open([options])
26518 * @param {Object} [options]
26519 * [en]Parameter object.[/en]
26520 * [ja]オプションを指定するオブジェクト。[/ja]
26521 * @param {Function} [options.callback]
26522 * [en]This function will be called after the menu has been opened.[/en]
26523 * [ja]メニューが開いた後に呼び出される関数オブジェクトを指定します。[/ja]
26524 * @description
26525 * [en]Open menu in collapse mode.[/en]
26526 * [ja]collapseモードになっているons-splitter-side要素を開きます。[/ja]
26527 * @return {Promise}
26528 * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
26529 * [ja][/ja]
26530 */
26531
26532 }, {
26533 key: "open",
26534 value: function open(options) {
26535 return this.toggle(options, true);
26536 }
26537 /**
26538 * @method close
26539 * @signature close([options])
26540 * @param {Object} [options]
26541 * [en]Parameter object.[/en]
26542 * [ja]オプションを指定するオブジェクト。[/ja]
26543 * @param {Function} [options.callback]
26544 * [en]This function will be called after the menu has been closed.[/en]
26545 * [ja]メニューが閉じた後に呼び出される関数オブジェクトを指定します。[/ja]
26546 * @description
26547 * [en]Close menu in collapse mode.[/en]
26548 * [ja]collapseモードになっているons-splitter-side要素を閉じます。[/ja]
26549 * @return {Promise}
26550 * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
26551 * [ja][/ja]
26552 */
26553
26554 }, {
26555 key: "close",
26556 value: function close(options) {
26557 return this.toggle(options, false);
26558 }
26559 /**
26560 * @method toggle
26561 * @signature toggle([options])
26562 * @param {Object} [options]
26563 * @description
26564 * [en]Opens if it's closed. Closes if it's open.[/en]
26565 * [ja]開けている場合は要素を閉じますそして開けている場合は要素を開きます。[/ja]
26566 * @return {Promise}
26567 * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
26568 * [ja][/ja]
26569 */
26570
26571 }, {
26572 key: "toggle",
26573 value: function toggle() {
26574 var _this4 = this;
26575
26576 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26577 var force = arguments.length > 1 ? arguments[1] : undefined;
26578 var shouldOpen = typeof force === 'boolean' ? force : !this.isOpen;
26579 var action = shouldOpen ? 'open' : 'close';
26580 var FINAL_STATE = shouldOpen ? OPEN_STATE : CLOSED_STATE;
26581
26582 if (this._mode === SPLIT_MODE) {
26583 return Promise.resolve(false);
26584 }
26585
26586 if (this._state === FINAL_STATE) {
26587 return Promise.resolve(this);
26588 }
26589
26590 if (this._lock.isLocked()) {
26591 return Promise.reject('Another splitter-side action is already running.');
26592 }
26593
26594 if (shouldOpen && this._isOtherSideOpen()) {
26595 return Promise.reject('Another menu is already open.');
26596 }
26597
26598 if (this._emitEvent("pre".concat(action))) {
26599 return Promise.reject("Canceled in pre".concat(action, " event."));
26600 }
26601
26602 var unlock = this._lock.lock();
26603
26604 this._state = CHANGING_STATE;
26605
26606 if (options.animation) {
26607 this._updateAnimation(options.animation);
26608 }
26609
26610 return new Promise(function (resolve) {
26611 _this4._animator[action](function () {
26612 util$4.iosPageScrollFix(shouldOpen);
26613 _this4._state = FINAL_STATE;
26614 unlock();
26615
26616 _this4._emitEvent("post".concat(action));
26617
26618 options.callback instanceof Function && options.callback(_this4);
26619 resolve(_this4);
26620 });
26621 });
26622 }
26623 /**
26624 * @method load
26625 * @signature load(page, [options])
26626 * @param {String} page
26627 * [en]Page URL. Can be either an HTML document or a `<template>`.[/en]
26628 * [ja]pageのURLか、`<template>`で宣言したテンプレートのid属性の値を指定します。[/ja]
26629 * @param {Object} [options]
26630 * @param {Function} [options.callback]
26631 * @description
26632 * [en]Show the page specified in pageUrl in the right section[/en]
26633 * [ja]指定したURLをメインページを読み込みます。[/ja]
26634 * @return {Promise}
26635 * [en]Resolves to the new page element[/en]
26636 * [ja][/ja]
26637 */
26638
26639 }, {
26640 key: "load",
26641 value: function load(page) {
26642 var _this5 = this;
26643
26644 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
26645 this._page = page;
26646
26647 var callback = options.callback || function () {};
26648
26649 return new Promise(function (resolve) {
26650 var oldContent = _this5._content || null;
26651
26652 _this5._pageLoader.load({
26653 page: page,
26654 parent: _this5
26655 }, function (pageElement) {
26656 if (oldContent) {
26657 _this5._pageLoader.unload(oldContent);
26658
26659 oldContent = null;
26660 }
26661
26662 setImmediate(function () {
26663 return _this5._show();
26664 });
26665 callback(pageElement);
26666 resolve(pageElement);
26667 });
26668 });
26669 }
26670 }, {
26671 key: "_show",
26672 value: function _show() {
26673 if (this._content) {
26674 this._content._show();
26675 }
26676 }
26677 }, {
26678 key: "_hide",
26679 value: function _hide() {
26680 if (this._content) {
26681 this._content._hide();
26682 }
26683 }
26684 }, {
26685 key: "_destroy",
26686 value: function _destroy() {
26687 if (this._content) {
26688 this._pageLoader.unload(this._content);
26689 }
26690
26691 this.remove();
26692 }
26693 }], [{
26694 key: "observedAttributes",
26695 get: function get() {
26696 return ['animation', 'width', 'collapse', 'swipeable', 'animation-options'];
26697 }
26698 }, {
26699 key: "events",
26700 get: function get() {
26701 return ['preopen', 'postopen', 'preclose', 'postclose', 'modechange', 'swipe'];
26702 }
26703 }, {
26704 key: "rewritables",
26705 get: function get() {
26706 return rewritables$1;
26707 }
26708 }]);
26709
26710 return SplitterSideElement;
26711 }(BaseElement);
26712 util$4.defineBooleanProperties(SplitterSideElement, ['swipeable']);
26713 onsElements.SplitterSide = SplitterSideElement;
26714 customElements.define('ons-splitter-side', SplitterSideElement);
26715
26716 var scheme$3 = {
26717 '': 'switch--*',
26718 '.switch__input': 'switch--*__input',
26719 '.switch__handle': 'switch--*__handle',
26720 '.switch__toggle': 'switch--*__toggle'
26721 };
26722 var locations = {
26723 ios: [1, 21],
26724 material: [0, 16]
26725 };
26726 /**
26727 * @element ons-switch
26728 * @category form
26729 * @description
26730 * [en]
26731 * Switch component. The switch can be toggled both by dragging and tapping.
26732 *
26733 * Will automatically displays a Material Design switch on Android devices.
26734 * [/en]
26735 * [ja]スイッチを表示するコンポーネントです。[/ja]
26736 * @modifier material
26737 * [en]Material Design switch[/en]
26738 * [ja][/ja]
26739 * @codepen LpXZQQ
26740 * @tutorial vanilla/Reference/switch
26741 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
26742 * @example
26743 * <ons-switch checked></ons-switch>
26744 * <ons-switch disabled></ons-switch>
26745 * <ons-switch modifier="material"></ons-switch>
26746 */
26747
26748 var SwitchElement = /*#__PURE__*/function (_BaseCheckboxElement) {
26749 _inherits(SwitchElement, _BaseCheckboxElement);
26750
26751 var _super = _createSuper(SwitchElement);
26752
26753 function SwitchElement() {
26754 var _this;
26755
26756 _classCallCheck(this, SwitchElement);
26757
26758 _this = _super.call(this);
26759 contentReady(_assertThisInitialized(_this), function () {
26760 _this.attributeChangedCallback('modifier', null, _this.getAttribute('modifier'));
26761 });
26762 _this._onChange = _this._onChange.bind(_assertThisInitialized(_this));
26763 _this._onRelease = _this._onRelease.bind(_assertThisInitialized(_this));
26764 _this._lastTimeStamp = 0;
26765 return _this;
26766 }
26767
26768 _createClass(SwitchElement, [{
26769 key: "_scheme",
26770 get: function get() {
26771 return scheme$3;
26772 }
26773 }, {
26774 key: "_defaultClassName",
26775 get: function get() {
26776 return 'switch';
26777 }
26778 }, {
26779 key: "_template",
26780 get: function get() {
26781 return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <div class=\"").concat(this._defaultClassName, "__toggle\">\n <div class=\"").concat(this._defaultClassName, "__handle\">\n <div class=\"").concat(this._defaultClassName, "__touch\"></div>\n </div>\n </div>\n ");
26782 }
26783 }, {
26784 key: "type",
26785 get: function get() {
26786 return 'checkbox';
26787 }
26788 /* Own props */
26789
26790 }, {
26791 key: "_getPosition",
26792 value: function _getPosition(e) {
26793 var l = this._locations;
26794 return Math.min(l[1], Math.max(l[0], this._startX + e.gesture.deltaX));
26795 }
26796 }, {
26797 key: "_emitChangeEvent",
26798 value: function _emitChangeEvent() {
26799 util$4.triggerElementEvent(this, 'change', {
26800 value: this.checked,
26801 switch: this,
26802 isInteractive: true
26803 });
26804 }
26805 }, {
26806 key: "_onChange",
26807 value: function _onChange(event) {
26808 if (event && event.stopPropagation) {
26809 event.stopPropagation();
26810 }
26811
26812 this._emitChangeEvent();
26813 }
26814 }, {
26815 key: "_onClick",
26816 value: function _onClick(ev) {
26817 if (ev.target.classList.contains("".concat(this.defaultElementClass, "__touch")) || ev.timeStamp - this._lastTimeStamp < 50 // Prevent second click triggered by <label>
26818 ) {
26819 ev.preventDefault();
26820 }
26821
26822 this._lastTimeStamp = ev.timeStamp;
26823 }
26824 }, {
26825 key: "_onHold",
26826 value: function _onHold(e) {
26827 if (!this.disabled) {
26828 ModifierUtil.addModifier(this, 'active');
26829 document.addEventListener('release', this._onRelease);
26830 }
26831 }
26832 }, {
26833 key: "_onDragStart",
26834 value: function _onDragStart(e) {
26835 if (this.disabled || ['left', 'right'].indexOf(e.gesture.direction) === -1) {
26836 ModifierUtil.removeModifier(this, 'active');
26837 return;
26838 }
26839
26840 e.consumed = true;
26841 ModifierUtil.addModifier(this, 'active');
26842 this._startX = this._locations[this.checked ? 1 : 0]; // - e.gesture.deltaX;
26843
26844 this.addEventListener('drag', this._onDrag);
26845 document.addEventListener('release', this._onRelease);
26846 }
26847 }, {
26848 key: "_onDrag",
26849 value: function _onDrag(e) {
26850 e.stopPropagation();
26851 this._handle.style.left = this._getPosition(e) + 'px';
26852 }
26853 }, {
26854 key: "_onRelease",
26855 value: function _onRelease(e) {
26856 var l = this._locations;
26857
26858 var position = this._getPosition(e);
26859
26860 var previousValue = this.checked;
26861 this.checked = position >= (l[0] + l[1]) / 2;
26862
26863 if (this.checked !== previousValue) {
26864 this._emitChangeEvent();
26865 }
26866
26867 this.removeEventListener('drag', this._onDrag);
26868 document.removeEventListener('release', this._onRelease);
26869 this._handle.style.left = '';
26870 ModifierUtil.removeModifier(this, 'active');
26871 }
26872 }, {
26873 key: "click",
26874 value: function click() {
26875 var ev = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26876
26877 if (!this.disabled) {
26878 this.checked = !this.checked;
26879
26880 this._emitChangeEvent();
26881
26882 this._lastTimeStamp = ev.timeStamp || 0;
26883 }
26884 }
26885 }, {
26886 key: "_handle",
26887 get: function get() {
26888 return this.querySelector(".".concat(this._defaultClassName, "__handle"));
26889 }
26890 }, {
26891 key: "checkbox",
26892 get: function get() {
26893 return this._input;
26894 }
26895 }, {
26896 key: "connectedCallback",
26897 value: function connectedCallback() {
26898 var _this2 = this;
26899
26900 contentReady(this, function () {
26901 _this2._input.addEventListener('change', _this2._onChange);
26902 });
26903 this.addEventListener('dragstart', this._onDragStart);
26904 this.addEventListener('hold', this._onHold);
26905 this.addEventListener('tap', this.click);
26906 this.addEventListener('click', this._onClick);
26907 this._gestureDetector = new GestureDetector(this, {
26908 dragMinDistance: 1,
26909 holdTimeout: 251,
26910 passive: true
26911 });
26912 }
26913 }, {
26914 key: "disconnectedCallback",
26915 value: function disconnectedCallback() {
26916 var _this3 = this;
26917
26918 contentReady(this, function () {
26919 _this3._input.removeEventListener('change', _this3._onChange);
26920 });
26921 this.removeEventListener('dragstart', this._onDragStart);
26922 this.removeEventListener('hold', this._onHold);
26923 this.removeEventListener('tap', this.click);
26924 this.removeEventListener('click', this._onClick);
26925
26926 if (this._gestureDetector) {
26927 this._gestureDetector.dispose();
26928 }
26929 }
26930 }, {
26931 key: "attributeChangedCallback",
26932 value: function attributeChangedCallback(name, last, current) {
26933 if (name === 'modifier') {
26934 var md = (current || '').indexOf('material') !== -1;
26935 this._locations = locations[md ? 'material' : 'ios'];
26936 }
26937
26938 _get(_getPrototypeOf(SwitchElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
26939 }
26940 /**
26941 * @event change
26942 * @description
26943 * [en]Fired when the switch is toggled.[/en]
26944 * [ja]ON/OFFが変わった時に発火します。[/ja]
26945 * @param {Object} event
26946 * [en]Event object.[/en]
26947 * [ja]イベントオブジェクト。[/ja]
26948 * @param {Object} event.switch
26949 * [en]Switch object.[/en]
26950 * [ja]イベントが発火したSwitchオブジェクトを返します。[/ja]
26951 * @param {Boolean} event.value
26952 * [en]Current value.[/en]
26953 * [ja]現在の値を返します。[/ja]
26954 * @param {Boolean} event.isInteractive
26955 * [en]True if the change was triggered by the user clicking on the switch.[/en]
26956 * [ja]タップやクリックなどのユーザの操作によって変わった場合にはtrueを返します。[/ja]
26957 */
26958
26959 /**
26960 * @attribute modifier
26961 * @type {String}
26962 * @description
26963 * [en]The appearance of the switch.[/en]
26964 * [ja]スイッチの表現を指定します。[/ja]
26965 */
26966
26967 /**
26968 * @attribute disabled
26969 * @description
26970 * [en]Whether the switch is be disabled.[/en]
26971 * [ja]スイッチを無効の状態にする場合に指定します。[/ja]
26972 */
26973
26974 /**
26975 * @attribute checked
26976 * @description
26977 * [en]Whether the switch is checked.[/en]
26978 * [ja]スイッチがONの状態にするときに指定します。[/ja]
26979 */
26980
26981 /**
26982 * @attribute input-id
26983 * @type {String}
26984 * @description
26985 * [en]Specify the `id` attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
26986 * [ja][/ja]
26987 */
26988
26989 /**
26990 * @property checked
26991 * @type {Boolean}
26992 * @description
26993 * [en]This value is `true` if the switch is checked.[/en]
26994 * [ja]スイッチがONの場合に`true`。[/ja]
26995 */
26996
26997 /**
26998 * @property value
26999 * @type {String}
27000 * @description
27001 * [en]The current value of the input.[/en]
27002 * [ja][/ja]
27003 */
27004
27005 /**
27006 * @property disabled
27007 * @type {Boolean}
27008 * @description
27009 * [en]Whether the element is disabled or not.[/en]
27010 * [ja]無効化されている場合に`true`。[/ja]
27011 */
27012
27013 /**
27014 * @property checkbox
27015 * @readonly
27016 * @type {HTMLElement}
27017 * @description
27018 * [en]The underlying checkbox element.[/en]
27019 * [ja]コンポーネント内部のcheckbox要素になります。[/ja]
27020 */
27021
27022 /**
27023 * @method focus
27024 * @signature focus()
27025 * @description
27026 * [en]Focuses the switch.[/en]
27027 * [ja][/ja]
27028 */
27029
27030 /**
27031 * @method blur
27032 * @signature blur()
27033 * @description
27034 * [en]Removes focus from the switch.[/en]
27035 * [ja][/ja]
27036 */
27037
27038 }], [{
27039 key: "observedAttributes",
27040 get: function get() {
27041 return [].concat(_toConsumableArray(_get(_getPrototypeOf(SwitchElement), "observedAttributes", this)), ['modifier']);
27042 }
27043 }]);
27044
27045 return SwitchElement;
27046 }(BaseCheckboxElement);
27047 onsElements.Switch = SwitchElement;
27048 customElements.define('ons-switch', SwitchElement);
27049
27050 var scheme$2 = {
27051 '.tabbar__content': 'tabbar--*__content',
27052 '.tabbar__border': 'tabbar--*__border',
27053 '.tabbar': 'tabbar--*'
27054 };
27055 var rewritables = {
27056 /**
27057 * @param {Element} tabbarElement
27058 * @param {Function} callback
27059 */
27060 ready: function ready(tabbarElement, callback) {
27061 callback();
27062 }
27063 };
27064 internal$1.nullElement;
27065
27066 var lerp = function lerp(x0, x1, t) {
27067 return (1 - t) * x0 + t * x1;
27068 };
27069 /**
27070 * @element ons-tabbar
27071 * @category tabbar
27072 * @description
27073 * [en]A component to display a tab bar on the bottom of a page. Used with `<ons-tab>` to manage pages using tabs.[/en]
27074 * [ja]タブバーをページ下部に表示するためのコンポーネントです。ons-tabと組み合わせて使うことで、ページを管理できます。[/ja]
27075 * @codepen pGuDL
27076 * @tutorial vanilla/Reference/tabbar
27077 * @modifier material
27078 * [en]A tabbar in Material Design.[/en]
27079 * [ja][/ja]
27080 * @modifier autogrow
27081 * [en]Tabs automatically grow depending on their content instead of having a fixed width.[/en]
27082 * [ja][/ja]
27083 * @modifier top-border
27084 * [en]Shows a static border-bottom in tabs for iOS top tabbars.[/en]
27085 * [ja][/ja]
27086 * @guide fundamentals.html#managing-pages
27087 * [en]Managing multiple pages.[/en]
27088 * [ja]複数のページを管理する[/ja]
27089 * @seealso ons-tab
27090 * [en]The `<ons-tab>` component.[/en]
27091 * [ja]ons-tabコンポーネント[/ja]
27092 * @seealso ons-page
27093 * [en]The `<ons-page>` component.[/en]
27094 * [ja]ons-pageコンポーネント[/ja]
27095 * @example
27096 * <ons-tabbar>
27097 * <ons-tab
27098 * page="home.html"
27099 * label="Home"
27100 * active>
27101 * </ons-tab>
27102 * <ons-tab
27103 * page="settings.html"
27104 * label="Settings"
27105 * active>
27106 * </ons-tab>
27107 * </ons-tabbar>
27108 *
27109 * <template id="home.html">
27110 * ...
27111 * </template>
27112 *
27113 * <template id="settings.html">
27114 * ...
27115 * </template>
27116 */
27117
27118
27119 var TabbarElement = /*#__PURE__*/function (_BaseElement) {
27120 _inherits(TabbarElement, _BaseElement);
27121
27122 var _super = _createSuper(TabbarElement);
27123
27124 /**
27125 * @event prechange
27126 * @description
27127 * [en]Fires just before the tab is changed.[/en]
27128 * [ja]アクティブなタブが変わる前に発火します。[/ja]
27129 * @param {Object} event
27130 * [en]Event object.[/en]
27131 * [ja]イベントオブジェクト。[/ja]
27132 * @param {Number} event.index
27133 * [en]Current index.[/en]
27134 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
27135 * @param {Object} event.tabItem
27136 * [en]Tab item object.[/en]
27137 * [ja]tabItemオブジェクト。[/ja]
27138 * @param {Function} event.cancel
27139 * [en]Call this function to cancel the change event.[/en]
27140 * [ja]この関数を呼び出すと、アクティブなタブの変更がキャンセルされます。[/ja]
27141 */
27142
27143 /**
27144 * @event postchange
27145 * @description
27146 * [en]Fires just after the tab is changed.[/en]
27147 * [ja]アクティブなタブが変わった後に発火します。[/ja]
27148 * @param {Object} event
27149 * [en]Event object.[/en]
27150 * [ja]イベントオブジェクト。[/ja]
27151 * @param {Number} event.index
27152 * [en]Current index.[/en]
27153 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
27154 * @param {Object} event.tabItem
27155 * [en]Tab item object.[/en]
27156 * [ja]tabItemオブジェクト。[/ja]
27157 */
27158
27159 /**
27160 * @event reactive
27161 * @description
27162 * [en]Fires if the already open tab is tapped again.[/en]
27163 * [ja]すでにアクティブになっているタブがもう一度タップやクリックされた場合に発火します。[/ja]
27164 * @param {Object} event
27165 * [en]Event object.[/en]
27166 * [ja]イベントオブジェクト。[/ja]
27167 * @param {Number} event.index
27168 * [en]Current index.[/en]
27169 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
27170 * @param {Object} event.tabItem
27171 * [en]Tab item object.[/en]
27172 * [ja]tabItemオブジェクト。[/ja]
27173 */
27174
27175 /**
27176 * @event swipe
27177 * @description
27178 * [en]Fires when the tabbar swipes.[/en]
27179 * [ja][/ja]
27180 * @param {Object} event
27181 * [en]Event object.[/en]
27182 * [ja]イベントオブジェクト。[/ja]
27183 * @param {Number} event.index
27184 * [en]Current index.[/en]
27185 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
27186 * @param {Object} event.options
27187 * [en]Animation options object.[/en]
27188 * [ja][/ja]
27189 */
27190
27191 /**
27192 * @attribute animation
27193 * @type {String}
27194 * @default none
27195 * @description
27196 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
27197 * [ja][/ja]
27198 */
27199
27200 /**
27201 * @attribute animation-options
27202 * @type {Expression}
27203 * @description
27204 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
27205 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
27206 */
27207
27208 /**
27209 * @property animationOptions
27210 * @type {Object}
27211 * @description
27212 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
27213 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
27214 */
27215
27216 /**
27217 * @attribute position
27218 * @initonly
27219 * @type {String}
27220 * @default bottom
27221 * @description
27222 * [en]Tabbar's position. Available values are `"bottom"` and `"top"`. Use `"auto"` to choose position depending on platform (bottom for iOS flat design, top for Material Design).[/en]
27223 * [ja]タブバーの位置を指定します。"bottom"もしくは"top"を選択できます。デフォルトは"bottom"です。[/ja]
27224 */
27225
27226 /**
27227 * @attribute swipeable
27228 * @description
27229 * [en]If this attribute is set the tab bar can be scrolled by drag or swipe.[/en]
27230 * [ja]この属性がある時、タブバーをスワイプやドラッグで移動できるようになります。[/ja]
27231 */
27232
27233 /**
27234 * @attribute ignore-edge-width
27235 * @type {Number}
27236 * @default 20
27237 * @description
27238 * [en]Distance in pixels from both edges. Swiping on these areas will prioritize parent components such as `ons-splitter` or `ons-navigator`.[/en]
27239 * [ja][/ja]
27240 */
27241
27242 /**
27243 * @attribute active-index
27244 * @type {Number}
27245 * @default 0
27246 * @description
27247 * [en]The index of the tab that is currently active.[/en]
27248 * [ja][/ja]
27249 */
27250
27251 /**
27252 * @property activeIndex
27253 * @type {Number}
27254 * @default 0
27255 * @description
27256 * [en]The index of the tab that is currently active.[/en]
27257 * [ja][/ja]
27258 */
27259
27260 /**
27261 * @attribute hide-tabs
27262 * @description
27263 * [en]Whether to hide the tabs.[/en]
27264 * [ja]タブを非表示にする場合に指定します。[/ja]
27265 */
27266
27267 /**
27268 * @property hideTabs
27269 * @description
27270 * [en]Whether to hide the tabs.[/en]
27271 * [ja]タブを非表示にする場合に指定します。[/ja]
27272 */
27273
27274 /**
27275 * @attribute tab-border
27276 * @description
27277 * [en]If this attribute is set the tabs show a dynamic bottom border. Only works for iOS flat design since the border is always visible in Material Design.[/en]
27278 * [ja][/ja]
27279 */
27280
27281 /**
27282 * @property tabBorder
27283 * @type {Boolean}
27284 * @description
27285 * [en]If this property is set the tabs show a dynamic bottom border. Only works for iOS flat design since the border is always visible in Material Design.[/en]
27286 * [ja][/ja]
27287 */
27288
27289 /**
27290 * @attribute modifier
27291 * @type {String}
27292 * @description
27293 * [en]The appearance of the tabbar.[/en]
27294 * [ja]タブバーの表現を指定します。[/ja]
27295 */
27296 function TabbarElement() {
27297 var _this;
27298
27299 _classCallCheck(this, TabbarElement);
27300
27301 _this = _super.call(this);
27302 _this._loadInactive = util$4.defer(); // Improves #2324
27303
27304 contentReady(_assertThisInitialized(_this), function () {
27305 return _this._compile();
27306 });
27307
27308 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'swipe'),
27309 onConnected = _util$defineListenerP.onConnected,
27310 onDisconnected = _util$defineListenerP.onDisconnected;
27311
27312 _this._connectOnSwipe = onConnected;
27313 _this._disconnectOnSwipe = onDisconnected;
27314 return _this;
27315 }
27316
27317 _createClass(TabbarElement, [{
27318 key: "connectedCallback",
27319 value: function connectedCallback() {
27320 var _this2 = this;
27321
27322 if (!this._swiper) {
27323 this._swiper = new Swiper({
27324 getElement: function getElement() {
27325 return _this2._contentElement;
27326 },
27327 getInitialIndex: function getInitialIndex() {
27328 return _this2.activeIndex || _this2.getAttribute('activeIndex');
27329 },
27330 getAutoScrollRatio: this._getAutoScrollRatio.bind(this),
27331 getBubbleWidth: function getBubbleWidth() {
27332 return parseInt(_this2.getAttribute('ignore-edge-width') || 25, 10);
27333 },
27334 isAutoScrollable: function isAutoScrollable() {
27335 return true;
27336 },
27337 preChangeHook: this._onPreChange.bind(this),
27338 postChangeHook: this._onPostChange.bind(this),
27339 refreshHook: this._onRefresh.bind(this),
27340 scrollHook: this._onScroll.bind(this)
27341 });
27342 contentReady(this, function () {
27343 _this2._tabbarBorder = util$4.findChild(_this2._tabbarElement, '.tabbar__border');
27344
27345 _this2._swiper.init({
27346 swipeable: _this2.hasAttribute('swipeable')
27347 });
27348 });
27349 }
27350
27351 contentReady(this, function () {
27352 _this2._updatePosition();
27353
27354 _this2._updateVisibility();
27355
27356 if (!util$4.findParent(_this2, 'ons-page', function (p) {
27357 return p === document.body;
27358 })) {
27359 _this2._show(); // This tabbar is the top component
27360
27361 }
27362 });
27363
27364 this._connectOnSwipe();
27365 }
27366 }, {
27367 key: "disconnectedCallback",
27368 value: function disconnectedCallback() {
27369 if (this._swiper && this._swiper.initialized) {
27370 this._swiper.dispose();
27371
27372 this._swiper = null;
27373 this._tabbarBorder = null;
27374 this._tabsRect = null;
27375 }
27376
27377 this._disconnectOnSwipe();
27378 }
27379 }, {
27380 key: "_normalizeEvent",
27381 value: function _normalizeEvent(event) {
27382 return _objectSpread2(_objectSpread2({}, event), {}, {
27383 index: event.activeIndex,
27384 tabItem: this.tabs[event.activeIndex]
27385 });
27386 }
27387 }, {
27388 key: "_onPostChange",
27389 value: function _onPostChange(event) {
27390 event = this._normalizeEvent(event);
27391 util$4.triggerElementEvent(this, 'postchange', event);
27392 var page = event.tabItem.pageElement;
27393 page && page._show();
27394 }
27395 }, {
27396 key: "_onPreChange",
27397 value: function _onPreChange(event) {
27398 event = this._normalizeEvent(event);
27399
27400 event.cancel = function () {
27401 return event.canceled = true;
27402 };
27403
27404 util$4.triggerElementEvent(this, 'prechange', event);
27405
27406 if (!event.canceled) {
27407 var _event = event,
27408 activeIndex = _event.activeIndex,
27409 lastActiveIndex = _event.lastActiveIndex;
27410 var tabs = this.tabs;
27411 tabs[activeIndex].setActive(true);
27412
27413 if (lastActiveIndex >= 0) {
27414 var prevTab = tabs[lastActiveIndex];
27415 prevTab.setActive(false);
27416 prevTab.pageElement && prevTab.pageElement._hide();
27417 }
27418 }
27419
27420 return event.canceled;
27421 }
27422 }, {
27423 key: "_onScroll",
27424 value: function _onScroll(index) {
27425 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
27426
27427 if (this._tabbarBorder) {
27428 this._tabbarBorder.style.transition = "all ".concat(options.duration || 0, "s ").concat(options.timing || '');
27429
27430 if (this._autogrow && this._tabsRect.length > 0) {
27431 var a = Math.floor(index),
27432 b = Math.ceil(index),
27433 r = index % 1;
27434 this._tabbarBorder.style.width = lerp(this._tabsRect[a].width, this._tabsRect[b].width, r) + 'px';
27435 this._tabbarBorder.style.transform = "translate3d(".concat(lerp(this._tabsRect[a].left, this._tabsRect[b].left, r), "px, 0, 0)");
27436 } else {
27437 this._tabbarBorder.style.transform = "translate3d(".concat(index * 100, "%, 0, 0)");
27438 }
27439 }
27440
27441 util$4.triggerElementEvent(this, 'swipe', {
27442 index: index,
27443 options: options
27444 });
27445 }
27446 }, {
27447 key: "_onRefresh",
27448 value: function _onRefresh() {
27449 this._autogrow = util$4.hasModifier(this, 'autogrow');
27450 this._tabsRect = this.tabs.map(function (tab) {
27451 return tab.getBoundingClientRect();
27452 });
27453
27454 if (this._tabbarBorder) {
27455 this._tabbarBorder.style.display = this.hasAttribute('tab-border') || util$4.hasModifier(this, 'material') ? 'block' : 'none';
27456 var index = this.getActiveTabIndex();
27457
27458 if (this._tabsRect.length > 0 && index >= 0) {
27459 this._tabbarBorder.style.width = this._tabsRect[index].width + 'px';
27460 }
27461 }
27462 }
27463 }, {
27464 key: "_getAutoScrollRatio",
27465 value: function _getAutoScrollRatio(matches, velocity, size) {
27466 var ratio = .6; // Base ratio
27467
27468 var modifier = size / 300 * (matches ? -1 : 1); // Based on screen size
27469
27470 return Math.min(1, Math.max(0, ratio + velocity * modifier));
27471 }
27472 }, {
27473 key: "_tabbarElement",
27474 get: function get() {
27475 return util$4.findChild(this, '.tabbar');
27476 }
27477 }, {
27478 key: "_contentElement",
27479 get: function get() {
27480 return util$4.findChild(this, '.tabbar__content');
27481 }
27482 }, {
27483 key: "_targetElement",
27484 get: function get() {
27485 var content = this._contentElement;
27486 return content && content.children[0] || null;
27487 }
27488 }, {
27489 key: "_compile",
27490 value: function _compile() {
27491 autoStyle.prepare(this);
27492 var content = this._contentElement || util$4.create('.tabbar__content');
27493 content.classList.add('ons-tabbar__content');
27494 var tabbar = this._tabbarElement || util$4.create('.tabbar');
27495 tabbar.classList.add('ons-tabbar__footer');
27496
27497 if (!tabbar.parentNode) {
27498 while (this.firstChild) {
27499 tabbar.appendChild(this.firstChild);
27500 }
27501 }
27502
27503 if (tabbar.children.length > this.activeIndex && !util$4.findChild(tabbar, '[active]')) {
27504 tabbar.children[this.activeIndex].setAttribute('active', '');
27505 }
27506
27507 this._tabbarBorder = util$4.findChild(tabbar, '.tabbar__border') || util$4.create('.tabbar__border');
27508 tabbar.appendChild(this._tabbarBorder);
27509 tabbar.classList.add('ons-swiper-tabbar'); // Hides material border
27510
27511 !content.children[0] && content.appendChild(document.createElement('div'));
27512 !content.children[1] && content.appendChild(document.createElement('div'));
27513 content.appendChild = content.appendChild.bind(content.children[0]);
27514 content.insertBefore = content.insertBefore.bind(content.children[0]);
27515 this.appendChild(content);
27516 this.appendChild(tabbar); // Triggers ons-tab connectedCallback
27517
27518 ModifierUtil.initModifier(this, scheme$2);
27519 }
27520 }, {
27521 key: "_updatePosition",
27522 value: function _updatePosition() {
27523 var _this3 = this;
27524
27525 var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('position');
27526 var top = this._top = position === 'top' || position === 'auto' && util$4.hasModifier(this, 'material');
27527 var action = top ? util$4.addModifier : util$4.removeModifier;
27528 action(this, 'top');
27529 var page = util$4.findParent(this, 'ons-page');
27530
27531 if (page) {
27532 contentReady(page, function () {
27533 var p = 0;
27534
27535 if (page.children[0] && util$4.match(page.children[0], 'ons-toolbar')) {
27536 action(page.children[0], 'noshadow');
27537 p = 1; // Visual fix for some devices
27538 }
27539
27540 var content = page._getContentElement();
27541
27542 var cs = window.getComputedStyle(page._getContentElement(), null);
27543 _this3.style.top = top ? parseInt(cs.getPropertyValue('padding-top'), 10) - p + 'px' : ''; // Refresh content top - Fix for iOS 8
27544
27545 content.style.top = cs.top;
27546 content.style.top = '';
27547 });
27548 }
27549
27550 internal$1.autoStatusBarFill(function () {
27551 var filled = util$4.findParent(_this3, function (e) {
27552 return e.hasAttribute('status-bar-fill');
27553 });
27554 util$4.toggleAttribute(_this3, 'status-bar-fill', top && !filled);
27555 });
27556 }
27557 }, {
27558 key: "topPage",
27559 get: function get() {
27560 var tabs = this.tabs,
27561 index = this.getActiveTabIndex();
27562 return tabs[index] ? tabs[index].pageElement || this.pages[0] || null : null;
27563 }
27564 }, {
27565 key: "pages",
27566 get: function get() {
27567 return util$4.arrayFrom(this._targetElement.children);
27568 }
27569 }, {
27570 key: "tabs",
27571 get: function get() {
27572 return Array.prototype.filter.call(this._tabbarElement.children, function (e) {
27573 return e.tagName === 'ONS-TAB';
27574 });
27575 }
27576 /**
27577 * @method setActiveTab
27578 * @signature setActiveTab(index, [options])
27579 * @param {Number} index
27580 * [en]Tab index.[/en]
27581 * [ja]タブのインデックスを指定します。[/ja]
27582 * @param {Object} [options]
27583 * [en]Parameter object.[/en]
27584 * [ja]オプションを指定するオブジェクト。[/ja]
27585 * @param {Function} [options.callback]
27586 * [en]Function that runs when the new page has loaded.[/en]
27587 * [ja][/ja]
27588 * @param {String} [options.animation]
27589 * [en]If this option is "none", the transition won't slide.[/en]
27590 * [ja][/ja]
27591 * @param {String} [options.animationOptions]
27592 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
27593 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
27594 * @description
27595 * [en]Show specified tab page. Animations and their options can be specified by the second parameter.[/en]
27596 * [ja]指定したインデックスのタブを表示します。アニメーションなどのオプションを指定できます。[/ja]
27597 * @return {Promise}
27598 * [en]A promise that resolves to the new page element.[/en]
27599 * [ja][/ja]
27600 */
27601
27602 }, {
27603 key: "setActiveTab",
27604 value: function setActiveTab(nextIndex) {
27605 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
27606 var previousIndex = this.activeIndex;
27607 this._activeIndexSkipEffect = true;
27608 this.activeIndex = nextIndex;
27609 return this._updateActiveIndex(nextIndex, previousIndex, options);
27610 }
27611 }, {
27612 key: "_updateActiveIndex",
27613 value: function _updateActiveIndex(nextIndex, prevIndex) {
27614 var _this4 = this;
27615
27616 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
27617 var prevTab = this.tabs[prevIndex],
27618 nextTab = this.tabs[nextIndex];
27619
27620 if (!nextTab) {
27621 return Promise.reject('Specified index does not match any tab.');
27622 }
27623
27624 if (nextIndex === prevIndex) {
27625 util$4.triggerElementEvent(this, 'reactive', {
27626 index: nextIndex,
27627 activeIndex: nextIndex,
27628 tabItem: nextTab
27629 });
27630 return Promise.resolve(nextTab.pageElement);
27631 } // FIXME: nextTab.loaded is broken in Zone.js promises (Angular2)
27632
27633
27634 var nextPage = nextTab.pageElement;
27635 return (nextPage ? Promise.resolve(nextPage) : nextTab.loaded).then(function (nextPage) {
27636 return _this4._swiper.setActiveIndex(nextIndex, _objectSpread2(_objectSpread2({
27637 reject: true
27638 }, options), {}, {
27639 animation: prevTab && nextPage ? options.animation || _this4.getAttribute('animation') : 'none',
27640 animationOptions: util$4.extend({
27641 duration: .3,
27642 timing: 'cubic-bezier(.4, .7, .5, 1)'
27643 }, _this4.animationOptions, options.animationOptions || {})
27644 })).then(function () {
27645 options.callback instanceof Function && options.callback(nextPage);
27646 return nextPage;
27647 });
27648 });
27649 }
27650 /**
27651 * @method setTabbarVisibility
27652 * @signature setTabbarVisibility(visible)
27653 * @param {Boolean} visible
27654 * @description
27655 * [en]Used to hide or show the tab bar.[/en]
27656 * [ja][/ja]
27657 */
27658
27659 }, {
27660 key: "setTabbarVisibility",
27661 value: function setTabbarVisibility(visible) {
27662 this.hideTabs = !visible;
27663 }
27664 }, {
27665 key: "show",
27666 value: function show() {
27667 this.hideTabs = false;
27668 }
27669 }, {
27670 key: "hide",
27671 value: function hide() {
27672 this.hideTabs = true;
27673 }
27674 }, {
27675 key: "_updateVisibility",
27676 value: function _updateVisibility() {
27677 var _this5 = this;
27678
27679 contentReady(this, function () {
27680 var visible = !_this5.hideTabs;
27681 _this5._contentElement.style[_this5._top ? 'top' : 'bottom'] = visible ? '' : '0px';
27682 _this5._tabbarElement.style.display = visible ? '' : 'none';
27683 visible && _this5._onRefresh();
27684 });
27685 }
27686 /**
27687 * @property visible
27688 * @readonly
27689 * @type {Boolean}
27690 * @description
27691 * [en]Whether the tabbar is visible or not.[/en]
27692 * [ja]タブバーが見える場合に`true`。[/ja]
27693 */
27694
27695 }, {
27696 key: "visible",
27697 get: function get() {
27698 return this._tabbarElement.style.display !== 'none';
27699 }
27700 /**
27701 * @property swipeable
27702 * @type {Boolean}
27703 * @description
27704 * [en]Enable swipe interaction.[/en]
27705 * [ja]swipeableであればtrueを返します。[/ja]
27706 */
27707
27708 /**
27709 * @property onSwipe
27710 * @type {Function}
27711 * @description
27712 * [en]Hook called whenever the user slides the tabbar. It gets a decimal index and an animationOptions object as arguments.[/en]
27713 * [ja][/ja]
27714 */
27715
27716 /**
27717 * @method getActiveTabIndex
27718 * @signature getActiveTabIndex()
27719 * @return {Number}
27720 * [en]The index of the currently active tab.[/en]
27721 * [ja]現在アクティブになっているタブのインデックスを返します。[/ja]
27722 * @description
27723 * [en]Returns tab index on current active tab. If active tab is not found, returns -1.[/en]
27724 * [ja]現在アクティブになっているタブのインデックスを返します。現在アクティブなタブがない場合には-1を返します。[/ja]
27725 */
27726
27727 }, {
27728 key: "getActiveTabIndex",
27729 value: function getActiveTabIndex() {
27730 var tabs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.tabs;
27731
27732 for (var i = 0; i < tabs.length; i++) {
27733 if (tabs[i] && tabs[i].tagName === 'ONS-TAB' && tabs[i].isActive()) {
27734 return i;
27735 }
27736 }
27737
27738 return -1;
27739 }
27740 }, {
27741 key: "activeIndex",
27742 get: function get() {
27743 return Number(this.getAttribute('active-index'));
27744 },
27745 set: function set(value) {
27746 if (value !== null && value !== undefined) {
27747 this.setAttribute('active-index', value);
27748 }
27749 }
27750 }, {
27751 key: "_show",
27752 value: function _show() {
27753 var _this6 = this;
27754
27755 this._swiper.show();
27756
27757 setImmediate(function () {
27758 var tabs = _this6.tabs;
27759
27760 var activeIndex = _this6.getActiveTabIndex(tabs);
27761
27762 _this6._loadInactive.resolve();
27763
27764 if (tabs.length > 0 && activeIndex >= 0) {
27765 tabs[activeIndex].loaded.then(function (el) {
27766 return el && setImmediate(function () {
27767 return el._show();
27768 });
27769 });
27770 }
27771 });
27772 }
27773 }, {
27774 key: "_hide",
27775 value: function _hide() {
27776 this._swiper.hide();
27777
27778 var topPage = this.topPage;
27779 topPage && topPage._hide();
27780 }
27781 }, {
27782 key: "_destroy",
27783 value: function _destroy() {
27784 this.tabs.forEach(function (tab) {
27785 return tab.remove();
27786 });
27787 this.remove();
27788 }
27789 }, {
27790 key: "attributeChangedCallback",
27791 value: function attributeChangedCallback(name, last, current) {
27792 var _this7 = this;
27793
27794 if (name === 'modifier') {
27795 ModifierUtil.onModifierChanged(last, current, this, scheme$2);
27796
27797 var isTop = function isTop(m) {
27798 return /(^|\s+)top($|\s+)/i.test(m);
27799 };
27800
27801 isTop(last) !== isTop(current) && this._updatePosition();
27802 } else if (name === 'position') {
27803 util$4.isAttached(this) && this._updatePosition();
27804 } else if (name === 'swipeable') {
27805 this._swiper && this._swiper.updateSwipeable(this.hasAttribute('swipeable'));
27806 } else if (name === 'hide-tabs') {
27807 this.isConnected && this._updateVisibility();
27808 } else if (name === 'active-index') {
27809 if (this._activeIndexSkipEffect) {
27810 this._activeIndexSkipEffect = false;
27811 } else if (this.isConnected) {
27812 contentReady(this, function () {
27813 return _this7._updateActiveIndex(current, last);
27814 });
27815 }
27816 }
27817 }
27818 }, {
27819 key: "animationOptions",
27820 get: function get() {
27821 return this.hasAttribute('animation-options') ? util$4.animationOptionsParse(this.getAttribute('animation-options')) : {};
27822 },
27823 set: function set(value) {
27824 if (value === undefined || value === null) {
27825 this.removeAttribute('animation-options');
27826 } else {
27827 this.setAttribute('animation-options', JSON.stringify(value));
27828 }
27829 }
27830 }], [{
27831 key: "observedAttributes",
27832 get: function get() {
27833 return ['modifier', 'position', 'swipeable', 'tab-border', 'hide-tabs', 'active-index'];
27834 }
27835 }, {
27836 key: "rewritables",
27837 get: function get() {
27838 return rewritables;
27839 }
27840 }, {
27841 key: "events",
27842 get: function get() {
27843 return ['prechange', 'postchange', 'reactive', 'swipe'];
27844 }
27845 }]);
27846
27847 return TabbarElement;
27848 }(BaseElement);
27849 util$4.defineBooleanProperties(TabbarElement, ['hide-tabs', 'swipeable', 'tab-border']);
27850 onsElements.Tabbar = TabbarElement;
27851 customElements.define('ons-tabbar', TabbarElement);
27852
27853 var defaultClassName$1 = 'tabbar__item';
27854 var scheme$1 = {
27855 '': 'tabbar--*__item',
27856 '.tabbar__button': 'tabbar--*__button'
27857 };
27858 /**
27859 * @element ons-tab
27860 * @category tabbar
27861 * @description
27862 * [en]Represents a tab inside tab bar. Each `<ons-tab>` represents a page.[/en]
27863 * [ja]
27864 * タブバーに配置される各アイテムのコンポーネントです。それぞれのons-tabはページを表します。
27865 * ons-tab要素の中には、タブに表示されるコンテンツを直接記述することが出来ます。
27866 * [/ja]
27867 * @codepen pGuDL
27868 * @tutorial vanilla/Reference/tabbar
27869 * @guide fundamentals.html#managing-pages
27870 * [en]Managing multiple pages.[/en]
27871 * [ja]複数のページを管理する[/ja]]
27872 * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
27873 * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
27874 * @seealso ons-tabbar
27875 * [en]ons-tabbar component[/en]
27876 * [ja]ons-tabbarコンポーネント[/ja]
27877 * @seealso ons-page
27878 * [en]ons-page component[/en]
27879 * [ja]ons-pageコンポーネント[/ja]
27880 * @seealso ons-icon
27881 * [en]ons-icon component[/en]
27882 * [ja]ons-iconコンポーネント[/ja]
27883 * @example
27884 * <ons-tabbar>
27885 * <ons-tab
27886 * page="home.html"
27887 * label="Home"
27888 * active>
27889 * </ons-tab>
27890 * <ons-tab
27891 * page="settings.html"
27892 * label="Settings"
27893 * active>
27894 * </ons-tab>
27895 * </ons-tabbar>
27896 *
27897 * <template id="home.html">
27898 * ...
27899 * </template>
27900 *
27901 * <template id="settings.html">
27902 * ...
27903 * </template>
27904
27905 */
27906
27907 var TabElement = /*#__PURE__*/function (_BaseElement) {
27908 _inherits(TabElement, _BaseElement);
27909
27910 var _super = _createSuper(TabElement);
27911
27912 /**
27913 * @attribute page
27914 * @initonly
27915 * @type {String}
27916 * @description
27917 * [en]The page that is displayed when the tab is tapped.[/en]
27918 * [ja]ons-tabが参照するページへのURLを指定します。[/ja]
27919 */
27920
27921 /**
27922 * @attribute icon
27923 * @type {String}
27924 * @description
27925 * [en]
27926 * The icon name for the tab. Can specify the same icon name as `<ons-icon>`. Check [See also](#seealso) section for more information.
27927 * [/en]
27928 * [ja]
27929 * アイコン名を指定します。ons-iconと同じアイコン名を指定できます。
27930 * 個別にアイコンをカスタマイズする場合は、background-imageなどのCSSスタイルを用いて指定できます。
27931 * [/ja]
27932 */
27933
27934 /**
27935 * @attribute active-icon
27936 * @type {String}
27937 * @description
27938 * [en]The name of the icon when the tab is active.[/en]
27939 * [ja]アクティブの際のアイコン名を指定します。[/ja]
27940 */
27941
27942 /**
27943 * @attribute label
27944 * @type {String}
27945 * @description
27946 * [en]The label of the tab item.[/en]
27947 * [ja]アイコン下に表示されるラベルを指定します。[/ja]
27948 */
27949
27950 /**
27951 * @attribute badge
27952 * @type {String}
27953 * @description
27954 * [en]Display a notification badge on top of the tab.[/en]
27955 * [ja]バッジに表示する内容を指定します。[/ja]
27956 */
27957
27958 /**
27959 * @attribute active
27960 * @description
27961 * [en]This attribute should be set to the tab that is active by default.[/en]
27962 * [ja][/ja]
27963 */
27964 function TabElement() {
27965 var _this;
27966
27967 _classCallCheck(this, TabElement);
27968
27969 _this = _super.call(this);
27970
27971 if (['label', 'icon', 'badge'].some(_this.hasAttribute.bind(_assertThisInitialized(_this)))) {
27972 _this._compile();
27973 } else {
27974 contentReady(_assertThisInitialized(_this), function () {
27975 return _this._compile();
27976 });
27977 }
27978
27979 _this._pageLoader = defaultPageLoader;
27980 _this._onClick = _this._onClick.bind(_assertThisInitialized(_this));
27981
27982 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
27983 onConnected = _util$defineListenerP.onConnected,
27984 onDisconnected = _util$defineListenerP.onDisconnected;
27985
27986 _this._connectOnClick = onConnected;
27987 _this._disconnectOnClick = onDisconnected;
27988 return _this;
27989 }
27990
27991 _createClass(TabElement, [{
27992 key: "pageLoader",
27993 get: function get() {
27994 return this._pageLoader;
27995 },
27996 set: function set(loader) {
27997 if (!(loader instanceof PageLoader)) {
27998 util$4.throwPageLoader();
27999 }
28000
28001 this._pageLoader = loader;
28002 }
28003 }, {
28004 key: "_compile",
28005 value: function _compile() {
28006 autoStyle.prepare(this);
28007 this.classList.add(defaultClassName$1);
28008
28009 if (this._button) {
28010 return;
28011 }
28012
28013 var button = util$4.create('button.tabbar__button');
28014
28015 while (this.childNodes[0]) {
28016 button.appendChild(this.childNodes[0]);
28017 }
28018
28019 var input = util$4.create('input', {
28020 display: 'none'
28021 });
28022 input.type = 'radio';
28023 this.appendChild(input);
28024 this.appendChild(button);
28025
28026 this._updateButtonContent();
28027
28028 ModifierUtil.initModifier(this, scheme$1);
28029
28030 this._updateRipple();
28031 }
28032 }, {
28033 key: "_updateRipple",
28034 value: function _updateRipple() {
28035 this._button && util$4.updateRipple(this._button, this.hasAttribute('ripple'));
28036 }
28037 }, {
28038 key: "_updateButtonContent",
28039 value: function _updateButtonContent() {
28040 var _this2 = this;
28041
28042 var button = this._button;
28043 var iconWrapper = this._icon;
28044
28045 if (this.hasAttribute('icon')) {
28046 iconWrapper = iconWrapper || util$4.createElement('<div class="tabbar__icon"><ons-icon></ons-icon></div>');
28047 var icon = iconWrapper.children[0];
28048
28049 var fix = function (last) {
28050 return function () {
28051 return icon.attributeChangedCallback('icon', last, _this2.getAttribute('icon'));
28052 };
28053 }(icon.getAttribute('icon'));
28054
28055 if (this.hasAttribute('icon') && this.hasAttribute('active-icon')) {
28056 icon.setAttribute('icon', this.getAttribute(this.isActive() ? 'active-icon' : 'icon'));
28057 } else if (this.hasAttribute('icon')) {
28058 icon.setAttribute('icon', this.getAttribute('icon'));
28059 }
28060
28061 iconWrapper.parentElement !== button && button.insertBefore(iconWrapper, button.firstChild); // dirty fix for https://github.com/OnsenUI/OnsenUI/issues/1654
28062
28063 icon.attributeChangedCallback instanceof Function ? fix() : setImmediate(function () {
28064 return icon.attributeChangedCallback instanceof Function && fix();
28065 });
28066 } else {
28067 iconWrapper && iconWrapper.remove();
28068 }
28069
28070 ['label', 'badge'].forEach(function (attr, index) {
28071 var prop = _this2.querySelector(".tabbar__".concat(attr));
28072
28073 if (_this2.hasAttribute(attr)) {
28074 prop = prop || util$4.create(".tabbar__".concat(attr) + (attr === 'badge' ? ' notification' : ''));
28075 prop.textContent = _this2.getAttribute(attr);
28076 prop.parentElement !== button && button.appendChild(prop);
28077 } else {
28078 prop && prop.remove();
28079 }
28080 });
28081 }
28082 }, {
28083 key: "_input",
28084 get: function get() {
28085 return util$4.findChild(this, 'input');
28086 }
28087 }, {
28088 key: "_button",
28089 get: function get() {
28090 return util$4.findChild(this, '.tabbar__button');
28091 }
28092 }, {
28093 key: "_icon",
28094 get: function get() {
28095 return this.querySelector('.tabbar__icon');
28096 }
28097 }, {
28098 key: "_tabbar",
28099 get: function get() {
28100 return util$4.findParent(this, 'ons-tabbar');
28101 }
28102 }, {
28103 key: "index",
28104 get: function get() {
28105 return Array.prototype.indexOf.call(this.parentElement.children, this);
28106 }
28107 }, {
28108 key: "_onClick",
28109 value: function _onClick(event) {
28110 var _this3 = this;
28111
28112 setTimeout(function () {
28113 if (!event.defaultPrevented) {
28114 _this3._tabbar.setActiveTab(_this3.index, {
28115 reject: false
28116 });
28117 }
28118 });
28119 }
28120 }, {
28121 key: "setActive",
28122 value: function setActive() {
28123 var _this4 = this;
28124
28125 var active = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
28126 contentReady(this, function () {
28127 _this4._input.checked = active;
28128
28129 _this4.classList.toggle('active', active);
28130
28131 util$4.toggleAttribute(_this4, 'active', active);
28132
28133 if (_this4.hasAttribute('icon') && _this4.hasAttribute('active-icon')) {
28134 _this4._icon.children[0].setAttribute('icon', _this4.getAttribute(active ? 'active-icon' : 'icon'));
28135 }
28136 });
28137 }
28138 }, {
28139 key: "_loadPageElement",
28140 value: function _loadPageElement(parent, page) {
28141 var _this5 = this;
28142
28143 this._hasLoaded = true;
28144 return new Promise(function (resolve) {
28145 _this5._pageLoader.load({
28146 parent: parent,
28147 page: page
28148 }, function (pageElement) {
28149 parent.replaceChild(pageElement, parent.children[_this5.index]); // Ensure position
28150
28151 _this5._loadedPage = pageElement;
28152 resolve(pageElement);
28153 });
28154 });
28155 }
28156 }, {
28157 key: "pageElement",
28158 get: function get() {
28159 // It has been loaded by ons-tab
28160 if (this._loadedPage) {
28161 return this._loadedPage;
28162 } // Manually attached to DOM, 1 per tab
28163
28164
28165 var tabbar = this._tabbar;
28166
28167 if (tabbar.pages.length === tabbar.tabs.length) {
28168 return tabbar.pages[this.index];
28169 } // Loaded in another way
28170
28171
28172 return null;
28173 }
28174 /**
28175 * @return {Boolean}
28176 */
28177
28178 }, {
28179 key: "isActive",
28180 value: function isActive() {
28181 return this.classList.contains('active');
28182 }
28183 }, {
28184 key: "disconnectedCallback",
28185 value: function disconnectedCallback() {
28186 this.removeEventListener('click', this._onClick, false);
28187
28188 if (this._loadedPage) {
28189 this._hasLoaded = false;
28190 this.loaded = null;
28191 }
28192
28193 this._disconnectOnClick();
28194 }
28195 }, {
28196 key: "connectedCallback",
28197 value: function connectedCallback() {
28198 var _this6 = this;
28199
28200 this.addEventListener('click', this._onClick, false);
28201
28202 if (!util$4.isAttached(this) || this.loaded) {
28203 return; // ons-tabbar compilation may trigger this
28204 }
28205
28206 var deferred = util$4.defer();
28207 this.loaded = deferred.promise;
28208 contentReady(this, function () {
28209 var index = _this6.index;
28210 var tabbar = _this6._tabbar;
28211
28212 if (!tabbar) {
28213 util$4.throw('Tab elements must be children of Tabbar');
28214 }
28215
28216 if (tabbar.hasAttribute('modifier')) {
28217 util$4.addModifier(_this6, tabbar.getAttribute('modifier'));
28218 }
28219
28220 if (!_this6._hasLoaded) {
28221 if (_this6.hasAttribute('active')) {
28222 _this6.setActive(true);
28223
28224 tabbar.activeIndex = index;
28225 }
28226
28227 if (index === tabbar.tabs.length - 1) {
28228 tabbar._onRefresh();
28229
28230 setImmediate(function () {
28231 return tabbar._onRefresh();
28232 });
28233 }
28234
28235 TabbarElement.rewritables.ready(tabbar, function () {
28236 var pageTarget = _this6.page || _this6.getAttribute('page');
28237
28238 if (!_this6.pageElement && pageTarget) {
28239 var parentTarget = tabbar._targetElement;
28240 var dummyPage = util$4.create('div', {
28241 height: '100%',
28242 width: '100%',
28243 visibility: 'hidden'
28244 });
28245 parentTarget.insertBefore(dummyPage, parentTarget.children[index]); // Ensure position
28246
28247 var load = function load() {
28248 return _this6._loadPageElement(parentTarget, pageTarget).then(deferred.resolve);
28249 };
28250
28251 return _this6.isActive() ? load() : tabbar._loadInactive.promise.then(load);
28252 }
28253
28254 return deferred.resolve(_this6.pageElement);
28255 });
28256 }
28257 });
28258
28259 this._connectOnClick();
28260 }
28261 }, {
28262 key: "attributeChangedCallback",
28263 value: function attributeChangedCallback(name, last, current) {
28264 var _this7 = this;
28265
28266 switch (name) {
28267 case 'class':
28268 util$4.restoreClass(this, defaultClassName$1, scheme$1);
28269 break;
28270
28271 case 'modifier':
28272 contentReady(this, function () {
28273 return ModifierUtil.onModifierChanged(last, current, _this7, scheme$1);
28274 });
28275 break;
28276
28277 case 'ripple':
28278 contentReady(this, function () {
28279 return _this7._updateRipple();
28280 });
28281 break;
28282
28283 case 'icon':
28284 case 'label':
28285 case 'badge':
28286 contentReady(this, function () {
28287 return _this7._updateButtonContent();
28288 });
28289 break;
28290
28291 case 'page':
28292 this.page = current || '';
28293 break;
28294 }
28295 }
28296 }], [{
28297 key: "observedAttributes",
28298 get: function get() {
28299 return ['modifier', 'ripple', 'icon', 'label', 'page', 'badge', 'class'];
28300 }
28301 }]);
28302
28303 return TabElement;
28304 }(BaseElement);
28305 onsElements.Tab = TabElement;
28306 customElements.define('ons-tab', TabElement);
28307
28308 var ToastAnimator = /*#__PURE__*/function (_BaseAnimator) {
28309 _inherits(ToastAnimator, _BaseAnimator);
28310
28311 var _super = _createSuper(ToastAnimator);
28312
28313 /**
28314 * @param {Object} options
28315 * @param {String} options.timing
28316 * @param {Number} options.duration
28317 * @param {Number} options.delay
28318 */
28319 function ToastAnimator() {
28320 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
28321 _ref$timing = _ref.timing,
28322 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
28323 _ref$delay = _ref.delay,
28324 delay = _ref$delay === void 0 ? 0 : _ref$delay,
28325 _ref$duration = _ref.duration,
28326 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
28327
28328 _classCallCheck(this, ToastAnimator);
28329
28330 return _super.call(this, {
28331 timing: timing,
28332 delay: delay,
28333 duration: duration
28334 });
28335 }
28336 /**
28337 * @param {HTMLElement} modal
28338 * @param {Function} callback
28339 */
28340
28341
28342 _createClass(ToastAnimator, [{
28343 key: "show",
28344 value: function show(modal, callback) {
28345 callback();
28346 }
28347 /**
28348 * @param {HTMLElement} modal
28349 * @param {Function} callback
28350 */
28351
28352 }, {
28353 key: "hide",
28354 value: function hide(modal, callback) {
28355 callback();
28356 }
28357 }]);
28358
28359 return ToastAnimator;
28360 }(BaseAnimator);
28361
28362 /**
28363 * iOS style animator for dialog.
28364 */
28365
28366 var FadeToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
28367 _inherits(FadeToastAnimator, _ToastAnimator);
28368
28369 var _super = _createSuper(FadeToastAnimator);
28370
28371 function FadeToastAnimator() {
28372 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
28373 _ref$timing = _ref.timing,
28374 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
28375 _ref$delay = _ref.delay,
28376 delay = _ref$delay === void 0 ? 0 : _ref$delay,
28377 _ref$duration = _ref.duration,
28378 duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
28379
28380 _classCallCheck(this, FadeToastAnimator);
28381
28382 return _super.call(this, {
28383 timing: timing,
28384 delay: delay,
28385 duration: duration
28386 });
28387 }
28388 /**
28389 * @param {HTMLElement} toast
28390 * @param {Function} callback
28391 */
28392
28393
28394 _createClass(FadeToastAnimator, [{
28395 key: "show",
28396 value: function show(toast, callback) {
28397 callback = callback ? callback : function () {};
28398 Animit(toast, this.def).default({
28399 opacity: 0
28400 }, {
28401 opacity: 1
28402 }).queue(function (done) {
28403 callback();
28404 done();
28405 }).play();
28406 }
28407 /**
28408 * @param {HTMLElement} toast
28409 * @param {Function} callback
28410 */
28411
28412 }, {
28413 key: "hide",
28414 value: function hide(toast, callback) {
28415 callback = callback ? callback : function () {};
28416 Animit(toast, this.def).default({
28417 opacity: 1
28418 }, {
28419 opacity: 0
28420 }).queue(function (done) {
28421 callback();
28422 done();
28423 }).play();
28424 }
28425 }]);
28426
28427 return FadeToastAnimator;
28428 }(ToastAnimator);
28429
28430 /**
28431 * Ascend Toast Animator.
28432 */
28433
28434 var AscendToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
28435 _inherits(AscendToastAnimator, _ToastAnimator);
28436
28437 var _super = _createSuper(AscendToastAnimator);
28438
28439 function AscendToastAnimator() {
28440 var _this;
28441
28442 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
28443 _ref$timing = _ref.timing,
28444 timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
28445 _ref$delay = _ref.delay,
28446 delay = _ref$delay === void 0 ? 0 : _ref$delay,
28447 _ref$duration = _ref.duration,
28448 duration = _ref$duration === void 0 ? 0.25 : _ref$duration;
28449
28450 _classCallCheck(this, AscendToastAnimator);
28451
28452 _this = _super.call(this, {
28453 timing: timing,
28454 delay: delay,
28455 duration: duration
28456 });
28457 _this.messageDelay = _this.duration * 0.4 + _this.delay; // Delay message opacity change
28458
28459 if (platform.isAndroid()) {
28460 _this.ascension = 48; // Toasts are always 1 line
28461 } else {
28462 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
28463 _this.ascension = 98; // 64 + 34
28464 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
28465 _this.ascension = 85; // 64 + 21
28466 } else {
28467 _this.ascension = 64;
28468 }
28469 }
28470
28471 return _this;
28472 }
28473 /**
28474 * @param {HTMLElement} toast
28475 * @param {Function} callback
28476 */
28477
28478
28479 _createClass(AscendToastAnimator, [{
28480 key: "show",
28481 value: function show(toast, callback) {
28482 toast = toast._toast;
28483 util$4.globals.fabOffset = this.ascension;
28484 Animit.runAll(Animit(toast, this.def).default({
28485 transform: "translate3d(0, ".concat(this.ascension, "px, 0)")
28486 }, {
28487 transform: 'translate3d(0, 0, 0)'
28488 }).queue(function (done) {
28489 callback && callback();
28490 done();
28491 }), Animit(this._getFabs()).wait(this.delay).queue({
28492 transform: "translate3d(0, -".concat(this.ascension, "px, 0) scale(1)")
28493 }, this.def), Animit(util$4.arrayFrom(toast.children), this.def).default({
28494 opacity: 0
28495 }, {
28496 opacity: 1
28497 }));
28498 }
28499 /**
28500 * @param {HTMLElement} toast
28501 * @param {Function} callback
28502 */
28503
28504 }, {
28505 key: "hide",
28506 value: function hide(toast, callback) {
28507 toast = toast._toast;
28508 util$4.globals.fabOffset = 0;
28509 Animit.runAll(Animit(toast, this.def).default({
28510 transform: 'translate3d(0, 0, 0)'
28511 }, {
28512 transform: "translate3d(0, ".concat(this.ascension, "px, 0)")
28513 }).queue(function (done) {
28514 callback && callback();
28515 done();
28516 }), Animit(this._getFabs(), this.def).wait(this.delay).queue({
28517 transform: "translate3d(0, 0, 0) scale(1)"
28518 }, this.def), Animit(util$4.arrayFrom(toast.children), this.def).default({
28519 opacity: 1
28520 }, {
28521 opacity: 0
28522 }));
28523 }
28524 }, {
28525 key: "_getFabs",
28526 value: function _getFabs() {
28527 return util$4.arrayFrom(document.querySelectorAll('ons-fab[position~=bottom], ons-speed-dial[position~=bottom]')).filter(function (fab) {
28528 return fab.visible;
28529 });
28530 }
28531 }]);
28532
28533 return AscendToastAnimator;
28534 }(ToastAnimator);
28535
28536 /**
28537 * Lift-fade Toast Animator
28538 */
28539
28540 var LiftToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
28541 _inherits(LiftToastAnimator, _ToastAnimator);
28542
28543 var _super = _createSuper(LiftToastAnimator);
28544
28545 function LiftToastAnimator() {
28546 var _this;
28547
28548 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
28549 _ref$timing = _ref.timing,
28550 timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
28551 _ref$delay = _ref.delay,
28552 delay = _ref$delay === void 0 ? 0 : _ref$delay,
28553 _ref$duration = _ref.duration,
28554 duration = _ref$duration === void 0 ? 0.35 : _ref$duration;
28555
28556 _classCallCheck(this, LiftToastAnimator);
28557
28558 _this = _super.call(this, {
28559 timing: timing,
28560 delay: delay,
28561 duration: duration
28562 });
28563 _this.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
28564
28565 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
28566 _this.liftAmount = 'calc(100% + 34px)';
28567 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
28568 _this.liftAmount = 'calc(100% + 21px)';
28569 } else {
28570 _this.liftAmount = '100%';
28571 }
28572
28573 return _this;
28574 }
28575 /**
28576 * @param {HTMLElement} toast
28577 * @param {Function} callback
28578 */
28579
28580
28581 _createClass(LiftToastAnimator, [{
28582 key: "show",
28583 value: function show(toast, callback) {
28584 toast = toast._toast;
28585 Animit.runAll(Animit(toast, this.def).default({
28586 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)"),
28587 opacity: 0
28588 }, {
28589 transform: 'translate3d(0, 0, 0)',
28590 opacity: 1
28591 }).queue(function (done) {
28592 callback && callback();
28593 done();
28594 }));
28595 }
28596 /**
28597 * @param {HTMLElement} toast
28598 * @param {Function} callback
28599 */
28600
28601 }, {
28602 key: "hide",
28603 value: function hide(toast, callback) {
28604 toast = toast._toast;
28605 Animit.runAll(Animit(toast, this.def).default({
28606 transform: 'translate3d(0, 0, 0)',
28607 opacity: 1
28608 }, {
28609 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)"),
28610 opacity: 0
28611 }).queue(function (done) {
28612 callback && callback();
28613 done();
28614 }));
28615 }
28616 }, {
28617 key: "_updatePosition",
28618 value: function _updatePosition(toast) {
28619 if (parseInt(toast.style.top, 10) === 0) {
28620 toast.style.top = toast.style.bottom = '';
28621 }
28622 }
28623 }]);
28624
28625 return LiftToastAnimator;
28626 }(ToastAnimator);
28627
28628 /**
28629 * Fall-fade Toast Animator
28630 */
28631
28632 var FallToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
28633 _inherits(FallToastAnimator, _ToastAnimator);
28634
28635 var _super = _createSuper(FallToastAnimator);
28636
28637 function FallToastAnimator() {
28638 var _this;
28639
28640 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
28641 _ref$timing = _ref.timing,
28642 timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
28643 _ref$delay = _ref.delay,
28644 delay = _ref$delay === void 0 ? 0 : _ref$delay,
28645 _ref$duration = _ref.duration,
28646 duration = _ref$duration === void 0 ? 0.35 : _ref$duration;
28647
28648 _classCallCheck(this, FallToastAnimator);
28649
28650 _this = _super.call(this, {
28651 timing: timing,
28652 delay: delay,
28653 duration: duration
28654 });
28655
28656 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
28657 _this.fallAmount = 'calc(-100% - 44px)';
28658 } else {
28659 _this.fallAmount = '-100%';
28660 }
28661
28662 return _this;
28663 }
28664 /**
28665 * @param {HTMLElement} toast
28666 * @param {Function} callback
28667 */
28668
28669
28670 _createClass(FallToastAnimator, [{
28671 key: "show",
28672 value: function show(toast, callback) {
28673 toast = toast._toast;
28674
28675 this._updatePosition(toast);
28676
28677 Animit.runAll(Animit(toast, this.def).default({
28678 transform: "translate3d(0, ".concat(this.fallAmount, ", 0)"),
28679 opacity: 0
28680 }, {
28681 transform: 'translate3d(0, 0, 0)',
28682 opacity: 1
28683 }).queue(function (done) {
28684 callback && callback();
28685 done();
28686 }));
28687 }
28688 /**
28689 * @param {HTMLElement} toast
28690 * @param {Function} callback
28691 */
28692
28693 }, {
28694 key: "hide",
28695 value: function hide(toast, callback) {
28696 var _this2 = this;
28697
28698 toast = toast._toast;
28699
28700 this._updatePosition(toast);
28701
28702 Animit.runAll(Animit(toast, this.def).default({
28703 transform: 'translate3d(0, 0, 0)',
28704 opacity: 1
28705 }, {
28706 transform: "translate3d(0, ".concat(this.fallAmount, ", 0)"),
28707 opacity: 0
28708 }).queue(function (done) {
28709 _this2._updatePosition(toast, true);
28710
28711 callback && callback();
28712 done();
28713 }));
28714 }
28715 }, {
28716 key: "_updatePosition",
28717 value: function _updatePosition(toast, cleanUp) {
28718 var correctTop;
28719
28720 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
28721 correctTop = '44px';
28722 } else {
28723 correctTop = '0';
28724 }
28725
28726 if (toast.style.top !== correctTop) {
28727 toast.style.top = correctTop;
28728 toast.style.bottom = 'initial';
28729 }
28730 }
28731 }]);
28732
28733 return FallToastAnimator;
28734 }(ToastAnimator);
28735
28736 var scheme = {
28737 '.toast': 'toast--*',
28738 '.toast__message': 'toast--*__message',
28739 '.toast__button': 'toast--*__button'
28740 };
28741 var defaultClassName = 'toast';
28742 var _animatorDict = {
28743 'default': platform.isAndroid() ? AscendToastAnimator : LiftToastAnimator,
28744 'fade': FadeToastAnimator,
28745 'ascend': AscendToastAnimator,
28746 'lift': LiftToastAnimator,
28747 'fall': FallToastAnimator,
28748 'none': ToastAnimator
28749 };
28750 /**
28751 * @element ons-toast
28752 * @category dialog
28753 * @description
28754 * [en]
28755 * The Toast or Snackbar component is useful for displaying dismissable information or simple actions at (normally) the bottom of the page.
28756 *
28757 * This component does not block user input, allowing the app to continue its flow. For simple toasts, consider `ons.notification.toast` instead.
28758 * [/en]
28759 * [ja][/ja]
28760 * @tutorial vanilla/Reference/toast
28761 * @seealso ons-alert-dialog
28762 * [en]The `<ons-alert-dialog>` component is preferred for displaying undismissable information.[/en]
28763 * [ja][/ja]
28764 */
28765
28766 var ToastElement = /*#__PURE__*/function (_BaseDialogElement) {
28767 _inherits(ToastElement, _BaseDialogElement);
28768
28769 var _super = _createSuper(ToastElement);
28770
28771 /**
28772 * @event preshow
28773 * @description
28774 * [en]Fired just before the toast is displayed.[/en]
28775 * [ja]ダイアログが表示される直前に発火します。[/ja]
28776 * @param {Object} event [en]Event object.[/en]
28777 * @param {Object} event.toast
28778 * [en]Toast object.[/en]
28779 * [ja]ダイアログのオブジェクト。[/ja]
28780 * @param {Function} event.cancel
28781 * [en]Execute to stop the toast from showing.[/en]
28782 * [ja]この関数を実行すると、ダイアログの表示を止めます。[/ja]
28783 */
28784
28785 /**
28786 * @event postshow
28787 * @description
28788 * [en]Fired just after the toast is displayed.[/en]
28789 * [ja]ダイアログが表示された直後に発火します。[/ja]
28790 * @param {Object} event [en]Event object.[/en]
28791 * @param {Object} event.toast
28792 * [en]Toast object.[/en]
28793 * [ja]ダイアログのオブジェクト。[/ja]
28794 */
28795
28796 /**
28797 * @event prehide
28798 * @description
28799 * [en]Fired just before the toast is hidden.[/en]
28800 * [ja]ダイアログが隠れる直前に発火します。[/ja]
28801 * @param {Object} event [en]Event object.[/en]
28802 * @param {Object} event.toast
28803 * [en]Toast object.[/en]
28804 * [ja]ダイアログのオブジェクト。[/ja]
28805 * @param {Function} event.cancel
28806 * [en]Execute to stop the toast from hiding.[/en]
28807 * [ja]この関数を実行すると、ダイアログが閉じようとするのを止めます。[/ja]
28808 */
28809
28810 /**
28811 * @event posthide
28812 * @description
28813 * [en]Fired just after the toast is hidden.[/en]
28814 * [ja]ダイアログが隠れた後に発火します。[/ja]
28815 * @param {Object} event [en]Event object.[/en]
28816 * @param {Object} event.toast
28817 * [en]Toast object.[/en]
28818 * [ja]ダイアログのオブジェクト。[/ja]
28819 */
28820
28821 /**
28822 * @attribute animation
28823 * @type {String}
28824 * @default default
28825 * @description
28826 * [en]The animation used when showing and hiding the toast. Can be either `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
28827 * [ja][/ja]
28828 */
28829
28830 /**
28831 * @attribute animation-options
28832 * @type {Expression}
28833 * @description
28834 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
28835 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. <code>{duration: 0.2, delay: 1, timing: 'ease-in'}</code>[/ja]
28836 */
28837
28838 /**
28839 * @property animationOptions
28840 * @type {Object}
28841 * @description
28842 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
28843 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
28844 */
28845
28846 /**
28847 * @attribute visible
28848 * @type {Boolean}
28849 * @description
28850 * [en]Whether the toast is visible or not.[/en]
28851 * [ja]要素が見える場合に`true`。[/ja]
28852 */
28853 function ToastElement() {
28854 var _this;
28855
28856 _classCallCheck(this, ToastElement);
28857
28858 _this = _super.call(this);
28859 _this._defaultDBB = null;
28860 contentReady(_assertThisInitialized(_this), function () {
28861 return _this._compile();
28862 });
28863 return _this;
28864 }
28865
28866 _createClass(ToastElement, [{
28867 key: "_scheme",
28868 get: function get() {
28869 return scheme;
28870 }
28871 }, {
28872 key: "_toast",
28873 get: function get() {
28874 return util$4.findChild(this, ".".concat(defaultClassName));
28875 }
28876 }, {
28877 key: "_updateAnimatorFactory",
28878 value: function _updateAnimatorFactory() {
28879 // Reset position style
28880 this._toast && (this._toast.style.top = this._toast.style.bottom = '');
28881 return new AnimatorFactory({
28882 animators: _animatorDict,
28883 baseClass: ToastAnimator,
28884 baseClassName: 'ToastAnimator',
28885 defaultAnimation: this.getAttribute('animation')
28886 });
28887 }
28888 /**
28889 * @property onDeviceBackButton
28890 * @type {Object}
28891 * @description
28892 * [en]Back-button handler.[/en]
28893 * [ja]バックボタンハンドラ。[/ja]
28894 */
28895
28896 }, {
28897 key: "_compile",
28898 value: function _compile() {
28899 autoStyle.prepare(this);
28900 this.style.display = 'none';
28901 this.style.zIndex = 10000; // Lower than dialogs
28902
28903 var messageClassName = 'toast__message';
28904 var buttonClassName = 'toast__button';
28905 var toast = util$4.findChild(this, ".".concat(defaultClassName));
28906
28907 if (!toast) {
28908 toast = document.createElement('div');
28909 toast.classList.add(defaultClassName);
28910
28911 while (this.childNodes[0]) {
28912 toast.appendChild(this.childNodes[0]);
28913 }
28914 }
28915
28916 var button = util$4.findChild(toast, ".".concat(buttonClassName));
28917
28918 if (!button) {
28919 button = util$4.findChild(toast, function (e) {
28920 return util$4.match(e, '.button') || util$4.match(e, 'button');
28921 });
28922
28923 if (button) {
28924 button.classList.remove('button');
28925 button.classList.add(buttonClassName);
28926 toast.appendChild(button);
28927 }
28928 }
28929
28930 if (!util$4.findChild(toast, ".".concat(messageClassName))) {
28931 var message = util$4.findChild(toast, '.message');
28932
28933 if (!message) {
28934 message = document.createElement('div');
28935
28936 for (var i = toast.childNodes.length - 1; i >= 0; i--) {
28937 if (toast.childNodes[i] !== button) {
28938 message.insertBefore(toast.childNodes[i], message.firstChild);
28939 }
28940 }
28941 }
28942
28943 message.classList.add(messageClassName);
28944 toast.insertBefore(message, toast.firstChild);
28945 }
28946
28947 if (toast.parentNode !== this) {
28948 this.appendChild(toast);
28949 }
28950
28951 ModifierUtil.initModifier(this, this._scheme);
28952 }
28953 /**
28954 * @property visible
28955 * @type {Boolean}
28956 * @description
28957 * [en]Whether the element is visible or not.[/en]
28958 * [ja]要素が見える場合に`true`。[/ja]
28959 */
28960
28961 /**
28962 * @method show
28963 * @signature show([options])
28964 * @param {Object} [options]
28965 * [en]Parameter object.[/en]
28966 * [ja]オプションを指定するオブジェクト。[/ja]
28967 * @param {String} [options.animation]
28968 * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
28969 * [ja][/ja]
28970 * @param {String} [options.animationOptions]
28971 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
28972 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
28973 * @description
28974 * [en]Show the element.[/en]
28975 * [ja][/ja]
28976 * @return {Promise}
28977 * [en]Resolves to the displayed element[/en]
28978 * [ja][/ja]
28979 */
28980
28981 /**
28982 * @method toggle
28983 * @signature toggle([options])
28984 * @param {Object} [options]
28985 * [en]Parameter object.[/en]
28986 * [ja]オプションを指定するオブジェクト。[/ja]
28987 * @param {String} [options.animation]
28988 * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
28989 * [ja][/ja]
28990 * @param {String} [options.animationOptions]
28991 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
28992 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
28993 * @description
28994 * [en]Toggle toast visibility.[/en]
28995 * [ja][/ja]
28996 */
28997
28998 /**
28999 * @method hide
29000 * @signature hide([options])
29001 * @param {Object} [options]
29002 * [en]Parameter object.[/en]
29003 * [ja]オプションを指定するオブジェクト。[/ja]
29004 * @param {String} [options.animation]
29005 * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
29006 * [ja][/ja]
29007 * @param {String} [options.animationOptions]
29008 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
29009 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
29010 * @description
29011 * [en]Hide toast.[/en]
29012 * [ja][/ja]
29013 * @return {Promise}
29014 * [en]Resolves to the hidden element[/en]
29015 * [ja][/ja]
29016 */
29017
29018 /**
29019 * @param {String} name
29020 * @param {Function} Animator
29021 */
29022
29023 }], [{
29024 key: "registerAnimator",
29025 value: function registerAnimator(name, Animator) {
29026 if (!(Animator.prototype instanceof ToastAnimator)) {
29027 util$4.throw('"Animator" param must inherit OnsToastElement.ToastAnimator');
29028 }
29029
29030 _animatorDict[name] = Animator;
29031 }
29032 }, {
29033 key: "animators",
29034 get: function get() {
29035 return _animatorDict;
29036 }
29037 }, {
29038 key: "ToastAnimator",
29039 get: function get() {
29040 return ToastAnimator;
29041 }
29042 }]);
29043
29044 return ToastElement;
29045 }(BaseDialogElement);
29046 onsElements.Toast = ToastElement;
29047 customElements.define('ons-toast', ToastElement);
29048
29049 /**
29050 * @element ons-toolbar-button
29051 * @category page
29052 * @modifier material
29053 * [en]Material Design toolbar button.[/en]
29054 * [ja][/ja]
29055 * @modifier outline
29056 * [en]A button with an outline.[/en]
29057 * [ja]アウトラインをもったボタンを表示します。[/ja]
29058 * @description
29059 * [en]Button component for ons-toolbar and ons-bottom-toolbar.[/en]
29060 * [ja]ons-toolbarあるいはons-bottom-toolbarに設置できるボタン用コンポーネントです。[/ja]
29061 * @codepen aHmGL
29062 * @tutorial vanilla/Reference/page
29063 * @guide compilation.html#toolbar-compilation
29064 * [en]Adding a toolbar[/en]
29065 * [ja]ツールバーの追加[/ja]
29066 * @seealso ons-toolbar
29067 * [en]The `<ons-toolbar>` component displays a navigation bar at the top of a page.[/en]
29068 * [ja]ons-toolbarコンポーネント[/ja]
29069 * @seealso ons-back-button
29070 * [en]The `<ons-back-button>` displays a back button in the navigation bar.[/en]
29071 * [ja]ons-back-buttonコンポーネント[/ja]
29072 * @example
29073 * <ons-toolbar>
29074 * <div class="left">
29075 * <ons-toolbar-button>
29076 * Button
29077 * </ons-toolbar-button>
29078 * </div>
29079 * <div class="center">
29080 * Title
29081 * </div>
29082 * <div class="right">
29083 * <ons-toolbar-button>
29084 * <ons-icon icon="ion-navicon" size="28px"></ons-icon>
29085 * </ons-toolbar-button>
29086 * </div>
29087 * </ons-toolbar>
29088 */
29089
29090 var ToolbarButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
29091 _inherits(ToolbarButtonElement, _BaseButtonElement);
29092
29093 var _super = _createSuper(ToolbarButtonElement);
29094
29095 function ToolbarButtonElement() {
29096 _classCallCheck(this, ToolbarButtonElement);
29097
29098 return _super.apply(this, arguments);
29099 }
29100
29101 _createClass(ToolbarButtonElement, [{
29102 key: "_scheme",
29103 get:
29104 /**
29105 * @attribute modifier
29106 * @type {String}
29107 * @description
29108 * [en]The appearance of the button.[/en]
29109 * [ja]ボタンの表現を指定します。[/ja]
29110 */
29111
29112 /**
29113 * @attribute icon
29114 * @type {String}
29115 * @description
29116 * [en]Creates an `ons-icon` component with this string.[/en]
29117 * [ja]`ons-icon`コンポーネントを悪性します。[/ja]
29118 */
29119
29120 /**
29121 * @attribute disabled
29122 * @description
29123 * [en]Specify if button should be disabled.[/en]
29124 * [ja]ボタンを無効化する場合は指定してください。[/ja]
29125 */
29126
29127 /**
29128 * @property disabled
29129 * @type {Boolean}
29130 * @description
29131 * [en]Whether the element is disabled or not.[/en]
29132 * [ja]無効化されている場合に`true`。[/ja]
29133 */
29134 function get() {
29135 return {
29136 '': 'toolbar-button--*'
29137 };
29138 }
29139 }, {
29140 key: "_defaultClassName",
29141 get: function get() {
29142 return 'toolbar-button';
29143 }
29144 }, {
29145 key: "_rippleOpt",
29146 get: function get() {
29147 return [this, undefined, {
29148 center: '',
29149 'size': 'contain',
29150 'background': 'transparent'
29151 }];
29152 }
29153 }]);
29154
29155 return ToolbarButtonElement;
29156 }(BaseButtonElement);
29157 onsElements.ToolbarButton = ToolbarButtonElement;
29158 customElements.define('ons-toolbar-button', ToolbarButtonElement);
29159
29160 setup$1(ons); // Setup initial listeners
29161
29162 window._superSecretOns = ons;
29163
29164 return ons;
29165
29166}));
29167//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25zZW51aS5qcyIsInNvdXJjZXMiOlsiLi4vZXNtL29ucy9wbGF0Zm9ybS5qcyIsIi4uL2VzbS9wb2x5ZmlsbHMvcG9seWZpbGwtc3dpdGNoZXMuanMiLCIuLi9lc20vcG9seWZpbGxzL2N1c3RvbS1lbGVtZW50cy9jdXN0b20tZWxlbWVudHMubWluLmpzIiwiLi4vZXNtL3BvbHlmaWxscy9NdXRhdGlvbk9ic2VydmVyQDAuNy4yMi9NdXRhdGlvbk9ic2VydmVyLmpzIiwiLi4vZXNtL3BvbHlmaWxscy9zZXRJbW1lZGlhdGVAMS4wLjIrbW9kL3NldEltbWVkaWF0ZS5qcyIsIi4uL2VzbS92ZW5kb3Ivdmlld3BvcnQuanMiLCIuLi9lc20vb25zL21pY3JvZXZlbnQuanMiLCIuLi9lc20vb25zL2VsZW1lbnRzLmpzIiwiLi4vZXNtL29ucy9zdHlsZXIuanMiLCIuLi9lc20vb25zL2F1dG9zdHlsZS5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyIsIi4uL2VzbS9vbnMvYW5pbWF0aW9uLW9wdGlvbnMtcGFyc2VyLmpzIiwiLi4vZXNtL29ucy91dGlsLmpzIiwiLi4vZXNtL29ucy9wYWdlLWF0dHJpYnV0ZS1leHByZXNzaW9uLmpzIiwiLi4vZXNtL29ucy9pbnRlcm5hbC9pbnRlcm5hbC5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvZGV2aWNlLWJhY2stYnV0dG9uLWRpc3BhdGNoZXIuanMiLCIuLi9lc20vb25zL2ludGVybmFsL2luZGV4LmpzIiwiLi4vZXNtL3NldHVwLmpzIiwiLi4vZXNtL29ucy9hbmltaXQuanMiLCIuLi9lc20vb25zL2dlc3R1cmUtZGV0ZWN0b3IuanMiLCIuLi9lc20vb25zL2NvbnRlbnQtcmVhZHkuanMiLCIuLi9lc20vb25zL2ludGVybmFsL3RvYXN0LXF1ZXVlLmpzIiwiLi4vZXNtL29ucy9ub3RpZmljYXRpb24uanMiLCIuLi9lc20vb25zL2FjdGlvbi1zaGVldC5qcyIsIi4uL2VzbS9vbnMvb3JpZW50YXRpb24uanMiLCIuLi9lc20vb25zL21vZGlmaWVyLmpzIiwiLi4vZXNtL29ucy9zb2Z0d2FyZS1rZXlib2FyZC5qcyIsIi4uL2VzbS9vbnMvZG9vcmxvY2suanMiLCIuLi9lc20vb25zL3BhZ2UtbG9hZGVyLmpzIiwiLi4vZXNtL29ucy9pbmRleC5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtZWxlbWVudC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtaWYuanMiLCIuLi9lc20vb25zL2Jhc2UtYW5pbWF0b3IuanMiLCIuLi9lc20vb25zL2lwaG9uZXgtcGF0Y2guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWFjdGlvbi1zaGVldC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtZGlhbG9nLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJpcHBsZS9hbmltYXRvci1jc3MuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJpcHBsZS5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtYnV0dG9uLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hbGVydC1kaWFsb2cvYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWFsZXJ0LWRpYWxvZy5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtYWxlcnQtZGlhbG9nLWJ1dHRvbi5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtYmFjay1idXR0b24uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWJvdHRvbS10b29sYmFyLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1idXR0b24uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNhcmQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNhcm91c2VsLWl0ZW0uanMiLCIuLi9lc20vb25zL2ludGVybmFsL3N3aXBlci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtY2Fyb3VzZWwuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNvbC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtZGlhbG9nL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1kaWFsb2cuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWZhYi5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtZ2VzdHVyZS1kZXRlY3Rvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtaWNvbi5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvbGF6eS1yZXBlYXQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWxhenktcmVwZWF0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1saXN0LWhlYWRlci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbGlzdC10aXRsZS5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbGlzdC1pdGVtL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1saXN0LWl0ZW0uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWxpc3QuanMiLCIuLi9lc20vZWxlbWVudHMvYmFzZS9iYXNlLWlucHV0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1pbnB1dC5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtY2hlY2tib3guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNoZWNrYm94LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1yYWRpby5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VhcmNoLWlucHV0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1tb2RhbC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwvZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwvbGlmdC1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwuanMiLCIuLi9lc20vb25zL2ludGVybmFsL3N3aXBlLXJldmVhbC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLXN3aXBlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLXNsaWRlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLWxpZnQtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLW5hdmlnYXRvci9pb3MtZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL21kLXNsaWRlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvbWQtbGlmdC1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL21kLWZhZGUtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLW5hdmlnYXRvci9ub25lLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXRvb2xiYXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBhZ2UuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBvcG92ZXIvYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBvcG92ZXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXByb2dyZXNzLWJhci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtcHJvZ3Jlc3MtY2lyY3VsYXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXB1bGwtaG9vay5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtcmFuZ2UuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJvdy5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VnbWVudC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VsZWN0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGVlZC1kaWFsLWl0ZW0uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwZWVkLWRpYWwuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLWNvbnRlbnQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLW1hc2suanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9vdmVybGF5LWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9wdXNoLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9yZXZlYWwtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci1zaWRlLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zd2l0Y2guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXRhYmJhci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdGFiLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9hc3QvZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9hc3QvYXNjZW5kLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9saWZ0LWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9mYWxsLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9vbGJhci1idXR0b24uanMiLCIuLi9lc20vaW5kZXgudW1kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbi8vIFNhdmUgSFRNTEVsZW1lbnQgb2JqZWN0IGJlZm9yZSBDdXN0b20gRWxlbWVudHMgcG9seWZpbGwgcGF0Y2ggZ2xvYmFsIEhUTUxFbGVtZW50LlxuY29uc3QgTmF0aXZlSFRNTEVsZW1lbnQgPSB3aW5kb3cuSFRNTEVsZW1lbnQ7XG5cbi8qKlxuICogQG9iamVjdCBvbnMucGxhdGZvcm1cbiAqIEBjYXRlZ29yeSB1dGlsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVV0aWxpdHkgbWV0aG9kcyB0byBkZXRlY3QgY3VycmVudCBwbGF0Zm9ybS5bL2VuXVxuICogICBbamFd54++5Zyo5a6f6KGM44GV44KM44Gm44GE44KL44OX44Op44OD44OI44OV44Kp44O844Og44KS5qSc55+l44GZ44KL44Gf44KB44Gu44Om44O844OG44Kj44Oq44OG44Kj44Oh44K944OD44OJ44KS5Y+O44KB44Gf44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqL1xuY2xhc3MgUGxhdGZvcm0ge1xuXG4gIC8qKlxuICAgKiBBbGwgZWxlbWVudHMgd2lsbCBiZSByZW5kZXJlZCBhcyBpZiB0aGUgYXBwIHdhcyBydW5uaW5nIG9uIHRoaXMgcGxhdGZvcm0uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFBsYXRmb3JtID0gbnVsbDtcbiAgICB0aGlzLl9pZ25vcmVQbGF0Zm9ybVNlbGVjdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2VsZWN0XG4gICAqIEBzaWduYXR1cmUgc2VsZWN0KHBsYXRmb3JtKVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBsYXRmb3JtIE5hbWUgb2YgdGhlIHBsYXRmb3JtLlxuICAgKiAgIFtlbl1Qb3NzaWJsZSB2YWx1ZXMgYXJlOiBcIm9wZXJhXCIsIFwiZmlyZWZveFwiLCBcInNhZmFyaVwiLCBcImNocm9tZVwiLCBcImllXCIsIFwiYW5kcm9pZFwiLCBcImJsYWNrYmVycnlcIiwgXCJpb3NcIiBvciBcIndwXCIuWy9lbl1cbiAgICogICBbamFdXCJvcGVyYVwiLCBcImZpcmVmb3hcIiwgXCJzYWZhcmlcIiwgXCJjaHJvbWVcIiwgXCJpZVwiLCBcImFuZHJvaWRcIiwgXCJibGFja2JlcnJ5XCIsIFwiaW9zXCIsIFwid3BcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TZXRzIHRoZSBwbGF0Zm9ybSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudHMuIFVzZWZ1bCBmb3IgdGVzdGluZy5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgpLmj4/nlLvjgZnjgovjgZ/jgoHjgavliKnnlKjjgZnjgovjg5fjg6njg4Pjg4jjg5Xjgqnjg7zjg6DlkI3jgpLoqK3lrprjgZfjgb7jgZnjgILjg4bjgrnjg4jjgavkvr/liKnjgafjgZnjgIJbL2phXVxuICAgKi9cbiAgc2VsZWN0KHBsYXRmb3JtKSB7XG4gICAgaWYgKHR5cGVvZiBwbGF0Zm9ybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUGxhdGZvcm0gPSBwbGF0Zm9ybS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPyBudWxsIDogdGhpcy5fc2VsZWN0ZWRQbGF0Zm9ybTtcbiAgfVxuXG4gIF9ydW5PbkFjdHVhbFBsYXRmb3JtKGZuKSB7XG4gICAgdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuKCk7XG4gICAgdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPSBmYWxzZTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gR2VuZXJhbFxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNXZWJWaWV3XG4gICAqIEBzaWduYXR1cmUgaXNXZWJWaWV3KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciBhcHAgaXMgcnVubmluZyBpbiBDb3Jkb3ZhLlsvZW5dXG4gICAqICAgW2phXUNvcmRvdmHlhoXjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNXZWJWaWV3KCkge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXNXZWJWaWV3KCkgbWV0aG9kIGlzIGF2YWlsYWJsZSBhZnRlciBkb20gY29udGVudHMgbG9hZGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiAhISh3aW5kb3cuY29yZG92YSB8fCB3aW5kb3cucGhvbmVnYXAgfHwgd2luZG93LlBob25lR2FwKTtcbiAgfVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBpT1MgZGV2aWNlc1xuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNJUGhvbmVcbiAgICogQHNpZ25hdHVyZSBpc0lQaG9uZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGhvbmUuWy9lbl1cbiAgICogICBbamFdaVBob25l5LiK44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzSVBob25lKCkge1xuICAgIHJldHVybiAvaVBob25lL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBob25lWFxuICAgKiBAc2lnbmF0dXJlIGlzSVBob25lWCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGhvbmUgWCwgWFMsIFhTIE1heCwgWFIsIDExLCAxMSBQcm8sIDExIFBybyBNYXgsIDEyIE1pbmksIDEyLCAxMiBQcm8gb3IgMTIgUHJvIE1heC5bL2VuXVxuICAgKiAgIFtqYV1pUGhvbmUgWCDjgoQgWFPjgIFYUyBNYXjjgIFYUuOAgTEx44CBMTEgUHJv44CBMTEgUHJvIE1heOOAgTEyIE1pbmnjgIExMuOAgTEyIFByb+OAgeOBvuOBn+OBrzEyIFBybyBNYXjkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJUGhvbmVYKCkge1xuICAgIC8vIGlPUyBXZWJWaWV3cyBvbiB0aGUgc2FtZSBpT1MgdmVyc2lvbiBoYXZlIHRoZSBzYW1lIHVzZXIgYWdlbnQuXG4gICAgLy8gV2UgY2Fubm90IGF2b2lkIHVzaW5nIHdpbmRvdy5zY3JlZW4uXG4gICAgLy8gV2UgYWxzbyBjYW5ub3QgdXNlIGNvcmRvdmEtcGx1Z2luLWRldmljZSBzaW5jZSBpdHMgYmVoYXZpb3IgaXMgZGlmZmVyZW50IGJldHdlZW4gc2ltdWxhdG9ycyBhbmQgcmVhbCBkZXZpY2VzLlxuICAgIC8vIFRoaXMgd29ya3Mgd2VsbCBib3RoIGluIGlPUyBTYWZhcmkgYW5kIChVSXxXSylXZWJWaWV3IG9mIGlQaG9uZSBYLlxuICAgIHJldHVybiB0aGlzLmlzSVBob25lKCkgJiZcbiAgICAgIChcbiAgICAgICAgLy8gWCwgWFMsIDExIFBybywgMTIgTWluaVxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSAzNzUgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDgxMiB8fCAvLyBwb3J0cmFpdFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA4MTIgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDM3NSB8fCAvLyBsYW5kc2NhcGVcblxuICAgICAgICAvLyBYUyBNYXgsIFhSLCAxMSwgMTEgUHJvIE1heFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA0MTQgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDg5NiB8fCAvLyBwb3J0cmFpdFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA4OTYgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDQxNCB8fCAvLyBsYW5kc2NhcGVcblxuICAgICAgICAvLyAxMiwgMTIgUHJvXG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDM5MCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gODQ0IHx8IC8vIHBvcnRyYWl0XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDg0NCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gMzkwIHx8IC8vIGxhbmRzY2FwZVxuXG4gICAgICAgIC8vIDEyIFBybyBNYXhcbiAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCA9PT0gNDI4ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0ID09PSA5MjYgfHwgLy8gcG9ydHJhaXRcbiAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCA9PT0gOTI2ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0ID09PSA0MjggIC8vIGxhbmRzY2FwZVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBhZFxuICAgKiBAc2lnbmF0dXJlIGlzSVBhZCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGFkLlsvZW5dXG4gICAqICAgW2phXWlQYWTkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJUGFkKCkge1xuICAgIHJldHVybiAvaVBhZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgdGhpcy5pc0lQYWRPUygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0lQb2QoKSB7XG4gICAgcmV0dXJuIC9pUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBpT1MgdmVyc2lvbnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSU9TXG4gICAqIEBzaWduYXR1cmUgaXNJT1MoW2ZvcmNlQWN0dWFsUGxhdGZvcm1dKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZvcmNlQWN0dWFsUGxhdGZvcm1cbiAgICogICBbZW5dSWYgdHJ1ZSwgc2VsZWN0ZWQgcGxhdGZvcm0gaXMgaWdub3JlZCBhbmQgdGhlIGFjdHVhbCBwbGF0Zm9ybSBpcyByZXR1cm5lZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBPUyBpcyBpT1MuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXWlPU+S4iuOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0lPUyhmb3JjZUFjdHVhbFBsYXRmb3JtKSB7XG4gICAgaWYgKCFmb3JjZUFjdHVhbFBsYXRmb3JtICYmIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSA9PT0gJ2lvcyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuIC9pT1MvaS50ZXN0KGRldmljZS5wbGF0Zm9ybSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgdGhpcy5pc0lQYWRPUygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSU9TN2Fib3ZlXG4gICAqIEBzaWduYXR1cmUgaXNJT1M3YWJvdmUoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBpT1MgdmVyc2lvbiBpcyA3IG9yIGFib3ZlLlsvZW5dXG4gICAqICAgW2phXWlPUzfku6XkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJT1M3YWJvdmUoKSB7XG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuICgvaU9TL2kudGVzdChkZXZpY2UucGxhdGZvcm0pICYmIChwYXJzZUludChkZXZpY2UudmVyc2lvbi5zcGxpdCgnLicpWzBdKSA+PSA3KSk7XG4gICAgfSBlbHNlIGlmICgvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIGNvbnN0IHZlciA9IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cXGJbMC05XStfWzAtOV0rKD86X1swLTldKyk/XFxiLykgfHwgWycnXSlbMF0ucmVwbGFjZSgvXy9nLCAnLicpO1xuICAgICAgcmV0dXJuIChwYXJzZUludCh2ZXIuc3BsaXQoJy4nKVswXSkgPj0gNyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBhZE9TXG4gICAqIEBzaWduYXR1cmUgaXNJUGFkT1MoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBPUyBpcyBpUGFkT1MuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzSVBhZE9TKCkge1xuICAgIC8vIFRoZSBpUGFkT1MgVXNlciBBZ2VudCBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgTWFjT1Mgc28gYXMgYVxuICAgIC8vIHdvcmthcm91bmQgd2UgdGVzdCB0aGUgbWF4IHRvdWNoIHBvaW50cywgd2hpY2ggaXMgNSBmb3JcbiAgICAvLyBpUGFkcyBhbmQgMCBmb3IgZGVza3RvcCBicm93c2Vycy5cbiAgICByZXR1cm4gISEoL01hY2ludG9zaC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA9PT0gNSk7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gaU9TIGJyb3dzZXJzXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogQG1ldGhvZCBpc0lPU1NhZmFyaVxuICAgKiBAc2lnbmF0dXJlIGlzSU9TU2FmYXJpKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciBhcHAgaXMgcnVubmluZyBpbiBpT1MgU2FmYXJpLlsvZW5dXG4gICAqICAgW2phXWlPUyBTYWZhcmnjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJT1NTYWZhcmkoKSB7XG4gICAgY29uc3QgbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvcjtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICByZXR1cm4gISEodGhpcy5pc0lPUygpICYmIHVhLmluZGV4T2YoJ1NhZmFyaScpICE9PSAtMSAmJiB1YS5pbmRleE9mKCdWZXJzaW9uJykgIT09IC0xICYmICFuYXZpZ2F0b3Iuc3RhbmRhbG9uZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpc1dLV2ViVmlld1xuICAgKiBAc2lnbmF0dXJlIGlzV0tXZWJWaWV3KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciBhcHAgaXMgcnVubmluZyBpbiBXS1dlYlZpZXcuWy9lbl1cbiAgICogICBbamFdV0tXZWJWaWV344Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzV0tXZWJWaWV3KCkge1xuICAgIGNvbnN0IGx0ZTkgPSAvY29uc3RydWN0b3IvaS50ZXN0KE5hdGl2ZUhUTUxFbGVtZW50KTtcbiAgICByZXR1cm4gISEodGhpcy5pc0lPUygpICYmIHdpbmRvdy53ZWJraXQgJiYgd2luZG93LndlYmtpdC5tZXNzYWdlSGFuZGxlcnMgJiYgd2luZG93LmluZGV4ZWREQiAmJiAhbHRlOSk7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQW5kcm9pZCBkZXZpY2VzXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogQG1ldGhvZCBpc0FuZHJvaWRQaG9uZVxuICAgKiBAc2lnbmF0dXJlIGlzQW5kcm9pZFBob25lKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIEFuZHJvaWQgcGhvbmUuWy9lbl1cbiAgICogICBbamFdQW5kcm9pZOaQuuW4r+S4iuOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0FuZHJvaWRQaG9uZSgpIHtcbiAgICByZXR1cm4gL0FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9Nb2JpbGUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNBbmRyb2lkVGFibGV0XG4gICAqIEBzaWduYXR1cmUgaXNBbmRyb2lkVGFibGV0KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIEFuZHJvaWQgdGFibGV0LlsvZW5dXG4gICAqICAgW2phXUFuZHJvaWTjgr/jg5bjg6zjg4Pjg4jkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNBbmRyb2lkVGFibGV0KCkge1xuICAgIHJldHVybiAvQW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIS9Nb2JpbGUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEFuZHJvaWQgdmVyc2lvbnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzQW5kcm9pZFxuICAgKiBAc2lnbmF0dXJlIGlzQW5kcm9pZChbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIE9TIGlzIEFuZHJvaWQuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXUFuZHJvaWTkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNBbmRyb2lkKGZvcmNlQWN0dWFsUGxhdGZvcm0pIHtcbiAgICBpZiAoIWZvcmNlQWN0dWFsUGxhdGZvcm0gJiYgdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpID09PSAnYW5kcm9pZCc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuIC9BbmRyb2lkL2kudGVzdChkZXZpY2UucGxhdGZvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gL0FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBPdGhlciBkZXZpY2VzXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogQG1ldGhvZCBpc1dQXG4gICAqIEBzaWduYXR1cmUgaXNXUChbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIE9TIGlzIFdpbmRvd3MgcGhvbmUuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc1dQKGZvcmNlQWN0dWFsUGxhdGZvcm0pIHtcbiAgICBpZiAoIWZvcmNlQWN0dWFsUGxhdGZvcm0gJiYgdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpID09PSAnd3AnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGV2aWNlID09PSAnb2JqZWN0JyAmJiAhL2Jyb3dzZXIvaS50ZXN0KGRldmljZS5wbGF0Zm9ybSkpIHtcbiAgICAgIHJldHVybiAvV2luMzJOVHxXaW5DRS9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIC9XaW5kb3dzIFBob25lfElFTW9iaWxlfFdQRGVza3RvcC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNCbGFja0JlcnJ5XG4gICAqIEBzaWduYXR1cmUgaXNCbGFja0JlcnJ5KFtmb3JjZUFjdHVhbFBsYXRmb3JtXSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUFjdHVhbFBsYXRmb3JtXG4gICAqICAgW2VuXUlmIHRydWUsIHNlbGVjdGVkIHBsYXRmb3JtIGlzIGlnbm9yZWQgYW5kIHRoZSBhY3R1YWwgcGxhdGZvcm0gaXMgcmV0dXJuZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIEJsYWNrQmVycnkuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXUJsYWNrQmVycnnkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNCbGFja0JlcnJ5KGZvcmNlQWN0dWFsUGxhdGZvcm0pIHtcbiAgICBpZiAoIWZvcmNlQWN0dWFsUGxhdGZvcm0gJiYgdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpID09PSAnYmxhY2tiZXJyeSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuIC9CbGFja0JlcnJ5L2kudGVzdChkZXZpY2UucGxhdGZvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gL0JsYWNrQmVycnl8UklNIFRhYmxldCBPU3xCQjEwL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICB9XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gT3RoZXIgYnJvd3NlcnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzT3BlcmFcbiAgICogQHNpZ25hdHVyZSBpc09wZXJhKFtmb3JjZUFjdHVhbFBsYXRmb3JtXSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUFjdHVhbFBsYXRmb3JtXG4gICAqICAgW2VuXUlmIHRydWUsIHNlbGVjdGVkIHBsYXRmb3JtIGlzIGlnbm9yZWQgYW5kIHRoZSBhY3R1YWwgcGxhdGZvcm0gaXMgcmV0dXJuZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgYnJvd3NlciBpcyBPcGVyYS4gQnkgZGVmYXVsdCB3aWxsIHJldHVybiBtYW51YWxseSBzZWxlY3RlZCBwbGF0Zm9ybSBpZiBpdCBpcyBzZXQuWy9lbl1cbiAgICogICBbamFdT3BlcmHkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNPcGVyYShmb3JjZUFjdHVhbFBsYXRmb3JtKSB7XG4gICAgaWYgKCFmb3JjZUFjdHVhbFBsYXRmb3JtICYmIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSA9PT0gJ29wZXJhJztcbiAgICB9XG5cbiAgICByZXR1cm4gKCEhd2luZG93Lm9wZXJhIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignIE9QUi8nKSA+PSAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzRmlyZWZveFxuICAgKiBAc2lnbmF0dXJlIGlzRmlyZWZveChbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgRmlyZWZveC4gQnkgZGVmYXVsdCB3aWxsIHJldHVybiBtYW51YWxseSBzZWxlY3RlZCBwbGF0Zm9ybSBpZiBpdCBpcyBzZXQuWy9lbl1cbiAgICogICBbamFdRmlyZWZveOS4iuOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0ZpcmVmb3goZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdmaXJlZm94JztcbiAgICB9XG5cbiAgICByZXR1cm4gKHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNTYWZhcmlcbiAgICogQHNpZ25hdHVyZSBpc1NhZmFyaShbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgU2FmYXJpLiBCeSBkZWZhdWx0IHdpbGwgcmV0dXJuIG1hbnVhbGx5IHNlbGVjdGVkIHBsYXRmb3JtIGlmIGl0IGlzIHNldC5bL2VuXVxuICAgKiAgIFtqYV1TYWZhcmnkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNTYWZhcmkoZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdzYWZhcmknO1xuICAgIH1cblxuICAgIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5IVE1MRWxlbWVudCkuaW5kZXhPZignQ29uc3RydWN0b3InKSA+IDApIHx8IChmdW5jdGlvbiAocCkgeyByZXR1cm4gcC50b1N0cmluZygpID09PSAnW29iamVjdCBTYWZhcmlSZW1vdGVOb3RpZmljYXRpb25dJzsgfSkoIXdpbmRvd1snc2FmYXJpJ10gfHwgc2FmYXJpLnB1c2hOb3RpZmljYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNDaHJvbWVcbiAgICogQHNpZ25hdHVyZSBpc0Nocm9tZShbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgQ2hyb21lLiBCeSBkZWZhdWx0IHdpbGwgcmV0dXJuIG1hbnVhbGx5IHNlbGVjdGVkIHBsYXRmb3JtIGlmIGl0IGlzIHNldC5bL2VuXVxuICAgKiAgIFtqYV1DaHJvbWXkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNDaHJvbWUoZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdjaHJvbWUnO1xuICAgIH1cblxuICAgIHJldHVybiAoISF3aW5kb3cuY2hyb21lICYmICEoISF3aW5kb3cub3BlcmEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgT1BSLycpID49IDApICYmICEobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgRWRnZS8nKSA+PSAwKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpc0lFXG4gICAqIEBzaWduYXR1cmUgaXNJRShbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgSW50ZXJuZXQgRXhwbG9yZXIuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXUludGVybmV0IEV4cGxvcmVy5LiK44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzSUUoZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdpZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlIHx8ICEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNFZGdlXG4gICAqIEBzaWduYXR1cmUgaXNFZGdlKFtmb3JjZUFjdHVhbFBsYXRmb3JtXSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUFjdHVhbFBsYXRmb3JtXG4gICAqICAgW2VuXUlmIHRydWUsIHNlbGVjdGVkIHBsYXRmb3JtIGlzIGlnbm9yZWQgYW5kIHRoZSBhY3R1YWwgcGxhdGZvcm0gaXMgcmV0dXJuZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgYnJvd3NlciBpcyBFZGdlLiBCeSBkZWZhdWx0IHdpbGwgcmV0dXJuIG1hbnVhbGx5IHNlbGVjdGVkIHBsYXRmb3JtIGlmIGl0IGlzIHNldC5bL2VuXVxuICAgKiAgIFtqYV1FZGdl5LiK44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzRWRnZShmb3JjZUFjdHVhbFBsYXRmb3JtKSB7XG4gICAgaWYgKCFmb3JjZUFjdHVhbFBsYXRmb3JtICYmIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSA9PT0gJ2VkZ2UnO1xuICAgIH1cblxuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBFZGdlLycpID49IDA7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVXRpbGl0eSBmdW5jdGlvbnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqL1xuICBnZXRNb2JpbGVPUygpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWQoKSkge1xuICAgICAgcmV0dXJuICdhbmRyb2lkJztcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5pc0lPUygpKSB7XG4gICAgICByZXR1cm4gJ2lvcyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuaXNXUCgpKSB7XG4gICAgICByZXR1cm4gJ3dwJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gJ290aGVyJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0SU9TRGV2aWNlKCkge1xuICAgIGlmICh0aGlzLmlzSVBob25lKCkpIHtcbiAgICAgIHJldHVybiAnaXBob25lJztcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5pc0lQYWQoKSkge1xuICAgICAgcmV0dXJuICdpcGFkJztcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5pc0lQb2QoKSkge1xuICAgICAgcmV0dXJuICdpcG9kJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gJ25hJztcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGxhdGZvcm0oKTtcbiIsIi8vIEZvciBAb25zZW51aS9jdXN0b20tZWxlbWVudHNcbmlmICh3aW5kb3cuY3VzdG9tRWxlbWVudHMpIHsgLy8gZXZlbiBpZiBuYXRpdmUgQ0UxIGltcGwgZXhpc3RzLCB1c2UgcG9seWZpbGxcbiAgICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZm9yY2VQb2x5ZmlsbCA9IHRydWU7XG59XG4iLCIoZnVuY3Rpb24oKXtcbid1c2Ugc3RyaWN0Jzt2YXIgZz1uZXcgZnVuY3Rpb24oKXt9O3ZhciBhYT1uZXcgU2V0KFwiYW5ub3RhdGlvbi14bWwgY29sb3ItcHJvZmlsZSBmb250LWZhY2UgZm9udC1mYWNlLXNyYyBmb250LWZhY2UtdXJpIGZvbnQtZmFjZS1mb3JtYXQgZm9udC1mYWNlLW5hbWUgbWlzc2luZy1nbHlwaFwiLnNwbGl0KFwiIFwiKSk7ZnVuY3Rpb24gayhiKXt2YXIgYT1hYS5oYXMoYik7Yj0vXlthLXpdWy4wLTlfYS16XSotW1xcLS4wLTlfYS16XSokLy50ZXN0KGIpO3JldHVybiFhJiZifWZ1bmN0aW9uIGwoYil7dmFyIGE9Yi5pc0Nvbm5lY3RlZDtpZih2b2lkIDAhPT1hKXJldHVybiBhO2Zvcig7YiYmIShiLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YiBpbnN0YW5jZW9mIERvY3VtZW50KTspYj1iLnBhcmVudE5vZGV8fCh3aW5kb3cuU2hhZG93Um9vdCYmYiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/Yi5ob3N0OnZvaWQgMCk7cmV0dXJuISghYnx8IShiLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YiBpbnN0YW5jZW9mIERvY3VtZW50KSl9XG5mdW5jdGlvbiBtKGIsYSl7Zm9yKDthJiZhIT09YiYmIWEubmV4dFNpYmxpbmc7KWE9YS5wYXJlbnROb2RlO3JldHVybiBhJiZhIT09Yj9hLm5leHRTaWJsaW5nOm51bGx9XG5mdW5jdGlvbiBuKGIsYSxlKXtlPWU/ZTpuZXcgU2V0O2Zvcih2YXIgYz1iO2M7KXtpZihjLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBkPWM7YShkKTt2YXIgaD1kLmxvY2FsTmFtZTtpZihcImxpbmtcIj09PWgmJlwiaW1wb3J0XCI9PT1kLmdldEF0dHJpYnV0ZShcInJlbFwiKSl7Yz1kLmltcG9ydDtpZihjIGluc3RhbmNlb2YgTm9kZSYmIWUuaGFzKGMpKWZvcihlLmFkZChjKSxjPWMuZmlyc3RDaGlsZDtjO2M9Yy5uZXh0U2libGluZyluKGMsYSxlKTtjPW0oYixkKTtjb250aW51ZX1lbHNlIGlmKFwidGVtcGxhdGVcIj09PWgpe2M9bShiLGQpO2NvbnRpbnVlfWlmKGQ9ZC5fX0NFX3NoYWRvd1Jvb3QpZm9yKGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKW4oZCxhLGUpfWM9Yy5maXJzdENoaWxkP2MuZmlyc3RDaGlsZDptKGIsYyl9fWZ1bmN0aW9uIHEoYixhLGUpe2JbYV09ZX07ZnVuY3Rpb24gcigpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZj1uZXcgTWFwO3RoaXMuYz1bXTt0aGlzLmI9ITF9ZnVuY3Rpb24gYmEoYixhLGUpe2IuYS5zZXQoYSxlKTtiLmYuc2V0KGUuY29uc3RydWN0b3IsZSl9ZnVuY3Rpb24gdChiLGEpe2IuYj0hMDtiLmMucHVzaChhKX1mdW5jdGlvbiB2KGIsYSl7Yi5iJiZuKGEsZnVuY3Rpb24oYSl7cmV0dXJuIHcoYixhKX0pfWZ1bmN0aW9uIHcoYixhKXtpZihiLmImJiFhLl9fQ0VfcGF0Y2hlZCl7YS5fX0NFX3BhdGNoZWQ9ITA7Zm9yKHZhciBlPTA7ZTxiLmMubGVuZ3RoO2UrKyliLmNbZV0oYSl9fWZ1bmN0aW9uIHgoYixhKXt2YXIgZT1bXTtuKGEsZnVuY3Rpb24oYil7cmV0dXJuIGUucHVzaChiKX0pO2ZvcihhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBjPWVbYV07MT09PWMuX19DRV9zdGF0ZT9sKGMpJiZiLmNvbm5lY3RlZENhbGxiYWNrKGMpOnkoYixjKX19XG5mdW5jdGlvbiB6KGIsYSl7dmFyIGU9W107bihhLGZ1bmN0aW9uKGIpe3JldHVybiBlLnB1c2goYil9KTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgYz1lW2FdOzE9PT1jLl9fQ0Vfc3RhdGUmJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2soYyl9fVxuZnVuY3Rpb24gQShiLGEsZSl7ZT1lP2U6bmV3IFNldDt2YXIgYz1bXTtuKGEsZnVuY3Rpb24oZCl7aWYoXCJsaW5rXCI9PT1kLmxvY2FsTmFtZSYmXCJpbXBvcnRcIj09PWQuZ2V0QXR0cmlidXRlKFwicmVsXCIpKXt2YXIgYT1kLmltcG9ydDthIGluc3RhbmNlb2YgTm9kZSYmXCJjb21wbGV0ZVwiPT09YS5yZWFkeVN0YXRlPyhhLl9fQ0VfaXNJbXBvcnREb2N1bWVudD0hMCxhLl9fQ0VfaGFzUmVnaXN0cnk9ITApOmQuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixmdW5jdGlvbigpe3ZhciBhPWQuaW1wb3J0O2EuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkfHwoYS5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQ9ITAsYS5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYS5fX0NFX2hhc1JlZ2lzdHJ5PSEwLG5ldyBTZXQoZSksZS5kZWxldGUoYSksQShiLGEsZSkpfSl9ZWxzZSBjLnB1c2goZCl9LGUpO2lmKGIuYilmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKXcoYixjW2FdKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKXkoYixcbmNbYV0pfVxuZnVuY3Rpb24geShiLGEpe2lmKHZvaWQgMD09PWEuX19DRV9zdGF0ZSl7dmFyIGU9Yi5hLmdldChhLmxvY2FsTmFtZSk7aWYoZSl7ZS5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGEpO3ZhciBjPWUuY29uc3RydWN0b3I7dHJ5e3RyeXtpZihuZXcgYyE9PWEpdGhyb3cgRXJyb3IoXCJUaGUgY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3IgZGlkIG5vdCBwcm9kdWNlIHRoZSBlbGVtZW50IGJlaW5nIHVwZ3JhZGVkLlwiKTt9ZmluYWxseXtlLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChmKXt0aHJvdyBhLl9fQ0Vfc3RhdGU9MixmO31hLl9fQ0Vfc3RhdGU9MTthLl9fQ0VfZGVmaW5pdGlvbj1lO2lmKGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihlPWUub2JzZXJ2ZWRBdHRyaWJ1dGVzLGM9MDtjPGUubGVuZ3RoO2MrKyl7dmFyIGQ9ZVtjXSxoPWEuZ2V0QXR0cmlidXRlKGQpO251bGwhPT1oJiZiLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhLGQsbnVsbCxoLG51bGwpfWwoYSkmJmIuY29ubmVjdGVkQ2FsbGJhY2soYSl9fX1cbnIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGIpe3ZhciBhPWIuX19DRV9kZWZpbml0aW9uO2EuY29ubmVjdGVkQ2FsbGJhY2smJmEuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChiKTtiLmk9ITB9O3IucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGIpe2IuaXx8dGhpcy5jb25uZWN0ZWRDYWxsYmFjayhiKTt2YXIgYT1iLl9fQ0VfZGVmaW5pdGlvbjthLmRpc2Nvbm5lY3RlZENhbGxiYWNrJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwoYik7Yi5pPXZvaWQgMH07ci5wcm90b3R5cGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrPWZ1bmN0aW9uKGIsYSxlLGMsZCl7dmFyIGg9Yi5fX0NFX2RlZmluaXRpb247aC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2smJi0xPGgub2JzZXJ2ZWRBdHRyaWJ1dGVzLmluZGV4T2YoYSkmJmguYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrLmNhbGwoYixhLGUsYyxkKX07ZnVuY3Rpb24gQihiLGEpe3RoaXMuYz1iO3RoaXMuYT1hO3RoaXMuYj12b2lkIDA7QSh0aGlzLmMsdGhpcy5hKTtcImxvYWRpbmdcIj09PXRoaXMuYS5yZWFkeVN0YXRlJiYodGhpcy5iPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuZi5iaW5kKHRoaXMpKSx0aGlzLmIub2JzZXJ2ZSh0aGlzLmEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSkpfWZ1bmN0aW9uIEMoYil7Yi5iJiZiLmIuZGlzY29ubmVjdCgpfUIucHJvdG90eXBlLmY9ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hLnJlYWR5U3RhdGU7XCJpbnRlcmFjdGl2ZVwiIT09YSYmXCJjb21wbGV0ZVwiIT09YXx8Qyh0aGlzKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcih2YXIgZT1iW2FdLmFkZGVkTm9kZXMsYz0wO2M8ZS5sZW5ndGg7YysrKUEodGhpcy5jLGVbY10pfTtmdW5jdGlvbiBjYSgpe3ZhciBiPXRoaXM7dGhpcy5iPXRoaXMuYT12b2lkIDA7dGhpcy5jPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe2IuYj1hO2IuYSYmYShiLmEpfSl9ZnVuY3Rpb24gRChiKXtpZihiLmEpdGhyb3cgRXJyb3IoXCJBbHJlYWR5IHJlc29sdmVkLlwiKTtiLmE9dm9pZCAwO2IuYiYmYi5iKHZvaWQgMCl9O2Z1bmN0aW9uIEUoYil7dGhpcy5mPSExO3RoaXMuYT1iO3RoaXMuaD1uZXcgTWFwO3RoaXMuZz1mdW5jdGlvbihiKXtyZXR1cm4gYigpfTt0aGlzLmI9ITE7dGhpcy5jPVtdO3RoaXMubD1uZXcgQihiLGRvY3VtZW50KX1cbkUucHJvdG90eXBlLm09ZnVuY3Rpb24oYixhKXt2YXIgZT10aGlzO2lmKCEoYSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3JzIG11c3QgYmUgZnVuY3Rpb25zLlwiKTtpZighayhiKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJUaGUgZWxlbWVudCBuYW1lICdcIitiK1wiJyBpcyBub3QgdmFsaWQuXCIpO2lmKHRoaXMuYS5hLmdldChiKSl0aHJvdyBFcnJvcihcIkEgY3VzdG9tIGVsZW1lbnQgd2l0aCBuYW1lICdcIitiK1wiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuXCIpO2lmKHRoaXMuZil0aHJvdyBFcnJvcihcIkEgY3VzdG9tIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBkZWZpbmVkLlwiKTt0aGlzLmY9ITA7dmFyIGMsZCxoLGYsdTt0cnl7dmFyIHA9ZnVuY3Rpb24oYil7dmFyIGE9UFtiXTtpZih2b2lkIDAhPT1hJiYhKGEgaW5zdGFuY2VvZiBGdW5jdGlvbikpdGhyb3cgRXJyb3IoXCJUaGUgJ1wiK2IrXCInIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbi5cIik7XG5yZXR1cm4gYX0sUD1hLnByb3RvdHlwZTtpZighKFAgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3IncyBwcm90b3R5cGUgaXMgbm90IGFuIG9iamVjdC5cIik7Yz1wKFwiY29ubmVjdGVkQ2FsbGJhY2tcIik7ZD1wKFwiZGlzY29ubmVjdGVkQ2FsbGJhY2tcIik7aD1wKFwiYWRvcHRlZENhbGxiYWNrXCIpO2Y9cChcImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja1wiKTt1PWEub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaCh2YSl7cmV0dXJufWZpbmFsbHl7dGhpcy5mPSExfWJhKHRoaXMuYSxiLHtsb2NhbE5hbWU6Yixjb25zdHJ1Y3RvcjphLGNvbm5lY3RlZENhbGxiYWNrOmMsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZCxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ZixvYnNlcnZlZEF0dHJpYnV0ZXM6dSxjb25zdHJ1Y3Rpb25TdGFjazpbXX0pO3RoaXMuYy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj1cbiEwLHRoaXMuZyhmdW5jdGlvbigpe2lmKCExIT09ZS5iKWZvcihlLmI9ITEsQShlLmEsZG9jdW1lbnQpOzA8ZS5jLmxlbmd0aDspe3ZhciBiPWUuYy5zaGlmdCgpOyhiPWUuaC5nZXQoYikpJiZEKGIpfX0pKX07RS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGIpe2lmKGI9dGhpcy5hLmEuZ2V0KGIpKXJldHVybiBiLmNvbnN0cnVjdG9yfTtFLnByb3RvdHlwZS5zPWZ1bmN0aW9uKGIpe2lmKCFrKGIpKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU3ludGF4RXJyb3IoXCInXCIrYitcIicgaXMgbm90IGEgdmFsaWQgY3VzdG9tIGVsZW1lbnQgbmFtZS5cIikpO3ZhciBhPXRoaXMuaC5nZXQoYik7aWYoYSlyZXR1cm4gYS5jO2E9bmV3IGNhO3RoaXMuaC5zZXQoYixhKTt0aGlzLmEuYS5nZXQoYikmJi0xPT09dGhpcy5jLmluZGV4T2YoYikmJkQoYSk7cmV0dXJuIGEuY307RS5wcm90b3R5cGUubz1mdW5jdGlvbihiKXtDKHRoaXMubCk7dmFyIGE9dGhpcy5nO3RoaXMuZz1mdW5jdGlvbihlKXtyZXR1cm4gYihmdW5jdGlvbigpe3JldHVybiBhKGUpfSl9fTtcbndpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnk9RTtFLnByb3RvdHlwZS5kZWZpbmU9RS5wcm90b3R5cGUubTtFLnByb3RvdHlwZS5nZXQ9RS5wcm90b3R5cGUuZ2V0O0UucHJvdG90eXBlLndoZW5EZWZpbmVkPUUucHJvdG90eXBlLnM7RS5wcm90b3R5cGUucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjaz1FLnByb3RvdHlwZS5vO3ZhciBGPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCxkYT13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnROUyxlYT13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGUsZmE9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5wcmVwZW5kLGdhPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuYXBwZW5kLEc9d2luZG93Lk5vZGUucHJvdG90eXBlLmNsb25lTm9kZSxIPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCxJPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsSj13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQsSz13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkLEw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsXCJ0ZXh0Q29udGVudFwiKSxNPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csTj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZSxcblwiaW5uZXJIVE1MXCIpLE89d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZSxRPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUsUj13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFM9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5TLFQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TLFU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLFY9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxoYT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCxpYT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kLGphPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5iZWZvcmUsa2E9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFmdGVyLGxhPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZXBsYWNlV2l0aCxtYT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlLFxubmE9d2luZG93LkhUTUxFbGVtZW50LFc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLFwiaW5uZXJIVE1MXCIpLFg9d2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQ7ZnVuY3Rpb24gb2EoKXt2YXIgYj1ZO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgYT10aGlzLmNvbnN0cnVjdG9yLGM9Yi5mLmdldChhKTtpZighYyl0aHJvdyBFcnJvcihcIlRoZSBjdXN0b20gZWxlbWVudCBiZWluZyBjb25zdHJ1Y3RlZCB3YXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBgY3VzdG9tRWxlbWVudHNgLlwiKTt2YXIgZD1jLmNvbnN0cnVjdGlvblN0YWNrO2lmKCFkLmxlbmd0aClyZXR1cm4gZD1GLmNhbGwoZG9jdW1lbnQsYy5sb2NhbE5hbWUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihkLGEucHJvdG90eXBlKSxkLl9fQ0Vfc3RhdGU9MSxkLl9fQ0VfZGVmaW5pdGlvbj1jLHcoYixkKSxkO3ZhciBjPWQubGVuZ3RoLTEsaD1kW2NdO2lmKGg9PT1nKXRocm93IEVycm9yKFwiVGhlIEhUTUxFbGVtZW50IGNvbnN0cnVjdG9yIHdhcyBlaXRoZXIgY2FsbGVkIHJlZW50cmFudGx5IGZvciB0aGlzIGNvbnN0cnVjdG9yIG9yIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy5cIik7XG5kW2NdPWc7T2JqZWN0LnNldFByb3RvdHlwZU9mKGgsYS5wcm90b3R5cGUpO3coYixoKTtyZXR1cm4gaH1hLnByb3RvdHlwZT1uYS5wcm90b3R5cGU7cmV0dXJuIGF9KCl9O2Z1bmN0aW9uIHBhKGIsYSxlKXthLnByZXBlbmQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWRbYy0wXT1hcmd1bWVudHNbY107Yz1kLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYiBpbnN0YW5jZW9mIE5vZGUmJmwoYil9KTtlLmouYXBwbHkodGhpcyxkKTtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl6KGIsY1tmXSk7aWYobCh0aGlzKSlmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKWY9ZFtjXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmeChiLGYpfTthLmFwcGVuZD1mdW5jdGlvbihhKXtmb3IodmFyIGQ9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpZFtjLTBdPWFyZ3VtZW50c1tjXTtjPWQuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiIGluc3RhbmNlb2YgTm9kZSYmbChiKX0pO2UuYXBwZW5kLmFwcGx5KHRoaXMsZCk7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspeihiLGNbZl0pO2lmKGwodGhpcykpZm9yKGM9MDtjPFxuZC5sZW5ndGg7YysrKWY9ZFtjXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmeChiLGYpfX07ZnVuY3Rpb24gcWEoKXt2YXIgYj1ZO3EoRG9jdW1lbnQucHJvdG90eXBlLFwiY3JlYXRlRWxlbWVudFwiLGZ1bmN0aW9uKGEpe2lmKHRoaXMuX19DRV9oYXNSZWdpc3RyeSl7dmFyIGU9Yi5hLmdldChhKTtpZihlKXJldHVybiBuZXcgZS5jb25zdHJ1Y3Rvcn1hPUYuY2FsbCh0aGlzLGEpO3coYixhKTtyZXR1cm4gYX0pO3EoRG9jdW1lbnQucHJvdG90eXBlLFwiaW1wb3J0Tm9kZVwiLGZ1bmN0aW9uKGEsZSl7YT1lYS5jYWxsKHRoaXMsYSxlKTt0aGlzLl9fQ0VfaGFzUmVnaXN0cnk/QShiLGEpOnYoYixhKTtyZXR1cm4gYX0pO3EoRG9jdW1lbnQucHJvdG90eXBlLFwiY3JlYXRlRWxlbWVudE5TXCIsZnVuY3Rpb24oYSxlKXtpZih0aGlzLl9fQ0VfaGFzUmVnaXN0cnkmJihudWxsPT09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hKSl7dmFyIGM9Yi5hLmdldChlKTtpZihjKXJldHVybiBuZXcgYy5jb25zdHJ1Y3Rvcn1hPWRhLmNhbGwodGhpcyxhLGUpO3coYixhKTtyZXR1cm4gYX0pO1xucGEoYixEb2N1bWVudC5wcm90b3R5cGUse2o6ZmEsYXBwZW5kOmdhfSl9O2Z1bmN0aW9uIHJhKCl7dmFyIGI9WTtmdW5jdGlvbiBhKGEsYyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJ0ZXh0Q29udGVudFwiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ITAsZ2V0OmMuZ2V0LHNldDpmdW5jdGlvbihhKXtpZih0aGlzLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUpYy5zZXQuY2FsbCh0aGlzLGEpO2Vsc2V7dmFyIGQ9dm9pZCAwO2lmKHRoaXMuZmlyc3RDaGlsZCl7dmFyIGU9dGhpcy5jaGlsZE5vZGVzLHU9ZS5sZW5ndGg7aWYoMDx1JiZsKHRoaXMpKWZvcih2YXIgZD1BcnJheSh1KSxwPTA7cDx1O3ArKylkW3BdPWVbcF19Yy5zZXQuY2FsbCh0aGlzLGEpO2lmKGQpZm9yKGE9MDthPGQubGVuZ3RoO2ErKyl6KGIsZFthXSl9fX0pfXEoTm9kZS5wcm90b3R5cGUsXCJpbnNlcnRCZWZvcmVcIixmdW5jdGlvbihhLGMpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTtcbmE9SS5jYWxsKHRoaXMsYSxjKTtpZihsKHRoaXMpKWZvcihjPTA7YzxkLmxlbmd0aDtjKyspeChiLGRbY10pO3JldHVybiBhfWQ9bChhKTtjPUkuY2FsbCh0aGlzLGEsYyk7ZCYmeihiLGEpO2wodGhpcykmJngoYixhKTtyZXR1cm4gY30pO3EoTm9kZS5wcm90b3R5cGUsXCJhcHBlbmRDaGlsZFwiLGZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPUguY2FsbCh0aGlzLGEpO2lmKGwodGhpcykpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspeChiLGNbZF0pO3JldHVybiBhfWM9bChhKTtkPUguY2FsbCh0aGlzLGEpO2MmJnooYixhKTtsKHRoaXMpJiZ4KGIsYSk7cmV0dXJuIGR9KTtxKE5vZGUucHJvdG90eXBlLFwiY2xvbmVOb2RlXCIsZnVuY3Rpb24oYSl7YT1HLmNhbGwodGhpcyxhKTt0aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9BKGIsYSk6dihiLGEpO1xucmV0dXJuIGF9KTtxKE5vZGUucHJvdG90eXBlLFwicmVtb3ZlQ2hpbGRcIixmdW5jdGlvbihhKXt2YXIgYz1sKGEpLGQ9Si5jYWxsKHRoaXMsYSk7YyYmeihiLGEpO3JldHVybiBkfSk7cShOb2RlLnByb3RvdHlwZSxcInJlcGxhY2VDaGlsZFwiLGZ1bmN0aW9uKGEsYyl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpO2E9Sy5jYWxsKHRoaXMsYSxjKTtpZihsKHRoaXMpKWZvcih6KGIsYyksYz0wO2M8ZC5sZW5ndGg7YysrKXgoYixkW2NdKTtyZXR1cm4gYX12YXIgZD1sKGEpLGU9Sy5jYWxsKHRoaXMsYSxjKSxmPWwodGhpcyk7ZiYmeihiLGMpO2QmJnooYixhKTtmJiZ4KGIsYSk7cmV0dXJuIGV9KTtMJiZMLmdldD9hKE5vZGUucHJvdG90eXBlLEwpOnQoYixmdW5jdGlvbihiKXthKGIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPVxuMDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oXCJcIil9LHNldDpmdW5jdGlvbihhKXtmb3IoO3RoaXMuZmlyc3RDaGlsZDspSi5jYWxsKHRoaXMsdGhpcy5maXJzdENoaWxkKTtILmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2EoYil7dmFyIGE9RWxlbWVudC5wcm90b3R5cGU7YS5iZWZvcmU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0wXT1hcmd1bWVudHNbZF07ZD1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGUmJmwoYSl9KTtqYS5hcHBseSh0aGlzLGMpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXooYixkW2VdKTtpZihsKHRoaXMpKWZvcihkPTA7ZDxjLmxlbmd0aDtkKyspZT1jW2RdLGUgaW5zdGFuY2VvZiBFbGVtZW50JiZ4KGIsZSl9O2EuYWZ0ZXI9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0wXT1hcmd1bWVudHNbZF07ZD1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGUmJmwoYSl9KTtrYS5hcHBseSh0aGlzLGMpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXooYixkW2VdKTtpZihsKHRoaXMpKWZvcihkPVxuMDtkPGMubGVuZ3RoO2QrKyllPWNbZF0sZSBpbnN0YW5jZW9mIEVsZW1lbnQmJngoYixlKX07YS5yZXBsYWNlV2l0aD1mdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkLTBdPWFyZ3VtZW50c1tkXTt2YXIgZD1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGUmJmwoYSl9KSxlPWwodGhpcyk7bGEuYXBwbHkodGhpcyxjKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKyl6KGIsZFtmXSk7aWYoZSlmb3IoeihiLHRoaXMpLGQ9MDtkPGMubGVuZ3RoO2QrKyllPWNbZF0sZSBpbnN0YW5jZW9mIEVsZW1lbnQmJngoYixlKX07YS5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgYT1sKHRoaXMpO21hLmNhbGwodGhpcyk7YSYmeihiLHRoaXMpfX07ZnVuY3Rpb24gdGEoKXt2YXIgYj1ZO2Z1bmN0aW9uIGEoYSxjKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcImlubmVySFRNTFwiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ITAsZ2V0OmMuZ2V0LHNldDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLGU9dm9pZCAwO2wodGhpcykmJihlPVtdLG4odGhpcyxmdW5jdGlvbihhKXthIT09ZCYmZS5wdXNoKGEpfSkpO2Muc2V0LmNhbGwodGhpcyxhKTtpZihlKWZvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgaD1lW2ZdOzE9PT1oLl9fQ0Vfc3RhdGUmJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2soaCl9dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/QShiLHRoaXMpOnYoYix0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBlKGEsYyl7cShhLFwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50XCIsZnVuY3Rpb24oYSxkKXt2YXIgZT1sKGQpO2E9Yy5jYWxsKHRoaXMsYSxkKTtlJiZ6KGIsZCk7bChhKSYmeChiLGQpO1xucmV0dXJuIGF9KX1NP3EoRWxlbWVudC5wcm90b3R5cGUsXCJhdHRhY2hTaGFkb3dcIixmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX0NFX3NoYWRvd1Jvb3Q9YT1NLmNhbGwodGhpcyxhKX0pOmNvbnNvbGUud2FybihcIkN1c3RvbSBFbGVtZW50czogYEVsZW1lbnQjYXR0YWNoU2hhZG93YCB3YXMgbm90IHBhdGNoZWQuXCIpO2lmKE4mJk4uZ2V0KWEoRWxlbWVudC5wcm90b3R5cGUsTik7ZWxzZSBpZihXJiZXLmdldClhKEhUTUxFbGVtZW50LnByb3RvdHlwZSxXKTtlbHNle3ZhciBjPUYuY2FsbChkb2N1bWVudCxcImRpdlwiKTt0KGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRy5jYWxsKHRoaXMsITApLmlubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPVwidGVtcGxhdGVcIj09PXRoaXMubG9jYWxOYW1lP3RoaXMuY29udGVudDp0aGlzO2ZvcihjLmlubmVySFRNTD1hOzA8Yi5jaGlsZE5vZGVzLmxlbmd0aDspSi5jYWxsKGIsXG5iLmNoaWxkTm9kZXNbMF0pO2Zvcig7MDxjLmNoaWxkTm9kZXMubGVuZ3RoOylILmNhbGwoYixjLmNoaWxkTm9kZXNbMF0pfX0pfSl9cShFbGVtZW50LnByb3RvdHlwZSxcInNldEF0dHJpYnV0ZVwiLGZ1bmN0aW9uKGEsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gUS5jYWxsKHRoaXMsYSxjKTt2YXIgZD1PLmNhbGwodGhpcyxhKTtRLmNhbGwodGhpcyxhLGMpO2M9Ty5jYWxsKHRoaXMsYSk7Yi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGQsYyxudWxsKX0pO3EoRWxlbWVudC5wcm90b3R5cGUsXCJzZXRBdHRyaWJ1dGVOU1wiLGZ1bmN0aW9uKGEsYyxlKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBULmNhbGwodGhpcyxhLGMsZSk7dmFyIGQ9Uy5jYWxsKHRoaXMsYSxjKTtULmNhbGwodGhpcyxhLGMsZSk7ZT1TLmNhbGwodGhpcyxhLGMpO2IuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYyxkLGUsYSl9KTtxKEVsZW1lbnQucHJvdG90eXBlLFwicmVtb3ZlQXR0cmlidXRlXCIsXG5mdW5jdGlvbihhKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBSLmNhbGwodGhpcyxhKTt2YXIgYz1PLmNhbGwodGhpcyxhKTtSLmNhbGwodGhpcyxhKTtudWxsIT09YyYmYi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsbnVsbCxudWxsKX0pO3EoRWxlbWVudC5wcm90b3R5cGUsXCJyZW1vdmVBdHRyaWJ1dGVOU1wiLGZ1bmN0aW9uKGEsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gVS5jYWxsKHRoaXMsYSxjKTt2YXIgZD1TLmNhbGwodGhpcyxhLGMpO1UuY2FsbCh0aGlzLGEsYyk7dmFyIGU9Uy5jYWxsKHRoaXMsYSxjKTtkIT09ZSYmYi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxjLGQsZSxhKX0pO1g/ZShIVE1MRWxlbWVudC5wcm90b3R5cGUsWCk6Vj9lKEVsZW1lbnQucHJvdG90eXBlLFYpOmNvbnNvbGUud2FybihcIkN1c3RvbSBFbGVtZW50czogYEVsZW1lbnQjaW5zZXJ0QWRqYWNlbnRFbGVtZW50YCB3YXMgbm90IHBhdGNoZWQuXCIpO1xucGEoYixFbGVtZW50LnByb3RvdHlwZSx7ajpoYSxhcHBlbmQ6aWF9KTtzYShiKX07LypcblxuIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cbnZhciBaPXdpbmRvdy5jdXN0b21FbGVtZW50cztpZighWnx8Wi5mb3JjZVBvbHlmaWxsfHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBaLmRlZmluZXx8XCJmdW5jdGlvblwiIT10eXBlb2YgWi5nZXQpe3ZhciBZPW5ldyByO29hKCk7cWEoKTtyYSgpO3RhKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgdWE9bmV3IEUoWSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdyxcImN1c3RvbUVsZW1lbnRzXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnVhfSl9O1xufSkuY2FsbChzZWxmKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tLWVsZW1lbnRzLm1pbi5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuLy8gQHZlcnNpb24gMC43LjIyXG5cbihmdW5jdGlvbihnbG9iYWwpIHtcbiAgaWYgKGdsb2JhbC5Kc011dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHJlZ2lzdHJhdGlvbnNUYWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBzZXRJbW1lZGlhdGU7XG4gIGlmICgvVHJpZGVudHxFZGdlLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgc2V0SW1tZWRpYXRlID0gc2V0VGltZW91dDtcbiAgfSBlbHNlIGlmICh3aW5kb3cuc2V0SW1tZWRpYXRlKSB7XG4gICAgc2V0SW1tZWRpYXRlID0gd2luZG93LnNldEltbWVkaWF0ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2V0SW1tZWRpYXRlUXVldWUgPSBbXTtcbiAgICB2YXIgc2VudGluZWwgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChlLmRhdGEgPT09IHNlbnRpbmVsKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IHNldEltbWVkaWF0ZVF1ZXVlO1xuICAgICAgICBzZXRJbW1lZGlhdGVRdWV1ZSA9IFtdO1xuICAgICAgICBxdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgICAgICBmdW5jKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgIHNldEltbWVkaWF0ZVF1ZXVlLnB1c2goZnVuYyk7XG4gICAgICB3aW5kb3cucG9zdE1lc3NhZ2Uoc2VudGluZWwsIFwiKlwiKTtcbiAgICB9O1xuICB9XG4gIHZhciBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICB2YXIgc2NoZWR1bGVkT2JzZXJ2ZXJzID0gW107XG4gIGZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2sob2JzZXJ2ZXIpIHtcbiAgICBzY2hlZHVsZWRPYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgc2V0SW1tZWRpYXRlKGRpc3BhdGNoQ2FsbGJhY2tzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd3JhcElmTmVlZGVkKG5vZGUpIHtcbiAgICByZXR1cm4gd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsICYmIHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbC53cmFwSWZOZWVkZWQobm9kZSkgfHwgbm9kZTtcbiAgfVxuICBmdW5jdGlvbiBkaXNwYXRjaENhbGxiYWNrcygpIHtcbiAgICBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIHZhciBvYnNlcnZlcnMgPSBzY2hlZHVsZWRPYnNlcnZlcnM7XG4gICAgc2NoZWR1bGVkT2JzZXJ2ZXJzID0gW107XG4gICAgb2JzZXJ2ZXJzLnNvcnQoZnVuY3Rpb24obzEsIG8yKSB7XG4gICAgICByZXR1cm4gbzEudWlkXyAtIG8yLnVpZF87XG4gICAgfSk7XG4gICAgdmFyIGFueU5vbkVtcHR5ID0gZmFsc2U7XG4gICAgb2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBxdWV1ZSA9IG9ic2VydmVyLnRha2VSZWNvcmRzKCk7XG4gICAgICByZW1vdmVUcmFuc2llbnRPYnNlcnZlcnNGb3Iob2JzZXJ2ZXIpO1xuICAgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBvYnNlcnZlci5jYWxsYmFja18ocXVldWUsIG9ic2VydmVyKTtcbiAgICAgICAgYW55Tm9uRW1wdHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChhbnlOb25FbXB0eSkgZGlzcGF0Y2hDYWxsYmFja3MoKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVUcmFuc2llbnRPYnNlcnZlcnNGb3Iob2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci5ub2Rlc18uZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQobm9kZSk7XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbnMpIHJldHVybjtcbiAgICAgIHJlZ2lzdHJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihyZWdpc3RyYXRpb24pIHtcbiAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbi5vYnNlcnZlciA9PT0gb2JzZXJ2ZXIpIHJlZ2lzdHJhdGlvbi5yZW1vdmVUcmFuc2llbnRPYnNlcnZlcnMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCh0YXJnZXQsIGNhbGxiYWNrKSB7XG4gICAgZm9yICh2YXIgbm9kZSA9IHRhcmdldDsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbnMgPSByZWdpc3RyYXRpb25zVGFibGUuZ2V0KG5vZGUpO1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbnMpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJhdGlvbnNbal07XG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSByZWdpc3RyYXRpb24ub3B0aW9ucztcbiAgICAgICAgICBpZiAobm9kZSAhPT0gdGFyZ2V0ICYmICFvcHRpb25zLnN1YnRyZWUpIGNvbnRpbnVlO1xuICAgICAgICAgIHZhciByZWNvcmQgPSBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgICBpZiAocmVjb3JkKSByZWdpc3RyYXRpb24uZW5xdWV1ZShyZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciB1aWRDb3VudGVyID0gMDtcbiAgZnVuY3Rpb24gSnNNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja18gPSBjYWxsYmFjaztcbiAgICB0aGlzLm5vZGVzXyA9IFtdO1xuICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICB0aGlzLnVpZF8gPSArK3VpZENvdW50ZXI7XG4gIH1cbiAgSnNNdXRhdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHtcbiAgICBvYnNlcnZlOiBmdW5jdGlvbih0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIHRhcmdldCA9IHdyYXBJZk5lZWRlZCh0YXJnZXQpO1xuICAgICAgaWYgKCFvcHRpb25zLmNoaWxkTGlzdCAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzICYmICFvcHRpb25zLmNoYXJhY3RlckRhdGEgfHwgb3B0aW9ucy5hdHRyaWJ1dGVPbGRWYWx1ZSAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmxlbmd0aCAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IG9wdGlvbnMuY2hhcmFjdGVyRGF0YU9sZFZhbHVlICYmICFvcHRpb25zLmNoYXJhY3RlckRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQodGFyZ2V0KTtcbiAgICAgIGlmICghcmVnaXN0cmF0aW9ucykgcmVnaXN0cmF0aW9uc1RhYmxlLnNldCh0YXJnZXQsIHJlZ2lzdHJhdGlvbnMgPSBbXSk7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9uO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWdpc3RyYXRpb25zW2ldLm9ic2VydmVyID09PSB0aGlzKSB7XG4gICAgICAgICAgcmVnaXN0cmF0aW9uID0gcmVnaXN0cmF0aW9uc1tpXTtcbiAgICAgICAgICByZWdpc3RyYXRpb24ucmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgcmVnaXN0cmF0aW9uLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbikge1xuICAgICAgICByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKHRoaXMsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgIHJlZ2lzdHJhdGlvbnMucHVzaChyZWdpc3RyYXRpb24pO1xuICAgICAgICB0aGlzLm5vZGVzXy5wdXNoKHRhcmdldCk7XG4gICAgICB9XG4gICAgICByZWdpc3RyYXRpb24uYWRkTGlzdGVuZXJzKCk7XG4gICAgfSxcbiAgICBkaXNjb25uZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQobm9kZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVnaXN0cmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciByZWdpc3RyYXRpb24gPSByZWdpc3RyYXRpb25zW2ldO1xuICAgICAgICAgIGlmIChyZWdpc3RyYXRpb24ub2JzZXJ2ZXIgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICB9LFxuICAgIHRha2VSZWNvcmRzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjb3B5T2ZSZWNvcmRzID0gdGhpcy5yZWNvcmRzXztcbiAgICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICAgIHJldHVybiBjb3B5T2ZSZWNvcmRzO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gTXV0YXRpb25SZWNvcmQodHlwZSwgdGFyZ2V0KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmFkZGVkTm9kZXMgPSBbXTtcbiAgICB0aGlzLnJlbW92ZWROb2RlcyA9IFtdO1xuICAgIHRoaXMucHJldmlvdXNTaWJsaW5nID0gbnVsbDtcbiAgICB0aGlzLm5leHRTaWJsaW5nID0gbnVsbDtcbiAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gbnVsbDtcbiAgICB0aGlzLm9sZFZhbHVlID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBjb3B5TXV0YXRpb25SZWNvcmQob3JpZ2luYWwpIHtcbiAgICB2YXIgcmVjb3JkID0gbmV3IE11dGF0aW9uUmVjb3JkKG9yaWdpbmFsLnR5cGUsIG9yaWdpbmFsLnRhcmdldCk7XG4gICAgcmVjb3JkLmFkZGVkTm9kZXMgPSBvcmlnaW5hbC5hZGRlZE5vZGVzLnNsaWNlKCk7XG4gICAgcmVjb3JkLnJlbW92ZWROb2RlcyA9IG9yaWdpbmFsLnJlbW92ZWROb2Rlcy5zbGljZSgpO1xuICAgIHJlY29yZC5wcmV2aW91c1NpYmxpbmcgPSBvcmlnaW5hbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgcmVjb3JkLm5leHRTaWJsaW5nID0gb3JpZ2luYWwubmV4dFNpYmxpbmc7XG4gICAgcmVjb3JkLmF0dHJpYnV0ZU5hbWUgPSBvcmlnaW5hbC5hdHRyaWJ1dGVOYW1lO1xuICAgIHJlY29yZC5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBvcmlnaW5hbC5hdHRyaWJ1dGVOYW1lc3BhY2U7XG4gICAgcmVjb3JkLm9sZFZhbHVlID0gb3JpZ2luYWwub2xkVmFsdWU7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuICB2YXIgY3VycmVudFJlY29yZCwgcmVjb3JkV2l0aE9sZFZhbHVlO1xuICBmdW5jdGlvbiBnZXRSZWNvcmQodHlwZSwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGN1cnJlbnRSZWNvcmQgPSBuZXcgTXV0YXRpb25SZWNvcmQodHlwZSwgdGFyZ2V0KTtcbiAgfVxuICBmdW5jdGlvbiBnZXRSZWNvcmRXaXRoT2xkVmFsdWUob2xkVmFsdWUpIHtcbiAgICBpZiAocmVjb3JkV2l0aE9sZFZhbHVlKSByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICAgIHJlY29yZFdpdGhPbGRWYWx1ZSA9IGNvcHlNdXRhdGlvblJlY29yZChjdXJyZW50UmVjb3JkKTtcbiAgICByZWNvcmRXaXRoT2xkVmFsdWUub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgICByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFyUmVjb3JkcygpIHtcbiAgICBjdXJyZW50UmVjb3JkID0gcmVjb3JkV2l0aE9sZFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIGZ1bmN0aW9uIHJlY29yZFJlcHJlc2VudHNDdXJyZW50TXV0YXRpb24ocmVjb3JkKSB7XG4gICAgcmV0dXJuIHJlY29yZCA9PT0gcmVjb3JkV2l0aE9sZFZhbHVlIHx8IHJlY29yZCA9PT0gY3VycmVudFJlY29yZDtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RSZWNvcmQobGFzdFJlY29yZCwgbmV3UmVjb3JkKSB7XG4gICAgaWYgKGxhc3RSZWNvcmQgPT09IG5ld1JlY29yZCkgcmV0dXJuIGxhc3RSZWNvcmQ7XG4gICAgaWYgKHJlY29yZFdpdGhPbGRWYWx1ZSAmJiByZWNvcmRSZXByZXNlbnRzQ3VycmVudE11dGF0aW9uKGxhc3RSZWNvcmQpKSByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIFJlZ2lzdHJhdGlvbihvYnNlcnZlciwgdGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gW107XG4gIH1cbiAgUmVnaXN0cmF0aW9uLnByb3RvdHlwZSA9IHtcbiAgICBlbnF1ZXVlOiBmdW5jdGlvbihyZWNvcmQpIHtcbiAgICAgIHZhciByZWNvcmRzID0gdGhpcy5vYnNlcnZlci5yZWNvcmRzXztcbiAgICAgIHZhciBsZW5ndGggPSByZWNvcmRzLmxlbmd0aDtcbiAgICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGxhc3RSZWNvcmQgPSByZWNvcmRzW2xlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgcmVjb3JkVG9SZXBsYWNlTGFzdCA9IHNlbGVjdFJlY29yZChsYXN0UmVjb3JkLCByZWNvcmQpO1xuICAgICAgICBpZiAocmVjb3JkVG9SZXBsYWNlTGFzdCkge1xuICAgICAgICAgIHJlY29yZHNbbGVuZ3RoIC0gMV0gPSByZWNvcmRUb1JlcGxhY2VMYXN0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVDYWxsYmFjayh0aGlzLm9ic2VydmVyKTtcbiAgICAgIH1cbiAgICAgIHJlY29yZHNbbGVuZ3RoXSA9IHJlY29yZDtcbiAgICB9LFxuICAgIGFkZExpc3RlbmVyczogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmFkZExpc3RlbmVyc18odGhpcy50YXJnZXQpO1xuICAgIH0sXG4gICAgYWRkTGlzdGVuZXJzXzogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGVzKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01BdHRyTW9kaWZpZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICBpZiAob3B0aW9ucy5jaGFyYWN0ZXJEYXRhKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICBpZiAob3B0aW9ucy5jaGlsZExpc3QpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVJbnNlcnRlZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoaWxkTGlzdCB8fCBvcHRpb25zLnN1YnRyZWUpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVSZW1vdmVkXCIsIHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgcmVtb3ZlTGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzXyh0aGlzLnRhcmdldCk7XG4gICAgfSxcbiAgICByZW1vdmVMaXN0ZW5lcnNfOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZXMpIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUF0dHJNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoYXJhY3RlckRhdGEpIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoaWxkTGlzdCkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZUluc2VydGVkXCIsIHRoaXMsIHRydWUpO1xuICAgICAgaWYgKG9wdGlvbnMuY2hpbGRMaXN0IHx8IG9wdGlvbnMuc3VidHJlZSkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZVJlbW92ZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGRUcmFuc2llbnRPYnNlcnZlcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKG5vZGUgPT09IHRoaXMudGFyZ2V0KSByZXR1cm47XG4gICAgICB0aGlzLmFkZExpc3RlbmVyc18obm9kZSk7XG4gICAgICB0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXMucHVzaChub2RlKTtcbiAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgIGlmICghcmVnaXN0cmF0aW9ucykgcmVnaXN0cmF0aW9uc1RhYmxlLnNldChub2RlLCByZWdpc3RyYXRpb25zID0gW10pO1xuICAgICAgcmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMpO1xuICAgIH0sXG4gICAgcmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzO1xuICAgICAgdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gW107XG4gICAgICB0cmFuc2llbnRPYnNlcnZlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyc18obm9kZSk7XG4gICAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbnNbaV0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICB9LFxuICAgIGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgICBjYXNlIFwiRE9NQXR0ck1vZGlmaWVkXCI6XG4gICAgICAgIHZhciBuYW1lID0gZS5hdHRyTmFtZTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGUucmVsYXRlZE5vZGUubmFtZXNwYWNlVVJJO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIHZhciByZWNvcmQgPSBuZXcgZ2V0UmVjb3JkKFwiYXR0cmlidXRlc1wiLCB0YXJnZXQpO1xuICAgICAgICByZWNvcmQuYXR0cmlidXRlTmFtZSA9IG5hbWU7XG4gICAgICAgIHJlY29yZC5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGUuYXR0ckNoYW5nZSA9PT0gTXV0YXRpb25FdmVudC5BRERJVElPTiA/IG51bGwgOiBlLnByZXZWYWx1ZTtcbiAgICAgICAgZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKHRhcmdldCwgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5hdHRyaWJ1dGVzKSByZXR1cm47XG4gICAgICAgICAgaWYgKG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmxlbmd0aCAmJiBvcHRpb25zLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG5hbWUpID09PSAtMSAmJiBvcHRpb25zLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG5hbWVzcGFjZSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZU9sZFZhbHVlKSByZXR1cm4gZ2V0UmVjb3JkV2l0aE9sZFZhbHVlKG9sZFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgICBjYXNlIFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCI6XG4gICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIHJlY29yZCA9IGdldFJlY29yZChcImNoYXJhY3RlckRhdGFcIiwgdGFyZ2V0KTtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gZS5wcmV2VmFsdWU7XG4gICAgICAgIGZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCh0YXJnZXQsIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuY2hhcmFjdGVyRGF0YSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChvcHRpb25zLmNoYXJhY3RlckRhdGFPbGRWYWx1ZSkgcmV0dXJuIGdldFJlY29yZFdpdGhPbGRWYWx1ZShvbGRWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAgY2FzZSBcIkRPTU5vZGVSZW1vdmVkXCI6XG4gICAgICAgIHRoaXMuYWRkVHJhbnNpZW50T2JzZXJ2ZXIoZS50YXJnZXQpO1xuXG4gICAgICAgY2FzZSBcIkRPTU5vZGVJbnNlcnRlZFwiOlxuICAgICAgICB2YXIgY2hhbmdlZE5vZGUgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIGFkZGVkTm9kZXMsIHJlbW92ZWROb2RlcztcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gXCJET01Ob2RlSW5zZXJ0ZWRcIikge1xuICAgICAgICAgIGFkZGVkTm9kZXMgPSBbIGNoYW5nZWROb2RlIF07XG4gICAgICAgICAgcmVtb3ZlZE5vZGVzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZWROb2RlcyA9IFtdO1xuICAgICAgICAgIHJlbW92ZWROb2RlcyA9IFsgY2hhbmdlZE5vZGUgXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gY2hhbmdlZE5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSBjaGFuZ2VkTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgdmFyIHJlY29yZCA9IGdldFJlY29yZChcImNoaWxkTGlzdFwiLCBlLnRhcmdldC5wYXJlbnROb2RlKTtcbiAgICAgICAgcmVjb3JkLmFkZGVkTm9kZXMgPSBhZGRlZE5vZGVzO1xuICAgICAgICByZWNvcmQucmVtb3ZlZE5vZGVzID0gcmVtb3ZlZE5vZGVzO1xuICAgICAgICByZWNvcmQucHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nO1xuICAgICAgICByZWNvcmQubmV4dFNpYmxpbmcgPSBuZXh0U2libGluZztcbiAgICAgICAgZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKGUucmVsYXRlZE5vZGUsIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuY2hpbGRMaXN0KSByZXR1cm47XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjbGVhclJlY29yZHMoKTtcbiAgICB9XG4gIH07XG4gIGdsb2JhbC5Kc011dGF0aW9uT2JzZXJ2ZXIgPSBKc011dGF0aW9uT2JzZXJ2ZXI7XG4gIGlmICghZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciA9IEpzTXV0YXRpb25PYnNlcnZlcjtcbiAgICBKc011dGF0aW9uT2JzZXJ2ZXIuX2lzUG9seWZpbGxlZCA9IHRydWU7XG4gIH1cbn0pKHNlbGYpO1xuIiwiLypcbkNvcHlyaWdodCAoYykgMjAxMiBCYXJuZXNhbmRub2JsZS5jb20sIGxsYywgRG9uYXZvbiBXZXN0LCBhbmQgRG9tZW5pYyBEZW5pY29sYVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG5OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG5MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG5PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbldJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgc2V0SW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmdzKSB7XG4gICAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSBwYXJ0aWFsbHlBcHBsaWVkLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhY2NlcHRzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBzZXRJbW1lZGlhdGUsIGJ1dFxuICAgIC8vIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJlcXVpcmVzIG5vIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBwYXJ0aWFsbHlBcHBsaWVkKGhhbmRsZXIpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAobmV3IEZ1bmN0aW9uKFwiXCIgKyBoYW5kbGVyKSkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHBhcnRpYWxseUFwcGxpZWQocnVuSWZQcmVzZW50LCBoYW5kbGUpLCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhwYXJ0aWFsbHlBcHBsaWVkKHJ1bklmUHJlc2VudCwgaGFuZGxlKSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocGFydGlhbGx5QXBwbGllZChydW5JZlByZXNlbnQsIGhhbmRsZSksIDApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHNlbGYpKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgdmFyIERFRkFVTFRfVklFV1BPUlQgPSAnd2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSxtYXhpbXVtLXNjYWxlPTEsbWluaW11bS1zY2FsZT0xLHVzZXItc2NhbGFibGU9bm8nO1xuXG4gIHZhciBWaWV3cG9ydCA9IHtcbiAgICBlbnN1cmVWaWV3cG9ydEVsZW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT12aWV3cG9ydF0nKTtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWV0YScpO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQubmFtZSA9ICd2aWV3cG9ydCc7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodmlld3BvcnRFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0RWxlbWVudDtcbiAgICB9LFxuXG4gICAgc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZpZXdwb3J0RWxlbWVudCA9IFZpZXdwb3J0LmVuc3VyZVZpZXdwb3J0RWxlbWVudCgpO1xuXG4gICAgICBpZiAoIXZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudCcpKSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCBERUZBVUxUX1ZJRVdQT1JUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2luZG93LlZpZXdwb3J0ID0gVmlld3BvcnQ7XG59KSgpO1xuIiwiLyoqXG4gKiBNaWNyb0V2ZW50IC0gdG8gbWFrZSBhbnkganMgb2JqZWN0IGFuIGV2ZW50IGVtaXR0ZXIgKHNlcnZlciBvciBicm93c2VyKVxuICpcbiAqIC0gcHVyZSBqYXZhc2NyaXB0IC0gc2VydmVyIGNvbXBhdGlibGUsIGJyb3dzZXIgY29tcGF0aWJsZVxuICogLSBkb250IHJlbHkgb24gdGhlIGJyb3dzZXIgZG9tc1xuICogLSBzdXBlciBzaW1wbGUgLSB5b3UgZ2V0IGl0IGltbWVkaWF0ZWx5LCBubyBteXN0ZXJ5LCBubyBtYWdpYyBpbnZvbHZlZFxuICpcbiAqIC0gY3JlYXRlIGEgTWljcm9FdmVudERlYnVnIHdpdGggZ29vZGllcyB0byBkZWJ1Z1xuICogICAtIG1ha2UgaXQgc2FmZXIgdG8gdXNlXG4qL1xuXG4vKiogTk9URTogVGhpcyBsaWJyYXJ5IGlzIGN1c3RvbWl6ZWQgZm9yIE9uc2VuIFVJLiAqL1xuXG5jb25zdCBNaWNyb0V2ZW50ICA9IGZ1bmN0aW9uKCl7fTtcbk1pY3JvRXZlbnQucHJvdG90eXBlICA9IHtcbiAgb246IGZ1bmN0aW9uKGV2ZW50LCBmY3Qpe1xuICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdID0gdGhpcy5fZXZlbnRzW2V2ZW50XSB8fCBbXTtcbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdLnB1c2goZmN0KTtcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24oZXZlbnQsIGZjdCl7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB3cmFwcGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9mZihldmVudCwgd3JhcHBlcik7XG4gICAgICByZXR1cm4gZmN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyKTtcbiAgfSxcbiAgb2ZmOiBmdW5jdGlvbihldmVudCwgZmN0KXtcbiAgICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gICAgaWYgKGV2ZW50IGluIHRoaXMuX2V2ZW50cyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdID0gdGhpcy5fZXZlbnRzW2V2ZW50XVxuICAgICAgLmZpbHRlcihmdW5jdGlvbihfZmN0KSB7XG4gICAgICAgIGlmIChmY3QpIHtcbiAgICAgICAgICAgcmV0dXJuIGZjdCAhPT0gX2ZjdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9LFxuICBlbWl0OiBmdW5jdGlvbihldmVudCAvKiAsIGFyZ3MuLi4gKi8pe1xuICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICBpZiAoZXZlbnQgaW4gdGhpcy5fZXZlbnRzID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V2ZW50c1tldmVudF0ubGVuZ3RoOyBpKyspe1xuICAgICAgdGhpcy5fZXZlbnRzW2V2ZW50XVtpXS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogbWl4aW4gd2lsbCBkZWxlZ2F0ZSBhbGwgTWljcm9FdmVudC5qcyBmdW5jdGlvbiBpbiB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG4gKlxuICogLSByZXF1aXJlKCdNaWNyb0V2ZW50JykubWl4aW4oRm9vYmFyKSB3aWxsIG1ha2UgRm9vYmFyIGFibGUgdG8gdXNlIE1pY3JvRXZlbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGhlIG9iamVjdCB3aGljaCB3aWxsIHN1cHBvcnQgTWljcm9FdmVudFxuKi9cbk1pY3JvRXZlbnQubWl4aW4gID0gZnVuY3Rpb24oZGVzdE9iamVjdCl7XG4gIHZhciBwcm9wcyA9IFsnb24nLCAnb25jZScsICdvZmYnLCAnZW1pdCddO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArKyl7XG4gICAgaWYgKHR5cGVvZiBkZXN0T2JqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkZXN0T2JqZWN0LnByb3RvdHlwZVtwcm9wc1tpXV0gID0gTWljcm9FdmVudC5wcm90b3R5cGVbcHJvcHNbaV1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0T2JqZWN0W3Byb3BzW2ldXSA9IE1pY3JvRXZlbnQucHJvdG90eXBlW3Byb3BzW2ldXTtcbiAgICB9XG4gIH1cbn07XG5cbndpbmRvdy5NaWNyb0V2ZW50ID0gTWljcm9FdmVudDtcbmV4cG9ydCBkZWZhdWx0IE1pY3JvRXZlbnQ7XG4iLCJleHBvcnQgZGVmYXVsdCB7IH07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5cbi8qKlxuICogQWRkIHZlbmRvciBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuY29uc3QgcHJlZml4ID0gKGZ1bmN0aW9uKCkge1xuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICcnKTtcbiAgY29uc3QgcHJlZml4ID0gKEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgIC5jYWxsKHN0eWxlcylcbiAgICAuam9pbignJylcbiAgICAubWF0Y2goLy0obW96fHdlYmtpdHxtcyktLykgfHwgKHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVxuICApWzFdO1xuXG4gIHJldHVybiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuICctJyArIHByZWZpeCArICctJyArIHV0aWwuaHlwaGVuYXRlKG5hbWUpO1xuICB9O1xufSkoKTtcblxuXG4vKipcbiAqIE1pbmltYWwgdXRpbGl0eSBsaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgZWxlbWVudCdzIHN0eWxlLlxuICogU2V0IGVsZW1lbnQncyBzdHlsZS5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZXNcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbmNvbnN0IHN0eWxlciA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7XG4gIE9iamVjdC5rZXlzKHN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChrZXkgaW4gZWxlbWVudC5zdHlsZSkge1xuICAgICAgZWxlbWVudC5zdHlsZVtrZXldID0gc3R5bGVba2V5XTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeChrZXkpIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGVbcHJlZml4KGtleSldID0gc3R5bGVba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC53YXJuKCdObyBzdWNoIHN0eWxlIHByb3BlcnR5OiAnICsga2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVzIFNwYWNlLXNlcGFyYXRlZCBDU1MgcHJvcGVydGllcyB0byByZW1vdmVcbiAqL1xuc3R5bGVyLmNsZWFyID0gZnVuY3Rpb24oZWxlbWVudCwgc3R5bGVzID0gJycpIHtcbiAgY29uc3QgY2xlYXJsaXN0ID0gc3R5bGVzLnNwbGl0KC9cXHMrLykucmVkdWNlKChyLCBzKSA9PiByLmNvbmNhdChbdXRpbC5oeXBoZW5hdGUocyksIHByZWZpeChzKV0pLCBbXSksXG4gICAga2V5cyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSBlbGVtZW50LnN0eWxlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3Qga2V5ID0gZWxlbWVudC5zdHlsZVtpXTtcbiAgICBpZiAoY2xlYXJsaXN0Lmxlbmd0aCA9PT0gMCB8fCBjbGVhcmxpc3Quc29tZShzID0+IGtleS5pbmRleE9mKHMpID09PSAwKSkge1xuICAgICAga2V5cy5wdXNoKGtleSk7IC8vIFN0b3JlIHRoZSBrZXkgdG8gZml4IFNhZmFyaSBzdHlsZSBpbmRleGVzXG4gICAgfVxuICB9XG5cbiAga2V5cy5mb3JFYWNoKGtleSA9PiBlbGVtZW50LnN0eWxlW2tleV0gPSAnJyk7XG4gIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpID09PSAnJyAmJiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHN0eWxlcjtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNQbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3JtLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5cbmxldCBhdXRvU3R5bGVFbmFibGVkID0gdHJ1ZTtcblxuLy8gTW9kaWZpZXJzXG5jb25zdCBtb2RpZmllcnNNYXAgPSB7XG4gICdxdWlldCc6ICdtYXRlcmlhbC0tZmxhdCcsXG4gICdsaWdodCc6ICdtYXRlcmlhbC0tZmxhdCcsXG4gICdvdXRsaW5lJzogJ21hdGVyaWFsLS1mbGF0JyxcbiAgJ2N0YSc6ICcnLFxuICAnbGFyZ2UtLXF1aWV0JzogJ21hdGVyaWFsLS1mbGF0IGxhcmdlJyxcbiAgJ2xhcmdlLS1jdGEnOiAnbGFyZ2UnLFxuICAnbm9ib3JkZXInOiAnJyxcbiAgJ3RhcHBhYmxlJzogJydcbn07XG5cbmNvbnN0IHBsYXRmb3JtcyA9IHt9O1xuXG5wbGF0Zm9ybXMuYW5kcm9pZCA9IGVsZW1lbnQgPT4ge1xuXG4gIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCF1dGlsLmhhc01vZGlmaWVyKGVsZW1lbnQsICdtYXRlcmlhbCcpKSB7XG4gICAgY29uc3Qgb2xkTW9kaWZpZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSB8fCAnJztcblxuICAgIGNvbnN0IG5ld01vZGlmaWVyID0gb2xkTW9kaWZpZXIudHJpbSgpLnNwbGl0KC9cXHMrLykubWFwKGUgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGlmaWVyc01hcCwgZSkgPyBtb2RpZmllcnNNYXBbZV0gOiBlKTtcbiAgICBuZXdNb2RpZmllci51bnNoaWZ0KCdtYXRlcmlhbCcpO1xuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgbmV3TW9kaWZpZXIuam9pbignICcpLnRyaW0oKSk7XG4gIH1cblxuICBjb25zdCBlbGVtZW50cyA9IFtcbiAgICAnb25zLWFsZXJ0LWRpYWxvZy1idXR0b24nLFxuICAgICdvbnMtdG9vbGJhci1idXR0b24nLFxuICAgICdvbnMtYmFjay1idXR0b24nLFxuICAgICdvbnMtYnV0dG9uJyxcbiAgICAnb25zLWxpc3QtaXRlbScsXG4gICAgJ29ucy1mYWInLFxuICAgICdvbnMtc3BlZWQtZGlhbCcsXG4gICAgJ29ucy1zcGVlZC1kaWFsLWl0ZW0nLFxuICAgICdvbnMtdGFiJ1xuICBdO1xuXG5cbiAgLy8gRWZmZWN0c1xuICBpZiAoZWxlbWVudHMuaW5kZXhPZihlbGVtZW50TmFtZSkgIT09IC0xXG4gICAgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdyaXBwbGUnKVxuICAgICYmICFlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ29ucy1yaXBwbGUnKSkge1xuXG4gICAgaWYgKGVsZW1lbnROYW1lID09PSAnb25zLWxpc3QtaXRlbScpIHtcbiAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGFwcGFibGUnKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgncmlwcGxlJywgJycpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFwcGFibGUnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JpcHBsZScsICcnKTtcbiAgICB9XG4gIH1cbn07XG5cbnBsYXRmb3Jtcy5pb3MgPSBlbGVtZW50ID0+IHtcblxuIC8vIE1vZGlmaWVyc1xuIGlmICh1dGlsLnJlbW92ZU1vZGlmaWVyKGVsZW1lbnQsICdtYXRlcmlhbCcpKSB7XG4gICBpZiAodXRpbC5yZW1vdmVNb2RpZmllcihlbGVtZW50LCAnbWF0ZXJpYWwtLWZsYXQnKSkge1xuICAgICB1dGlsLmFkZE1vZGlmaWVyKGVsZW1lbnQsICh1dGlsLnJlbW92ZU1vZGlmaWVyKGVsZW1lbnQsICdsYXJnZScpKSA/ICdsYXJnZS0tcXVpZXQnIDogJ3F1aWV0Jyk7XG4gICB9XG5cbiAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykpIHtcbiAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ21vZGlmaWVyJyk7XG4gICB9XG4gfVxuXG4gLy8gRWZmZWN0c1xuIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmlwcGxlJykpIHtcbiAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1saXN0LWl0ZW0nKSB7XG4gICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YXBwYWJsZScsICcnKTtcbiAgIH1cblxuICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JpcHBsZScpO1xuIH1cbn07XG5cbmNvbnN0IHVubG9ja2VkID0ge1xuICBhbmRyb2lkOiB0cnVlXG59O1xuXG5jb25zdCBnZXRQbGF0Zm9ybSA9IChlbGVtZW50LCBmb3JjZSkgPT4ge1xuICBpZiAoYXV0b1N0eWxlRW5hYmxlZCAmJiAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGUtYXV0by1zdHlsaW5nJykpIHtcbiAgICBjb25zdCBtb2JpbGVPUyA9IG9uc1BsYXRmb3JtLmdldE1vYmlsZU9TKCk7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwbGF0Zm9ybXMsIG1vYmlsZU9TKSAmJiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVubG9ja2VkLCBtb2JpbGVPUykgfHwgZm9yY2UpKSB7XG4gICAgICByZXR1cm4gbW9iaWxlT1M7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgcHJlcGFyZSA9IChlbGVtZW50LCBmb3JjZSkgPT4ge1xuICBjb25zdCBwID0gZ2V0UGxhdGZvcm0oZWxlbWVudCwgZm9yY2UpO1xuICBwICYmIHBsYXRmb3Jtc1twXShlbGVtZW50KTtcbn07XG5cbmNvbnN0IG1hcE1vZGlmaWVyID0gKG1vZGlmaWVyLCBlbGVtZW50LCBmb3JjZSkgPT4ge1xuICBpZiAoZ2V0UGxhdGZvcm0oZWxlbWVudCwgZm9yY2UpKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLnNwbGl0KC9cXHMrLykubWFwKG0gPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGlmaWVyc01hcCwgbSkgPyBtb2RpZmllcnNNYXBbbV0gOiBtKS5qb2luKCcgJyk7XG4gIH1cbiAgcmV0dXJuIG1vZGlmaWVyO1xufTtcblxuY29uc3QgcmVzdG9yZU1vZGlmaWVyID0gZWxlbWVudCA9PiB7XG4gIGlmIChnZXRQbGF0Zm9ybShlbGVtZW50KSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgY29uc3QgbW9kaWZpZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSB8fCAnJztcbiAgICBsZXQgbmV3TW9kaWZpZXIgPSBtYXBNb2RpZmllcihtb2RpZmllciwgZWxlbWVudCk7XG5cbiAgICBpZiAoIS8oXnxcXHMrKW1hdGVyaWFsKCR8XFxzKykvaS50ZXN0KG1vZGlmaWVyKSkge1xuICAgICAgbmV3TW9kaWZpZXIgPSAnbWF0ZXJpYWwgJyArIG5ld01vZGlmaWVyO1xuICAgIH1cblxuICAgIGlmIChuZXdNb2RpZmllciAhPT0gbW9kaWZpZXIpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdtb2RpZmllcicsIG5ld01vZGlmaWVyLnRyaW0oKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0VuYWJsZWQ6ICgpID0+IGF1dG9TdHlsZUVuYWJsZWQsXG4gIGVuYWJsZTogKCkgPT4gYXV0b1N0eWxlRW5hYmxlZCA9IHRydWUsXG4gIGRpc2FibGU6ICgpID0+IGF1dG9TdHlsZUVuYWJsZWQgPSBmYWxzZSxcbiAgcHJlcGFyZSxcbiAgbWFwTW9kaWZpZXIsXG4gIGdldFBsYXRmb3JtLFxuICByZXN0b3JlTW9kaWZpZXJcbn07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vYXV0b3N0eWxlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kaWZpZXJVdGlsIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsYXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjdXJyZW50XG4gICAqL1xuICBzdGF0aWMgZGlmZihsYXN0LCBjdXJyZW50KSB7XG4gICAgbGFzdCA9IG1ha2VEaWN0KCgnJyArIGxhc3QpLnRyaW0oKSk7XG4gICAgY3VycmVudCA9IG1ha2VEaWN0KCgnJyArIGN1cnJlbnQpLnRyaW0oKSk7XG5cbiAgICBjb25zdCByZW1vdmVkID0gT2JqZWN0LmtleXMobGFzdCkucmVkdWNlKChyZXN1bHQsIHRva2VuKSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnRbdG9rZW5dKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgYWRkZWQgPSBPYmplY3Qua2V5cyhjdXJyZW50KS5yZWR1Y2UoKHJlc3VsdCwgdG9rZW4pID0+IHtcbiAgICAgIGlmICghbGFzdFt0b2tlbl0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4ge2FkZGVkLCByZW1vdmVkfTtcblxuICAgIGZ1bmN0aW9uIG1ha2VEaWN0KG1vZGlmaWVyKSB7XG4gICAgICBjb25zdCBkaWN0ID0ge307XG4gICAgICBNb2RpZmllclV0aWwuc3BsaXQobW9kaWZpZXIpLmZvckVhY2godG9rZW4gPT4gZGljdFt0b2tlbl0gPSB0b2tlbik7XG4gICAgICByZXR1cm4gZGljdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpZmZcbiAgICogQHBhcmFtIHtBcnJheX0gZGlmZi5yZW1vdmVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGRpZmYuYWRkZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IGNsYXNzTGlzdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVcbiAgICovXG4gIHN0YXRpYyBhcHBseURpZmZUb0NsYXNzTGlzdChkaWZmLCBjbGFzc0xpc3QsIHRlbXBsYXRlKSB7XG4gICAgZGlmZi5hZGRlZFxuICAgICAgLm1hcChtb2RpZmllciA9PiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXCovZywgbW9kaWZpZXIpKVxuICAgICAgLmZvckVhY2goa2xhc3MgPT4ga2xhc3Muc3BsaXQoL1xccysvKS5mb3JFYWNoKGsgPT4gY2xhc3NMaXN0LmFkZChrKSkpO1xuXG4gICAgZGlmZi5yZW1vdmVkXG4gICAgICAubWFwKG1vZGlmaWVyID0+IHRlbXBsYXRlLnJlcGxhY2UoL1xcKi9nLCBtb2RpZmllcikpXG4gICAgICAuZm9yRWFjaChrbGFzcyA9PiBrbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goayA9PiBjbGFzc0xpc3QucmVtb3ZlKGspKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpZmZcbiAgICogQHBhcmFtIHtBcnJheX0gZGlmZi5yZW1vdmVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGRpZmYuYWRkZWRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1lXG4gICAqL1xuICBzdGF0aWMgYXBwbHlEaWZmVG9FbGVtZW50KGRpZmYsIGVsZW1lbnQsIHNjaGVtZSkge1xuICAgIE9iamVjdC5rZXlzKHNjaGVtZSkuZm9yRWFjaChzZWxlY3RvciA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50cyA9ICFzZWxlY3RvciB8fCB1dGlsLm1hdGNoKGVsZW1lbnQsIHNlbGVjdG9yKVxuICAgICAgICA/IFtlbGVtZW50XVxuICAgICAgICA6IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChcbiAgICAgICAgICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciksXG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50ID0+ICF1dGlsLmZpbmRQYXJlbnQodGFyZ2V0RWxlbWVudCwgZWxlbWVudC50YWdOYW1lLCBwYXJlbnQgPT4gcGFyZW50ID09PSBlbGVtZW50KVxuICAgICAgICAgICk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvQ2xhc3NMaXN0KGRpZmYsIHRhcmdldEVsZW1lbnRzW2ldLmNsYXNzTGlzdCwgc2NoZW1lW3NlbGVjdG9yXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxhc3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IGN1cnJlbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1lXG4gICAqL1xuICBzdGF0aWMgb25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgZWxlbWVudCwgc2NoZW1lKSB7XG4gICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvRWxlbWVudChNb2RpZmllclV0aWwuZGlmZihsYXN0LCBjdXJyZW50KSwgZWxlbWVudCwgc2NoZW1lKTtcbiAgICBhdXRvU3R5bGUucmVzdG9yZU1vZGlmaWVyKGVsZW1lbnQpO1xuICB9XG5cbiAgc3RhdGljIHJlZnJlc2goZWxlbWVudCwgc2NoZW1lKSB7XG4gICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvRWxlbWVudChNb2RpZmllclV0aWwuZGlmZignJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykgfHwgJycpLCBlbGVtZW50LCBzY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtZVxuICAgKi9cbiAgc3RhdGljIGluaXRNb2RpZmllcihlbGVtZW50LCBzY2hlbWUpIHtcbiAgICBjb25zdCBtb2RpZmllciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpO1xuICAgIGlmICh0eXBlb2YgbW9kaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvRWxlbWVudCh7XG4gICAgICByZW1vdmVkOiBbXSxcbiAgICAgIGFkZGVkOiBNb2RpZmllclV0aWwuc3BsaXQobW9kaWZpZXIpXG4gICAgfSwgZWxlbWVudCwgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBzcGxpdChtb2RpZmllcikge1xuICAgIGlmICh0eXBlb2YgbW9kaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGlmaWVyLnRyaW0oKS5zcGxpdCgvICsvKS5maWx0ZXIodG9rZW4gPT4gdG9rZW4gIT09ICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbW9kaWZpZXIgdG9rZW4gdG8gYW4gZWxlbWVudC5cbiAgICovXG4gIHN0YXRpYyBhZGRNb2RpZmllcihlbGVtZW50LCBtb2RpZmllclRva2VuKSB7XG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbW9kaWZpZXInKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgbW9kaWZpZXJUb2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRva2VucyA9IE1vZGlmaWVyVXRpbC5zcGxpdChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSk7XG4gICAgICBpZiAodG9rZW5zLmluZGV4T2YobW9kaWZpZXJUb2tlbikgPT0gLTEpIHtcbiAgICAgICAgdG9rZW5zLnB1c2gobW9kaWZpZXJUb2tlbik7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdtb2RpZmllcicsIHRva2Vucy5qb2luKCcgJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kaWZpZXIgdG9rZW4gZnJvbSBhbiBlbGVtZW50LlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZU1vZGlmaWVyKGVsZW1lbnQsIG1vZGlmaWVyVG9rZW4pIHtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21vZGlmaWVyJykpIHtcbiAgICAgIGNvbnN0IHRva2VucyA9IE1vZGlmaWVyVXRpbC5zcGxpdChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSk7XG4gICAgICBjb25zdCBpbmRleCA9IHRva2Vucy5pbmRleE9mKG1vZGlmaWVyVG9rZW4pO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0b2tlbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgdG9rZW5zLmpvaW4oJyAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0YXJ0c1dpdGggPSAocywgYykgPT4gcy5zdWJzdHIoMCwgYy5sZW5ndGgpID09PSBjO1xuY29uc3QgZW5kc1dpdGggPSAocywgYykgPT4gcy5zdWJzdHIocy5sZW5ndGggLSBjLmxlbmd0aCwgYy5sZW5ndGgpID09PSBjO1xuY29uc3QgdW53cmFwID0gcyA9PiBzLnNsaWNlKDEsIC0xKTtcbmNvbnN0IGlzT2JqZWN0U3RyaW5nID0gcyA9PiBzdGFydHNXaXRoKHMsICd7JykgJiYgZW5kc1dpdGgocywgJ30nKTtcbmNvbnN0IGlzQXJyYXlTdHJpbmcgPSBzID0+IHN0YXJ0c1dpdGgocywgJ1snKSAmJiBlbmRzV2l0aChzLCAnXScpO1xuY29uc3QgaXNRdW90ZWRTdHJpbmcgPSBzID0+IChzdGFydHNXaXRoKHMsICdcXCcnKSAmJiBlbmRzV2l0aChzLCAnXFwnJykpIHx8IChzdGFydHNXaXRoKHMsICdcIicpICYmIGVuZHNXaXRoKHMsICdcIicpKTtcblxuY29uc3QgZXJyb3IgPSAodG9rZW4sIHN0cmluZywgb3JpZ2luYWxTdHJpbmcpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuIFxcJycgKyB0b2tlbiArICdcXCcgYXQgcG9zaXRpb24gJyArIChvcmlnaW5hbFN0cmluZy5sZW5ndGggLSBzdHJpbmcubGVuZ3RoIC0gMSkgKyAnIGluIHN0cmluZzogXFwnJyArIG9yaWdpbmFsU3RyaW5nICsgJ1xcJycpO1xufTtcblxuY29uc3QgcHJvY2Vzc1Rva2VuID0gKHRva2VuLCBzdHJpbmcsIG9yaWdpbmFsU3RyaW5nKSA9PiB7XG4gIGlmICh0b2tlbiA9PT0gJ3RydWUnIHx8IHRva2VuID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIHRva2VuID09PSAndHJ1ZSc7XG4gIH0gZWxzZSBpZiAoaXNRdW90ZWRTdHJpbmcodG9rZW4pKSB7XG4gICAgcmV0dXJuIHVud3JhcCh0b2tlbik7XG4gIH0gZWxzZSBpZiAoIWlzTmFOKHRva2VuKSkge1xuICAgIHJldHVybiArKHRva2VuKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdFN0cmluZyh0b2tlbikpIHtcbiAgICByZXR1cm4gcGFyc2VPYmplY3QodW53cmFwKHRva2VuKSk7XG4gIH0gZWxzZSBpZiAoaXNBcnJheVN0cmluZyh0b2tlbikpIHtcbiAgICByZXR1cm4gcGFyc2VBcnJheSh1bndyYXAodG9rZW4pKTtcbiAgfSBlbHNlIHtcbiAgICBlcnJvcih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gIH1cbn07XG5cbmNvbnN0IG5leHRUb2tlbiA9IChzdHJpbmcpID0+IHtcbiAgc3RyaW5nID0gc3RyaW5nLnRyaW0oKTtcbiAgbGV0IGxpbWl0ID0gc3RyaW5nLmxlbmd0aDtcblxuICBpZiAoc3RyaW5nWzBdID09PSAnOicgfHwgc3RyaW5nWzBdID09PSAnLCcpIHtcblxuICAgIGxpbWl0ID0gMTtcblxuICB9IGVsc2UgaWYgKHN0cmluZ1swXSA9PT0gJ3snIHx8IHN0cmluZ1swXSA9PT0gJ1snKSB7XG5cbiAgICBjb25zdCBjID0gc3RyaW5nLmNoYXJDb2RlQXQoMCk7XG4gICAgbGV0IG5lc3RlZE9iamVjdCA9IDE7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PT0gYykge1xuICAgICAgICBuZXN0ZWRPYmplY3QrKztcbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT09IGMgKyAyKSB7XG4gICAgICAgIG5lc3RlZE9iamVjdC0tO1xuICAgICAgICBpZiAobmVzdGVkT2JqZWN0ID09PSAwKSB7XG4gICAgICAgICAgbGltaXQgPSBpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICB9IGVsc2UgaWYgKHN0cmluZ1swXSA9PT0gJ1xcJycgfHwgc3RyaW5nWzBdID09PSAnXCInKSB7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHN0cmluZ1tpXSA9PT0gc3RyaW5nWzBdKSB7XG4gICAgICAgIGxpbWl0ID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICB9IGVsc2Uge1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChbJyAnLCAnLCcsICc6J10uaW5kZXhPZihzdHJpbmdbaV0pICE9PSAtMSkge1xuICAgICAgICBsaW1pdCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCBsaW1pdCk7XG59O1xuXG5jb25zdCBwYXJzZU9iamVjdCA9IChzdHJpbmcpID0+IHtcbiAgY29uc3QgaXNWYWxpZEtleSA9IGtleSA9PiAvXltBLVpfJF1bQS1aMC05XyRdKiQvaS50ZXN0KGtleSk7XG5cbiAgc3RyaW5nID0gc3RyaW5nLnRyaW0oKTtcbiAgY29uc3Qgb3JpZ2luYWxTdHJpbmcgPSBzdHJpbmc7XG4gIGNvbnN0IG9iamVjdCA9IHt9O1xuICBsZXQgcmVhZGluZ0tleSA9IHRydWUsIGtleSwgcHJldmlvdXNUb2tlbiwgdG9rZW47XG5cbiAgd2hpbGUgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgcHJldmlvdXNUb2tlbiA9IHRva2VuO1xuICAgIHRva2VuID0gbmV4dFRva2VuKHN0cmluZyk7XG4gICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHRva2VuLmxlbmd0aCwgc3RyaW5nLmxlbmd0aCkudHJpbSgpO1xuXG4gICAgaWYgKCh0b2tlbiA9PT0gJzonICYmICghcmVhZGluZ0tleSB8fCAhcHJldmlvdXNUb2tlbiB8fCBwcmV2aW91c1Rva2VuID09PSAnLCcpKVxuICAgICAgIHx8ICh0b2tlbiA9PT0gJywnICYmIHJlYWRpbmdLZXkpXG4gICAgICAgfHwgKHRva2VuICE9PSAnOicgJiYgdG9rZW4gIT09ICcsJyAmJiAocHJldmlvdXNUb2tlbiAmJiBwcmV2aW91c1Rva2VuICE9PSAnLCcgJiYgcHJldmlvdXNUb2tlbiAhPT0gJzonKSkpIHtcbiAgICAgIGVycm9yKHRva2VuLCBzdHJpbmcsIG9yaWdpbmFsU3RyaW5nKTtcbiAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnOicgJiYgcmVhZGluZ0tleSAmJiBwcmV2aW91c1Rva2VuKSB7XG4gICAgICBwcmV2aW91c1Rva2VuID0gaXNRdW90ZWRTdHJpbmcocHJldmlvdXNUb2tlbikgPyB1bndyYXAocHJldmlvdXNUb2tlbikgOiBwcmV2aW91c1Rva2VuO1xuICAgICAgaWYgKGlzVmFsaWRLZXkocHJldmlvdXNUb2tlbikpIHtcbiAgICAgICAga2V5ID0gcHJldmlvdXNUb2tlbjtcbiAgICAgICAgcmVhZGluZ0tleSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSB0b2tlbiBcXCcnICsgcHJldmlvdXNUb2tlbiArICdcXCcgYXQgcG9zaXRpb24gMCBpbiBzdHJpbmc6IFxcJycgKyBvcmlnaW5hbFN0cmluZyArICdcXCcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnLCcgJiYgIXJlYWRpbmdLZXkgJiYgcHJldmlvdXNUb2tlbikge1xuICAgICAgb2JqZWN0W2tleV0gPSBwcm9jZXNzVG9rZW4ocHJldmlvdXNUb2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gICAgICByZWFkaW5nS2V5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodG9rZW4pIHtcbiAgICBvYmplY3Rba2V5XSA9IHByb2Nlc3NUb2tlbih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufTtcblxuY29uc3QgcGFyc2VBcnJheSA9IChzdHJpbmcpID0+IHtcbiAgc3RyaW5nID0gc3RyaW5nLnRyaW0oKTtcbiAgY29uc3Qgb3JpZ2luYWxTdHJpbmcgPSBzdHJpbmc7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIGxldCBwcmV2aW91c1Rva2VuLCB0b2tlbjtcblxuICB3aGlsZSAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICBwcmV2aW91c1Rva2VuID0gdG9rZW47XG4gICAgdG9rZW4gPSBuZXh0VG9rZW4oc3RyaW5nKTtcbiAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2UodG9rZW4ubGVuZ3RoLCBzdHJpbmcubGVuZ3RoKS50cmltKCk7XG5cbiAgICBpZiAodG9rZW4gPT09ICcsJyAmJiAoIXByZXZpb3VzVG9rZW4gfHwgcHJldmlvdXNUb2tlbiA9PT0gJywnKSkge1xuICAgICAgZXJyb3IodG9rZW4sIHN0cmluZywgb3JpZ2luYWxTdHJpbmcpO1xuICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICcsJykge1xuICAgICAgYXJyYXkucHVzaChwcm9jZXNzVG9rZW4ocHJldmlvdXNUb2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0b2tlbikge1xuICAgIGlmICh0b2tlbiAhPT0gJywnKSB7XG4gICAgICBhcnJheS5wdXNoKHByb2Nlc3NUb2tlbih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuY29uc3QgcGFyc2UgPSAoc3RyaW5nKSA9PiB7XG4gIHN0cmluZyA9IHN0cmluZy50cmltKCk7XG5cbiAgaWYgKGlzT2JqZWN0U3RyaW5nKHN0cmluZykpIHtcbiAgICByZXR1cm4gcGFyc2VPYmplY3QodW53cmFwKHN0cmluZykpO1xuICB9IGVsc2UgaWYgKGlzQXJyYXlTdHJpbmcoc3RyaW5nKSkge1xuICAgIHJldHVybiBwYXJzZUFycmF5KHVud3JhcChzdHJpbmcpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3ZpZGVkIHN0cmluZyBtdXN0IGJlIG9iamVjdCBvciBhcnJheSBsaWtlOiAnICsgc3RyaW5nKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgcGFyc2U7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi9lbGVtZW50cy5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4vc3R5bGVyLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IGFuaW1hdGlvbk9wdGlvbnNQYXJzZSBmcm9tICcuL2FuaW1hdGlvbi1vcHRpb25zLXBhcnNlci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5qcyc7XG5cbmNvbnN0IHV0aWwgPSB7fTtcbmNvbnN0IGVycm9yUHJlZml4ID0gJ1tPbnNlbiBVSV0nO1xuXG51dGlsLmdsb2JhbHMgPSB7XG4gIGZhYk9mZnNldDogMCxcbiAgZXJyb3JQcmVmaXgsXG4gIHN1cHBvcnRzUGFzc2l2ZTogZmFsc2Vcbn07XG5cbnBsYXRmb3JtLl9ydW5PbkFjdHVhbFBsYXRmb3JtKCgpID0+IHtcbiAgdXRpbC5nbG9iYWxzLmFjdHVhbE1vYmlsZU9TID0gcGxhdGZvcm0uZ2V0TW9iaWxlT1MoKTtcbiAgdXRpbC5nbG9iYWxzLmlzV0tXZWJWaWV3ID0gcGxhdGZvcm0uaXNXS1dlYlZpZXcoKTtcbn0pO1xuXG50cnkge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcbiAgICBnZXQoKSB7IHV0aWwuZ2xvYmFscy5zdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICB9KTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIG9wdHMpO1xufSBjYXRjaCAoZSkgeyBudWxsOyB9XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBUYXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIEV2ZW50IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgRXZlbnQgaGFuZGxlclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRdIEV2ZW50IG9wdGlvbnMgKHBhc3NpdmUsIGNhcHR1cmUuLi4pXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0dEXSBJZiBjb21lcyBmcm9tIEdlc3R1cmVEZXRlY3Rvci4gSnVzdCBmb3IgdGVzdGluZy5cbiAqL1xudXRpbC5hZGRFdmVudExpc3RlbmVyID0gKGVsLCBuYW1lLCBoYW5kbGVyLCBvcHQsIGlzR0QpID0+IHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCB1dGlsLmdsb2JhbHMuc3VwcG9ydHNQYXNzaXZlID8gb3B0IDogKG9wdCB8fCB7fSkuY2FwdHVyZSk7XG59O1xudXRpbC5yZW1vdmVFdmVudExpc3RlbmVyID0gKGVsLCBuYW1lLCBoYW5kbGVyLCBvcHQsIGlzR0QpID0+IHtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCB1dGlsLmdsb2JhbHMuc3VwcG9ydHNQYXNzaXZlID8gb3B0IDogKG9wdCB8fCB7fSkuY2FwdHVyZSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nL0Z1bmN0aW9ufSBxdWVyeSBkb3QgY2xhc3MgbmFtZSBvciBub2RlIG5hbWUgb3IgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG51dGlsLnByZXBhcmVRdWVyeSA9IChxdWVyeSkgPT4ge1xuICByZXR1cm4gcXVlcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHF1ZXJ5IDogKGVsZW1lbnQpID0+IHV0aWwubWF0Y2goZWxlbWVudCwgcXVlcnkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVcbiAqIEBwYXJhbSB7U3RyaW5nL0Z1bmN0aW9ufSBzIENTUyBTZWxlY3Rvci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbnV0aWwubWF0Y2ggPSAoZSwgcykgPT4gKGUubWF0Y2hlcyB8fCBlLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlLm1vek1hdGNoZXNTZWxlY3RvciB8fCBlLm1zTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKGUsIHMpO1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmcvRnVuY3Rpb259IHF1ZXJ5IGRvdCBjbGFzcyBuYW1lIG9yIG5vZGUgbmFtZSBvciBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQHJldHVybiB7SFRNTEVsZW1lbnQvbnVsbH1cbiAqL1xudXRpbC5maW5kQ2hpbGQgPSAoZWxlbWVudCwgcXVlcnkpID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB1dGlsLnByZXBhcmVRdWVyeShxdWVyeSk7XG5cbiAgLy8gQ2F1dGlvbjogYGVsZW1lbnQuY2hpbGRyZW5gIGlzIGB1bmRlZmluZWRgIGluIHNvbWUgZW52aXJvbm1lbnRzIGlmIGBlbGVtZW50YCBpcyBgc3ZnYFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7IC8vIHByb2Nlc3Mgb25seSBlbGVtZW50IG5vZGVzXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG1hdGNoKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmcvRnVuY3Rpb259IHF1ZXJ5IGRvdCBjbGFzcyBuYW1lIG9yIG5vZGUgbmFtZSBvciBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQHJldHVybiB7SFRNTEVsZW1lbnQvbnVsbH1cbiAqL1xudXRpbC5maW5kUGFyZW50ID0gKGVsZW1lbnQsIHF1ZXJ5LCB1bnRpbCkgPT4ge1xuICBjb25zdCBtYXRjaCA9IHV0aWwucHJlcGFyZVF1ZXJ5KHF1ZXJ5KTtcblxuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBkb2N1bWVudCB8fCBwYXJlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50IHx8ICh1bnRpbCAmJiB1bnRpbChwYXJlbnQpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChtYXRjaChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnV0aWwuaXNBdHRhY2hlZCA9IGVsZW1lbnQgPT4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbGVtZW50KTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnV0aWwuaGFzQW55Q29tcG9uZW50QXNQYXJlbnQgPSAoZWxlbWVudCkgPT4ge1xuICB3aGlsZSAoZWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvKG9ucy1uYXZpZ2F0b3J8b25zLXRhYmJhcnxvbnMtbW9kYWwpLykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xudXRpbC5nZXRBbGxDaGlsZE5vZGVzID0gKGVsZW1lbnQpID0+IHtcbiAgcmV0dXJuIFtlbGVtZW50XS5jb25jYXQoXG4gICAgLi4uQXJyYXkuZnJvbShlbGVtZW50LmNoaWxkcmVuKS5tYXAoY2hpbGRFbCA9PiB7XG4gICAgICByZXR1cm4gdXRpbC5nZXRBbGxDaGlsZE5vZGVzKGNoaWxkRWwpO1xuICAgIH0pXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xudXRpbC5pc1BhZ2VDb250cm9sID0gZWxlbWVudCA9PiBlbGVtZW50Lm5vZGVOYW1lLm1hdGNoKC9eb25zLShuYXZpZ2F0b3J8c3BsaXR0ZXJ8dGFiYmFyfHBhZ2UpJC9pKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdG8gcHJvcGFnYXRlXG4gKi9cbnV0aWwucHJvcGFnYXRlQWN0aW9uID0gKGVsZW1lbnQsIGFjdGlvbikgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gZWxlbWVudC5jaGlsZE5vZGVzW2ldO1xuICAgIGlmIChjaGlsZFthY3Rpb25dIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIGNoaWxkW2FjdGlvbl0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24oY2hpbGQsIGFjdGlvbik7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgLSBzdHJpbmcgdG8gYmUgY2FtZWxpemVkXG4gKiBAcmV0dXJuIHtTdHJpbmd9IENhbWVsaXplZCBzdHJpbmdcbiAqL1xudXRpbC5jYW1lbGl6ZSA9IHN0cmluZyA9PiBzdHJpbmcudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tKFthLXpdKS9nLCAobSwgbCkgPT4gbC50b1VwcGVyQ2FzZSgpKTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIC0gc3RyaW5nIHRvIGJlIGh5cGhlbmF0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ30gSHlwaGVuYXRlZCBzdHJpbmdcbiAqL1xudXRpbC5oeXBoZW5hdGUgPSBzdHJpbmcgPT4gc3RyaW5nLnJlcGxhY2UoLyhbYS16QS1aXSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIC0gdGFnIGFuZCBjbGFzcyBvbmx5XG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGVcbiAqIEBwYXJhbSB7RWxlbWVudH1cbiAqL1xudXRpbC5jcmVhdGUgPSAoc2VsZWN0b3IgPSAnJywgc3R5bGUgPSB7fSkgPT4ge1xuICBjb25zdCBjbGFzc0xpc3QgPSBzZWxlY3Rvci5zcGxpdCgnLicpO1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjbGFzc0xpc3Quc2hpZnQoKSB8fCAnZGl2Jyk7XG5cbiAgaWYgKGNsYXNzTGlzdC5sZW5ndGgpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTGlzdC5qb2luKCcgJyk7XG4gIH1cblxuICBzdHlsZXIoZWxlbWVudCwgc3R5bGUpO1xuXG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xudXRpbC5jcmVhdGVFbGVtZW50ID0gKGh0bWwpID0+IHtcbiAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gIGlmIChodG1sIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaW1wb3J0Tm9kZShodG1sLCB0cnVlKSk7XG4gIH0gZWxzZSB7XG4gICAgd3JhcHBlci5pbm5lckhUTUwgPSBodG1sLnRyaW0oKTtcbiAgfVxuXG4gIGlmICh3cmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICB1dGlsLnRocm93KCdIVE1MIHRlbXBsYXRlIG11c3QgY29udGFpbiBhIHNpbmdsZSByb290IGVsZW1lbnQnKTtcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnQgPSB3cmFwcGVyLmNoaWxkcmVuWzBdO1xuICB3cmFwcGVyLmNoaWxkcmVuWzBdLnJlbW92ZSgpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge0hUTUxGcmFnbWVudH1cbiAqL1xudXRpbC5jcmVhdGVGcmFnbWVudCA9IChodG1sKSA9PiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgcmV0dXJuIGRvY3VtZW50LmltcG9ydE5vZGUodGVtcGxhdGUuY29udGVudCwgdHJ1ZSk7XG59O1xuXG4vKlxuICogQHBhcmFtIHtPYmplY3R9IGRzdCBEZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gc3JjIFNvdXJjZSBvYmplY3QocykuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZWZlcmVuY2UgdG8gYGRzdGAuXG4gKi9cbnV0aWwuZXh0ZW5kID0gKGRzdCwgLi4uYXJncykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJnc1tpXSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFyZ3NbaV0pO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbal07XG4gICAgICAgIGRzdFtrZXldID0gYXJnc1tpXVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkc3Q7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcnJheUxpa2VcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG51dGlsLmFycmF5RnJvbSA9IChhcnJheUxpa2UpID0+IHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcnJheUxpa2UpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30ganNvblN0cmluZ1xuICogQHBhcmFtIHtPYmplY3R9IFtmYWlsU2FmZV1cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudXRpbC5wYXJzZUpTT05PYmplY3RTYWZlbHkgPSAoanNvblN0cmluZywgZmFpbFNhZmUgPSB7fSkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoJycgKyBqc29uU3RyaW5nKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWlsU2FmZTtcbiAgfVxuICByZXR1cm4gZmFpbFNhZmU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIC0gcGF0aCBzdWNoIGFzICdteUFwcC5jb250cm9sbGVycy5kYXRhLmxvYWREYXRhJ1xuICogQHJldHVybiB7QW55fSAtIHdoYXRldmVyIGlzIGxvY2F0ZWQgYXQgdGhhdCBwYXRoXG4gKi9cbnV0aWwuZmluZEZyb21QYXRoID0gKHBhdGgpID0+IHtcbiAgcGF0aCA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIGVsID0gd2luZG93LCBrZXk7XG4gIHdoaWxlIChrZXkgPSBwYXRoLnNoaWZ0KCkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25kLWFzc2lnblxuICAgIGVsID0gZWxba2V5XTtcbiAgfVxuICByZXR1cm4gZWw7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFBhZ2Ugb3IgcGFnZS1jb250YWluZXIgdGhhdCBpbXBsZW1lbnRzICd0b3BQYWdlJ1xuICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH0gLSBWaXNpYmxlIHBhZ2UgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xudXRpbC5nZXRUb3BQYWdlID0gY29udGFpbmVyID0+IGNvbnRhaW5lciAmJiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1wYWdlJyA/IGNvbnRhaW5lciA6IGNvbnRhaW5lci50b3BQYWdlKSB8fCBudWxsO1xuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIEVsZW1lbnQgd2hlcmUgdGhlIHNlYXJjaCBiZWdpbnNcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9IC0gUGFnZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHZpc2libGUgdG9vbGJhciBvciBudWxsLlxuICovXG51dGlsLmZpbmRUb29sYmFyUGFnZSA9IGNvbnRhaW5lciA9PiB7XG4gIGNvbnN0IHBhZ2UgPSB1dGlsLmdldFRvcFBhZ2UoY29udGFpbmVyKTtcblxuICBpZiAocGFnZSkge1xuICAgIGlmIChwYWdlLl9jYW5BbmltYXRlVG9vbGJhcigpKSB7XG4gICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2UuX2NvbnRlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0UGFnZSA9IHV0aWwuZ2V0VG9wUGFnZShwYWdlLl9jb250ZW50RWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICBpZiAobmV4dFBhZ2UgJiYgIS9vbnMtdGFiYmFyL2kudGVzdChwYWdlLl9jb250ZW50RWxlbWVudC5jaGlsZHJlbltpXS50YWdOYW1lKSkge1xuICAgICAgICByZXR1cm4gdXRpbC5maW5kVG9vbGJhclBhZ2UobmV4dFBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGV0YWlsXVxuICogQHJldHVybiB7Q3VzdG9tRXZlbnR9XG4gKi9cbnV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCA9ICh0YXJnZXQsIGV2ZW50TmFtZSwgZGV0YWlsID0ge30pID0+IHtcblxuICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcbiAgICBidWJibGVzOiB0cnVlLFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgZGV0YWlsOiBkZXRhaWxcbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMoZGV0YWlsKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgZXZlbnRba2V5XSA9IGRldGFpbFtrZXldO1xuICB9KTtcblxuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgcmV0dXJuIGV2ZW50O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGlmaWVyTmFtZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xudXRpbC5oYXNNb2RpZmllciA9ICh0YXJnZXQsIG1vZGlmaWVyTmFtZSkgPT4ge1xuICBpZiAoIXRhcmdldC5oYXNBdHRyaWJ1dGUoJ21vZGlmaWVyJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gUmVnRXhwKGAoXnxcXFxccyspJHttb2RpZmllck5hbWV9KCR8XFxcXHMrKWAsICdpJykudGVzdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllck5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmF1dG9TdHlsZSBNYXBzIHRoZSBtb2RpZmllck5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGVkIG1vZGlmaWVyLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuZm9yY2VBdXRvU3R5bGUgSWdub3JlcyBwbGF0Zm9ybSBsaW1pdGF0aW9uLlxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciBpdCB3YXMgYWRkZWQgb3Igbm90LlxuICovXG51dGlsLmFkZE1vZGlmaWVyID0gKHRhcmdldCwgbW9kaWZpZXJOYW1lLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKG9wdGlvbnMuYXV0b1N0eWxlKSB7XG4gICAgbW9kaWZpZXJOYW1lID0gYXV0b1N0eWxlLm1hcE1vZGlmaWVyKG1vZGlmaWVyTmFtZSwgdGFyZ2V0LCBvcHRpb25zLmZvcmNlQXV0b1N0eWxlKTtcbiAgfVxuXG4gIGlmICh1dGlsLmhhc01vZGlmaWVyKHRhcmdldCwgbW9kaWZpZXJOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgKCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpIHx8ICcnKSArICcgJyArIG1vZGlmaWVyTmFtZSkudHJpbSgpKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJOYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5hdXRvU3R5bGUgTWFwcyB0aGUgbW9kaWZpZXJOYW1lIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlZCBtb2RpZmllci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmZvcmNlQXV0b1N0eWxlIElnbm9yZXMgcGxhdGZvcm0gbGltaXRhdGlvbi5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgaXQgd2FzIGZvdW5kIG9yIG5vdC5cbiAqL1xudXRpbC5yZW1vdmVNb2RpZmllciA9ICh0YXJnZXQsIG1vZGlmaWVyTmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChvcHRpb25zLmF1dG9TdHlsZSkge1xuICAgIG1vZGlmaWVyTmFtZSA9IGF1dG9TdHlsZS5tYXBNb2RpZmllcihtb2RpZmllck5hbWUsIHRhcmdldCwgb3B0aW9ucy5mb3JjZUF1dG9TdHlsZSk7XG4gIH1cblxuICBpZiAoIXRhcmdldC5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykgfHwgIXV0aWwuaGFzTW9kaWZpZXIodGFyZ2V0LCBtb2RpZmllck5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbmV3TW9kaWZpZXJzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihtID0+IG0gJiYgbSAhPT0gbW9kaWZpZXJOYW1lKTtcbiAgbmV3TW9kaWZpZXJzLmxlbmd0aCA/IHRhcmdldC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgbmV3TW9kaWZpZXJzLmpvaW4oJyAnKSkgOiB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdtb2RpZmllcicpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllck5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5mb3JjZSBGb3JjZXMgbW9kaWZpZXIgdG8gYmUgYWRkZWQgb3IgcmVtb3ZlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmF1dG9TdHlsZSBNYXBzIHRoZSBtb2RpZmllck5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGVkIG1vZGlmaWVyLlxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmZvcmNlQXV0b1N0eWxlIElnbm9yZXMgcGxhdGZvcm0gbGltaXRhdGlvbi5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgaXQgd2FzIGZvdW5kIG9yIG5vdC5cbiAqL1xudXRpbC50b2dnbGVNb2RpZmllciA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmdzLmxlbmd0aCA+IDIgPyBhcmdzWzJdIDoge307XG4gIGNvbnN0IGZvcmNlID0gdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMgOiBvcHRpb25zLmZvcmNlO1xuXG4gIGNvbnN0IHRvZ2dsZSA9IHR5cGVvZiBmb3JjZSA9PT0gJ2Jvb2xlYW4nID8gZm9yY2UgOiAhdXRpbC5oYXNNb2RpZmllciguLi5hcmdzKTtcbiAgdG9nZ2xlID8gdXRpbC5hZGRNb2RpZmllciguLi5hcmdzKSA6IHV0aWwucmVtb3ZlTW9kaWZpZXIoLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBkZWZhdWx0Q2xhc3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWVcbiAqL1xudXRpbC5yZXN0b3JlQ2xhc3MgPSAoZWwsIGRlZmF1bHRDbGFzcywgc2NoZW1lKSA9PiB7XG4gIGRlZmF1bHRDbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goYyA9PiBjICE9PSAnJyAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGMpICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICBlbC5oYXNBdHRyaWJ1dGUoJ21vZGlmaWVyJykgJiYgTW9kaWZpZXJVdGlsLnJlZnJlc2goZWwsIHNjaGVtZSk7XG59O1xuXG4vLyBUT0RPOiBGSVhcbnV0aWwudXBkYXRlUGFyZW50UG9zaXRpb24gPSAoZWwpID0+IHtcbiAgaWYgKCFlbC5fcGFyZW50VXBkYXRlZCAmJiBlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLnBhcmVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgZWwuX3BhcmVudFVwZGF0ZWQgPSB0cnVlO1xuICB9XG59O1xuXG51dGlsLnRvZ2dsZUF0dHJpYnV0ZSA9IChlbGVtZW50LCBuYW1lLCB2YWx1ZSkgPT4ge1xuICBpZiAodmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/ICcnIDogdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9XG59O1xuXG51dGlsLmJpbmRMaXN0ZW5lcnMgPSAoZWxlbWVudCwgbGlzdGVuZXJOYW1lcykgPT4ge1xuICBsaXN0ZW5lck5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG4gICAgY29uc3QgYm91bmROYW1lID0gbmFtZS5yZXBsYWNlKC9eX1thLXpdLywgJ19ib3VuZCcgKyBuYW1lWzFdLnRvVXBwZXJDYXNlKCkpO1xuICAgIGVsZW1lbnRbYm91bmROYW1lXSA9IGVsZW1lbnRbYm91bmROYW1lXSB8fCBlbGVtZW50W25hbWVdLmJpbmQoZWxlbWVudCk7XG4gIH0pO1xufTtcblxudXRpbC5lYWNoID0gKG9iaiwgZikgPT4gT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiBmKGtleSwgb2JqW2tleV0pKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1JpcHBsZVxuICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gKi9cbnV0aWwudXBkYXRlUmlwcGxlID0gKHRhcmdldCwgaGFzUmlwcGxlLCBhdHRycyA9IHt9KSA9PiB7XG4gIGlmIChoYXNSaXBwbGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGhhc1JpcHBsZSA9IHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3JpcHBsZScpO1xuICB9XG5cbiAgY29uc3QgcmlwcGxlRWxlbWVudCA9IHV0aWwuZmluZENoaWxkKHRhcmdldCwgJ29ucy1yaXBwbGUnKTtcblxuICBpZiAoaGFzUmlwcGxlKSB7XG4gICAgaWYgKCFyaXBwbGVFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb25zLXJpcHBsZScpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goa2V5ID0+IGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgYXR0cnNba2V5XSkpO1xuICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZShlbGVtZW50LCB0YXJnZXQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHJpcHBsZUVsZW1lbnQpIHtcbiAgICByaXBwbGVFbGVtZW50LnJlbW92ZSgpO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG51dGlsLmFuaW1hdGlvbk9wdGlvbnNQYXJzZSA9IGFuaW1hdGlvbk9wdGlvbnNQYXJzZTtcblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cbnV0aWwuaXNJbnRlZ2VyID0gKHZhbHVlKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IERlZmVycmVkIHByb21pc2UuXG4gKi9cbnV0aWwuZGVmZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGRlZmVycmVkID0ge307XG4gIGRlZmVycmVkLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGVmZXJyZWQucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgZGVmZXJyZWQucmVqZWN0ID0gcmVqZWN0O1xuICB9KTtcbiAgcmV0dXJuIGRlZmVycmVkO1xufTtcblxuLyoqXG4gKiBTaG93IHdhcm5pbmdzIHdoZW4gdGhleSBhcmUgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0geyp9IGFyZ3VtZW50cyB0byBjb25zb2xlLndhcm5cbiAqL1xudXRpbC53YXJuID0gKC4uLmFyZ3MpID0+IHtcbiAgaWYgKCFpbnRlcm5hbC5jb25maWcud2FybmluZ3NEaXNhYmxlZCkge1xuICAgIGNvbnNvbGUud2FybihlcnJvclByZWZpeCwgLi4uYXJncyk7XG4gIH1cbn07XG5cbnV0aWwudGhyb3cgPSAobWVzc2FnZSkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JQcmVmaXh9ICR7bWVzc2FnZX1gKTtcbn07XG5cbnV0aWwudGhyb3dBYnN0cmFjdCA9ICgpID0+IHV0aWwudGhyb3coJ0Nhbm5vdCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcycpO1xudXRpbC50aHJvd01lbWJlciA9ICgpID0+IHV0aWwudGhyb3coJ0NsYXNzIG1lbWJlciBtdXN0IGJlIGltcGxlbWVudGVkJyk7XG51dGlsLnRocm93UGFnZUxvYWRlciA9ICgpID0+IHV0aWwudGhyb3coJ0ZpcnN0IHBhcmFtZXRlciBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgUGFnZUxvYWRlcicpO1xudXRpbC50aHJvd0FuaW1hdG9yID0gKGVsKSA9PiB1dGlsLnRocm93KGBcIkFuaW1hdG9yXCIgcGFyYW0gbXVzdCBpbmhlcml0ICR7ZWx9QW5pbWF0b3JgKTtcblxuXG5jb25zdCBwcmV2ZW50ID0gZSA9PiBlLmNhbmNlbGFibGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4vKipcbiAqIFByZXZlbnQgc2Nyb2xsaW5nIHdoaWxlIGRyYWdpbmcgaG9yaXpvbnRhbGx5IG9uIGlPUy5cbiAqXG4gKiBAcGFyYW0ge2dkfSBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2VcbiAqL1xudXRpbC5pb3NQcmV2ZW50U2Nyb2xsID0gZ2QgPT4ge1xuICBpZiAodXRpbC5nbG9iYWxzLmFjdHVhbE1vYmlsZU9TID09PSAnaW9zJykge1xuICAgIGNvbnN0IGNsZWFuID0gKGUpID0+IHtcbiAgICAgIGdkLm9mZigndG91Y2htb3ZlJywgcHJldmVudCk7XG4gICAgICBnZC5vZmYoJ2RyYWdlbmQnLCBjbGVhbik7XG4gICAgfTtcblxuICAgIGdkLm9uKCd0b3VjaG1vdmUnLCBwcmV2ZW50KTtcbiAgICBnZC5vbignZHJhZ2VuZCcsIGNsZWFuKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQcmV2ZW50cyBzY3JvbGwgaW4gdW5kZXJseWluZyBwYWdlcyBvbiBpT1MuIFNlZSAjMjIyMCAjMjI3NCAjMTk0OVxuICpcbiAqIEBwYXJhbSB7ZWx9IEhUTUxFbGVtZW50IHRoYXQgcHJldmVudHMgdGhlIGV2ZW50c1xuICogQHBhcmFtIHthZGR9IEJvb2xlYW4gQWRkIG9yIHJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAqL1xudXRpbC5pb3NQYWdlU2Nyb2xsRml4ID0gKGFkZCkgPT4geyAvLyBGdWxsIGZpeCAtIE1heSBjYXVzZSBpc3N1ZXMgd2l0aCBVSVdlYlZpZXcncyBtb21lbnR1bSBzY3JvbGxcbiAgaWYgKHV0aWwuZ2xvYmFscy5hY3R1YWxNb2JpbGVPUyA9PT0gJ2lvcycpIHtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ29ucy1pb3Mtc2Nyb2xsJywgYWRkKTsgLy8gQWxsb3dzIGN1c3RvbSBhbmQgbG9jYWxpemVkIGZpeGVzICgjMjI3NClcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ29ucy1pb3Mtc2Nyb2xsLWZpeCcsIGFkZCk7XG4gIH1cbn07XG5cbi8qKlxuICogRGlzdGFuY2UgYW5kIGRlbHRhVGltZSBmaWx0ZXIgc29tZSB3ZWlyZCBkcmFnc3RhcnQgZXZlbnRzIHRoYXQgYXJlIG5vdCBmaXJlZCBpbW1lZGlhdGVseS5cbiAqXG4gKiBAcGFyYW0ge2V2ZW50fVxuICovXG51dGlsLmlzVmFsaWRHZXN0dXJlID0gZXZlbnQgPT4gZXZlbnQuZ2VzdHVyZSAhPT0gdW5kZWZpbmVkICYmIChldmVudC5nZXN0dXJlLmRpc3RhbmNlIDw9IDE1IHx8IGV2ZW50Lmdlc3R1cmUuZGVsdGFUaW1lIDw9IDEwMCk7XG5cbnV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0ID0gKC4uLmVsZW1lbnROYW1lcykgPT4ge1xuICBlbGVtZW50TmFtZXMuZm9yRWFjaChuYW1lID0+IHtcbiAgICBpZiAoIW9uc0VsZW1lbnRzW25hbWVdKSB7XG4gICAgICB1dGlsLnRocm93KGBPbnMke25hbWV9IGlzIHJlcXVpcmVkIGJ1dCB3YXMgbm90IGltcG9ydGVkIChDdXN0b20gRWxlbWVudHMpYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogRGVmaW5lcyBhIGJvb2xlYW4gcHJvcGVydHkgdGhhdCByZWZsZWN0cyBhbiBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZSBmb3IgYVxuICogZ2l2ZW4gbGlzdCBvZiBhdHRyaWJ1dGVzLlxuICovXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzID0gKG9iamVjdCwgYXR0cmlidXRlTGlzdCkgPT4ge1xuICBhdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlTmFtZSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gdXRpbC5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LnByb3RvdHlwZSwgcHJvcGVydHlOYW1lLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBEZWZpbmVzIGEgc3RyaW5nIHByb3BlcnR5IHRoYXQgcmVmbGVjdHMgYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUgZm9yIGFcbiAqIGdpdmVuIGxpc3Qgb2YgYXR0cmlidXRlcy5cbiAqL1xudXRpbC5kZWZpbmVTdHJpbmdQcm9wZXJ0aWVzID0gKG9iamVjdCwgYXR0cmlidXRlTGlzdCkgPT4ge1xuICBhdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlTmFtZSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gdXRpbC5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LnByb3RvdHlwZSwgcHJvcGVydHlOYW1lLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59O1xuLyoqXG4gKiBNYWtlcyBhIHByb3BlcnR5IGZvciBhIGxpc3RlbmVyIGUuZy4gb25DbGljay5cbiAqXG4gKiBSZXR1cm5zIGBvbkNvbm5lY3RlZGAgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgZWxlbWVudCdzXG4gKiBjb25uZWN0ZWRDYWxsYmFjaywgYW5kIGBvbkRpc2Nvbm5lY3RlZGAgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBpblxuICogdGhlIGVsZW1lbnQncyBkaXNjb25uZWN0ZWRDYWxsYmFjay5cbiAqL1xudXRpbC5kZWZpbmVMaXN0ZW5lclByb3BlcnR5ID0gKGVsZW1lbnQsIGV2ZW50TmFtZSkgPT4ge1xuICBjb25zdCBjYW1lbGl6ZWQgPSB1dGlsLmNhbWVsaXplKGV2ZW50TmFtZSk7XG4gIGNvbnN0IHByb3BlcnR5TmFtZSA9ICdvbicgKyBjYW1lbGl6ZWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjYW1lbGl6ZWQuc2xpY2UoMSk7XG5cbiAgbGV0IGhhbmRsZXI7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eU5hbWUsIHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9LFxuICAgIHNldChuZXdIYW5kbGVyKSB7XG4gICAgICBpZiAoZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIG5ld0hhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICBoYW5kbGVyID0gbmV3SGFuZGxlcjtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9uQ29ubmVjdGVkKCkge1xuICAgICAgaWYgKGVsZW1lbnRbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBlbGVtZW50W3Byb3BlcnR5TmFtZV0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgIGlmIChlbGVtZW50W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZWxlbWVudFtwcm9wZXJ0eU5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1dGlsO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4vcGxhdGZvcm0uanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxuY29uc3QgZXJyb3IgPSBtZXNzYWdlID0+IHV0aWwudGhyb3coYEluIFBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uOiAke21lc3NhZ2V9YCk7XG5cbmNvbnN0IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uID0ge1xuICBfdmFyaWFibGVzOiB7fSxcblxuICAvKipcbiAgICogRGVmaW5lIGEgdmFyaWFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHZhcmlhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSB2YWx1ZSBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuIENhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3ZlcndyaXRlIElmIHRoaXMgdmFsdWUgaXMgZmFsc2UsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGRlZmluZSBhIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLlxuICAgKi9cbiAgZGVmaW5lVmFyaWFibGU6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBvdmVyd3JpdGU9ZmFsc2UpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignVmFyaWFibGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignVmFyaWFibGUgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl92YXJpYWJsZXMsIG5hbWUpICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIGVycm9yKGBcIiR7bmFtZX1cIiBpcyBhbHJlYWR5IGRlZmluZWRgKTtcbiAgICB9XG4gICAgdGhpcy5fdmFyaWFibGVzW25hbWVdID0gdmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBhIHZhcmlhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSB2YXJpYWJsZS5cbiAgICogQHJldHVybiB7U3RyaW5nfEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBnZXRWYXJpYWJsZTogZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3ZhcmlhYmxlcywgbmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YXJpYWJsZXNbbmFtZV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHZhcmlhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSB2YXJhaWJsZS5cbiAgICovXG4gIHJlbW92ZVZhcmlhYmxlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuX3ZhcmlhYmxlc1tuYW1lXTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGFsbCB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGdldEFsbFZhcmlhYmxlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhcmlhYmxlcztcbiAgfSxcbiAgX3BhcnNlUGFydDogZnVuY3Rpb24ocGFydCkge1xuICAgIGxldCBjLFxuICAgICAgaW5JbnRlcnBvbGF0aW9uID0gZmFsc2UsXG4gICAgICBjdXJyZW50SW5kZXggPSAwO1xuXG4gICAgY29uc3QgdG9rZW5zID0gW107XG5cbiAgICBpZiAocGFydC5sZW5ndGggPT09IDApIHtcbiAgICAgIGVycm9yKCdVbmFibGUgdG8gcGFyc2UgZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjID0gcGFydC5jaGFyQXQoaSk7XG5cbiAgICAgIGlmIChjID09PSAnJCcgJiYgcGFydC5jaGFyQXQoaSArIDEpID09PSAneycpIHtcbiAgICAgICAgaWYgKGluSW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgIGVycm9yKCdOZXN0ZWQgaW50ZXJwb2xhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlbiA9IHBhcnQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCwgaSk7XG4gICAgICAgIGlmICh0b2tlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2gocGFydC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50SW5kZXggPSBpO1xuICAgICAgICBpbkludGVycG9sYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYyA9PT0gJ30nKSB7XG4gICAgICAgIGlmICghaW5JbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgICAgZXJyb3IoJ30gbXVzdCBiZSBwcmVjZWVkZWQgYnkgJHsnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRva2VuID0gcGFydC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpICsgMSk7XG4gICAgICAgIGlmICh0b2tlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2gocGFydC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpICsgMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudEluZGV4ID0gaSArIDE7XG4gICAgICAgIGluSW50ZXJwb2xhdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbkludGVycG9sYXRpb24pIHtcbiAgICAgIGVycm9yKCdVbnRlcm1pbmF0ZWQgaW50ZXJwb2xhdGlvbicpO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHBhcnQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCwgcGFydC5sZW5ndGgpKTtcblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH0sXG4gIF9yZXBsYWNlVG9rZW46IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgY29uc3QgcmUgPSAvXlxcJHsoLio/KX0kLyxcbiAgICAgIG1hdGNoID0gdG9rZW4ubWF0Y2gocmUpO1xuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmdldFZhcmlhYmxlKG5hbWUpO1xuXG4gICAgICBpZiAodmFyaWFibGUgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoYFZhcmlhYmxlIFwiJHtuYW1lfVwiIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFyaWFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBydiA9IHZhcmlhYmxlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBlcnJvcignTXVzdCByZXR1cm4gYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBydjtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICB9LFxuICBfcmVwbGFjZVRva2VuczogZnVuY3Rpb24odG9rZW5zKSB7XG4gICAgcmV0dXJuIHRva2Vucy5tYXAodGhpcy5fcmVwbGFjZVRva2VuLmJpbmQodGhpcykpO1xuICB9LFxuICBfcGFyc2VFeHByZXNzaW9uOiBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24uc3BsaXQoJywnKVxuICAgICAgLm1hcChcbiAgICAgICAgZnVuY3Rpb24ocGFydCkge1xuICAgICAgICAgIHJldHVybiBwYXJ0LnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLm1hcCh0aGlzLl9wYXJzZVBhcnQuYmluZCh0aGlzKSlcbiAgICAgIC5tYXAodGhpcy5fcmVwbGFjZVRva2Vucy5iaW5kKHRoaXMpKVxuICAgICAgLm1hcCgocGFydCkgPT4gcGFydC5qb2luKCcnKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIGFuIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBleHByZXNzaW9uIEFuIHBhZ2UgYXR0cmlidXRlIGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZXZhbHVhdGU6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHtcbiAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICB9XG59O1xuXG4vLyBEZWZpbmUgZGVmYXVsdCB2YXJpYWJsZXMuXG5wYWdlQXR0cmlidXRlRXhwcmVzc2lvbi5kZWZpbmVWYXJpYWJsZSgnbW9iaWxlT1MnLCBwbGF0Zm9ybS5nZXRNb2JpbGVPUygpKTtcbnBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uLmRlZmluZVZhcmlhYmxlKCdpT1NEZXZpY2UnLCBwbGF0Zm9ybS5nZXRJT1NEZXZpY2UoKSk7XG5wYWdlQXR0cmlidXRlRXhwcmVzc2lvbi5kZWZpbmVWYXJpYWJsZSgncnVudGltZScsICgpID0+IHtcbiAgcmV0dXJuIHBsYXRmb3JtLmlzV2ViVmlldygpID8gJ2NvcmRvdmEnIDogJ2Jyb3dzZXInO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0uanMnO1xuaW1wb3J0IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uIGZyb20gJy4uL3BhZ2UtYXR0cmlidXRlLWV4cHJlc3Npb24uanMnO1xuXG5jb25zdCBpbnRlcm5hbCA9IHt9O1xuXG5pbnRlcm5hbC5jb25maWcgPSB7XG4gIGF1dG9TdGF0dXNCYXJGaWxsOiB0cnVlLFxuICBhbmltYXRpb25zRGlzYWJsZWQ6IGZhbHNlLFxuICB3YXJuaW5nc0Rpc2FibGVkOiBmYWxzZVxufTtcblxuaW50ZXJuYWwubnVsbEVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbi8qKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuaW50ZXJuYWwuaXNFbmFibGVkQXV0b1N0YXR1c0JhckZpbGwgPSAoKSA9PiB7XG4gIHJldHVybiAhIWludGVybmFsLmNvbmZpZy5hdXRvU3RhdHVzQmFyRmlsbDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuaW50ZXJuYWwubm9ybWFsaXplUGFnZUhUTUwgPSBodG1sID0+ICgnJyArIGh0bWwpLnRyaW0oKTtcblxuaW50ZXJuYWwud2FpdERPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmICh3aW5kb3cuZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IHdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlID09ICd1bmluaXRpYWxpemVkJykge1xuICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHdyYXBwZWRDYWxsYmFjayk7XG4gICAgfTtcbiAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHdyYXBwZWRDYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuaW50ZXJuYWwuYXV0b1N0YXR1c0JhckZpbGwgPSBhY3Rpb24gPT4ge1xuICBjb25zdCBvblJlYWR5ID0gKCkgPT4ge1xuICAgIGlmIChpbnRlcm5hbC5zaG91bGRGaWxsU3RhdHVzQmFyKCkpIHtcbiAgICAgIGFjdGlvbigpO1xuICAgIH1cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIG9uUmVhZHkpO1xuICB9O1xuXG4gIGlmICh0eXBlb2YgZGV2aWNlID09PSAnb2JqZWN0Jykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5Jywgb25SZWFkeSk7XG4gIH0gZWxzZSBpZiAoWydjb21wbGV0ZScsICdpbnRlcmFjdGl2ZSddLmluZGV4T2YoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPT09IC0xKSB7XG4gICAgaW50ZXJuYWwud2FpdERPTUNvbnRlbnRMb2FkZWQob25SZWFkeSk7XG4gIH0gZWxzZSB7XG4gICAgb25SZWFkeSgpO1xuICB9XG59O1xuXG5pbnRlcm5hbC5zaG91bGRGaWxsU3RhdHVzQmFyID0gKCkgPT5cbiAgaW50ZXJuYWwuaXNFbmFibGVkQXV0b1N0YXR1c0JhckZpbGwoKSAmJiAocGxhdGZvcm0uaXNXZWJWaWV3KCkgJiYgKHBsYXRmb3JtLmlzSU9TN2Fib3ZlKCkgfHwgcGxhdGZvcm0uaXNJUGFkT1MoKSlcbiAgICAmJiAhcGxhdGZvcm0uaXNJUGhvbmVYKCkgfHwgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKCcub25zLXN0YXR1cy1iYXItbW9jay5pb3MnKSk7XG5cbmludGVybmFsLnRlbXBsYXRlU3RvcmUgPSB7XG4gIF9zdG9yYWdlOiB7fSxcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtTdHJpbmcvbnVsbH0gdGVtcGxhdGVcbiAgICovXG4gIGdldChrZXkpIHtcbiAgICByZXR1cm4gaW50ZXJuYWwudGVtcGxhdGVTdG9yZS5fc3RvcmFnZVtrZXldIHx8IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gICAqL1xuICBzZXQoa2V5LCB0ZW1wbGF0ZSkge1xuICAgIGludGVybmFsLnRlbXBsYXRlU3RvcmUuX3N0b3JhZ2Vba2V5XSA9IHRlbXBsYXRlO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5pbnRlcm5hbC5nZXRUZW1wbGF0ZUhUTUxBc3luYyA9IGZ1bmN0aW9uKHBhZ2UpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpbnRlcm5hbC53YWl0RE9NQ29udGVudExvYWRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGludGVybmFsLnRlbXBsYXRlU3RvcmUuZ2V0KHBhZ2UpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGlmIChjYWNoZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShjYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gdHlwZW9mIGNhY2hlID09PSAnc3RyaW5nJyA/IGNhY2hlIDogY2FjaGVbMV07XG4gICAgICAgIHJldHVybiByZXNvbHZlKGludGVybmFsLm5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYWwgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFnZSk7XG4gICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgY29uc3QgaHRtbCA9IGxvY2FsLnRleHRDb250ZW50IHx8IGxvY2FsLmNvbnRlbnQ7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGh0bWwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCBwYWdlLCB0cnVlKTtcbiAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgaHRtbCA9IHhoci5yZXNwb25zZVRleHQ7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDQwMCAmJiB4aHIuc3RhdHVzIDwgNjAwKSB7XG4gICAgICAgICAgcmVqZWN0KGh0bWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlZnJlc2ggc2NyaXB0IHRhZ3NcbiAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IHV0aWwuY3JlYXRlRnJhZ21lbnQoaHRtbCk7XG4gICAgICAgICAgdXRpbC5hcnJheUZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHQudHlwZSA9IGVsLnR5cGUgfHwgJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICBzY3JpcHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWwudGV4dCB8fCBlbC50ZXh0Q29udGVudCB8fCBlbC5pbm5lckhUTUwpKTtcbiAgICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHNjcmlwdCwgZWwpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaW50ZXJuYWwudGVtcGxhdGVTdG9yZS5zZXQocGFnZSwgZnJhZ21lbnQpO1xuICAgICAgICAgIHJlc29sdmUoZnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdXRpbC50aHJvdyhgUGFnZSB0ZW1wbGF0ZSBub3QgZm91bmQ6ICR7cGFnZX1gKTtcbiAgICAgIH07XG4gICAgICB4aHIuc2VuZChudWxsKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5pbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jID0gZnVuY3Rpb24ocGFnZSkge1xuICBjb25zdCBwYWdlcyA9IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uLmV2YWx1YXRlKHBhZ2UpO1xuXG4gIGNvbnN0IGdldFBhZ2UgPSAocGFnZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgcGFnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnTXVzdCBzcGVjaWZ5IGEgcGFnZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJuYWwuZ2V0VGVtcGxhdGVIVE1MQXN5bmMocGFnZSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICBpZiAocGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRQYWdlKHBhZ2VzLnNoaWZ0KCkpO1xuICAgICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGdldFBhZ2UocGFnZXMuc2hpZnQoKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcm5hbDtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5pbWF0b3JGYWN0b3J5IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMuYW5pbWF0b3JzIFRoZSBkaWN0aW9uYXJ5IGZvciBhbmltYXRvciBjbGFzc2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdHMuYmFzZUNsYXNzIFRoZSBiYXNlIGNsYXNzIG9mIGFuaW1hdG9yc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdHMuYmFzZUNsYXNzTmFtZV0gVGhlIG5hbWUgb2YgdGhlIGJhc2UgY2xhc3Mgb2YgYW5pbWF0b3JzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0cy5kZWZhdWx0QW5pbWF0aW9uXSBUaGUgZGVmYXVsdCBhbmltYXRpb24gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHMuZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnNdIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgdGhpcy5fYW5pbWF0b3JzID0gb3B0cy5hbmltYXRvcnM7XG4gICAgdGhpcy5fYmFzZUNsYXNzID0gb3B0cy5iYXNlQ2xhc3M7XG4gICAgdGhpcy5fYmFzZUNsYXNzTmFtZSA9IG9wdHMuYmFzZUNsYXNzTmFtZSB8fCBvcHRzLmJhc2VDbGFzcy5uYW1lO1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IG9wdHMuZGVmYXVsdEFuaW1hdGlvbiB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5fYW5pbWF0aW9uT3B0aW9ucyA9IG9wdHMuZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoIXRoaXMuX2FuaW1hdG9yc1t0aGlzLl9hbmltYXRpb25dKSB7XG4gICAgICB1dGlsLnRocm93KCdObyBzdWNoIGFuaW1hdGlvbjogJyArIHRoaXMuX2FuaW1hdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBqc29uU3RyaW5nXG4gICAqIEByZXR1cm4ge09iamVjdC9udWxsfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyhqc29uU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YganNvblN0cmluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbC5hbmltYXRpb25PcHRpb25zUGFyc2UoanNvblN0cmluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1wiYW5pbWF0aW9uLW9wdGlvbnNcIiBhdHRyaWJ1dGUgbXVzdCBiZSBhIEpTT04gb2JqZWN0IHN0cmluZzogJyArIGpzb25TdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignXCJhbmltYXRpb24tb3B0aW9uc1wiIGF0dHJpYnV0ZSBtdXN0IGJlIGEgSlNPTiBvYmplY3Qgc3RyaW5nOiAnICsganNvblN0cmluZyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBzZXRBbmltYXRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBUaGUgYW5pbWF0aW9uIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIFRoZSBhbmltYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdEFuaW1hdG9yIFRoZSBkZWZhdWx0IGFuaW1hdG9yIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gQW4gYW5pbWF0b3IgaW5zdGFuY2VcbiAgICovXG4gIG5ld0FuaW1hdG9yKG9wdGlvbnMgPSB7fSwgZGVmYXVsdEFuaW1hdG9yKSB7XG5cbiAgICBsZXQgYW5pbWF0b3IgPSBudWxsO1xuXG4gICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uIGluc3RhbmNlb2YgdGhpcy5fYmFzZUNsYXNzKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5hbmltYXRpb247XG4gICAgfVxuXG4gICAgbGV0IEFuaW1hdG9yID0gbnVsbDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbmltYXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBBbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yc1tvcHRpb25zLmFuaW1hdGlvbl07XG4gICAgfVxuXG4gICAgaWYgKCFBbmltYXRvciAmJiBkZWZhdWx0QW5pbWF0b3IpIHtcbiAgICAgIGFuaW1hdG9yID0gZGVmYXVsdEFuaW1hdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBBbmltYXRvciA9IEFuaW1hdG9yIHx8IHRoaXMuX2FuaW1hdG9yc1t0aGlzLl9hbmltYXRpb25dO1xuXG4gICAgICBjb25zdCBhbmltYXRpb25PcHRzID0gdXRpbC5leHRlbmQoXG4gICAgICAgIHt9LFxuICAgICAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zLFxuICAgICAgICBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnMgfHwge30sXG4gICAgICAgIGludGVybmFsLmNvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQgPyB7ZHVyYXRpb246IDAsIGRlbGF5OiAwfSA6IHt9XG4gICAgICApO1xuXG4gICAgICBhbmltYXRvciA9IG5ldyBBbmltYXRvcihhbmltYXRpb25PcHRzKTtcblxuICAgICAgaWYgKHR5cGVvZiBhbmltYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhbmltYXRvciA9IG5ldyBhbmltYXRvcihhbmltYXRpb25PcHRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEoYW5pbWF0b3IgaW5zdGFuY2VvZiB0aGlzLl9iYXNlQ2xhc3MpKSB7XG4gICAgICB1dGlsLnRocm93KGBcImFuaW1hdG9yXCIgaXMgbm90IGFuIGluc3RhbmNlIG9mICR7dGhpcy5fYmFzZUNsYXNzTmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5pbWF0b3I7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS5qcyc7XG5cbmNvbnN0IHV0aWwgPSB7XG4gIF9yZWFkeTogZmFsc2UsXG5cbiAgX2RvbUNvbnRlbnRMb2FkZWQ6IGZhbHNlLFxuXG4gIF9vbkRPTUNvbnRlbnRMb2FkZWQ6ICgpID0+IHtcbiAgICB1dGlsLl9kb21Db250ZW50TG9hZGVkID0gdHJ1ZTtcblxuICAgIGlmIChwbGF0Zm9ybS5pc1dlYlZpZXcoKSkge1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xuICAgICAgICB1dGlsLl9yZWFkeSA9IHRydWU7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHV0aWwuX3JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgYWRkQmFja0J1dHRvbkxpc3RlbmVyOiBmdW5jdGlvbihmbikge1xuICAgIGlmICghdGhpcy5fZG9tQ29udGVudExvYWRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgYWZ0ZXIgRE9NQ29udGVudExvYWRlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWFkeSkge1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUJhY2tCdXR0b25MaXN0ZW5lcjogZnVuY3Rpb24oZm4pIHtcbiAgICBpZiAoIXRoaXMuX2RvbUNvbnRlbnRMb2FkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGFmdGVyIERPTUNvbnRlbnRMb2FkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVhZHkpIHtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdiYWNrYnV0dG9uJywgZm4sIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdiYWNrYnV0dG9uJywgZm4sIGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gdXRpbC5fb25ET01Db250ZW50TG9hZGVkKCksIGZhbHNlKTtcblxuY29uc3QgSGFuZGxlclJlcG9zaXRvcnkgPSB7XG4gIF9zdG9yZToge30sXG5cbiAgX2dlbklkOiAoKCkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICByZXR1cm4gKCkgPT4gaSsrO1xuICB9KSgpLFxuXG4gIHNldDogZnVuY3Rpb24oZWxlbWVudCwgaGFuZGxlcikge1xuICAgIGlmIChlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCkge1xuICAgICAgdGhpcy5yZW1vdmUoZWxlbWVudCk7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQgPSBIYW5kbGVyUmVwb3NpdG9yeS5fZ2VuSWQoKTtcbiAgICB0aGlzLl9zdG9yZVtpZF0gPSBoYW5kbGVyO1xuICB9LFxuXG4gIHJlbW92ZTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCkge1xuICAgICAgZGVsZXRlIHRoaXMuX3N0b3JlW2VsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkXTtcbiAgICAgIGRlbGV0ZSBlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZDtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkO1xuXG4gICAgaWYgKCF0aGlzLl9zdG9yZVtpZF0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdG9yZVtpZF07XG4gIH0sXG5cbiAgaGFzOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LmRhdGFzZXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkO1xuXG4gICAgcmV0dXJuICEhdGhpcy5fc3RvcmVbaWRdO1xuICB9XG59O1xuXG5jbGFzcyBEZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2JvdW5kQ2FsbGJhY2sgPSB0aGlzLl9jYWxsYmFjay5iaW5kKHRoaXMpO1xuICB9XG5cblxuICAvKipcbiAgICogRW5hYmxlIHRvIGhhbmRsZSAnYmFja2J1dHRvbicgZXZlbnRzLlxuICAgKi9cbiAgZW5hYmxlKCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICB1dGlsLmFkZEJhY2tCdXR0b25MaXN0ZW5lcih0aGlzLl9ib3VuZENhbGxiYWNrKTtcbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgdG8gaGFuZGxlICdiYWNrYnV0dG9uJyBldmVudHMuXG4gICAqL1xuICBkaXNhYmxlKCkge1xuICAgIGlmICh0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgIHV0aWwucmVtb3ZlQmFja0J1dHRvbkxpc3RlbmVyKHRoaXMuX2JvdW5kQ2FsbGJhY2spO1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmUgYSAnYmFja2J1dHRvbicgZXZlbnQgbWFudWFsbHkuXG4gICAqL1xuICBmaXJlRGV2aWNlQmFja0J1dHRvbkV2ZW50KCkge1xuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KCdiYWNrYnV0dG9uJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBfY2FsbGJhY2soKSB7XG4gICAgdGhpcy5fZGlzcGF0Y2hEZXZpY2VCYWNrQnV0dG9uRXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBjcmVhdGVIYW5kbGVyKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAoIShjYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlciA9IHtcbiAgICAgIF9jYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICBfZWxlbWVudDogZWxlbWVudCxcblxuICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIEhhbmRsZXJSZXBvc2l0b3J5LnJlbW92ZShlbGVtZW50KTtcbiAgICAgIH0sXG5cbiAgICAgIHNldExpc3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgfSxcblxuICAgICAgZW5hYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgSGFuZGxlclJlcG9zaXRvcnkuc2V0KGVsZW1lbnQsIHRoaXMpO1xuICAgICAgfSxcblxuICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEhhbmRsZXJSZXBvc2l0b3J5LmdldChlbGVtZW50KSA9PT0gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICBIYW5kbGVyUmVwb3NpdG9yeS5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGhhbmRsZXIuZW5hYmxlKCk7XG5cbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIF9kaXNwYXRjaERldmljZUJhY2tCdXR0b25FdmVudCgpIHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5fY2FwdHVyZVRyZWUoKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9maW5kSGFuZGxlckxlYWZFbGVtZW50KHRyZWUpO1xuXG4gICAgbGV0IGhhbmRsZXIgPSBIYW5kbGVyUmVwb3NpdG9yeS5nZXQoZWxlbWVudCk7XG4gICAgaGFuZGxlci5fY2FsbGJhY2soY3JlYXRlRXZlbnQoZWxlbWVudCkpO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRXZlbnQoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX2VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGNhbGxQYXJlbnRIYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXJSZXBvc2l0b3J5LmdldChwYXJlbnQpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuX2NhbGxiYWNrKGNyZWF0ZUV2ZW50KHBhcmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBfY2FwdHVyZVRyZWUoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRyZWUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVUcmVlKGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRyZWUgPSB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGNoaWxkcmVuOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnJheU9mKGVsZW1lbnQuY2hpbGRyZW4pLm1hcChmdW5jdGlvbihjaGlsZEVsZW1lbnQpIHtcblxuICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IGNoaWxkRWxlbWVudC5faXNTaG93biA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhSGFuZGxlclJlcG9zaXRvcnkuaGFzKGNoaWxkRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVUcmVlKGNoaWxkRWxlbWVudCk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhSGFuZGxlclJlcG9zaXRvcnkuaGFzKHJlc3VsdC5lbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbcmVzdWx0XTtcbiAgICAgICAgfSkpXG4gICAgICB9O1xuXG4gICAgICBpZiAoIUhhbmRsZXJSZXBvc2l0b3J5Lmhhcyh0cmVlLmVsZW1lbnQpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IHRyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgaWYgKEhhbmRsZXJSZXBvc2l0b3J5LmhhcyhzdWJUcmVlLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ViVHJlZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXJyYXlPZih0YXJnZXQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGFyZ2V0W2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0cmVlXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgKi9cbiAgX2ZpbmRIYW5kbGVyTGVhZkVsZW1lbnQodHJlZSkge1xuICAgIHJldHVybiBmaW5kKHRyZWUpO1xuXG4gICAgZnVuY3Rpb24gZmluZChub2RlKSB7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBmaW5kKG5vZGUuY2hpbGRyZW5bMF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGROb2RlKSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGUuZWxlbWVudDtcbiAgICAgIH0pLnJlZHVjZShmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgICBpZiAoIWxlZnQpIHtcbiAgICAgICAgICByZXR1cm4gcmlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZWZ0WiA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGxlZnQsICcnKS56SW5kZXgsIDEwKTtcbiAgICAgICAgY29uc3QgcmlnaHRaID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUocmlnaHQsICcnKS56SW5kZXgsIDEwKTtcblxuICAgICAgICBpZiAoIWlzTmFOKGxlZnRaKSAmJiAhaXNOYU4ocmlnaHRaKSkge1xuICAgICAgICAgIHJldHVybiBsZWZ0WiA+IHJpZ2h0WiA/IGxlZnQgOiByaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwdHVyaW5nIGJhY2tidXR0b24taGFuZGxlciBpcyBmYWlsdXJlLicpO1xuICAgICAgfSwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBEZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlcigpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuL2ludGVybmFsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBkZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciBmcm9tICcuL2RldmljZS1iYWNrLWJ1dHRvbi1kaXNwYXRjaGVyLmpzJztcblxuaW50ZXJuYWwuQW5pbWF0b3JGYWN0b3J5ID0gQW5pbWF0b3JGYWN0b3J5O1xuaW50ZXJuYWwuTW9kaWZpZXJVdGlsID0gTW9kaWZpZXJVdGlsO1xuaW50ZXJuYWwuZGJiRGlzcGF0Y2hlciA9IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcm5hbDtcblxuIiwiaW1wb3J0ICcuL29ucy9wbGF0Zm9ybS5qcyc7IC8vIFRoaXMgZmlsZSBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgQ3VzdG9tIEVsZW1lbnRzIHBvbHlmaWxscy5cbmltcG9ydCAnLi9wb2x5ZmlsbHMvaW5kZXguanMnO1xuaW1wb3J0ICcuL3ZlbmRvci9pbmRleC5qcyc7XG5pbXBvcnQgJy4vb25zL21pY3JvZXZlbnQuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4vb25zL2ludGVybmFsL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0dXAob25zKSB7XG4gIGludGVybmFsLndhaXRET01Db250ZW50TG9hZGVkKGZ1bmN0aW9uKCkge1xuICAgIHJlZ2lzdGVyKCdzY3JpcHRbdHlwZT1cInRleHQvdGVtcGxhdGVcIl0nKTtcbiAgICByZWdpc3Rlcignc2NyaXB0W3R5cGU9XCJ0ZXh0L25nLXRlbXBsYXRlXCJdJyk7XG4gICAgcmVnaXN0ZXIoJ3RlbXBsYXRlJyk7XG5cbiAgICBmdW5jdGlvbiByZWdpc3RlcihxdWVyeSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVzID0gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW50ZXJuYWwudGVtcGxhdGVTdG9yZS5zZXQodGVtcGxhdGVzW2ldLmdldEF0dHJpYnV0ZSgnaWQnKSwgdGVtcGxhdGVzW2ldLnRleHRDb250ZW50IHx8IHRlbXBsYXRlc1tpXS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmICh3aW5kb3cuX29uc0xvYWRlZCkge1xuICAgIG9ucy5fdXRpbC53YXJuKCdPbnNlbiBVSSBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG4gIH1cbiAgd2luZG93Ll9vbnNMb2FkZWQgPSB0cnVlO1xuXG4gIG9ucy5yZWFkeShmdW5jdGlvbigpIHtcbiAgICBvbnMuZW5hYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIoKTtcbiAgICBvbnMuX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5faW50ZXJuYWwuZGJiRGlzcGF0Y2hlci5jcmVhdGVIYW5kbGVyKHdpbmRvdy5kb2N1bWVudC5ib2R5LCAoKSA9PiB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobmF2aWdhdG9yLCAnYXBwJykpIHtcbiAgICAgICAgbmF2aWdhdG9yLmFwcC5leGl0QXBwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBjbG9zZSB0aGUgYXBwLiBJcyBcXCdjb3Jkb3ZhLmpzXFwnIGluY2x1ZGVkP1xcbkVycm9yOiBcXCd3aW5kb3cubmF2aWdhdG9yLmFwcFxcJyBpcyB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYm9keS5fZ2VzdHVyZURldGVjdG9yID0gbmV3IG9ucy5HZXN0dXJlRGV0ZWN0b3IoZG9jdW1lbnQuYm9keSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gU2ltdWxhdGUgRGV2aWNlIEJhY2sgQnV0dG9uIG9uIEVTQyBwcmVzc1xuICAgIGlmICghb25zLnBsYXRmb3JtLmlzV2ViVmlldygpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgICBvbnMuZmlyZURldmljZUJhY2tCdXR0b25FdmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzZXR1cCBsb2FkaW5nIHBsYWNlaG9sZGVyXG4gICAgb25zLl9zZXR1cExvYWRpbmdQbGFjZUhvbGRlcnMoKTtcbiAgfSk7XG5cbiAgLy8gdmlld3BvcnQuanNcbiAgVmlld3BvcnQuc2V0dXAoKTtcbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5cbi8qKlxuICogTWluaW1hbCBhbmltYXRpb24gbGlicmFyeSBmb3IgbWFuYWdpbmcgY3NzIHRyYW5zaXRpb24gb24gbW9iaWxlIGJyb3dzZXJzLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBUSU1FT1VUX1JBVElPID0gMS40O1xuXG52YXIgdXRpbCA9IHtcbn07XG5cbi8vIGNhcGl0YWxpemUgc3RyaW5nXG51dGlsLmNhcGl0YWxpemUgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5wcm9wZXJ0eVxuICogQHBhcmFtIHtGbG9hdH0gcGFyYW1zLmR1cmF0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRpbWluZ1xuICovXG51dGlsLmJ1aWxkVHJhbnNpdGlvblZhbHVlID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gIHBhcmFtcy5wcm9wZXJ0eSA9IHBhcmFtcy5wcm9wZXJ0eSB8fCAnYWxsJztcbiAgcGFyYW1zLmR1cmF0aW9uID0gcGFyYW1zLmR1cmF0aW9uIHx8IDAuNDtcbiAgcGFyYW1zLnRpbWluZyA9IHBhcmFtcy50aW1pbmcgfHwgJ2xpbmVhcic7XG5cbiAgdmFyIHByb3BzID0gcGFyYW1zLnByb3BlcnR5LnNwbGl0KC8gKy8pO1xuXG4gIHJldHVybiBwcm9wcy5tYXAoZnVuY3Rpb24ocHJvcCkge1xuICAgIHJldHVybiBwcm9wICsgJyAnICsgcGFyYW1zLmR1cmF0aW9uICsgJ3MgJyArIHBhcmFtcy50aW1pbmc7XG4gIH0pLmpvaW4oJywgJyk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBldmVudCBoYW5kbGVyIG9uIFwidHJhbnNpdGlvbmVuZFwiIGV2ZW50LlxuICovXG51dGlsLm9uY2VPblRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbihlbGVtZW50LCBjYWxsYmFjaykge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7fTtcbiAgfVxuXG4gIHZhciByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB1dGlsLl90cmFuc2l0aW9uRW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbiwgZmFsc2UpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBmbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgaWYgKGVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuXG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcblxuICB1dGlsLl90cmFuc2l0aW9uRW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZm4sIGZhbHNlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlbW92ZUxpc3RlbmVycztcbn07XG5cbnV0aWwuX3RyYW5zaXRpb25FbmRFdmVudHMgPSAoZnVuY3Rpb24oKSB7XG5cbiAgaWYgKCdvbnRyYW5zaXRpb25lbmQnIGluIHdpbmRvdykge1xuICAgIHJldHVybiBbJ3RyYW5zaXRpb25lbmQnXTtcbiAgfVxuXG4gIGlmICgnb253ZWJraXR0cmFuc2l0aW9uZW5kJyBpbiB3aW5kb3cpIHtcbiAgICByZXR1cm4gWyd3ZWJraXRUcmFuc2l0aW9uRW5kJ107XG4gIH1cblxuICBpZiAodXRpbC52ZW5kb3JQcmVmaXggPT09ICd3ZWJraXQnIHx8IHV0aWwudmVuZG9yUHJlZml4ID09PSAnbycgfHwgdXRpbC52ZW5kb3JQcmVmaXggPT09ICdtb3onIHx8IHV0aWwudmVuZG9yUHJlZml4ID09PSAnbXMnKSB7XG4gICAgcmV0dXJuIFt1dGlsLnZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uRW5kJywgJ3RyYW5zaXRpb25lbmQnXTtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn0pKCk7XG5cbnV0aWwuX2Nzc1Byb3BlcnR5RGljdCA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJycpO1xuICB2YXIgZGljdCA9IHt9O1xuICB2YXIgYSA9ICdBJy5jaGFyQ29kZUF0KDApO1xuICB2YXIgeiA9ICd6Jy5jaGFyQ29kZUF0KDApO1xuXG4gIHZhciB1cHBlciA9IGZ1bmN0aW9uKHMpIHtcbiAgICByZXR1cm4gcy5zdWJzdHIoMSkudG9VcHBlckNhc2UoKTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgdmFyIGtleSA9IHN0eWxlc1tpXVxuICAgIC5yZXBsYWNlKC9eWy1dKy8sICcnKVxuICAgIC5yZXBsYWNlKC9bLV1bYS16XS9nLCB1cHBlcilcbiAgICAucmVwbGFjZSgvXm1vei8sICdNb3onKTtcblxuICAgIGlmIChhIDw9IGtleS5jaGFyQ29kZUF0KDApICYmIHogPj0ga2V5LmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgIGlmIChrZXkgIT09ICdjc3NUZXh0JyAmJiBrZXkgIT09ICdwYXJlbnRUZXh0Jykge1xuICAgICAgICBkaWN0W2tleV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaWN0O1xufSkoKTtcblxudXRpbC5oYXNDc3NQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUgaW4gdXRpbC5fY3NzUHJvcGVydHlEaWN0O1xufTtcblxuLyoqXG4gKiBWZW5kb3IgcHJlZml4IGZvciBjc3MgcHJvcGVydHkuXG4gKi9cbnV0aWwudmVuZG9yUHJlZml4ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnJyksXG4gICAgcHJlID0gKEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgICAgLmNhbGwoc3R5bGVzKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAubWF0Y2goLy0obW96fHdlYmtpdHxtcyktLykgfHwgKHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVxuICAgIClbMV07XG4gICAgcmV0dXJuIHByZTtcbn0pKCk7XG5cbnV0aWwuZm9yY2VMYXlvdXRBdE9uY2UgPSBmdW5jdGlvbihlbGVtZW50cywgY2FsbGJhY2spIHtcbiAgdGhpcy5iYXRjaEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIC8vIGZvcmNlIGxheW91dFxuICAgICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59O1xuXG51dGlsLmJhdGNoSW1tZWRpYXRlID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2tzID0gW107XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNvbmNyZWF0ZUNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICAgICAgY2FsbGJhY2tzID0gW107XG4gICAgICAgIGNvbmNyZWF0ZUNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH07XG59KSgpO1xuXG51dGlsLmJhdGNoQW5pbWF0aW9uRnJhbWUgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFja3MgPSBbXTtcblxuICB2YXIgcmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJhZihmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNvbmNyZWF0ZUNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICAgICAgY2FsbGJhY2tzID0gW107XG4gICAgICAgIGNvbmNyZWF0ZUNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH07XG59KSgpO1xuXG51dGlsLnRyYW5zaXRpb25Qcm9wZXJ0eU5hbWUgPSAoZnVuY3Rpb24oKSB7XG4gIGlmICh1dGlsLmhhc0Nzc1Byb3BlcnR5KCd0cmFuc2l0aW9uRHVyYXRpb24nKSkge1xuICAgIHJldHVybiAndHJhbnNpdGlvbic7XG4gIH1cblxuICBpZiAodXRpbC5oYXNDc3NQcm9wZXJ0eSh1dGlsLnZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uRHVyYXRpb24nKSkge1xuICAgIHJldHVybiB1dGlsLnZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uJztcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpO1xufSkoKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xudmFyIEFuaW1pdCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGRlZmF1bHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBbmltaXQpKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltaXQoZWxlbWVudCwgZGVmYXVsdHMpO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuZWxlbWVudHMgPSBbZWxlbWVudF07XG4gIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsZW1lbnQpID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnQ7XG5cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgb3IgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQuJyk7XG4gIH1cblxuICB0aGlzLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4gIHRoaXMudHJhbnNpdGlvblF1ZXVlID0gW107XG4gIHRoaXMubGFzdFN0eWxlQXR0cmlidXRlRGljdCA9IFtdO1xufTtcblxuQW5pbWl0LnByb3RvdHlwZSA9IHtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHtBcnJheX1cbiAgICovXG4gIHRyYW5zaXRpb25RdWV1ZTogdW5kZWZpbmVkLFxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge0FycmF5fVxuICAgKi9cbiAgZWxlbWVudHM6IHVuZGVmaW5lZCxcblxuICAvKipcbiAgICogQHByb3BlcnR5IHtPYmplY3R9XG4gICAqL1xuICBkZWZhdWx0czogdW5kZWZpbmVkLFxuXG4gIC8qKlxuICAgKiBTdGFydCBhbmltYXRpb24gc2VxdWVuY2Ugd2l0aCBwYXNzZWQgYW5pbWF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHBsYXk6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb3N0IG9mIHRoZSBhbmltYXRpb25zIGZvbGxvdyB0aGlzIGRlZmF1bHQgcHJvY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHtmcm9tfSBjc3Mgb3Igb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBjc3NcbiAgICogQHBhcmFtIHt0b30gY3NzIG9yIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgY3NzXG4gICAqIEBwYXJhbSB7ZGVsYXl9IGRlbGF5IHRvIHdhaXRcbiAgICovXG4gIGRlZmF1bHQ6IGZ1bmN0aW9uKGZyb20sIHRvLCBkZWxheSkge1xuICAgIGZ1bmN0aW9uIHN0ZXAocGFyYW1zLCBkdXJhdGlvbiwgdGltaW5nKSB7XG4gICAgICBpZiAocGFyYW1zLmR1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb247XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnRpbWluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRpbWluZyA9IHBhcmFtcy50aW1pbmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogcGFyYW1zLmNzcyB8fCBwYXJhbXMsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgdGltaW5nOiB0aW1pbmdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2F2ZVN0eWxlKClcbiAgICAgIC5xdWV1ZShzdGVwKGZyb20sIDAsIHRoaXMuZGVmYXVsdHMudGltaW5nKSlcbiAgICAgIC53YWl0KGRlbGF5ID09PSB1bmRlZmluZWQgPyB0aGlzLmRlZmF1bHRzLmRlbGF5IDogZGVsYXkpXG4gICAgICAucXVldWUoc3RlcCh0bywgdGhpcy5kZWZhdWx0cy5kdXJhdGlvbiwgdGhpcy5kZWZhdWx0cy50aW1pbmcpKVxuICAgICAgLnJlc3RvcmVTdHlsZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBRdWV1ZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMgb3Igb3RoZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIGUuZy4gYW5pbWl0KGVsdCkucXVldWUoe2NvbG9yOiAncmVkJ30pXG4gICAqIGUuZy4gYW5pbWl0KGVsdCkucXVldWUoe2NvbG9yOiAncmVkJ30sIHtkdXJhdGlvbjogMC40fSlcbiAgICogZS5nLiBhbmltaXQoZWx0KS5xdWV1ZSh7Y3NzOiB7Y29sb3I6ICdyZWQnfSwgZHVyYXRpb246IDAuMn0pXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEFuaW1pdC5UcmFuc2l0aW9ufEZ1bmN0aW9ufSB0cmFuc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICovXG4gIHF1ZXVlOiBmdW5jdGlvbih0cmFuc2l0aW9uLCBvcHRpb25zKSB7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy50cmFuc2l0aW9uUXVldWU7XG5cbiAgICBpZiAodHJhbnNpdGlvbiAmJiBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zLmNzcyA9IHRyYW5zaXRpb247XG4gICAgICB0cmFuc2l0aW9uID0gbmV3IEFuaW1pdC5UcmFuc2l0aW9uKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmICghKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0cmFuc2l0aW9uIGluc3RhbmNlb2YgQW5pbWl0LlRyYW5zaXRpb24pKSB7XG4gICAgICBpZiAodHJhbnNpdGlvbi5jc3MpIHtcbiAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBBbmltaXQuVHJhbnNpdGlvbih0cmFuc2l0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24gPSBuZXcgQW5pbWl0LlRyYW5zaXRpb24oe1xuICAgICAgICAgIGNzczogdHJhbnNpdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHJhbnNpdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRyYW5zaXRpb24pO1xuICAgIH0gZWxzZSBpZiAodHJhbnNpdGlvbiBpbnN0YW5jZW9mIEFuaW1pdC5UcmFuc2l0aW9uKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRyYW5zaXRpb24uYnVpbGQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogUXVldWUgdHJhbnNpdGlvbiBhbmltYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0Zsb2F0fSBzZWNvbmRzXG4gICAqL1xuICB3YWl0OiBmdW5jdGlvbihzZWNvbmRzKSB7XG4gICAgaWYgKHNlY29uZHMgPiAwKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25RdWV1ZS5wdXNoKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgc2V0VGltZW91dChkb25lLCAxMDAwICogc2Vjb25kcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzYXZlU3R5bGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNzcyA9IHRoaXMubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0gPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQuc3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjc3NbZWxlbWVudC5zdHlsZVtpXV0gPSBlbGVtZW50LnN0eWxlW2VsZW1lbnQuc3R5bGVbaV1dO1xuICAgICAgICB9XG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgZG9uZSgpO1xuICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogUmVzdG9yZSBlbGVtZW50J3Mgc3R5bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGbG9hdH0gW29wdGlvbnMuZHVyYXRpb25dXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1pbmddXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50cmFuc2l0aW9uXVxuICAgKi9cbiAgcmVzdG9yZVN0eWxlOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbiAmJiAhb3B0aW9ucy5kdXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIm9wdGlvbnMuZHVyYXRpb25cIiBpcyByZXF1aXJlZCB3aGVuIFwib3B0aW9ucy50cmFuc2l0aW9uXCIgaXMgZW5hYmxlZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSB1dGlsLnRyYW5zaXRpb25Qcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uIHx8IChvcHRpb25zLmR1cmF0aW9uICYmIG9wdGlvbnMuZHVyYXRpb24gPiAwKSkge1xuICAgICAgdmFyIHRyYW5zaXRpb25WYWx1ZSA9IG9wdGlvbnMudHJhbnNpdGlvbiB8fCAoJ2FsbCAnICsgb3B0aW9ucy5kdXJhdGlvbiArICdzICcgKyAob3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcicpKTtcblxuICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgICAgIHZhciB0aW1lb3V0SWQ7XG5cbiAgICAgICAgdmFyIGNsZWFyVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2l0aW9uTmFtZV0gPSAnJztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBhZGQgXCJ0cmFuc2l0aW9uZW5kXCIgZXZlbnQgaGFuZGxlclxuICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gdXRpbC5vbmNlT25UcmFuc2l0aW9uRW5kKGVsZW1lbnRzWzBdLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICBjbGVhclRyYW5zaXRpb24oKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGZvciBmYWlsIHNhZmUuXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgY2xlYXJUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9LCBvcHRpb25zLmR1cmF0aW9uICogMTAwMCAqIFRJTUVPVVRfUkFUSU8pO1xuXG4gICAgICAgIC8vIHRyYW5zaXRpb24gYW5kIHN0eWxlIHNldHRpbmdzXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcblxuICAgICAgICAgIHZhciBjc3MgPSBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdO1xuXG4gICAgICAgICAgaWYgKCFjc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVzdG9yZVN0eWxlKCk6IFRoZSBzdHlsZSBpcyBub3Qgc2F2ZWQuIEludm9rZSBzYXZlU3R5bGUoKSBiZWZvcmUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIHZhciBuYW1lO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtZW50LnN0eWxlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbWVudC5zdHlsZVtpXTtcbiAgICAgICAgICAgIGlmIChjc3NbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjc3NbbmFtZV0gPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zaXRpb25OYW1lXSA9IHRyYW5zaXRpb25WYWx1ZTtcblxuICAgICAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IHRyYW5zaXRpb25OYW1lKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IGNzc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2l0aW9uTmFtZV0gPSB0cmFuc2l0aW9uVmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvblF1ZXVlLnB1c2goZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICByZXNldCgpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcblxuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgLy8gQ2xlYXIgdHJhbnNpdGlvbiBhbmltYXRpb24gc2V0dGluZ3MuXG4gICAgICBzZWxmLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2l0aW9uTmFtZV0gPSAnbm9uZSc7XG5cbiAgICAgICAgdmFyIGNzcyA9IHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF07XG5cbiAgICAgICAgaWYgKCFjc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc3RvcmVTdHlsZSgpOiBUaGUgc3R5bGUgaXMgbm90IHNhdmVkLiBJbnZva2Ugc2F2ZVN0eWxlKCkgYmVmb3JlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbmFtZSA9ICcnOyBpIDwgZWxlbWVudC5zdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG5hbWUgPSBlbGVtZW50LnN0eWxlW2ldO1xuICAgICAgICAgIGlmICh0eXBlb2YgY3NzW2VsZW1lbnQuc3R5bGVbaV1dID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3NzW2VsZW1lbnQuc3R5bGVbaV1dID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IGNzc1trZXldO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTdGFydCBhbmltYXRpb24gc2VxdWVuY2UuXG4gICAqL1xuICBzdGFydEFuaW1hdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fZGVxdWV1ZVRyYW5zaXRpb24oKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF9kZXF1ZXVlVHJhbnNpdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRyYW5zaXRpb24gPSB0aGlzLnRyYW5zaXRpb25RdWV1ZS5zaGlmdCgpO1xuICAgIGlmICh0aGlzLl9jdXJyZW50VHJhbnNpdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXJyZW50IHRyYW5zaXRpb24gZXhpc3RzLicpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50VHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjYWxsZWQgPSBmYWxzZTtcblxuICAgIHZhciBkb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLl9jdXJyZW50VHJhbnNpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgc2VsZi5fZGVxdWV1ZVRyYW5zaXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZTogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgdHdpY2UuJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICB0cmFuc2l0aW9uLmNhbGwodGhpcywgZG9uZSk7XG4gICAgfVxuICB9XG5cbn07XG5cbi8qKlxuICogQHBhcmFtIHtBbmltaXR9IGFyZ3VtZW50c1xuICovXG5BbmltaXQucnVuQWxsID0gZnVuY3Rpb24oLyogYXJndW1lbnRzLi4uICovKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgYXJndW1lbnRzW2ldLnBsYXkoKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0Zsb2F0fSBbb3B0aW9ucy5kdXJhdGlvbl1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wcm9wZXJ0eV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1pbmddXG4gKi9cbkFuaW1pdC5UcmFuc2l0aW9uID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLm9wdGlvbnMuZHVyYXRpb24gPSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gfHwgMDtcbiAgdGhpcy5vcHRpb25zLnRpbWluZyA9IHRoaXMub3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcic7XG4gIHRoaXMub3B0aW9ucy5jc3MgPSB0aGlzLm9wdGlvbnMuY3NzIHx8IHt9O1xuICB0aGlzLm9wdGlvbnMucHJvcGVydHkgPSB0aGlzLm9wdGlvbnMucHJvcGVydHkgfHwgJ2FsbCc7XG59O1xuXG5BbmltaXQuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7RnVuY3Rpb259XG4gICAqL1xuICBidWlsZDogZnVuY3Rpb24oKSB7XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcHRpb25zLmNzcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMuY3NzIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIHZhciBjc3MgPSBjcmVhdGVBY3R1YWxDc3NQcm9wcyh0aGlzLm9wdGlvbnMuY3NzKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZHVyYXRpb24gPiAwKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvblZhbHVlID0gdXRpbC5idWlsZFRyYW5zaXRpb25WYWx1ZSh0aGlzLm9wdGlvbnMpO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICAgICAgdmFyIHRpbWVvdXQgPSBzZWxmLm9wdGlvbnMuZHVyYXRpb24gKiAxMDAwICogVElNRU9VVF9SQVRJTztcbiAgICAgICAgdmFyIHRpbWVvdXRJZDtcblxuICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gdXRpbC5vbmNlT25UcmFuc2l0aW9uRW5kKGVsZW1lbnRzWzBdLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVbdXRpbC50cmFuc2l0aW9uUHJvcGVydHlOYW1lXSA9IHRyYW5zaXRpb25WYWx1ZTtcblxuICAgICAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW25hbWVdID0gY3NzW25hbWVdO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmR1cmF0aW9uIDw9IDApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVbdXRpbC50cmFuc2l0aW9uUHJvcGVydHlOYW1lXSA9ICcnO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZV0gPSBjc3NbbmFtZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdXRpbC5mb3JjZUxheW91dEF0T25jZShlbGVtZW50cywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB1dGlsLmJhdGNoQW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHV0aWwuYmF0Y2hBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlQWN0dWFsQ3NzUHJvcHMoY3NzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGNzc1tuYW1lXTtcblxuICAgICAgICBpZiAodXRpbC5oYXNDc3NQcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcmVmaXhlZCA9IHV0aWwudmVuZG9yUHJlZml4ICsgdXRpbC5jYXBpdGFsaXplKG5hbWUpO1xuICAgICAgICBpZiAodXRpbC5oYXNDc3NQcm9wZXJ0eShwcmVmaXhlZCkpIHtcbiAgICAgICAgICByZXN1bHRbcHJlZml4ZWRdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W3ByZWZpeGVkXSA9IHZhbHVlO1xuICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQW5pbWl0O1xuXG4iLCIvKlxuICogR2VzdHVyZSBkZXRlY3RvciBsaWJyYXJ5IHRoYXQgZm9ya2VkIGZyb20gZ2l0aHViLmNvbS9FaWdodE1lZGlhL2hhbW1lci5qcy5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5cbnZhciBFdmVudCwgVXRpbHMsIERldGVjdGlvbiwgUG9pbnRlckV2ZW50O1xuXG4vKipcbiAqIEBvYmplY3Qgb25zLkdlc3R1cmVEZXRlY3RvclxuICogQGNhdGVnb3J5IGdlc3R1cmVcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVXRpbGl0eSBjbGFzcyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb24uWy9lbl1cbiAqICAgW2phXeOCuOOCp+OCueODgeODo+OCkuaknOefpeOBmeOCi+OBn+OCgeOBruODpuODvOODhuOCo+ODquODhuOCo+OCr+ODqeOCueOBp+OBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGNvbnN0cnVjdG9yXG4gKiBAc2lnbmF0dXJlIGNvbnN0cnVjdG9yKGVsZW1lbnRbLCBvcHRpb25zXSlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1DcmVhdGUgYSBuZXcgR2VzdHVyZURldGVjdG9yIGluc3RhbmNlLlsvZW5dXG4gKiAgW2phXUdlc3R1cmVEZXRlY3RvcuOBruOCpOODs+OCueOCv+ODs+OCueOCkueUn+aIkOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgrjjgqfjgrnjg4Hjg6PjgpLmpJznn6XjgZnjgotET03opoHntKDjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogICBbZW5dT3B0aW9ucyBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcmV0dXJuIHtvbnMuR2VzdHVyZURldGVjdG9yLkluc3RhbmNlfVxuICovXG52YXIgR2VzdHVyZURldGVjdG9yID0gZnVuY3Rpb24gR2VzdHVyZURldGVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UoZWxlbWVudCwgb3B0aW9ucyB8fCB7fSk7XG59O1xuXG5cbi8qKlxuICogZGVmYXVsdCBzZXR0aW5ncy5cbiAqIG1vcmUgc2V0dGluZ3MgYXJlIGRlZmluZWQgcGVyIGdlc3R1cmUgYXQgYC9nZXN0dXJlc2AuIEVhY2ggZ2VzdHVyZSBjYW4gYmUgZGlzYWJsZWQvZW5hYmxlZFxuICogYnkgc2V0dGluZyBpdCdzIG5hbWUgKGxpa2UgYHN3aXBlYCkgdG8gZmFsc2UuXG4gKiBZb3UgY2FuIHNldCB0aGUgZGVmYXVsdHMgZm9yIGFsbCBpbnN0YW5jZXMgYnkgY2hhbmdpbmcgdGhpcyBvYmplY3QgYmVmb3JlIGNyZWF0aW5nIGFuIGluc3RhbmNlLlxuICogQGV4YW1wbGVcbiAqIGBgYGBcbiAqICBHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMuZHJhZyA9IGZhbHNlO1xuICogIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5iZWhhdmlvci50b3VjaEFjdGlvbiA9ICdwYW4teSc7XG4gKiAgZGVsZXRlIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5iZWhhdmlvci51c2VyU2VsZWN0O1xuICogYGBgYFxuICogQHByb3BlcnR5IGRlZmF1bHRzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMgPSB7XG4gIGJlaGF2aW9yOiB7XG4gICAgLy8gdXNlclNlbGVjdDogJ25vbmUnLCAvLyBBbHNvIGRpc2FibGVzIHNlbGVjdGlvbiBpbiBgaW5wdXRgIGNoaWxkcmVuXG4gICAgdG91Y2hBY3Rpb246ICdwYW4teScsXG4gICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG4gICAgY29udGVudFpvb21pbmc6ICdub25lJyxcbiAgICB1c2VyRHJhZzogJ25vbmUnLFxuICAgIHRhcEhpZ2hsaWdodENvbG9yOiAncmdiYSgwLDAsMCwwKSdcbiAgfVxufTtcblxuLyoqXG4gKiBHZXN0dXJlRGV0ZWN0b3IgZG9jdW1lbnQgd2hlcmUgdGhlIGJhc2UgZXZlbnRzIGFyZSBhZGRlZCBhdFxuICogQHByb3BlcnR5IERPQ1VNRU5UXG4gKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gKiBAZGVmYXVsdCB3aW5kb3cuZG9jdW1lbnRcbiAqL1xuR2VzdHVyZURldGVjdG9yLkRPQ1VNRU5UID0gZG9jdW1lbnQ7XG5cbi8qKlxuICogZGV0ZWN0IHN1cHBvcnQgZm9yIHBvaW50ZXIgZXZlbnRzXG4gKiBAcHJvcGVydHkgSEFTX1BPSU5URVJFVkVOVFNcbiAqIEB0eXBlIHtCb29sZWFufVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFMgPSBuYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQgfHwgbmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7XG5cbi8qKlxuICogZGV0ZWN0IHN1cHBvcnQgZm9yIHRvdWNoIGV2ZW50c1xuICogQHByb3BlcnR5IEhBU19UT1VDSEVWRU5UU1xuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5IQVNfVE9VQ0hFVkVOVFMgPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcblxuLyoqXG4gKiBkZXRlY3QgbW9iaWxlIGJyb3dzZXJzXG4gKiBAcHJvcGVydHkgSVNfTU9CSUxFXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuR2VzdHVyZURldGVjdG9yLklTX01PQklMRSA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWR8c2lsay9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogZGV0ZWN0IGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBtb3VzZWV2ZW50cyBhdCBhbGxcbiAqIEBwcm9wZXJ0eSBOT19NT1VTRUVWRU5UU1xuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5OT19NT1VTRUVWRU5UUyA9IChHZXN0dXJlRGV0ZWN0b3IuSEFTX1RPVUNIRVZFTlRTICYmIEdlc3R1cmVEZXRlY3Rvci5JU19NT0JJTEUpIHx8IEdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUztcblxuLyoqXG4gKiBpbnRlcnZhbCBpbiB3aGljaCBHZXN0dXJlRGV0ZWN0b3IgcmVjYWxjdWxhdGVzIGN1cnJlbnQgdmVsb2NpdHkvZGlyZWN0aW9uL2FuZ2xlIGluIG1zXG4gKiBAcHJvcGVydHkgQ0FMQ1VMQVRFX0lOVEVSVkFMXG4gKiBAdHlwZSB7TnVtYmVyfVxuICogQGRlZmF1bHQgMjVcbiAqL1xuR2VzdHVyZURldGVjdG9yLkNBTENVTEFURV9JTlRFUlZBTCA9IDI1O1xuXG4vKipcbiAqIGV2ZW50dHlwZXMgcGVyIHRvdWNoZXZlbnQgKHN0YXJ0LCBtb3ZlLCBlbmQpIGFyZSBmaWxsZWQgYnkgYEV2ZW50LmRldGVybWluZUV2ZW50VHlwZXNgIG9uIGBzZXR1cGBcbiAqIHRoZSBvYmplY3QgY29udGFpbnMgdGhlIERPTSBldmVudCBuYW1lcyBwZXIgdHlwZSAoYEVWRU5UX1NUQVJUYCwgYEVWRU5UX01PVkVgLCBgRVZFTlRfRU5EYClcbiAqIEBwcm9wZXJ0eSBFVkVOVF9UWVBFU1xuICogQHByaXZhdGVcbiAqIEB3cml0ZU9uY2VcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciBFVkVOVF9UWVBFUyA9IHt9O1xuXG4vKipcbiAqIGRpcmVjdGlvbiBzdHJpbmdzLCBmb3Igc2FmZSBjb21wYXJpc29uc1xuICogQHByb3BlcnR5IERJUkVDVElPTl9ET1dOfExFRlR8VVB8UklHSFRcbiAqIEBmaW5hbFxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZWZhdWx0ICdkb3duJyAnbGVmdCcgJ3VwJyAncmlnaHQnXG4gKi9cbnZhciBESVJFQ1RJT05fRE9XTiA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fRE9XTiA9ICdkb3duJztcbnZhciBESVJFQ1RJT05fTEVGVCA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fTEVGVCA9ICdsZWZ0JztcbnZhciBESVJFQ1RJT05fVVAgPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX1VQID0gJ3VwJztcbnZhciBESVJFQ1RJT05fUklHSFQgPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX1JJR0hUID0gJ3JpZ2h0JztcblxuLyoqXG4gKiBwb2ludGVydHlwZSBzdHJpbmdzLCBmb3Igc2FmZSBjb21wYXJpc29uc1xuICogQHByb3BlcnR5IFBPSU5URVJfTU9VU0V8VE9VQ0h8UEVOXG4gKiBAZmluYWxcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVmYXVsdCAnbW91c2UnICd0b3VjaCcgJ3BlbidcbiAqL1xudmFyIFBPSU5URVJfTU9VU0UgPSBHZXN0dXJlRGV0ZWN0b3IuUE9JTlRFUl9NT1VTRSA9ICdtb3VzZSc7XG52YXIgUE9JTlRFUl9UT1VDSCA9IEdlc3R1cmVEZXRlY3Rvci5QT0lOVEVSX1RPVUNIID0gJ3RvdWNoJztcbnZhciBQT0lOVEVSX1BFTiA9IEdlc3R1cmVEZXRlY3Rvci5QT0lOVEVSX1BFTiA9ICdwZW4nO1xuXG4vKipcbiAqIGV2ZW50dHlwZXNcbiAqIEBwcm9wZXJ0eSBFVkVOVF9TVEFSVHxNT1ZFfEVORHxSRUxFQVNFfFRPVUNIXG4gKiBAZmluYWxcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVmYXVsdCAnc3RhcnQnICdjaGFuZ2UnICdtb3ZlJyAnZW5kJyAncmVsZWFzZScgJ3RvdWNoJ1xuICovXG52YXIgRVZFTlRfU1RBUlQgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfU1RBUlQgPSAnc3RhcnQnO1xudmFyIEVWRU5UX01PVkUgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfTU9WRSA9ICdtb3ZlJztcbnZhciBFVkVOVF9FTkQgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfRU5EID0gJ2VuZCc7XG52YXIgRVZFTlRfUkVMRUFTRSA9IEdlc3R1cmVEZXRlY3Rvci5FVkVOVF9SRUxFQVNFID0gJ3JlbGVhc2UnO1xudmFyIEVWRU5UX1RPVUNIID0gR2VzdHVyZURldGVjdG9yLkVWRU5UX1RPVUNIID0gJ3RvdWNoJztcblxuLyoqXG4gKiBpZiB0aGUgd2luZG93IGV2ZW50cyBhcmUgc2V0Li4uXG4gKiBAcHJvcGVydHkgUkVBRFlcbiAqIEB3cml0ZU9uY2VcbiAqIEB0eXBlIHtCb29sZWFufVxuICogQGRlZmF1bHQgZmFsc2VcbiAqL1xuR2VzdHVyZURldGVjdG9yLlJFQURZID0gZmFsc2U7XG5cbi8qKlxuICogcGx1Z2lucyBuYW1lc3BhY2VcbiAqIEBwcm9wZXJ0eSBwbHVnaW5zXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5HZXN0dXJlRGV0ZWN0b3IucGx1Z2lucyA9IEdlc3R1cmVEZXRlY3Rvci5wbHVnaW5zIHx8IHt9O1xuXG4vKipcbiAqIGdlc3R1cmVzIG5hbWVzcGFjZVxuICogc2VlIGAvZ2VzdHVyZXNgIGZvciB0aGUgZGVmaW5pdGlvbnNcbiAqIEBwcm9wZXJ0eSBnZXN0dXJlc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xuR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzID0gR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzIHx8IHt9O1xuXG4vKipcbiAqIHNldHVwIGV2ZW50cyB0byBkZXRlY3QgZ2VzdHVyZXMgb24gdGhlIGRvY3VtZW50XG4gKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGNyZWF0aW5nIGFuIG5ldyBpbnN0YW5jZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0dXAob3B0cykge1xuICBpZiAoR2VzdHVyZURldGVjdG9yLlJFQURZKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZmluZCB3aGF0IGV2ZW50dHlwZXMgd2UgYWRkIGxpc3RlbmVycyB0b1xuICBFdmVudC5kZXRlcm1pbmVFdmVudFR5cGVzKCk7XG5cbiAgLy8gUmVnaXN0ZXIgYWxsIGdlc3R1cmVzIGluc2lkZSBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXNcbiAgVXRpbHMuZWFjaChHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMsIGZ1bmN0aW9uKGdlc3R1cmUpIHtcbiAgICBEZXRlY3Rpb24ucmVnaXN0ZXIoZ2VzdHVyZSk7XG4gIH0pO1xuXG4gIC8vIEFkZCB0b3VjaCBldmVudHMgb24gdGhlIGRvY3VtZW50XG4gIEV2ZW50Lm9uVG91Y2goR2VzdHVyZURldGVjdG9yLkRPQ1VNRU5ULCBFVkVOVF9NT1ZFLCBEZXRlY3Rpb24uZGV0ZWN0LCBvcHRzKTtcbiAgRXZlbnQub25Ub3VjaChHZXN0dXJlRGV0ZWN0b3IuRE9DVU1FTlQsIEVWRU5UX0VORCwgRGV0ZWN0aW9uLmRldGVjdCwgb3B0cyk7XG5cbiAgLy8gR2VzdHVyZURldGVjdG9yIGlzIHJlYWR5Li4uIVxuICBHZXN0dXJlRGV0ZWN0b3IuUkVBRFkgPSB0cnVlO1xufVxuXG4vKipcbiAqIEBtb2R1bGUgR2VzdHVyZURldGVjdG9yXG4gKlxuICogQGNsYXNzIFV0aWxzXG4gKiBAc3RhdGljXG4gKi9cblV0aWxzID0gR2VzdHVyZURldGVjdG9yLnV0aWxzID0ge1xuICAvKipcbiAgICogZXh0ZW5kIG1ldGhvZCwgY291bGQgYWxzbyBiZSB1c2VkIGZvciBjbG9uaW5nIHdoZW4gYGRlc3RgIGlzIGFuIGVtcHR5IG9iamVjdC5cbiAgICogY2hhbmdlcyB0aGUgZGVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV0gIGRvIGEgbWVyZ2VcbiAgICogQHJldHVybiB7T2JqZWN0fSBkZXN0XG4gICAqL1xuICBleHRlbmQ6IGZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMsIG1lcmdlKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcmMsIGtleSkgJiYgKGRlc3Rba2V5XSA9PT0gdW5kZWZpbmVkIHx8ICFtZXJnZSkpIHtcbiAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgYWRkRXZlbnRMaXN0ZW5lciB3cmFwcGVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgb246IGZ1bmN0aW9uIG9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCkge1xuICAgIHV0aWwuYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcHQsIHRydWUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgcmVtb3ZlRXZlbnRMaXN0ZW5lciB3cmFwcGVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0KSB7XG4gICAgdXRpbC5yZW1vdmVFdmVudExpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCwgdHJ1ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZvckVhY2ggb3ZlciBhcnJheXMgYW5kIG9iamVjdHNcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9ialxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRvclxuICAgKiBAcGFyYW0ge2FueX0gaXRlcmF0b3IuaXRlbVxuICAgKiBAcGFyYW0ge051bWJlcn0gaXRlcmF0b3IuaW5kZXhcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGl0ZXJhdG9yLm9iaiB0aGUgc291cmNlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgIGluIHRoZSBpdGVyYXRvclxuICAgKi9cbiAgZWFjaDogZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGksIGxlbjtcblxuICAgIC8vIG5hdGl2ZSBmb3JFYWNoIG9uIGFycmF5c1xuICAgIGlmICgnZm9yRWFjaCcgaW4gb2JqKSB7XG4gICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgICAvLyBhcnJheXNcbiAgICB9IGVsc2UgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChpID0gMCwgbGVuID0gb2JqLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9iamVjdHNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkgJiZcbiAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZpbmQgaWYgYSBzdHJpbmcgY29udGFpbnMgdGhlIHN0cmluZyB1c2luZyBpbmRleE9mXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAgICovXG4gIGluU3RyOiBmdW5jdGlvbiBpblN0cihzcmMsIGZpbmQpIHtcbiAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCkgPiAtMTtcbiAgfSxcblxuICAvKipcbiAgICogZmluZCBpZiBhIGFycmF5IGNvbnRhaW5zIHRoZSBvYmplY3QgdXNpbmcgaW5kZXhPZiBvciBhIHNpbXBsZSBwb2x5ZmlsbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gICAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gICAqL1xuICBpbkFycmF5OiBmdW5jdGlvbiBpbkFycmF5KHNyYywgZmluZCwgZGVlcCkge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3JjLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IC8vIEFycmF5LmZpbmRJbmRleFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmluZCkuZXZlcnkoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBzcmNbaV1ba2V5XSA9PT0gZmluZFtrZXldOyB9KSkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKHNyYy5pbmRleE9mKSB7XG4gICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzcmMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHNyY1tpXSA9PT0gZmluZCkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0IChgYXJndW1lbnRzYCwgYHRvdWNobGlzdGApIHRvIGFuIGFycmF5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmosIDApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaW5kIGlmIGEgbm9kZSBpcyBpbiB0aGUgZ2l2ZW4gcGFyZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGZvdW5kXG4gICAqL1xuICBoYXNQYXJlbnQ6IGZ1bmN0aW9uIGhhc1BhcmVudChub2RlLCBwYXJlbnQpIHtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHRvdWNoZXNcbiAgICogQHBhcmFtIHtBcnJheX0gdG91Y2hlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IGNlbnRlciBjb250YWlucyBgcGFnZVhgLCBgcGFnZVlgLCBgY2xpZW50WGAgYW5kIGBjbGllbnRZYCBwcm9wZXJ0aWVzXG4gICAqL1xuICBnZXRDZW50ZXI6IGZ1bmN0aW9uIGdldENlbnRlcih0b3VjaGVzKSB7XG4gICAgdmFyIHBhZ2VYID0gW10sXG4gICAgICAgIHBhZ2VZID0gW10sXG4gICAgICAgIGNsaWVudFggPSBbXSxcbiAgICAgICAgY2xpZW50WSA9IFtdLFxuICAgICAgICBtaW4gPSBNYXRoLm1pbixcbiAgICAgICAgbWF4ID0gTWF0aC5tYXg7XG5cbiAgICAvLyBubyBuZWVkIHRvIGxvb3Agd2hlbiBvbmx5IG9uZSB0b3VjaFxuICAgIGlmICh0b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVg6IHRvdWNoZXNbMF0ucGFnZVgsXG4gICAgICAgIHBhZ2VZOiB0b3VjaGVzWzBdLnBhZ2VZLFxuICAgICAgICBjbGllbnRYOiB0b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoZXNbMF0uY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBVdGlscy5lYWNoKHRvdWNoZXMsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICBwYWdlWC5wdXNoKHRvdWNoLnBhZ2VYKTtcbiAgICAgIHBhZ2VZLnB1c2godG91Y2gucGFnZVkpO1xuICAgICAgY2xpZW50WC5wdXNoKHRvdWNoLmNsaWVudFgpO1xuICAgICAgY2xpZW50WS5wdXNoKHRvdWNoLmNsaWVudFkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VYOiAobWluLmFwcGx5KE1hdGgsIHBhZ2VYKSArIG1heC5hcHBseShNYXRoLCBwYWdlWCkpIC8gMixcbiAgICAgIHBhZ2VZOiAobWluLmFwcGx5KE1hdGgsIHBhZ2VZKSArIG1heC5hcHBseShNYXRoLCBwYWdlWSkpIC8gMixcbiAgICAgIGNsaWVudFg6IChtaW4uYXBwbHkoTWF0aCwgY2xpZW50WCkgKyBtYXguYXBwbHkoTWF0aCwgY2xpZW50WCkpIC8gMixcbiAgICAgIGNsaWVudFk6IChtaW4uYXBwbHkoTWF0aCwgY2xpZW50WSkgKyBtYXguYXBwbHkoTWF0aCwgY2xpZW50WSkpIC8gMlxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYmV0d2VlbiB0d28gcG9pbnRzLiB1bml0IGlzIGluIHB4IHBlciBtcy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhVGltZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFYXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVlcbiAgICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICAgKi9cbiAgZ2V0VmVsb2NpdHk6IGZ1bmN0aW9uIGdldFZlbG9jaXR5KGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5hYnMoZGVsdGFYIC8gZGVsdGFUaW1lKSB8fCAwLFxuICAgICAgeTogTWF0aC5hYnMoZGVsdGFZIC8gZGVsdGFUaW1lKSB8fCAwXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDFcbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gyXG4gICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICovXG4gIGdldEFuZ2xlOiBmdW5jdGlvbiBnZXRBbmdsZSh0b3VjaDEsIHRvdWNoMikge1xuICAgIHZhciB4ID0gdG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCxcbiAgICAgICAgeSA9IHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFk7XG5cbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LCB4KSAqIDE4MCAvIE1hdGguUEk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGRvIGEgc21hbGwgY29tcGFyaXNvbiB0byBnZXQgdGhlIGRpcmVjdGlvbiBiZXR3ZWVuIHR3byB0b3VjaGVzLlxuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDFcbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gZGlyZWN0aW9uIG1hdGNoZXMgYERJUkVDVElPTl9MRUZUfFJJR0hUfFVQfERPV05gXG4gICAqL1xuICBnZXREaXJlY3Rpb246IGZ1bmN0aW9uIGdldERpcmVjdGlvbih0b3VjaDEsIHRvdWNoMikge1xuICAgIHZhciB4ID0gTWF0aC5hYnModG91Y2gxLmNsaWVudFggLSB0b3VjaDIuY2xpZW50WCksXG4gICAgICAgIHkgPSBNYXRoLmFicyh0b3VjaDEuY2xpZW50WSAtIHRvdWNoMi5jbGllbnRZKTtcblxuICAgIGlmICh4ID49IHkpIHtcbiAgICAgIHJldHVybiB0b3VjaDEuY2xpZW50WCAtIHRvdWNoMi5jbGllbnRYID4gMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4gdG91Y2gxLmNsaWVudFkgLSB0b3VjaDIuY2xpZW50WSA+IDAgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byB0b3VjaGVzXG4gICAqIEBwYXJhbSB7VG91Y2h9dG91Y2gxXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuICBnZXREaXN0YW5jZTogZnVuY3Rpb24gZ2V0RGlzdGFuY2UodG91Y2gxLCB0b3VjaDIpIHtcbiAgICB2YXIgeCA9IHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFgsXG4gICAgICAgIHkgPSB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZO1xuXG4gICAgcmV0dXJuIE1hdGguc3FydCgoeCAqIHgpICsgKHkgKiB5KSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yIGJldHdlZW4gdHdvIHRvdWNoTGlzdHNcbiAgICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHRvdWNoZXNcbiAgICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHRvdWNoZXNcbiAgICogQHJldHVybiB7TnVtYmVyfSBzY2FsZVxuICAgKi9cbiAgZ2V0U2NhbGU6IGZ1bmN0aW9uIGdldFNjYWxlKHN0YXJ0LCBlbmQpIHtcbiAgICAvLyBuZWVkIHR3byBmaW5nZXJzLi4uXG4gICAgaWYgKHN0YXJ0Lmxlbmd0aCA+PSAyICYmIGVuZC5sZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlzdGFuY2UoZW5kWzBdLCBlbmRbMV0pIC8gdGhpcy5nZXREaXN0YW5jZShzdGFydFswXSwgc3RhcnRbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHRvdWNoTGlzdHNcbiAgICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gICAqL1xuICBnZXRSb3RhdGlvbjogZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIC8vIG5lZWQgdHdvIGZpbmdlcnNcbiAgICBpZiAoc3RhcnQubGVuZ3RoID49IDIgJiYgZW5kLmxlbmd0aCA+PSAyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBbmdsZShlbmRbMV0sIGVuZFswXSkgLSB0aGlzLmdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaW5kIG91dCBpZiB0aGUgZGlyZWN0aW9uIGlzIHZlcnRpY2FsICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0aW9uIG1hdGNoZXMgYERJUkVDVElPTl9VUHxET1dOYFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBpc192ZXJ0aWNhbFxuICAgKi9cbiAgaXNWZXJ0aWNhbDogZnVuY3Rpb24gaXNWZXJ0aWNhbChkaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gZGlyZWN0aW9uID09IERJUkVDVElPTl9VUCB8fCBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0RPV047XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNldCBjc3MgcHJvcGVydGllcyB3aXRoIHRoZWlyIHByZWZpeGVzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3RvZ2dsZT10cnVlXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgc2V0UHJlZml4ZWRDc3M6IGZ1bmN0aW9uIHNldFByZWZpeGVkQ3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlLCB0b2dnbGUpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSBbJycsICdXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXTtcbiAgICBwcm9wID0gVXRpbHMudG9DYW1lbENhc2UocHJvcCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHByb3A7XG4gICAgICAvLyBwcmVmaXhlc1xuICAgICAgaWYgKHByZWZpeGVzW2ldKSB7XG4gICAgICAgIHAgPSBwcmVmaXhlc1tpXSArIHAuc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKSArIHAuc2xpY2UoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHRlc3QgdGhlIHN0eWxlXG4gICAgICBpZiAocCBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbcF0gPSAodG9nZ2xlID09PSBudWxsIHx8IHRvZ2dsZSkgJiYgdmFsdWUgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogdG9nZ2xlIGJyb3dzZXIgZGVmYXVsdCBiZWhhdmlvciBieSBzZXR0aW5nIGNzcyBwcm9wZXJ0aWVzLlxuICAgKiBgdXNlclNlbGVjdD0nbm9uZSdgIGFsc28gc2V0cyBgZWxlbWVudC5vbnNlbGVjdHN0YXJ0YCB0byBmYWxzZVxuICAgKiBgdXNlckRyYWc9J25vbmUnYCBhbHNvIHNldHMgYGVsZW1lbnQub25kcmFnc3RhcnRgIHRvIGZhbHNlXG4gICAqXG4gICAqIEBwYXJhbSB7SHRtbEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3RvZ2dsZT10cnVlXVxuICAgKi9cbiAgdG9nZ2xlQmVoYXZpb3I6IGZ1bmN0aW9uIHRvZ2dsZUJlaGF2aW9yKGVsZW1lbnQsIHByb3BzLCB0b2dnbGUpIHtcbiAgICBpZiAoIXByb3BzIHx8ICFlbGVtZW50IHx8ICFlbGVtZW50LnN0eWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0IHRoZSBjc3MgcHJvcGVydGllc1xuICAgIFV0aWxzLmVhY2gocHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICBVdGlscy5zZXRQcmVmaXhlZENzcyhlbGVtZW50LCBwcm9wLCB2YWx1ZSwgdG9nZ2xlKTtcbiAgICB9KTtcblxuICAgIHZhciBmYWxzZUZuID0gdG9nZ2xlICYmIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBhbHNvIHRoZSBkaXNhYmxlIG9uc2VsZWN0c3RhcnRcbiAgICBpZiAocHJvcHMudXNlclNlbGVjdCA9PSAnbm9uZScpIHtcbiAgICAgIGVsZW1lbnQub25zZWxlY3RzdGFydCA9IGZhbHNlRm47XG4gICAgfVxuICAgIC8vIGFuZCBkaXNhYmxlIG9uZHJhZ3N0YXJ0XG4gICAgaWYgKHByb3BzLnVzZXJEcmFnID09ICdub25lJykge1xuICAgICAgZWxlbWVudC5vbmRyYWdzdGFydCA9IGZhbHNlRm47XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0IGEgc3RyaW5nIHdpdGggdW5kZXJzY29yZXMgdG8gY2FtZWxDYXNlXG4gICAqIHNvIHByZXZlbnRfZGVmYXVsdCBiZWNvbWVzIHByZXZlbnREZWZhdWx0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybiB7U3RyaW5nfSBjYW1lbENhc2VTdHJcbiAgICovXG4gIHRvQ2FtZWxDYXNlOiBmdW5jdGlvbiB0b0NhbWVsQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tfLV0oW2Etel0pL2csIGZ1bmN0aW9uKHMpIHtcbiAgICAgIHJldHVybiBzWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICovXG4vKipcbiAqIEBjbGFzcyBFdmVudFxuICogQHN0YXRpY1xuICovXG5FdmVudCA9IEdlc3R1cmVEZXRlY3Rvci5ldmVudCA9IHtcbiAgLyoqXG4gICAqIHdoZW4gdG91Y2ggZXZlbnRzIGhhdmUgYmVlbiBmaXJlZCwgdGhpcyBpcyB0cnVlXG4gICAqIHRoaXMgaXMgdXNlZCB0byBzdG9wIG1vdXNlIGV2ZW50c1xuICAgKiBAcHJvcGVydHkgcHJldmVudF9tb3VzZWV2ZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIHByZXZlbnRNb3VzZUV2ZW50czogZmFsc2UsXG5cbiAgLyoqXG4gICAqIGlmIEVWRU5UX1NUQVJUIGhhcyBiZWVuIGZpcmVkXG4gICAqIEBwcm9wZXJ0eSBzdGFydGVkXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgc3RhcnRlZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIHdoZW4gdGhlIG1vdXNlIGlzIGhvbGQgZG93biwgdGhpcyBpcyB0cnVlXG4gICAqIEBwcm9wZXJ0eSBzaG91bGRfZGV0ZWN0XG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgc2hvdWxkRGV0ZWN0OiBmYWxzZSxcblxuICAvKipcbiAgICogc2ltcGxlIGV2ZW50IGJpbmRlciB3aXRoIGEgaG9vayBhbmQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdHlwZXNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaG9va11cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvb2sudHlwZVxuICAgKi9cbiAgb246IGZ1bmN0aW9uIG9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCwgaG9vaykge1xuICAgIHZhciB0eXBlcyA9IHR5cGUuc3BsaXQoJyAnKTtcbiAgICBVdGlscy5lYWNoKHR5cGVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBVdGlscy5vbihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcHQpO1xuICAgICAgaG9vayAmJiBob29rKHR5cGUpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgZXZlbnQgdW5iaW5kZXIgd2l0aCBhIGhvb2sgYW5kIHN1cHBvcnQgZm9yIG11bHRpcGxlIHR5cGVzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdF1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hvb2tdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBob29rLnR5cGVcbiAgICovXG4gIG9mZjogZnVuY3Rpb24gb2ZmKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCwgaG9vaykge1xuICAgIHZhciB0eXBlcyA9IHR5cGUuc3BsaXQoJyAnKTtcbiAgICBVdGlscy5lYWNoKHR5cGVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBVdGlscy5vZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0KTtcbiAgICAgIGhvb2sgJiYgaG9vayh0eXBlKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogdGhlIGNvcmUgdG91Y2ggZXZlbnQgaGFuZGxlci5cbiAgICogdGhpcyBmaW5kcyBvdXQgaWYgd2Ugc2hvdWxkIHRvIGRldGVjdCBnZXN0dXJlc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogQHJldHVybiBvblRvdWNoSGFuZGxlciB7RnVuY3Rpb259IHRoZSBjb3JlIGV2ZW50IGhhbmRsZXJcbiAgICovXG4gIG9uVG91Y2g6IGZ1bmN0aW9uIG9uVG91Y2goZWxlbWVudCwgZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgb25Ub3VjaEhhbmRsZXIgPSBmdW5jdGlvbiBvblRvdWNoSGFuZGxlcihldikge1xuICAgICAgdmFyIHNyY1R5cGUgPSBldi50eXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgaXNQb2ludGVyID0gR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTLFxuICAgICAgICAgIGlzTW91c2UgPSBVdGlscy5pblN0cihzcmNUeXBlLCAnbW91c2UnKSxcbiAgICAgICAgICB0cmlnZ2VyVHlwZTtcblxuICAgICAgLy8gaWYgd2UgYXJlIGluIGEgbW91c2VldmVudCwgYnV0IHRoZXJlIGhhcyBiZWVuIGEgdG91Y2hldmVudCB0cmlnZ2VyZWQgaW4gdGhpcyBzZXNzaW9uXG4gICAgICAvLyB3ZSB3YW50IHRvIGRvIG5vdGhpbmcuIHNpbXBseSBicmVhayBvdXQgb2YgdGhlIGV2ZW50LlxuICAgICAgaWYgKGlzTW91c2UgJiYgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMpIHtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIG1vdXNlYnV0dG9uIG11c3QgYmUgZG93blxuICAgICAgfSBlbHNlIGlmIChpc01vdXNlICYmIGV2ZW50VHlwZSA9PSBFVkVOVF9TVEFSVCAmJiBldi5idXR0b24gPT09IDApIHtcbiAgICAgICAgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc1BvaW50ZXIgJiYgZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICAgIHNlbGYuc2hvdWxkRGV0ZWN0ID0gKGV2LmJ1dHRvbnMgPT09IDEgfHwgUG9pbnRlckV2ZW50Lm1hdGNoVHlwZShQT0lOVEVSX1RPVUNILCBldikpO1xuICAgICAgICAvLyBqdXN0IGEgdmFsaWQgc3RhcnQgZXZlbnQsIGJ1dCBubyBtb3VzZVxuICAgICAgfSBlbHNlIGlmICghaXNNb3VzZSAmJiBldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgICAgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMgPSB0cnVlO1xuICAgICAgICBzZWxmLnNob3VsZERldGVjdCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgcG9pbnRlciBldmVudCBiZWZvcmUgZW50ZXJpbmcgdGhlIGRldGVjdGlvblxuICAgICAgaWYgKGlzUG9pbnRlciAmJiBldmVudFR5cGUgIT0gRVZFTlRfRU5EKSB7XG4gICAgICAgIFBvaW50ZXJFdmVudC51cGRhdGVQb2ludGVyKGV2ZW50VHlwZSwgZXYpO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSBhcmUgaW4gYSB0b3VjaC9kb3duIHN0YXRlLCBzbyBhbGxvd2VkIGRldGVjdGlvbiBvZiBnZXN0dXJlc1xuICAgICAgaWYgKHNlbGYuc2hvdWxkRGV0ZWN0KSB7XG4gICAgICAgIHRyaWdnZXJUeXBlID0gc2VsZi5kb0RldGVjdC5jYWxsKHNlbGYsIGV2LCBldmVudFR5cGUsIGVsZW1lbnQsIGhhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyAuLi5hbmQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgZGV0ZWN0aW9uXG4gICAgICAvLyBzbyByZXNldCBldmVyeXRoaW5nIHRvIHN0YXJ0IGVhY2ggZGV0ZWN0aW9uIHRvdGFsbHkgZnJlc2hcbiAgICAgIGlmICh0cmlnZ2VyVHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgICAgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSBmYWxzZTtcbiAgICAgICAgUG9pbnRlckV2ZW50LnJlc2V0KCk7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgcG9pbnRlcmV2ZW50IG9iamVjdCBhZnRlciB0aGUgZGV0ZWN0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BvaW50ZXIgJiYgZXZlbnRUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgICBQb2ludGVyRXZlbnQudXBkYXRlUG9pbnRlcihldmVudFR5cGUsIGV2KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbihlbGVtZW50LCBFVkVOVF9UWVBFU1tldmVudFR5cGVdLCBvblRvdWNoSGFuZGxlciwgb3B0KTtcbiAgICByZXR1cm4gb25Ub3VjaEhhbmRsZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHRoZSBjb3JlIGRldGVjdGlvbiBtZXRob2RcbiAgICogdGhpcyBmaW5kcyBvdXQgd2hhdCBHZXN0dXJlRGV0ZWN0b3ItdG91Y2gtZXZlbnRzIHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRyaWdnZXJUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKi9cbiAgZG9EZXRlY3Q6IGZ1bmN0aW9uIGRvRGV0ZWN0KGV2LCBldmVudFR5cGUsIGVsZW1lbnQsIGhhbmRsZXIpIHtcbiAgICB2YXIgdG91Y2hMaXN0ID0gdGhpcy5nZXRUb3VjaExpc3QoZXYsIGV2ZW50VHlwZSk7XG4gICAgdmFyIHRvdWNoTGlzdExlbmd0aCA9IHRvdWNoTGlzdC5sZW5ndGg7XG4gICAgdmFyIHRyaWdnZXJUeXBlID0gZXZlbnRUeXBlO1xuICAgIHZhciB0cmlnZ2VyQ2hhbmdlID0gdG91Y2hMaXN0LnRyaWdnZXI7IC8vIHVzZWQgYnkgZmFrZU11bHRpdG91Y2ggcGx1Z2luXG4gICAgdmFyIGNoYW5nZWRMZW5ndGggPSB0b3VjaExpc3RMZW5ndGg7XG5cbiAgICAvLyBhdCBlYWNoIHRvdWNoc3RhcnQtbGlrZSBldmVudCB3ZSB3YW50IGFsc28gd2FudCB0byB0cmlnZ2VyIGEgVE9VQ0ggZXZlbnQuLi5cbiAgICBpZiAoZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlID0gRVZFTlRfVE9VQ0g7XG4gICAgICAvLyAuLi50aGUgc2FtZSBmb3IgYSB0b3VjaGVuZC1saWtlIGV2ZW50XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gRVZFTlRfRU5EKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlID0gRVZFTlRfUkVMRUFTRTtcblxuICAgICAgLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSB0b3VjaGVzIGhhdmUgYmVlbiByZW1vdmVkXG4gICAgICBjaGFuZ2VkTGVuZ3RoID0gdG91Y2hMaXN0Lmxlbmd0aCAtICgoZXYuY2hhbmdlZFRvdWNoZXMpID8gZXYuY2hhbmdlZFRvdWNoZXMubGVuZ3RoIDogMSk7XG4gICAgfVxuXG4gICAgLy8gYWZ0ZXIgdGhlcmUgYXJlIHN0aWxsIHRvdWNoZXMgb24gdGhlIHNjcmVlbixcbiAgICAvLyB3ZSBqdXN0IHdhbnQgdG8gdHJpZ2dlciBhIE1PVkUgZXZlbnQuIHNvIGNoYW5nZSB0aGUgU1RBUlQgb3IgRU5EIHRvIGEgTU9WRVxuICAgIC8vIGJ1dCBvbmx5IGFmdGVyIGRldGVjdGlvbiBoYXMgYmVlbiBzdGFydGVkLCB0aGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSB3YW50IGEgU1RBUlRcbiAgICBpZiAoY2hhbmdlZExlbmd0aCA+IDAgJiYgdGhpcy5zdGFydGVkKSB7XG4gICAgICB0cmlnZ2VyVHlwZSA9IEVWRU5UX01PVkU7XG4gICAgfVxuXG4gICAgLy8gZGV0ZWN0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQsIHdlIGtlZXAgdHJhY2sgb2YgdGhpcywgc2VlIGFib3ZlXG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcblxuICAgIC8vIGdlbmVyYXRlIHNvbWUgZXZlbnQgZGF0YSwgc29tZSBiYXNpYyBpbmZvcm1hdGlvblxuICAgIHZhciBldkRhdGEgPSB0aGlzLmNvbGxlY3RFdmVudERhdGEoZWxlbWVudCwgdHJpZ2dlclR5cGUsIHRvdWNoTGlzdCwgZXYpO1xuXG4gICAgLy8gdHJpZ2dlciB0aGUgdHJpZ2dlclR5cGUgZXZlbnQgYmVmb3JlIHRoZSBjaGFuZ2UgKFRPVUNILCBSRUxFQVNFKSBldmVudHNcbiAgICAvLyBidXQgdGhlIEVORCBldmVudCBzaG91bGQgYmUgYXQgbGFzdFxuICAgIGlmIChldmVudFR5cGUgIT0gRVZFTlRfRU5EKSB7XG4gICAgICBoYW5kbGVyLmNhbGwoRGV0ZWN0aW9uLCBldkRhdGEpO1xuICAgIH1cblxuICAgIC8vIHRyaWdnZXIgYSBjaGFuZ2UgKFRPVUNILCBSRUxFQVNFKSBldmVudCwgdGhpcyBtZWFucyB0aGUgbGVuZ3RoIG9mIHRoZSB0b3VjaGVzIGNoYW5nZWRcbiAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xuICAgICAgZXZEYXRhLmNoYW5nZWRMZW5ndGggPSBjaGFuZ2VkTGVuZ3RoO1xuICAgICAgZXZEYXRhLmV2ZW50VHlwZSA9IHRyaWdnZXJDaGFuZ2U7XG5cbiAgICAgIGhhbmRsZXIuY2FsbChEZXRlY3Rpb24sIGV2RGF0YSk7XG5cbiAgICAgIGV2RGF0YS5ldmVudFR5cGUgPSB0cmlnZ2VyVHlwZTtcbiAgICAgIGRlbGV0ZSBldkRhdGEuY2hhbmdlZExlbmd0aDtcbiAgICB9XG5cbiAgICAvLyB0cmlnZ2VyIHRoZSBFTkQgZXZlbnRcbiAgICBpZiAodHJpZ2dlclR5cGUgPT0gRVZFTlRfRU5EKSB7XG4gICAgICBoYW5kbGVyLmNhbGwoRGV0ZWN0aW9uLCBldkRhdGEpO1xuXG4gICAgICAvLyAuLi5hbmQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgZGV0ZWN0aW9uXG4gICAgICAvLyBzbyByZXNldCBldmVyeXRoaW5nIHRvIHN0YXJ0IGVhY2ggZGV0ZWN0aW9uIHRvdGFsbHkgZnJlc2hcbiAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cmlnZ2VyVHlwZTtcbiAgfSxcblxuICAvKipcbiAgICogd2UgaGF2ZSBkaWZmZXJlbnQgZXZlbnRzIGZvciBlYWNoIGRldmljZS9icm93c2VyXG4gICAqIGRldGVybWluZSB3aGF0IHdlIG5lZWQgYW5kIHNldCB0aGVtIGluIHRoZSBFVkVOVF9UWVBFUyBjb25zdGFudFxuICAgKiB0aGUgYG9uVG91Y2hgIG1ldGhvZCBpcyBiaW5kIHRvIHRoZXNlIHByb3BlcnRpZXMuXG4gICAqIEByZXR1cm4ge09iamVjdH0gZXZlbnRzXG4gICAqL1xuICBkZXRlcm1pbmVFdmVudFR5cGVzOiBmdW5jdGlvbiBkZXRlcm1pbmVFdmVudFR5cGVzKCkge1xuICAgIHZhciB0eXBlcztcbiAgICBpZiAoR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTKSB7XG4gICAgICBpZiAod2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgICAgICB0eXBlcyA9IFtcbiAgICAgICAgICAncG9pbnRlcmRvd24nLFxuICAgICAgICAgICdwb2ludGVybW92ZScsXG4gICAgICAgICAgJ3BvaW50ZXJ1cCBwb2ludGVyY2FuY2VsIGxvc3Rwb2ludGVyY2FwdHVyZSdcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVzID0gW1xuICAgICAgICAgICdNU1BvaW50ZXJEb3duJyxcbiAgICAgICAgICAnTVNQb2ludGVyTW92ZScsXG4gICAgICAgICAgJ01TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCBNU0xvc3RQb2ludGVyQ2FwdHVyZSdcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEdlc3R1cmVEZXRlY3Rvci5OT19NT1VTRUVWRU5UUykge1xuICAgICAgdHlwZXMgPSBbXG4gICAgICAgICd0b3VjaHN0YXJ0JyxcbiAgICAgICAgJ3RvdWNobW92ZScsXG4gICAgICAgICd0b3VjaGVuZCB0b3VjaGNhbmNlbCdcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVzID0gW1xuICAgICAgICAndG91Y2hzdGFydCBtb3VzZWRvd24nLFxuICAgICAgICAndG91Y2htb3ZlIG1vdXNlbW92ZScsXG4gICAgICAgICd0b3VjaGVuZCB0b3VjaGNhbmNlbCBtb3VzZXVwJ1xuICAgICAgXTtcbiAgICB9XG5cbiAgICBFVkVOVF9UWVBFU1tFVkVOVF9TVEFSVF0gPSB0eXBlc1swXTtcbiAgICBFVkVOVF9UWVBFU1tFVkVOVF9NT1ZFXSA9IHR5cGVzWzFdO1xuICAgIEVWRU5UX1RZUEVTW0VWRU5UX0VORF0gPSB0eXBlc1syXTtcbiAgICByZXR1cm4gRVZFTlRfVFlQRVM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNyZWF0ZSB0b3VjaExpc3QgZGVwZW5kaW5nIG9uIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcmV0dXJuIHtBcnJheX0gdG91Y2hlc1xuICAgKi9cbiAgZ2V0VG91Y2hMaXN0OiBmdW5jdGlvbiBnZXRUb3VjaExpc3QoZXYsIGV2ZW50VHlwZSkge1xuICAgIC8vIGdldCB0aGUgZmFrZSBwb2ludGVyRXZlbnQgdG91Y2hsaXN0XG4gICAgaWYgKEdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUykge1xuICAgICAgcmV0dXJuIFBvaW50ZXJFdmVudC5nZXRUb3VjaExpc3QoKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIHRvdWNobGlzdFxuICAgIGlmIChldi50b3VjaGVzKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09IEVWRU5UX01PVkUpIHtcbiAgICAgICAgcmV0dXJuIGV2LnRvdWNoZXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICAgICAgdmFyIGNvbmNhdCA9IFtdLmNvbmNhdChVdGlscy50b0FycmF5KGV2LnRvdWNoZXMpLCBVdGlscy50b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKSk7XG4gICAgICB2YXIgdG91Y2hMaXN0ID0gW107XG5cbiAgICAgIFV0aWxzLmVhY2goY29uY2F0LCBmdW5jdGlvbih0b3VjaCkge1xuICAgICAgICBpZiAoVXRpbHMuaW5BcnJheShpZGVudGlmaWVycywgdG91Y2guaWRlbnRpZmllcikgPT09IC0xKSB7XG4gICAgICAgICAgdG91Y2hMaXN0LnB1c2godG91Y2gpO1xuICAgICAgICB9XG4gICAgICAgIGlkZW50aWZpZXJzLnB1c2godG91Y2guaWRlbnRpZmllcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRvdWNoTGlzdDtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGZha2UgdG91Y2hMaXN0IGZyb20gbW91c2UgcG9zaXRpb25cbiAgICBldi5pZGVudGlmaWVyID0gMTtcbiAgICByZXR1cm4gW2V2XTtcbiAgfSxcblxuICAvKipcbiAgICogY29sbGVjdCBiYXNpYyBldmVudCBkYXRhXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZSBtYXRjaGVzIGBFVkVOVF9TVEFSVHxNT1ZFfEVORGBcbiAgICogQHBhcmFtIHtBcnJheX0gdG91Y2hlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHJldHVybiB7T2JqZWN0fSBldlxuICAgKi9cbiAgY29sbGVjdEV2ZW50RGF0YTogZnVuY3Rpb24gY29sbGVjdEV2ZW50RGF0YShlbGVtZW50LCBldmVudFR5cGUsIHRvdWNoZXMsIGV2KSB7XG4gICAgLy8gZmluZCBvdXQgcG9pbnRlclR5cGVcbiAgICB2YXIgcG9pbnRlclR5cGUgPSBQT0lOVEVSX1RPVUNIO1xuICAgIGlmIChVdGlscy5pblN0cihldi50eXBlLCAnbW91c2UnKSB8fCBQb2ludGVyRXZlbnQubWF0Y2hUeXBlKFBPSU5URVJfTU9VU0UsIGV2KSkge1xuICAgICAgcG9pbnRlclR5cGUgPSBQT0lOVEVSX01PVVNFO1xuICAgIH0gZWxzZSBpZiAoUG9pbnRlckV2ZW50Lm1hdGNoVHlwZShQT0lOVEVSX1BFTiwgZXYpKSB7XG4gICAgICBwb2ludGVyVHlwZSA9IFBPSU5URVJfUEVOO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjZW50ZXI6IFV0aWxzLmdldENlbnRlcih0b3VjaGVzKSxcbiAgICAgIHRpbWVTdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHRhcmdldDogZXYudGFyZ2V0LFxuICAgICAgdG91Y2hlczogdG91Y2hlcyxcbiAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgcG9pbnRlclR5cGU6IHBvaW50ZXJUeXBlLFxuICAgICAgc3JjRXZlbnQ6IGV2LFxuXG4gICAgICAvKipcbiAgICAgICAqIHByZXZlbnQgdGhlIGJyb3dzZXIgZGVmYXVsdCBhY3Rpb25zXG4gICAgICAgKiBtb3N0bHkgdXNlZCB0byBkaXNhYmxlIHNjcm9sbGluZyBvZiB0aGUgYnJvd3NlclxuICAgICAgICovXG4gICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzcmNFdmVudCA9IHRoaXMuc3JjRXZlbnQ7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnRNYW5pcHVsYXRpb24gJiYgc3JjRXZlbnQucHJldmVudE1hbmlwdWxhdGlvbigpO1xuICAgICAgICBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCAmJiBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBzdG9wIGJ1YmJsaW5nIHRoZSBldmVudCB1cCB0byBpdHMgcGFyZW50c1xuICAgICAgICovXG4gICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNyY0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBpbW1lZGlhdGVseSBzdG9wIGdlc3R1cmUgZGV0ZWN0aW9uXG4gICAgICAgKiBtaWdodCBiZSB1c2VmdWwgYWZ0ZXIgYSBzd2lwZSB3YXMgZGV0ZWN0ZWRcbiAgICAgICAqIEByZXR1cm4geyp9XG4gICAgICAgKi9cbiAgICAgIHN0b3BEZXRlY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRGV0ZWN0aW9uLnN0b3BEZXRlY3QoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqXG4gKiBAY2xhc3MgUG9pbnRlckV2ZW50XG4gKiBAc3RhdGljXG4gKi9cblBvaW50ZXJFdmVudCA9IEdlc3R1cmVEZXRlY3Rvci5Qb2ludGVyRXZlbnQgPSB7XG4gIC8qKlxuICAgKiBob2xkcyBhbGwgcG9pbnRlcnMsIGJ5IGBpZGVudGlmaWVyYFxuICAgKiBAcHJvcGVydHkgcG9pbnRlcnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHBvaW50ZXJzOiB7fSxcblxuICAvKipcbiAgICogZ2V0IHRoZSBwb2ludGVycyBhcyBhbiBhcnJheVxuICAgKiBAcmV0dXJuIHtBcnJheX0gdG91Y2hsaXN0XG4gICAqL1xuICBnZXRUb3VjaExpc3Q6IGZ1bmN0aW9uIGdldFRvdWNoTGlzdCgpIHtcbiAgICB2YXIgdG91Y2hsaXN0ID0gW107XG4gICAgLy8gd2UgY2FuIHVzZSBmb3JFYWNoIHNpbmNlIHBvaW50ZXJFdmVudHMgb25seSBpcyBpbiBJRTEwXG4gICAgVXRpbHMuZWFjaCh0aGlzLnBvaW50ZXJzLCBmdW5jdGlvbihwb2ludGVyKSB7XG4gICAgICB0b3VjaGxpc3QucHVzaChwb2ludGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hsaXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiB1cGRhdGUgdGhlIHBvc2l0aW9uIG9mIGEgcG9pbnRlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKiBAcGFyYW0ge09iamVjdH0gcG9pbnRlckV2ZW50XG4gICAqL1xuICB1cGRhdGVQb2ludGVyOiBmdW5jdGlvbiB1cGRhdGVQb2ludGVyKGV2ZW50VHlwZSwgcG9pbnRlckV2ZW50KSB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PSBFVkVOVF9FTkQgfHwgKGV2ZW50VHlwZSAhPSBFVkVOVF9FTkQgJiYgcG9pbnRlckV2ZW50LmJ1dHRvbnMgIT09IDEpKSB7XG4gICAgICBkZWxldGUgdGhpcy5wb2ludGVyc1twb2ludGVyRXZlbnQucG9pbnRlcklkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRlckV2ZW50LmlkZW50aWZpZXIgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgdGhpcy5wb2ludGVyc1twb2ludGVyRXZlbnQucG9pbnRlcklkXSA9IHBvaW50ZXJFdmVudDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNoZWNrIGlmIGV2IG1hdGNoZXMgcG9pbnRlcnR5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBvaW50ZXJUeXBlIG1hdGNoZXMgYFBPSU5URVJfTU9VU0V8VE9VQ0h8UEVOYFxuICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gZXZcbiAgICovXG4gIG1hdGNoVHlwZTogZnVuY3Rpb24gbWF0Y2hUeXBlKHBvaW50ZXJUeXBlLCBldikge1xuICAgIGlmICghZXYucG9pbnRlclR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHQgPSBldi5wb2ludGVyVHlwZSxcbiAgICAgICAgdHlwZXMgPSB7fTtcblxuICAgIHR5cGVzW1BPSU5URVJfTU9VU0VdID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfTU9VU0UgfHwgUE9JTlRFUl9NT1VTRSkpO1xuICAgIHR5cGVzW1BPSU5URVJfVE9VQ0hdID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfVE9VQ0ggfHwgUE9JTlRFUl9UT1VDSCkpO1xuICAgIHR5cGVzW1BPSU5URVJfUEVOXSA9IChwdCA9PT0gKGV2Lk1TUE9JTlRFUl9UWVBFX1BFTiB8fCBQT0lOVEVSX1BFTikpO1xuICAgIHJldHVybiB0eXBlc1twb2ludGVyVHlwZV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlc2V0IHRoZSBzdG9yZWQgcG9pbnRlcnNcbiAgICovXG4gIHJlc2V0OiBmdW5jdGlvbiByZXNldExpc3QoKSB7XG4gICAgdGhpcy5wb2ludGVycyA9IHt9O1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqXG4gKiBAY2xhc3MgRGV0ZWN0aW9uXG4gKiBAc3RhdGljXG4gKi9cbkRldGVjdGlvbiA9IEdlc3R1cmVEZXRlY3Rvci5kZXRlY3Rpb24gPSB7XG4gIC8vIGNvbnRhaW5zIGFsbCByZWdpc3RlcmVkIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcyBpbiB0aGUgY29ycmVjdCBvcmRlclxuICBnZXN0dXJlczogW10sXG5cbiAgLy8gZGF0YSBvZiB0aGUgY3VycmVudCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBkZXRlY3Rpb24gc2Vzc2lvblxuICBjdXJyZW50OiBudWxsLFxuXG4gIC8vIHRoZSBwcmV2aW91cyBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBzZXNzaW9uIGRhdGFcbiAgLy8gaXMgYSBmdWxsIGNsb25lIG9mIHRoZSBwcmV2aW91cyBnZXN0dXJlLmN1cnJlbnQgb2JqZWN0XG4gIHByZXZpb3VzOiBudWxsLFxuXG4gIC8vIHdoZW4gdGhpcyBiZWNvbWVzIHRydWUsIG5vIGdlc3R1cmVzIGFyZSBmaXJlZFxuICBzdG9wcGVkOiBmYWxzZSxcblxuICAvKipcbiAgICogc3RhcnQgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSB7R2VzdHVyZURldGVjdG9yLkluc3RhbmNlfSBpbnN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudERhdGFcbiAgICovXG4gIHN0YXJ0RGV0ZWN0OiBmdW5jdGlvbiBzdGFydERldGVjdChpbnN0LCBldmVudERhdGEpIHtcbiAgICAvLyBhbHJlYWR5IGJ1c3kgd2l0aCBhIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGRldGVjdGlvbiBvbiBhbiBlbGVtZW50XG4gICAgaWYgKHRoaXMuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuXG4gICAgLy8gaG9sZHMgY3VycmVudCBzZXNzaW9uXG4gICAgdGhpcy5jdXJyZW50ID0ge1xuICAgICAgaW5zdDogaW5zdCwgLy8gcmVmZXJlbmNlIHRvIEdlc3R1cmVEZXRlY3Rvckluc3RhbmNlIHdlJ3JlIHdvcmtpbmcgZm9yXG4gICAgICBzdGFydEV2ZW50OiBVdGlscy5leHRlbmQoe30sIGV2ZW50RGF0YSksIC8vIHN0YXJ0IGV2ZW50RGF0YSBmb3IgZGlzdGFuY2VzLCB0aW1pbmcgZXRjXG4gICAgICBsYXN0RXZlbnQ6IGZhbHNlLCAvLyBsYXN0IGV2ZW50RGF0YVxuICAgICAgbGFzdENhbGNFdmVudDogZmFsc2UsIC8vIGxhc3QgZXZlbnREYXRhIGZvciBjYWxjdWxhdGlvbnMuXG4gICAgICBmdXR1cmVDYWxjRXZlbnQ6IGZhbHNlLCAvLyBsYXN0IGV2ZW50RGF0YSBmb3IgY2FsY3VsYXRpb25zLlxuICAgICAgbGFzdENhbGNEYXRhOiB7fSwgLy8gbGFzdCBsYXN0Q2FsY0RhdGFcbiAgICAgIG5hbWU6ICcnIC8vIGN1cnJlbnQgZ2VzdHVyZSB3ZSdyZSBpbi9kZXRlY3RlZCwgY2FuIGJlICd0YXAnLCAnaG9sZCcgZXRjXG4gICAgfTtcblxuICAgIHRoaXMuZGV0ZWN0KGV2ZW50RGF0YSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGRldGVjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnREYXRhXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGRldGVjdDogZnVuY3Rpb24gZGV0ZWN0KGV2ZW50RGF0YSkge1xuICAgIGlmICghdGhpcy5jdXJyZW50IHx8IHRoaXMuc3RvcHBlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGV4dGVuZCBldmVudCBkYXRhIHdpdGggY2FsY3VsYXRpb25zIGFib3V0IHNjYWxlLCBkaXN0YW5jZSBldGNcbiAgICBldmVudERhdGEgPSB0aGlzLmV4dGVuZEV2ZW50RGF0YShldmVudERhdGEpO1xuXG4gICAgLy8gR2VzdHVyZURldGVjdG9yIGluc3RhbmNlIGFuZCBpbnN0YW5jZSBvcHRpb25zXG4gICAgdmFyIGluc3QgPSB0aGlzLmN1cnJlbnQuaW5zdCxcbiAgICAgICAgaW5zdE9wdGlvbnMgPSBpbnN0Lm9wdGlvbnM7XG5cbiAgICAvLyBjYWxsIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGhhbmRsZXJzXG4gICAgVXRpbHMuZWFjaCh0aGlzLmdlc3R1cmVzLCBmdW5jdGlvbiB0cmlnZ2VyR2VzdHVyZShnZXN0dXJlKSB7XG4gICAgICAvLyBvbmx5IHdoZW4gdGhlIGluc3RhbmNlIG9wdGlvbnMgaGF2ZSBlbmFibGVkIHRoaXMgZ2VzdHVyZVxuICAgICAgaWYgKCF0aGlzLnN0b3BwZWQgJiYgaW5zdC5lbmFibGVkICYmIGluc3RPcHRpb25zW2dlc3R1cmUubmFtZV0pIHtcbiAgICAgICAgZ2VzdHVyZS5oYW5kbGVyLmNhbGwoZ2VzdHVyZSwgZXZlbnREYXRhLCBpbnN0KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIC8vIHN0b3JlIGFzIHByZXZpb3VzIGV2ZW50IGV2ZW50XG4gICAgaWYgKHRoaXMuY3VycmVudCkge1xuICAgICAgdGhpcy5jdXJyZW50Lmxhc3RFdmVudCA9IGV2ZW50RGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnREYXRhLmV2ZW50VHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgIHRoaXMuc3RvcERldGVjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBldmVudERhdGE7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgfSxcblxuICAvKipcbiAgICogY2xlYXIgdGhlIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIHZhcnNcbiAgICogdGhpcyBpcyBjYWxsZWQgb24gZW5kRGV0ZWN0LCBidXQgY2FuIGFsc28gYmUgdXNlZCB3aGVuIGEgZmluYWwgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgaGFzIGJlZW4gZGV0ZWN0ZWRcbiAgICogdG8gc3RvcCBvdGhlciBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMgZnJvbSBiZWluZyBmaXJlZFxuICAgKi9cbiAgc3RvcERldGVjdDogZnVuY3Rpb24gc3RvcERldGVjdCgpIHtcbiAgICAvLyBjbG9uZSBjdXJyZW50IGRhdGEgdG8gdGhlIHN0b3JlIGFzIHRoZSBwcmV2aW91cyBnZXN0dXJlXG4gICAgLy8gdXNlZCBmb3IgdGhlIGRvdWJsZSB0YXAgZ2VzdHVyZSwgc2luY2UgdGhpcyBpcyBhbiBvdGhlciBnZXN0dXJlIGRldGVjdCBzZXNzaW9uXG4gICAgdGhpcy5wcmV2aW91cyA9IFV0aWxzLmV4dGVuZCh7fSwgdGhpcy5jdXJyZW50KTtcblxuICAgIC8vIHJlc2V0IHRoZSBjdXJyZW50XG4gICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdmVsb2NpdHksIGFuZ2xlIGFuZCBkaXJlY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZW50ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhVGltZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFYXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVlcbiAgICovXG4gIGdldENhbGN1bGF0ZWREYXRhOiBmdW5jdGlvbiBnZXRDYWxjdWxhdGVkRGF0YShldiwgY2VudGVyLCBkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKSB7XG4gICAgdmFyIGN1ciA9IHRoaXMuY3VycmVudCxcbiAgICAgICAgcmVjYWxjID0gZmFsc2UsXG4gICAgICAgIGNhbGNFdiA9IGN1ci5sYXN0Q2FsY0V2ZW50LFxuICAgICAgICBjYWxjRGF0YSA9IGN1ci5sYXN0Q2FsY0RhdGE7XG5cbiAgICBpZiAoY2FsY0V2ICYmIGV2LnRpbWVTdGFtcCAtIGNhbGNFdi50aW1lU3RhbXAgPiBHZXN0dXJlRGV0ZWN0b3IuQ0FMQ1VMQVRFX0lOVEVSVkFMKSB7XG4gICAgICBjZW50ZXIgPSBjYWxjRXYuY2VudGVyO1xuICAgICAgZGVsdGFUaW1lID0gZXYudGltZVN0YW1wIC0gY2FsY0V2LnRpbWVTdGFtcDtcbiAgICAgIGRlbHRhWCA9IGV2LmNlbnRlci5jbGllbnRYIC0gY2FsY0V2LmNlbnRlci5jbGllbnRYO1xuICAgICAgZGVsdGFZID0gZXYuY2VudGVyLmNsaWVudFkgLSBjYWxjRXYuY2VudGVyLmNsaWVudFk7XG4gICAgICByZWNhbGMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0ggfHwgZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgIGN1ci5mdXR1cmVDYWxjRXZlbnQgPSBldjtcbiAgICB9XG5cbiAgICBpZiAoIWN1ci5sYXN0Q2FsY0V2ZW50IHx8IHJlY2FsYykge1xuICAgICAgY2FsY0RhdGEudmVsb2NpdHkgPSBVdGlscy5nZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgIGNhbGNEYXRhLmFuZ2xlID0gVXRpbHMuZ2V0QW5nbGUoY2VudGVyLCBldi5jZW50ZXIpO1xuICAgICAgY2FsY0RhdGEuZGlyZWN0aW9uID0gVXRpbHMuZ2V0RGlyZWN0aW9uKGNlbnRlciwgZXYuY2VudGVyKTtcblxuICAgICAgY3VyLmxhc3RDYWxjRXZlbnQgPSBjdXIuZnV0dXJlQ2FsY0V2ZW50IHx8IGV2O1xuICAgICAgY3VyLmZ1dHVyZUNhbGNFdmVudCA9IGV2O1xuICAgIH1cblxuICAgIGV2LnZlbG9jaXR5WCA9IGNhbGNEYXRhLnZlbG9jaXR5Lng7XG4gICAgZXYudmVsb2NpdHlZID0gY2FsY0RhdGEudmVsb2NpdHkueTtcbiAgICBldi5pbnRlcmltQW5nbGUgPSBjYWxjRGF0YS5hbmdsZTtcbiAgICBldi5pbnRlcmltRGlyZWN0aW9uID0gY2FsY0RhdGEuZGlyZWN0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBleHRlbmQgZXZlbnREYXRhIGZvciBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEByZXR1cm4ge09iamVjdH0gZXZcbiAgICovXG4gIGV4dGVuZEV2ZW50RGF0YTogZnVuY3Rpb24gZXh0ZW5kRXZlbnREYXRhKGV2KSB7XG4gICAgdmFyIGN1ciA9IHRoaXMuY3VycmVudCxcbiAgICAgICAgc3RhcnRFdiA9IGN1ci5zdGFydEV2ZW50LFxuICAgICAgICBsYXN0RXYgPSBjdXIubGFzdEV2ZW50IHx8IHN0YXJ0RXY7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHN0YXJ0IHRvdWNobGlzdCB0byBjYWxjdWxhdGUgdGhlIHNjYWxlL3JvdGF0aW9uXG4gICAgaWYgKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCB8fCBldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgc3RhcnRFdi50b3VjaGVzID0gW107XG4gICAgICBVdGlscy5lYWNoKGV2LnRvdWNoZXMsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIHN0YXJ0RXYudG91Y2hlcy5wdXNoKHtcbiAgICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFlcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgZGVsdGFUaW1lID0gZXYudGltZVN0YW1wIC0gc3RhcnRFdi50aW1lU3RhbXAsXG4gICAgICAgIGRlbHRhWCA9IGV2LmNlbnRlci5jbGllbnRYIC0gc3RhcnRFdi5jZW50ZXIuY2xpZW50WCxcbiAgICAgICAgZGVsdGFZID0gZXYuY2VudGVyLmNsaWVudFkgLSBzdGFydEV2LmNlbnRlci5jbGllbnRZO1xuXG4gICAgdGhpcy5nZXRDYWxjdWxhdGVkRGF0YShldiwgbGFzdEV2LmNlbnRlciwgZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICBVdGlscy5leHRlbmQoZXYsIHtcbiAgICAgIHN0YXJ0RXZlbnQ6IHN0YXJ0RXYsXG5cbiAgICAgIGRlbHRhVGltZTogZGVsdGFUaW1lLFxuICAgICAgZGVsdGFYOiBkZWx0YVgsXG4gICAgICBkZWx0YVk6IGRlbHRhWSxcblxuICAgICAgZGlzdGFuY2U6IFV0aWxzLmdldERpc3RhbmNlKHN0YXJ0RXYuY2VudGVyLCBldi5jZW50ZXIpLFxuICAgICAgYW5nbGU6IFV0aWxzLmdldEFuZ2xlKHN0YXJ0RXYuY2VudGVyLCBldi5jZW50ZXIpLFxuICAgICAgZGlyZWN0aW9uOiBVdGlscy5nZXREaXJlY3Rpb24oc3RhcnRFdi5jZW50ZXIsIGV2LmNlbnRlciksXG4gICAgICBzY2FsZTogVXRpbHMuZ2V0U2NhbGUoc3RhcnRFdi50b3VjaGVzLCBldi50b3VjaGVzKSxcbiAgICAgIHJvdGF0aW9uOiBVdGlscy5nZXRSb3RhdGlvbihzdGFydEV2LnRvdWNoZXMsIGV2LnRvdWNoZXMpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXY7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlZ2lzdGVyIG5ldyBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBnZXN0dXJlIG9iamVjdCwgc2VlIGBnZXN0dXJlcy9gIGZvciBkb2N1bWVudGF0aW9uXG4gICAqIEByZXR1cm4ge0FycmF5fSBnZXN0dXJlc1xuICAgKi9cbiAgcmVnaXN0ZXI6IGZ1bmN0aW9uIHJlZ2lzdGVyKGdlc3R1cmUpIHtcbiAgICAvLyBhZGQgYW4gZW5hYmxlIGdlc3R1cmUgb3B0aW9ucyBpZiB0aGVyZSBpcyBubyBnaXZlblxuICAgIHZhciBvcHRpb25zID0gZ2VzdHVyZS5kZWZhdWx0cyB8fCB7fTtcbiAgICBpZiAob3B0aW9uc1tnZXN0dXJlLm5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnNbZ2VzdHVyZS5uYW1lXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gZXh0ZW5kIEdlc3R1cmVEZXRlY3RvciBkZWZhdWx0IG9wdGlvbnMgd2l0aCB0aGUgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgb3B0aW9uc1xuICAgIFV0aWxzLmV4dGVuZChHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMsIG9wdGlvbnMsIHRydWUpO1xuXG4gICAgLy8gc2V0IGl0cyBpbmRleFxuICAgIGdlc3R1cmUuaW5kZXggPSBnZXN0dXJlLmluZGV4IHx8IDEwMDA7XG5cbiAgICAvLyBhZGQgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgdG8gdGhlIGxpc3RcbiAgICB0aGlzLmdlc3R1cmVzLnB1c2goZ2VzdHVyZSk7XG5cbiAgICAvLyBzb3J0IHRoZSBsaXN0IGJ5IGluZGV4XG4gICAgdGhpcy5nZXN0dXJlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgIGlmIChhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAoYS5pbmRleCA+IGIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmdlc3R1cmVzO1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqL1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgR2VzdHVyZURldGVjdG9yIGluc3RhbmNlXG4gKiBhbGwgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHRoZSBpbnN0YW5jZSBpdHNlbGYsIHNvIGl0IGlzIGNoYWluYWJsZS5cbiAqXG4gKiBAY2xhc3MgSW5zdGFuY2VcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBvcHRpb25zIGFyZSBtZXJnZWQgd2l0aCBgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzYFxuICogQHJldHVybiB7R2VzdHVyZURldGVjdG9yLkluc3RhbmNlfVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxpc3RlbmVyT3B0aW9ucyA9IChvcHRpb25zICYmIG9wdGlvbnMucGFzc2l2ZSkgPyB7IHBhc3NpdmU6IHRydWUgfSA6IHVuZGVmaW5lZDtcblxuICAvLyBzZXR1cCBHZXN0dXJlRGV0ZWN0b3JKUyB3aW5kb3cgZXZlbnRzIGFuZCByZWdpc3RlciBhbGwgZ2VzdHVyZXNcbiAgLy8gdGhpcyBhbHNvIHNldHMgdXAgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICBzZXR1cChsaXN0ZW5lck9wdGlvbnMpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZWxlbWVudFxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZW5hYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogb3B0aW9ucywgbWVyZ2VkIHdpdGggdGhlIGRlZmF1bHRzXG4gICAqIG9wdGlvbnMgd2l0aCBhbiBfIGFyZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBVdGlscy5lYWNoKG9wdGlvbnMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgZGVsZXRlIG9wdGlvbnNbbmFtZV07XG4gICAgb3B0aW9uc1tVdGlscy50b0NhbWVsQ2FzZShuYW1lKV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgdGhpcy5vcHRpb25zID0gVXRpbHMuZXh0ZW5kKFV0aWxzLmV4dGVuZCh7fSwgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzKSwgb3B0aW9ucyB8fCB7fSk7XG4gIHRoaXMub3B0aW9ucy5saXN0ZW5lck9wdGlvbnMgPSBsaXN0ZW5lck9wdGlvbnM7XG5cbiAgLy8gYWRkIHNvbWUgY3NzIHRvIHRoZSBlbGVtZW50IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIgZnJvbSBkb2luZyBpdHMgbmF0aXZlIGJlaGF2aW9yXG4gIGlmICh0aGlzLm9wdGlvbnMuYmVoYXZpb3IpIHtcbiAgICBVdGlscy50b2dnbGVCZWhhdmlvcih0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5iZWhhdmlvciwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogZXZlbnQgc3RhcnQgaGFuZGxlciBvbiB0aGUgZWxlbWVudCB0byBzdGFydCB0aGUgZGV0ZWN0aW9uXG4gICAqIEBwcm9wZXJ0eSBldmVudFN0YXJ0SGFuZGxlclxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgdGhpcy5ldmVudFN0YXJ0SGFuZGxlciA9IEV2ZW50Lm9uVG91Y2goZWxlbWVudCwgRVZFTlRfU1RBUlQsIGZ1bmN0aW9uKGV2KSB7XG4gICAgaWYgKHNlbGYuZW5hYmxlZCAmJiBldi5ldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgIERldGVjdGlvbi5zdGFydERldGVjdChzZWxmLCBldik7XG4gICAgfSBlbHNlIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0gpIHtcbiAgICAgIERldGVjdGlvbi5kZXRlY3QoZXYpO1xuICAgIH1cbiAgfSwgbGlzdGVuZXJPcHRpb25zKTtcblxuICAvKipcbiAgICoga2VlcCBhIGxpc3Qgb2YgdXNlciBldmVudCBoYW5kbGVycyB3aGljaCBuZWVkcyB0byBiZSByZW1vdmVkIHdoZW4gY2FsbGluZyAnZGlzcG9zZSdcbiAgICogQHByb3BlcnR5IGV2ZW50SGFuZGxlcnNcbiAgICogQHR5cGUge0FycmF5fVxuICAgKi9cbiAgdGhpcy5ldmVudEhhbmRsZXJzID0gW107XG59O1xuXG5HZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQG1ldGhvZCBvblxuICAgKiBAc2lnbmF0dXJlIG9uKGdlc3R1cmVzLCBoYW5kbGVyKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1BZGRzIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGEgZ2VzdHVyZS4gQXZhaWxhYmxlIGdlc3R1cmVzIGFyZTogZHJhZywgZHJhZ2xlZnQsIGRyYWdyaWdodCwgZHJhZ3VwLCBkcmFnZG93biwgaG9sZCwgcmVsZWFzZSwgc3dpcGUsIHN3aXBlbGVmdCwgc3dpcGVyaWdodCwgc3dpcGV1cCwgc3dpcGVkb3duLCB0YXAsIGRvdWJsZXRhcCwgdG91Y2gsIHRyYW5zZm9ybSwgcGluY2gsIHBpbmNoaW4sIHBpbmNob3V0IGFuZCByb3RhdGUuIFsvZW5dXG4gICAqICBbamFd44K444Kn44K544OB44Oj44Gr5a++44GZ44KL44Kk44OZ44Oz44OI44OP44Oz44OJ44Op44KS6L+95Yqg44GX44G+44GZ44CC5oyH5a6a44Gn44GN44KL44K444Kn44K544OB44Oj5ZCN44Gv44CBZHJhZyBkcmFnbGVmdCBkcmFncmlnaHQgZHJhZ3VwIGRyYWdkb3duIGhvbGQgcmVsZWFzZSBzd2lwZSBzd2lwZWxlZnQgc3dpcGVyaWdodCBzd2lwZXVwIHN3aXBlZG93biB0YXAgZG91YmxldGFwIHRvdWNoIHRyYW5zZm9ybSBwaW5jaCBwaW5jaGluIHBpbmNob3V0IHJvdGF0ZSDjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZ2VzdHVyZXNcbiAgICogICBbZW5dQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBnZXN0dXJlcy5bL2VuXVxuICAgKiAgIFtqYV3mpJznn6XjgZnjgovjgrjjgqfjgrnjg4Hjg6PlkI3jgpLmjIflrprjgZfjgb7jgZnjgILjgrnjg5rjg7zjgrnjgafopIfmlbDmjIflrprjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqICAgW2VuXUFuIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uLlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOODj+ODs+ODieODqeOBqOOBquOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBvbjogZnVuY3Rpb24gb25FdmVudChnZXN0dXJlcywgaGFuZGxlciwgb3B0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgRXZlbnQub24oc2VsZi5lbGVtZW50LCBnZXN0dXJlcywgaGFuZGxlciwgdXRpbC5leHRlbmQoe30sIHNlbGYub3B0aW9ucy5saXN0ZW5lck9wdGlvbnMsIG9wdCksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHNlbGYuZXZlbnRIYW5kbGVycy5wdXNoKHsgZ2VzdHVyZTogdHlwZSwgaGFuZGxlcjogaGFuZGxlciB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcblxuICAvKipcbiAgICogQG1ldGhvZCBvZmZcbiAgICogQHNpZ25hdHVyZSBvZmYoZ2VzdHVyZXMsIGhhbmRsZXIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci5bL2VuXVxuICAgKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnZXN0dXJlc1xuICAgKiAgIFtlbl1BIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGdlc3R1cmVzLlsvZW5dXG4gICAqICAgW2phXeOCuOOCp+OCueODgeODo+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAguOCueODmuODvOOCueOBp+ikh+aVsOaMh+WumuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogICBbZW5dQW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44OP44Oz44OJ44Op44Go44Gq44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIG9mZjogZnVuY3Rpb24gb2ZmRXZlbnQoZ2VzdHVyZXMsIGhhbmRsZXIsIG9wdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIEV2ZW50Lm9mZihzZWxmLmVsZW1lbnQsIGdlc3R1cmVzLCBoYW5kbGVyLCB1dGlsLmV4dGVuZCh7fSwgc2VsZi5vcHRpb25zLmxpc3RlbmVyT3B0aW9ucywgb3B0KSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGluZGV4ID0gVXRpbHMuaW5BcnJheShzZWxmLmV2ZW50SGFuZGxlcnMsIHsgZ2VzdHVyZTogdHlwZSwgaGFuZGxlcjogaGFuZGxlciB9LCB0cnVlKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHNlbGYuZXZlbnRIYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9LFxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGdlc3R1cmUgZXZlbnRcbiAgICogQG1ldGhvZCB0cmlnZ2VyXG4gICAqIEBzaWduYXR1cmUgdHJpZ2dlcihnZXN0dXJlLCBldmVudERhdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXVxuICAgKi9cbiAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGdlc3R1cmUsIGV2ZW50RGF0YSkge1xuICAgIC8vIG9wdGlvbmFsXG4gICAgaWYgKCFldmVudERhdGEpIHtcbiAgICAgIGV2ZW50RGF0YSA9IHt9O1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBET00gZXZlbnRcbiAgICB2YXIgZXZlbnQgPSBHZXN0dXJlRGV0ZWN0b3IuRE9DVU1FTlQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KGdlc3R1cmUsIHRydWUsIHRydWUpO1xuICAgIGV2ZW50Lmdlc3R1cmUgPSBldmVudERhdGE7XG5cbiAgICAvLyB0cmlnZ2VyIG9uIHRoZSB0YXJnZXQgaWYgaXQgaXMgaW4gdGhlIGluc3RhbmNlIGVsZW1lbnQsXG4gICAgLy8gdGhpcyBpcyBmb3IgZXZlbnQgZGVsZWdhdGlvbiB0cmlja3NcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudDtcbiAgICBpZiAoVXRpbHMuaGFzUGFyZW50KGV2ZW50RGF0YS50YXJnZXQsIGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50ID0gZXZlbnREYXRhLnRhcmdldDtcbiAgICB9XG5cbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGVuYWJsZVxuICAgKiBAc2lnbmF0dXJlIGVuYWJsZShzdGF0ZSlcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dRW5hYmxlIG9yIGRpc2FibGUgZ2VzdHVyZSBkZXRlY3Rpb24uWy9lbl1cbiAgICogIFtqYV3jgrjjgqfjgrnjg4Hjg6PmpJznn6XjgpLmnInlirnljJYv54Sh5Yq55YyW44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0ZVxuICAgKiAgIFtlbl1TcGVjaWZ5IGlmIGl0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3mnInlirnjgavjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZW5hYmxlOiBmdW5jdGlvbiBlbmFibGUoc3RhdGUpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBzdGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAqIEBzaWduYXR1cmUgZGlzcG9zZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVJlbW92ZSBhbmQgZGVzdHJveSBhbGwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoaXMgaW5zdGFuY2UuWy9lbl1cbiAgICogIFtqYV3jgZPjga7jgqTjg7Pjgrnjgr/jg7Pjgrnjgafjga7jgrjjgqfjgrnjg4Hjg6Pjga7mpJznn6XjgoTjgIHjgqTjg5njg7Pjg4jjg4/jg7Pjg4njg6njgpLlhajjgabop6PpmaTjgZfjgablu4Pmo4TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZGlzcG9zZTogZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICB2YXIgaSwgZWg7XG5cbiAgICAvLyB1bmRvIGFsbCBjaGFuZ2VzIG1hZGUgYnkgc3RvcF9icm93c2VyX2JlaGF2aW9yXG4gICAgVXRpbHMudG9nZ2xlQmVoYXZpb3IodGhpcy5lbGVtZW50LCB0aGlzLm9wdGlvbnMuYmVoYXZpb3IsIGZhbHNlKTtcblxuICAgIC8vIHVuYmluZCBhbGwgY3VzdG9tIGV2ZW50IGhhbmRsZXJzXG4gICAgZm9yIChpID0gLTE7IChlaCA9IHRoaXMuZXZlbnRIYW5kbGVyc1srK2ldKTspIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25kLWFzc2lnblxuICAgICAgVXRpbHMub2ZmKHRoaXMuZWxlbWVudCwgZWguZ2VzdHVyZSwgZWguaGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzID0gW107XG5cbiAgICAvLyB1bmJpbmQgdGhlIHN0YXJ0IGV2ZW50IGxpc3RlbmVyXG4gICAgRXZlbnQub2ZmKHRoaXMuZWxlbWVudCwgRVZFTlRfVFlQRVNbRVZFTlRfU1RBUlRdLCB0aGlzLmV2ZW50U3RhcnRIYW5kbGVyKTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBnZXN0dXJlc1xuICovXG4vKipcbiAqIE1vdmUgd2l0aCB4IGZpbmdlcnMgKGRlZmF1bHQgMSkgYXJvdW5kIG9uIHRoZSBwYWdlLlxuICogUHJldmVudGluZyB0aGUgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yIGlzIGEgZ29vZCB3YXkgdG8gaW1wcm92ZSBmZWVsIGFuZCB3b3JraW5nLlxuICogYGBgYFxuICogIEdlc3R1cmVEZXRlY3RvcnRpbWUub24oXCJkcmFnXCIsIGZ1bmN0aW9uKGV2KSB7XG4gKiAgICBjb25zb2xlLmxvZyhldik7XG4gKiAgICBldi5nZXN0dXJlLnByZXZlbnREZWZhdWx0KCk7XG4gKiAgfSk7XG4gKiBgYGBgXG4gKlxuICogQGNsYXNzIERyYWdcbiAqIEBzdGF0aWNcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ1xuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdzdGFydFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdlbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG4vKipcbiAqIEBldmVudCBkcmFwbGVmdFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdyaWdodFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWd1cFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdkb3duXG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKi9cbihmdW5jdGlvbihuYW1lKSB7XG4gIHZhciB0cmlnZ2VyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBkcmFnR2VzdHVyZShldiwgaW5zdCkge1xuICAgIHZhciBjdXIgPSBEZXRlY3Rpb24uY3VycmVudDtcblxuICAgIC8vIG1heCB0b3VjaGVzXG4gICAgaWYgKGluc3Qub3B0aW9ucy5kcmFnTWF4VG91Y2hlcyA+IDAgJiZcbiAgICAgIGV2LnRvdWNoZXMubGVuZ3RoID4gaW5zdC5vcHRpb25zLmRyYWdNYXhUb3VjaGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChldi5ldmVudFR5cGUpIHtcbiAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRVZFTlRfTU9WRTpcbiAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgLy8gb3Igd2UgY2FuIGJlIGFscmVhZHkgaW4gZHJhZ2dpbmdcbiAgICAgIGlmIChldi5kaXN0YW5jZSA8IGluc3Qub3B0aW9ucy5kcmFnTWluRGlzdGFuY2UgJiZcbiAgICAgICAgY3VyLm5hbWUgIT0gbmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydENlbnRlciA9IGN1ci5zdGFydEV2ZW50LmNlbnRlcjtcblxuICAgICAgLy8gd2UgYXJlIGRyYWdnaW5nIVxuICAgICAgaWYgKGN1ci5uYW1lICE9IG5hbWUpIHtcbiAgICAgICAgY3VyLm5hbWUgPSBuYW1lO1xuICAgICAgICBpZiAoaW5zdC5vcHRpb25zLmRyYWdEaXN0YW5jZUNvcnJlY3Rpb24gJiYgZXYuZGlzdGFuY2UgPiAwKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIGRyYWcgaXMgdHJpZ2dlcmVkLCBzZXQgdGhlIGV2ZW50IGNlbnRlciB0byBkcmFnTWluRGlzdGFuY2UgcGl4ZWxzIGZyb20gdGhlIG9yaWdpbmFsIGV2ZW50IGNlbnRlci5cbiAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgY29ycmVjdGlvbiwgdGhlIGRyYWdnZWQgZGlzdGFuY2Ugd291bGQganVtcHN0YXJ0IGF0IGRyYWdNaW5EaXN0YW5jZSBwaXhlbHMgaW5zdGVhZCBvZiBhdCAwLlxuICAgICAgICAgIC8vIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBzYXZlIHRoZSBvcmlnaW5hbCBzdGFydCBwb2ludCBzb21ld2hlcmVcbiAgICAgICAgICB2YXIgZmFjdG9yID0gTWF0aC5hYnMoaW5zdC5vcHRpb25zLmRyYWdNaW5EaXN0YW5jZSAvIGV2LmRpc3RhbmNlKTtcbiAgICAgICAgICBzdGFydENlbnRlci5wYWdlWCArPSBldi5kZWx0YVggKiBmYWN0b3I7XG4gICAgICAgICAgc3RhcnRDZW50ZXIucGFnZVkgKz0gZXYuZGVsdGFZICogZmFjdG9yO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLmNsaWVudFggKz0gZXYuZGVsdGFYICogZmFjdG9yO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLmNsaWVudFkgKz0gZXYuZGVsdGFZICogZmFjdG9yO1xuXG4gICAgICAgICAgLy8gcmVjYWxjdWxhdGUgZXZlbnQgZGF0YSB1c2luZyBuZXcgc3RhcnQgcG9pbnRcbiAgICAgICAgICBldiA9IERldGVjdGlvbi5leHRlbmRFdmVudERhdGEoZXYpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGxvY2sgZHJhZyB0byBheGlzP1xuICAgICAgaWYgKGN1ci5sYXN0RXZlbnQuZHJhZ0xvY2tUb0F4aXMgfHxcbiAgICAgICAgKCBpbnN0Lm9wdGlvbnMuZHJhZ0xvY2tUb0F4aXMgJiZcbiAgICAgICAgICBpbnN0Lm9wdGlvbnMuZHJhZ0xvY2tNaW5EaXN0YW5jZSA8PSBldi5kaXN0YW5jZVxuICAgICAgICApKSB7XG4gICAgICAgICAgZXYuZHJhZ0xvY2tUb0F4aXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8ga2VlcCBkaXJlY3Rpb24gb24gdGhlIGF4aXMgdGhhdCB0aGUgZHJhZyBnZXN0dXJlIHN0YXJ0ZWQgb25cbiAgICAgICAgdmFyIGxhc3REaXJlY3Rpb24gPSBjdXIubGFzdEV2ZW50LmRpcmVjdGlvbjtcbiAgICAgICAgaWYgKGV2LmRyYWdMb2NrVG9BeGlzICYmIGxhc3REaXJlY3Rpb24gIT09IGV2LmRpcmVjdGlvbikge1xuICAgICAgICAgIGlmIChVdGlscy5pc1ZlcnRpY2FsKGxhc3REaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBldi5kaXJlY3Rpb24gPSAoZXYuZGVsdGFZIDwgMCkgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXYuZGlyZWN0aW9uID0gKGV2LmRlbHRhWCA8IDApID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgdGltZSwgdHJpZ2dlciBkcmFnc3RhcnQgZXZlbnRcbiAgICAgICAgaWYgKCF0cmlnZ2VyZWQpIHtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSArICdzdGFydCcsIGV2KTtcbiAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJpZ2dlciBldmVudHNcbiAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUsIGV2KTtcbiAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyBldi5kaXJlY3Rpb24sIGV2KTtcblxuICAgICAgICB2YXIgaXNWZXJ0aWNhbCA9IFV0aWxzLmlzVmVydGljYWwoZXYuZGlyZWN0aW9uKTtcblxuICAgICAgICAvLyBibG9jayB0aGUgYnJvd3NlciBldmVudHNcbiAgICAgICAgaWYgKChpbnN0Lm9wdGlvbnMuZHJhZ0Jsb2NrVmVydGljYWwgJiYgaXNWZXJ0aWNhbCkgfHxcbiAgICAgICAgICAoaW5zdC5vcHRpb25zLmRyYWdCbG9ja0hvcml6b250YWwgJiYgIWlzVmVydGljYWwpKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9SRUxFQVNFOlxuICAgICAgICBpZiAodHJpZ2dlcmVkICYmIGV2LmNoYW5nZWRMZW5ndGggPD0gaW5zdC5vcHRpb25zLmRyYWdNYXhUb3VjaGVzKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnZW5kJywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX0VORDpcbiAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5EcmFnID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiA1MCxcbiAgICAgIGhhbmRsZXI6IGRyYWdHZXN0dXJlLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1pbmltYWwgbW92ZW1lbnQgdGhhdCBoYXZlIHRvIGJlIG1hZGUgYmVmb3JlIHRoZSBkcmFnIGV2ZW50IGdldHMgdHJpZ2dlcmVkXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTWluRGlzdGFuY2VcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdNaW5EaXN0YW5jZTogMTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBkcmFnRGlzdGFuY2VDb3JyZWN0aW9uIHRvIHRydWUgdG8gbWFrZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGRyYWdcbiAgICAgICAgICogYmUgY2FsY3VsYXRlZCBmcm9tIHdoZXJlIHRoZSBkcmFnIHdhcyB0cmlnZ2VyZWQsIG5vdCBmcm9tIHdoZXJlIHRoZSB0b3VjaCBzdGFydGVkLlxuICAgICAgICAgKiBVc2VmdWwgdG8gYXZvaWQgYSBqZXJrLXN0YXJ0aW5nIGRyYWcsIHdoaWNoIGNhbiBtYWtlIGZpbmUtYWRqdXN0bWVudHNcbiAgICAgICAgICogdGhyb3VnaCBkcmFnZ2luZyBkaWZmaWN1bHQsIGFuZCBiZSB2aXN1YWxseSB1bmFwcGVhbGluZy5cbiAgICAgICAgICogQHByb3BlcnR5IGRyYWdEaXN0YW5jZUNvcnJlY3Rpb25cbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdEaXN0YW5jZUNvcnJlY3Rpb246IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHNldCAwIGZvciB1bmxpbWl0ZWQsIGJ1dCB0aGlzIGNhbiBjb25mbGljdCB3aXRoIHRyYW5zZm9ybVxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ01heFRvdWNoZXNcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ01heFRvdWNoZXM6IDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHByZXZlbnQgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yIHdoZW4gZHJhZ2dpbmcgb2NjdXJzXG4gICAgICAgICAqIGJlIGNhcmVmdWwgd2l0aCBpdCwgaXQgbWFrZXMgdGhlIGVsZW1lbnQgYSBibG9ja2luZyBlbGVtZW50XG4gICAgICAgICAqIHdoZW4geW91IGFyZSB1c2luZyB0aGUgZHJhZyBnZXN0dXJlLCBpdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gc2V0IHRoaXMgdHJ1ZVxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Jsb2NrSG9yaXpvbnRhbFxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdCbG9ja0hvcml6b250YWw6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBzYW1lIGFzIGBkcmFnQmxvY2tIb3Jpem9udGFsYCwgYnV0IGZvciB2ZXJ0aWNhbCBtb3ZlbWVudFxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Jsb2NrVmVydGljYWxcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnQmxvY2tWZXJ0aWNhbDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRyYWdMb2NrVG9BeGlzIGtlZXBzIHRoZSBkcmFnIGdlc3R1cmUgb24gdGhlIGF4aXMgdGhhdCBpdCBzdGFydGVkIG9uLFxuICAgICAgICAgKiBJdCBkaXNhbGxvd3MgdmVydGljYWwgZGlyZWN0aW9ucyBpZiB0aGUgaW5pdGlhbCBkaXJlY3Rpb24gd2FzIGhvcml6b250YWwsIGFuZCB2aWNlIHZlcnNhLlxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0xvY2tUb0F4aXNcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTG9ja1RvQXhpczogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRyYWcgbG9jayBvbmx5IGtpY2tzIGluIHdoZW4gZGlzdGFuY2UgPiBkcmFnTG9ja01pbkRpc3RhbmNlXG4gICAgICAgICAqIFRoaXMgd2F5LCBsb2NraW5nIG9jY3VycyBvbmx5IHdoZW4gdGhlIGRpc3RhbmNlIGhhcyBiZWNvbWUgbGFyZ2UgZW5vdWdoIHRvIHJlbGlhYmx5IGRldGVybWluZSB0aGUgZGlyZWN0aW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTG9ja01pbkRpc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDI1XG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTG9ja01pbkRpc3RhbmNlOiAyNVxuICAgICAgfVxuICAgIH07XG4gIH0pKCdkcmFnJyk7XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGEgc2ltcGxlIGdlc3R1cmUgZXZlbnQsIHNvIHlvdSBjYW4gZG8gYW55dGhpbmcgaW4geW91ciBoYW5kbGVyLlxuICAgKiBvbmx5IHVzYWJsZSBpZiB5b3Uga25vdyB3aGF0IHlvdXIgZG9pbmcuLi5cbiAgICpcbiAgICogQGNsYXNzIEdlc3R1cmVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLkdlc3R1cmUgPSB7XG4gICAgbmFtZTogJ2dlc3R1cmUnLFxuICAgIGluZGV4OiAxMzM3LFxuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIHJlbGVhc2VHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lLCBldik7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogVG91Y2ggc3RheXMgYXQgdGhlIHNhbWUgcGxhY2UgZm9yIHggdGltZVxuICAgKlxuICAgKiBAY2xhc3MgSG9sZFxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IGhvbGRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgdGltZXI7XG5cbiAgICBmdW5jdGlvbiBob2xkR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnMsXG4gICAgICAgICAgY3VycmVudCA9IERldGVjdGlvbi5jdXJyZW50O1xuXG4gICAgICBzd2l0Y2ggKGV2LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBFVkVOVF9TVEFSVDpcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcblxuICAgICAgICAvLyBzZXQgdGhlIGdlc3R1cmUgc28gd2UgY2FuIGNoZWNrIGluIHRoZSB0aW1lb3V0IGlmIGl0IHN0aWxsIGlzXG4gICAgICAgIGN1cnJlbnQubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gc2V0IHRpbWVyIGFuZCBpZiBhZnRlciB0aGUgdGltZW91dCBpdCBzdGlsbCBpcyBob2xkLFxuICAgICAgICAvLyB3ZSB0cmlnZ2VyIHRoZSBob2xkIGV2ZW50XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50Lm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUsIGV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMuaG9sZFRpbWVvdXQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgICBpZiAoZXYuZGlzdGFuY2UgPiBvcHRpb25zLmhvbGRUaHJlc2hvbGQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX1JFTEVBU0U6XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Ib2xkID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiAxMCxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJvcGVydHkgaG9sZFRpbWVvdXRcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgNTAwXG4gICAgICAgICAqL1xuICAgICAgICBob2xkVGltZW91dDogNTAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtb3ZlbWVudCBhbGxvd2VkIHdoaWxlIGhvbGRpbmdcbiAgICAgICAgICogQHByb3BlcnR5IGhvbGRUaHJlc2hvbGRcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMlxuICAgICAgICAgKi9cbiAgICAgICAgaG9sZFRocmVzaG9sZDogMlxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGhvbGRHZXN0dXJlXG4gICAgfTtcbiAgfSkoJ2hvbGQnKTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIHdoZW4gYSB0b3VjaCBpcyBiZWluZyByZWxlYXNlZCBmcm9tIHRoZSBwYWdlXG4gICAqXG4gICAqIEBjbGFzcyBSZWxlYXNlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgcmVsZWFzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5SZWxlYXNlID0ge1xuICAgIG5hbWU6ICdyZWxlYXNlJyxcbiAgICBpbmRleDogSW5maW5pdHksXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gcmVsZWFzZUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lLCBldik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogdHJpZ2dlcnMgc3dpcGUgZXZlbnRzIHdoZW4gdGhlIGVuZCB2ZWxvY2l0eSBpcyBhYm92ZSB0aGUgdGhyZXNob2xkXG4gICAqIGZvciBiZXN0IHVzYWdlLCBzZXQgYHByZXZlbnREZWZhdWx0YCAob24gdGhlIGRyYWcgZ2VzdHVyZSkgdG8gYHRydWVgXG4gICAqIGBgYGBcbiAgICogIEdlc3R1cmVEZXRlY3RvcnRpbWUub24oXCJkcmFnbGVmdCBzd2lwZWxlZnRcIiwgZnVuY3Rpb24oZXYpIHtcbiAgICogICAgY29uc29sZS5sb2coZXYpO1xuICAgKiAgICBldi5nZXN0dXJlLnByZXZlbnREZWZhdWx0KCk7XG4gICAqICB9KTtcbiAgICogYGBgYFxuICAgKlxuICAgKiBAY2xhc3MgU3dpcGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVsZWZ0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZXJpZ2h0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZXVwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZWRvd25cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuU3dpcGUgPSB7XG4gICAgbmFtZTogJ3N3aXBlJyxcbiAgICBpbmRleDogNDAsXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQHByb3BlcnR5IHN3aXBlTWluVG91Y2hlc1xuICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAqL1xuICAgICAgc3dpcGVNaW5Ub3VjaGVzOiAxLFxuXG4gICAgICAvKipcbiAgICAgICAqIEBwcm9wZXJ0eSBzd2lwZU1heFRvdWNoZXNcbiAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgKi9cbiAgICAgIHN3aXBlTWF4VG91Y2hlczogMSxcblxuICAgICAgLyoqXG4gICAgICAgKiBob3Jpem9udGFsIHN3aXBlIHZlbG9jaXR5XG4gICAgICAgKiBAcHJvcGVydHkgc3dpcGVWZWxvY2l0eVhcbiAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgKiBAZGVmYXVsdCAwLjZcbiAgICAgICAqL1xuICAgICAgc3dpcGVWZWxvY2l0eVg6IDAuNixcblxuICAgICAgLyoqXG4gICAgICAgKiB2ZXJ0aWNhbCBzd2lwZSB2ZWxvY2l0eVxuICAgICAgICogQHByb3BlcnR5IHN3aXBlVmVsb2NpdHlZXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMC42XG4gICAgICAgKi9cbiAgICAgIHN3aXBlVmVsb2NpdHlZOiAwLjZcbiAgICB9LFxuXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gc3dpcGVHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBpZiAoZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBldi50b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnM7XG5cbiAgICAgICAgLy8gbWF4IHRvdWNoZXNcbiAgICAgICAgaWYgKHRvdWNoZXMgPCBvcHRpb25zLnN3aXBlTWluVG91Y2hlcyB8fFxuICAgICAgICAgIHRvdWNoZXMgPiBvcHRpb25zLnN3aXBlTWF4VG91Y2hlcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgICAvLyBvciB3ZSBjYW4gYmUgYWxyZWFkeSBpbiBkcmFnZ2luZ1xuICAgICAgICBpZiAoZXYudmVsb2NpdHlYID4gb3B0aW9ucy5zd2lwZVZlbG9jaXR5WCB8fFxuICAgICAgICAgIGV2LnZlbG9jaXR5WSA+IG9wdGlvbnMuc3dpcGVWZWxvY2l0eVkpIHtcbiAgICAgICAgICAvLyB0cmlnZ2VyIHN3aXBlIGV2ZW50c1xuICAgICAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUsIGV2KTtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lICsgZXYuZGlyZWN0aW9uLCBldik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiBTaW5nbGUgdGFwIGFuZCBhIGRvdWJsZSB0YXAgb24gYSBwbGFjZVxuICAgKlxuICAgKiBAY2xhc3MgVGFwXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgdGFwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBkb3VibGV0YXBcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaGFzTW92ZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIHRhcEdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIHZhciBvcHRpb25zID0gaW5zdC5vcHRpb25zLFxuICAgICAgICAgIGN1cnJlbnQgPSBEZXRlY3Rpb24uY3VycmVudCxcbiAgICAgICAgICBwcmV2ID0gRGV0ZWN0aW9uLnByZXZpb3VzLFxuICAgICAgICAgIHNpbmNlUHJldixcbiAgICAgICAgICBkaWREb3VibGVUYXA7XG5cbiAgICAgIHN3aXRjaCAoZXYuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgICBoYXNNb3ZlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgICBoYXNNb3ZlZCA9IGhhc01vdmVkIHx8IChldi5kaXN0YW5jZSA+IG9wdGlvbnMudGFwTWF4RGlzdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9FTkQ6XG4gICAgICAgIGlmICghVXRpbHMuaW5TdHIoZXYuc3JjRXZlbnQudHlwZSwgJ2NhbmNlbCcpICYmIGV2LmRlbHRhVGltZSA8IG9wdGlvbnMudGFwTWF4VGltZSAmJiAhaGFzTW92ZWQpIHtcbiAgICAgICAgICAvLyBwcmV2aW91cyBnZXN0dXJlLCBmb3IgdGhlIGRvdWJsZSB0YXAgc2luY2UgdGhlc2UgYXJlIHR3byBkaWZmZXJlbnQgZ2VzdHVyZSBkZXRlY3Rpb25zXG4gICAgICAgICAgc2luY2VQcmV2ID0gcHJldiAmJiBwcmV2Lmxhc3RFdmVudCAmJiBldi50aW1lU3RhbXAgLSBwcmV2Lmxhc3RFdmVudC50aW1lU3RhbXA7XG4gICAgICAgICAgZGlkRG91YmxlVGFwID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBjaGVjayBpZiBkb3VibGUgdGFwXG4gICAgICAgICAgaWYgKHByZXYgJiYgcHJldi5uYW1lID09IG5hbWUgJiZcbiAgICAgICAgICAgIChzaW5jZVByZXYgJiYgc2luY2VQcmV2IDwgb3B0aW9ucy5kb3VibGVUYXBJbnRlcnZhbCkgJiZcbiAgICAgICAgICAgIGV2LmRpc3RhbmNlIDwgb3B0aW9ucy5kb3VibGVUYXBEaXN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKCdkb3VibGV0YXAnLCBldik7XG4gICAgICAgICAgICBkaWREb3VibGVUYXAgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRvIGEgc2luZ2xlIHRhcFxuICAgICAgICAgIGlmICghZGlkRG91YmxlVGFwIHx8IG9wdGlvbnMudGFwQWx3YXlzKSB7XG4gICAgICAgICAgICBjdXJyZW50Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKGN1cnJlbnQubmFtZSwgZXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuVGFwID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiAxMDAsXG4gICAgICBoYW5kbGVyOiB0YXBHZXN0dXJlLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCB0aW1lIG9mIGEgdGFwLCB0aGlzIGlzIGZvciB0aGUgc2xvdyB0YXBwZXJzXG4gICAgICAgICAqIEBwcm9wZXJ0eSB0YXBNYXhUaW1lXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDI1MFxuICAgICAgICAgKi9cbiAgICAgICAgdGFwTWF4VGltZTogMjUwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggZGlzdGFuY2Ugb2YgbW92ZW1lbnQgb2YgYSB0YXAsIHRoaXMgaXMgZm9yIHRoZSBzbG93IHRhcHBlcnNcbiAgICAgICAgICogQHByb3BlcnR5IHRhcE1heERpc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgICAqL1xuICAgICAgICB0YXBNYXhEaXN0YW5jZTogMTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsd2F5cyB0cmlnZ2VyIHRoZSBgdGFwYCBldmVudCwgZXZlbiB3aGlsZSBkb3VibGUtdGFwcGluZ1xuICAgICAgICAgKiBAcHJvcGVydHkgdGFwQWx3YXlzXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICAqL1xuICAgICAgICB0YXBBbHdheXM6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCBkaXN0YW5jZSBiZXR3ZWVuIHR3byB0YXBzXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkb3VibGVUYXBEaXN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICAgKi9cbiAgICAgICAgZG91YmxlVGFwRGlzdGFuY2U6IDIwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggdGltZSBiZXR3ZWVuIHR3byB0YXBzXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkb3VibGVUYXBJbnRlcnZhbFxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAzMDBcbiAgICAgICAgICovXG4gICAgICAgIGRvdWJsZVRhcEludGVydmFsOiAzMDBcbiAgICAgIH1cbiAgICB9O1xuICB9KSgndGFwJyk7XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB3aGVuIGEgdG91Y2ggaXMgYmVpbmcgdG91Y2hlZCBhdCB0aGUgcGFnZVxuICAgKlxuICAgKiBAY2xhc3MgVG91Y2hcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0b3VjaFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Ub3VjaCA9IHtcbiAgICBuYW1lOiAndG91Y2gnLFxuICAgIGluZGV4OiAtSW5maW5pdHksXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogY2FsbCBwcmV2ZW50RGVmYXVsdCBhdCB0b3VjaHN0YXJ0LCBhbmQgbWFrZXMgdGhlIGVsZW1lbnQgYmxvY2tpbmcgYnkgZGlzYWJsaW5nIHRoZSBzY3JvbGxpbmcgb2YgdGhlIHBhZ2UsXG4gICAgICAgKiBidXQgaXQgaW1wcm92ZXMgZ2VzdHVyZXMgbGlrZSB0cmFuc2Zvcm1pbmcgYW5kIGRyYWdnaW5nLlxuICAgICAgICogYmUgY2FyZWZ1bCB3aXRoIHVzaW5nIHRoaXMsIGl0IGNhbiBiZSB2ZXJ5IGFubm95aW5nIGZvciB1c2VycyB0byBiZSBzdHVjayBvbiB0aGUgcGFnZVxuICAgICAgICogQHByb3BlcnR5IHByZXZlbnREZWZhdWx0XG4gICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnREZWZhdWx0OiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBkaXNhYmxlIG1vdXNlIGV2ZW50cywgc28gb25seSB0b3VjaCAob3IgcGVuISkgaW5wdXQgdHJpZ2dlcnMgZXZlbnRzXG4gICAgICAgKiBAcHJvcGVydHkgcHJldmVudE1vdXNlXG4gICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnRNb3VzZTogZmFsc2VcbiAgICB9LFxuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIHRvdWNoR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgaWYgKGluc3Qub3B0aW9ucy5wcmV2ZW50TW91c2UgJiYgZXYucG9pbnRlclR5cGUgPT0gUE9JTlRFUl9NT1VTRSkge1xuICAgICAgICBldi5zdG9wRGV0ZWN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3Qub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXYuZXZlbnRUeXBlID09IEVWRU5UX1RPVUNIKSB7XG4gICAgICAgIGluc3QudHJpZ2dlcigndG91Y2gnLCBldik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogVXNlciB3YW50IHRvIHNjYWxlIG9yIHJvdGF0ZSB3aXRoIDIgZmluZ2Vyc1xuICAgKiBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3IgaXMgYSBnb29kIHdheSB0byBpbXByb3ZlIGZlZWwgYW5kIHdvcmtpbmcuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGVcbiAgICogYHByZXZlbnREZWZhdWx0YCBvcHRpb24uXG4gICAqXG4gICAqIEBjbGFzcyBUcmFuc2Zvcm1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHRyYW5zZm9ybXN0YXJ0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0cmFuc2Zvcm1lbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHBpbmNoaW5cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHBpbmNob3V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCByb3RhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgdHJpZ2dlcmVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1HZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBzd2l0Y2ggKGV2LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBFVkVOVF9TVEFSVDpcbiAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX01PVkU6XG4gICAgICAgIC8vIGF0IGxlYXN0IG11bHRpdG91Y2hcbiAgICAgICAgaWYgKGV2LnRvdWNoZXMubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzY2FsZVRocmVzaG9sZCA9IE1hdGguYWJzKDEgLSBldi5zY2FsZSk7XG4gICAgICAgIHZhciByb3RhdGlvblRocmVzaG9sZCA9IE1hdGguYWJzKGV2LnJvdGF0aW9uKTtcblxuICAgICAgICAvLyB3aGVuIHRoZSBkaXN0YW5jZSB3ZSBtb3ZlZCBpcyB0b28gc21hbGwgd2Ugc2tpcCB0aGlzIGdlc3R1cmVcbiAgICAgICAgLy8gb3Igd2UgY2FuIGJlIGFscmVhZHkgaW4gZHJhZ2dpbmdcbiAgICAgICAgaWYgKHNjYWxlVGhyZXNob2xkIDwgaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblNjYWxlICYmXG4gICAgICAgICAgcm90YXRpb25UaHJlc2hvbGQgPCBpbnN0Lm9wdGlvbnMudHJhbnNmb3JtTWluUm90YXRpb24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBhcmUgdHJhbnNmb3JtaW5nIVxuICAgICAgICBEZXRlY3Rpb24uY3VycmVudC5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBmaXJzdCB0aW1lLCB0cmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICBpZiAoIXRyaWdnZXJlZCkge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ3N0YXJ0JywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSwgZXYpOyAvLyBiYXNpYyB0cmFuc2Zvcm0gZXZlbnRcblxuICAgICAgICAvLyB0cmlnZ2VyIHJvdGF0ZSBldmVudFxuICAgICAgICBpZiAocm90YXRpb25UaHJlc2hvbGQgPiBpbnN0Lm9wdGlvbnMudHJhbnNmb3JtTWluUm90YXRpb24pIHtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIoJ3JvdGF0ZScsIGV2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyaWdnZXIgcGluY2ggZXZlbnRcbiAgICAgICAgaWYgKHNjYWxlVGhyZXNob2xkID4gaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblNjYWxlKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKCdwaW5jaCcsIGV2KTtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIoJ3BpbmNoJyArIChldi5zY2FsZSA8IDEgPyAnaW4nIDogJ291dCcpLCBldik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfUkVMRUFTRTpcbiAgICAgICAgaWYgKHRyaWdnZXJlZCAmJiBldi5jaGFuZ2VkTGVuZ3RoIDwgMikge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ2VuZCcsIGV2KTtcbiAgICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuVHJhbnNmb3JtID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiA0NSxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtaW5pbWFsIHNjYWxlIGZhY3Rvciwgbm8gc2NhbGUgaXMgMSwgem9vbWluIGlzIHRvIDAgYW5kIHpvb21vdXQgdW50aWwgaGlnaGVyIHRoZW4gMVxuICAgICAgICAgKiBAcHJvcGVydHkgdHJhbnNmb3JtTWluU2NhbGVcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMC4wMVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtTWluU2NhbGU6IDAuMDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJvdGF0aW9uIGluIGRlZ3JlZXNcbiAgICAgICAgICogQHByb3BlcnR5IHRyYW5zZm9ybU1pblJvdGF0aW9uXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZm9ybU1pblJvdGF0aW9uOiAxXG4gICAgICB9LFxuXG4gICAgICBoYW5kbGVyOiB0cmFuc2Zvcm1HZXN0dXJlXG4gICAgfTtcbiAgfSkoJ3RyYW5zZm9ybScpO1xuXG5leHBvcnQgZGVmYXVsdCBHZXN0dXJlRGV0ZWN0b3I7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5sZXQgcmVhZHlNYXAsIHF1ZXVlTWFwO1xuXG5mdW5jdGlvbiBpc0NvbnRlbnRSZWFkeShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgIHNldENvbnRlbnRSZWFkeShlbGVtZW50KTtcbiAgfVxuICByZXR1cm4gcmVhZHlNYXAuaGFzKGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBzZXRDb250ZW50UmVhZHkoZWxlbWVudCkge1xuICByZWFkeU1hcC5zZXQoZWxlbWVudCwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGFkZENhbGxiYWNrKGVsZW1lbnQsIGZuKSB7XG4gIGlmICghcXVldWVNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgcXVldWVNYXAuc2V0KGVsZW1lbnQsIFtdKTtcbiAgfVxuICBxdWV1ZU1hcC5nZXQoZWxlbWVudCkucHVzaChmbik7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVRdWV1ZShlbGVtZW50KSB7XG4gIGNvbnN0IGNhbGxiYWNrcyA9IHF1ZXVlTWFwLmdldChlbGVtZW50LCBbXSkgfHwgW107XG4gIHF1ZXVlTWFwLmRlbGV0ZShlbGVtZW50KTtcbiAgY2FsbGJhY2tzLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRlbnRSZWFkeShlbGVtZW50LCBmbiA9ICgpID0+IHt9KSB7XG4gIGlmIChyZWFkeU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVhZHlNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIHF1ZXVlTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuXG4gIGFkZENhbGxiYWNrKGVsZW1lbnQsIGZuKTtcblxuICBpZiAoaXNDb250ZW50UmVhZHkoZWxlbWVudCkpIHtcbiAgICBjb25zdW1lUXVldWUoZWxlbWVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjaGFuZ2VzID0+IHtcbiAgICBzZXRDb250ZW50UmVhZHkoZWxlbWVudCk7XG4gICAgY29uc3VtZVF1ZXVlKGVsZW1lbnQpO1xuICB9KTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7Y2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XG5cbiAgLy8gZmFpbGJhY2sgZm9yIGVsZW1lbnRzIGhhcyBlbXB0eSBjb250ZW50LlxuICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgIHNldENvbnRlbnRSZWFkeShlbGVtZW50KTtcbiAgICBjb25zdW1lUXVldWUoZWxlbWVudCk7XG4gIH0pO1xufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuY2xhc3MgVG9hc3RRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFkZChmbiwgcHJvbWlzZSkge1xuICAgIHRoaXMucXVldWUucHVzaChmbik7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNldEltbWVkaWF0ZSh0aGlzLnF1ZXVlWzBdKTtcbiAgICB9XG5cbiAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQodGhpcy5xdWV1ZVswXSwgMTAwMC8zMCk7IC8vIEFwcGx5IHNvbWUgdmlzdWFsIGRlbGF5XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFRvYXN0UXVldWUoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4vY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgVG9hc3RRdWV1ZSBmcm9tICcuL2ludGVybmFsL3RvYXN0LXF1ZXVlLmpzJztcblxuY29uc3QgX3NldEF0dHJpYnV0ZXMgPSAoZWxlbWVudCwgb3B0aW9ucykgPT4ge1xuICBbJ2lkJywgJ2NsYXNzJywgJ2FuaW1hdGlvbiddXG4gICAgLmZvckVhY2goYSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgYSkgJiYgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYSwgb3B0aW9uc1thXSkpO1xuXG4gIGlmIChvcHRpb25zLm1vZGlmaWVyKSB7XG4gICAgdXRpbC5hZGRNb2RpZmllcihlbGVtZW50LCBvcHRpb25zLm1vZGlmaWVyKTtcbiAgfVxufTtcblxuY29uc3QgX25vcm1hbGl6ZUFyZ3VtZW50cyA9IChtZXNzYWdlLCBvcHRpb25zID0ge30sIGRlZmF1bHRzID0ge30pID0+IHtcbiAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9O1xuICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgPyAob3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZSkgOiAob3B0aW9ucyA9IG1lc3NhZ2UpO1xuICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubWVzc2FnZSAmJiAhb3B0aW9ucy5tZXNzYWdlSFRNTCkge1xuICAgIHV0aWwudGhyb3coJ05vdGlmaWNhdGlvbnMgbXVzdCBjb250YWluIGEgbWVzc2FnZScpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnYnV0dG9uTGFiZWxzJykgfHwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdidXR0b25MYWJlbCcpKSB7XG4gICAgb3B0aW9ucy5idXR0b25MYWJlbHMgPSBvcHRpb25zLmJ1dHRvbkxhYmVscyB8fCBvcHRpb25zLmJ1dHRvbkxhYmVsO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zLmJ1dHRvbkxhYmVscykpIHtcbiAgICAgIG9wdGlvbnMuYnV0dG9uTGFiZWxzID0gW29wdGlvbnMuYnV0dG9uTGFiZWxzIHx8ICcnXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXRpbC5leHRlbmQoe1xuICAgICAgY29tcGlsZTogcGFyYW0gPT4gcGFyYW0sXG4gICAgICBjYWxsYmFjazogcGFyYW0gPT4gcGFyYW0sXG4gICAgICBhbmltYXRpb246ICdkZWZhdWx0JyxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgcHJpbWFyeUJ1dHRvbkluZGV4OiAob3B0aW9ucy5idXR0b25MYWJlbHMgfHwgZGVmYXVsdHMuYnV0dG9uTGFiZWxzIHx8IFtdKS5sZW5ndGggLSAxXG4gICAgfSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAb2JqZWN0IG9ucy5ub3RpZmljYXRpb25cbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9ub3RpZmljYXRpb25cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVXRpbGl0eSBtZXRob2RzIHRvIGNyZWF0ZSBkaWZmZXJlbnQga2luZHMgb2Ygbm90aWZpY2F0aW9ucy4gVGhlcmUgYXJlIHRocmVlIG1ldGhvZHMgYXZhaWxhYmxlOlxuICpcbiAqICAgICAqIGBvbnMubm90aWZpY2F0aW9uLmFsZXJ0KClgXG4gKiAgICAgKiBgb25zLm5vdGlmaWNhdGlvbi5jb25maXJtKClgXG4gKiAgICAgKiBgb25zLm5vdGlmaWNhdGlvbi5wcm9tcHQoKWBcbiAqICAgICAqIGBvbnMubm90aWZpY2F0aW9uLnRvYXN0KClgXG4gKlxuICogICAgIEl0IHdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGRpYWxvZyBvbiBBbmRyb2lkIGRldmljZXMuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jgYTjgY/jgaTjgYvjga7nqK7poZ7jga7jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgpLkvZzmiJDjgZnjgovjgZ/jgoHjga7jg6bjg7zjg4bjgqPjg6rjg4bjgqPjg6Hjgr3jg4Pjg4njgpLlj47jgoHjgZ/jgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIG9ucy5ub3RpZmljYXRpb24uYWxlcnQoJ0hlbGxvLCB3b3JsZCEnKTtcbiAqXG4gKiBvbnMubm90aWZpY2F0aW9uLmNvbmZpcm0oJ0FyZSB5b3UgcmVhZHk/JylcbiAqICAgLnRoZW4oXG4gKiAgICAgZnVuY3Rpb24oYW5zd2VyKSB7XG4gKiAgICAgICBpZiAoYW5zd2VyID09PSAxKSB7XG4gKiAgICAgICAgIG9ucy5ub3RpZmljYXRpb24uYWxlcnQoJ0xldFxcJ3MgZ28hJyk7XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICApO1xuICpcbiAqIG9ucy5ub3RpZmljYXRpb24ucHJvbXB0KCdIb3cgb2xkIGFyZSA/JylcbiAqICAgLnRoZW4oXG4gKiAgICAgZnVuY3Rpb24oYWdlKSB7XG4gKiAgICAgICBvbnMubm90aWZpY2F0aW9uLmFsZXJ0KCdZb3UgYXJlICcgKyBhZ2UgKyAnIHllYXJzIG9sZC4nKTtcbiAqICAgICB9XG4gKiAgICk7XG4gKi9cbmNvbnN0IG5vdGlmaWNhdGlvbiA9IHt9O1xuXG5ub3RpZmljYXRpb24uX2NyZWF0ZUFsZXJ0RGlhbG9nID0gKC4uLnBhcmFtcykgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzKC4uLnBhcmFtcyk7XG4gIHV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0KCdBbGVydERpYWxvZycsICdBbGVydERpYWxvZ0J1dHRvbicpO1xuXG4gIC8vIFByb21wdCBpbnB1dCBzdHJpbmdcbiAgbGV0IGlucHV0U3RyaW5nID0gJyc7XG4gIGlmIChvcHRpb25zLmlzUHJvbXB0KSB7XG4gICAgaW5wdXRTdHJpbmcgPSBgXG4gICAgICA8aW5wdXRcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWlucHV0IHRleHQtaW5wdXQtLXVuZGVyYmFyXCJcbiAgICAgICAgdHlwZT1cIiR7b3B0aW9ucy5pbnB1dFR5cGUgfHwgJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtvcHRpb25zLnBsYWNlaG9sZGVyIHx8ICcnfVwiXG4gICAgICAgIHZhbHVlPVwiJHtvcHRpb25zLmRlZmF1bHRWYWx1ZSB8fCAnJ31cIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxMHB4O1wiXG4gICAgICAvPlxuICAgIGA7XG4gIH1cblxuICAvLyBCdXR0b25zIHN0cmluZ1xuICBsZXQgYnV0dG9ucyA9ICcnO1xuICBvcHRpb25zLmJ1dHRvbkxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICBidXR0b25zICs9IGBcbiAgICAgIDxvbnMtYWxlcnQtZGlhbG9nLWJ1dHRvblxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICR7aW5kZXggPT09IG9wdGlvbnMucHJpbWFyeUJ1dHRvbkluZGV4ID8gJyBhbGVydC1kaWFsb2ctYnV0dG9uLS1wcmltYWwnIDogJyd9XG4gICAgICAgICAgJHtvcHRpb25zLmJ1dHRvbkxhYmVscy5sZW5ndGggPD0gMiA/ICcgYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcm93Zm9vdGVyJyA6ICcnfVxuICAgICAgICBcIlxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cbiAgICAgICAgJHtsYWJlbH1cbiAgICAgIDwvb25zLWFsZXJ0LWRpYWxvZy1idXR0b24+XG4gICAgYDtcbiAgfSk7XG5cbiAgLy8gRGlhbG9nIEVsZW1lbnRcbiAgbGV0IGVsID0ge307XG4gIGNvbnN0IF9kZXN0cm95RGlhbG9nID0gKCkgPT4ge1xuICAgIGlmIChlbC5kaWFsb2cub25EaWFsb2dDYW5jZWwpIHtcbiAgICAgIGVsLmRpYWxvZy5yZW1vdmVFdmVudExpc3RlbmVyKCdkaWFsb2djYW5jZWwnLCBlbC5kaWFsb2cub25EaWFsb2dDYW5jZWwpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKGVsKS5mb3JFYWNoKGtleSA9PiBkZWxldGUgZWxba2V5XSk7XG4gICAgZWwgPSBudWxsO1xuXG4gICAgaWYgKG9wdGlvbnMuZGVzdHJveSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICBvcHRpb25zLmRlc3Ryb3koKTtcbiAgICB9XG4gIH07XG5cbiAgZWwuZGlhbG9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb25zLWFsZXJ0LWRpYWxvZycpO1xuICBlbC5kaWFsb2cuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctbWFza1wiXG4gICAgICBzdHlsZT1cIlxuICAgICAgICAke29wdGlvbnMubWFza0NvbG9yID8gJ2JhY2tncm91bmQtY29sb3I6ICcgKyBvcHRpb25zLm1hc2tDb2xvciA6ICcnfVxuICAgICAgXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy10aXRsZVwiPlxuICAgICAgICAgICR7b3B0aW9ucy50aXRsZSB8fCAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctY29udGVudFwiPlxuICAgICAgICAgICR7b3B0aW9ucy5tZXNzYWdlIHx8IG9wdGlvbnMubWVzc2FnZUhUTUx9XG4gICAgICAgICAgJHtpbnB1dFN0cmluZ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJcbiAgICAgICAgICBhbGVydC1kaWFsb2ctZm9vdGVyXG4gICAgICAgICAgJHtvcHRpb25zLmJ1dHRvbkxhYmVscy5sZW5ndGggPD0gMiA/ICcgYWxlcnQtZGlhbG9nLWZvb3Rlci0tcm93Zm9vdGVyJyA6ICcnfVxuICAgICAgICBcIj5cbiAgICAgICAgICAke2J1dHRvbnN9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIGNvbnRlbnRSZWFkeShlbC5kaWFsb2cpO1xuXG4gIC8vIFNldCBhdHRyaWJ1dGVzXG4gIF9zZXRBdHRyaWJ1dGVzKGVsLmRpYWxvZywgb3B0aW9ucyk7XG5cbiAgLy8gUHJvbXB0IGV2ZW50c1xuICBpZiAob3B0aW9ucy5pc1Byb21wdCkge1xuICAgIGVsLmlucHV0ID0gZWwuZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy50ZXh0LWlucHV0Jyk7XG5cbiAgICBpZiAob3B0aW9ucy5zdWJtaXRPbkVudGVyKSB7XG4gICAgICBlbC5pbnB1dC5vbmtleXByZXNzID0gZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICBlbC5kaWFsb2cuaGlkZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVWYWx1ZSA9IGVsLmlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgIF9kZXN0cm95RGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjayhyZXNvbHZlVmFsdWUpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gQnV0dG9uIGV2ZW50c1xuICBlbC5mb290ZXIgPSBlbC5kaWFsb2cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWRpYWxvZy1mb290ZXInKTtcbiAgdXRpbC5hcnJheUZyb20oZWwuZGlhbG9nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbGVydC1kaWFsb2ctYnV0dG9uJykpLmZvckVhY2goKGJ1dHRvbkVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgYnV0dG9uRWxlbWVudC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICBlbC5kaWFsb2cuaGlkZSgpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgIGxldCByZXNvbHZlVmFsdWUgPSBpbmRleDtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNQcm9tcHQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlVmFsdWUgPSBpbmRleCA9PT0gb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXggPyBlbC5pbnB1dC52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWwuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgICAgICAgICBfZGVzdHJveURpYWxvZygpO1xuICAgICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKHJlc29sdmVWYWx1ZSk7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZWwuZm9vdGVyLmFwcGVuZENoaWxkKGJ1dHRvbkVsZW1lbnQpO1xuICB9KTtcblxuICAvLyBDYW5jZWwgZXZlbnRzXG4gIGlmIChvcHRpb25zLmNhbmNlbGFibGUpIHtcbiAgICBlbC5kaWFsb2cuY2FuY2VsYWJsZSA9IHRydWU7XG4gICAgZWwuZGlhbG9nLm9uRGlhbG9nQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgZWwuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgICBfZGVzdHJveURpYWxvZygpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNvbHZlVmFsdWUgPSBvcHRpb25zLmlzUHJvbXB0ID8gbnVsbCA6IC0xO1xuICAgICAgb3B0aW9ucy5jYWxsYmFjayhyZXNvbHZlVmFsdWUpO1xuICAgICAgcmVzb2x2ZShyZXNvbHZlVmFsdWUpO1xuICAgIH07XG4gICAgZWwuZGlhbG9nLmFkZEV2ZW50TGlzdGVuZXIoJ2RpYWxvZ2NhbmNlbCcsIGVsLmRpYWxvZy5vbkRpYWxvZ0NhbmNlbCwgZmFsc2UpO1xuICB9XG5cbiAgLy8gU2hvdyBkaWFsb2dcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbC5kaWFsb2cpO1xuICBvcHRpb25zLmNvbXBpbGUoZWwuZGlhbG9nKTtcbiAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICBlbC5kaWFsb2cuc2hvdygpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChlbC5pbnB1dCAmJiBvcHRpb25zLmlzUHJvbXB0ICYmIG9wdGlvbnMuYXV0b2ZvY3VzKSB7XG4gICAgICAgICAgY29uc3Qgc3RyTGVuZ3RoID0gZWwuaW5wdXQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgIGVsLmlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgaWYgKGVsLmlucHV0LnR5cGUgJiZcbiAgICAgICAgICAgIFsndGV4dCcsICdzZWFyY2gnLCAndXJsJywgJ3RlbCcsICdwYXNzd29yZCddLmluY2x1ZGVzKGVsLmlucHV0LnR5cGUpKSB7XG4gICAgICAgICAgICBlbC5pbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdHJMZW5ndGgsIHN0ckxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBAbWV0aG9kIGFsZXJ0XG4gKiBAc2lnbmF0dXJlIGFsZXJ0KG1lc3NhZ2UgWywgb3B0aW9uc10gfCBvcHRpb25zKVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVdpbGwgcmVzb2x2ZSB0byB0aGUgaW5kZXggb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIG9yIGAtMWAgd2hlbiBjYW5jZWxlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiAgIFtlbl1Ob3RpZmljYXRpb24gbWVzc2FnZS4gVGhpcyBhcmd1bWVudCBpcyBvcHRpb25hbCBidXQgaWYgaXQncyBub3QgZGVmaW5lZCBlaXRoZXIgYG9wdGlvbnMubWVzc2FnZWAgb3IgYG9wdGlvbnMubWVzc2FnZUhUTUxgIG11c3QgYmUgZGVmaW5lZCBpbnN0ZWFkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZV1cbiAqICAgW2VuXU5vdGlmaWNhdGlvbiBtZXNzYWdlLlsvZW5dXG4gKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgavooajnpLrjgZnjgovmloflrZfliJfjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VIVE1MXVxuICogICBbZW5dTm90aWZpY2F0aW9uIG1lc3NhZ2UgaW4gSFRNTC5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gr6KGo56S644GZ44KLSFRNTOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZyB8IEFycmF5fSBbb3B0aW9ucy5idXR0b25MYWJlbHNdXG4gKiAgIFtlbl1MYWJlbHMgZm9yIHRoZSBidXR0b25zLiBEZWZhdWx0IGlzIGBcIk9LXCJgLlsvZW5dXG4gKiAgIFtqYV3norroqo3jg5zjgr/jg7Pjga7jg6njg5njg6vjgpLmjIflrprjgZfjgb7jgZnjgIJcIk9LXCLjgYzjg4fjg5Xjgqnjg6vjg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByaW1hcnlCdXR0b25JbmRleF1cbiAqICAgW2VuXUluZGV4IG9mIHByaW1hcnkgYnV0dG9uLiBEZWZhdWx0IGlzIHRoZSBsYXN0IG9uZS5bL2VuXVxuICogICBbamFd44OX44Op44Kk44Oe44Oq44Oc44K/44Oz44Gu44Kk44Oz44OH44OD44Kv44K544KS5oyH5a6a44GX44G+44GZ44CC44OH44OV44Kp44Or44OI44GvIDAg44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2FuY2VsYWJsZV1cbiAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyBjYW5jZWxhYmxlIG9yIG5vdC4gRGVmYXVsdCBpcyBgZmFsc2VgLiBJZiB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgaXQgY2FuIGJlIGNsb3NlZCBieSBjbGlja2luZyB0aGUgYmFja2dyb3VuZCBvciBwcmVzc2luZyB0aGUgQW5kcm9pZCBiYWNrIGJ1dHRvbi5bL2VuXVxuICogICBbamFd44OA44Kk44Ki44Ot44Kw44GM44Kt44Oj44Oz44K744Or5Y+v6IO944GL44Gp44GG44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBub25lYCBhbmQgYGZhZGVgLiBEZWZhdWx0IGlzIGBmYWRlYC5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GZ44KL6Zqb44Gu44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwiZmFkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pZF1cbiAqICAgW2VuXVRoZSBgPG9ucy1hbGVydC1kaWFsb2c+YCBlbGVtZW50J3MgSUQuWy9lbl1cbiAqICAgW2phXW9ucy1hbGVydC1kaWFsb2fopoHntKDjga5JROOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2xhc3NdXG4gKiAgIFtlbl1UaGUgYDxvbnMtYWxlcnQtZGlhbG9nPmAgZWxlbWVudCdzIGNsYXNzLlsvZW5dXG4gKiAgIFtqYV1vbnMtYWxlcnQtZGlhbG9n6KaB57Sg44GuY2xhc3PjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuICogICBbZW5dRGlhbG9nIHRpdGxlLiBEZWZhdWx0IGlzIGBcIkFsZXJ0XCJgLlsvZW5dXG4gKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga7kuIrpg6jjgavooajnpLrjgZnjgovjgr/jgqTjg4jjg6vjgpLmjIflrprjgZfjgb7jgZnjgIJcIkFsZXJ0XCLjgYzjg4fjg5Xjgqnjg6vjg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1vZGlmaWVyXVxuICogICBbZW5dTW9kaWZpZXIgZm9yIHRoZSBkaWFsb2cuWy9lbl1cbiAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBrm1vZGlmaWVy5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tYXNrQ29sb3JdXG4gKiAgIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIgKFwicmdiYSgwLCAwLCAwLCAwLjMpXCIgZm9yIE1hdGVyaWFsKS5bL2VuXVxuICogICBbamFd6IOM5pmv44Gu44Oe44K544Kv44Gu6Imy44KS5oyH5a6a44GX44G+44GZ44CCXCJyZ2JhKDAsIDAsIDAsIDAuMilcIuOBjOODh+ODleOCqeODq+ODiOWApOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAqICAgW2VuXUZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYWZ0ZXIgZGlhbG9nIGhhcyBiZWVuIGNsb3NlZC5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GM6ZaJ44GY44KJ44KM44Gf5pmC44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRGlzcGxheSBhbiBhbGVydCBkaWFsb2cgdG8gc2hvdyB0aGUgdXNlciBhIG1lc3NhZ2UuXG4gKlxuICogICAgIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGNhbiBiZSBlaXRoZXIgc2ltcGxlIHRleHQgb3IgSFRNTC5cbiAqXG4gKiAgICAgSXQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKlxuICogICAgIGBgYFxuICogICAgIG9ucy5ub3RpZmljYXRpb24uYWxlcnQobWVzc2FnZSwgb3B0aW9ucyk7XG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5hbGVydChvcHRpb25zKTtcbiAqICAgICBgYGBcbiAqXG4gKiAgICAgTXVzdCBzcGVjaWZ5IGVpdGhlciBgbWVzc2FnZWAgb3IgYG1lc3NhZ2VIVE1MYC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVxuICogICAgIOODpuODvOOCtuODvOOBuOODoeODg+OCu+ODvOOCuOOCkuimi+OBm+OCi+OBn+OCgeOBruOCouODqeODvOODiOODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglxuICogICAgIOihqOekuuOBmeOCi+ODoeODg+OCu+ODvOOCuOOBr+OAgeODhuOCreOCueODiOOBi+OCguOBl+OBj+OBr0hUTUzjgpLmjIflrprjgafjgY3jgb7jgZnjgIJcbiAqICAgICDjgZPjga7jg6Hjgr3jg4Pjg4njga7lvJXmlbDjgavjga/jgIFvcHRpb25zLm1lc3NhZ2XjgoLjgZfjgY/jga9vcHRpb25zLm1lc3NhZ2VIVE1M44Gu44Gp44Gh44KJ44GL44KS5b+F44Ga5oyH5a6a44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKi9cbm5vdGlmaWNhdGlvbi5hbGVydCA9IChtZXNzYWdlLCBvcHRpb25zKSA9PlxuICBub3RpZmljYXRpb24uX2NyZWF0ZUFsZXJ0RGlhbG9nKG1lc3NhZ2UsIG9wdGlvbnMsIHtcbiAgICBidXR0b25MYWJlbHM6IFsnT0snXSxcbiAgICB0aXRsZTogJ0FsZXJ0J1xuICB9KTtcblxuLyoqXG4gKiBAbWV0aG9kIGNvbmZpcm1cbiAqIEBzaWduYXR1cmUgY29uZmlybShtZXNzYWdlIFssIG9wdGlvbnNdIHwgb3B0aW9ucylcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1XaWxsIHJlc29sdmUgdG8gdGhlIGluZGV4IG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCBvciBgLTFgIHdoZW4gY2FuY2VsZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogICBbZW5dTm90aWZpY2F0aW9uIG1lc3NhZ2UuIFRoaXMgYXJndW1lbnQgaXMgb3B0aW9uYWwgYnV0IGlmIGl0J3Mgbm90IGRlZmluZWQgZWl0aGVyIGBvcHRpb25zLm1lc3NhZ2VgIG9yIGBvcHRpb25zLm1lc3NhZ2VIVE1MYCBtdXN0IGJlIGRlZmluZWQgaW5zdGVhZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5idXR0b25MYWJlbHNdXG4gKiAgIFtlbl1MYWJlbHMgZm9yIHRoZSBidXR0b25zLiBEZWZhdWx0IGlzIGBbXCJDYW5jZWxcIiwgXCJPS1wiXWAuWy9lbl1cbiAqICAgW2phXeODnOOCv+ODs+OBruODqeODmeODq+OBrumFjeWIl+OCkuaMh+WumuOBl+OBvuOBmeOAgltcIkNhbmNlbFwiLCBcIk9LXCJd44GM44OH44OV44Kp44Or44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXhdXG4gKiAgIFtlbl1JbmRleCBvZiBwcmltYXJ5IGJ1dHRvbi4gRGVmYXVsdCBpcyB0aGUgbGFzdCBvbmUuWy9lbl1cbiAqICAgW2phXeODl+ODqeOCpOODnuODquODnOOCv+ODs+OBruOCpOODs+ODh+ODg+OCr+OCueOCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBryAxIOOBp+OBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIERpc3BsYXkgYSBkaWFsb2cgdG8gYXNrIHRoZSB1c2VyIGZvciBjb25maXJtYXRpb24uIEV4dGVuZHMgYGFsZXJ0KClgIHBhcmFtZXRlcnMuXG4gKiAgICAgVGhlIGRlZmF1bHQgYnV0dG9uIGxhYmVscyBhcmUgYFwiQ2FuY2VsXCJgIGFuZCBgXCJPS1wiYCBidXQgdGhleSBjYW4gYmUgY3VzdG9taXplZC5cbiAqXG4gKiAgICAgSXQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKlxuICogICAgIGBgYFxuICogICAgIG9ucy5ub3RpZmljYXRpb24uY29uZmlybShtZXNzYWdlLCBvcHRpb25zKTtcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLmNvbmZpcm0ob3B0aW9ucyk7XG4gKiAgICAgYGBgXG4gKlxuICogICAgIE11c3Qgc3BlY2lmeSBlaXRoZXIgYG1lc3NhZ2VgIG9yIGBtZXNzYWdlSFRNTGAuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjg6bjg7zjgrbjgavnorroqo3jgpLkv4PjgZnjg4DjgqTjgqLjg63jgrDjgpLooajnpLrjgZfjgb7jgZnjgIJcbiAqICAgICDjg4fjgqrjg6vjgajjga7jg5zjgr/jg7Pjg6njg5njg6vjga/jgIFcIkNhbmNlbFwi44GoXCJPS1wi44Gn44GZ44GM44CB44GT44KM44Gv44GT44Gu44Oh44K944OD44OJ44Gu5byV5pWw44Gn44Kr44K544K/44Oe44Kk44K644Gn44GN44G+44GZ44CCXG4gKiAgICAg44GT44Gu44Oh44K944OD44OJ44Gu5byV5pWw44Gr44Gv44CBb3B0aW9ucy5tZXNzYWdl44KC44GX44GP44Gvb3B0aW9ucy5tZXNzYWdlSFRNTOOBruOBqeOBoeOCieOBi+OCkuW/heOBmuaMh+WumuOBmeOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAglxuICogICBbL2phXVxuICovXG5ub3RpZmljYXRpb24uY29uZmlybSA9IChtZXNzYWdlLCBvcHRpb25zKSA9PlxuICBub3RpZmljYXRpb24uX2NyZWF0ZUFsZXJ0RGlhbG9nKG1lc3NhZ2UsIG9wdGlvbnMsIHtcbiAgICBidXR0b25MYWJlbHM6IFsnQ2FuY2VsJywgJ09LJ10sXG4gICAgdGl0bGU6ICdDb25maXJtJ1xuICB9KTtcblxuLyoqXG4gKiBAbWV0aG9kIHByb21wdFxuICogQHNpZ25hdHVyZSBwcm9tcHQobWVzc2FnZSBbLCBvcHRpb25zXSB8IG9wdGlvbnMpXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogICBbZW5dTm90aWZpY2F0aW9uIG1lc3NhZ2UuIFRoaXMgYXJndW1lbnQgaXMgb3B0aW9uYWwgYnV0IGlmIGl0J3Mgbm90IGRlZmluZWQgZWl0aGVyIGBvcHRpb25zLm1lc3NhZ2VgIG9yIGBvcHRpb25zLm1lc3NhZ2VIVE1MYCBtdXN0IGJlIGRlZmluZWQgaW5zdGVhZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1XaWxsIHJlc29sdmUgdG8gdGhlIGlucHV0IHZhbHVlIHdoZW4gdGhlIGRpYWxvZyBpcyBjbG9zZWQgb3IgYG51bGxgIHdoZW4gY2FuY2VsZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nIHwgQXJyYXl9IFtvcHRpb25zLmJ1dHRvbkxhYmVsc11cbiAqICAgW2VuXUxhYmVscyBmb3IgdGhlIGJ1dHRvbnMuIERlZmF1bHQgaXMgYFwiT0tcImAuWy9lbl1cbiAqICAgW2phXeeiuuiqjeODnOOCv+ODs+OBruODqeODmeODq+OCkuaMh+WumuOBl+OBvuOBmeOAglwiT0tcIuOBjOODh+ODleOCqeODq+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucHJpbWFyeUJ1dHRvbkluZGV4XVxuICogICBbZW5dSW5kZXggb2YgcHJpbWFyeSBidXR0b24uIERlZmF1bHQgaXMgdGhlIGxhc3Qgb25lLlsvZW5dXG4gKiAgIFtqYV3jg5fjg6njgqTjg57jg6rjg5zjgr/jg7Pjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga8gMCDjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBsYWNlaG9sZGVyXVxuICogICBbZW5dUGxhY2Vob2xkZXIgZm9yIHRoZSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV3jg4bjgq3jgrnjg4jmrITjga7jg5fjg6zjg7zjgrnjg5vjg6vjg4DjgavooajnpLrjgZnjgovjg4bjgq3jgrnjg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRlZmF1bHRWYWx1ZV1cbiAqICAgW2VuXURlZmF1bHQgdmFsdWUgZm9yIHRoZSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV3jg4bjgq3jgrnjg4jmrITjga7jg4fjg5Xjgqnjg6vjg4jjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmlucHV0VHlwZV1cbiAqICAgW2VuXVR5cGUgb2YgdGhlIGlucHV0IGVsZW1lbnQgKGBwYXNzd29yZGAsIGBkYXRlYC4uLikuIERlZmF1bHQgaXMgYHRleHRgLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdXRvZm9jdXNdXG4gKiAgIFtlbl1BdXRvZm9jdXMgdGhlIGlucHV0IGVsZW1lbnQuIERlZmF1bHQgaXMgYHRydWVgLiBJbiBDb3Jkb3ZhLCBgS2V5Ym9hcmREaXNwbGF5UmVxdWlyZXNVc2VyQWN0aW9uYCBpbiBgY29uZmlnLnhtbGAgbXVzdCBiZSBgZmFsc2VgIHRvIGFjdGl2YXRlIHRoaXMgZmVhdHVyZS5bL2VuXVxuICogICBbamFdaW5wdXTopoHntKDjgavoh6rli5XnmoTjgavjg5Xjgqnjg7zjgqvjgrnjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga90cnVl44Gn44GZ44CCQ29yZG92YeeSsOWig+OBp+OBr+OAgeOBk+OBruapn+iDveOCkuacieWKueOBq+OBmeOCi+OBn+OCgeOBq+OBryBgY29uZmlnLnhtbGAg44GnIGBLZXlib2FyZERpc3BsYXlSZXF1aXJlc1VzZXJBY3Rpb25gIOOCkiBgZmFsc2VgIOOBq+ioreWumuOBmeOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN1Ym1pdE9uRW50ZXJdXG4gKiAgIFtlbl1TdWJtaXQgYXV0b21hdGljYWxseSB3aGVuIGVudGVyIGlzIHByZXNzZWQuIERlZmF1bHQgaXMgYHRydWVgLlsvZW5dXG4gKiAgIFtqYV1FbnRlcuOBjOaKvOOBleOCjOOBn+mam+OBq+OBneOBrmZvcm3jgpJzdWJtaXTjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga90cnVl44Gn44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRGlzcGxheSBhIGRpYWxvZyB3aXRoIGEgcHJvbXB0IHRvIGFzayB0aGUgdXNlciBhIHF1ZXN0aW9uLiBFeHRlbmRzIGBhbGVydCgpYCBwYXJhbWV0ZXJzLlxuICpcbiAqICAgICBJdCBjYW4gYmUgY2FsbGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqXG4gKiAgICAgYGBgXG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5wcm9tcHQobWVzc2FnZSwgb3B0aW9ucyk7XG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5wcm9tcHQob3B0aW9ucyk7XG4gKiAgICAgYGBgXG4gKlxuICogICAgIE11c3Qgc3BlY2lmeSBlaXRoZXIgYG1lc3NhZ2VgIG9yIGBtZXNzYWdlSFRNTGAuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjg6bjg7zjgrbjg7zjgavlhaXlipvjgpLkv4PjgZnjg4DjgqTjgqLjg63jgrDjgpLooajnpLrjgZfjgb7jgZnjgIJcbiAqICAgICDjgZPjga7jg6Hjgr3jg4Pjg4njga7lvJXmlbDjgavjga/jgIFvcHRpb25zLm1lc3NhZ2XjgoLjgZfjgY/jga9vcHRpb25zLm1lc3NhZ2VIVE1M44Gu44Gp44Gh44KJ44GL44KS5b+F44Ga5oyH5a6a44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKi9cbm5vdGlmaWNhdGlvbi5wcm9tcHQgPSAobWVzc2FnZSwgb3B0aW9ucykgPT5cbiAgbm90aWZpY2F0aW9uLl9jcmVhdGVBbGVydERpYWxvZyhtZXNzYWdlLCBvcHRpb25zLCB7XG4gICAgYnV0dG9uTGFiZWxzOiBbJ09LJ10sXG4gICAgdGl0bGU6ICdBbGVydCcsXG4gICAgaXNQcm9tcHQ6IHRydWUsXG4gICAgYXV0b2ZvY3VzOiB0cnVlLFxuICAgIHN1Ym1pdE9uRW50ZXI6IHRydWVcbiAgfSk7XG5cbi8qKlxuICogQG1ldGhvZCB0b2FzdFxuICogQHNpZ25hdHVyZSB0b2FzdChtZXNzYWdlIFssIG9wdGlvbnNdIHwgb3B0aW9ucylcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1XaWxsIHJlc29sdmUgd2hlbiB0aGUgdG9hc3QgaXMgaGlkZGVuLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAqICAgW2VuXVRvYXN0IG1lc3NhZ2UuIFRoaXMgYXJndW1lbnQgaXMgb3B0aW9uYWwgYnV0IGlmIGl0J3Mgbm90IGRlZmluZWQgdGhlbiBgb3B0aW9ucy5tZXNzYWdlYCBtdXN0IGJlIGRlZmluZWQgaW5zdGVhZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VdXG4gKiAgIFtlbl1Ob3RpZmljYXRpb24gbWVzc2FnZS5bL2VuXVxuICogICBbamFd44OI44O844K544OI44Gr6KGo56S644GZ44KL5paH5a2X5YiX44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5idXR0b25MYWJlbF1cbiAqICAgW2VuXUxhYmVsIGZvciB0aGUgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV3norroqo3jg5zjgr/jg7Pjga7jg6njg5njg6vjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYG5vbmVgLCBgZmFkZWAsIGBhc2NlbmRgLCBgbGlmdGAgYW5kIGBmYWxsYC4gRGVmYXVsdCBpcyBgYXNjZW5kYCBmb3IgQW5kcm9pZCBhbmQgYGxpZnRgIGZvciBpT1MuWy9lbl1cbiAqICAgW2phXeODiOODvOOCueODiOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwiLCBcImZhZGVcIiwgXCJhc2NlbmRcIiwgXCJsaWZ0XCIsIFwiZmFsbFwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0XVxuICogICBbZW5dTnVtYmVyIG9mIG1pbGlzZWNvbmRzIHdoZXJlIHRoZSB0b2FzdCBpcyB2aXNpYmxlIGJlZm9yZSBoaWRpbmcgYXV0b21hdGljYWxseS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VdXG4gKiAgIFtlbl1JZiBgdHJ1ZWAsIHRoZSB0b2FzdCBza2lwcyB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlIGFuZCBpcyBzaG93biBpbW1lZGlhdGVseS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pZF1cbiAqICAgW2VuXVRoZSBgPG9ucy10b2FzdD5gIGVsZW1lbnQncyBJRC5bL2VuXVxuICogICBbamFdb25zLXRvYXN06KaB57Sg44GuSUTjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNsYXNzXVxuICogICBbZW5dVGhlIGA8b25zLXRvYXN0PmAgZWxlbWVudCdzIGNsYXNzLlsvZW5dXG4gKiAgIFtqYV1vbnMtdG9hc3TopoHntKDjga5jbGFzc+OAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gKiAgIFtlbl1Nb2RpZmllciBmb3IgdGhlIGVsZW1lbnQuWy9lbl1cbiAqICAgW2phXeODiOODvOOCueODiOOBrm1vZGlmaWVy5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICogICBbZW5dRnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhZnRlciB0b2FzdCBoYXMgYmVlbiBoaWRkZW4uWy9lbl1cbiAqICAgW2phXeODiOODvOOCueODiOOBjOmWieOBmOOCieOCjOOBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIERpc3BsYXkgYSBzaW1wbGUgbm90aWZpY2F0aW9uIHRvYXN0IHdpdGggYW4gb3B0aW9uYWwgYnV0dG9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNpbXBsZSBhY3Rpb25zLlxuICpcbiAqICAgICBJdCBjYW4gYmUgY2FsbGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqXG4gKiAgICAgYGBgXG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi50b2FzdChtZXNzYWdlLCBvcHRpb25zKTtcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLnRvYXN0KG9wdGlvbnMpO1xuICogICAgIGBgYFxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xubm90aWZpY2F0aW9uLnRvYXN0ID0gKG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0KCdUb2FzdCcpOyAvLyBUaHJvd3MgZXJyb3IsIG11c3QgYmUgaW5zaWRlIHByb21pc2VcblxuICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzKG1lc3NhZ2UsIG9wdGlvbnMsIHtcbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICBmb3JjZTogZmFsc2VcbiAgICB9KTtcblxuICAgIGxldCB0b2FzdCA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICA8b25zLXRvYXN0PlxuICAgICAgICAke29wdGlvbnMubWVzc2FnZX1cbiAgICAgICAgJHtvcHRpb25zLmJ1dHRvbkxhYmVscyA/IGA8YnV0dG9uPiR7b3B0aW9ucy5idXR0b25MYWJlbHNbMF19PC9idXR0b24+YCA6ICcnfVxuICAgICAgPC9vbnMtdG9hc3Q+XG4gICAgYCk7XG5cbiAgICBfc2V0QXR0cmlidXRlcyh0b2FzdCwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBvcmlnaW5hbEhpZGUgPSB0b2FzdC5oaWRlLmJpbmQodG9hc3QpO1xuXG4gICAgY29uc3QgZmluaXNoID0gdmFsdWUgPT4ge1xuICAgICAgaWYgKHRvYXN0KSB7XG4gICAgICAgIG9yaWdpbmFsSGlkZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodG9hc3QpIHtcbiAgICAgICAgICAgIHRvYXN0LnJlbW92ZSgpO1xuICAgICAgICAgICAgdG9hc3QgPSBudWxsO1xuICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjayh2YWx1ZSk7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy5idXR0b25MYWJlbHMpIHtcbiAgICAgIHV0aWwuZmluZENoaWxkKHRvYXN0Ll90b2FzdCwgJ2J1dHRvbicpLm9uY2xpY2sgPSAoKSA9PiBmaW5pc2goMCk7XG4gICAgfVxuXG4gICAgLy8gb3ZlcndyaXRlIHNvIHRoYXQgb25zLm5vdGlmaWNhdGlvbi5oaWRlIHJlc29sdmVzIHdoZW4gdG9hc3QuaGlkZSBpcyBjYWxsZWRcbiAgICB0b2FzdC5oaWRlID0gKCkgPT4gZmluaXNoKC0xKTtcblxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3QpO1xuICAgIG9wdGlvbnMuY29tcGlsZSh0b2FzdCk7XG5cbiAgICBjb25zdCBzaG93ID0gKCkgPT4ge1xuICAgICAgdG9hc3QucGFyZW50RWxlbWVudCAmJiB0b2FzdC5zaG93KG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBmaW5pc2goLTEpLCBvcHRpb25zLnRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IG9wdGlvbnMuZm9yY2UgPyBzaG93KCkgOiBUb2FzdFF1ZXVlLmFkZChzaG93LCBwcm9taXNlKSk7XG4gIH0pO1xuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbm90aWZpY2F0aW9uO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxuLy8gVmFsaWRhdGUgcGFyYW1ldGVyc1xuY29uc3QgY2hlY2tPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGNvbnN0IGVyciA9IChwcm9wLCB0eXBlID0gJ0Z1bmN0aW9uJykgPT4gdXRpbC50aHJvdyhgXCJvcHRpb25zLiR7cHJvcH1cIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mICR7dHlwZX1gKTtcbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBwcm9wID0+IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsIHByb3ApO1xuICBjb25zdCBpbnN0YW5jZU9mID0gKHByb3AsIHR5cGUgPSBGdW5jdGlvbikgPT4gb3B0aW9uc1twcm9wXSBpbnN0YW5jZW9mIHR5cGU7XG5cbiAgY29uc3QgYiA9ICdidXR0b25zJywgY2IgPSAnY2FsbGJhY2snLCBjID0gJ2NvbXBpbGUnLCBkID0gJ2Rlc3Ryb3knO1xuICAoIWhhc093blByb3BlcnR5KGIpIHx8ICFpbnN0YW5jZU9mKGIsIEFycmF5KSkgJiYgZXJyKGIsICdBcnJheScpO1xuICAoaGFzT3duUHJvcGVydHkoY2IpICYmICFpbnN0YW5jZU9mKGNiKSkgJiYgZXJyKGNiKTtcbiAgKGhhc093blByb3BlcnR5KGMpICYmICFpbnN0YW5jZU9mKGMpKSAmJiBlcnIoYyk7XG4gIChoYXNPd25Qcm9wZXJ0eShkKSAmJiAhaW5zdGFuY2VPZihkKSkgJiYgZXJyKGQpO1xufTtcblxuLy8gQWN0aW9uIFNoZWV0XG5leHBvcnQgZGVmYXVsdCAob3B0aW9ucyA9IHt9KSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgdXRpbC5jaGVja01pc3NpbmdJbXBvcnQoJ0FjdGlvblNoZWV0Jyk7XG4gIGNoZWNrT3B0aW9ucyhvcHRpb25zKTtcblxuICAvLyBNYWluIGNvbXBvbmVudFxuICBsZXQgYWN0aW9uU2hlZXQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgIDxvbnMtYWN0aW9uLXNoZWV0XG4gICAgICAke29wdGlvbnMudGl0bGUgPyBgdGl0bGU9XCIke29wdGlvbnMudGl0bGV9XCJgIDogJyd9XG4gICAgICAke29wdGlvbnMuY2FuY2VsYWJsZSA/ICdjYW5jZWxhYmxlJyA6ICcnfVxuICAgICAgJHtvcHRpb25zLm1vZGlmaWVyID8gYG1vZGlmaWVyPVwiJHtvcHRpb25zLm1vZGlmaWVyfVwiYCA6ICcnfVxuICAgICAgJHtvcHRpb25zLm1hc2tDb2xvciA/IGBtYXNrLWNvbG9yPVwiJHtvcHRpb25zLm1hc2tDb2xvcn1cImAgOiAnJ31cbiAgICAgICR7b3B0aW9ucy5pZCA/IGBpZD1cIiR7b3B0aW9ucy5pZH1cImAgOiAnJ31cbiAgICAgICR7b3B0aW9ucy5jbGFzcyA/IGBjbGFzcz1cIiR7b3B0aW9ucy5jbGFzc31cImAgOiAnJ31cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXNoZWV0XCI+PC9kaXY+XG4gICAgPC9vbnMtYWN0aW9uLXNoZWV0PlxuICBgKTtcblxuICAvLyBSZXNvbHZlIGFjdGlvbiBhbmQgY2xlYW4gdXBcbiAgY29uc3QgZmluaXNoID0gKGV2ZW50LCBpbmRleCA9IC0xKSA9PiB7XG4gICAgaWYgKGFjdGlvblNoZWV0KSB7XG4gICAgICBvcHRpb25zLmRlc3Ryb3kgJiYgb3B0aW9ucy5kZXN0cm95KGFjdGlvblNoZWV0KTtcblxuICAgICAgYWN0aW9uU2hlZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGlhbG9nY2FuY2VsJywgZmluaXNoLCBmYWxzZSk7XG4gICAgICBhY3Rpb25TaGVldC5yZW1vdmUoKTtcbiAgICAgIGFjdGlvblNoZWV0ID0gbnVsbDtcblxuICAgICAgb3B0aW9ucy5jYWxsYmFjayAmJiBvcHRpb25zLmNhbGxiYWNrKGluZGV4KTtcbiAgICAgIHJlc29sdmUoaW5kZXgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBMaW5rIGNhbmNlbCBoYW5kbGVyXG4gIGFjdGlvblNoZWV0LmFkZEV2ZW50TGlzdGVuZXIoJ2RpYWxvZ2NhbmNlbCcsIGZpbmlzaCwgZmFsc2UpO1xuXG4gIC8vIENyZWF0ZSBidXR0b25zIGFuZCBsaW5rIGFjdGlvbiBoYW5kbGVyXG4gIGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIG9wdGlvbnMuYnV0dG9ucy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGJ1dHRvbk9wdGlvbnMgPSAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IHsgbGFiZWw6IGl0ZW0gfSA6IHsgLi4uaXRlbSB9O1xuICAgIGlmIChvcHRpb25zLmRlc3RydWN0aXZlID09PSBpbmRleCkge1xuICAgICAgYnV0dG9uT3B0aW9ucy5tb2RpZmllciA9IChidXR0b25PcHRpb25zLm1vZGlmaWVyIHx8ICcnKSArICcgZGVzdHJ1Y3RpdmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1dHRvbiA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICA8b25zLWFjdGlvbi1zaGVldC1idXR0b25cbiAgICAgICAgJHtidXR0b25PcHRpb25zLmljb24gPyBgaWNvbj1cIiR7YnV0dG9uT3B0aW9ucy5pY29ufVwiYCA6ICcnfVxuICAgICAgICAke2J1dHRvbk9wdGlvbnMubW9kaWZpZXIgPyBgbW9kaWZpZXI9XCIke2J1dHRvbk9wdGlvbnMubW9kaWZpZXJ9XCJgIDogJyd9XG4gICAgICA+XG4gICAgICAgICR7YnV0dG9uT3B0aW9ucy5sYWJlbH1cbiAgICAgIDwvb25zLWFjdGlvbi1zaGVldC1idXR0b24+XG4gICAgYCk7XG5cbiAgICBidXR0b24ub25jbGljayA9IGV2ZW50ID0+IGFjdGlvblNoZWV0LmhpZGUoKS50aGVuKCgpID0+IGZpbmlzaChldmVudCwgaW5kZXgpKTtcbiAgICBidXR0b25zLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH0pO1xuXG4gIC8vIEZpbmlzaCBjb21wb25lbnQgYW5kIGF0dGFjaFxuICB1dGlsLmZpbmRDaGlsZChhY3Rpb25TaGVldCwgJy5hY3Rpb24tc2hlZXQnKS5hcHBlbmRDaGlsZChidXR0b25zKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhY3Rpb25TaGVldCk7XG4gIG9wdGlvbnMuY29tcGlsZSAmJiBvcHRpb25zLmNvbXBpbGUoZWwuZGlhbG9nKTtcblxuICAvLyBTaG93XG4gIHNldEltbWVkaWF0ZSgoKSA9PiBhY3Rpb25TaGVldC5zaG93KHtcbiAgICBhbmltYXRpb246IG9wdGlvbnMuYW5pbWF0aW9uLFxuICAgIGFuaW1hdGlvbk9wdGlvbnM6IG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc1xuICB9KSk7XG59KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBNaWNyb0V2ZW50IGZyb20gJy4vbWljcm9ldmVudC5qcyc7XG5cbmNvbnN0IGNyZWF0ZSA9ICgpID0+IHtcblxuICAvKipcbiAgICogQG9iamVjdCBvbnMub3JpZW50YXRpb25cbiAgICogQGNhdGVnb3J5IHV0aWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVV0aWxpdHkgbWV0aG9kcyBmb3Igb3JpZW50YXRpb24gZGV0ZWN0aW9uLlsvZW5dXG4gICAqICAgW2phXeeUu+mdouOBruOCquODquOCqOODs+ODhuODvOOCt+ODp+ODs+aknOefpeOBruOBn+OCgeOBruODpuODvOODhuOCo+ODquODhuOCo+ODoeOCveODg+ODieOCkuWPjuOCgeOBpuOBhOOCi+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqL1xuICBjb25zdCBvYmogPSB7XG4gICAgLyoqXG4gICAgICogQGV2ZW50IGNoYW5nZVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2VzLlsvZW5dXG4gICAgICogICBbamFd44OH44OQ44Kk44K544Gu44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GM5aSJ5YyW44GX44Gf6Zqb44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNQb3J0cmFpdFxuICAgICAqICAgW2VuXVdpbGwgYmUgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcmllbnRhdGlvbiBpcyBwb3J0cmFpdCBtb2RlLlsvZW5dXG4gICAgICogICBbamFd54++5Zyo44Gu44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMcG9ydHJhaXTjga7loLTlkIjjgat0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgb25cbiAgICAgKiBAc2lnbmF0dXJlIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAgICAgKiAgIFtqYV3jgZPjga7jgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBvbmNlXG4gICAgICogQHNpZ25hdHVyZSBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCdzIG9ubHkgdHJpZ2dlcmVkIG9uY2UuWy9lbl1cbiAgICAgKiAgW2phXeS4gOW6puOBoOOBkeWRvOOBs+WHuuOBleOCjOOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgb2ZmXG4gICAgICogQHNpZ25hdHVyZSBvZmYoZXZlbnROYW1lLCBbbGlzdGVuZXJdKVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqICBbZW5dUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHNwZWNpZmllZCBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgdHlwZSB3aWxsIGJlIHJlbW92ZWQuWy9lbl1cbiAgICAgKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAguOCguOBl+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBquOBi+OBo+OBn+WgtOWQiOOBq+OBr+OAgeOBneOBruOCpOODmeODs+ODiOOBq+e0kOOBpeOBj+WFqOOBpuOBruOCpOODmeODs+ODiOODquOCueODiuODvOOBjOWJiumZpOOBleOCjOOBvuOBmeOAglsvamFdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gICAgICogICBbamFd5YmK6Zmk44GZ44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cblxuICAgIC8vIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiB0byBkZXRlY3QgaWYgd2hldGhlciBjdXJyZW50IHNjcmVlbiBpcyBwb3J0cmFpdCBvciBub3RcbiAgICBfaXNQb3J0cmFpdDogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGlzUG9ydHJhaXRcbiAgICAgKiBAc2lnbmF0dXJlIGlzUG9ydHJhaXQoKVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICogICBbZW5dV2lsbCBiZSB0cnVlIGlmIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGlzIHBvcnRyYWl0IG1vZGUuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgYxwb3J0cmFpdOODouODvOODieOBruWgtOWQiOOBq3RydWXjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JlZW4gb3JpZW50YXRpb24gaXMgcG9ydHJhaXQgb3Igbm90LlsvZW5dXG4gICAgICogICBbamFd44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMcG9ydHJhaXTjg6Ljg7zjg4njgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuICAgIGlzUG9ydHJhaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzUG9ydHJhaXQoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBpc0xhbmRzY2FwZVxuICAgICAqIEBzaWduYXR1cmUgaXNMYW5kc2NhcGUoKVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICogICBbZW5dV2lsbCBiZSB0cnVlIGlmIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGlzIGxhbmRzY2FwZSBtb2RlLlsvZW5dXG4gICAgICogICBbamFd44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMbGFuZHNjYXBl44Oi44O844OJ44Gu5aC05ZCI44GrdHJ1ZeOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBpcyBsYW5kc2NhcGUgb3Igbm90LlsvZW5dXG4gICAgICogICBbamFd44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMbGFuZHNjYXBl44Oi44O844OJ44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cbiAgICBpc0xhbmRzY2FwZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNQb3J0cmFpdCgpO1xuICAgIH0sXG5cbiAgICBfaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgdGhpcy5fb25ET01Db250ZW50TG9hZGVkLmJpbmQodGhpcyksIGZhbHNlKTtcblxuICAgICAgaWYgKCdvcmllbnRhdGlvbicgaW4gd2luZG93KSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHRoaXMuX29uT3JpZW50YXRpb25DaGFuZ2UuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uUmVzaXplLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0ID4gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX29uRE9NQ29udGVudExvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9pbnN0YWxsSXNQb3J0cmFpdEltcGxlbWVudGF0aW9uKCk7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIHtpc1BvcnRyYWl0OiB0aGlzLmlzUG9ydHJhaXQoKX0pO1xuICAgIH0sXG5cbiAgICBfaW5zdGFsbElzUG9ydHJhaXRJbXBsZW1lbnRhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBpc1BvcnRyYWl0ID0gd2luZG93LmlubmVyV2lkdGggPCB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgIGlmICghKCdvcmllbnRhdGlvbicgaW4gd2luZG93KSkge1xuICAgICAgICB0aGlzLl9pc1BvcnRyYWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh3aW5kb3cub3JpZW50YXRpb24gJSAxODAgPT09IDApIHtcbiAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cub3JpZW50YXRpb24gJSAxODApID09PSAwID8gaXNQb3J0cmFpdCA6ICFpc1BvcnRyYWl0O1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cub3JpZW50YXRpb24gJSAxODApID09PSA5MCA/IGlzUG9ydHJhaXQgOiAhaXNQb3J0cmFpdDtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uT3JpZW50YXRpb25DaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgaXNQb3J0cmFpdCA9IHRoaXMuX2lzUG9ydHJhaXQoKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIGRpbWVuc2lvbnMgdG8gY2hhbmdlIGJlY2F1c2VcbiAgICAgIC8vIG9mIEFuZHJvaWQgaW5jb25zaXN0ZW5jeS5cbiAgICAgIGxldCBuSXRlciA9IDA7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgbkl0ZXIrKztcblxuICAgICAgICBjb25zdCB3ID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIGNvbnN0IGggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgICAgaWYgKChpc1BvcnRyYWl0ICYmIHcgPD0gaCkgfHxcbiAgICAgICAgICAgKCFpc1BvcnRyYWl0ICYmIHcgPj0gaCkpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIHtpc1BvcnRyYWl0OiBpc1BvcnRyYWl0fSk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAobkl0ZXIgPT09IDUwKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCB7aXNQb3J0cmFpdDogaXNQb3J0cmFpdH0pO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgICB9LCAyMCk7XG4gICAgfSxcblxuICAgIC8vIFJ1biBvbiBub3QgbW9iaWxlIGJyb3dzZXIuXG4gICAgX29uUmVzaXplOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IHRoaXMuaXNQb3J0cmFpdCgpfSk7XG4gICAgfVxuICB9O1xuXG4gIE1pY3JvRXZlbnQubWl4aW4ob2JqKTtcblxuICByZXR1cm4gb2JqO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlKCkuX2luaXQoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5cbi8qKlxuICogQG9iamVjdCBvbnMubW9kaWZpZXJcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVXRpbGl0eSBtZXRob2RzIHRvIGNoYW5nZSBtb2RpZmllciBhdHRyaWJ1dGVzIG9mIE9uc2VuIFVJIGVsZW1lbnRzLi5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogb25zLm1vZGlmaWVyLmFkZChteU9uc0lucHV0RWxlbWVudCwgJ3VuZGVyYmFyJyk7XG4gKiBvbnMubW9kaWZpZXIudG9nZ2xlKG15T25zVG9hc3RFbGVtZW50LCAnY3VzdG9tLW1vZGlmaWVyJyk7XG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAbWV0aG9kIGFkZFxuICAgKiBAc2lnbmF0dXJlIGFkZChlbGVtZW50LCBtb2RpZmllciBbLCBtb2RpZmllcl0pXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1BZGQgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgdG8gdGhlIGVsZW1lbnQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgaW5jbHVkZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiAgIFtlbl1UYXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJcbiAgICogICBbZW5dTmFtZSBvZiB0aGUgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGFkZDogKGVsZW1lbnQsIC4uLm1vZGlmaWVycykgPT4gbW9kaWZpZXJzLmZvckVhY2gobW9kaWZpZXIgPT4gdXRpbC5hZGRNb2RpZmllcihlbGVtZW50LCBtb2RpZmllcikpLFxuICAvKipcbiAgICogQG1ldGhvZCByZW1vdmVcbiAgICogQHNpZ25hdHVyZSByZW1vdmUoZWxlbWVudCwgbW9kaWZpZXIgWywgbW9kaWZpZXJdKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGZyb20gdGhlIGVsZW1lbnQgaWYgdGhleSBhcmUgaW5jbHVkZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiAgIFtlbl1UYXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJcbiAgICogICBbZW5dTmFtZSBvZiB0aGUgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHJlbW92ZTogKGVsZW1lbnQsIC4uLm1vZGlmaWVycykgPT4gbW9kaWZpZXJzLmZvckVhY2gobW9kaWZpZXIgPT4gdXRpbC5yZW1vdmVNb2RpZmllcihlbGVtZW50LCBtb2RpZmllcikpLFxuICAvKipcbiAgICogQG1ldGhvZCBjb250YWluc1xuICAgKiBAc2lnbmF0dXJlIGNvbnRhaW5zKGVsZW1lbnQsIG1vZGlmaWVyKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1vZGlmaWVyIGlzIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogICBbZW5dVGFyZ2V0IGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1vZGlmaWVyXG4gICAqICAgW2VuXU5hbWUgb2YgdGhlIG1vZGlmaWVyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqICAgW2VuXWB0cnVlYCB3aGVuIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXIgaXMgZm91bmQgaW4gdGhlIGVsZW1lbnQncyBgbW9kaWZpZXJgIGF0dHJpYnV0ZS4gYGZhbHNlYCBvdGhlcndpc2UuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGNvbnRhaW5zOiB1dGlsLmhhc01vZGlmaWVyLFxuICAvKipcbiAgICogQG1ldGhvZCB0b2dnbGVcbiAgICogQHNpZ25hdHVyZSB0b2dnbGUoZWxlbWVudCwgbW9kaWZpZXIgWywgZm9yY2VdKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiAgIFtlbl1UYXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJcbiAgICogICBbZW5dTmFtZSBvZiB0aGUgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IGZvcmNlXG4gICAqICAgW2VuXUlmIGl0IGV2YWx1YXRlcyB0byB0cnVlLCBhZGQgc3BlY2lmaWVkIG1vZGlmaWVyIHZhbHVlLCBhbmQgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCByZW1vdmUgaXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHRvZ2dsZTogdXRpbC50b2dnbGVNb2RpZmllclxufTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgTWljcm9FdmVudCBmcm9tICcuL21pY3JvZXZlbnQuanMnO1xuXG5jb25zdCBzb2Z0d2FyZUtleWJvYXJkID0gbmV3IE1pY3JvRXZlbnQoKTtcbnNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSBmYWxzZTtcblxuY29uc3Qgb25TaG93ID0gKCkgPT4ge1xuICBzb2Z0d2FyZUtleWJvYXJkLl92aXNpYmxlID0gdHJ1ZTtcbiAgc29mdHdhcmVLZXlib2FyZC5lbWl0KCdzaG93Jyk7XG59O1xuXG5jb25zdCBvbkhpZGUgPSAoKSA9PiB7XG4gIHNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSBmYWxzZTtcbiAgc29mdHdhcmVLZXlib2FyZC5lbWl0KCdoaWRlJyk7XG59O1xuXG5jb25zdCBiaW5kRXZlbnRzID0gKCkgPT4ge1xuICBpZiAodHlwZW9mIEtleWJvYXJkICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJ0aW5tb3NlL2NvcmRvdmEta2V5Ym9hcmQvYmxvYi85NWYzZGEzYTM4ZDhmOGUxZmE0MWZiZjQwMTQ1MzUyYzEzNTM1YTAwL1JFQURNRS5tZFxuICAgIEtleWJvYXJkLm9uc2hvdyA9IG9uU2hvdztcbiAgICBLZXlib2FyZC5vbmhpZGUgPSBvbkhpZGU7XG4gICAgc29mdHdhcmVLZXlib2FyZC5lbWl0KCdpbml0Jywge3Zpc2libGU6IEtleWJvYXJkLmlzVmlzaWJsZX0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvcmRvdmEucGx1Z2lucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvcmRvdmEucGx1Z2lucy5LZXlib2FyZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZHJpZnR5Y28vaW9uaWMtcGx1Z2lucy1rZXlib2FyZC9ibG9iL2NhMjdlY2YvUkVBRE1FLm1kXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ25hdGl2ZS5rZXlib2FyZHNob3cnLCBvblNob3cpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCduYXRpdmUua2V5Ym9hcmRoaWRlJywgb25IaWRlKTtcbiAgICBzb2Z0d2FyZUtleWJvYXJkLmVtaXQoJ2luaXQnLCB7dmlzaWJsZTogY29yZG92YS5wbHVnaW5zLktleWJvYXJkLmlzVmlzaWJsZX0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBub1BsdWdpbkVycm9yID0gKCkgPT4ge1xuICB1dGlsLndhcm4oJ29ucy1rZXlib2FyZDogQ29yZG92YSBLZXlib2FyZCBwbHVnaW4gaXMgbm90IHByZXNlbnQuJyk7XG59O1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcbiAgaWYgKCFiaW5kRXZlbnRzKCkpIHtcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW29ucy1rZXlib2FyZC1hY3RpdmVdJykgfHxcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tvbnMta2V5Ym9hcmQtaW5hY3RpdmVdJykpIHtcbiAgICAgIG5vUGx1Z2luRXJyb3IoKTtcbiAgICB9XG5cbiAgICBzb2Z0d2FyZUtleWJvYXJkLm9uID0gbm9QbHVnaW5FcnJvcjtcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNvZnR3YXJlS2V5Ym9hcmQ7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5jb25zdCBnZW5lcmF0ZUlkID0gKGZ1bmN0aW9uKCkge1xuICBsZXQgaSA9IDA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaSsrO1xuICB9O1xufSkoKTtcblxuLyoqXG4gKiBEb29yIGxvY2tpbmcgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmxvZ11cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9vckxvY2sge1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX2xvY2tMaXN0ID0gW107XG4gICAgdGhpcy5fd2FpdExpc3QgPSBbXTtcbiAgICB0aGlzLl9sb2cgPSBvcHRpb25zLmxvZyB8fCBmdW5jdGlvbigpIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbG9jay5cbiAgICpcbiAgICogQHJldHVybiB7RnVuY3Rpb259IENhbGxiYWNrIGZvciB1bmxvY2tpbmcuXG4gICAqL1xuICBsb2NrKCkge1xuICAgIGNvbnN0IHVubG9jayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3VubG9jayh1bmxvY2spO1xuICAgIH07XG4gICAgdW5sb2NrLmlkID0gZ2VuZXJhdGVJZCgpO1xuICAgIHRoaXMuX2xvY2tMaXN0LnB1c2godW5sb2NrKTtcbiAgICB0aGlzLl9sb2coJ2xvY2s6ICcgKyAodW5sb2NrLmlkKSk7XG5cbiAgICByZXR1cm4gdW5sb2NrO1xuICB9XG5cbiAgX3VubG9jayhmbikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbG9ja0xpc3QuaW5kZXhPZihmbik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBsb2NrIGxpc3QuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9ja0xpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9sb2coJ3VubG9jazogJyArIGZuLmlkKTtcblxuICAgIHRoaXMuX3RyeVRvRnJlZVdhaXRMaXN0KCk7XG4gIH1cblxuICBfdHJ5VG9GcmVlV2FpdExpc3QoKSB7XG4gICAgd2hpbGUgKCF0aGlzLmlzTG9ja2VkKCkgJiYgdGhpcy5fd2FpdExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fd2FpdExpc3Quc2hpZnQoKSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciB3YWl0aW5nIHVubG9ja2VkIGRvb3IuXG4gICAqXG4gICAqIEBwYXJhbXMge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBvbiB1bmxvY2tpbmcgdGhlIGRvb3IgY29tcGxldGVseS5cbiAgICovXG4gIHdhaXRVbmxvY2soY2FsbGJhY2spIHtcbiAgICBpZiAoIShjYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2FsbGJhY2sgcGFyYW0gbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTG9ja2VkKCkpIHtcbiAgICAgIHRoaXMuX3dhaXRMaXN0LnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNMb2NrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2tMaXN0Lmxlbmd0aCA+IDA7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5pbXBvcnQgdXRpbCBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4vaW50ZXJuYWwvaW5kZXguanMnO1xuXG4vLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBnbG9iYWwgUGFnZUxvYWRlci5cbmZ1bmN0aW9uIGxvYWRQYWdlKHtwYWdlLCBwYXJlbnQsIHBhcmFtcyA9IHt9fSwgZG9uZSwgZXJyb3IpIHtcbiAgaW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKGh0bWwgPT4ge1xuICAgIGNvbnN0IHBhZ2VFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KGh0bWwpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZChwYWdlRWxlbWVudCk7XG5cbiAgICBkb25lKHBhZ2VFbGVtZW50KTtcbiAgfSkuY2F0Y2goZSA9PiBlcnJvcihlKSk7XG59XG5cbmZ1bmN0aW9uIHVubG9hZFBhZ2UoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudC5fZGVzdHJveSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgZWxlbWVudC5fZGVzdHJveSgpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhZ2VMb2FkZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXSBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGhhcyBcImVsZW1lbnRcIiBwcm9wZXJ0eSBhbmQgXCJ1bmxvYWRcIiBmdW5jdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGxvYWRlciwgdW5sb2FkZXIpIHtcbiAgICB0aGlzLl9sb2FkZXIgPSBsb2FkZXIgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGxvYWRlciA6IGxvYWRQYWdlO1xuICAgIHRoaXMuX3VubG9hZGVyID0gdW5sb2FkZXIgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHVubG9hZGVyIDogdW5sb2FkUGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaW50ZXJuYWwgbG9hZGVyIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgc2V0IGludGVybmFsTG9hZGVyKGZuKSB7XG4gICAgaWYgKCEoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHRocm93IEVycm9yKCdGaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBGdW5jdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZXIgPSBmbjtcbiAgfVxuXG4gIGdldCBpbnRlcm5hbExvYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvcHRpb25zLnBhZ2VcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvcHRpb25zLnBhcmVudCBBIGxvY2F0aW9uIHRvIGxvYWQgcGFnZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnBhcmFtc10gRXh0cmEgcGFyYW1ldGVycyBmb3Igb25zLXBhZ2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmUgVGFrZSBhbiBvYmplY3QgdGhhdCBoYXMgXCJlbGVtZW50XCIgcHJvcGVydHkgYW5kIFwidW5sb2FkXCIgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLlxuICAgKi9cbiAgbG9hZCh7cGFnZSwgcGFyZW50LCBwYXJhbXMgPSB7fX0sIGRvbmUsIGVycm9yKSB7XG4gICAgdGhpcy5fbG9hZGVyKHtwYWdlLCBwYXJlbnQsIHBhcmFtc30sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgIGlmICghKHBhZ2VFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ3BhZ2VFbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRWxlbWVudC4nKTtcbiAgICAgIH1cblxuICAgICAgZG9uZShwYWdlRWxlbWVudCk7XG4gICAgfSwgZXJyb3IpO1xuICB9XG5cbiAgdW5sb2FkKHBhZ2VFbGVtZW50KSB7XG4gICAgaWYgKCEocGFnZUVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3BhZ2VFbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl91bmxvYWRlcihwYWdlRWxlbWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRQYWdlTG9hZGVyID0gbmV3IFBhZ2VMb2FkZXIoKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbnRQYWdlTG9hZGVyID0gbmV3IFBhZ2VMb2FkZXIoXG4gIGZ1bmN0aW9uKHtwYWdlLCBwYXJlbnQsIHBhcmFtcyA9IHt9fSwgZG9uZSkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQocGFnZS50cmltKCkpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICAgIGRvbmUoZWxlbWVudCk7XG4gIH0sXG4gIHVubG9hZFBhZ2Vcbik7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IGVsZW1lbnRzIGZyb20gJy4vZWxlbWVudHMuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuL2FuaW1pdC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4vZ2VzdHVyZS1kZXRlY3Rvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgbm90aWZpY2F0aW9uIGZyb20gJy4vbm90aWZpY2F0aW9uLmpzJztcbmltcG9ydCBhY3Rpb25TaGVldCBmcm9tICcuL2FjdGlvbi1zaGVldC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgb3JpZW50YXRpb24gZnJvbSAnLi9vcmllbnRhdGlvbi5qcyc7XG5pbXBvcnQgbW9kaWZpZXIgZnJvbSAnLi9tb2RpZmllci5qcyc7XG5pbXBvcnQgc29mdHdhcmVLZXlib2FyZCBmcm9tICcuL3NvZnR3YXJlLWtleWJvYXJkLmpzJztcbmltcG9ydCBwYWdlQXR0cmlidXRlRXhwcmVzc2lvbiBmcm9tICcuL3BhZ2UtYXR0cmlidXRlLWV4cHJlc3Npb24uanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgRG9vckxvY2sgZnJvbSAnLi9kb29ybG9jay5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0UGFnZUxvYWRlciwgUGFnZUxvYWRlciB9IGZyb20gJy4vcGFnZS1sb2FkZXIuanMnO1xuXG4vKipcbiAqIEBvYmplY3Qgb25zXG4gKiBAY2F0ZWdvcnkgdXRpbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtqYV1PbnNlbiBVSeOBp+WIqeeUqOOBp+OBjeOCi+OCsOODreODvOODkOODq+OBquOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiAgIFtlbl1BIGdsb2JhbCBvYmplY3QgdGhhdCdzIHVzZWQgaW4gT25zZW4gVUkuIFsvZW5dXG4gKi9cbmNvbnN0IG9ucyA9IHtcbiAgYW5pbWl0LFxuICBkZWZhdWx0UGFnZUxvYWRlcixcbiAgZWxlbWVudHMsXG4gIEdlc3R1cmVEZXRlY3RvcixcbiAgbW9kaWZpZXIsXG4gIG5vdGlmaWNhdGlvbixcbiAgb3JpZW50YXRpb24sXG4gIHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uLFxuICBQYWdlTG9hZGVyLFxuICBwbGF0Zm9ybSxcbiAgc29mdHdhcmVLZXlib2FyZCxcbiAgX2F1dG9TdHlsZTogYXV0b1N0eWxlLFxuICBfaW50ZXJuYWw6IGludGVybmFsLFxuICBfcmVhZHlMb2NrOiBuZXcgRG9vckxvY2soKSxcbiAgX3V0aWw6IHV0aWwsXG59O1xuXG5vbnMucGxhdGZvcm0uc2VsZWN0KCh3aW5kb3cubG9jYXRpb24uc2VhcmNoLm1hdGNoKC9wbGF0Zm9ybT0oW1xcdy1dKykvKSB8fCBbXSlbMV0pO1xuXG53YWl0RGV2aWNlUmVhZHkoKTtcblxuY29uc3QgcmVhZHlFcnJvciA9IGFmdGVyID0+IHV0aWwudGhyb3coYFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkICR7YWZ0ZXIgPyAnYWZ0ZXInIDogJ2JlZm9yZSd9IG9ucy5pc1JlYWR5KCkgaXMgdHJ1ZWApO1xuXG4vKipcbiAqIEBtZXRob2QgaXNSZWFkeVxuICogQHNpZ25hdHVyZSBpc1JlYWR5KClcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiAgIFtlbl1XaWxsIGJlIHRydWUgaWYgT25zZW4gVUkgaXMgaW5pdGlhbGl6ZWQuWy9lbl1cbiAqICAgW2phXeWIneacn+WMluOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJldHVybnMgdHJ1ZSBpZiBPbnNlbiBVSSBpcyBpbml0aWFsaXplZC5bL2VuXVxuICogICBbamFdT25zZW4gVUnjgYzjgZnjgafjgavliJ3mnJ/ljJbjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZnjg6Hjgr3jg4Pjg4njgafjgZnjgIJbL2phXVxuICovXG5vbnMuaXNSZWFkeSA9ICgpID0+IHtcbiAgcmV0dXJuICFvbnMuX3JlYWR5TG9jay5pc0xvY2tlZCgpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGlzV2ViVmlld1xuICogQHNpZ25hdHVyZSBpc1dlYlZpZXcoKVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqICAgW2VuXVdpbGwgYmUgdHJ1ZSBpZiB0aGUgYXBwIGlzIHJ1bm5pbmcgaW4gQ29yZG92YS5bL2VuXVxuICogICBbamFdQ29yZG92YeOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq3RydWXjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXR1cm5zIHRydWUgaWYgcnVubmluZyBpbnNpZGUgQ29yZG92YS5bL2VuXVxuICogICBbamFdQ29yZG92YeOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBmeODoeOCveODg+ODieOBp+OBmeOAglsvamFdXG4gKi9cbm9ucy5pc1dlYlZpZXcgPSBvbnMucGxhdGZvcm0uaXNXZWJWaWV3O1xuXG4vKipcbiAqIEBtZXRob2QgcmVhZHlcbiAqIEBzaWduYXR1cmUgcmVhZHkoY2FsbGJhY2spXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2phXeOCouODl+ODquOBruWIneacn+WMluOBq+WIqeeUqOOBmeOCi+ODoeOCveODg+ODieOBp+OBmeOAgua4oeOBleOCjOOBn+mWouaVsOOBr+OAgU9uc2VuIFVJ44Gu5Yid5pyf5YyW44GM57WC5LqG44GX44Gm44GE44KL5pmC54K544Gn5b+F44Ga5ZG844Gw44KM44G+44GZ44CCWy9qYV1cbiAqICAgW2VuXU1ldGhvZCB1c2VkIHRvIHdhaXQgZm9yIGFwcCBpbml0aWFsaXphdGlvbi4gV2FpdHMgZm9yIGBET01Db250ZW50TG9hZGVkYCBhbmQgYGRldmljZXJlYWR5YCwgd2hlbiBuZWNlc3NhcnksIGJlZm9yZSBleGVjdXRpbmcgdGhlIGNhbGxiYWNrLlsvZW5dXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogICBbZW5dRnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhZnRlciBPbnNlbiBVSSBoYXMgYmVlbiBpbml0aWFsaXplZC5bL2VuXVxuICogICBbamFdT25zZW4gVUnjgYzliJ3mnJ/ljJbjgYzlrozkuobjgZfjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMucmVhZHkgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChvbnMuaXNSZWFkeSgpKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBlbHNlIHtcbiAgICBvbnMuX3JlYWR5TG9jay53YWl0VW5sb2NrKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAbWV0aG9kIHNldERlZmF1bHREZXZpY2VCYWNrQnV0dG9uTGlzdGVuZXJcbiAqIEBzaWduYXR1cmUgc2V0RGVmYXVsdERldmljZUJhY2tCdXR0b25MaXN0ZW5lcihsaXN0ZW5lcilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHdoZW4gZGV2aWNlIGJhY2sgYnV0dG9uIGlzIHByZXNzZWQuIE11c3QgYmUgY2FsbGVkIG9uIGBvbnMucmVhZHlgLlsvZW5dXG4gKiAgIFtqYV3jg4fjg5DjgqTjgrnjga7jg5Djg4Pjgq/jg5zjgr/jg7PjgYzmirzjgZXjgozjgZ/mmYLjgavlrp/ooYzjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TZXQgZGVmYXVsdCBoYW5kbGVyIGZvciBkZXZpY2UgYmFjayBidXR0b24uWy9lbl1cbiAqICAgW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OBruOBn+OCgeOBruODh+ODleOCqeODq+ODiOOBruODj+ODs+ODieODqeOCkuioreWumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cbm9ucy5zZXREZWZhdWx0RGV2aWNlQmFja0J1dHRvbkxpc3RlbmVyID0gZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgaWYgKCFvbnMuaXNSZWFkeSgpKSB7XG4gICAgcmVhZHlFcnJvcih0cnVlKTtcbiAgfVxuICBvbnMuX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlci5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZGlzYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyXG4gKiBAc2lnbmF0dXJlIGRpc2FibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1EaXNhYmxlIGRldmljZSBiYWNrIGJ1dHRvbiBldmVudCBoYW5kbGVyLiBNdXN0IGJlIGNhbGxlZCBvbiBgb25zLnJlYWR5YC5bL2VuXVxuICogW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OBruOCpOODmeODs+ODiOOCkuWPl+OBkeS7mOOBkeOBquOBhOOCiOOBhuOBq+OBl+OBvuOBmeOAglsvamFdXG4gKi9cbm9ucy5kaXNhYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCFvbnMuaXNSZWFkeSgpKSB7XG4gICAgcmVhZHlFcnJvcih0cnVlKTtcbiAgfVxuICBpbnRlcm5hbC5kYmJEaXNwYXRjaGVyLmRpc2FibGUoKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBlbmFibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlclxuICogQHNpZ25hdHVyZSBlbmFibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1FbmFibGUgZGV2aWNlIGJhY2sgYnV0dG9uIGV2ZW50IGhhbmRsZXIuIE11c3QgYmUgY2FsbGVkIG9uIGBvbnMucmVhZHlgLlsvZW5dXG4gKiBbamFd44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44Gu44Kk44OZ44Oz44OI44KS5Y+X44GR5LuY44GR44KL44KI44GG44Gr44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLmVuYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICghb25zLmlzUmVhZHkoKSkge1xuICAgIHJlYWR5RXJyb3IodHJ1ZSk7XG4gIH1cbiAgaW50ZXJuYWwuZGJiRGlzcGF0Y2hlci5lbmFibGUoKTtcbn07XG5cbm9ucy5maXJlRGV2aWNlQmFja0J1dHRvbkV2ZW50ID0gZnVuY3Rpb24oKSB7XG4gIGludGVybmFsLmRiYkRpc3BhdGNoZXIuZmlyZURldmljZUJhY2tCdXR0b25FdmVudCgpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGVuYWJsZUF1dG9TdGF0dXNCYXJGaWxsXG4gKiBAc2lnbmF0dXJlIGVuYWJsZUF1dG9TdGF0dXNCYXJGaWxsKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRW5hYmxlIHN0YXR1cyBiYXIgZmlsbCBmZWF0dXJlIG9uIGlPUzcgYW5kIGFib3ZlIChleGNlcHQgZm9yIGlQaG9uZSBYKS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBvbnMucmVhZHlgLlsvZW5dXG4gKiAgIFtqYV1pT1M35Lul5LiK77yIaVBob25lIFjjga/pmaTjgY/vvInjgafjgIHjgrnjg4bjg7zjgr/jgrnjg5Djg7zpg6jliIbjga7pq5jjgZXjgpLoh6rli5XnmoTjgavln4vjgoHjgovlh6bnkIbjgpLmnInlirnjgavjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMuZW5hYmxlQXV0b1N0YXR1c0JhckZpbGwgPSAoKSA9PiB7XG4gIGlmIChvbnMuaXNSZWFkeSgpKSB7XG4gICAgcmVhZHlFcnJvcihmYWxzZSk7XG4gIH1cbiAgaW50ZXJuYWwuY29uZmlnLmF1dG9TdGF0dXNCYXJGaWxsID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBkaXNhYmxlQXV0b1N0YXR1c0JhckZpbGxcbiAqIEBzaWduYXR1cmUgZGlzYWJsZUF1dG9TdGF0dXNCYXJGaWxsKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRGlzYWJsZSBzdGF0dXMgYmFyIGZpbGwgZmVhdHVyZSBvbiBpT1M3IGFuZCBhYm92ZSAoZXhjZXB0IGZvciBpUGhvbmUgWCkuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBgb25zLnJlYWR5YC5bL2VuXVxuICogICBbamFdaU9TN+S7peS4iu+8iGlQaG9uZSBY44Gv6Zmk44GP77yJ44Gn44CB44K544OG44O844K/44K544OQ44O86YOo5YiG44Gu6auY44GV44KS6Ieq5YuV55qE44Gr5Z+L44KB44KL5Yem55CG44KS54Sh5Yq544Gr44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLmRpc2FibGVBdXRvU3RhdHVzQmFyRmlsbCA9ICgpID0+IHtcbiAgaWYgKG9ucy5pc1JlYWR5KCkpIHtcbiAgICByZWFkeUVycm9yKGZhbHNlKTtcbiAgfVxuICBpbnRlcm5hbC5jb25maWcuYXV0b1N0YXR1c0JhckZpbGwgPSBmYWxzZTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBtb2NrU3RhdHVzQmFyXG4gKiBAc2lnbmF0dXJlIG1vY2tTdGF0dXNCYXIoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1DcmVhdGVzIGEgc3RhdGljIGVsZW1lbnQgc2ltaWxhciB0byBpT1Mgc3RhdHVzIGJhci4gT25seSB1c2VmdWwgZm9yIGJyb3dzZXIgdGVzdGluZy4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBvbnMucmVhZHlgLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5vbnMubW9ja1N0YXR1c0JhciA9ICgpID0+IHtcbiAgaWYgKG9ucy5pc1JlYWR5KCkpIHtcbiAgICByZWFkeUVycm9yKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IG1vY2sgPSAoKSA9PiB7XG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNoaWxkcmVuWzBdIHx8ICFkb2N1bWVudC5ib2R5LmNoaWxkcmVuWzBdLmNsYXNzTGlzdC5jb250YWlucygnb25zLXN0YXR1cy1iYXItbW9jaycpKSB7XG4gICAgICBjb25zdCBhbmRyb2lkID0gcGxhdGZvcm0uaXNBbmRyb2lkKCksIGkgPSBpID0+IGA8aSBjbGFzcz1cIiR7aS5zcGxpdCgnLScpWzBdfSAke2l9XCI+PC9pPmA7XG4gICAgICBjb25zdCBsZWZ0ID0gYW5kcm9pZCA/IGAke2koJ3ptZGktdHdpdHRlcicpfSAke2koJ3ptZGktZ29vZ2xlLXBsYXknKX1gIDogYE5vIFNJTSAke2koJ2ZhLXdpZmknKX1gLFxuICAgICAgICBjZW50ZXIgPSBhbmRyb2lkID8gJycgOiAnMTI6MjggUE0nLFxuICAgICAgICByaWdodCA9IGFuZHJvaWQgPyBgJHtpKCd6bWRpLW5ldHdvcmsnKX0gJHtpKCd6bWRpLXdpZmknKX0gJHtpKCd6bWRpLWJhdHRlcnknKX0gMTI6MjggUE1gIDogYDgwJSAke2koJ2ZhLWJhdHRlcnktdGhyZWUtcXVhcnRlcnMnKX1gO1xuXG4gICAgICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZSh1dGlsLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwib25zLXN0YXR1cy1iYXItbW9jayAke2FuZHJvaWQgPyAnYW5kcm9pZCcgOiAnaW9zJ31cIj5gICtcbiAgICAgICAgICBgPGRpdj4ke2xlZnR9PC9kaXY+PGRpdj4ke2NlbnRlcn08L2Rpdj48ZGl2PiR7cmlnaHR9PC9kaXY+YCArXG4gICAgICAgIGA8L2Rpdj5gXG4gICAgICApLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfTtcblxuICBkb2N1bWVudC5ib2R5XG4gICAgPyBtb2NrKClcbiAgICA6IGludGVybmFsLndhaXRET01Db250ZW50TG9hZGVkKG1vY2spO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGRpc2FibGVBbmltYXRpb25zXG4gKiBAc2lnbmF0dXJlIGRpc2FibGVBbmltYXRpb25zKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRGlzYWJsZSBhbGwgYW5pbWF0aW9ucy4gQ291bGQgYmUgaGFuZHkgZm9yIHRlc3RpbmcgYW5kIG9sZGVyIGRldmljZXMuWy9lbl1cbiAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+OCkuWFqOOBpueEoeWKueOBq+OBl+OBvuOBmeOAguODhuOCueODiOOBrumam+OBq+S+v+WIqeOBp+OBmeOAglsvamFdXG4gKi9cbm9ucy5kaXNhYmxlQW5pbWF0aW9ucyA9ICgpID0+IHtcbiAgaW50ZXJuYWwuY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA9IHRydWU7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZW5hYmxlQW5pbWF0aW9uc1xuICogQHNpZ25hdHVyZSBlbmFibGVBbmltYXRpb25zKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRW5hYmxlIGFuaW1hdGlvbnMgKGRlZmF1bHQpLlsvZW5dXG4gKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgpLmnInlirnjgavjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMuZW5hYmxlQW5pbWF0aW9ucyA9ICgpID0+IHtcbiAgaW50ZXJuYWwuY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA9IGZhbHNlO1xufTtcblxub25zLl9kaXNhYmxlV2FybmluZ3MgPSAoKSA9PiB7XG4gIGludGVybmFsLmNvbmZpZy53YXJuaW5nc0Rpc2FibGVkID0gdHJ1ZTtcbn07XG5cbm9ucy5fZW5hYmxlV2FybmluZ3MgPSAoKSA9PiB7XG4gIGludGVybmFsLmNvbmZpZy53YXJuaW5nc0Rpc2FibGVkID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZGlzYWJsZUF1dG9TdHlsaW5nXG4gKiBAc2lnbmF0dXJlIGRpc2FibGVBdXRvU3R5bGluZygpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXURpc2FibGUgYXV0b21hdGljIHN0eWxpbmcuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5kaXNhYmxlQXV0b1N0eWxpbmcgPSBhdXRvU3R5bGUuZGlzYWJsZTtcblxuLyoqXG4gKiBAbWV0aG9kIGVuYWJsZUF1dG9TdHlsaW5nXG4gKiBAc2lnbmF0dXJlIGVuYWJsZUF1dG9TdHlsaW5nKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRW5hYmxlIGF1dG9tYXRpYyBzdHlsaW5nIGJhc2VkIG9uIE9TIChkZWZhdWx0KS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xub25zLmVuYWJsZUF1dG9TdHlsaW5nID0gYXV0b1N0eWxlLmVuYWJsZTtcblxuLyoqXG4gKiBAbWV0aG9kIGRpc2FibGVJY29uQXV0b1ByZWZpeFxuICogQHNpZ25hdHVyZSBkaXNhYmxlSWNvbkF1dG9QcmVmaXgoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1EaXNhYmxlIGFkZGluZyBgZmEtYCBwcmVmaXggYXV0b21hdGljYWxseSB0byBgb25zLWljb25gIGNsYXNzZXMuIFVzZWZ1bCB3aGVuIGluY2x1ZGluZyBjdXN0b20gaWNvbiBwYWNrcy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xub25zLmRpc2FibGVJY29uQXV0b1ByZWZpeCA9ICgpID0+IHtcbiAgdXRpbC5jaGVja01pc3NpbmdJbXBvcnQoJ0ljb24nKTtcbiAgZWxlbWVudHMuSWNvbi5zZXRBdXRvUHJlZml4KGZhbHNlKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBmb3JjZVBsYXRmb3JtU3R5bGluZ1xuICogQHNpZ25hdHVyZSBmb3JjZVBsYXRmb3JtU3R5bGluZyhwbGF0Zm9ybSlcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dUmVmcmVzaCBzdHlsaW5nIGZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uIE9ubHkgdXNlZnVsIGZvciBkZW1vcy4gVXNlIGBvbnMucGxhdGZvcm0uc2VsZWN0KC4uLilgIGluc3RlYWQgZm9yIGRldmVsb3BtZW50IGFuZCBwcm9kdWN0aW9uLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtIE5ldyBwbGF0Zm9ybSB0byBzdHlsZSB0aGUgZWxlbWVudHMuXG4gKi9cbm9ucy5mb3JjZVBsYXRmb3JtU3R5bGluZyA9IG5ld1BsYXRmb3JtID0+IHtcbiAgb25zLmVuYWJsZUF1dG9TdHlsaW5nKCk7XG4gIG9ucy5wbGF0Zm9ybS5zZWxlY3QobmV3UGxhdGZvcm0gfHwgJ2lvcycpO1xuXG4gIG9ucy5fdXRpbC5hcnJheUZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpKVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1pZicpIHtcbiAgICAgICAgZWxlbWVudC5fcGxhdGZvcm1VcGRhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC50YWdOYW1lLm1hdGNoKC9eb25zLS9pKSkge1xuICAgICAgICBhdXRvU3R5bGUucHJlcGFyZShlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRhYmJhcicpIHtcbiAgICAgICAgICBlbGVtZW50Ll91cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgcHJlbG9hZFxuICogQHNpZ25hdHVyZSBwcmVsb2FkKHRlbXBsYXRlUGF0aHMpXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gdGVtcGxhdGVQYXRoc1xuICogICBbZW5dU2V0IG9mIEhUTUwgZmlsZSBwYXRocyBjb250YWluaW5nICdvbnMtcGFnZScgZWxlbWVudHMuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogICBbZW5dUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIHRoZSB0ZW1wbGF0ZXMgYXJlIGNhY2hlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dU2VwYXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCBhbmQgdGhpcyBjYW4gc2xpZ2h0bHkgZGVsYXkgcHVzaGluZyBuZXcgcGFnZXMuIFRoaXMgbWV0aG9kIHJlcXVlc3RzIGFuZCBjYWNoZXMgdGVtcGxhdGVzIGZvciBsYXRlciB1c2UuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5wcmVsb2FkID0gZnVuY3Rpb24odGVtcGxhdGVzID0gW10pIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKCh0ZW1wbGF0ZXMgaW5zdGFuY2VvZiBBcnJheSA/IHRlbXBsYXRlcyA6IFt0ZW1wbGF0ZXNdKS5tYXAodGVtcGxhdGUgPT4ge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB1dGlsLnRocm93KCdFeHBlY3RlZCBzdHJpbmcgYXJndW1lbnRzIGJ1dCBnb3QgJyArIHR5cGVvZiB0ZW1wbGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcm5hbC5nZXRUZW1wbGF0ZUhUTUxBc3luYyh0ZW1wbGF0ZSk7XG4gIH0pKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBjcmVhdGVFbGVtZW50XG4gKiBAc2lnbmF0dXJlIGNyZWF0ZUVsZW1lbnQodGVtcGxhdGUsIG9wdGlvbnMpXG4gKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVcbiAqICAgW2VuXUVpdGhlciBhbiBIVE1MIGZpbGUgcGF0aCwgYSBgPHRlbXBsYXRlPmAgaWQgb3IgYW4gSFRNTCBzdHJpbmcgc3VjaCBhcyBgJzxkaXYgaWQ9XCJmb29cIj5ob2dlPC9kaXY+J2AuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHBhcmFtIHtCb29sZWFufEhUTUxFbGVtZW50fSBbb3B0aW9ucy5hcHBlbmRdXG4gKiAgIFtlbl1XaGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgRE9NLiAgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgYHRydWVgIHZhbHVlIGlzIGdpdmVuLCBgZG9jdW1lbnQuYm9keWAgd2lsbCBiZSB1c2VkIGFzIHRoZSB0YXJnZXQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbb3B0aW9ucy5pbnNlcnRCZWZvcmVdXG4gKiAgIFtlbl1SZWZlcmVuY2Ugbm9kZSB0aGF0IGJlY29tZXMgdGhlIG5leHQgc2libGluZyBvZiB0aGUgbmV3IG5vZGUgKGBvcHRpb25zLmFwcGVuZGAgZWxlbWVudCkuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxQcm9taXNlfVxuICogICBbZW5dSWYgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIHdhcyBhbiBpbmxpbmUgSFRNTCBzdHJpbmcsIGl0IHJldHVybnMgdGhlIG5ldyBlbGVtZW50LiBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBlbGVtZW50LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1DcmVhdGUgYSBuZXcgZWxlbWVudCBmcm9tIGEgdGVtcGxhdGUuIEJvdGggaW5saW5lIEhUTUwgYW5kIGV4dGVybmFsIGZpbGVzIGFyZSBzdXBwb3J0ZWQgYWx0aG91Z2ggdGhlIHJldHVybiB2YWx1ZSBkaWZmZXJzLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5vbnMuY3JlYXRlRWxlbWVudCA9ICh0ZW1wbGF0ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIHRlbXBsYXRlID0gdGVtcGxhdGUudHJpbSgpO1xuXG4gIGNvbnN0IGNyZWF0ZSA9IGh0bWwgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBvbnMuX3V0aWwuY3JlYXRlRWxlbWVudChodG1sKTtcbiAgICBlbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgaWYgKG9wdGlvbnMuYXBwZW5kKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLmFwcGVuZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gb3B0aW9ucy5hcHBlbmQgOiBkb2N1bWVudC5ib2R5O1xuICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLmluc2VydEJlZm9yZSB8fCBudWxsKTtcbiAgICAgIG9wdGlvbnMubGluayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9wdGlvbnMubGluayhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICByZXR1cm4gdGVtcGxhdGUuY2hhckF0KDApID09PSAnPCcgPyBjcmVhdGUodGVtcGxhdGUpIDogaW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyh0ZW1wbGF0ZSkudGhlbihjcmVhdGUpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZVBvcG92ZXJcbiAqIEBzaWduYXR1cmUgY3JlYXRlUG9wb3ZlcihwYWdlLCBbb3B0aW9uc10pXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICogICBbZW5dUGFnZSBuYW1lLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZmlsZSBvciBhIDx0ZW1wbGF0ZT4gY29udGFpbmluZyBhIDxvbnMtZGlhbG9nPiBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnBhcmVudFNjb3BlXVxuICogICBbZW5dUGFyZW50IHNjb3BlIG9mIHRoZSBkaWFsb2cuIFVzZWQgdG8gYmluZCBtb2RlbHMgYW5kIGFjY2VzcyBzY29wZSBtZXRob2RzIGZyb20gdGhlIGRpYWxvZy5bL2VuXVxuICogICBbamFd44OA44Kk44Ki44Ot44Kw5YaF44Gn5Yip55So44GZ44KL6Kaq44K544Kz44O844OX44KS5oyH5a6a44GX44G+44GZ44CC44OA44Kk44Ki44Ot44Kw44GL44KJ44Oi44OH44Or44KE44K544Kz44O844OX44Gu44Oh44K944OD44OJ44Gr44Ki44Kv44K744K544GZ44KL44Gu44Gr5L2/44GE44G+44GZ44CC44GT44Gu44OR44Op44Oh44O844K/44GvQW5ndWxhckpT44OQ44Kk44Oz44OH44Kj44Oz44Kw44Gn44Gu44G/5Yip55So44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1Qcm9taXNlIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZSBwb3BvdmVyIGNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBruOCs+ODs+ODneODvOODjeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOCkuino+axuuOBmeOCi1Byb21pc2Xjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1DcmVhdGUgYSBwb3BvdmVyIGluc3RhbmNlIGZyb20gYSB0ZW1wbGF0ZS5bL2VuXVxuICogICBbamFd44OG44Oz44OX44Os44O844OI44GL44KJ44Od44OD44OX44Kq44O844OQ44O844Gu44Kk44Oz44K544K/44Oz44K544KS55Sf5oiQ44GX44G+44GZ44CCWy9qYV1cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZURpYWxvZ1xuICogQHNpZ25hdHVyZSBjcmVhdGVEaWFsb2cocGFnZSwgW29wdGlvbnNdKVxuICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAqICAgW2VuXVBhZ2UgbmFtZS4gQ2FuIGJlIGVpdGhlciBhbiBIVE1MIGZpbGUgb3IgYW4gYDx0ZW1wbGF0ZT5gIGNvbnRhaW5pbmcgYSA8b25zLWRpYWxvZz4gY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV1wYWdl44GuVVJM44GL44CB44KC44GX44GP44GvYDx0ZW1wbGF0ZT5g44Gn5a6j6KiA44GX44Gf44OG44Oz44OX44Os44O844OI44GuaWTlsZ7mgKfjga7lgKTjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1Qcm9taXNlIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZSBkaWFsb2cgY29tcG9uZW50IG9iamVjdC5bL2VuXVxuICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kz44Oz44Od44O844ON44Oz44OI44Kq44OW44K444Kn44Kv44OI44KS6Kej5rG644GZ44KLUHJvbWlzZeOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUNyZWF0ZSBhIGRpYWxvZyBpbnN0YW5jZSBmcm9tIGEgdGVtcGxhdGUuWy9lbl1cbiAqICAgW2phXeODhuODs+ODl+ODrOODvOODiOOBi+OCieODgOOCpOOCouODreOCsOOBruOCpOODs+OCueOCv+ODs+OCueOCkueUn+aIkOOBl+OBvuOBmeOAglsvamFdXG4gKi9cbi8qKlxuICogQG1ldGhvZCBjcmVhdGVBbGVydERpYWxvZ1xuICogQHNpZ25hdHVyZSBjcmVhdGVBbGVydERpYWxvZyhwYWdlLCBbb3B0aW9uc10pXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICogICBbZW5dUGFnZSBuYW1lLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZmlsZSBvciBhbiBgPHRlbXBsYXRlPmAgY29udGFpbmluZyBhIDxvbnMtYWxlcnQtZGlhbG9nPiBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVByb21pc2Ugb2JqZWN0IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFsZXJ0IGRpYWxvZyBjb21wb25lbnQgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgpLop6PmsbrjgZnjgotQcm9taXNl44Kq44OW44K444Kn44Kv44OI44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ3JlYXRlIGEgYWxlcnQgZGlhbG9nIGluc3RhbmNlIGZyb20gYSB0ZW1wbGF0ZS5bL2VuXVxuICogICBbamFd44OG44Oz44OX44Os44O844OI44GL44KJ44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu44Kk44Oz44K544K/44Oz44K544KS55Sf5oiQ44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLmNyZWF0ZVBvcG92ZXIgPSBvbnMuY3JlYXRlRGlhbG9nID0gb25zLmNyZWF0ZUFsZXJ0RGlhbG9nID0gKHRlbXBsYXRlLCBvcHRpb25zID0ge30pID0+IG9ucy5jcmVhdGVFbGVtZW50KHRlbXBsYXRlLCB7IGFwcGVuZDogdHJ1ZSwgLi4ub3B0aW9ucyB9KTtcblxuLyoqXG4gKiBAbWV0aG9kIG9wZW5BY3Rpb25TaGVldFxuICogQHNpZ25hdHVyZSBvcGVuQWN0aW9uU2hlZXQob3B0aW9ucylcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dU2hvd3MgYW4gaW5zdGFudCBBY3Rpb24gU2hlZXQgYW5kIGxldHMgdGhlIHVzZXIgY2hvb3NlIGFuIGFjdGlvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5idXR0b25zXVxuICogICBbZW5dUmVwcmVzZW50IGVhY2ggYnV0dG9uIG9mIHRoZSBhY3Rpb24gc2hlZXQgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgb3JkZXIuIEV2ZXJ5IGl0ZW0gY2FuIGJlIGVpdGhlciBhIHN0cmluZyBsYWJlbCBvciBhbiBvYmplY3QgY29udGFpbmluZyBgbGFiZWxgLCBgaWNvbmAgYW5kIGBtb2RpZmllcmAgcHJvcGVydGllcy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZV1cbiAqICAgW2VuXU9wdGlvbmFsIHRpdGxlIGZvciB0aGUgYWN0aW9uIHNoZWV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlc3RydWN0aXZlXVxuICogICBbZW5dT3B0aW9uYWwgaW5kZXggb2YgdGhlIFwiZGVzdHJ1Y3RpdmVcIiBidXR0b24gKG9ubHkgZm9yIGlPUykuIEl0IGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIGJ1dHRvbiBhcnJheSBhcyB3ZWxsLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jYW5jZWxhYmxlXVxuICogICBbZW5dV2hldGhlciB0aGUgYWN0aW9uIHNoZWV0IGNhbiBiZSBjYW5jZWxlZCBieSB0YXBwaW5nIG9uIHRoZSBiYWNrZ3JvdW5kIG1hc2sgb3Igbm90LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1vZGlmaWVyXVxuICogICBbZW5dTW9kaWZpZXIgYXR0cmlidXRlIG9mIHRoZSBhY3Rpb24gc2hlZXQuIEUuZy4gYCdkZXN0cnVjdGl2ZSdgLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1hc2tDb2xvcl1cbiAqICAgW2VuXU9wdGlvbmFsbHkgY2hhbmdlIHRoZSBiYWNrZ3JvdW5kIG1hc2sgY29sb3IuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaWRdXG4gKiAgIFtlbl1UaGUgZWxlbWVudCdzIGlkIGF0dHJpYnV0ZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jbGFzc11cbiAqICAgW2VuXVRoZSBlbGVtZW50J3MgY2xhc3MgYXR0cmlidXRlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBhY3Rpb24gc2hlZXQgaXMgY2xvc2VkLiBUaGUgcmVzb2x2ZSB2YWx1ZSBpcyBlaXRoZXIgdGhlIGluZGV4IG9mIHRoZSB0YXBwZWQgYnV0dG9uIG9yIC0xIHdoZW4gY2FuY2VsZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5vcGVuQWN0aW9uU2hlZXQgPSBhY3Rpb25TaGVldDtcblxuLyoqXG4gKiBAbWV0aG9kIHJlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXJcbiAqIEBzaWduYXR1cmUgcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlcihwYWdlKVxuICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAqICAgW2VuXVBhZ2UgbmFtZS4gQ2FuIGJlIGVpdGhlciBhbiBIVE1MIGZpbGUgb3IgYSBgPHRlbXBsYXRlPmAgaWQuWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUlmIG5vIHBhZ2UgaXMgZGVmaW5lZCBmb3IgdGhlIGBvbnMtbG9hZGluZy1wbGFjZWhvbGRlcmAgYXR0cmlidXRlIGl0IHdpbGwgd2FpdCBmb3IgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkIGJlZm9yZSBsb2FkaW5nIHRoZSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1vbnMtbG9hZGluZy1wbGFjZWhvbGRlcuOBruWxnuaAp+WApOOBqOOBl+OBpuODmuODvOOCuOOBjOaMh+WumuOBleOCjOOBpuOBhOOBquOBhOWgtOWQiOOBr+OAgeODmuODvOOCuOODreODvOODieWJjeOBq+WRvOOBsOOCjOOCi29ucy5yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVy5Yem55CG44GM6KGM44KP44KM44KL44G+44Gn6KGo56S644GV44KM44G+44Gb44KT44CCWy9qYV1cbiAqL1xub25zLnJlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIgPSAocGFnZSwgbGluaykgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IG9ucy5fdXRpbC5hcnJheUZyb20od2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbnMtbG9hZGluZy1wbGFjZWhvbGRlcl0nKSk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB1dGlsLnRocm93KCdObyBvbnMtbG9hZGluZy1wbGFjZWhvbGRlciBleGlzdHMnKTtcbiAgfVxuXG4gIGVsZW1lbnRzXG4gICAgLmZpbHRlcihlbGVtZW50ID0+ICFlbGVtZW50LmdldEF0dHJpYnV0ZSgncGFnZScpKVxuICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ29ucy1sb2FkaW5nLXBsYWNlaG9sZGVyJywgcGFnZSk7XG4gICAgICBvbnMuX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIoZWxlbWVudCwgcGFnZSwgbGluayk7XG4gICAgfSk7XG59O1xuXG5cbm9ucy5fc2V0dXBMb2FkaW5nUGxhY2VIb2xkZXJzID0gZnVuY3Rpb24oKSB7XG4gIG9ucy5yZWFkeSgoKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBvbnMuX3V0aWwuYXJyYXlGcm9tKHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbb25zLWxvYWRpbmctcGxhY2Vob2xkZXJdJykpO1xuXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnb25zLWxvYWRpbmctcGxhY2Vob2xkZXInKTtcbiAgICAgIGlmICh0eXBlb2YgcGFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyKGVsZW1lbnQsIHBhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbm9ucy5fcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uKHBhcmVudCwgcGFnZSwgbGluayA9ICgoZWwsIGRvbmUpID0+IGRvbmUoKSkpIHtcbiAgcGFnZSAmJiBvbnMuY3JlYXRlRWxlbWVudChwYWdlKVxuICAgIC50aGVuKGVsZW1lbnQgPT4ge1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgbGluayhlbGVtZW50LCAoKSA9PiB7XG4gICAgICAgIHdoaWxlIChwYXJlbnQuZmlyc3RDaGlsZCAmJiBwYXJlbnQuZmlyc3RDaGlsZCAhPT0gZWxlbWVudCkge1xuICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdCgnVW5hYmxlZCB0byByZXNvbHZlIHBsYWNlaG9sZGVyOiAnICsgZXJyb3IpKTtcbn07XG5cbmZ1bmN0aW9uIHdhaXREZXZpY2VSZWFkeSgpIHtcbiAgY29uc3QgdW5sb2NrRGV2aWNlUmVhZHkgPSBvbnMuX3JlYWR5TG9jay5sb2NrKCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgIGlmIChvbnMuaXNXZWJWaWV3KCkpIHtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIHVubG9ja0RldmljZVJlYWR5LCB7b25jZTogdHJ1ZX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmxvY2tEZXZpY2VSZWFkeSgpO1xuICAgIH1cbiAgfSwge29uY2U6IHRydWV9KTtcbn1cblxuLyoqXG4gKiBAbWV0aG9kIGdldFNjcmlwdFBhZ2VcbiAqIEBzaWduYXR1cmUgZ2V0U2NyaXB0UGFnZSgpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFjY2VzcyB0aGUgbGFzdCBjcmVhdGVkIHBhZ2UgZnJvbSB0aGUgY3VycmVudCBgc2NyaXB0YCBzY29wZS4gT25seSB3b3JrcyBpbnNpZGUgYDxzY3JpcHQ+PC9zY3JpcHQ+YCB0YWdzIHRoYXQgYXJlIGRpcmVjdCBjaGlsZHJlbiBvZiBgb25zLXBhZ2VgIGVsZW1lbnQuIFVzZSB0aGlzIHRvIGFkZCBsaWZlY3ljbGUgaG9va3MgdG8gYSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKiAgIFtlbl1SZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2UgZWxlbWVudC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xuY29uc3QgZ2V0Q1MgPSAnY3VycmVudFNjcmlwdCcgaW4gZG9jdW1lbnQgPyAoKSA9PiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IDogKCkgPT4gZG9jdW1lbnQuc2NyaXB0c1tkb2N1bWVudC5zY3JpcHRzLmxlbmd0aCAtIDFdO1xub25zLmdldFNjcmlwdFBhZ2UgPSAoKSA9PiBnZXRDUygpICYmIC9vbnMtcGFnZS9pLnRlc3QoZ2V0Q1MoKS5wYXJlbnRFbGVtZW50LnRhZ05hbWUpICYmIGdldENTKCkucGFyZW50RWxlbWVudCB8fCBudWxsO1xuXG5leHBvcnQgZGVmYXVsdCBvbnM7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5mdW5jdGlvbiBnZXRFbGVtZW50Q2xhc3MoKSB7XG4gIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICdmdW5jdGlvbicpIHsgLy8gY2FzZSBvZiBTYWZhcmlcbiAgICBjb25zdCBCYXNlRWxlbWVudCA9ICgpID0+IHt9O1xuICAgIEJhc2VFbGVtZW50LnByb3RvdHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJldHVybiBCYXNlRWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSFRNTEVsZW1lbnQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUVsZW1lbnQgZXh0ZW5kcyBnZXRFbGVtZW50Q2xhc3MoKSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IG9yaWVudGF0aW9uIGZyb20gJy4uL29ucy9vcmllbnRhdGlvbi5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1pZlxuICogQGNhdGVnb3J5IGNvbmRpdGlvbmFsXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvaWZcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ29uZGl0aW9uYWxseSBkaXNwbGF5IGNvbnRlbnQgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgZGV2aWNlIG9yaWVudGF0aW9uIG9yIGJvdGguXG4gKlxuICogICAgIFNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gY29uZGl0aW9uYWxseSBoaWRlIG9yIHNob3cgY2VydGFpbiBjb21wb25lbnRzIGJhc2VkIG9uIHBsYXRmb3JtLiBXaGVuIHJ1bm5pbmcgb24gaU9TIHRoZSBgPG9ucy1pZj5gIGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gaGlkZSB0aGUgYDxvbnMtZmFiPmAgZWxlbWVudC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtaWYgb3JpZW50YXRpb249XCJsYW5kc2NhcGVcIj5cbiAqICAgICBMYW5kc2NhcGUgdmlldyFcbiAqICAgPC9vbnMtaWY+XG4gKiAgIDxvbnMtaWYgcGxhdGZvcm09XCJhbmRyb2lkXCI+XG4gKiAgICAgVGhpcyBpcyBBbmRyb2lkLlxuICogICA8L29ucy1pZj5cbiAqICAgPG9ucy1pZiBwbGF0Zm9ybT1cImlvcyBvdGhlclwiPlxuICogICAgIFRoaXMgaXMgbm90IEFuZHJvaWQuXG4gKiAgIDwvb25zLWlmPlxuICogPC9vbnMtcGFnZT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSWZFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBsYXRmb3JtXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGFjZS1zZXBhcmF0ZWQgcGxhdGZvcm0gbmFtZXMuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYFwiaW9zXCJgLCBgXCJhbmRyb2lkXCJgLCBgXCJ3aW5kb3dzXCJgIGFuZCBgXCJvdGhlclwiYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG9yaWVudGF0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUVpdGhlciBgXCJwb3J0cmFpdFwiYCBvciBgXCJsYW5kc2NhcGVcImAuWy9lbl1cbiAgICogIFtqYV1wb3J0cmFpdOOCguOBl+OBj+OBr2xhbmRzY2FwZeOCkuaMh+WumuOBl+OBvuOBmVsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHBsYXRmb3JtLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcGxhdGZvcm1VcGRhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzQWxsb3dlZFBsYXRmb3JtKCkpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgICAgIHRoaXMuY2hpbGROb2Rlc1swXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wbGF0Zm9ybVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgb3JpZW50YXRpb24ub24oJ2NoYW5nZScsIHRoaXMuX29uT3JpZW50YXRpb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydvcmllbnRhdGlvbiddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUpIHtcbiAgICBpZiAobmFtZSA9PT0gJ29yaWVudGF0aW9uJykge1xuICAgICAgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIG9yaWVudGF0aW9uLm9mZignY2hhbmdlJywgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZSk7XG4gIH1cblxuICBfcGxhdGZvcm1VcGRhdGUoKSB7XG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gdGhpcy5faXNBbGxvd2VkUGxhdGZvcm0oKSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgX2lzQWxsb3dlZFBsYXRmb3JtKCkge1xuICAgIHJldHVybiAhdGhpcy5nZXRBdHRyaWJ1dGUoJ3BsYXRmb3JtJykgfHwgdGhpcy5nZXRBdHRyaWJ1dGUoJ3BsYXRmb3JtJykuc3BsaXQoL1xccysvKS5pbmRleE9mKHBsYXRmb3JtLmdldE1vYmlsZU9TKCkpID49IDA7XG4gIH1cblxuICBfb25PcmllbnRhdGlvbkNoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ29yaWVudGF0aW9uJykgJiYgdGhpcy5faXNBbGxvd2VkUGxhdGZvcm0oKSkge1xuICAgICAgY29uc3QgY29uZGl0aW9uYWxPcmllbnRhdGlvbiA9IHRoaXMuZ2V0QXR0cmlidXRlKCdvcmllbnRhdGlvbicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBjdXJyZW50T3JpZW50YXRpb24gPSBvcmllbnRhdGlvbi5pc1BvcnRyYWl0KCkgPyAncG9ydHJhaXQnIDogJ2xhbmRzY2FwZSc7XG5cbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9IChjb25kaXRpb25hbE9yaWVudGF0aW9uID09PSBjdXJyZW50T3JpZW50YXRpb24pID8gJycgOiAnbm9uZSc7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLklmID0gSWZFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtaWYnLCBJZkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUFuaW1hdG9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGltaW5nXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmR1cmF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnRpbWluZyA9IG9wdGlvbnMudGltaW5nIHx8ICdsaW5lYXInO1xuICAgIHRoaXMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uIHx8IDA7XG4gICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXkgfHwgMDtcblxuICAgIHRoaXMuZGVmID0ge1xuICAgICAgdGltaW5nOiB0aGlzLnRpbWluZyxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZGVsYXk6IHRoaXMuZGVsYXlcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGV4dGVuZChwcm9wZXJ0aWVzID0ge30pIHtcbiAgICBjb25zdCBleHRlbmRlZEFuaW1hdG9yID0gdGhpcztcbiAgICBjb25zdCBuZXdBbmltYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgZXh0ZW5kZWRBbmltYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdXRpbC5leHRlbmQodGhpcywgcHJvcGVydGllcyk7XG4gICAgfTtcblxuICAgIG5ld0FuaW1hdG9yLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgIHJldHVybiBuZXdBbmltYXRvcjtcbiAgfVxufVxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4vLyBUaGlzIG9iamVjdCBzaG91bGQgbm90IGJlIGV4cG9zZWQgdG8gdXNlcnMuIFBsZWFzZSBrZWVwIHRoaXMgcHJpdmF0ZS5cbmNvbnN0IGlQaG9uZVhQYXRjaCA9IHt9O1xuXG5pUGhvbmVYUGF0Y2guaXNJUGhvbmVYUG9ydHJhaXRQYXRjaEFjdGl2ZSA9ICgpID0+IHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ29uc2ZsYWctaXBob25leC1wb3J0cmFpdCcpICE9IG51bGwgJiYgd2luZG93LmlubmVyV2lkdGggPCB3aW5kb3cuaW5uZXJIZWlnaHQ7XG59O1xuXG5pUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUgPSAoKSA9PiB7XG4gIC8vIElmIHdpZHRoID09PSBoZWlnaHQsIHRyZWF0IGl0IGFzIGxhbmRzY2FwZVxuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnb25zZmxhZy1pcGhvbmV4LWxhbmRzY2FwZScpICE9IG51bGwgJiYgd2luZG93LmlubmVyV2lkdGggPj0gd2luZG93LmlubmVySGVpZ2h0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzYWZlIGFyZWEgbGVuZ3RocyBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2FmZSBhcmVhcy5cbiAqL1xuaVBob25lWFBhdGNoLmdldFNhZmVBcmVhTGVuZ3RocyA9ICgpID0+IHtcbiAgbGV0IHNhZmVBcmVhTGVuZ3RocztcbiAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICBzYWZlQXJlYUxlbmd0aHMgPSB7XG4gICAgICB0b3A6IDQ0LFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDM0LFxuICAgICAgbGVmdDogMFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWExhbmRzY2FwZVBhdGNoQWN0aXZlKCkpIHtcbiAgICBzYWZlQXJlYUxlbmd0aHMgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogNDQsXG4gICAgICBib3R0b206IDIxLFxuICAgICAgbGVmdDogNDRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHNhZmVBcmVhTGVuZ3RocyA9IHtcbiAgICAgIHRvcDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc2FmZUFyZWFMZW5ndGhzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzYWZlIGFyZWEgcmVjdCBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2FmZSBhcmVhcy5cbiAqL1xuaVBob25lWFBhdGNoLmdldFNhZmVBcmVhRE9NUmVjdCA9ICgpID0+IHtcbiAgbGV0IHNhZmVBcmVhUmVjdDtcbiAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICBzYWZlQXJlYVJlY3QgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogNDQsIC8qIDAgKyA0NCAodG9wIHNhZmUgYXJlYSkgKi9cbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0IC0gNzggLyogaGVpZ2h0IC0gNDQgKHRvcCBzYWZlIGFyZWEpIC0gMzQgKGJvdHRvbSBzYWZlIGFyZWEpICovXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUoKSkge1xuICAgIHNhZmVBcmVhUmVjdCA9IHtcbiAgICAgIHg6IDQ0LCAvKiAwICsgNDQgKGxlZnQgc2FmZSBhcmVhKSAqL1xuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCAtIDg4LCAvKiB3aWR0aCAtIDQ0IChsZWZ0IHNhZmUgYXJlYSkgLSAzNCAocmlnaHQgc2FmZSBhcmVhKSAqL1xuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSAyMSAvKiBoZWlnaHQgLSAyMSAoYm90dG9tIHNhZmUgYXJlYSkgKi9cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHNhZmVBcmVhUmVjdCA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zYWZlQXJlYVJlY3QsXG4gICAgbGVmdDogc2FmZUFyZWFSZWN0LngsXG4gICAgdG9wOiBzYWZlQXJlYVJlY3QueSxcbiAgICByaWdodDogc2FmZUFyZWFSZWN0LnggKyBzYWZlQXJlYVJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiBzYWZlQXJlYVJlY3QueSArIHNhZmVBcmVhUmVjdC5oZWlnaHRcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlQaG9uZVhQYXRjaDtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBpUGhvbmVYUGF0Y2ggZnJvbSAnLi4vLi4vb25zL2lwaG9uZXgtcGF0Y2guanMnO1xuXG5leHBvcnQgY2xhc3MgQWN0aW9uU2hlZXRBbmltYXRvciBleHRlbmRzIEJhc2VBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdsaW5lYXInLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgc2hvdyhkaWFsb2csIGRvbmUpIHtcbiAgICBkb25lKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG59XG5cbi8qKlxuICogQW5kcm9pZCBzdHlsZSBhbmltYXRvciBmb3IgQWN0aW9uIFNoZWV0LlxuICovXG5leHBvcnQgY2xhc3MgTURBY3Rpb25TaGVldEFuaW1hdG9yIGV4dGVuZHMgQWN0aW9uU2hlZXRBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3IoeyB0aW1pbmcgPSAnZWFzZScsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjQgfSA9IHt9KSB7XG4gICAgc3VwZXIoe3RpbWluZywgZGVsYXksIGR1cmF0aW9ufSk7XG5cbiAgICB0aGlzLm1hc2tUaW1pbmcgPSAnbGluZWFyJztcbiAgICB0aGlzLm1hc2tEdXJhdGlvbiA9IDAuMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAucXVldWUoeyBvcGFjaXR5OiAwIH0pXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7IG9wYWNpdHk6IDEuMCB9LCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoaXMubWFza0R1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogdGhpcy5tYXNrVGltaW5nXG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9zaGVldCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgODAlLCAwKWAsIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMSB9KVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoeyBvcGFjaXR5OiAwIH0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5tYXNrRHVyYXRpb24sXG4gICAgICAgICAgdGltaW5nOiB0aGlzLm1hc2tUaW1pbmdcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX3NoZWV0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDgwJSwgMClgLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgZGlhbG9nLlxuICovXG5leHBvcnQgY2xhc3MgSU9TQWN0aW9uU2hlZXRBbmltYXRvciBleHRlbmRzIEFjdGlvblNoZWV0QW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltaW5nID0gJ2Vhc2UnLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zIH0gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuXG4gICAgdGhpcy5tYXNrVGltaW5nID0gJ2xpbmVhcic7XG4gICAgdGhpcy5tYXNrRHVyYXRpb24gPSAwLjI7XG4gICAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMubGlmdEFtb3VudCA9ICdjYWxjKDEwMCUgKyA0OHB4KSc7XG4gICAgfSBlbHNlIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUoKSkge1xuICAgICAgdGhpcy5saWZ0QW1vdW50ID0gJ2NhbGMoMTAwJSArIDMzcHgpJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saWZ0QW1vdW50ID0gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgLyAyLjAgLSAxICsgJ3B4JzsgLy8gYXZvaWQgRm9yY2VkIFN5bmNocm9ub3VzIExheW91dFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMCB9KVxuICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgIC5xdWV1ZSh7IG9wYWNpdHk6IDEgfSwge1xuICAgICAgICBkdXJhdGlvbjogdGhpcy5tYXNrRHVyYXRpb24sXG4gICAgICAgIHRpbWluZzogdGhpcy5tYXNrVGltaW5nXG4gICAgICB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fc2hlZXQsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5saWZ0QW1vdW50fSwgMClgIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAucXVldWUoeyBvcGFjaXR5OiAxIH0pXG4gICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMCB9LCB7XG4gICAgICAgIGR1cmF0aW9uOiB0aGlzLm1hc2tEdXJhdGlvbixcbiAgICAgICAgdGltaW5nOiB0aGlzLm1hc2tUaW1pbmdcbiAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9zaGVldCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMubGlmdEFtb3VudH0sIDApYCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uLy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IERvb3JMb2NrIGZyb20gJy4uLy4uL29ucy9kb29ybG9jay5qcyc7XG5pbXBvcnQgZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIgZnJvbSAnLi4vLi4vb25zL2ludGVybmFsL2RldmljZS1iYWNrLWJ1dHRvbi1kaXNwYXRjaGVyLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlRGlhbG9nRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBnZXQgX3NjaGVtZSgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnZXR0ZXItcmV0dXJuXG4gICAgdXRpbC50aHJvd01lbWJlcigpO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBfdG9nZ2xlU3R5bGUoc2hvdWxkU2hvdykge1xuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9IHNob3VsZFNob3cgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRGlhbG9nRWxlbWVudCkge1xuICAgICAgdXRpbC50aHJvd0Fic3RyYWN0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuX2Rvb3JMb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgdGhpcy5fY2FuY2VsID0gdGhpcy5fY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2VsZkNhbWVsTmFtZSA9IHV0aWwuY2FtZWxpemUodGhpcy50YWdOYW1lLnNsaWNlKDQpKTtcbiAgICB0aGlzLl9kZWZhdWx0REJCID0gZSA9PiB0aGlzLmNhbmNlbGFibGUgPyB0aGlzLl9jYW5jZWwoKSA6IGUuY2FsbFBhcmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSB0aGlzLl91cGRhdGVBbmltYXRvckZhY3RvcnkoKTtcbiAgfVxuXG4gIGdldCBvbkRldmljZUJhY2tCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uRGV2aWNlQmFja0J1dHRvbihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcikge1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2JhY2tCdXR0b25DYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyID0gZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICBfY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLmNhbmNlbGFibGUgJiYgIXRoaXMuX3J1bm5pbmcpIHtcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdkaWFsb2djYW5jZWwnKTtcbiAgICAgICAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnZGlhbG9nLWNhbmNlbCcpOyAgLy8gZGlhbG9nLWNhbmNlbCBpcyBkZXByZWNhdGVkIGJ1dCBzdGlsbCBlbWl0IHRvIGF2b2lkIGJyZWFraW5nIHVzZXIgY29kZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4gdGhpcy5fcnVubmluZyA9IGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2hvdyguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldFZpc2libGUodHJ1ZSwgLi4uYXJncykudGhlbihkaWFsb2cgPT4ge1xuICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgfSk7XG4gIH1cblxuICBoaWRlKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0VmlzaWJsZShmYWxzZSwgLi4uYXJncykudGhlbihkaWFsb2cgPT4ge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm4gZGlhbG9nO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0VmlzaWJsZSghdGhpcy52aXNpYmxlLCAuLi5hcmdzKS50aGVuKGRpYWxvZyA9PiB7XG4gICAgICB0aGlzLnZpc2libGUgPSB0aGlzLl92aXNpYmxlO1xuICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9KTtcbiAgfVxuXG4gIF9zZXRWaXNpYmxlKHNob3VsZFNob3csIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHNob3VsZFNob3cgPyAnc2hvdycgOiAnaGlkZSc7XG5cbiAgICBvcHRpb25zID0geyAuLi5vcHRpb25zIH07XG4gICAgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zID0gdXRpbC5leHRlbmQoXG4gICAgICBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnMgfHwge30sXG4gICAgICB0aGlzLmFuaW1hdGlvbk9wdGlvbnNcbiAgICApO1xuXG4gICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsIGBwcmUke2FjdGlvbn1gLCB7IC8vIHByZXNob3cgcHJlaGlkZVxuICAgICAgW3RoaXMuX3NlbGZDYW1lbE5hbWVdOiB0aGlzLFxuICAgICAgY2FuY2VsOiAoKSA9PiBjYW5jZWxlZCA9IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBDYW5jZWxlZCBpbiBwcmUke2FjdGlvbn0gZXZlbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5fZG9vckxvY2sud2FpdFVubG9jaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcbiAgICAgICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG5cbiAgICAgICAgc2hvdWxkU2hvdyAmJiB0aGlzLl90b2dnbGVTdHlsZSh0cnVlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHNob3VsZFNob3c7XG4gICAgICAgIHV0aWwuaW9zUGFnZVNjcm9sbEZpeChzaG91bGRTaG93KTtcblxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgIGFuaW1hdG9yW2FjdGlvbl0odGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgIXNob3VsZFNob3cgJiYgdGhpcy5fdG9nZ2xlU3R5bGUoZmFsc2UsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICB1bmxvY2soKTtcblxuICAgICAgICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ18nICsgYWN0aW9uKTtcbiAgICAgICAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncG9zdCcgKyBhY3Rpb24sIHtbdGhpcy5fc2VsZkNhbWVsTmFtZV06IHRoaXN9KTsgLy8gcG9zdHNob3cgcG9zdGhpZGVcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKHRoaXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbWFza0NvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzay1jb2xvcicpO1xuICB9XG5cbiAgc2V0IG1hc2tDb2xvcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnbWFzay1jb2xvcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbWFzay1jb2xvcicsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYW5pbWF0aW9uT3B0aW9ucygpIHtcbiAgICByZXR1cm4gQW5pbWF0b3JGYWN0b3J5LnBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSk7XG4gIH1cblxuICBzZXQgYW5pbWF0aW9uT3B0aW9ucyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlTWFzaygpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX21hc2spIHtcbiAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1hc2tDb2xvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRpb24oKSB7XG4gICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gdGhpcy5fdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2JhY2tCdXR0b25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24gPSB0aGlzLl9iYWNrQnV0dG9uQ2FsbGJhY2s7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fZGVmYXVsdERCQiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24gPSB0aGlzLl9kZWZhdWx0REJCLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9tYXNrKSB7XG4gICAgICAgIHRoaXMuX21hc2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jYW5jZWwsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcikge1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXNrKSB7XG4gICAgICB0aGlzLl9tYXNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2FuY2VsLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnYW5pbWF0aW9uJywgJ21hc2stY29sb3InLCAndmlzaWJsZSddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHRoaXMuX3NjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWFzay1jb2xvcic6XG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hc2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2aXNpYmxlJzpcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSAhPT0gdGhpcy5fdmlzaWJsZSkge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFzayBhbmQgYW5pbWF0aW9uIGVhcmx5IGluIGNhc2UgYHZpc2libGVgIGF0dHJpYnV0ZVxuICAgICAgICAgIC8vIGNoYW5nZWQgY2FsbGJhY2sgaXMgY2FsbGVkIGJlZm9yZSBgYW5pbWF0aW9uYCBvciBgbWFzay1jb2xvcmBcbiAgICAgICAgICB0aGlzLl91cGRhdGVNYXNrKCk7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKCk7XG5cbiAgICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2V0VmlzaWJsZSh0aGlzLnZpc2libGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ3ByZXNob3cnLCAncG9zdHNob3cnLCAncHJlaGlkZScsICdwb3N0aGlkZScsICdkaWFsb2djYW5jZWwnLCAnZGlhbG9nLWNhbmNlbCddO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoQmFzZURpYWxvZ0VsZW1lbnQsIFsndmlzaWJsZScsICdkaXNhYmxlZCcsICdjYW5jZWxhYmxlJ10pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCB7IEFjdGlvblNoZWV0QW5pbWF0b3IsIElPU0FjdGlvblNoZWV0QW5pbWF0b3IsIE1EQWN0aW9uU2hlZXRBbmltYXRvciB9IGZyb20gJy4vb25zLWFjdGlvbi1zaGVldC9hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5hY3Rpb24tc2hlZXQnOiAnYWN0aW9uLXNoZWV0LS0qJyxcbiAgJy5hY3Rpb24tc2hlZXQtbWFzayc6ICdhY3Rpb24tc2hlZXQtbWFzay0tKicsXG4gICcuYWN0aW9uLXNoZWV0LXRpdGxlJzogJ2FjdGlvbi1zaGVldC10aXRsZS0tKidcbn07XG5cbmNvbnN0IF9hbmltYXRvckRpY3QgPSB7XG4gICdkZWZhdWx0JzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNREFjdGlvblNoZWV0QW5pbWF0b3IgOiBJT1NBY3Rpb25TaGVldEFuaW1hdG9yOyB9LFxuICAnbm9uZSc6IEFjdGlvblNoZWV0QW5pbWF0b3Jcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWFjdGlvbi1zaGVldFxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBBY3Rpb24vYm90dG9tIHNoZWV0IHRoYXQgaXMgZGlzcGxheWVkIG9uIHRvcCBvZiBjdXJyZW50IHNjcmVlbi5cbiAqXG4gKiAgICAgVGhpcyBlbGVtZW50IGNhbiBlaXRoZXIgYmUgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIGA8Ym9keT5gIG9yIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnJvbSBhIHRlbXBsYXRlIHVzaW5nIHRoZSBgb25zLmNyZWF0ZUVsZW1lbnQodGVtcGxhdGUsIHsgYXBwZW5kOiB0cnVlIH0pYCB1dGlsaXR5IGZ1bmN0aW9uIGFuZCB0aGUgYDx0ZW1wbGF0ZT5gIHRhZy5cbiAqXG4gKiAgICAgVGhlIGFjdGlvbiBzaGVldCBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgYSBsaXN0IG9mIG9wdGlvbnMgYW5kIGFza2luZyB0aGUgdXNlciB0byBtYWtlIGEgZGVjaXNpb24uIEEgYG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uYCBpcyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlLCBhbHRob3VnaCBpdCBjYW4gY29udGFpbiBhbnkgdHlwZSBvZiBjb250ZW50LlxuICpcbiAqICAgICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzcGxheWVkIGFzIE1hdGVyaWFsIERlc2lnbiAoYm90dG9tIHNoZWV0KSB3aGVuIHJ1bm5pbmcgb24gYW4gQW5kcm9pZCBkZXZpY2UuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjgIHjgoLjgZfjgY/jga/jg5zjg4jjg6Djgrfjg7zjg4jjgpLnj77lnKjjga7jgrnjgq/jg6rjg7zjg7PkuIrjgavooajnpLrjgZfjgb7jgZnjgIJcbiAqXG4gKiAgICAg44GT44Gu6KaB57Sg44Gv44CBYDxib2R5PmDopoHntKDjgavnm7TmjqXjgqLjgr/jg4Pjg4HjgZXjgozjgovjgYvjgIHjgoLjgZfjgY/jga9gb25zLmNyZWF0ZUVsZW1lbnQodGVtcGxhdGUsIHsgYXBwZW5kOiB0cnVlIH0pYOOBqGA8dGVtcGxhdGU+YOOCv+OCsOOCkuS9v+OBo+OBpuODhuODs+ODl+ODrOODvOODiOOBi+OCieWLleeahOOBq+eUn+aIkOOBleOCjOOBvuOBmeOAglxuICpcbiAqICAgICDjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjga/jgIHpgbjmip7ogqLjga7jg6rjgrnjg4jjgpLooajnpLrjgZfjgabjg6bjg7zjgrbjg7zjgavlsIvjga3jgovjga7jgavkvr/liKnjgafjgZnjgIJgb25zLWFjdGlvbi1zaGVldC1idXR0b25g44Gv44CB44GT44Gu6KaB57Sg44Gu5Lit44Gr572u44GP44Gf44KB44Gr5o+Q5L6b44GV44KM44Gm44GE44G+44GZ44GM44CB44Gd44KM5Lul5aSW44Gr44KC5LuW44Gu44Gp44Gu44KI44GG44Gq6KaB57Sg44KS5ZCr44KA44GT44Go44GM44Gn44GN44G+44GZ44CCXG4gKlxuICogICAgIEFuZHJvaWTjg4fjg5DjgqTjgrnjgaflrp/ooYzjgZXjgozjgovjgajjgY3jgavjga/jgIHoh6rli5XnmoTjgavjg57jg4bjg6rjgqLjg6vjg4fjgrbjgqTjg7Mo44Oc44OI44Og44K344O844OIKeOBqOOBl+OBpuihqOekuuOBleOCjOOBvuOBmeOAglxuICogICBbL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGJvdHRvbSBzaGVldC5bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44Oc44OI44Og44K344O844OI44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL3JlZmVyZW5jZS9hY3Rpb24tc2hlZXRcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLXBvcG92ZXJcbiAqICAgW2VuXWA8b25zLXBvcG92ZXI+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXBvcG92ZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLW1vZGFsXG4gKiAgIFtlbl1gPG9ucy1tb2RhbD5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbW9kYWzjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYWN0aW9uLXNoZWV0IGlkPVwic2hlZXRcIj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqIDwvb25zLWFjdGlvbi1zaGVldD5cbiAqXG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hlZXQnKS5zaG93KCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWN0aW9uU2hlZXRFbGVtZW50IGV4dGVuZHMgQmFzZURpYWxvZ0VsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWN0aW9uU2hlZXRcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIHRvIHN0b3AgdGhlIGFjdGlvbiBzaGVldCBmcm9tIGJlaW5nIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBruihqOekuuOBjOOCreODo+ODs+OCu+ODq+OBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdHNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgZ/nm7TlvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWN0aW9uU2hlZXRcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgYWN0aW9uIHNoZWV0IGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFjdGlvblNoZWV0XG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBhY3Rpb24gc2hlZXQgZnJvbSBiZWluZyBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6Z2e6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0aGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGFjdGlvbiBzaGVldCBpcyBoaWRkZW4uWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOmaoOOCjOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hY3Rpb25TaGVldFxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgZGlhbG9nY2FuY2VsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQgd2hlbiB0aGUgYWN0aW9uIHNoZWV0IGlzIGNhbmNlbGVkLlsvZW5dXG4gICAqIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB0aXRsZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1PcHRpb25hbCB0aXRsZSBvZiB0aGUgYWN0aW9uIHNoZWV0LiBBIG5ldyBlbGVtZW50IHdpbGwgYmUgY3JlYXRlZCBjb250YWluaW5nIHRoaXMgc3RyaW5nLlsvZW5dXG4gICAqICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44Gu44K/44Kk44OI44Or44KS5oyH5a6a44GX44G+44GZ44CC44GT44GT44Gn5oyH5a6a44GX44Gf5paH5a2X5YiX44KS5ZCr44KA5paw44GX44GE6KaB57Sg44GM5L2c5oiQ44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB0aXRsZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1PcHRpb25hbCB0aXRsZSBvZiB0aGUgYWN0aW9uIHNoZWV0LiBBIG5ldyBlbGVtZW50IHdpbGwgYmUgY3JlYXRlZCBjb250YWluaW5nIHRoaXMgc3RyaW5nLlsvZW5dXG4gICAqICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44Gu44K/44Kk44OI44Or44KS5oyH5a6a44GX44G+44GZ44CC44GT44GT44Gn5oyH5a6a44GX44Gf5paH5a2X5YiX44KS5ZCr44KA5paw44GX44GE6KaB57Sg44GM5L2c5oiQ44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGFjdGlvbiBzaGVldC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNhbmNlbGFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBhY3Rpb24gc2hlZXQgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzoqK3lrprjgZXjgozjgovjgajjgIHjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjga7og4zmma/jgoRBbmRyb2lk44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44KS5o6o44GZ44GT44Go44Gn44Ki44Kv44K344On44Oz44K344O844OI44GM6ZaJ44GY44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjg4DjgqTjgqLjg63jgrDjga9kaXNhYmxlZOeKtuaFi+OBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgYWN0aW9uIHNoZWV0LiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAgb3IgYFwiZGVmYXVsdFwiYC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwi44KC44GX44GP44GvXCJkZWZhdWx0XCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbWFzay1jb2xvclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCByZ2JhKDAsIDAsIDAsIDAuMilcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgbWFzay4gRGVmYXVsdCBpcyBgXCJyZ2JhKDAsIDAsIDAsIDAuMilcImAuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGFjdGlvbiBzaGVldCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF9tYXNrKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmFjdGlvbi1zaGVldC1tYXNrJyk7XG4gIH1cblxuICBnZXQgX3NoZWV0KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmFjdGlvbi1zaGVldCcpO1xuICB9XG5cbiAgZ2V0IF90aXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcuYWN0aW9uLXNoZWV0LXRpdGxlJyk7XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogQWN0aW9uU2hlZXRBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdBY3Rpb25TaGVldEFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKVxuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zdHlsZS56SW5kZXggPSAxMDAwMTtcblxuICAgIC8qIEV4cGVjdGVkIHJlc3VsdDpcbiAgICAgKiAgIDxvbnMtYWN0aW9uLXNoZWV0PlxuICAgICAqICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXNoZWV0LW1hc2tcIj48L2Rpdj5cbiAgICAgKiAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1zaGVldFwiPlxuICAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tc2hlZXQtdGl0bGU+PC9kaXY+XG4gICAgICogICAgICAgLi4uXG4gICAgICogICAgIDwvZGl2PlxuICAgICAqICAgPC9vbnMtYWN0aW9uLXNoZWV0PlxuICAgICAqL1xuXG4gICAgaWYgKCF0aGlzLl9zaGVldCkge1xuICAgICAgY29uc3Qgc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNoZWV0LmNsYXNzTGlzdC5hZGQoJ2FjdGlvbi1zaGVldCcpO1xuXG4gICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKSB7XG4gICAgICAgIHNoZWV0LmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoc2hlZXQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKCdhY3Rpb24tc2hlZXQtdGl0bGUnKTtcbiAgICAgIGlmICh0aGlzLnRpdGxlKSB7XG4gICAgICAgIHRpdGxlLmlubmVySFRNTCA9IHRoaXMudGl0bGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2hlZXQuaW5zZXJ0QmVmb3JlKHRpdGxlLCB0aGlzLl9zaGVldC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX21hc2spIHtcbiAgICAgIGNvbnN0IG1hc2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1hc2suY2xhc3NMaXN0LmFkZCgnYWN0aW9uLXNoZWV0LW1hc2snKTtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKG1hc2ssIHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2hlZXQuc3R5bGUuekluZGV4ID0gMjAwMDE7XG4gICAgdGhpcy5fbWFzay5zdHlsZS56SW5kZXggPSAyMDAwMDtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIF91cGRhdGVUaXRsZSgpIHtcbiAgICBpZiAodGhpcy5fdGl0bGUpIHtcbiAgICAgIGlmICghdGhpcy50aXRsZSkge1xuICAgICAgICB0aGlzLl90aXRsZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdGl0bGUuaW5uZXJIVE1MID0gdGhpcy50aXRsZTtcbiAgICAgICAgdGhpcy5fdGl0bGUuaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgfVxuXG4gIHNldCB0aXRsZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWFza0NvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3coW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJzbGlkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJzbGlkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gIFsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYWN0aW9uIHNoZWV0IGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNob3cgdGhlIGFjdGlvbiBzaGVldC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkumWi+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVzIHRvIHRoZSBkaXNwbGF5ZWQgZWxlbWVudC5cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJzbGlkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJzbGlkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb25zIGlzIGNhbGxlZCBhZnRlciB0aGUgYWN0aW9uIHNoZWV0IGhhcyBiZWVuIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0aGUgYWN0aW9uIHNoZWV0LlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOCkumWieOBmOOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXemaoOOCjOOBn+imgee0oOOCkuino+axuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGFjdGlvbiBzaGVldCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgYWN0aW9uIHNoZWV0IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNhbmNlbGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBhY3Rpb24gc2hlZXQgaXMgY2FuY2VsYWJsZSBvciBub3QuIEEgY2FuY2VsYWJsZSBhY3Rpb24gc2hlZXQgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44GM44Kt44Oj44Oz44K744Or5Y+v6IO944GL44Gp44GG44GL44KS6Kit5a6a44GX44G+44GZ44CC44Kt44Oj44Oz44K744Or5Y+v6IO944Gq44Ki44Kv44K344On44Oz44K344O844OI44Gv44CB6IOM5pmv44KS44K/44OD44OX44GX44Gf44KKQW5kcm9pZOODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OCkuaOqOOBmeOBk+OBqOOBp+mWieOBmOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLCAndGl0bGUnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICd0aXRsZScpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpdGxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBY3Rpb25TaGVldEFuaW1hdG9yfSBBbmltYXRvclxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQW5pbWF0b3IobmFtZSwgQW5pbWF0b3IpIHtcbiAgICBpZiAoIShBbmltYXRvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBBY3Rpb25TaGVldEFuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdBY3Rpb25TaGVldCcpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQWN0aW9uU2hlZXRBbmltYXRvcigpIHtcbiAgICByZXR1cm4gQWN0aW9uU2hlZXRBbmltYXRvcjtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5BY3Rpb25TaGVldCA9IEFjdGlvblNoZWV0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWFjdGlvbi1zaGVldCcsIEFjdGlvblNoZWV0RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNiBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2xhc3MgQW5pbWF0b3JDU1MgLSBpbXBsZW1lbnRhdGlvbiBvZiBBbmltYXRvciBjbGFzcyB1c2luZyBjc3MgdHJhbnNpdGlvbnNcbiAqL1xuY2xhc3MgQW5pbWF0b3JDU1Mge1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGFuaW1hdGVcbiAgICogQGRlc2MgbWFpbiBhbmltYXRpb24gZnVuY3Rpb25cbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaW5hbENTU1xuICAgKiBAcGFyYW0ge251bWJlcn0gW2R1cmF0aW9uPTIwMF0gLSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgICogQHJldHVybiB7T2JqZWN0fSByZXN1bHRcbiAgICogQHJldHVybiB7RnVuY3Rpb259IHJlc3VsdC50aGVuKGNhbGxiYWNrKSAtIHNldHMgYSBjYWxsYmFjayB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgYW5pbWF0aW9uIGhhcyBzdG9wcGVkXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZXN1bHQuc3RvcChvcHRpb25zKSAtIHN0b3BzIHRoZSBhbmltYXRpb247IGlmIG9wdGlvbnMuc3RvcE5leHQgaXMgdHJ1ZSB0aGVuIGl0IGRvZXNuJ3QgY2FsbCB0aGUgY2FsbGJhY2tcbiAgICogQHJldHVybiB7RnVuY3Rpb259IHJlc3VsdC5maW5pc2gobXMpIC0gZmluaXNoZXMgdGhlIGFuaW1hdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZXN1bHQuc3BlZWQobXMpIC0gc2V0cyB0aGUgYW5pbWF0aW9uIHNwZWVkIHNvIHRoYXQgaXQgZmluaXNoZXMgYXMgaWYgdGhlIG9yaWdpbmFsIGR1cmF0aW9uIHdhcyB0aGUgb25lIHNwZWNpZmllZCBoZXJlXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGBcbiAgICogIHZhciByZXN1bHQgPSBhbmltYXRvci5hbmltYXRlKGVsLCB7b3BhY2l0eTogMC41fSwgMTAwMCk7XG4gICAqXG4gICAqICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuICAgKiAgICByZXN1bHQuc3BlZWQoMjAwKS50aGVuKGZ1bmN0aW9uKCl7XG4gICAqICAgICAgY29uc29sZS5sb2coJ2RvbmUnKTtcbiAgICogICAgfSk7XG4gICAqICB9LCAzMDApO1xuICAgKiBgYGBgXG4gICAqL1xuICBhbmltYXRlKGVsLCBmaW5hbCwgZHVyYXRpb24gPSAyMDApIHtcbiAgICB2YXIgc3RhcnQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpLFxuICAgICAgICBpbml0aWFsID0ge30sXG4gICAgICAgIHN0b3BwZWQgPSBmYWxzZSxcbiAgICAgICAgbmV4dCA9IGZhbHNlLFxuICAgICAgICB0aW1lb3V0ID0gZmFsc2UsXG4gICAgICAgIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhmaW5hbCk7XG5cbiAgICB2YXIgdXBkYXRlU3R5bGVzID0gKCkgPT4ge1xuICAgICAgbGV0IHMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocy5nZXRQcm9wZXJ0eVZhbHVlLmJpbmQocykpO1xuICAgICAgcyA9IGVsLm9mZnNldEhlaWdodDtcbiAgICB9O1xuXG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgIHN0b3A6IChvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHZhciBrID0gTWF0aC5taW4oMSwgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBzdGFydCkgLyBkdXJhdGlvbik7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICBlbC5zdHlsZVtpXSA9ICgxIC0gaykgKiBpbml0aWFsW2ldICsgayAqIGZpbmFsW2ldICsgKGkgPT0gJ29wYWNpdHknID8gJycgOiAncHgnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9ICcwcyc7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3RvcE5leHQpIHtcbiAgICAgICAgICBuZXh0ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0b3BwZWQpIHtcbiAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICBuZXh0ICYmIG5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHRoZW46IChjYikgPT4ge1xuICAgICAgICBuZXh0ID0gY2I7XG4gICAgICAgIGlmIChzdG9wcGVkKSB7XG4gICAgICAgICAgbmV4dCAmJiBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBzcGVlZDogKG5ld0R1cmF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChpbnRlcm5hbC5jb25maWcuYW5pbWF0aW9uc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbmV3RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RvcHBlZCkge1xuICAgICAgICAgIHRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgY29uc3QgcGFzc2VkID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgIGNvbnN0ICBrID0gcGFzc2VkIC8gZHVyYXRpb247XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gbmV3RHVyYXRpb24gKiAoMSAtIGspO1xuXG4gICAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGVbaV0gPSAoMSAtIGspICogaW5pdGlhbFtpXSArIGsgKiBmaW5hbFtpXSArIChpID09ICdvcGFjaXR5JyA/ICcnIDogJ3B4Jyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB1cGRhdGVTdHlsZXMoKTtcblxuICAgICAgICAgIHN0YXJ0ID0gZWwuc3BlZWRVcFRpbWU7XG4gICAgICAgICAgZHVyYXRpb24gPSByZW1haW5pbmc7XG5cbiAgICAgICAgICBlbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbiAvIDEwMDAgKyAncyc7XG5cbiAgICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBlbC5zdHlsZVtpXSA9IGZpbmFsW2ldICsgKGkgPT0gJ29wYWNpdHknID8gJycgOiAncHgnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHJlc3VsdC5zdG9wLCByZW1haW5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgZmluaXNoOiAobWlsbGlzZWNvbmRzID0gNTApID0+IHtcbiAgICAgICAgdmFyIGsgPSAoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xuXG4gICAgICAgIHJlc3VsdC5zcGVlZChtaWxsaXNlY29uZHMgLyAoMSAtIGspKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGVsLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBzdG9wcGVkIHx8IGludGVybmFsLmNvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgIHByb3BlcnRpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgaW5pdGlhbFtlXSA9IGlzTmFOKHYpID8gMCA6IHY7XG4gICAgfSk7XG5cblxuICAgIGlmICghc3RvcHBlZCkge1xuICAgICAgZWwuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5ID0gcHJvcGVydGllcy5qb2luKCcsJyk7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbiAvIDEwMDAgKyAncyc7XG5cbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgZWwuc3R5bGVbZV0gPSBmaW5hbFtlXSArIChlID09ICdvcGFjaXR5JyA/ICcnIDogJ3B4Jyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChyZXN1bHQuc3RvcCwgZHVyYXRpb24pO1xuICAgIHRoaXMuX29uU3RvcEFuaW1hdGlvbnMoZWwsIHJlc3VsdC5zdG9wKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgfVxuXG4gIF9vblN0b3BBbmltYXRpb25zKGVsLCBsaXN0ZW5lcikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBpID0gdGhpcy5faW5kZXgrKztcbiAgICBxdWV1ZVtlbF0gPSBxdWV1ZVtlbF0gfHwgW107XG4gICAgcXVldWVbZWxdW2ldID0gKG9wdGlvbnMpID0+IHtcbiAgICAgIGRlbGV0ZSBxdWV1ZVtlbF1baV07XG4gICAgICBpZiAocXVldWVbZWxdICYmIHF1ZXVlW2VsXS5sZW5ndGggPT0gMCkge1xuICAgICAgICBkZWxldGUgcXVldWVbZWxdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RlbmVyKG9wdGlvbnMpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgKiBAbWV0aG9kIHN0b3BBbmltYXRpb25zXG4gICogQGRlc2Mgc3RvcHMgYWN0aXZlIGFuaW1hdGlvbnMgb24gYSBzcGVjaWZpZWQgZWxlbWVudFxuICAqIEBwYXJhbSB7RWxlbWVudHxBcnJheX0gZWxlbWVudCAtIGVsZW1lbnQgb3IgYXJyYXkgb2YgZWxlbWVudHNcbiAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG4gICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zdG9wTmV4dF0gLSB0aGUgY2FsbGJhY2tzIGFmdGVyIHRoZSBhbmltYXRpb25zIHdvbid0IGJlIGNhbGxlZCBpZiB0aGlzIG9wdGlvbiBpcyB0cnVlXG4gICovXG4gIHN0b3BBbmltYXRpb25zKGVsLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbCkpIHtcbiAgICAgIHJldHVybiBlbC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9ucyhlbCwgb3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAodGhpcy5fcXVldWVbZWxdIHx8IFtdKS5mb3JFYWNoKGUgPT4geyBlKG9wdGlvbnMgfHwge30pOyB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEBtZXRob2Qgc3RvcEFsbFxuICAqIEBkZXNjIHN0b3BzIGFsbCBhY3RpdmUgYW5pbWF0aW9uc1xuICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0b3BOZXh0XSAtIHRoZSBjYWxsYmFja3MgYWZ0ZXIgdGhlIGFuaW1hdGlvbnMgd29uJ3QgYmUgY2FsbGVkIGlmIHRoaXMgb3B0aW9uIGlzIHRydWVcbiAgKi9cbiAgc3RvcEFsbChvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnN0b3BBbmltYXRpb25zKE9iamVjdC5rZXlzKHRoaXMuX3F1ZXVlKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgKiBAbWV0aG9kIGZhZGVcbiAgKiBAZGVzYyBmYWRlcyB0aGUgZWxlbWVudCAoc2hvcnQgdmVyc2lvbiBmb3IgYW5pbWF0ZShlbCwge29wYWNpdHk6IDB9KSlcbiAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW2R1cmF0aW9uPTIwMF1cbiAgKi9cbiAgZmFkZShlbCwgZHVyYXRpb24gPSAyMDApIHtcbiAgICByZXR1cm4gdGhpcy5hbmltYXRlKGVsLCB7b3BhY2l0eTogMH0sIGR1cmF0aW9uKTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuaW1hdG9yQ1NTO1xuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IEFuaW1hdG9yIGZyb20gJy4vb25zLXJpcHBsZS9hbmltYXRvci1jc3MuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdyaXBwbGUnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3JpcHBsZS0tKicsXG4gICcucmlwcGxlX193YXZlJzogJ3JpcHBsZS0tKl9fd2F2ZScsXG4gICcucmlwcGxlX19iYWNrZ3JvdW5kJzogJ3JpcHBsZS0tKl9fYmFja2dyb3VuZCcsXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1yaXBwbGVcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQWRkcyBhIE1hdGVyaWFsIERlc2lnbiBcInJpcHBsZVwiIGVmZmVjdCB0byBhbiBlbGVtZW50LiBUaGUgcmlwcGxlIGVmZmVjdCB3aWxsIHNwcmVhZCBmcm9tIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgdXNlciB0YXBzLlxuICpcbiAqICAgICBTb21lIGVsZW1lbnRzIHN1Y2ggYXMgYDxvbnMtYnV0dG9uPmAgYW5kIGA8b25zLWZhYj5gICBzdXBwb3J0IGEgYHJpcHBsZWAgYXR0cmlidXRlLlxuICogICBbL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44Oq44OD44OX44Or5Yq55p6c44KSRE9N6KaB57Sg44Gr6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIHdLUVdkWlxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3JpcHBsZVxuICogQG1vZGlmaWVyIGxpZ2h0LWdyYXlcbiAqICAgW2VuXUNoYW5nZSB0aGUgY29sb3Igb2YgZWZmZWN0cyB0byBsaWdodCBncmF5LlsvZW5dXG4gKiAgIFtqYV3jgqjjg5Xjgqfjgq/jg4jjga7oibLjgYzmmI7jgovjgYTngbDoibLjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNjcm9zcy1wbGF0Zm9ybS1zdHlsaW5nLWF1dG9zdHlsaW5nXG4gKiAgW2VuXUNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVxuICogIFtqYV1Dcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibXktZGl2XCI+XG4gKiAgPG9ucy1yaXBwbGU+PC9vbnMtcmlwcGxlPlxuICogPC9kaXY+XG4gKlxuICogQGV4YW1wbGVcbiAqIDxvbnMtYnV0dG9uIHJpcHBsZT5DbGljayBtZSE8L29ucy1idXR0b24+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJpcHBsZUVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgY29sb3JcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNvbG9yIG9mIHRoZSByaXBwbGUgZWZmZWN0LlsvZW5dXG4gICAqICAgW2phXeODquODg+ODl+ODq+OCqOODleOCp+OCr+ODiOOBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgcmlwcGxlIGVmZmVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqjjg5Xjgqfjgq/jg4jjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBiYWNrZ3JvdW5kXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZC5bL2VuXVxuICAgKiAgIFtqYV3og4zmma/jga7oibLjgpLoqK3lrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzaXplXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaXppbmcgb2YgdGhlIHdhdmUgb24gcmlwcGxlIGVmZmVjdC4gU2V0IFwiY292ZXJcIiBvciBcImNvbnRhaW5cIi4gRGVmYXVsdCBpcyBcImNvdmVyXCIuWy9lbl1cbiAgICogICBbamFd44Ko44OV44Kn44Kv44OI44Gu44K144Kk44K644KS5oyH5a6a44GX44G+44GZ44CCXCJjb3Zlclwi44KC44GX44GP44GvXCJjb250YWluXCLjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga9cImNvdmVyXCLjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjZW50ZXJcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBwcmVzZW50cywgY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB3YXZlIGVmZmVjdCB0byBjZW50ZXIgb2YgdGhlIHRhcmdldCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOOCkuioreWumuOBmeOCi+OBqOOAgeOCqOODleOCp+OCr+ODiOOBruS9jee9ruOBjOimgee0oOOBruecn+OCk+S4reOBi+OCieWni+OBvuOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2VudGVyXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgcHJlc2VudHMsIGNoYW5nZSB0aGUgcG9zaXRpb24gb2Ygd2F2ZSBlZmZlY3QgdG8gY2VudGVyIG9mIHRoZSB0YXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDjgpLoqK3lrprjgZnjgovjgajjgIHjgqjjg5Xjgqfjgq/jg4jjga7kvY3nva7jgYzopoHntKDjga7nnJ/jgpPkuK3jgYvjgonlp4vjgb7jgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgcmlwcGxlIGVmZmVjdCB3aWxsIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODquODg+ODl+ODq+OCqOODleOCp+OCr+ODiOOBr+eEoeWKueOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9vblRhcCA9IHRoaXMuX29uVGFwLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25Ib2xkID0gdGhpcy5fb25Ib2xkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25EcmFnU3RhcnQgPSB0aGlzLl9vbkRyYWdTdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uUmVsZWFzZSA9IHRoaXMuX29uUmVsZWFzZS5iaW5kKHRoaXMpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG5cbiAgICB0aGlzLl9hbmltYXRvciA9IG5ldyBBbmltYXRvcigpO1xuXG4gICAgWydjb2xvcicsICdjZW50ZXInLCAnc3RhcnQtcmFkaXVzJywgJ2JhY2tncm91bmQnLCAnbW9kaWZpZXInXS5mb3JFYWNoKGUgPT4ge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSwgbnVsbCwgdGhpcy5nZXRBdHRyaWJ1dGUoZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgdGhpcy5fd2F2ZSA9IHRoaXMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncmlwcGxlX193YXZlJylbMF07XG4gICAgdGhpcy5fYmFja2dyb3VuZCA9IHRoaXMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncmlwcGxlX19iYWNrZ3JvdW5kJylbMF07XG5cbiAgICBpZiAoISh0aGlzLl9iYWNrZ3JvdW5kICYmIHRoaXMuX3dhdmUpKSB7XG4gICAgICB0aGlzLl93YXZlID0gdXRpbC5jcmVhdGUoJy5yaXBwbGVfX3dhdmUnKTtcbiAgICAgIHRoaXMuX2JhY2tncm91bmQgPSB1dGlsLmNyZWF0ZSgnLnJpcHBsZV9fYmFja2dyb3VuZCcpO1xuXG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuX3dhdmUpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLl9iYWNrZ3JvdW5kKTtcbiAgICB9XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBfZ2V0RWZmZWN0U2l6ZSgpIHtcbiAgICBjb25zdCBzaXplcyA9IFsnY292ZXInLCAnY29udGFpbiddO1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnc2l6ZScpKSB7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NpemUnKTtcbiAgICAgIGlmIChzaXplcy5pbmRleE9mKHNpemUpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJ2NvdmVyJztcbiAgfVxuXG4gIF9jYWxjdWxhdGVDb29yZHMoZSkge1xuICAgIGxldCB4LCB5LCBoLCB3LCByO1xuICAgIGNvbnN0IGIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRFZmZlY3RTaXplKCk7XG4gICAgY29uc3QgZXJyb3IgPSAoKSA9PiB1dGlsLnRocm93KCdSaXBwbGUgaW52YWxpZCBzdGF0ZScpO1xuXG4gICAgaWYgKHRoaXMuX2NlbnRlcikge1xuICAgICAgeCA9IGIud2lkdGggLyAyO1xuICAgICAgeSA9IGIuaGVpZ2h0IC8gMjtcblxuICAgICAgaWYgKHNpemUgPT09ICdjb3ZlcicpIHtcbiAgICAgICAgciA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgICAgIHIgPSBNYXRoLm1pbih4LCB5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSAodHlwZW9mIGUuY2xpZW50WCA9PT0gJ251bWJlcicgPyBlLmNsaWVudFggOiBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgpIC0gYi5sZWZ0O1xuICAgICAgeSA9ICh0eXBlb2YgZS5jbGllbnRZID09PSAnbnVtYmVyJyA/IGUuY2xpZW50WSA6IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSkgLSBiLnRvcDtcbiAgICAgIGggPSBNYXRoLm1heCh5LCBiLmhlaWdodCAtIHkpO1xuICAgICAgdyA9IE1hdGgubWF4KHgsIGIud2lkdGggLSB4KTtcblxuICAgICAgaWYgKHNpemUgPT09ICdjb3ZlcicpIHtcbiAgICAgICAgciA9IE1hdGguc3FydChoICogaCArIHcgKiB3KTtcbiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgICAgIHIgPSBNYXRoLm1pbihNYXRoLnJvdW5kKGggLyAyKSwgTWF0aC5yb3VuZCh3IC8gMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3gsIHksIHJ9O1xuICB9XG5cbiAgX3JpcHBsZUFuaW1hdGlvbihlLCBkdXJhdGlvbiA9IDMwMCkge1xuICAgIGNvbnN0IHtfYW5pbWF0b3IsIF93YXZlLCBfYmFja2dyb3VuZCwgX21pblJ9ID0gdGhpcztcbiAgICBjb25zdCB7eCwgeSwgcn0gPSB0aGlzLl9jYWxjdWxhdGVDb29yZHMoZSk7XG5cbiAgICBfYW5pbWF0b3Iuc3RvcEFsbCh7c3RvcE5leHQ6IDF9KTtcbiAgICBfYW5pbWF0b3IuYW5pbWF0ZShfYmFja2dyb3VuZCwge29wYWNpdHk6IDF9LCBkdXJhdGlvbik7XG5cbiAgICB1dGlsLmV4dGVuZChfd2F2ZS5zdHlsZSwge1xuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHRvcDogeSAtIF9taW5SICsgJ3B4JyxcbiAgICAgIGxlZnQ6IHggLSBfbWluUiArICdweCcsXG4gICAgICB3aWR0aDogMiAqIF9taW5SICsgJ3B4JyxcbiAgICAgIGhlaWdodDogMiAqIF9taW5SICsgJ3B4J1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9hbmltYXRvci5hbmltYXRlKF93YXZlLCB7XG4gICAgICB0b3A6IHkgLSByLFxuICAgICAgbGVmdDogeCAtIHIsXG4gICAgICBoZWlnaHQ6IDIgKiByLFxuICAgICAgd2lkdGg6IDIgKiByXG4gICAgfSwgZHVyYXRpb24pO1xuICB9XG5cbiAgX3VwZGF0ZVBhcmVudCgpIHtcbiAgICBpZiAoIXRoaXMuX3BhcmVudFVwZGF0ZWQgJiYgdGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wYXJlbnROb2RlKTtcbiAgICAgIGlmIChjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICB9XG4gICAgICB0aGlzLl9wYXJlbnRVcGRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBfb25UYXAoZSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhZS5yaXBwbGUpIHtcbiAgICAgIGUucmlwcGxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZVBhcmVudCgpO1xuICAgICAgdGhpcy5fcmlwcGxlQW5pbWF0aW9uKGUuZ2VzdHVyZS5zcmNFdmVudCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmZhZGUodGhpcy5fd2F2ZSk7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmZhZGUodGhpcy5fYmFja2dyb3VuZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfb25Ib2xkKGUpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIWUucmlwcGxlKSB7XG4gICAgICBlLnJpcHBsZSA9IHRydWU7XG4gICAgICB0aGlzLl91cGRhdGVQYXJlbnQoKTtcbiAgICAgIHRoaXMuX2hvbGRpbmcgPSB0aGlzLl9yaXBwbGVBbmltYXRpb24oZS5nZXN0dXJlLnNyY0V2ZW50LCAyMDAwKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlbGVhc2UnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIF9vblJlbGVhc2UoZSkge1xuICAgIGlmICh0aGlzLl9ob2xkaW5nICYmICFlLnJpcHBsZSkge1xuICAgICAgZS5yaXBwbGUgPSB0cnVlO1xuICAgICAgdGhpcy5faG9sZGluZy5zcGVlZCgzMDApLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9hbmltYXRvci5zdG9wQWxsKHtzdG9wTmV4dDogdHJ1ZX0pO1xuICAgICAgICB0aGlzLl9hbmltYXRvci5mYWRlKHRoaXMuX3dhdmUpO1xuICAgICAgICB0aGlzLl9hbmltYXRvci5mYWRlKHRoaXMuX2JhY2tncm91bmQpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2hvbGRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWxlYXNlJywgdGhpcy5fb25SZWxlYXNlKTtcbiAgfVxuXG4gIF9vbkRyYWdTdGFydChlKSB7XG4gICAgaWYgKHRoaXMuX2hvbGRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vblJlbGVhc2UoZSk7XG4gICAgfVxuICAgIGlmIChbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGUuZ2VzdHVyZS5kaXJlY3Rpb24pICE9IC0xKSB7XG4gICAgICB0aGlzLl9vblRhcChlKTtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9wYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlO1xuXG4gICAgaWYgKGludGVybmFsLmNvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RhcCcsIHRoaXMuX29uVGFwKTtcbiAgICAgIHRoaXMuX3BhcmVudE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignaG9sZCcsIHRoaXMuX29uSG9sZCk7XG4gICAgICB0aGlzLl9wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBjb25zdCBwbiA9IHRoaXMuX3BhcmVudE5vZGUgfHwgdGhpcy5wYXJlbnROb2RlO1xuICAgIHBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RhcCcsIHRoaXMuX29uVGFwKTtcbiAgICBwbi5yZW1vdmVFdmVudExpc3RlbmVyKCdob2xkJywgdGhpcy5fb25Ib2xkKTtcbiAgICBwbi5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydzdGFydC1yYWRpdXMnLCAnY29sb3InLCAnYmFja2dyb3VuZCcsICdjZW50ZXInLCAnY2xhc3MnLCAnbW9kaWZpZXInXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG5cbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzdGFydC1yYWRpdXMnOlxuICAgICAgICB0aGlzLl9taW5SID0gTWF0aC5tYXgoMCwgcGFyc2VGbG9hdChjdXJyZW50KSB8fCAwKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2F2ZS5zdHlsZS5iYWNrZ3JvdW5kID0gY3VycmVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2JhY2tncm91bmQnKSkge1xuICAgICAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmQgPSBjdXJyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiYWNrZ3JvdW5kJzpcbiAgICAgICAgaWYgKGN1cnJlbnQgfHwgbGFzdCkge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9iYWNrZ3JvdW5kLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIGlmIChuYW1lID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRoaXMuX2NlbnRlciA9IGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50ICE9ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoUmlwcGxlRWxlbWVudCwgWydkaXNhYmxlZCcsICdjZW50ZXInXSk7XG5cbm9uc0VsZW1lbnRzLlJpcHBsZSA9IFJpcHBsZUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1yaXBwbGUnLCBSaXBwbGVFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi8uLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi8uLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi8uLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlLWVsZW1lbnQuanMnO1xuXG5pbXBvcnQgJy4uL29ucy1yaXBwbGUuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlQnV0dG9uRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBnZXQgX3NjaGVtZSgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnZXR0ZXItcmV0dXJuXG4gICAgdXRpbC50aHJvd01lbWJlcigpO1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBnZXQgX3JpcHBsZU9wdCgpIHtcbiAgICByZXR1cm4gW3RoaXNdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQnV0dG9uRWxlbWVudCkge1xuICAgICAgdXRpbC50aHJvd0Fic3RyYWN0KCk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX2ljb24oKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtaWNvbicpO1xuICB9XG5cbiAgZ2V0IF9oaWRkZW5CdXR0b24oKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdidXR0b24nKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKHRoaXMuX2RlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgaWYgKCF0aGlzLl9pY29uICYmIHRoaXMuaGFzQXR0cmlidXRlKCdpY29uJykpIHtcbiAgICAgIHV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0KCdJY29uJyk7XG4gICAgICBjb25zdCBpY29uID0gdXRpbC5jcmVhdGVFbGVtZW50KGA8b25zLWljb24gaWNvbj1cIiR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKX1cIj48L29ucy1pY29uPmApO1xuICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKHRoaXMuX2RlZmF1bHRDbGFzc05hbWUucmVwbGFjZSgnYnV0dG9uJywgJ2ljb24nKSk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShpY29uLCB0aGlzLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIC8vIEFkZCBoaWRkZW4gYnV0dG9uIHRvIGFsbG93IGZvcm0gc3VibWlzc2lvblxuICAgIGlmICghdGhpcy5faGlkZGVuQnV0dG9uKSB7XG4gICAgICBjb25zdCBidXR0b24gPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxidXR0b24gaGlkZGVuPjwvYnV0dG9uPicpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVJpcHBsZSgpO1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgX3VwZGF0ZUljb24oKSB7XG4gICAgaWYgKHRoaXMuX2ljb24pIHtcbiAgICAgIHRoaXMuX2ljb24uc2V0QXR0cmlidXRlKCdpY29uJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZVJpcHBsZSgpIHtcbiAgICB0aGlzLl9yaXBwbGVPcHQgJiYgdXRpbC51cGRhdGVSaXBwbGUoLi4udGhpcy5fcmlwcGxlT3B0KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJywgJ2ljb24nLCAncmlwcGxlJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lLCB0aGlzLl9zY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHRoaXMuX3NjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaWNvbic6XG4gICAgICAgIHRoaXMuX3VwZGF0ZUljb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaXBwbGUnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lKSAmJiB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoQmFzZUJ1dHRvbkVsZW1lbnQsIFsncmlwcGxlJywgJ2Rpc2FibGVkJ10pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUJ1dHRvbkVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtYnV0dG9uLmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYWN0aW9uLXNoZWV0LWJ1dHRvblxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQG1vZGlmaWVyIGRlc3RydWN0aXZlXG4gKiAgIFtlbl1TaG93cyBhIFwiZGVzdHJ1Y3RpdmVcIiBidXR0b24gKG9ubHkgZm9yIGlPUykuWy9lbl1cbiAqICAgW2phXVwiZGVzdHJ1Y3RpdmVcIuOBquODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmShpT1Pjgafjga7jgb/mnInlirkp44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ29tcG9uZW50IHRoYXQgcmVwcmVzZW50IGVhY2ggYnV0dG9uIG9mIHRoZSBhY3Rpb24gc2hlZXQuWy9lbl1cbiAqICAgW2phXeOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOOBq+ihqOekuuOBleOCjOOCi+WQhOODnOOCv+ODs+OCkuihqOePvuOBmeOCi+OCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAglsvamFdXG4gKiBAc2VlYWxzbyBvbnMtYWN0aW9uLXNoZWV0XG4gKiAgIFtlbl1UaGUgYDxvbnMtYWN0aW9uLXNoZWV0PmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1hY3Rpb24tc2hlZXTjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWxpc3QtaXRlbVxuICogICBbZW5dVGhlIGA8b25zLWxpc3QtaXRlbT5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbGlzdC1pdGVt44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1pY29uXG4gKiAgIFtlbl1UaGUgYDxvbnMtaWNvbj5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtaWNvbuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvYWN0aW9uLXNoZWV0XG4gKiBAZ3VpZGUgYXBwc2l6ZS5odG1sI3JlbW92aW5nLWljb24tcGFja3MgW2VuXVJlbW92aW5nIGljb24gcGFja3MuWy9lbl1bamFdWy9qYV1cbiAqIEBndWlkZSBmYXEuaHRtbCNob3ctY2FuLWktdXNlLWN1c3RvbS1pY29uLXBhY2tzIFtlbl1BZGRpbmcgY3VzdG9tIGljb24gcGFja3MuWy9lbl1bamFdWy9qYV1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dRGlzcGxheSBhIE1hdGVyaWFsIERlc2lnbiBhY3Rpb24gc2hlZXQgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV3jg57jg4bjg6rjgqLjg6vjg4fjgrbjgqTjg7Pjga7jgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jnlKjjga7jg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYWN0aW9uLXNoZWV0IGlkPVwic2hlZXRcIj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqIDwvb25zLWFjdGlvbi1zaGVldD5cbiAqXG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hlZXQnKS5zaG93KCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWN0aW9uU2hlZXRCdXR0b25FbGVtZW50IGV4dGVuZHMgQmFzZUJ1dHRvbkVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGljb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ3JlYXRlcyBhbiBgb25zLWljb25gIGNvbXBvbmVudCB3aXRoIHRoaXMgc3RyaW5nLiBPbmx5IHZpc2libGUgb24gQW5kcm9pZC4gQ2hlY2sgW1NlZSBhbHNvXSgjc2VlYWxzbykgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5bL2VuXVxuICAgKiAgW2phXWBvbnMtaWNvbmDjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgpLmgqrmgKfjgZfjgb7jgZnjgIJBbmRyb2lk44Gn44Gu44G/6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBhY3Rpb24gc2hlZXQgYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOODnOOCv+ODs+OBruimi+OBn+ebruOCkuioreWumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnJzogJ2FjdGlvbi1zaGVldC1idXR0b24tLSonLFxuICAgICAgJy5hY3Rpb24tc2hlZXQtaWNvbic6ICdhY3Rpb24tc2hlZXQtaWNvbi0tKidcbiAgICB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnYWN0aW9uLXNoZWV0LWJ1dHRvbic7XG4gIH1cblxuICBnZXQgX3JpcHBsZU9wdCgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkFjdGlvblNoZWV0QnV0dG9uID0gQWN0aW9uU2hlZXRCdXR0b25FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbicsIEFjdGlvblNoZWV0QnV0dG9uRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgQmFzZUFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBzaG93KGRpYWxvZywgZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgaGlkZShkaWFsb2csIGRvbmUpIHtcbiAgICBkb25lKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbmRyb2lkIHN0eWxlIGFuaW1hdG9yIGZvciBhbGVydCBkaWFsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciBleHRlbmRzIEFsZXJ0RGlhbG9nQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZHVyYXRpb24gPSAwLjIsIGRlbGF5ID0gMH0gPSB7fSkge1xuICAgIHN1cGVyKHtkdXJhdGlvbiwgdGltaW5nLCBkZWxheX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKC45LCAuOSwgMSknLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKDEsIDEsIDEpJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMSwgMSwgMSknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKC45LCAuOSwgMSknLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgYWxlcnQgZGlhbG9nLlxuICovXG5leHBvcnQgY2xhc3MgSU9TQWxlcnREaWFsb2dBbmltYXRvciBleHRlbmRzIEFsZXJ0RGlhbG9nQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZHVyYXRpb24gPSAwLjIsIGRlbGF5ID0gMH0gPSB7fSkge1xuICAgIHN1cGVyKHtkdXJhdGlvbiwgdGltaW5nLCBkZWxheX0pO1xuICB9XG5cbiAgLypcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMS4zLCAxLjMsIDEpJywgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgxLCAxLCAxKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAxIH0sIHsgb3BhY2l0eTogMCB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAxIH0sIHsgb3BhY2l0eTogMCB9KVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nQW5pbWF0b3IsIElPU0FsZXJ0RGlhbG9nQW5pbWF0b3IsIEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIH0gZnJvbSAnLi9vbnMtYWxlcnQtZGlhbG9nL2FuaW1hdG9yLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9vbnMvcGxhdGZvcm0uanMnO1xuaW1wb3J0IEJhc2VEaWFsb2dFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWRpYWxvZy5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnLmFsZXJ0LWRpYWxvZyc6ICdhbGVydC1kaWFsb2ctLSonLFxuICAnLmFsZXJ0LWRpYWxvZy1jb250YWluZXInOiAnYWxlcnQtZGlhbG9nLWNvbnRhaW5lci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLXRpdGxlJzogJ2FsZXJ0LWRpYWxvZy10aXRsZS0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWNvbnRlbnQnOiAnYWxlcnQtZGlhbG9nLWNvbnRlbnQtLSonLFxuICAnLmFsZXJ0LWRpYWxvZy1mb290ZXInOiAnYWxlcnQtZGlhbG9nLWZvb3Rlci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWZvb3Rlci0tcm93Zm9vdGVyJzogJ2FsZXJ0LWRpYWxvZy1mb290ZXItLXJvd2Zvb3Rlci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcm93Zm9vdGVyJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLXJvd2Zvb3Rlci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcHJpbWFsJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLXByaW1hbC0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWJ1dHRvbic6ICdhbGVydC1kaWFsb2ctYnV0dG9uLS0qJyxcbiAgJ29ucy1hbGVydC1kaWFsb2ctYnV0dG9uJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLSonLFxuICAnLmFsZXJ0LWRpYWxvZy1tYXNrJzogJ2FsZXJ0LWRpYWxvZy1tYXNrLS0qJyxcbiAgJy50ZXh0LWlucHV0JzogJ3RleHQtaW5wdXQtLSonXG59O1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICAnbm9uZSc6IEFsZXJ0RGlhbG9nQW5pbWF0b3IsXG4gICdkZWZhdWx0JzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciA6IElPU0FsZXJ0RGlhbG9nQW5pbWF0b3I7IH0sXG4gICdmYWRlJzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciA6IElPU0FsZXJ0RGlhbG9nQW5pbWF0b3I7IH1cbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWFsZXJ0LWRpYWxvZ1xuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBBbGVydCBkaWFsb2cgdGhhdCBpcyBkaXNwbGF5ZWQgb24gdG9wIG9mIHRoZSBjdXJyZW50IHNjcmVlbi4gVXNlZnVsIGZvciBkaXNwbGF5aW5nIHF1ZXN0aW9ucywgd2FybmluZ3Mgb3IgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHVzZXIuIFRoZSB0aXRsZSwgY29udGVudCBhbmQgYnV0dG9ucyBjYW4gYmUgZWFzaWx5IGN1c3RvbWl6ZWQgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBzd2l0Y2ggc3R5bGUgYmFzZWQgb24gdGhlIHBsYXRmb3JtLlxuICpcbiAqICAgICBUbyB1c2UgdGhlIGVsZW1lbnQgaXQgY2FuIGVpdGhlciBiZSBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgYDxib2R5PmAgZWxlbWVudCBvciBkeW5hbWljYWxseSBjcmVhdGVkIGZyb20gYSB0ZW1wbGF0ZSB1c2luZyB0aGUgYG9ucy5jcmVhdGVBbGVydERpYWxvZyh0ZW1wbGF0ZSlgIHV0aWxpdHkgZnVuY3Rpb24gYW5kIHRoZSBgPHRlbXBsYXRlPmAgdGFnLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg54++5Zyo44Gu44K544Kv44Oq44O844Oz44Gu5LiK44Gr6KGo56S644GZ44KL44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gn44GZ44CC44Om44O844K244Gr5a++44GZ44KL5ZWP44GE44GL44GR44CB6K2m5ZGK44CB44Ko44Op44O844Oh44OD44K744O844K444KS6KGo56S644GZ44KL44Gu44Gr5Yip55So44Gn44GN44G+44GZ44CC44K/44Kk44OI44Or44KE44Kz44Oz44OG44Oz44OE44KE44Oc44K/44Oz44Gv57Ch5Y2Y44Gr44Kr44K544K/44Oe44Kk44K644Gn44GN44CB5a6f6KGM44GX44Gm44GE44KL44OX44Op44OD44OI44OV44Kp44O844Og44Gr5L2144Gb44Gm44K544K/44Kk44Or44GM6Ieq5YuV55qE44Gr5YiH44KK5pu/44KP44KK44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAY29kZXBlbiBRd3d4eXBcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9hbGVydC1kaWFsb2dcbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIHN0eWxlWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruOCueOCv+OCpOODq1svamFdXG4gKiBAbW9kaWZpZXIgcm93Zm9vdGVyXG4gKiAgIFtlbl1Ib3Jpem9udGFsbHkgYWxpZ25zIHRoZSBmb290ZXIgYnV0dG9ucy5bL2VuXVxuICogICBbamFd44OV44OD44K/44O844Gu6KSH5pWw44Gu44Oc44K/44Oz44KS5rC05bmz44Gr6YWN572uWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1kaWFsb2dcbiAqICAgW2VuXW9ucy1kaWFsb2cgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1kaWFsb2fjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXBvcG92ZXJcbiAqICAgW2VuXW9ucy1wb3BvdmVyIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtZGlhbG9n44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy5ub3RpZmljYXRpb25cbiAqICAgW2VuXVVzaW5nIG9ucy5ub3RpZmljYXRpb24gdXRpbGl0eSBmdW5jdGlvbnMuWy9lbl1cbiAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOCkuihqOekuuOBmeOCi+OBq+OBr+OAgW9ucy5ub3RpZmljYXRpb27jgqrjg5bjgrjjgqfjgq/jg4jjga7jg6Hjgr3jg4Pjg4njgpLkvb/jgYbjgZPjgajjgoLjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYWxlcnQtZGlhbG9nIGlkPVwiYWxlcnQtZGlhbG9nXCI+XG4gKiAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctdGl0bGVcIj5XYXJuaW5nITwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWNvbnRlbnRcIj5cbiAqICAgICBBbiBlcnJvciBoYXMgb2NjdXJyZWQhXG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWZvb3RlclwiPlxuICogICAgIDxidXR0b24gaWQ9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCIgY2xhc3M9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCI+T0s8L2J1dHRvbj5cbiAqICAgPC9kaXY+XG4gKiA8L29ucy1hbGVydC1kaWFsb2c+XG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtZGlhbG9nJykuc2hvdygpO1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFsZXJ0RGlhbG9nRWxlbWVudCBleHRlbmRzIEJhc2VEaWFsb2dFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZXNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBhbGVydCBkaWFsb2cgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbGVydERpYWxvZ1xuICAgKiAgIFtlbl1BbGVydCBkaWFsb2cgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRvIHN0b3AgdGhlIGRpYWxvZyBmcm9tIHNob3dpbmcuWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644KS5q2i44KB44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgYWxlcnQgZGlhbG9nIGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgZ/nm7TlvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWxlcnREaWFsb2dcbiAgICogICBbZW5dQWxlcnQgZGlhbG9nIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBhbGVydCBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBjOmaoOOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbGVydERpYWxvZ1xuICAgKiAgIFtlbl1BbGVydCBkaWFsb2cgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRvIHN0b3AgdGhlIGRpYWxvZyBmcm9tIGhpZGluZy5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHjgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgYzplonjgZjjgojjgYbjgajjgZnjgovjga7jgpLmraLjgoHjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgYWxlcnQgZGlhbG9nIGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFsZXJ0RGlhbG9nXG4gICAqICAgW2VuXUFsZXJ0IGRpYWxvZyBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBkaWFsb2djYW5jZWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCB3aGVuIHRoZSBkaWFsb2cgaXMgY2FuY2VsZWQuWy9lbl1cbiAgICogW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkaWFsb2cuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjga7opovjgZ/nm67jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjYW5jZWxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICBbamFd44GT44Gu5bGe5oCn44KS6Kit5a6a44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6IOM5pmv44KS44K/44OD44OX44GX44Gf44KKQW5kcm9pZOODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OCkuaKvOOBmeOBqOODgOOCpOOCouODreOCsOOBjOmWieOBmOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgZGlhbG9nIGlzIGRpc2FibGVkLlsvZW5dXG4gICAqICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GvZGlzYWJsZWTnirbmhYvjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIGRpYWxvZy4gQ2FuIGJlIGVpdGhlciBgXCJub25lXCJgIG9yIGBcImRlZmF1bHRcImAuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjgpLooajnpLrjgZnjgovpmpvjga7jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjgafjga9cIm5vbmVcIuOBi1wiZGVmYXVsdFwi44GM5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uLW9wdGlvbnNcbiAgICogQHR5cGUge0V4cHJlc3Npb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtYXNrLWNvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGFsZXJ0IGRpYWxvZyBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqL1xuICBnZXQgX21hc2soKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuYWxlcnQtZGlhbG9nLW1hc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKi9cbiAgZ2V0IF9kaWFsb2coKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuYWxlcnQtZGlhbG9nJyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKi9cbiAgZ2V0IF90aXRsZUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMuX2RpYWxvZy5jaGlsZHJlblswXSwgJy5hbGVydC1kaWFsb2ctdGl0bGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKi9cbiAgZ2V0IF9jb250ZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcy5fZGlhbG9nLmNoaWxkcmVuWzBdLCAnLmFsZXJ0LWRpYWxvZy1jb250ZW50Jyk7XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogQWxlcnREaWFsb2dBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdBbGVydERpYWxvZ0FuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKVxuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zdHlsZS56SW5kZXggPSAxMDAwMTtcblxuICAgIC8qKlxuICAgICAqIEV4cGVjdGVkIHJlc3VsdCBhZnRlciBjb21waWxlOlxuICAgICAqXG4gICAgICogPG9ucy1hbGVydC1kaWFsb2cgc3R5bGU9XCJub25lXCI+XG4gICAgICogICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLW1hc2tcIj48L2Rpdj5cbiAgICAgKiAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2dcIj5cbiAgICAgKiAgICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy1jb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKiAgIDwvZGl2PlxuICAgICAqIDwvb25zLWFsZXJ0LWRpYWxvZz5cbiAgICAgKi9cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICBpZiAoIXRoaXMuX21hc2sgJiYgIXRoaXMuX2RpYWxvZykge1xuICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkge1xuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tYXNrKSB7XG4gICAgICBjb25zdCBtYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtYXNrLmNsYXNzTGlzdC5hZGQoJ2FsZXJ0LWRpYWxvZy1tYXNrJyk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShtYXNrLCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2RpYWxvZykge1xuICAgICAgY29uc3QgZGlhbG9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaWFsb2cuY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nJyk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShkaWFsb2csIG51bGwpO1xuICAgIH1cblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcy5fZGlhbG9nLCAnLmFsZXJ0LWRpYWxvZy1jb250YWluZXInKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nLWNvbnRhaW5lcicpO1xuICAgICAgdGhpcy5fZGlhbG9nLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlhbG9nLmNoaWxkcmVuWzBdLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgdGhpcy5fZGlhbG9nLnN0eWxlLnpJbmRleCA9IDIwMDAxO1xuICAgIHRoaXMuX21hc2suc3R5bGUuekluZGV4ID0gMjAwMDA7XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHRoaXMuX3NjaGVtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjYW5jZWxhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgb3Igbm90LiBBIGNhbmNlbGFibGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICAgW2phXeOBneOBruODgOOCpOOCouODreOCsOOBjOOCreODo+ODs+OCu+ODq+WPr+iDveOBi+OBqeOBhuOBi+OCkuihqOOBl+OBvuOBmeOAguOCreODo+ODs+OCu+ODq+WPr+iDveOBquODgOOCpOOCouODreOCsOOBr+OAgeiDjOaZr+OCkuOCv+ODg+ODl+OBmeOCi+OBi0FuZHJvaWTjg4fjg5DjgqTjgrnjga7jg5Djg4Pjgq/jg5zjgr/jg7PjgpLmirzjgZnjgZPjgajjgafplonjgZjjgovjgZPjgajjgYzlh7rmnaXjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG1hc2tDb2xvclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCByZ2JhKDAsIDAsIDAsIDAuMilcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgbWFzay4gRGVmYXVsdCBpcyBcInJnYmEoMCwgMCwgMCwgMC4yKVwiLlsvZW5dXG4gICAqICBbamFd6IOM5pmv44Gu44Oe44K544Kv44Gu6Imy44KS5oyH5a6a44GX44G+44GZ44CCXCJyZ2JhKDAsIDAsIDAsIDAuMilcIuOBjOODh+ODleOCqeODq+ODiOWApOOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwiZmFkZVwiYCBhbmQgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgILmjIflrprjgafjgY3jgovjga7jga/jgIFcImZhZGVcIiwgXCJub25lXCLjga7jgYTjgZrjgozjgYvjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gPGNvZGU+e2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfTwvY29kZT4gWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiByZXZlYWxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozntYLjgo/jgaPjgZ/mmYLjgavlkbzjgbPlh7rjgZXjgozjgovjgrPjg7zjg6vjg5Djg4Pjgq/jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2hvdyB0aGUgYWxlcnQgZGlhbG9nLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXUEgYFByb21pc2VgIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZSBkaXNwbGF5ZWQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV3ooajnpLrjgZXjgozjgovopoHntKDjgpLop6PmsbrjgZnjgotgUHJvbWlzZWDjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlXG4gICAqIEBzaWduYXR1cmUgaGlkZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcImZhZGVcImAgYW5kIGBcIm5vbmVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJmYWRlXCIsIFwibm9uZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICA8Y29kZT57ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiA8Y29kZT57ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPiBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSBhZnRlciB0aGUgZGlhbG9nIGhhcyBiZWVuIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jg4DjgqTjgqLjg63jgrDjgYzplonjgZjjgZ/mmYLjgavlkbzjgbPlh7rjgZXjgozjgovjgrPjg7zjg6vjg5Djg4Pjgq/jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0aGUgYWxlcnQgZGlhbG9nLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOCkumWieOBmOOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXemaoOOCjOOBn+imgee0oOOCkuino+axuuOBmeOCi2BQcm9taXNlYOOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9uRGV2aWNlQmFja0J1dHRvblxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQmFjay1idXR0b24gaGFuZGxlci5bL2VuXVxuICAgKiAgIFtqYV3jg5Djg4Pjgq/jg5zjgr/jg7Pjg4/jg7Pjg4njg6njgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7RGlhbG9nQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIEFsZXJ0RGlhbG9nQW5pbWF0b3IpKSB7XG4gICAgICB1dGlsLnRocm93QW5pbWF0b3IoJ0FsZXJ0RGlhbG9nJyk7XG4gICAgfVxuICAgIF9hbmltYXRvckRpY3RbbmFtZV0gPSBBbmltYXRvcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgYW5pbWF0b3JzKCkge1xuICAgIHJldHVybiBfYW5pbWF0b3JEaWN0O1xuICB9XG5cbiAgc3RhdGljIGdldCBBbGVydERpYWxvZ0FuaW1hdG9yKCkge1xuICAgIHJldHVybiBBbGVydERpYWxvZ0FuaW1hdG9yO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkFsZXJ0RGlhbG9nID0gQWxlcnREaWFsb2dFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYWxlcnQtZGlhbG9nJywgQWxlcnREaWFsb2dFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VCdXR0b25FbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWJ1dHRvbi5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWFsZXJ0LWRpYWxvZy1idXR0b25cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIGFsZXJ0LWRpYWxvZyBidXR0b24uWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLWFsZXJ0LWRpYWxvZ1xuICogICBbZW5dVGhlIGA8b25zLWFsZXJ0LWRpYWxvZz5gIGNvbXBvbmVudCBkaXNwbGF5cyBhIGFsZXJ0IGRpYWxvZy5bL2VuXVxuICogICBbamFdb25zLWFsZXJ0LWRpYWxvZ+OCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogIDxvbnMtYWxlcnQtZGlhbG9nPlxuICogICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy10aXRsZVwiPldhcm5pbmchPC9kaXY+XG4gKiAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWNvbnRlbnRcIj5cbiAqICAgICAgQW4gZXJyb3IgaGFzIG9jY3VycmVkIVxuICogICAgPC9kaXY+XG4gKiAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWZvb3RlclwiPlxuICogICAgICA8YWxlcnQtZGlhbG9nLWJ1dHRvbiBvbmNsaWNrPVwiYXBwLmNsb3NlKClcIj5DYW5jZWw8L2FsZXJ0LWRpYWxvZy1idXR0b24+XG4gKiAgICAgIDxhbGVydC1kaWFsb2ctYnV0dG9uIGNsYXNzPVwiYWxlcnQtZGlhbG9nLWJ1dHRvblwiIG9uY2xpY2s9XCJhcHAuY2xvc2UoKVwiPk9LPC9hbGVydC1kaWFsb2ctYnV0dG9uPlxuICogICAgPC9kaXY+XG4gKiAgPC9vbnMtYWxlcnQtZGlhbG9nPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbGVydERpYWxvZ0J1dHRvbkVsZW1lbnQgZXh0ZW5kcyBCYXNlQnV0dG9uRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBidXR0b24uWy9lbl1cbiAgICogICBbamFd44Oc44K/44Oz44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg5zjgr/jg7PjgpLnhKHlirnljJbjgZnjgovloLTlkIjjga/mjIflrprjgZfjgabjgY/jgaDjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHsgJyc6ICdhbGVydC1kaWFsb2ctYnV0dG9uLS0qJyB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnYWxlcnQtZGlhbG9nLWJ1dHRvbic7XG4gIH1cblxuICBnZXQgX3JpcHBsZU9wdCgpIHtcbiAgICByZXR1cm4gW3RoaXMsIHVuZGVmaW5lZCwgeyAnbW9kaWZpZXInOiAnbGlnaHQtZ3JheScgfV07XG4gIH1cbn1cblxub25zRWxlbWVudHMuQWxlcnREaWFsb2dCdXR0b24gPSBBbGVydERpYWxvZ0J1dHRvbkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1hbGVydC1kaWFsb2ctYnV0dG9uJywgQWxlcnREaWFsb2dCdXR0b25FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnYmFjay1idXR0b24nO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAnYmFjay1idXR0b24tLSonLFxuICAnLmJhY2stYnV0dG9uX19pY29uJzogJ2JhY2stYnV0dG9uLS0qX19pY29uJyxcbiAgJy5iYWNrLWJ1dHRvbl9fbGFiZWwnOiAnYmFjay1idXR0b24tLSpfX2xhYmVsJ1xufTtcblxuLy8gb3JpZ2luYWwgaW1hZ2UgZmlsZSBhdCBtaXNjL2ltYWdlcy9pb3MtYmFjay1idXR0b24taWNvbi5zdmdcbmNvbnN0IGlvc0JhY2tCdXR0b25JY29uID0gYFxuICA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiAgPHN2ZyB3aWR0aD1cIjEzcHhcIiBoZWlnaHQ9XCIyMXB4XCIgdmlld0JveD1cIjAgMCAxMyAyMVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+XG4gICAgICA8dGl0bGU+aW9zLWJhY2stYnV0dG9uLWljb248L3RpdGxlPlxuICAgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+XG4gICAgICA8ZGVmcz48L2RlZnM+XG4gICAgICA8ZyBpZD1cInRvb2xiYXItYmFjay1idXR0b25cIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICA8ZyBpZD1cImlvc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMzQuMDAwMDAwLCAtMzAuMDAwMDAwKVwiPlxuICAgICAgICAgICAgICA8cG9seWdvbiBpZD1cImlvcy1iYWNrLWJ1dHRvbi1pY29uXCIgcG9pbnRzPVwiMzQgNDAuNSA0NC41IDMwIDQ2LjUgMzIgMzggNDAuNSA0Ni41IDQ5IDQ0LjUgNTFcIj48L3BvbHlnb24+XG4gICAgICAgICAgPC9nPlxuICAgICAgPC9nPlxuICA8L3N2Zz5cbmA7XG5cbi8vIG9yaWdpbmFsIGltYWdlIGZpbGUgYXQgbWlzYy9pbWFnZXMvbWQtYmFjay1idXR0b24taWNvbi5zdmdcbmNvbnN0IG1kQmFja0J1dHRvbkljb24gPSBgXG4gIDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuICA8c3ZnIHdpZHRoPVwiMTZweFwiIGhlaWdodD1cIjE2cHhcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj5cbiAgICAgIDx0aXRsZT5tZC1iYWNrLWJ1dHRvbi1pY29uPC90aXRsZT5cbiAgICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPlxuICAgICAgPGRlZnM+PC9kZWZzPlxuICAgICAgPGcgaWQ9XCJ0b29sYmFyLWJhY2stYnV0dG9uXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgPGcgaWQ9XCJhbmRyb2lkXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0zMi4wMDAwMDAsIC0zMi4wMDAwMDApXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiPlxuICAgICAgICAgICAgICA8cG9seWdvbiBpZD1cIm1kLWJhY2stYnV0dG9uLWljb25cIiBwb2ludHM9XCI0OCAzOSAzNS44MyAzOSA0MS40MiAzMy40MSA0MCAzMiAzMiA0MCA0MCA0OCA0MS40MSA0Ni41OSAzNS44MyA0MSA0OCA0MVwiPjwvcG9seWdvbj5cbiAgICAgICAgICA8L2c+XG4gICAgICA8L2c+XG4gIDwvc3ZnPlxuYDtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYmFjay1idXR0b25cbiAqIEBjYXRlZ29yeSBuYXZpZ2F0aW9uXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEJhY2sgYnV0dG9uIGNvbXBvbmVudCBmb3IgYDxvbnMtdG9vbGJhcj5gLiBQdXQgaXQgaW4gdGhlIGxlZnQgcGFydCBvZiB0aGUgYDxvbnMtdG9vbGJhcj5gLlxuICpcbiAqICAgICBJdCB3aWxsIGZpbmQgdGhlIHBhcmVudCBgPG9ucy1uYXZpZ2F0b3I+YCBlbGVtZW50IGFuZCBwb3AgYSBwYWdlIHdoZW4gY2xpY2tlZC4gVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHNwZWNpZnlpbmcgdGhlIGBvbkNsaWNrYCBwcm9wZXJ0eSBhbmQgY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCBpbiBpdHMgY2FsbGJhY2suXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4gYUhtR0xcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9iYWNrLWJ1dHRvblxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc3R5bGVbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10b29sYmFyXG4gKiAgIFtlbl1vbnMtdG9vbGJhciBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXRvb2xiYXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLW5hdmlnYXRvclxuICogICBbZW5db25zLW5hdmlnYXRvciBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLW5hdmlnYXRvcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy10b29sYmFyPlxuICogICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICogICAgIDxvbnMtYmFjay1idXR0b24+QmFjazwvb25zLWJhY2stYnV0dG9uPlxuICogICA8L2Rpdj5cbiAqICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgIFRpdGxlXG4gKiAgIDxkaXY+XG4gKiA8L29ucy10b29sYmFyPlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tCdXR0b25FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgYmFjayBidXR0b24uWy9lbl1cbiAgICogIFtqYV3jg5Djg4Pjgq/jg5zjgr/jg7Pjga7opovjgZ/nm67jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX29wdGlvbnMgPSB7fTtcbiAgICB0aGlzLl9ib3VuZE9uQ2xpY2sgPSB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyk7XG5cbiAgICBjb25zdCB7b25Db25uZWN0ZWQsIG9uRGlzY29ubmVjdGVkfSA9IHV0aWwuZGVmaW5lTGlzdGVuZXJQcm9wZXJ0eSh0aGlzLCAnY2xpY2snKTtcbiAgICB0aGlzLl9jb25uZWN0T25DbGljayA9IG9uQ29ubmVjdGVkO1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrID0gb25EaXNjb25uZWN0ZWQ7XG4gIH1cblxuICBfdXBkYXRlSWNvbihpY29uID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5iYWNrLWJ1dHRvbl9faWNvbicpKSB7XG4gICAgaWNvbi5pbm5lckhUTUwgPSBhdXRvU3R5bGUuZ2V0UGxhdGZvcm0odGhpcykgPT09ICdhbmRyb2lkJyB8fCB1dGlsLmhhc01vZGlmaWVyKHRoaXMsICdtYXRlcmlhbCcpID8gbWRCYWNrQnV0dG9uSWNvbiA6IGlvc0JhY2tCdXR0b25JY29uO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHRoaXMsICcuYmFjay1idXR0b25fX2xhYmVsJykpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdXRpbC5jcmVhdGUoJ3NwYW4uYmFjay1idXR0b25fX2xhYmVsJyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgIH1cblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5iYWNrLWJ1dHRvbl9faWNvbicpKSB7XG4gICAgICBjb25zdCBpY29uID0gdXRpbC5jcmVhdGUoJ3NwYW4uYmFjay1idXR0b25fX2ljb24nKTtcbiAgICAgIHRoaXMuX3VwZGF0ZUljb24oaWNvbik7XG5cbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGljb24sIHRoaXMuY2hpbGRyZW5bMF0pO1xuICAgIH1cblxuICAgIHV0aWwudXBkYXRlUmlwcGxlKHRoaXMsIHVuZGVmaW5lZCwge2NlbnRlcjogJycsICdzaXplJzogJ2NvbnRhaW4nLCAnYmFja2dyb3VuZCc6ICd0cmFuc3BhcmVudCd9KTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dT3B0aW9ucyBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zLmFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBcInNsaWRlXCIsIFwibGlmdFwiLCBcImZhZGVcIiBhbmQgXCJub25lXCIuXG4gICAqICAgICBUaGVzZSBhcmUgcGxhdGZvcm0gYmFzZWQgYW5pbWF0aW9ucy4gRm9yIGZpeGVkIGFuaW1hdGlvbnMsIGFkZCBcIi1pb3NcIiBvciBcIi1tZFwiXG4gICAqICAgICBzdWZmaXggdG8gdGhlIGFuaW1hdGlvbiBuYW1lLiBFLmcuIFwibGlmdC1pb3NcIiwgXCJsaWZ0LW1kXCIuIERlZmF1bHRzIHZhbHVlcyBhcmUgXCJzbGlkZS1pb3NcIiBhbmQgXCJmYWRlLW1kXCIuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9ucy5jYWxsYmFja1xuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNpdGlvbiBoYXMgZW5kZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu44Oh44K944OD44OJ44Gr44KI44KL55S76Z2i6YG356e744GM57WC5LqG44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBzZXQgb3B0aW9ucyhvYmplY3QpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkNsaWNrXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFjayBidXR0b24gYmVoYXZpb3IuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBjb25zdCBuYXZpZ2F0b3IgPSB1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy1uYXZpZ2F0b3InKTtcbiAgICAgICAgaWYgKG5hdmlnYXRvcikge1xuICAgICAgICAgIG5hdmlnYXRvci5wb3BQYWdlKHsuLi50aGlzLm9wdGlvbnMsIG9uc0JhY2tCdXR0b246IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIHRoaXMuX2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ21vZGlmaWVyJzoge1xuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKSAmJiB0aGlzLl91cGRhdGVJY29uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2ssIGZhbHNlKTtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25DbGljaygpO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkJhY2tCdXR0b24gPSBCYWNrQnV0dG9uRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWJhY2stYnV0dG9uJywgQmFja0J1dHRvbkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnYm90dG9tLWJhcic7XG5jb25zdCBzY2hlbWUgPSB7Jyc6ICdib3R0b20tYmFyLS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWJvdHRvbS10b29sYmFyXG4gKiBAY2F0ZWdvcnkgcGFnZVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1Ub29sYmFyIGNvbXBvbmVudCB0aGF0IGlzIHBvc2l0aW9uZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS4gU2luY2UgYm90dG9tIHRvb2xiYXJzIGFyZSB2ZXJ5IHZlcnNhdGlsZSBlbGVtZW50cywgYG9ucy1ib3R0b20tdG9vbGJhcmAgZG9lcyBub3QgcHJvdmlkZSBhbnkgc3BlY2lmaWMgbGF5b3V0IHN5bnRheCBmb3IgaXRzIGNoaWxkcmVuLiBNb2RpZmllcnMgb3IgY3VzdG9tIENTUyBtdXN0IGJlIHVzZWQuWy9lbl1cbiAqICAgW2phXeODmuODvOOCuOS4i+mDqOOBq+mFjee9ruOBleOCjOOCi+ODhOODvOODq+ODkOODvOeUqOOCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgdHJhbnNwYXJlbnRcbiAqICAgW2VuXU1ha2UgdGhlIHRvb2xiYXIgdHJhbnNwYXJlbnQuWy9lbl1cbiAqICAgW2phXeODhOODvOODq+ODkOODvOOBruiDjOaZr+OCkumAj+aYjuOBq+OBl+OBpuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgYWxpZ25lZFxuICogICBbZW5dVmVydGljYWxseSBhbGlnbnMgaXRzIGNoaWxkcmVuIGFuZCBhcHBsaWVzIGZsZXhib3ggZm9yIGJsb2NrIGVsZW1lbnRzLiBganVzdGlmeS1jb250ZW50YCBDU1MgcnVsZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgaG9yaXpvbnRhbCBhbGlnbi5bL2VuXVxuICogICBbamFd44OE44O844Or44OQ44O844Gu6IOM5pmv44KS6YCP5piO44Gr44GX44Gm6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10b29sYmFyIFtlbl1vbnMtdG9vbGJhciBjb21wb25lbnRbL2VuXVtqYV1vbnMtdG9vbGJhcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1ib3R0b20tdG9vbGJhcj5cbiAqICAgQ29udGVudFxuICogPC9vbnMtYm90dG9tLXRvb2xiYXI+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvdHRvbVRvb2xiYXJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHRvb2xiYXIuWy9lbl1cbiAgICogICBbamFd44OE44O844Or44OQ44O844Gu6KaL44Gf55uu44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxufVxuXG5vbnNFbGVtZW50cy5Cb3R0b21Ub29sYmFyID0gQm90dG9tVG9vbGJhckVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1ib3R0b20tdG9vbGJhcicsIEJvdHRvbVRvb2xiYXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VCdXR0b25FbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWJ1dHRvbi5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWJ1dHRvblxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBtb2RpZmllciBvdXRsaW5lXG4gKiAgIFtlbl1CdXR0b24gd2l0aCBvdXRsaW5lIGFuZCB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kWy9lbl1cbiAqICAgW2phXeOCouOCpuODiOODqeOCpOODs+OCkuaMgeOBo+OBn+ODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbGlnaHRcbiAqICAgW2VuXUJ1dHRvbiB0aGF0IGRvZXNuJ3Qgc3RhbmQgb3V0LlsvZW5dXG4gKiAgIFtqYV3nm67nq4vjgZ/jgarjgYTjg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIHF1aWV0XG4gKiAgIFtlbl1CdXR0b24gd2l0aCBubyBvdXRsaW5lIGFuZCBvciBiYWNrZ3JvdW5kLi5bL2VuXVxuICogICBbamFd5p6g57ea44KE6IOM5pmv44GM54Sh44GE5paH5a2X44Gg44GR44Gu44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBjdGFcbiAqICAgW2VuXUJ1dHRvbiB0aGF0IHJlYWxseSBzdGFuZHMgb3V0LlsvZW5dXG4gKiAgIFtqYV3nm67nq4vjgaTjg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIGxhcmdlXG4gKiAgIFtlbl1MYXJnZSBidXR0b24gdGhhdCBjb3ZlcnMgdGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4uWy9lbl1cbiAqICAgW2phXeaoquOBhOOBo+OBseOBhOOBq+W6g+OBjOOCi+Wkp+OBjeOBquODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbGFyZ2UtLXF1aWV0XG4gKiAgIFtlbl1MYXJnZSBxdWlldCBidXR0b24uWy9lbl1cbiAqICAgW2phXeaoquOBhOOBo+OBseOBhOOBq+W6g+OBjOOCi3F1aWV044Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBsYXJnZS0tY3RhXG4gKiAgIFtlbl1MYXJnZSBjYWxsIHRvIGFjdGlvbiBidXR0b24uWy9lbl1cbiAqICAgW2phXeaoquOBhOOBo+OBseOBhOOBq+W6g+OBjOOCi2N0YeODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiBidXR0b25bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44Oc44K/44OzWy9qYV1cbiAqIEBtb2RpZmllciBtYXRlcmlhbC0tZmxhdFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIGZsYXQgYnV0dG9uWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruODleODqeODg+ODiOODnOOCv+ODs1svamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEJ1dHRvbiBjb21wb25lbnQuIElmIHlvdSB3YW50IHRvIHBsYWNlIGEgYnV0dG9uIGluIGEgdG9vbGJhciwgdXNlIGA8b25zLXRvb2xiYXItYnV0dG9uPmAgb3IgYDxvbnMtYmFjay1idXR0b24+YCBpbnN0ZWFkLlxuICpcbiAqICAgICBXaWxsIGF1dG9tYXRpY2FsbHkgZGlzcGxheSBhcyBhIE1hdGVyaWFsIERlc2lnbiBidXR0b24gd2l0aCBhIHJpcHBsZSBlZmZlY3Qgb24gQW5kcm9pZC5cbiAqICAgWy9lbl1cbiAqICAgW2phXeODnOOCv+ODs+eUqOOCs+ODs+ODneODvOODjeODs+ODiOOAguODhOODvOODq+ODkOODvOOBq+ODnOOCv+ODs+OCkuioree9ruOBmeOCi+WgtOWQiOOBr+OAgW9ucy10b29sYmFyLWJ1dHRvbuOCguOBl+OBj+OBr29ucy1iYWNrLWJ1dHRvbuOCs+ODs+ODneODvOODjeODs+ODiOOCkuS9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBoTGF5eFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2J1dHRvblxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWJ1dHRvbiBtb2RpZmllcj1cImxhcmdlLS1jdGFcIj5cbiAqICAgVGFwIE1lXG4gKiA8L29ucy1idXR0b24+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uRWxlbWVudCBleHRlbmRzIEJhc2VCdXR0b25FbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgYnV0dG9uLlsvZW5dXG4gICAqICBbamFd44Oc44K/44Oz44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcmlwcGxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIGRlZmluZWQsIHRoZSBidXR0b24gd2lsbCBoYXZlIGEgcmlwcGxlIGVmZmVjdC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcmlwcGxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1XaGV0aGVyIHRoZSBidXR0b24gaGFzIGEgcmlwcGxlIGVmZmVjdCBvciBub3QuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OCkueEoeWKueWMluOBmeOCi+WgtOWQiOOBr+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiB7ICcnOiAnYnV0dG9uLS0qJyB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnYnV0dG9uJztcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5CdXR0b24gPSBCdXR0b25FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYnV0dG9uJywgQnV0dG9uRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2NhcmQnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ2NhcmQtLSonLFxuICAnLmNhcmRfX3RpdGxlJzogJ2NhcmQtLSpfX3RpdGxlJyxcbiAgJy5jYXJkX19jb250ZW50JzogJ2NhcmQtLSpfX2NvbnRlbnQnXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1jYXJkXG4gKiBAY2F0ZWdvcnkgdmlzdWFsXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXUEgY2FyZCB3aXRoIG1hdGVyaWFsIGRlc2lnbi5bL2VuXVxuICogICBbamFd44Oq44K544OI44Gu5LiK5LiL44Gu44Oc44O844OA44O844GM54Sh44GE44Oq44K544OI44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICBDb21wb25lbnQgdG8gY3JlYXRlIGEgY2FyZCB0aGF0IGRpc3BsYXlzIHNvbWUgaW5mb3JtYXRpb24uXG4gKlxuICogICAgVGhlIGNhcmQgbWF5IGJlIGNvbXBvc2VkIGJ5IGRpdnMgd2l0aCBzcGVjaWFsbHkgcHJlcGFyZWQgY2xhc3NlcyBgdGl0bGVgIGFuZC9vciBgY29udGVudGAuIFlvdSBjYW4gYWxzbyBhZGQgeW91ciBvd24gY29udGVudCBhcyB5b3UgcGxlYXNlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2NhcmRcbiAqIEBleGFtcGxlXG4gKiA8b25zLWNhcmQ+XG4gKiAgIDxwPlNvbWUgY29udGVudDwvcD5cbiAqIDwvb25zLWNhcmQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcmRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgY2FyZC5bL2VuXVxuICAgKiAgIFtqYV3jg6rjgrnjg4jjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGxldCB0aXRsZSwgY29udGVudDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLmNoaWxkcmVuW2ldO1xuXG4gICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd0aXRsZScpKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NhcmRfX3RpdGxlJyk7XG4gICAgICAgIHRpdGxlID0gZWw7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRlbnQnKSkge1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdjYXJkX19jb250ZW50Jyk7XG4gICAgICAgIGNvbnRlbnQgPSBlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkNhcmQgPSBDYXJkRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWNhcmQnLCBDYXJkRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuY29uc3Qgc2NoZW1lID0geycnOiAnY2Fyb3VzZWwtaXRlbS0tKid9O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1jYXJvdXNlbC1pdGVtXG4gKiBAY2F0ZWdvcnkgY2Fyb3VzZWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ2Fyb3VzZWwgaXRlbSBjb21wb25lbnQuIFVzZWQgYXMgYSBjaGlsZCBvZiB0aGUgYDxvbnMtY2Fyb3VzZWw+YCBlbGVtZW50LlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHhiYnpPUVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2Nhcm91c2VsXG4gKiBAc2VlYWxzbyBvbnMtY2Fyb3VzZWxcbiAqICAgW2VuXWA8b25zLWNhcm91c2VsPmAgY29tcG9uZW50c1svZW5dXG4gKiAgIFtqYV08b25zLWNhcm91c2VsPuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1jYXJvdXNlbCBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDIwMHB4XCI+XG4gKiAgIDxvbnMtY2Fyb3VzZWwtaXRlbT5cbiAqICAgIC4uLlxuICogICA8L29ucy1jYXJvdXNlbC1pdGVtPlxuICogICA8b25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgICAuLi5cbiAqICAgPC9vbnMtY2Fyb3VzZWwtaXRlbT5cbiAqIDwvb25zLWNhcm91c2VsPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJvdXNlbEl0ZW1FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkNhcm91c2VsSXRlbSA9IENhcm91c2VsSXRlbUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1jYXJvdXNlbC1pdGVtJywgQ2Fyb3VzZWxJdGVtRWxlbWVudCk7XG4iLCJpbXBvcnQgdXRpbCBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uL2FuaW1pdC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4uL2dlc3R1cmUtZGV0ZWN0b3IuanMnO1xuXG5jb25zdCBkaXJlY3Rpb25NYXAgPSB7XG4gIHZlcnRpY2FsOiB7XG4gICAgYXhpczogJ1knLFxuICAgIHNpemU6ICdIZWlnaHQnLFxuICAgIGRpcjogWyd1cCcsICdkb3duJ10sXG4gICAgdDNkOiBbJzBweCwgJywgJ3B4LCAwcHgnXVxuICB9LFxuICBob3Jpem9udGFsOiB7XG4gICAgYXhpczogJ1gnLFxuICAgIHNpemU6ICdXaWR0aCcsXG4gICAgZGlyOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICB0M2Q6IFsnJywgJ3B4LCAwcHgsIDBweCddXG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXBlciB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIC8vIFBhcmFtZXRlcnNcbiAgICBjb25zdCBGQUxTRSA9ICgoKSA9PiBmYWxzZSk7XG4gICAgYGdldEluaXRpYWxJbmRleCBnZXRCdWJibGVXaWR0aCBpc1ZlcnRpY2FsIGlzT3ZlclNjcm9sbGFibGUgaXNDZW50ZXJlZFxuICAgIGlzQXV0b1Njcm9sbGFibGUgcmVmcmVzaEhvb2sgcHJlQ2hhbmdlSG9vayBwb3N0Q2hhbmdlSG9vayBvdmVyU2Nyb2xsSG9va2BcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuZm9yRWFjaChrZXkgPT4gdGhpc1trZXldID0gcGFyYW1zW2tleV0gfHwgRkFMU0UpO1xuXG4gICAgdGhpcy5nZXRFbGVtZW50ID0gcGFyYW1zLmdldEVsZW1lbnQ7IC8vIFJlcXVpcmVkXG4gICAgdGhpcy5zY3JvbGxIb29rID0gcGFyYW1zLnNjcm9sbEhvb2s7IC8vIE9wdGlvbmFsXG4gICAgdGhpcy5pdGVtU2l6ZSA9IHBhcmFtcy5pdGVtU2l6ZSB8fCAnMTAwJSc7XG5cbiAgICB0aGlzLmdldEF1dG9TY3JvbGxSYXRpbyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBsZXQgcmF0aW8gPSBwYXJhbXMuZ2V0QXV0b1Njcm9sbFJhdGlvICYmIHBhcmFtcy5nZXRBdXRvU2Nyb2xsUmF0aW8oLi4uYXJncyk7XG4gICAgICByYXRpbyA9IHR5cGVvZiByYXRpbyA9PT0gJ251bWJlcicgJiYgcmF0aW8gPT09IHJhdGlvID8gcmF0aW8gOiAuNTtcbiAgICAgIGlmIChyYXRpbyA8IDAuMCB8fCByYXRpbyA+IDEuMCkge1xuICAgICAgICB1dGlsLnRocm93KCdJbnZhbGlkIGF1dG8tc2Nyb2xsLXJhdGlvICcgKyByYXRpbyArICcuIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAxJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0aW87XG4gICAgfTtcblxuICAgIC8vIFByZXZlbnQgY2xpY2tzIG9ubHkgb24gZGVza3RvcFxuICAgIHRoaXMuc2hvdWxkQmxvY2sgPSB1dGlsLmdsb2JhbHMuYWN0dWFsTW9iaWxlT1MgPT09ICdvdGhlcic7XG5cbiAgICAvLyBCaW5kIGhhbmRsZXJzXG4gICAgdGhpcy5vbkRyYWdTdGFydCA9IHRoaXMub25EcmFnU3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZyA9IHRoaXMub25EcmFnLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdFbmQgPSB0aGlzLm9uRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25SZXNpemUgPSB0aGlzLm9uUmVzaXplLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9zaG91bGRGaXhTY3JvbGwgPSB1dGlsLmdsb2JhbHMuYWN0dWFsTW9iaWxlT1MgPT09ICdpb3MnO1xuICB9XG5cbiAgaW5pdCh7IHN3aXBlYWJsZSwgYXV0b1JlZnJlc2ggfSA9IHt9KSB7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy50YXJnZXQgPSB0aGlzLmdldEVsZW1lbnQoKS5jaGlsZHJlblswXTtcbiAgICB0aGlzLmJsb2NrZXIgPSB0aGlzLmdldEVsZW1lbnQoKS5jaGlsZHJlblsxXTtcbiAgICBpZiAoIXRoaXMudGFyZ2V0IHx8ICF0aGlzLmJsb2NrZXIpIHtcbiAgICAgIHV0aWwudGhyb3coJ0V4cGVjdGVkIFwidGFyZ2V0XCIgYW5kIFwiYmxvY2tlclwiIGVsZW1lbnRzIHRvIGV4aXN0IGJlZm9yZSBpbml0aWFsaXppbmcgU3dpcGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNob3VsZEJsb2NrKSB7XG4gICAgICB0aGlzLmJsb2NrZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBBZGQgY2xhc3Nlc1xuICAgIHRoaXMuZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoJ29ucy1zd2lwZXInKTtcbiAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QuYWRkKCdvbnMtc3dpcGVyLXRhcmdldCcpO1xuICAgIHRoaXMuYmxvY2tlci5jbGFzc0xpc3QuYWRkKCdvbnMtc3dpcGVyLWJsb2NrZXInKTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVyc1xuICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcy5nZXRFbGVtZW50KCksXG4gICAgICB7IGRyYWdNaW5EaXN0YW5jZTogMSwgZHJhZ0xvY2tUb0F4aXM6IHRydWUsIHBhc3NpdmU6ICF0aGlzLl9zaG91bGRGaXhTY3JvbGwgfVxuICAgICk7XG4gICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHRoaXMucmVmcmVzaCgpKTtcbiAgICB0aGlzLnVwZGF0ZVN3aXBlYWJsZShzd2lwZWFibGUpO1xuICAgIHRoaXMudXBkYXRlQXV0b1JlZnJlc2goYXV0b1JlZnJlc2gpO1xuXG4gICAgLy8gU2V0dXAgaW5pdGlhbCBsYXlvdXRcbiAgICB0aGlzLl9zY3JvbGwgPSB0aGlzLl9vZmZzZXQgPSB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSAwO1xuICAgIHRoaXMuX3VwZGF0ZUxheW91dCgpO1xuICAgIHRoaXMuX3NldHVwSW5pdGlhbEluZGV4KCk7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy5fc2V0dXBJbml0aWFsSW5kZXgoKSk7XG5cbiAgICAvLyBGaXggcmVuZGVyaW5nIGdsaXRjaCBvbiBBbmRyb2lkIDQuMVxuICAgIC8vIEZpeCBmb3IgaWZyYW1lcyB3aGVyZSB0aGUgd2lkdGggaXMgaW5jb25zaXN0ZW50IGF0IHRoZSBiZWdpbm5pbmdcbiAgICBpZiAod2luZG93ICE9PSB3aW5kb3cucGFyZW50IHx8IHRoaXMub2Zmc2V0SGVpZ2h0ID09PSAwKSB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy5vblJlc2l6ZSgpKTtcbiAgICB9XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVN3aXBlYWJsZShmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVBdXRvUmVmcmVzaChmYWxzZSk7XG5cbiAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgJiYgdGhpcy5fZ2VzdHVyZURldGVjdG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnRhcmdldCA9IHRoaXMuYmxvY2tlciA9IHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IHRoaXMuX211dGF0aW9uT2JzZXJ2ZXIgPSBudWxsO1xuXG4gICAgdGhpcy5zZXR1cFJlc2l6ZShmYWxzZSk7XG4gIH1cblxuICBvblJlc2l6ZSgpIHtcbiAgICBjb25zdCBpID0gdGhpcy5fc2Nyb2xsIC8gdGhpcy5pdGVtTnVtU2l6ZTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIHRoaXMuc2V0QWN0aXZlSW5kZXgoaSk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBnZXQgaXRlbUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRhcmdldC5jaGlsZHJlbi5sZW5ndGg7XG4gIH1cblxuICBnZXQgaXRlbU51bVNpemUoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9pdGVtTnVtU2l6ZSAhPT0gJ251bWJlcicgfHwgdGhpcy5faXRlbU51bVNpemUgIT09IHRoaXMuX2l0ZW1OdW1TaXplKSB7XG4gICAgICB0aGlzLl9pdGVtTnVtU2l6ZSA9IHRoaXMuX2NhbGN1bGF0ZUl0ZW1TaXplKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pdGVtTnVtU2l6ZTtcbiAgfVxuXG4gIGdldCBtYXhTY3JvbGwoKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5pdGVtQ291bnQgKiB0aGlzLml0ZW1OdW1TaXplIC0gdGhpcy50YXJnZXRTaXplO1xuICAgIHJldHVybiBNYXRoLmNlaWwobWF4IDwgMCA/IDAgOiBtYXgpOyAvLyBOZWVkIHRvIHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlLlxuICB9XG5cbiAgX2NhbGN1bGF0ZUl0ZW1TaXplKCkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLml0ZW1TaXplLm1hdGNoKC9eKFxcZCspKHB4fCUpLyk7XG5cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHV0aWwudGhyb3coYEludmFsaWQgc3RhdGU6IHN3aXBlcidzIHNpemUgdW5pdCBtdXN0IGJlICclJyBvciAncHgnYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7XG4gICAgcmV0dXJuIG1hdGNoZXNbMl0gPT09ICclJyA/IE1hdGgucm91bmQodmFsdWUgLyAxMDAgKiB0aGlzLnRhcmdldFNpemUpIDogdmFsdWU7XG4gIH1cblxuICBfc2V0dXBJbml0aWFsSW5kZXgoKSB7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgICB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSBNYXRoLm1heChNYXRoLm1pbihOdW1iZXIodGhpcy5nZXRJbml0aWFsSW5kZXgoKSksIHRoaXMuaXRlbUNvdW50KSwgMCk7XG4gICAgdGhpcy5fc2Nyb2xsID0gdGhpcy5fb2Zmc2V0ICsgdGhpcy5pdGVtTnVtU2l6ZSAqIHRoaXMuX2xhc3RBY3RpdmVJbmRleDtcbiAgICB0aGlzLl9zY3JvbGxUbyh0aGlzLl9zY3JvbGwpO1xuICB9XG5cbiAgX3NldFN3aXBpbmcodG9nZ2xlKSB7XG4gICAgdGhpcy50YXJnZXQuY2xhc3NMaXN0LnRvZ2dsZSgnc3dpcGluZycsIHRvZ2dsZSk7IC8vIEhpZGVzIGV2ZXJ5dGhpbmcgZXhjZXB0IHNob3duIHBhZ2VzXG4gIH1cblxuICBzZXRBY3RpdmVJbmRleChpbmRleCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5fc2V0U3dpcGluZyh0cnVlKTtcbiAgICBpbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCB0aGlzLml0ZW1Db3VudCAtIDEpKTtcbiAgICBjb25zdCBzY3JvbGwgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLm1heFNjcm9sbCwgdGhpcy5fb2Zmc2V0ICsgdGhpcy5pdGVtTnVtU2l6ZSAqIGluZGV4KSk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlVG8oc2Nyb2xsLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldEFjdGl2ZUluZGV4KHNjcm9sbCA9IHRoaXMuX3Njcm9sbCkge1xuICAgIHNjcm9sbCAtPSB0aGlzLl9vZmZzZXQ7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLml0ZW1Db3VudCxcbiAgICAgIHNpemUgPSB0aGlzLml0ZW1OdW1TaXplO1xuXG4gICAgaWYgKHRoaXMuaXRlbU51bVNpemUgPT09IDAgfHwgIXV0aWwuaXNJbnRlZ2VyKHNjcm9sbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXN0QWN0aXZlSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbCA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGlmIChzaXplICogaSA8PSBzY3JvbGwgJiYgc2l6ZSAqIChpICsgMSkgPiBzY3JvbGwpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50IC0gMTtcbiAgfVxuXG4gIHNldHVwUmVzaXplKGFkZCkge1xuICAgIHdpbmRvd1soYWRkID8gJ2FkZCcgOiAncmVtb3ZlJykgKyAnRXZlbnRMaXN0ZW5lciddKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplLCB0cnVlKTtcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZSh0cnVlKTtcbiAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhcmdldCAmJiB0aGlzLnRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKSwgMTAwMC82MCk7IC8vIEhpZGUgZWxlbWVudHMgYWZ0ZXIgYW5pbWF0aW9uc1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLnNldHVwUmVzaXplKGZhbHNlKTtcbiAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsgLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW9uc1xuICB9XG5cbiAgdXBkYXRlU3dpcGVhYmxlKHNob3VsZFVwZGF0ZSkge1xuICAgIGlmICh0aGlzLl9nZXN0dXJlRGV0ZWN0b3IpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHNob3VsZFVwZGF0ZSA/ICdvbicgOiAnb2ZmJztcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvclthY3Rpb25dKCdkcmFnJywgdGhpcy5vbkRyYWcpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWdzdGFydCcsIHRoaXMub25EcmFnU3RhcnQpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWdlbmQnLCB0aGlzLm9uRHJhZ0VuZCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQXV0b1JlZnJlc2goc2hvdWxkV2F0Y2gpIHtcbiAgICBpZiAodGhpcy5fbXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgc2hvdWxkV2F0Y2hcbiAgICAgICAgPyB0aGlzLl9tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy50YXJnZXQsIHsgY2hpbGRMaXN0OiB0cnVlIH0pXG4gICAgICAgIDogdGhpcy5fbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSXRlbVNpemUobmV3U2l6ZSkge1xuICAgIHRoaXMuaXRlbVNpemUgPSBuZXdTaXplIHx8ICcxMDAlJztcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHRvZ2dsZUJsb2NrZXIoYmxvY2spIHtcbiAgICB0aGlzLmJsb2NrZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9IGJsb2NrID8gJ2F1dG8nIDogJ25vbmUnO1xuICB9XG5cbiAgX2NhbkNvbnN1bWVHZXN0dXJlKGdlc3R1cmUpIHtcbiAgICBjb25zdCBkID0gZ2VzdHVyZS5kaXJlY3Rpb247XG4gICAgY29uc3QgaXNGaXJzdCA9IHRoaXMuX3Njcm9sbCA9PT0gMCAmJiAhdGhpcy5pc092ZXJTY3JvbGxhYmxlKCk7XG4gICAgY29uc3QgaXNMYXN0ID0gdGhpcy5fc2Nyb2xsID09PSB0aGlzLm1heFNjcm9sbCAmJiAhdGhpcy5pc092ZXJTY3JvbGxhYmxlKCk7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZlcnRpY2FsKClcbiAgICAgID8gKChkID09PSAnZG93bicgJiYgIWlzRmlyc3QpIHx8IChkID09PSAndXAnICYmICFpc0xhc3QpKVxuICAgICAgOiAoKGQgPT09ICdyaWdodCcgJiYgIWlzRmlyc3QpIHx8IChkID09PSAnbGVmdCcgJiYgIWlzTGFzdCkpO1xuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZlbnQpIHtcbiAgICB0aGlzLl9pZ25vcmVEcmFnID0gZXZlbnQuY29uc3VtZWQgfHwgIXV0aWwuaXNWYWxpZEdlc3R1cmUoZXZlbnQpO1xuXG4gICAgaWYgKCF0aGlzLl9pZ25vcmVEcmFnKSB7XG4gICAgICBjb25zdCBjb25zdW1lID0gZXZlbnQuY29uc3VtZTtcbiAgICAgIGV2ZW50LmNvbnN1bWUgPSAoKSA9PiB7IGNvbnN1bWUgJiYgY29uc3VtZSgpOyB0aGlzLl9pZ25vcmVEcmFnID0gdHJ1ZTsgfTtcblxuICAgICAgaWYgKHRoaXMuX2NhbkNvbnN1bWVHZXN0dXJlKGV2ZW50Lmdlc3R1cmUpKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0WCA9IGV2ZW50Lmdlc3R1cmUuY2VudGVyICYmIGV2ZW50Lmdlc3R1cmUuY2VudGVyLmNsaWVudFggfHwgMCxcbiAgICAgICAgICBkaXN0RnJvbUVkZ2UgPSB0aGlzLmdldEJ1YmJsZVdpZHRoKCkgfHwgMCxcbiAgICAgICAgICBzdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN1bWUgJiYgY29uc3VtZSgpO1xuICAgICAgICAgICAgZXZlbnQuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7IC8vIEF2b2lkIHN0YXJ0aW5nIGRyYWcgZnJvbSBvdXRzaWRlXG4gICAgICAgICAgICB0aGlzLnNob3VsZEJsb2NrICYmIHRoaXMudG9nZ2xlQmxvY2tlcih0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX3NldFN3aXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICB1dGlsLmlvc1ByZXZlbnRTY3JvbGwodGhpcy5fZ2VzdHVyZURldGVjdG9yKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgIC8vIExldCBwYXJlbnQgZWxlbWVudHMgY29uc3VtZSB0aGUgZ2VzdHVyZSBvciBjb25zdW1lIGl0IHJpZ2h0IGF3YXlcbiAgICAgICAgc3RhcnRYIDwgZGlzdEZyb21FZGdlIHx8IHN0YXJ0WCA+ICh0aGlzLnRhcmdldFNpemUgLSBkaXN0RnJvbUVkZ2UpXG4gICAgICAgICAgPyBzZXRJbW1lZGlhdGUoKCkgPT4gIXRoaXMuX2lnbm9yZURyYWcgJiYgc3RhcnQoKSlcbiAgICAgICAgICA6IHN0YXJ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25EcmFnKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5nZXN0dXJlIHx8IHRoaXMuX2lnbm9yZURyYWcgfHwgIXRoaXMuX3N0YXJ0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250aW51ZWQgPSB0cnVlOyAvLyBGaXggZm9yIHJhbmRvbSAnZHJhZ2VuZCcgd2l0aG91dCAnZHJhZydcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuX3Njcm9sbFRvKHRoaXMuX3Njcm9sbCAtIHRoaXMuX2dldERlbHRhKGV2ZW50KSwgeyB0aHJvdHRsZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIG9uRHJhZ0VuZChldmVudCkge1xuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBpZiAoIWV2ZW50Lmdlc3R1cmUgfHwgdGhpcy5faWdub3JlRHJhZyB8fCAhdGhpcy5fY29udGludWVkKSB7XG4gICAgICB0aGlzLl9pZ25vcmVEcmFnID0gdHJ1ZTsgLy8gb25EcmFnRW5kIG1pZ2h0IGZpcmUgYmVmb3JlIG9uRHJhZ1N0YXJ0J3Mgc2V0SW1tZWRpYXRlXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29udGludWVkID0gZmFsc2U7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBzY3JvbGwgPSB0aGlzLl9zY3JvbGwgLSB0aGlzLl9nZXREZWx0YShldmVudCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcm9sbCA9IHRoaXMuX25vcm1hbGl6ZVNjcm9sbChzY3JvbGwpO1xuICAgIHNjcm9sbCA9PT0gbm9ybWFsaXplZFNjcm9sbCA/IHRoaXMuX3N0YXJ0TW9tZW50dW1TY3JvbGwoc2Nyb2xsLCBldmVudCkgOiB0aGlzLl9raWxsT3ZlclNjcm9sbChub3JtYWxpemVkU2Nyb2xsKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrICYmIHRoaXMudG9nZ2xlQmxvY2tlcihmYWxzZSk7XG4gIH1cblxuICBfc3RhcnRNb21lbnR1bVNjcm9sbChzY3JvbGwsIGV2ZW50KSB7XG4gICAgY29uc3QgdmVsb2NpdHkgPSB0aGlzLl9nZXRWZWxvY2l0eShldmVudCksXG4gICAgICBtYXRjaGVzRGlyZWN0aW9uID0gZXZlbnQuZ2VzdHVyZS5pbnRlcmltRGlyZWN0aW9uID09PSB0aGlzLmRNLmRpclt0aGlzLl9nZXREZWx0YShldmVudCkgPCAwID8gMCA6IDFdO1xuXG4gICAgY29uc3QgbmV4dFNjcm9sbCA9IHRoaXMuX2dldEF1dG9TY3JvbGwoc2Nyb2xsLCB2ZWxvY2l0eSwgbWF0Y2hlc0RpcmVjdGlvbik7XG4gICAgbGV0IGR1cmF0aW9uID0gTWF0aC5hYnMobmV4dFNjcm9sbCAtIHNjcm9sbCkgLyAodmVsb2NpdHkgKyAwLjAxKSAvIDEwMDA7XG4gICAgZHVyYXRpb24gPSBNYXRoLm1pbiguMjUsIE1hdGgubWF4KC4xLCBkdXJhdGlvbikpO1xuXG4gICAgdGhpcy5fY2hhbmdlVG8obmV4dFNjcm9sbCwgeyBzd2lwZTogdHJ1ZSwgYW5pbWF0aW9uT3B0aW9uczogeyBkdXJhdGlvbiwgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC40LCAuNywgLjUsIDEpJyB9IH0pO1xuICB9XG5cbiAgX2tpbGxPdmVyU2Nyb2xsKHNjcm9sbCkge1xuICAgIHRoaXMuX3Njcm9sbCA9IHNjcm9sbDtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmRNLmRpcltOdW1iZXIoc2Nyb2xsID4gMCldO1xuICAgIGNvbnN0IGtpbGxPdmVyU2Nyb2xsID0gKCkgPT4gdGhpcy5fY2hhbmdlVG8oc2Nyb2xsLCB7IGFuaW1hdGlvbk9wdGlvbnM6IHsgZHVyYXRpb246IC40LCB0aW1pbmc6ICdjdWJpYy1iZXppZXIoLjEsIC40LCAuMSwgMSknIH0gfSk7XG4gICAgdGhpcy5vdmVyU2Nyb2xsSG9vayh7IGRpcmVjdGlvbiwga2lsbE92ZXJTY3JvbGwgfSkgfHwga2lsbE92ZXJTY3JvbGwoKTtcbiAgfVxuXG4gIF9jaGFuZ2VUbyhzY3JvbGwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGUgPSB7IGFjdGl2ZUluZGV4OiB0aGlzLmdldEFjdGl2ZUluZGV4KHNjcm9sbCksIGxhc3RBY3RpdmVJbmRleDogdGhpcy5fbGFzdEFjdGl2ZUluZGV4LCBzd2lwZTogb3B0aW9ucy5zd2lwZSB8fCBmYWxzZSB9O1xuICAgIGNvbnN0IGNoYW5nZSA9IGUuYWN0aXZlSW5kZXggIT09IGUubGFzdEFjdGl2ZUluZGV4O1xuICAgIGNvbnN0IGNhbmNlbGVkID0gY2hhbmdlID8gdGhpcy5wcmVDaGFuZ2VIb29rKGUpIDogZmFsc2U7XG5cbiAgICB0aGlzLl9zY3JvbGwgPSBjYW5jZWxlZCA/IHRoaXMuX29mZnNldCArIGUubGFzdEFjdGl2ZUluZGV4ICogdGhpcy5pdGVtTnVtU2l6ZSA6IHNjcm9sbDtcbiAgICB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSBjYW5jZWxlZCA/IGUubGFzdEFjdGl2ZUluZGV4IDogZS5hY3RpdmVJbmRleDtcblxuICAgIHJldHVybiB0aGlzLl9zY3JvbGxUbyh0aGlzLl9zY3JvbGwsIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHNjcm9sbCA9PT0gdGhpcy5fc2Nyb2xsICYmICFjYW5jZWxlZCkge1xuICAgICAgICB0aGlzLl9zZXRTd2lwaW5nKGZhbHNlKTtcbiAgICAgICAgY2hhbmdlICYmIHRoaXMucG9zdENoYW5nZUhvb2soZSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMucmVqZWN0KSB7XG4gICAgICAgIHRoaXMuX3NldFN3aXBpbmcoZmFsc2UpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NhbmNlbGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfc2Nyb2xsVG8oc2Nyb2xsLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy50aHJvdHRsZSkge1xuICAgICAgY29uc3QgcmF0aW8gPSAwLjM1O1xuICAgICAgaWYgKHNjcm9sbCA8IDApIHtcbiAgICAgICAgc2Nyb2xsID0gdGhpcy5pc092ZXJTY3JvbGxhYmxlKCkgPyBNYXRoLnJvdW5kKHNjcm9sbCAqIHJhdGlvKSA6IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB0aGlzLm1heFNjcm9sbDtcbiAgICAgICAgaWYgKG1heFNjcm9sbCA8IHNjcm9sbCkge1xuICAgICAgICAgIHNjcm9sbCA9IHRoaXMuaXNPdmVyU2Nyb2xsYWJsZSgpID8gbWF4U2Nyb2xsICsgTWF0aC5yb3VuZCgoc2Nyb2xsIC0gbWF4U2Nyb2xsKSAqIHJhdGlvKSA6IG1heFNjcm9sbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9wdCA9IG9wdGlvbnMuYW5pbWF0aW9uICA9PT0gJ25vbmUnID8ge30gOiBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnM7XG4gICAgdGhpcy5zY3JvbGxIb29rICYmIHRoaXMuaXRlbU51bVNpemUgPiAwICYmIHRoaXMuc2Nyb2xsSG9vaygoc2Nyb2xsIC8gdGhpcy5pdGVtTnVtU2l6ZSkudG9GaXhlZCgyKSwgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zIHx8IHt9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+XG4gICAgICBhbmltaXQodGhpcy50YXJnZXQpXG4gICAgICAgIC5xdWV1ZSh7IHRyYW5zZm9ybTogdGhpcy5fZ2V0VHJhbnNmb3JtKHNjcm9sbCkgfSwgb3B0KVxuICAgICAgICAucGxheShyZXNvbHZlKVxuICAgICk7XG4gIH1cblxuICBfZ2V0QXV0b1Njcm9sbChzY3JvbGwsIHZlbG9jaXR5LCBtYXRjaGVzRGlyZWN0aW9uKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXhTY3JvbGwsXG4gICAgICBvZmZzZXQgPSB0aGlzLl9vZmZzZXQsXG4gICAgICBzaXplID0gdGhpcy5pdGVtTnVtU2l6ZTtcblxuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHNjcm9sbCkpO1xuICAgIH1cblxuICAgIGxldCBhcnIgPSBbXTtcbiAgICBmb3IgKGxldCBzID0gb2Zmc2V0OyBzIDwgbWF4OyBzICs9IHNpemUpIHtcbiAgICAgIGFyci5wdXNoKHMpO1xuICAgIH1cbiAgICBhcnIucHVzaChtYXgpO1xuXG4gICAgYXJyID0gYXJyXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IE1hdGguYWJzKGxlZnQgLSBzY3JvbGwpIC0gTWF0aC5hYnMocmlnaHQgLSBzY3JvbGwpKVxuICAgICAgLmZpbHRlcigoaXRlbSwgcG9zKSA9PiAhcG9zIHx8IGl0ZW0gIT09IGFycltwb3MgLSAxXSk7XG5cbiAgICBsZXQgcmVzdWx0ID0gYXJyWzBdO1xuICAgIGNvbnN0IGxhc3RTY3JvbGwgPSB0aGlzLl9sYXN0QWN0aXZlSW5kZXggKiBzaXplICsgb2Zmc2V0O1xuICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gTWF0aC5hYnMoc2Nyb2xsIC0gbGFzdFNjcm9sbCkgLyBzaXplO1xuXG4gICAgaWYgKHNjcm9sbFJhdGlvIDw9IHRoaXMuZ2V0QXV0b1Njcm9sbFJhdGlvKG1hdGNoZXNEaXJlY3Rpb24sIHZlbG9jaXR5LCBzaXplKSkge1xuICAgICAgcmVzdWx0ID0gbGFzdFNjcm9sbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNjcm9sbFJhdGlvIDwgMS4wICYmIGFyclswXSA9PT0gbGFzdFNjcm9sbCAmJiBhcnIubGVuZ3RoID4gMSkge1xuICAgICAgICByZXN1bHQgPSBhcnJbMV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHJlc3VsdCkpO1xuICB9XG5cbiAgX3Jlc2V0KCkge1xuICAgIHRoaXMuX3RhcmdldFNpemUgPSB0aGlzLl9pdGVtTnVtU2l6ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIF9ub3JtYWxpemVTY3JvbGwoc2Nyb2xsKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KCBNYXRoLm1pbihzY3JvbGwsIHRoaXMubWF4U2Nyb2xsKSwgMCk7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgdGhpcy5fdXBkYXRlTGF5b3V0KCk7XG5cbiAgICBpZiAodXRpbC5pc0ludGVnZXIodGhpcy5fc2Nyb2xsKSkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gdGhpcy5fbm9ybWFsaXplU2Nyb2xsKHRoaXMuX3Njcm9sbCk7XG4gICAgICBzY3JvbGwgIT09IHRoaXMuX3Njcm9sbCA/IHRoaXMuX2tpbGxPdmVyU2Nyb2xsKHNjcm9sbCkgOiB0aGlzLl9jaGFuZ2VUbyhzY3JvbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXR1cEluaXRpYWxJbmRleCgpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaEhvb2soKTtcbiAgfVxuXG4gIGdldCB0YXJnZXRTaXplKCkge1xuICAgIGlmICghdGhpcy5fdGFyZ2V0U2l6ZSkge1xuICAgICAgdGhpcy5fdGFyZ2V0U2l6ZSA9IHRoaXMudGFyZ2V0W2BvZmZzZXQke3RoaXMuZE0uc2l6ZX1gXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldFNpemU7XG4gIH1cblxuICBfZ2V0RGVsdGEoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQuZ2VzdHVyZVtgZGVsdGEke3RoaXMuZE0uYXhpc31gXTtcbiAgfVxuXG4gIF9nZXRWZWxvY2l0eShldmVudCkge1xuICAgIHJldHVybiBldmVudC5nZXN0dXJlW2B2ZWxvY2l0eSR7dGhpcy5kTS5heGlzfWBdO1xuICB9XG5cbiAgX2dldFRyYW5zZm9ybShzY3JvbGwpIHtcbiAgICByZXR1cm4gYHRyYW5zbGF0ZTNkKCR7dGhpcy5kTS50M2RbMF19JHstc2Nyb2xsfSR7dGhpcy5kTS50M2RbMV19KWA7XG4gIH1cblxuICBfdXBkYXRlTGF5b3V0KCkge1xuICAgIHRoaXMuZE0gPSBkaXJlY3Rpb25NYXBbdGhpcy5pc1ZlcnRpY2FsKCkgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnXTtcbiAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QudG9nZ2xlKCdvbnMtc3dpcGVyLXRhcmdldC0tdmVydGljYWwnLCB0aGlzLmlzVmVydGljYWwoKSk7XG5cbiAgICBmb3IgKGxldCBjID0gdGhpcy50YXJnZXQuY2hpbGRyZW5bMF07IGM7IGMgPSBjLm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgYy5zdHlsZVt0aGlzLmRNLnNpemUudG9Mb3dlckNhc2UoKV0gPSB0aGlzLml0ZW1TaXplO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2VudGVyZWQoKSkge1xuICAgICAgdGhpcy5fb2Zmc2V0ID0gKHRoaXMudGFyZ2V0U2l6ZSAtIHRoaXMuaXRlbU51bVNpemUpIC8gLTIgfHwgMDtcbiAgICB9XG4gIH1cbn1cblxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBTd2lwZXIgZnJvbSAnLi4vb25zL2ludGVybmFsL3N3aXBlci5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWNhcm91c2VsXG4gKiBAY2F0ZWdvcnkgY2Fyb3VzZWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ2Fyb3VzZWwgY29tcG9uZW50LiBBIGNhcm91c2VsIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgc2V2ZXJhbCBpdGVtcyBpbiB0aGUgc2FtZSBzcGFjZS5cbiAqXG4gKiAgICAgVGhlIGNvbXBvbmVudCBzdXBwb3J0cyBkaXNwbGF5aW5nIGNvbnRlbnQgYm90aCBob3Jpem9udGFsbHkgYW5kIHZlcnRpY2FsbHkuIFRoZSB1c2VyIGNhbiBzY3JvbGwgdGhyb3VnaCB0aGUgaXRlbXMgYnkgZHJhZ2dpbmcgYW5kIGl0IGNhbiBhbHNvIGJlIGNvbnRyb2xsZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiB4YmJ6T1FcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9jYXJvdXNlbFxuICogQHNlZWFsc28gb25zLWNhcm91c2VsLWl0ZW1cbiAqICAgW2VuXWA8b25zLWNhcm91c2VsLWl0ZW0+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWNhcm91c2VsLWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtY2Fyb3VzZWwgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAyMDBweFwiPlxuICogICA8b25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgICAuLi5cbiAqICAgPC9vbnMtY2Fyb3VzZWwtaXRlbT5cbiAqICAgPG9ucy1jYXJvdXNlbC1pdGVtPlxuICogICAgLi4uXG4gKiAgIDwvb25zLWNhcm91c2VsLWl0ZW0+XG4gKiA8L29ucy1jYXJvdXNlbD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2Fyb3VzZWxFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgY3VycmVudCBjYXJvdXNlbCBpdGVtIGhhcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOihqOekuuOBl+OBpuOBhOOCi+OCq+ODq+ODvOOCu+ODq+OBruimgee0oOOBjOWkieOCj+OBo+OBn+aZguOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmNhcm91c2VsXG4gICAqICAgW2VuXUNhcm91c2VsIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9DYXJvdXNlbOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5hY3RpdmVJbmRleFxuICAgKiAgIFtlbl1DdXJyZW50IGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgovopoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQubGFzdEFjdGl2ZUluZGV4XG4gICAqICAgW2VuXVByZXZpb3VzIGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3ku6XliY3jgqLjgq/jg4bjgqPjg5bjgaDjgaPjgZ/opoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIGN1cnJlbnQgY2Fyb3VzZWwgaXRlbSBjaGFuZ2VzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmNhcm91c2VsXG4gICAqICAgW2VuXUNhcm91c2VsIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9DYXJvdXNlbOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5hY3RpdmVJbmRleFxuICAgKiAgIFtlbl1DdXJyZW50IGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgovopoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQubGFzdEFjdGl2ZUluZGV4XG4gICAqICAgW2VuXVByZXZpb3VzIGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3ku6XliY3jgqLjgq/jg4bjgqPjg5bjgaDjgaPjgZ/opoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHJlZnJlc2hcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIGNhcm91c2VsIGhhcyBiZWVuIHJlZnJlc2hlZC5bL2VuXVxuICAgKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vjgYzmm7TmlrDjgZXjgozjgZ/mmYLjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5jYXJvdXNlbFxuICAgKiAgIFtlbl1DYXJvdXNlbCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44GfQ2Fyb3VzZWzjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IG92ZXJzY3JvbGxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIGNhcm91c2VsIGhhcyBiZWVuIG92ZXJzY3JvbGxlZC5bL2VuXVxuICAgKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vjgYzjgqrjg7zjg5Djg7zjgrnjgq/jg63jg7zjg6vjgZfjgZ/mmYLjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5jYXJvdXNlbFxuICAgKiAgIFtlbl1GaXJlZCB3aGVuIHRoZSBjYXJvdXNlbCBoYXMgYmVlbiByZWZyZXNoZWQuWy9lbl1cbiAgICogICBbamFd44Kr44Or44O844K744Or44GM5pu05paw44GV44KM44Gf5pmC44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmFjdGl2ZUluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+imgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5kaXJlY3Rpb25cbiAgICogICBbZW5dQ2FuIGJlIG9uZSBvZiBlaXRoZXIgXCJ1cFwiLCBcImRvd25cIiwgXCJsZWZ0XCIgb3IgXCJyaWdodFwiLlsvZW5dXG4gICAqICAgW2phXeOCquODvOODkOODvOOCueOCr+ODreODvOODq+OBleOCjOOBn+aWueWQkeOBjOW+l+OCieOCjOOBvuOBmeOAglwidXBcIiwgXCJkb3duXCIsIFwibGVmdFwiLCBcInJpZ2h0XCLjga7jgYTjgZrjgozjgYvjga7mlrnlkJHjgYzmuKHjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC53YWl0VG9SZXR1cm5cbiAgICogICBbZW5dVGFrZXMgYSA8Y29kZT5Qcm9taXNlPC9jb2RlPiBvYmplY3QgYXMgYW4gYXJndW1lbnQuIFRoZSBjYXJvdXNlbCB3aWxsIG5vdCBzY3JvbGwgYmFjayB1bnRpbCB0aGUgcHJvbWlzZSBoYXMgYmVlbiByZXNvbHZlZCBvciByZWplY3RlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjga9Qcm9taXNl44Kq44OW44K444Kn44Kv44OI44KS5byV5pWw44Go44GX44Gm5Y+X44GR5Y+W44KK44G+44GZ44CC5rih44GX44GfUHJvbWlzZeOCquODluOCuOOCp+OCr+ODiOOBjHJlc29sdmXjgZXjgozjgovjgYtyZWplY3TjgZXjgozjgovjgb7jgafjgIHjgqvjg6vjg7zjgrvjg6vjga/jgrnjgq/jg63jg7zjg6vjg5Djg4Pjgq/jgZfjgb7jgZvjgpPjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHN3aXBlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlcyB3aGVuIHRoZSBjYXJvdXNlbCBzd2lwZXMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuaW5kZXhcbiAgICogICBbZW5dQ3VycmVudCBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgotvbnMtY2Fyb3VzZWzjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3B0aW9uc1xuICAgKiAgIFtlbl1BbmltYXRpb24gb3B0aW9ucyBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlyZWN0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgZGlyZWN0aW9uIG9mIHRoZSBjYXJvdXNlbC4gQ2FuIGJlIGVpdGhlciBcImhvcml6b250YWxcIiBvciBcInZlcnRpY2FsXCIuIERlZmF1bHQgaXMgXCJob3Jpem9udGFsXCIuWy9lbl1cbiAgICogICBbamFd44Kr44Or44O844K744Or44Gu5pa55ZCR44KS5oyH5a6a44GX44G+44GZ44CCXCJob3Jpem9udGFsXCLjgYtcInZlcnRpY2FsXCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJcImhvcml6b250YWxcIuOBjOODh+ODleOCqeODq+ODiOWApOOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGZ1bGxzY3JlZW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgd2lsbCBjb3ZlciB0aGUgd2hvbGUgc2NyZWVuLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+OBqOOAgWFic29sdXRl44Od44K444K344On44Oz44KS5L2/44Gj44Gm44Kr44Or44O844K744Or44GM6Ieq5YuV55qE44Gr55S76Z2i44GE44Gj44Gx44GE44Gr5bqD44GM44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBmdWxsc2NyZWVuXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgY292ZXIgdGhlIHdob2xlIHNjcmVlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIFhYnNvbHV0ZeODneOCuOOCt+ODp+ODs+OCkuS9v+OBo+OBpuOCq+ODq+ODvOOCu+ODq+OBjOiHquWLleeahOOBq+eUu+mdouOBhOOBo+OBseOBhOOBq+W6g+OBjOOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG92ZXJzY3JvbGxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgYmUgc2Nyb2xsYWJsZSBvdmVyIHRoZSBlZGdlLiBJdCB3aWxsIGJvdW5jZSBiYWNrIHdoZW4gcmVsZWFzZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44K/44OD44OB44KE44OJ44Op44OD44Kw44Gn56uv44G+44Gn44K544Kv44Ot44O844Or44GX44Gf5pmC44Gr44CB44OQ44Km44Oz44OJ44GZ44KL44KI44GG44Gq5Yq55p6c44GM5b2T44Gf44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgY2VudGVyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgdGhlbiB0aGUgc2VsZWN0ZWQgaXRlbSB3aWxsIGJlIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNhcm91c2VsIGluc3RlYWQgb2YgdGhlIGJlZ2lubmluZy4gVXNlZnVsIG9ubHkgd2hlbiB0aGUgaXRlbXMgYXJlIHNtYWxsZXIgdGhhbiB0aGUgY2Fyb3VzZWwuIFsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgemBuOOCk+OBp+OBhOOCi29ucy1jYXJvdXNlbC1pdGVt44Gv44Kr44Or44O844K744Or44Gu55yf44KT5Lit44G46KGM44GN44G+44GZ44CC6aCF55uu44GM44Kr44Or44O844K744Or44KI44KK44KC5bCP44GV44GE5aC05ZCI44Gr44Gu44G/44CB44GT44KM44Gv5L6/5Yip44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaXRlbS13aWR0aFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICAgW2VuXW9ucy1jYXJvdXNlbC1pdGVtJ3Mgd2lkdGguIE9ubHkgd29ya3Mgd2hlbiB0aGUgZGlyZWN0aW9uIGlzIHNldCB0byBcImhvcml6b250YWxcIi5bL2VuXVxuICAgKiAgICBbamFdb25zLWNhcm91c2VsLWl0ZW3jga7luYXjgpLmjIflrprjgZfjgb7jgZnjgILjgZPjga7lsZ7mgKfjga/jgIFkaXJlY3Rpb27lsZ7mgKfjgatcImhvcml6b250YWxcIuOCkuaMh+WumuOBl+OBn+aZguOBruOBv+acieWKueOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGl0ZW0taGVpZ2h0XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1vbnMtY2Fyb3VzZWwtaXRlbSdzIGhlaWdodC4gT25seSB3b3JrcyB3aGVuIHRoZSBkaXJlY3Rpb24gaXMgc2V0IHRvIFwidmVydGljYWxcIi5bL2VuXVxuICAgKiAgIFtqYV1vbnMtY2Fyb3VzZWwtaXRlbeOBrumrmOOBleOCkuaMh+WumuOBl+OBvuOBmeOAguOBk+OBruWxnuaAp+OBr+OAgWRpcmVjdGlvbuWxnuaAp+OBq1widmVydGljYWxcIuOCkuaMh+WumuOBl+OBn+aZguOBruOBv+acieWKueOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGF1dG8tc2Nyb2xsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgYmUgYXV0b21hdGljYWxseSBzY3JvbGxlZCB0byB0aGUgY2xvc2VzdCBpdGVtIGJvcmRlciB3aGVuIHJlbGVhc2VkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeS4gOeVqui/keOBhGNhcm91c2VsLWl0ZW3jga7looPnlYzjgb7jgafoh6rli5XnmoTjgavjgrnjgq/jg63jg7zjg6vjgZnjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhdXRvLXNjcm9sbC1yYXRpb1xuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICAgW2VuXUEgbnVtYmVyIGJldHdlZW4gMC4wIGFuZCAxLjAgdGhhdCBzcGVjaWZpZXMgaG93IG11Y2ggdGhlIHVzZXIgbXVzdCBkcmFnIHRoZSBjYXJvdXNlbCBpbiBvcmRlciBmb3IgaXQgdG8gYXV0byBzY3JvbGwgdG8gdGhlIG5leHQgaXRlbS5bL2VuXVxuICAgKiAgICBbamFdMC4w44GL44KJMS4w44G+44Gn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CC44Kr44Or44O844K744Or44Gu6KaB57Sg44KS44Gp44KM44GQ44KJ44GE44Gu5Ymy5ZCI44G+44Gn44OJ44Op44OD44Kw44GZ44KL44Go5qyh44Gu6KaB57Sg44Gr6Ieq5YuV55qE44Gr44K544Kv44Ot44O844Or44GZ44KL44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc3dpcGVhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIGNhbiBiZSBzY3JvbGxlZCBieSBkcmFnIG9yIHN3aXBlLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeOCq+ODq+ODvOOCu+ODq+OCkuOCueODr+OCpOODl+OChOODieODqeODg+OCsOOBp+enu+WLleOBp+OBjeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIGlzIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgWRyYWfjgoR0b3VjaOOChHN3aXBl44KS5Y+X44GR5LuY44GR44Gq44GP44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5pdGlhbC1pbmRleFxuICAgKiBAaW5pdG9ubHlcbiAgICogQGRlZmF1bHQgMFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgaW5kZXggb2YgdGhlIG9ucy1jYXJvdXNlbC1pdGVtIHRvIHNob3cgaW5pdGlhbGx5LiBEZWZhdWx0IGlzIDAuIElmIGFjdGl2ZS1pbmRleCBpcyBzZXQsIGluaXRpYWwtaW5kZXggaXMgaWdub3JlZC5bL2VuXVxuICAgKiAgIFtqYV3mnIDliJ3jgavooajnpLrjgZnjgotvbnMtY2Fyb3VzZWwtaXRlbeOCkjDlp4vjgb7jgorjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgafmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jlgKTjga8gMCDjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhdXRvLXJlZnJlc2hcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBjYXJvdXNlbCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aGVuIHRoZSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgY2hhbmdlLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeWtkOimgee0oOOBruaVsOOBjOWkieOCj+OCi+OBqOOCq+ODq+ODvOOCu+ODq+OBr+iHquWLleeahOOBq+abtOaWsOOBleOCjOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYXV0b1JlZnJlc2hcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRoZSBjYXJvdXNlbCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aGVuIHRoZSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgY2hhbmdlLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeWtkOimgee0oOOBruaVsOOBjOWkieOCj+OCi+OBqOOCq+ODq+ODvOOCu+ODq+OBr+iHquWLleeahOOBq+abtOaWsOOBleOCjOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ3N3aXBlJyk7XG4gICAgdGhpcy5fY29ubmVjdE9uU3dpcGUgPSBvbkNvbm5lY3RlZDtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25Td2lwZSA9IG9uRGlzY29ubmVjdGVkO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNoaWxkcmVuWzBdICYmIHRoaXMuY2hpbGRyZW5bMF0udGFnTmFtZSAhPT0gJ09OUy1DQVJPVVNFTC1JVEVNJyAmJiB0aGlzLmNoaWxkcmVuWzBdIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGlmICghdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIHdoaWxlICh0aGlzLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRhcmdldCk7XG4gICAgfVxuXG4gICAgIXRoaXMuY2hpbGRyZW5bMV0gJiYgdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkID0gdGhpcy5hcHBlbmRDaGlsZC5iaW5kKHRhcmdldCk7XG4gICAgdGhpcy5pbnNlcnRCZWZvcmUgPSB0aGlzLmluc2VydEJlZm9yZS5iaW5kKHRhcmdldCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAoIXRoaXMuX3N3aXBlcikge1xuICAgICAgdGhpcy5fc3dpcGVyID0gbmV3IFN3aXBlcih7XG4gICAgICAgIGdldEVsZW1lbnQ6ICgpID0+IHRoaXMsXG4gICAgICAgIGdldEluaXRpYWxJbmRleDogKCkgPT4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcpIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdpbml0aWFsLWluZGV4JyksXG4gICAgICAgIGdldEF1dG9TY3JvbGxSYXRpbzogKCkgPT4gdGhpcy5hdXRvU2Nyb2xsUmF0aW8sXG4gICAgICAgIGlzVmVydGljYWw6ICgpID0+IHRoaXMudmVydGljYWwsXG4gICAgICAgIGlzT3ZlclNjcm9sbGFibGU6ICgpID0+IHRoaXMub3ZlcnNjcm9sbGFibGUsXG4gICAgICAgIGlzQ2VudGVyZWQ6ICgpID0+IHRoaXMuY2VudGVyZWQsXG4gICAgICAgIGlzQXV0b1Njcm9sbGFibGU6ICgpID0+IHRoaXMuYXV0b1Njcm9sbCxcbiAgICAgICAgaXRlbVNpemU6IHRoaXMuaXRlbVNpemUsXG4gICAgICAgIG92ZXJTY3JvbGxIb29rOiB0aGlzLl9vbk92ZXJTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgICAgcHJlQ2hhbmdlSG9vazogdGhpcy5fb25QcmVDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgcG9zdENoYW5nZUhvb2s6IHRoaXMuX29uUG9zdENoYW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICByZWZyZXNoSG9vazogdGhpcy5fb25SZWZyZXNoLmJpbmQodGhpcyksXG4gICAgICAgIHNjcm9sbEhvb2s6IChpbmRleCwgb3B0aW9ucykgPT4gdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgaW5kZXgsIG9wdGlvbnMgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fc3dpcGVyLmluaXQoe1xuICAgICAgICBzd2lwZWFibGU6IHRoaXMuaGFzQXR0cmlidXRlKCdzd2lwZWFibGUnKSxcbiAgICAgICAgYXV0b1JlZnJlc2g6IHRoaXMuaGFzQXR0cmlidXRlKCdhdXRvLXJlZnJlc2gnKVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHRoaXMuX2Nvbm5lY3RPblN3aXBlKCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5fc3dpcGVyICYmIHRoaXMuX3N3aXBlci5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5fc3dpcGVyLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX3N3aXBlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzY29ubmVjdE9uU3dpcGUoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ3N3aXBlYWJsZScsICdhdXRvLXJlZnJlc2gnLCAnZGlyZWN0aW9uJywgJ2l0ZW0taGVpZ2h0JywgJ2l0ZW0td2lkdGgnLCAnYWN0aXZlLWluZGV4J107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmICghdGhpcy5fc3dpcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdzd2lwZWFibGUnOlxuICAgICAgICB0aGlzLl9zd2lwZXIudXBkYXRlU3dpcGVhYmxlKHRoaXMuaGFzQXR0cmlidXRlKCdzd2lwZWFibGUnKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXV0by1yZWZyZXNoJzpcbiAgICAgICAgdGhpcy5fc3dpcGVyLnVwZGF0ZUF1dG9SZWZyZXNoKHRoaXMuaGFzQXR0cmlidXRlKCdhdXRvLXJlZnJlc2gnKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXRlbS1oZWlnaHQnOlxuICAgICAgICB0aGlzLnZlcnRpY2FsICYmIHRoaXMuX3N3aXBlci51cGRhdGVJdGVtU2l6ZSh0aGlzLml0ZW1TaXplKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpdGVtLXdpZHRoJzpcbiAgICAgICAgdGhpcy52ZXJ0aWNhbCB8fCB0aGlzLl9zd2lwZXIudXBkYXRlSXRlbVNpemUodGhpcy5pdGVtU2l6ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGlyZWN0aW9uJzpcbiAgICAgICAgdGhpcy5fc3dpcGVyLnJlZnJlc2goKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY3RpdmUtaW5kZXgnOlxuICAgICAgICBpZiAodGhpcy5nZXRBY3RpdmVJbmRleCgpICE9PSB0aGlzLmFjdGl2ZUluZGV4KSB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVJbmRleCh0aGlzLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBfc2hvdygpIHtcbiAgICB0aGlzLl9zd2lwZXIuc2hvdygpO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgdGhpcy5fc3dpcGVyLmhpZGUoKTtcbiAgfVxuXG4gIF9vbk92ZXJTY3JvbGwoeyBkaXJlY3Rpb24sIGtpbGxPdmVyU2Nyb2xsIH0pIHtcbiAgICBsZXQgd2FpdEZvckFjdGlvbiA9IGZhbHNlO1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnb3ZlcnNjcm9sbCcsIHtcbiAgICAgIGNhcm91c2VsOiB0aGlzLFxuICAgICAgYWN0aXZlSW5kZXg6IHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIHdhaXRUb1JldHVybjogcHJvbWlzZSA9PiB7XG4gICAgICAgIHdhaXRGb3JBY3Rpb24gPSB0cnVlO1xuICAgICAgICBwcm9taXNlLnRoZW4oa2lsbE92ZXJTY3JvbGwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdhaXRGb3JBY3Rpb247XG4gIH1cblxuICBfb25QcmVDaGFuZ2UoeyBhY3RpdmVJbmRleCwgbGFzdEFjdGl2ZUluZGV4IH0pIHtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3ByZWNoYW5nZScsIHsgY2Fyb3VzZWw6IHRoaXMsIGFjdGl2ZUluZGV4LCBsYXN0QWN0aXZlSW5kZXggfSk7XG4gIH1cblxuICBfb25Qb3N0Q2hhbmdlKHsgYWN0aXZlSW5kZXgsIGxhc3RBY3RpdmVJbmRleCB9KSB7XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncG9zdGNoYW5nZScsIHsgY2Fyb3VzZWw6IHRoaXMsIGFjdGl2ZUluZGV4LCBsYXN0QWN0aXZlSW5kZXggfSk7XG4gIH1cblxuICBfb25SZWZyZXNoKCkge1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncmVmcmVzaCcsIHsgY2Fyb3VzZWw6IHRoaXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRBY3RpdmVJbmRleFxuICAgKiBAc2lnbmF0dXJlIHNldEFjdGl2ZUluZGV4KGluZGV4LCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIFtlbl1UaGUgaW5kZXggdGhhdCB0aGUgY2Fyb3VzZWwgc2hvdWxkIGJlIHNldCB0by5bL2VuXVxuICAgKiAgIFtqYV1jYXJvdXNlbOimgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1BbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nIGZ1bmN0aW9uIG9mIHRoZSBhbmltYXRpb24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBgPG9ucy1jYXJvdXNlbC1pdGVtPmAgdG8gc2hvdy5bL2VuXVxuICAgKiAgIFtqYV3ooajnpLrjgZnjgotvbnMtY2Fyb3VzZWwtaXRlbeOCkmluZGV444Gn5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGNhcm91c2VsIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldEFjdGl2ZUluZGV4KGluZGV4LCBvcHRpb25zID0ge30pIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgYW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJyksXG4gICAgICBhbmltYXRpb25PcHRpb25zOiB0aGlzLmFuaW1hdGlvbk9wdGlvbnMgfHwgeyBkdXJhdGlvbjogLjMsIHRpbWluZzogJ2N1YmljLWJlemllciguNCwgLjcsIC41LCAxKScgfSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlci5zZXRBY3RpdmVJbmRleChpbmRleCwgb3B0aW9ucylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgb3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9wdGlvbnMuY2FsbGJhY2sodGhpcyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGdldEFjdGl2ZUluZGV4XG4gICAqIEBzaWduYXR1cmUgZ2V0QWN0aXZlSW5kZXgoKVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqICAgW2VuXVRoZSBjdXJyZW50IGNhcm91c2VsIGl0ZW0gaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S644GX44Gm44GE44KL44Kr44Or44O844K744Or6KaB57Sg44Gu44Kk44Oz44OH44OD44Kv44K544GM6L+U44GV44KM44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBgPG9ucy1jYXJvdXNlbC1pdGVtPmAuWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S644GV44KM44Gm44GE44KLb25zLWNhcm91c2VsLWl0ZW3opoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZ2V0QWN0aXZlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlci5nZXRBY3RpdmVJbmRleCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmV4dFxuICAgKiBAc2lnbmF0dXJlIG5leHQoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBgXCJub25lXCJgIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcgZnVuY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IG5leHQgYDxvbnMtY2Fyb3VzZWwtaXRlbT5gLlsvZW5dXG4gICAqICAgW2phXeasoeOBrm9ucy1jYXJvdXNlbC1pdGVt44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIG5leHQob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldEFjdGl2ZUluZGV4KHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSArIDEsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcHJldlxuICAgKiBAc2lnbmF0dXJlIHByZXYoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBgXCJub25lXCJgIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcgZnVuY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHByZXZpb3VzIGA8b25zLWNhcm91c2VsLWl0ZW0+YC5bL2VuXVxuICAgKiAgIFtqYV3liY3jga5vbnMtY2Fyb3VzZWwtaXRlbeOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBwcmV2KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRBY3RpdmVJbmRleCh0aGlzLmdldEFjdGl2ZUluZGV4KCkgLSAxLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZpcnN0XG4gICAqIEBzaWduYXR1cmUgZmlyc3QoKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUlmIHRoaXMgaXMgc2V0IHRvIGBcIm5vbmVcImAsIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcgZnVuY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IGZpcnN0IGA8b25zLWNhcm91c2VsLWl0ZW0+YC5bL2VuXVxuICAgKiAgIFtqYV3mnIDliJ3jga5vbnMtY2Fyb3VzZWwtaXRlbeOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBmaXJzdChvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0QWN0aXZlSW5kZXgoMCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBsYXN0XG4gICAqIEBzaWduYXR1cmUgbGFzdCgpXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1BbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBjYXJvdXNlbCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdUmVzb2x2ZXMgdG8gdGhlIGNhcm91c2VsIGVsZW1lbnRbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2hvdyBsYXN0IG9ucy1jYXJvdXNlbCBpdGVtLlsvZW5dXG4gICAqICAgW2phXeacgOW+jOOBrm9ucy1jYXJvdXNlbC1pdGVt44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGxhc3Qob3B0aW9ucykge1xuICAgIHRoaXMuc2V0QWN0aXZlSW5kZXgoTWF0aC5tYXgodGhpcy5pdGVtQ291bnQgLSAxLCAwKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZWZyZXNoXG4gICAqIEBzaWduYXR1cmUgcmVmcmVzaCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1VcGRhdGUgdGhlIGxheW91dCBvZiB0aGUgY2Fyb3VzZWwuIFVzZWQgd2hlbiBhZGRpbmcgYDxvbnMtY2Fyb3VzZWwtaXRlbXM+YCBkeW5hbWljYWxseSBvciB0byBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgc2l6ZS5bL2VuXVxuICAgKiAgIFtqYV3jg6zjgqTjgqLjgqbjg4jjgoTlhoXpg6jjga7nirbmhYvjgpLmnIDmlrDjga7jgoLjga7jgavmm7TmlrDjgZfjgb7jgZnjgIJvbnMtY2Fyb3VzZWwtaXRlbeOCkuWLleeahOOBq+Wil+OChOOBl+OBn+OCiuOAgW9ucy1jYXJvdXNlbOOBruWkp+OBjeOBleOCkuWLleeahOOBq+WkieOBiOOCi+mam+OBq+WIqeeUqOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX3N3aXBlci5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGl0ZW1Db3VudFxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBudW1iZXIgb2YgY2Fyb3VzZWwgaXRlbXMuWy9lbl1cbiAgICogICBbamFd44Kr44Or44O844K744Or6KaB57Sg44Gu5pWw44Gn44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBpdGVtQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlci5pdGVtQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHN3aXBlYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXXRydWUgaWYgdGhlIGNhcm91c2VsIGlzIHN3aXBlYWJsZS5bL2VuXVxuICAgKiAgIFtqYV1zd2lwZWFibGXjgafjgYLjgozjgbB0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvblN3aXBlXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhvb2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgY2Fyb3VzZWwuIEl0IGdldHMgYSBkZWNpbWFsIGluZGV4IGFuZCBhbiBhbmltYXRpb25PcHRpb25zIG9iamVjdCBhcyBhcmd1bWVudHMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhdXRvU2Nyb2xsXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5ddHJ1ZSBpZiBhdXRvIHNjcm9sbCBpcyBlbmFibGVkLlsvZW5dXG4gICAqICAgW2phXeOCquODvOODiOOCueOCr+ODreODvOODq+OBjOacieWKueOBp+OBguOCjOOBsHRydWXjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBnZXQgdmVydGljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nKSA9PT0gJ3ZlcnRpY2FsJztcbiAgfVxuXG4gIGdldCBpdGVtU2l6ZSgpIHtcbiAgICBjb25zdCBpdGVtU2l6ZUF0dHIgPSAodGhpcy5nZXRBdHRyaWJ1dGUoYGl0ZW0tJHt0aGlzLnZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnfWApIHx8ICcnKS50cmltKCk7XG4gICAgcmV0dXJuIGl0ZW1TaXplQXR0ci5tYXRjaCgvXlxcZCsocHh8JSkkLykgPyBpdGVtU2l6ZUF0dHIgOiAnMTAwJSc7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGF1dG9TY3JvbGxSYXRpb1xuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGN1cnJlbnQgYXV0byBzY3JvbGwgcmF0aW8uIFsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruOCquODvOODiOOCueOCr+ODreODvOODq+OBrnJhdGlv5YCk44CCWy9qYV1cbiAgICovXG4gIGdldCBhdXRvU2Nyb2xsUmF0aW8oKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ2F1dG8tc2Nyb2xsLXJhdGlvJykpO1xuICB9XG5cbiAgc2V0IGF1dG9TY3JvbGxSYXRpbyhyYXRpbykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhdXRvLXNjcm9sbC1yYXRpbycsIHJhdGlvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBjYXJvdXNlbCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvdmVyc2Nyb2xsYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGNhcm91c2VsIGlzIG92ZXJzY3JvbGxhYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV1vdmVyc2Nyb2xs44Gn44GN44KM44GwdHJ1ZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2VudGVyZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBjYXJvdXNlbCBpcyBjZW50ZXJlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFdY2VudGVyZWTnirbmhYvjgavjgarjgaPjgabjgYTjgozjgbB0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncG9zdGNoYW5nZScsICdyZWZyZXNoJywgJ292ZXJzY3JvbGwnLCAncHJlY2hhbmdlJywgJ3N3aXBlJ107XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG4gIGdldCBhbmltYXRpb25PcHRpb25zKCkge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgcmV0dXJuIHV0aWwuYW5pbWF0aW9uT3B0aW9uc1BhcnNlKGF0dHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXR0cjtcbiAgICB9XG4gIH1cblxuICBzZXQgYW5pbWF0aW9uT3B0aW9ucyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhY3RpdmUtaW5kZXhcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBjYXJvdXNlbCBpdGVtIHRoYXQgc2hvdWxkIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWN0aXZlSW5kZXhcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBjYXJvdXNlbCBpdGVtIHRoYXQgc2hvdWxkIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgYWN0aXZlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdhY3RpdmUtaW5kZXgnKSk7XG4gIH1cblxuICBzZXQgYWN0aXZlSW5kZXgodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhDYXJvdXNlbEVsZW1lbnQsIFsnc3dpcGVhYmxlJywgJ2Rpc2FibGVkJywgJ292ZXJzY3JvbGxhYmxlJywgJ2F1dG8tc2Nyb2xsJywgJ2NlbnRlcmVkJywgJ2Z1bGxzY3JlZW4nLCAnYXV0by1yZWZyZXNoJ10pO1xuXG5vbnNFbGVtZW50cy5DYXJvdXNlbCA9IENhcm91c2VsRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWNhcm91c2VsJywgQ2Fyb3VzZWxFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHN0eWxlciBmcm9tICcuLi9vbnMvc3R5bGVyLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtY29sXG4gKiBAY2F0ZWdvcnkgZ3JpZFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgY29sdW1uIGluIHRoZSBncmlkIHN5c3RlbS4gVXNlIHdpdGggYDxvbnMtcm93PmAgdG8gbGF5b3V0IGNvbXBvbmVudHMuWy9lbl1cbiAqICAgW2phXeOCsOODquODg+ODieOCt+OCueODhuODoOOBq+OBpuWIl+OCkuWumue+qeOBl+OBvuOBmeOAgm9ucy1yb3fjgajjgajjgoLjgavkvb/nlKjjgZfjgIHjgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jg6zjgqTjgqLjgqbjg4jjgavliKnnlKjjgZfjgb7jgZnjgIJbL2phXVxuICogQG5vdGVcbiAqICAgW2VuXUZvciBBbmRyb2lkIDQuMyBhbmQgZWFybGllciwgYW5kIGlPUzYgYW5kIGVhcmxpZXIsIHdoZW4gdXNpbmcgbWl4ZWQgYWxpZ25tZW50IHdpdGggb25zLXJvdyBhbmQgb25zLWNvbHVtbiwgdGhleSBtYXkgbm90IGJlIGRpc3BsYXllZCBjb3JyZWN0bHkuIFlvdSBjYW4gdXNlIG9ubHkgb25lIGFsaWdubWVudC5bL2VuXVxuICogICBbamFdQW5kcm9pZCA0LjPku6XliY3jgIHjgoLjgZfjgY/jga9pT1MgNuS7peWJjeOBrk9T44Gu5aC05ZCI44CBb25zLXJvd+OBqG9ucy1jb2x1bW7jgpLntYTjgb/lkIjjgo/jgZvjgZ/loLTlkIjjgavmj4/nlLvjgYzltKnjgozjgovloLTlkIjjgYzjgYLjgorjgb7jgZnjgIJbL2phXVxuICogQGNvZGVwZW4gR2d1akMge3dpZGV9XG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sIFtlbl1MYXlvdXRpbmcgZ3VpZGVbL2VuXVtqYV3jg6zjgqTjgqLjgqbjg4jmqZ/og71bL2phXVxuICogQHNlZWFsc28gb25zLXJvd1xuICogICBbZW5dVGhlIGA8b25zLXJvdz5gIGNvbXBvbmVudCBpcyB0aGUgcGFyZW50IG9mIGA8b25zLWNvbD5gLlsvZW5dXG4gKiAgIFtqYV1vbnMtcm9344Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXJvdz5cbiAqICAgPG9ucy1jb2wgd2lkdGg9XCI1MHB4XCI+PG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj48L29ucy1jb2w+XG4gKiAgIDxvbnMtY29sPlRleHQ8L29ucy1jb2w+XG4gKiA8L29ucy1yb3c+XG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZlcnRpY2FsLWFsaWduXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1WZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIGNvbHVtbi4gVmFsaWQgdmFsdWVzIGFyZSBcInRvcFwiLCBcImNlbnRlclwiLCBhbmQgXCJib3R0b21cIi5bL2VuXVxuICogICBbamFd57im44Gu6YWN572u44KS5oyH5a6a44GZ44KL44CCXCJ0b3BcIiwgXCJjZW50ZXJcIiwgXCJib3R0b21cIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHdpZHRoXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1UaGUgd2lkdGggb2YgdGhlIGNvbHVtbi4gVmFsaWQgdmFsdWVzIGFyZSBjc3Mgd2lkdGggdmFsdWVzIChcIjEwJVwiLCBcIjUwcHhcIikuWy9lbl1cbiAqICAgW2phXeOCq+ODqeODoOOBruaoquW5heOCkuaMh+WumuOBmeOCi+OAguODkeODvOOCu+ODs+ODiOOCguOBl+OBj+OBr+ODlOOCr+OCu+ODq+OBp+aMh+WumuOBl+OBvuOBme+8iDEwJeOChDUwcHjvvInjgIJbL2phXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVdpZHRoKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnd2lkdGgnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICd3aWR0aCcpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVdpZHRoKCk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZVdpZHRoKCkge1xuICAgIGxldCB3aWR0aCA9IHRoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIGlmICghd2lkdGgpIHtcbiAgICAgIHN0eWxlci5jbGVhcih0aGlzLCAnZmxleCBtYXhXaWR0aCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWR0aCA9IHdpZHRoLnRyaW0oKS5tYXRjaCgvXlxcZCskLykgPyB3aWR0aCArICclJyA6IHdpZHRoO1xuXG4gICAgICBzdHlsZXIodGhpcywge1xuICAgICAgICBmbGV4OiAnMCAwICcgKyB3aWR0aCxcbiAgICAgICAgbWF4V2lkdGg6IHdpZHRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuQ29sID0gQ29sRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWNvbCcsIENvbEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIHNob3coZGlhbG9nLCBkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBoaWRlKGRpYWxvZywgZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuZHJvaWQgc3R5bGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFuZHJvaWREaWFsb2dBbmltYXRvciBleHRlbmRzIERpYWxvZ0FuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2Vhc2UtaW4tb3V0JywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuM30gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNjAlLCAwKScsIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJywgb3BhY2l0eTogMSB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTYwJSwgMCknLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgZGlhbG9nLlxuICovXG5leHBvcnQgY2xhc3MgSU9TRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBEaWFsb2dBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdlYXNlLWluLW91dCcsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7dGltaW5nLCBkZWxheSwgZHVyYXRpb259KTtcblxuICAgIHRoaXMuYm9keUhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC01MCUsICR7dGhpcy5ib2R5SGVpZ2h0IC8gMi4wIC0gMX1weCwgMClgIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKScgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAxIH0sIHsgb3BhY2l0eTogMCB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC01MCUsICR7dGhpcy5ib2R5SGVpZ2h0IC8gMi4wIC0gMX1weCwgMClgIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFNsaWRlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkZURpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgRGlhbG9nQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuXG4gICAgdGhpcy5ib2R5SGVpZ2h0ID0gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7IC8vIGF2b2lkIEZvcmNlZCBTeW5jaHJvbm91cyBMYXlvdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0LiBPdGhlcndpc2UsIGZhZGUgYW5pbWF0aW9uIG9mIG1hc2sgd2lsbCBiZSBicm9rZW4uXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgtNTAlLCAkey0gKHRoaXMuYm9keUhlaWdodCAvIDIuMCkgKyAxIC0gZGlhbG9nLl9kaWFsb2cuY2xpZW50SGVpZ2h0fXB4LCAwKWAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyB9LFxuICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0LiBPdGhlcndpc2UsIGZhZGUgYW5pbWF0aW9uIG9mIG1hc2sgd2lsbCBiZSBicm9rZW4uXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgtNTAlLCAkey0gKHRoaXMuYm9keUhlaWdodCAvIDIuMCkgKyAxIC0gZGlhbG9nLl9kaWFsb2cuY2xpZW50SGVpZ2h0fXB4LCAwKWAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IHsgRGlhbG9nQW5pbWF0b3IsIElPU0RpYWxvZ0FuaW1hdG9yLCBBbmRyb2lkRGlhbG9nQW5pbWF0b3IsIFNsaWRlRGlhbG9nQW5pbWF0b3IgfSBmcm9tICcuL29ucy1kaWFsb2cvYW5pbWF0b3IuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgQmFzZURpYWxvZ0VsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZGlhbG9nLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcuZGlhbG9nJzogJ2RpYWxvZy0tKicsXG4gICcuZGlhbG9nLWNvbnRhaW5lcic6ICdkaWFsb2ctY29udGFpbmVyLS0qJyxcbiAgJy5kaWFsb2ctbWFzayc6ICdkaWFsb2ctbWFzay0tKidcbn07XG5cbmNvbnN0IF9hbmltYXRvckRpY3QgPSB7XG4gICdkZWZhdWx0JzogZnVuY3Rpb24gKCkgeyByZXR1cm4gIHBsYXRmb3JtLmlzQW5kcm9pZCgpID8gQW5kcm9pZERpYWxvZ0FuaW1hdG9yIDogSU9TRGlhbG9nQW5pbWF0b3I7IH0sXG4gICdzbGlkZSc6IFNsaWRlRGlhbG9nQW5pbWF0b3IsXG4gICdub25lJzogRGlhbG9nQW5pbWF0b3Jcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWRpYWxvZ1xuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBEaWFsb2cgdGhhdCBpcyBkaXNwbGF5ZWQgb24gdG9wIG9mIGN1cnJlbnQgc2NyZWVuLiBBcyBvcHBvc2VkIHRvIHRoZSBgPG9ucy1hbGVydC1kaWFsb2c+YCBlbGVtZW50LCB0aGlzIGNvbXBvbmVudCBjYW4gY29udGFpbiBhbnkga2luZCBvZiBjb250ZW50LlxuICpcbiAqICAgICBUbyB1c2UgdGhlIGVsZW1lbnQgaXQgY2FuIGVpdGhlciBiZSBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgYDxib2R5PmAgZWxlbWVudCBvciBkeW5hbWljYWxseSBjcmVhdGVkIGZyb20gYSB0ZW1wbGF0ZSB1c2luZyB0aGUgYG9ucy5jcmVhdGVEaWFsb2codGVtcGxhdGUpYCB1dGlsaXR5IGZ1bmN0aW9uIGFuZCB0aGUgYDx0ZW1wbGF0ZT5gIHRhZy5cbiAqXG4gKiAgICAgVGhlIGRpYWxvZyBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgbWVudXMsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgdG8gYXNrIHRoZSB1c2VyIHRvIG1ha2UgYSBkZWNpc2lvbi5cbiAqXG4gKiAgICAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc3BsYXllZCBhcyBNYXRlcmlhbCBEZXNpZ24gd2hlbiBydW5uaW5nIG9uIGFuIEFuZHJvaWQgZGV2aWNlLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dRGlzcGxheSBhIE1hdGVyaWFsIERlc2lnbiBkaWFsb2cuWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiB6eHhhR2FcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9kaWFsb2dcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLWFsZXJ0LWRpYWxvZ1xuICogICBbZW5dYDxvbnMtYWxlcnQtZGlhbG9nPmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1hbGVydC1kaWFsb2fjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXBvcG92ZXJcbiAqICAgW2VuXWA8b25zLXBvcG92ZXI+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXBvcG92ZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLW1vZGFsXG4gKiAgIFtlbl1gPG9ucy1tb2RhbD5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbW9kYWzjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtZGlhbG9nIGlkPVwiZGlhbG9nXCI+XG4gKiAgIDxwPlRoaXMgaXMgYSBkaWFsb2chPC9wPlxuICogPC9vbnMtZGlhbG9nPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWFsb2cnKS5zaG93KCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlhbG9nRWxlbWVudCBleHRlbmRzIEJhc2VEaWFsb2dFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZXNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgZGlhbG9nIGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6KGo56S644GV44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmRpYWxvZ1xuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCB0aGUgZGlhbG9nIGZyb20gYmVpbmcgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOBn+ebtOW+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5kaWFsb2dcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgZGlhbG9nIGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmRpYWxvZ1xuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCB0aGUgZGlhbG9nIGZyb20gYmVpbmcgaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBrumdnuihqOekuuOBjOOCreODo+ODs+OCu+ODq+OBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuZGlhbG9nXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBkaWFsb2djYW5jZWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCB3aGVuIHRoZSBkaWFsb2cgaXMgY2FuY2VsZWQuWy9lbl1cbiAgICogW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkaWFsb2cuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjYW5jZWxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBkaWFsb2cgaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjg4DjgqTjgqLjg63jgrDjga9kaXNhYmxlZOeKtuaFi+OBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgZGlhbG9nLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAgb3IgYFwiZGVmYXVsdFwiYC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwi44KC44GX44GP44GvXCJkZWZhdWx0XCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbWFzay1jb2xvclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCByZ2JhKDAsIDAsIDAsIDAuMilcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgbWFzay4gRGVmYXVsdCBpcyBgXCJyZ2JhKDAsIDAsIDAsIDAuMilcImAuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF9tYXNrKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmRpYWxvZy1tYXNrJyk7XG4gIH1cblxuICBnZXQgX2RpYWxvZygpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5kaWFsb2cnKTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgYW5pbWF0b3JzOiBfYW5pbWF0b3JEaWN0LFxuICAgICAgYmFzZUNsYXNzOiBEaWFsb2dBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdEaWFsb2dBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc3R5bGUuekluZGV4ID0gMTAwMDE7XG5cbiAgICAvKiBFeHBlY3RlZCByZXN1bHQ6XG4gICAgICogICA8b25zLWRpYWxvZz5cbiAgICAgKiAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1tYXNrXCI+PC9kaXY+XG4gICAgICogICAgIDxkaXYgY2xhc3M9XCJkaWFsb2dcIj5cbiAgICAgKiAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRhaW5lclwiPi4uLjwvZGl2PlxuICAgICAqICAgICA8L2Rpdj5cbiAgICAgKiAgIDwvb25zLWRpYWxvZz5cbiAgICAgKi9cblxuICAgIGlmICghdGhpcy5fZGlhbG9nKSB7XG4gICAgICBjb25zdCBkaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpYWxvZy5jbGFzc0xpc3QuYWRkKCdkaWFsb2cnKTtcblxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGlhbG9nLWNvbnRhaW5lcicpO1xuICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkge1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICAgIGRpYWxvZy5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXG4gICAgICB0aGlzLmFwcGVuZENoaWxkKGRpYWxvZyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tYXNrKSB7XG4gICAgICBjb25zdCBtYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtYXNrLmNsYXNzTGlzdC5hZGQoJ2RpYWxvZy1tYXNrJyk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShtYXNrLCB0aGlzLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RpYWxvZy5zdHlsZS56SW5kZXggPSAyMDAwMTtcbiAgICB0aGlzLl9tYXNrLnN0eWxlLnpJbmRleCA9IDIwMDAwO1xuXG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3N0YXR1cy1iYXItZmlsbCcsICcnKTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwibm9uZVwiYCBhbmQgYFwic2xpZGVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwic2xpZGVcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YCBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiByZXZlYWxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozntYLjgo/jgaPjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TaG93IHRoZSBkaWFsb2cuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjgpLplovjgY3jgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyB0byB0aGUgZGlzcGxheWVkIGVsZW1lbnQuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwibm9uZVwiYCBhbmQgYFwic2xpZGVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwic2xpZGVcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YFsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44Gf5b6M44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIGRpYWxvZy5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgpLplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgaGlkZGVuIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZpc2libGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBkaWFsb2cgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjYW5jZWxhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgb3Igbm90LiBBIGNhbmNlbGFibGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWFza0NvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7RGlhbG9nQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIERpYWxvZ0FuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdEaWFsb2cnKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IERpYWxvZ0FuaW1hdG9yKCkge1xuICAgIHJldHVybiBEaWFsb2dBbmltYXRvcjtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5EaWFsb2cgPSBEaWFsb2dFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtZGlhbG9nJywgRGlhbG9nRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnZmFiJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ2ZhYi0tKicsXG4gICcuZmFiX19pY29uJzogJ2ZhYi0tKl9faWNvbidcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWZhYlxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhlIEZsb2F0aW5nIGFjdGlvbiBidXR0b24gaXMgYSBjaXJjdWxhciBidXR0b24gZGVmaW5lZCBpbiB0aGUgW01hdGVyaWFsIERlc2lnbiBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2NvbXBvbmVudHMvYnV0dG9ucy1mbG9hdGluZy1hY3Rpb24tYnV0dG9uLmh0bWwpLiBUaGV5IGFyZSBvZnRlbiB1c2VkIHRvIHByb21vdGUgdGhlIHByaW1hcnkgYWN0aW9uIG9mIHRoZSBhcHAuXG4gKlxuICogICAgIEl0IGNhbiBiZSBkaXNwbGF5ZWQgZWl0aGVyIGFzIGFuIGlubGluZSBlbGVtZW50IG9yIGluIG9uZSBvZiB0aGUgY29ybmVycy4gTm9ybWFsbHkgaXQgd2lsbCBiZSBwb3NpdGlvbmVkIGluIHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHNjcmVlbi5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvZmFiXG4gKiBAbW9kaWZpZXIgbWluaVxuICogICBbZW5dTWFrZXMgdGhlIGBvbnMtZmFiYCBzbWFsbGVyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNjcm9zcy1wbGF0Zm9ybS1zdHlsaW5nLWF1dG9zdHlsaW5nIFtlbl1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9lbl1bamFdSW5mb3JtYXRpb24gYWJvdXQgY3Jvc3MgcGxhdGZvcm0gc3R5bGluZ1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BlZWQtZGlhbFxuICogICBbZW5dVGhlIGA8b25zLXNwZWVkLWRpYWw+YCBjb21wb25lbnQgaXMgYSBGbG9hdGluZyBhY3Rpb24gYnV0dG9uIHRoYXQgZGlzcGxheXMgYSBtZW51IHdoZW4gdGFwcGVkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYWJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBidXR0b24uWy9lbl1cbiAgICogIFtqYV3jg5zjgr/jg7Pjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSByaXBwbGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSByaXBwbGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcG9zaXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIHBvc2l0aW9uIG9mIHRoZSBidXR0b24uIFNob3VsZCBiZSBhIHN0cmluZyBsaWtlIGBcImJvdHRvbSByaWdodFwiYCBvciBgXCJ0b3AgbGVmdFwiYC4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYW4gaW5saW5lIGVsZW1lbnQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OCkueEoeWKueWMluOBmeOCi+WgtOWQiOOBr+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudHMgY2FuIGJlIGV4ZWN1dGVkIGJlZm9yZSBjb250ZW50UmVhZHlcbiAgICAvLyBzaW5jZSB0aGVzZSBkbyBub3QgYWNjZXNzIHRoZSBjaGlsZHJlblxuICAgIHRoaXMuX2hpZGUoKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHRoaXMsICcuZmFiX19pY29uJykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2ZhYl9faWNvbicpO1xuXG4gICAgICB1dGlsLmFycmF5RnJvbSh0aGlzLmNoaWxkTm9kZXMpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGlmICghZWxlbWVudC50YWdOYW1lIHx8IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25zLXJpcHBsZScpIHtcbiAgICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlUmlwcGxlKCk7XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3Nob3coKSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdyaXBwbGUnLCAncG9zaXRpb24nLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaXBwbGUnOlxuICAgICAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwb3NpdGlvbic6XG4gICAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICghdGhpcy5fbWFudWFsbHlIaWRkZW4pIHsgLy8gaWYgdXNlciBoYXMgbm90IGNhbGxlZCBvbnMtZmFiLmhpZGUoKVxuICAgICAgdGhpcy5fdG9nZ2xlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl90b2dnbGUoZmFsc2UpKTtcbiAgfVxuXG4gIF91cGRhdGVSaXBwbGUoKSB7XG4gICAgdXRpbC51cGRhdGVSaXBwbGUodGhpcyk7XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAnZmFiLS10b3BfX2xlZnQnLFxuICAgICAgJ2ZhYi0tYm90dG9tX19yaWdodCcsXG4gICAgICAnZmFiLS1ib3R0b21fX2xlZnQnLFxuICAgICAgJ2ZhYi0tdG9wX19yaWdodCcsXG4gICAgICAnZmFiLS10b3BfX2NlbnRlcicsXG4gICAgICAnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcCByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCB0b3AnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tdG9wX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcCBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgdG9wJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLXRvcF9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCBib3R0b20nOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tYm90dG9tX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgYm90dG9tJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLWJvdHRvbV9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciB0b3AnOlxuICAgICAgY2FzZSAndG9wIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS10b3BfX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciBib3R0b20nOlxuICAgICAgY2FzZSAnYm90dG9tIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU2hvdyB0aGUgZmxvYXRpbmcgYWN0aW9uIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBzaG93KCkge1xuICAgIHRoaXMudG9nZ2xlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1IaWRlIHRoZSBmbG9hdGluZyBhY3Rpb24gYnV0dG9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgdGhpcy50b2dnbGUoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICB0b2dnbGUoYWN0aW9uID0gIXRoaXMudmlzaWJsZSkge1xuICAgIHRoaXMuX21hbnVhbGx5SGlkZGVuID0gIWFjdGlvbjtcbiAgICB0aGlzLl90b2dnbGUoYWN0aW9uKTtcbiAgfVxuXG4gIF90b2dnbGUoYWN0aW9uID0gIXRoaXMudmlzaWJsZSkge1xuICAgIGNvbnN0IGlzQm90dG9tID0gKHRoaXMuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpIHx8ICcnKS5pbmRleE9mKCdib3R0b20nKSA+PSAwO1xuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IGlzQm90dG9tID8gYHRyYW5zbGF0ZTNkKDBweCwgLSR7dXRpbC5nbG9iYWxzLmZhYk9mZnNldCB8fCAwfXB4LCAwcHgpYCA6ICcnO1xuXG4gICAgc3R5bGVyKHRoaXMsIHsgdHJhbnNmb3JtOiBgJHt0cmFuc2xhdGV9IHNjYWxlKCR7TnVtYmVyKGFjdGlvbil9KWAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnN0eWxlLnRyYW5zZm9ybS5pbmRleE9mKCdzY2FsZSgwKScpID09PSAtMSAmJiB0aGlzLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKEZhYkVsZW1lbnQsIFsnZGlzYWJsZWQnLCAncmlwcGxlJ10pO1xuXG5vbnNFbGVtZW50cy5GYWIgPSBGYWJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtZmFiJywgRmFiRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBHZXN0dXJlRGV0ZWN0b3IgZnJvbSAnLi4vb25zL2dlc3R1cmUtZGV0ZWN0b3IuanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1nZXN0dXJlLWRldGVjdG9yXG4gKiBAY2F0ZWdvcnkgZ2VzdHVyZVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDb21wb25lbnQgdG8gZGV0ZWN0IGZpbmdlciBnZXN0dXJlcyB3aXRoaW4gdGhlIHdyYXBwZWQgZWxlbWVudC4gRm9sbG93aW5nIGdlc3R1cmVzIGFyZSBzdXBwb3J0ZWQ6XG4gKiAgICAgLSBEcmFnIGdlc3R1cmVzOiBgZHJhZ2AsIGBkcmFnbGVmdGAsIGBkcmFncmlnaHRgLCBgZHJhZ3VwYCwgYGRyYWdkb3duYFxuICogICAgIC0gSG9sZCBnZXN0dXJlczogYGhvbGRgLCBgcmVsZWFzZWBcbiAqICAgICAtIFN3aXBlIGdlc3R1cmVzOiBgc3dpcGVgLCBgc3dpcGVsZWZ0YCwgYHN3aXBlcmlnaHRgLCBgc3dpcGV1cGAsIGBzd2lwZWRvd25gXG4gKiAgICAgLSBUYXAgZ2VzdHVyZXM6IGB0YXBgLCBgZG91YmxldGFwYFxuICogICAgIC0gUGluY2ggZ2VzdHVyZXM6IGBwaW5jaGAsIGBwaW5jaGluYCwgYHBpbmNob3V0YFxuICogICAgIC0gT3RoZXIgZ2VzdHVyZXM6IGB0b3VjaGAsIGB0cmFuc2Zvcm1gLCBgcm90YXRlYFxuICogICBbL2VuXVxuICogICBbamFd6KaB57Sg5YaF44Gu44K444Kn44K544OB44Oj44O85pON5L2c44KS5qSc55+l44GX44G+44GZ44CC6Kmz44GX44GP44Gv44Ks44Kk44OJ44KS5Y+C54Wn44GX44Gm44GP44Gg44GV44GE44CCWy9qYV1cbiAqIEBndWlkZSBmZWF0dXJlcy5odG1sI2dlc3R1cmUtZGV0ZWN0aW9uXG4gKiAgIFtlbl1EZXRlY3RpbmcgZmluZ2VyIGdlc3R1cmVzWy9lbl1cbiAqICAgW2phXeOCuOOCp+OCueODgeODo+ODvOaTjeS9nOOBruaknOefpVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1nZXN0dXJlLWRldGVjdG9yPlxuICogICA8ZGl2IGlkPVwiZGV0ZWN0LWFyZWFcIiBzdHlsZT1cIndpZHRoOiAxMDBweDsgaGVpZ2h0OiAxMDBweDtcIj5cbiAqICAgICBTd2lwZSBIZXJlXG4gKiAgIDwvZGl2PlxuICogPC9vbnMtZ2VzdHVyZS1kZXRlY3Rvcj5cbiAqXG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzd2lwZWxlZnQnLCBmdW5jdGlvbihldmVudCkge1xuICogICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygnI2RldGVjdC1hcmVhJykpIHtcbiAqICAgICAgIGNvbnNvbGUubG9nKCdTd2lwZSBsZWZ0IGlzIGRldGVjdGVkLicpO1xuICogICAgIH1cbiAqICAgfSk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2VzdHVyZURldGVjdG9yRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkdlc3R1cmVEZXRlY3RvciA9IEdlc3R1cmVEZXRlY3RvckVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1nZXN0dXJlLWRldGVjdG9yJywgR2VzdHVyZURldGVjdG9yRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxubGV0IGF1dG9QcmVmaXggPSAnZmEnOyAvLyBGSVhNRTogVG8gYmUgcmVtb3ZlZCBpbiB2M1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1pY29uXG4gKiBAY2F0ZWdvcnkgdmlzdWFsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIERpc3BsYXlzIGFuIGljb24uIFRoZSBmb2xsb3dpbmcgaWNvbiBzdWl0ZXMgYXJlIGF2YWlsYWJsZTpcbiAqXG4gKiAgICAgKiBbRm9udCBBd2Vzb21lXShodHRwczovL2ZvcnRhd2Vzb21lLmdpdGh1Yi5pby9Gb250LUF3ZXNvbWUvKVxuICogICAgICogW0lvbmljb25zXShodHRwOi8vaW9uaWNvbnMuY29tLylcbiAqICAgICAqIFtNYXRlcmlhbCBEZXNpZ24gSWNvbmljIEZvbnRdKGh0dHA6Ly96YXZvbG9rbG9tLmdpdGh1Yi5pby9tYXRlcmlhbC1kZXNpZ24taWNvbmljLWZvbnQvKVxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHhBaHZnXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvaWNvblxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNjcm9zcy1wbGF0Zm9ybS1zdHlsaW5nLWF1dG9zdHlsaW5nIFtlbl1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9lbl1bamFdWy9qYV1cbiAqIEBndWlkZSBhcHBzaXplLmh0bWwjcmVtb3ZpbmctaWNvbi1wYWNrcyBbZW5dUmVtb3ZpbmcgaWNvbiBwYWNrcy5bL2VuXVtqYV1bL2phXVxuICogQGd1aWRlIGZhcS5odG1sI2hvdy1jYW4taS11c2UtY3VzdG9tLWljb24tcGFja3MgW2VuXUFkZGluZyBjdXN0b20gaWNvbiBwYWNrcy5bL2VuXVtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtaWNvblxuICogICBpY29uPVwibWQtY2FyXCJcbiAqICAgc2l6ZT1cIjIwcHhcIlxuICogICBzdHlsZT1cImNvbG9yOiByZWRcIj5cbiAqIDwvb25zLWljb24+XG4gKlxuICogPG9ucy1idXR0b24+XG4gKiAgIDxvbnMtaWNvbiBpY29uPVwibWQtY2FyXCI+PC9vbnMtaWNvbj5cbiAqICAgQ2FyXG4gKiA8L29ucy1idXR0b24+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEljb25FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGljb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhlIGljb24gbmFtZS4gYFwibWQtXCJgIHByZWZpeCBmb3IgTWF0ZXJpYWwgSWNvbnMsIGBcImZhLVwiYCBmb3IgRm9udCBBd2Vzb21lIGFuZCBgXCJpb24tXCJgIHByZWZpeCBmb3IgSW9uaWNvbnMuXG4gICAqXG4gICAqICAgICBTZWUgYWxsIGF2YWlsYWJsZSBpY29ucyBvbiB0aGUgZWxlbWVudCBkZXNjcmlwdGlvbiAoYXQgdGhlIHRvcCkuXG4gICAqXG4gICAqICAgICBJY29ucyBjYW4gYWxzbyBiZSBzdHlsZWQgYmFzZWQgb24gbW9kaWZpZXIgcHJlc2VuY2UuIEFkZCBjb21tYS1zZXBhcmF0ZWQgaWNvbnMgd2l0aCBgXCJtb2RpZmllck5hbWU6XCJgIHByZWZpeC5cbiAgICpcbiAgICogICAgIFRoZSBjb2RlIGA8b25zLWljb24gaWNvbj1cImlvbi1lZGl0LCBtYXRlcmlhbDptZC1lZGl0XCI+PC9vbnMtaWNvbj5gIHdpbGwgZGlzcGxheSBgXCJtZC1lZGl0XCJgIGZvciBNYXRlcmlhbCBEZXNpZ24gYW5kIGBcImlvbi1lZGl0XCJgIGFzIHRoZSBkZWZhdWx0IGljb24uXG4gICAqXG4gICAqICAgICBgZmEtYCBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBpZiBub25lIGlzIHByb3ZpZGVkLiBDaGVjayBbU2VlIGFsc29dKCNzZWVhbHNvKSBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNpemVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhlIHNpemVzIG9mIHRoZSBpY29uLiBWYWxpZCB2YWx1ZXMgYXJlIGxnLCAyeCwgM3gsIDR4LCA1eCwgb3IgaW4gdGhlIHNpemUgaW4gcGl4ZWxzLlxuICAgKiAgICAgSWNvbnMgY2FuIGFsc28gYmUgc3R5bGVkIGJhc2VkIG9uIG1vZGlmaWVyIHByZXNlbmNlLiBBZGQgY29tbWEtc2VwYXJhdGVkIGljb25zIHdpdGggYFwibW9kaWZpZXJOYW1lOlwiYCBwcmVmaXguXG4gICAqXG4gICAqICAgICBUaGUgY29kZTpcbiAgICpcbiAgICogICAgIGBgYFxuICAgKiAgICAgPG9ucy1pY29uXG4gICAqICAgICAgIGljb249XCJpb24tZWRpdFwiXG4gICAqICAgICAgIHNpemU9XCIzMnB4LCBtYXRlcmlhbDoyNHB4XCI+XG4gICAqICAgICA8L29ucy1pY29uPlxuICAgKiAgICAgYGBgXG4gICAqXG4gICAqICAgICB3aWxsIHJlbmRlciBhcyBhIGAyNHB4YCBpY29uIGlmIHRoZSBgXCJtYXRlcmlhbFwiYCBtb2RpZmllciBpcyBwcmVzZW50IGFuZCBgMzJweGAgb3RoZXJ3aXNlLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHJvdGF0ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIHRoZSBpY29uLiBWYWxpZCB2YWx1ZXMgYXJlIDkwLCAxODAgYW5kIDI3MC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjgqTjgrPjg7PjgpLlm57ou6LjgZfjgabooajnpLrjgZfjgb7jgZnjgII5MCwgMTgwLCAyNzDjgYvjgonmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBmaXhlZC13aWR0aFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dV2hlbiB1c2VkIGluIGEgbGlzdCwgeW91IHdhbnQgdGhlIGljb25zIHRvIGhhdmUgdGhlIHNhbWUgd2lkdGggc28gdGhhdCB0aGV5IGFsaWduIHZlcnRpY2FsbHkgYnkgZGVmaW5pbmcgdGhpcyBhdHRyaWJ1dGUuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGZpeGVkV2lkdGhcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVdoZW4gdXNlZCBpbiBhIGxpc3QsIHlvdSB3YW50IHRoZSBpY29ucyB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHNvIHRoYXQgdGhleSBhbGlnbiB2ZXJ0aWNhbGx5IGJ5IGRlZmluaW5nIHRoaXMgYXR0cmlidXRlLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc3BpblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB3aGV0aGVyIHRoZSBpY29uIHNob3VsZCBiZSBzcGlubmluZy5bL2VuXVxuICAgKiAgIFtqYV3jgqLjgqTjgrPjg7PjgpLlm57ou6LjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNwaW5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIGJlIHNwaW5uaW5nLlsvZW5dXG4gICAqICAgW2phXeOCouOCpOOCs+ODs+OCkuWbnui7ouOBmeOCi+OBi+OBqeOBhuOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnaWNvbicsICdzaXplJywgJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHRoaXMuX2NsZWFuQ2xhc3NBdHRyaWJ1dGUobmFtZSA9PT0gJ2ljb24nID8gbGFzdCA6IHRoaXMuZ2V0QXR0cmlidXRlKCdpY29uJyksIG5hbWUgPT09ICdtb2RpZmllcicgPyBsYXN0IDogdW5kZWZpbmVkKTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9XG5cbiAgX3VwZGF0ZSgpIHtcbiAgICBjb25zdCB7Y2xhc3NMaXN0LCBzdHlsZX0gPSB0aGlzLl9idWlsZENsYXNzQW5kU3R5bGUodGhpcy5fcGFyc2VBdHRyKCdpY29uJyksIHRoaXMuX3BhcnNlQXR0cignc2l6ZScpKTtcbiAgICB1dGlsLmV4dGVuZCh0aGlzLnN0eWxlLCBzdHlsZSk7XG5cbiAgICBjbGFzc0xpc3QuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkpO1xuICB9XG5cbiAgX3BhcnNlQXR0cihhdHRyTmFtZSwgbW9kaWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSB8fCAnJykge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgfHwgYXR0ck5hbWUgfHwgJyc7XG4gICAgY29uc3QgcGFydHMgPSBhdHRyLnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICBjb25zdCBkZWYgPSBwYXJ0c1swXTtcbiAgICBsZXQgbWQgPSBwYXJ0c1sxXTtcbiAgICBtZCA9IChtZCB8fCAnJykuc3BsaXQoL1xccyo6XFxzKi8pO1xuXG4gICAgcmV0dXJuIChtb2RpZmllciAmJiAoUmVnRXhwKGAoXnxcXFxccyspJHttZFswXX0oJHxcXFxccyspYCwgJ2knKS50ZXN0KG1vZGlmaWVyKSkgPyBtZFsxXSA6IGRlZikgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVubmVlZGVkIGNsYXNzIHZhbHVlLlxuICAgKi9cbiAgX2NsZWFuQ2xhc3NBdHRyaWJ1dGUobGFzdEljb24sIGxhc3RNb2RpZmllcikge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lLCBwcmVmaXggfSA9IHRoaXMuX3ByZWZpeEljb24odGhpcy5fcGFyc2VBdHRyKGxhc3RJY29uLCBsYXN0TW9kaWZpZXIpKTtcbiAgICBjb25zdCBjdXN0b21QcmVmaXhSRSA9IGNsYXNzTmFtZSAhPT0gcHJlZml4ID8gYHwke3ByZWZpeH0kfCR7cHJlZml4fS1gIDogYHwke2NsYXNzTmFtZX0kYCB8fCAnJztcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF4oZmEkfGZhLXxpb24tfHptZGkkfHptZGktfG9ucy1pY29uLS0ke2N1c3RvbVByZWZpeFJFfSlgKTtcblxuICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2xhc3NMaXN0KVxuICAgICAgLmZpbHRlcihjbGFzc05hbWUgPT4gcmUudGVzdChjbGFzc05hbWUpKVxuICAgICAgLmZvckVhY2goY2xhc3NOYW1lID0+IHRoaXMuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpKTtcbiAgfVxuXG4gIF9wcmVmaXhJY29uKGljb25OYW1lKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gYXV0b1ByZWZpeCArIChhdXRvUHJlZml4ID8gJy0nIDogJycpICsgaWNvbk5hbWU7XG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lLCBwcmVmaXg6IGNsYXNzTmFtZS5zcGxpdCgnLScpWzBdIH07XG4gIH1cblxuICBfYnVpbGRDbGFzc0FuZFN0eWxlKGljb25OYW1lLCBzaXplKSB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gWydvbnMtaWNvbiddO1xuICAgIGNvbnN0IHN0eWxlID0ge307XG5cbiAgICAvLyBJY29uXG4gICAgaWYgKGljb25OYW1lLmluZGV4T2YoJ2lvbi0nKSA9PT0gMCkge1xuICAgICAgY2xhc3NMaXN0LnB1c2goaWNvbk5hbWUpO1xuICAgICAgY2xhc3NMaXN0LnB1c2goJ29ucy1pY29uLS1pb24nKTtcbiAgICB9IGVsc2UgaWYgKGljb25OYW1lLmluZGV4T2YoJ2ZhLScpID09PSAwKSB7XG4gICAgICBjbGFzc0xpc3QucHVzaChpY29uTmFtZSk7XG4gICAgICAvLyBkZWZhdWx0IGljb24gc3R5bGUgdG8gRm9udCBBd2Vzb21lIFNvbGlkIGlmIGljb24gc3R5bGUgaXMgbm90IHNwZWNpZmllZCBhbHJlYWR5XG4gICAgICBpZiAoISh0aGlzLmNsYXNzTGlzdC5jb250YWlucygnZmFyJykgfHwgdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ2ZhYicpIHx8IHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYWwnKSkpIHtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goJ2ZhJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpY29uTmFtZS5pbmRleE9mKCdtZC0nKSA9PT0gMCkgIHtcbiAgICAgIGNsYXNzTGlzdC5wdXNoKCd6bWRpJyk7XG4gICAgICBjbGFzc0xpc3QucHVzaCgnem1kaS0nICsgaWNvbk5hbWUuc3BsaXQoLy0oLispPy8pWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBjbGFzc05hbWUsIHByZWZpeCB9ID0gdGhpcy5fcHJlZml4SWNvbihpY29uTmFtZSk7XG4gICAgICBwcmVmaXggJiYgY2xhc3NMaXN0LnB1c2gocHJlZml4KTtcbiAgICAgIGNsYXNzTmFtZSAmJiBjbGFzc0xpc3QucHVzaChjbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vIFNpemVcbiAgICBpZiAoc2l6ZS5tYXRjaCgvXlsxLTVdeHxsZyQvKSkge1xuICAgICAgY2xhc3NMaXN0LnB1c2goJ29ucy1pY29uLS0nICsgc2l6ZSk7XG4gICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdmb250LXNpemUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuZm9udFNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjbGFzc0xpc3Q6IGNsYXNzTGlzdCxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgc2V0QXV0b1ByZWZpeChwcmVmaXgpIHtcbiAgICBhdXRvUHJlZml4ID0gcHJlZml4ID8gKHR5cGVvZiBwcmVmaXggPT09ICdzdHJpbmcnICYmIHByZWZpeCB8fCAnZmEnKSA6ICcnO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoSWNvbkVsZW1lbnQsIFsnZml4ZWQtd2lkdGgnLCAnc3BpbiddKTtcblxub25zRWxlbWVudHMuSWNvbiA9IEljb25FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtaWNvbicsIEljb25FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtLmpzJztcblxuZXhwb3J0IGNsYXNzIExhenlSZXBlYXREZWxlZ2F0ZSB7XG5cbiAgY29uc3RydWN0b3IodXNlckRlbGVnYXRlLCB0ZW1wbGF0ZUVsZW1lbnQgPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VyRGVsZWdhdGUgIT09ICdvYmplY3QnIHx8IHVzZXJEZWxlZ2F0ZSA9PT0gbnVsbCkge1xuICAgICAgdXRpbC50aHJvdygnXCJkZWxlZ2F0ZVwiIHBhcmFtZXRlciBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICB0aGlzLl91c2VyRGVsZWdhdGUgPSB1c2VyRGVsZWdhdGU7XG5cbiAgICBpZiAoISh0ZW1wbGF0ZUVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSAmJiB0ZW1wbGF0ZUVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgIHV0aWwudGhyb3coJ1widGVtcGxhdGVFbGVtZW50XCIgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRWxlbWVudCBvciBudWxsJyk7XG4gICAgfVxuICAgIHRoaXMuX3RlbXBsYXRlRWxlbWVudCA9IHRlbXBsYXRlRWxlbWVudDtcbiAgfVxuXG4gIGdldCBpdGVtSGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLl91c2VyRGVsZWdhdGUuaXRlbUhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaGFzUmVuZGVyRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJEZWxlZ2F0ZS5fcmVuZGVyIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIF9yZW5kZXIoKSB7XG4gICAgdGhpcy5fdXNlckRlbGVnYXRlLl9yZW5kZXIuYXBwbHkodGhpcy5fdXNlckRlbGVnYXRlLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lIEEgZnVuY3Rpb24gdGhhdCB0YWtlIGl0ZW0gb2JqZWN0IGFzIHBhcmFtZXRlci5cbiAgICovXG4gIGxvYWRJdGVtRWxlbWVudChpbmRleCwgZG9uZSkge1xuICAgIGlmICh0aGlzLl91c2VyRGVsZWdhdGUubG9hZEl0ZW1FbGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZS5sb2FkSXRlbUVsZW1lbnQoaW5kZXgsIGRvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fdXNlckRlbGVnYXRlLmNyZWF0ZUl0ZW1Db250ZW50KGluZGV4LCB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQpO1xuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgIHV0aWwudGhyb3coJ1wiY3JlYXRlSXRlbUNvbnRlbnRcIiBtdXN0IHJldHVybiBhbiBpbnN0YW5jZSBvZiBFbGVtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGRvbmUoe2VsZW1lbnR9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgY291bnRJdGVtcygpIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX3VzZXJEZWxlZ2F0ZS5jb3VudEl0ZW1zKCk7XG4gICAgaWYgKHR5cGVvZiBjb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wiY291bnRJdGVtc1wiIG11c3QgcmV0dXJuIGEgbnVtYmVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1cbiAgICogQHBhcmFtIHtFbGVtZW50fSBpdGVtLmVsZW1lbnRcbiAgICovXG4gIHVwZGF0ZUl0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICBpZiAodGhpcy5fdXNlckRlbGVnYXRlLnVwZGF0ZUl0ZW1Db250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZS51cGRhdGVJdGVtQ29udGVudChpbmRleCwgaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovXG4gIGNhbGN1bGF0ZUl0ZW1IZWlnaHQoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5fdXNlckRlbGVnYXRlLmNhbGN1bGF0ZUl0ZW1IZWlnaHQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5fdXNlckRlbGVnYXRlLmNhbGN1bGF0ZUl0ZW1IZWlnaHQoaW5kZXgpO1xuXG4gICAgICBpZiAodHlwZW9mIGhlaWdodCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdXRpbC50aHJvdygnXCJjYWxjdWxhdGVJdGVtSGVpZ2h0XCIgbXVzdCByZXR1cm4gYSBudW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1cbiAgICovXG4gIGRlc3Ryb3lJdGVtKGluZGV4LCBpdGVtKSB7XG4gICAgaWYgKHRoaXMuX3VzZXJEZWxlZ2F0ZS5kZXN0cm95SXRlbSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLl91c2VyRGVsZWdhdGUuZGVzdHJveUl0ZW0oaW5kZXgsIGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdXNlckRlbGVnYXRlLmRlc3Ryb3kgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgdGhpcy5fdXNlckRlbGVnYXRlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLl91c2VyRGVsZWdhdGUgPSB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlIGNvcmUgZnVuY3Rpb25zIGZvciBvbnMtbGF6eS1yZXBlYXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXp5UmVwZWF0UHJvdmlkZXIge1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHdyYXBwZXJFbGVtZW50XG4gICAqIEBwYXJhbSB7TGF6eVJlcGVhdERlbGVnYXRlfSBkZWxlZ2F0ZVxuICAgKi9cbiAgY29uc3RydWN0b3Iod3JhcHBlckVsZW1lbnQsIGRlbGVnYXRlKSB7XG4gICAgaWYgKCEoZGVsZWdhdGUgaW5zdGFuY2VvZiBMYXp5UmVwZWF0RGVsZWdhdGUpKSB7XG4gICAgICB1dGlsLnRocm93KCdcImRlbGVnYXRlXCIgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTGF6eVJlcGVhdERlbGVnYXRlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd3JhcHBlckVsZW1lbnQgPSB3cmFwcGVyRWxlbWVudDtcbiAgICB0aGlzLl9kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIHRoaXMuX2luc2VydEluZGV4ID0gKHRoaXMuX3dyYXBwZXJFbGVtZW50LmNoaWxkcmVuWzBdICYmIHRoaXMuX3dyYXBwZXJFbGVtZW50LmNoaWxkcmVuWzBdLnRhZ05hbWUgPT09ICdPTlMtTEFaWS1SRVBFQVQnKSA/IDEgOiAwO1xuXG4gICAgaWYgKHdyYXBwZXJFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1saXN0Jykge1xuICAgICAgd3JhcHBlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGF6eS1saXN0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGFnZUNvbnRlbnQgPSB0aGlzLl9maW5kUGFnZUNvbnRlbnRFbGVtZW50KHdyYXBwZXJFbGVtZW50KTtcblxuICAgIGlmICghdGhpcy5fcGFnZUNvbnRlbnQpIHtcbiAgICAgIHV0aWwudGhyb3coJ0xhenlSZXBlYXQgbXVzdCBiZSBkZXNjZW5kYW50IG9mIGEgUGFnZSBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0U2Nyb2xsVG9wID0gdGhpcy5fcGFnZUNvbnRlbnQuc2Nyb2xsVG9wO1xuICAgIHRoaXMucGFkZGluZyA9IDA7XG4gICAgdGhpcy5fdG9wUG9zaXRpb25zID0gWzBdO1xuICAgIHRoaXMuX3JlbmRlcmVkSXRlbXMgPSB7fTtcblxuICAgIGlmICghdGhpcy5fZGVsZWdhdGUuaXRlbUhlaWdodCAmJiAhdGhpcy5fZGVsZWdhdGUuY2FsY3VsYXRlSXRlbUhlaWdodCgwKSkge1xuICAgICAgdGhpcy5fdW5rbm93bkl0ZW1IZWlnaHQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fb25DaGFuZ2UoKTtcbiAgfVxuXG4gIGdldCBwYWRkaW5nKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLl93cmFwcGVyRWxlbWVudC5zdHlsZS5wYWRkaW5nVG9wLCAxMCk7XG4gIH1cblxuICBzZXQgcGFkZGluZyhuZXdWYWx1ZSkge1xuICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLnBhZGRpbmdUb3AgPSBuZXdWYWx1ZSArICdweCc7XG4gIH1cblxuICBfZmluZFBhZ2VDb250ZW50RWxlbWVudCh3cmFwcGVyRWxlbWVudCkge1xuICAgIGNvbnN0IHBhZ2VDb250ZW50ID0gdXRpbC5maW5kUGFyZW50KHdyYXBwZXJFbGVtZW50LCAnLnBhZ2VfX2NvbnRlbnQnKTtcblxuICAgIGlmIChwYWdlQ29udGVudCkge1xuICAgICAgcmV0dXJuIHBhZ2VDb250ZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2UgPSB1dGlsLmZpbmRQYXJlbnQod3JhcHBlckVsZW1lbnQsICdvbnMtcGFnZScpO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gdXRpbC5maW5kQ2hpbGQocGFnZSwgJy5jb250ZW50Jyk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIF9jaGVja0l0ZW1IZWlnaHQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9kZWxlZ2F0ZS5sb2FkSXRlbUVsZW1lbnQoMCwgaXRlbSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3Vua25vd25JdGVtSGVpZ2h0KSB7XG4gICAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgc3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fd3JhcHBlckVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbS5lbGVtZW50KTtcblxuICAgICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUuZGVzdHJveUl0ZW0oMCwgaXRlbSk7XG4gICAgICAgIGl0ZW0uZWxlbWVudCAmJiBpdGVtLmVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91bmtub3duSXRlbUhlaWdodDtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2l0ZW1IZWlnaHQgPSBpdGVtLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICBpZiAodGhpcy5faXRlbUhlaWdodCA+IDApIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHJldHJ5IHRvIG1lYXN1cmUgb2Zmc2V0IGhlaWdodFxuICAgICAgLy8gZGlydHkgZml4IGZvciBhbmd1bGFyMiBkaXJlY3RpdmVcbiAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGl0ZW0uZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2l0ZW1IZWlnaHQgPSBpdGVtLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5faXRlbUhlaWdodCA9PSAwKSB7XG4gICAgICAgICAgdXRpbC50aHJvdygnSW52YWxpZCBzdGF0ZTogXCJpdGVtSGVpZ2h0XCIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgc3RhdGljSXRlbUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXRlbUhlaWdodCB8fCB0aGlzLl9pdGVtSGVpZ2h0O1xuICB9XG4gIF9jb3VudEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jb3VudEl0ZW1zKCk7XG4gIH1cblxuICBfZ2V0SXRlbUhlaWdodChpKSB7XG4gICAgLy8gSXRlbSBpcyByZW5kZXJlZFxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fcmVuZGVyZWRJdGVtcywgaSkpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3JlbmRlcmVkSXRlbXNbaV0sICdoZWlnaHQnKSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlZEl0ZW1zW2ldLmhlaWdodCA9IHRoaXMuX3JlbmRlcmVkSXRlbXNbaV0uZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZWRJdGVtc1tpXS5oZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gSXRlbSBpcyBub3QgcmVuZGVyZWQsIHNjcm9sbCB1cFxuICAgIGlmICh0aGlzLl90b3BQb3NpdGlvbnNbaSArIDFdICYmIHRoaXMuX3RvcFBvc2l0aW9uc1tpXSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RvcFBvc2l0aW9uc1tpICsgMV0gLSB0aGlzLl90b3BQb3NpdGlvbnNbaV07XG4gICAgfVxuICAgIC8vIEl0ZW0gaXMgbm90IHJlbmRlcmVkLCBzY3JvbGwgZG93blxuICAgIHJldHVybiB0aGlzLnN0YXRpY0l0ZW1IZWlnaHQgfHwgdGhpcy5fZGVsZWdhdGUuY2FsY3VsYXRlSXRlbUhlaWdodChpKTtcbiAgfVxuXG4gIF9jYWxjdWxhdGVSZW5kZXJlZEhlaWdodCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fcmVuZGVyZWRJdGVtcykucmVkdWNlKChhLCBiKSA9PiBhICsgdGhpcy5fZ2V0SXRlbUhlaWdodCgrKGIpKSwgMCk7XG4gIH1cblxuICBfb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5fcmVuZGVyKCk7XG4gIH1cblxuICBfbGFzdEl0ZW1SZW5kZXJlZCgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4uT2JqZWN0LmtleXModGhpcy5fcmVuZGVyZWRJdGVtcykpO1xuICB9XG5cbiAgX2ZpcnN0SXRlbVJlbmRlcmVkKCkge1xuICAgIHJldHVybiBNYXRoLm1pbiguLi5PYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKSk7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIGNvbnN0IGZvcmNlUmVuZGVyID0geyBmb3JjZVNjcm9sbERvd246IHRydWUgfTtcbiAgICBjb25zdCBmaXJzdEl0ZW1JbmRleCA9IHRoaXMuX2ZpcnN0SXRlbVJlbmRlcmVkKCk7XG5cbiAgICBpZiAodXRpbC5pc0ludGVnZXIoZmlyc3RJdGVtSW5kZXgpKSB7XG4gICAgICB0aGlzLl93cmFwcGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLl90b3BQb3NpdGlvbnNbZmlyc3RJdGVtSW5kZXhdICsgdGhpcy5fY2FsY3VsYXRlUmVuZGVyZWRIZWlnaHQoKSArICdweCc7XG4gICAgICB0aGlzLnBhZGRpbmcgPSB0aGlzLl90b3BQb3NpdGlvbnNbZmlyc3RJdGVtSW5kZXhdO1xuICAgICAgZm9yY2VSZW5kZXIuZm9yY2VGaXJzdEluZGV4ID0gZmlyc3RJdGVtSW5kZXg7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVtb3ZlQWxsRWxlbWVudHMoKTtcbiAgICB0aGlzLl9yZW5kZXIoZm9yY2VSZW5kZXIpO1xuICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdpbmhlcml0JztcbiAgfVxuXG4gIF9yZW5kZXIoe2ZvcmNlU2Nyb2xsRG93biA9IGZhbHNlLCBmb3JjZUZpcnN0SW5kZXgsIGZvcmNlTGFzdEluZGV4fSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX3Vua25vd25JdGVtSGVpZ2h0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2tJdGVtSGVpZ2h0KHRoaXMuX3JlbmRlci5iaW5kKHRoaXMsIGFyZ3VtZW50c1swXSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzU2Nyb2xsVXAgPSAhZm9yY2VTY3JvbGxEb3duICYmIHRoaXMubGFzdFNjcm9sbFRvcCA+IHRoaXMuX3BhZ2VDb250ZW50LnNjcm9sbFRvcDtcbiAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSB0aGlzLl9wYWdlQ29udGVudC5zY3JvbGxUb3A7XG4gICAgY29uc3Qga2VlcCA9IHt9O1xuXG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fd3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIGNvbnN0IGxpbWl0ID0gNCAqIHdpbmRvdy5pbm5lckhlaWdodCAtIG9mZnNldDtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX2NvdW50SXRlbXMoKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgY29uc3Qgc3RhcnQgPSBmb3JjZUZpcnN0SW5kZXggfHwgTWF0aC5tYXgoMCwgdGhpcy5fY2FsY3VsYXRlU3RhcnRJbmRleChvZmZzZXQpIC0gMzApOyAvLyBSZWNhbGN1bGF0ZSBmb3IgMCBvciB1bmRlZmluZWRcbiAgICBsZXQgaSA9IHN0YXJ0O1xuXG4gICAgZm9yIChsZXQgdG9wID0gdGhpcy5fdG9wUG9zaXRpb25zW2ldOyBpIDwgY291bnQgJiYgdG9wIDwgbGltaXQ7IGkrKykge1xuICAgICAgaWYgKGkgPj0gdGhpcy5fdG9wUG9zaXRpb25zLmxlbmd0aCkgeyAvLyBwZXJmIG9wdGltaXphdGlvblxuICAgICAgICB0aGlzLl90b3BQb3NpdGlvbnMubGVuZ3RoICs9IDEwMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdG9wUG9zaXRpb25zW2ldID0gdG9wO1xuICAgICAgdG9wICs9IHRoaXMuX2dldEl0ZW1IZWlnaHQoaSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlbGVnYXRlLmhhc1JlbmRlckZ1bmN0aW9uICYmIHRoaXMuX2RlbGVnYXRlLmhhc1JlbmRlckZ1bmN0aW9uKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5fcmVuZGVyKHN0YXJ0LCBpLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucGFkZGluZyA9IHRoaXMuX3RvcFBvc2l0aW9uc1tzdGFydF07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNTY3JvbGxVcCkge1xuICAgICAgZm9yIChsZXQgaiA9IGkgLSAxOyBqID49IHN0YXJ0OyBqLS0pIHtcbiAgICAgICAga2VlcFtqXSA9IHRydWU7XG4gICAgICAgIHRoaXMuX3JlbmRlckVsZW1lbnQoaiwgaXNTY3JvbGxVcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGZvcmNlTGFzdEluZGV4IHx8IE1hdGgubWF4KGkgLSAxLCAuLi5PYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKSk7IC8vIFJlY2FsY3VsYXRlIGZvciAwIG9yIHVuZGVmaW5lZFxuICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IGxhc3RJbmRleDsgaisrKSB7XG4gICAgICAgIGtlZXBbal0gPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW5kZXJFbGVtZW50KGosIGlzU2Nyb2xsVXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHRoaXMuX3JlbmRlcmVkSXRlbXMpLmZvckVhY2goa2V5ID0+IGtlZXBba2V5XSB8fCB0aGlzLl9yZW1vdmVFbGVtZW50KGtleSwgaXNTY3JvbGxVcCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2Nyb2xsVXBcbiAgICovXG4gIF9yZW5kZXJFbGVtZW50KGluZGV4LCBpc1Njcm9sbFVwKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB0aGlzLl9kZWxlZ2F0ZS51cGRhdGVJdGVtKGluZGV4LCBpdGVtKTsgLy8gdXBkYXRlIGlmIGl0IGV4aXN0c1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbGVnYXRlLmxvYWRJdGVtRWxlbWVudChpbmRleCwgaXRlbSA9PiB7XG4gICAgICBpZiAoaXNTY3JvbGxVcCkge1xuICAgICAgICB0aGlzLl93cmFwcGVyRWxlbWVudC5pbnNlcnRCZWZvcmUoaXRlbS5lbGVtZW50LCB0aGlzLl93cmFwcGVyRWxlbWVudC5jaGlsZHJlblt0aGlzLl9pbnNlcnRJbmRleF0pO1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSB0aGlzLl90b3BQb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICBpdGVtLmhlaWdodCA9IHRoaXMuX3RvcFBvc2l0aW9uc1tpbmRleCArIDFdIC0gdGhpcy5fdG9wUG9zaXRpb25zW2luZGV4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW0uZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1Njcm9sbFVwXG4gICAqL1xuICBfcmVtb3ZlRWxlbWVudChpbmRleCwgaXNTY3JvbGxVcCA9IHRydWUpIHtcbiAgICBpbmRleCA9ICsoaW5kZXgpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9yZW5kZXJlZEl0ZW1zW2luZGV4XTtcbiAgICB0aGlzLl9kZWxlZ2F0ZS5kZXN0cm95SXRlbShpbmRleCwgaXRlbSk7XG5cbiAgICBpZiAoaXNTY3JvbGxVcCkge1xuICAgICAgdGhpcy5fdG9wUG9zaXRpb25zW2luZGV4ICsgMV0gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFkZGluZyA9IHRoaXMucGFkZGluZyArIHRoaXMuX2dldEl0ZW1IZWlnaHQoaW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChpdGVtLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgaXRlbS5lbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaXRlbS5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF07XG4gIH1cblxuICBfcmVtb3ZlQWxsRWxlbWVudHMoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5fcmVuZGVyZWRJdGVtcykuZm9yRWFjaChrZXkgPT4gdGhpcy5fcmVtb3ZlRWxlbWVudChrZXkpKTtcbiAgfVxuXG4gIF9yZWNhbGN1bGF0ZVRvcFBvc2l0aW9ucyhzdGFydCwgZW5kKSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzLl90b3BQb3NpdGlvbnNbaSArIDFdID0gdGhpcy5fdG9wUG9zaXRpb25zW2ldICsgdGhpcy5fZ2V0SXRlbUhlaWdodChpKTtcbiAgICB9XG4gIH1cblxuICBfY2FsY3VsYXRlU3RhcnRJbmRleChjdXJyZW50KSB7XG4gICAgY29uc3QgZmlyc3RJdGVtSW5kZXggPSB0aGlzLl9maXJzdEl0ZW1SZW5kZXJlZCgpO1xuICAgIGNvbnN0IGxhc3RJdGVtSW5kZXggPSB0aGlzLl9sYXN0SXRlbVJlbmRlcmVkKCk7XG5cbiAgICAvLyBGaXggZm9yIFNhZmFyaSBzY3JvbGwgYW5kIEFuZ3VsYXIgMlxuICAgIHRoaXMuX3JlY2FsY3VsYXRlVG9wUG9zaXRpb25zKGZpcnN0SXRlbUluZGV4LCBsYXN0SXRlbUluZGV4KTtcblxuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGVuZCA9IHRoaXMuX2NvdW50SXRlbXMoKSAtIDE7XG5cbiAgICAvLyBCaW5hcnkgc2VhcmNoIGZvciBpbmRleCBhdCB0b3Agb2Ygc2NyZWVuIHNvIHdlIGNhbiBzcGVlZCB1cCByZW5kZXJpbmcuXG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigoc3RhcnQgKyBlbmQpIC8gMik7XG4gICAgICBjb25zdCB2YWx1ZSA9IGN1cnJlbnQgKyB0aGlzLl90b3BQb3NpdGlvbnNbbWlkZGxlXTtcblxuICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAwICYmIHZhbHVlICsgdGhpcy5fZ2V0SXRlbUhlaWdodChtaWRkbGUpID4gMCkge1xuICAgICAgICByZXR1cm4gbWlkZGxlO1xuICAgICAgfSBlbHNlIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPj0gMCkge1xuICAgICAgICBlbmQgPSBtaWRkbGUgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9kZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgaWYgKGNhbGxOb3cpIHtcbiAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgd2FpdCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIF9kb3VibGVGaXJlT25Ub3VjaGVuZCgpIHtcbiAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB0aGlzLl9kZWJvdW5jZSh0aGlzLl9yZW5kZXIuYmluZCh0aGlzKSwgMTAwKTtcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICB1dGlsLmJpbmRMaXN0ZW5lcnModGhpcywgWydfb25DaGFuZ2UnLCAnX2RvdWJsZUZpcmVPblRvdWNoZW5kJ10pO1xuXG4gICAgaWYgKHBsYXRmb3JtLmlzSU9TKCkpIHtcbiAgICAgIHRoaXMuX2JvdW5kT25DaGFuZ2UgPSB0aGlzLl9kZWJvdW5jZSh0aGlzLl9ib3VuZE9uQ2hhbmdlLCAzMCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGFnZUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG5cbiAgICBpZiAocGxhdGZvcm0uaXNJT1MoKSkge1xuICAgICAgdXRpbC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3BhZ2VDb250ZW50LCAndG91Y2htb3ZlJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5fcGFnZUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9ib3VuZERvdWJsZUZpcmVPblRvdWNoZW5kLCB0cnVlKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gIH1cblxuICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5fcGFnZUNvbnRlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG5cbiAgICBpZiAocGxhdGZvcm0uaXNJT1MoKSkge1xuICAgICAgdXRpbC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX3BhZ2VDb250ZW50LCAndG91Y2htb3ZlJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5fcGFnZUNvbnRlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9ib3VuZERvdWJsZUZpcmVPblRvdWNoZW5kLCB0cnVlKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3JlbW92ZUFsbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5fZGVsZWdhdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX3BhcmVudEVsZW1lbnQgPSB0aGlzLl9kZWxlZ2F0ZSA9IHRoaXMuX3JlbmRlcmVkSXRlbXMgPSBudWxsO1xuICAgIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cbn1cblxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgeyBMYXp5UmVwZWF0RGVsZWdhdGUsIExhenlSZXBlYXRQcm92aWRlciB9IGZyb20gJy4uL29ucy9pbnRlcm5hbC9sYXp5LXJlcGVhdC5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxhenktcmVwZWF0XG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBVc2luZyB0aGlzIGNvbXBvbmVudCBhIGxpc3Qgd2l0aCBtaWxsaW9ucyBvZiBpdGVtcyBjYW4gYmUgcmVuZGVyZWQgd2l0aG91dCBhIGRyb3AgaW4gcGVyZm9ybWFuY2UuXG4gKiAgICAgSXQgZG9lcyB0aGF0IGJ5IFwibGF6aWx5XCIgbG9hZGluZyBlbGVtZW50cyBpbnRvIHRoZSBET00gd2hlbiB0aGV5IGNvbWUgaW50byB2aWV3IGFuZFxuICogICAgIHJlbW92aW5nIGl0ZW1zIGZyb20gdGhlIERPTSB3aGVuIHRoZXkgYXJlIG5vdCB2aXNpYmxlLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg44GT44Gu44Kz44Oz44Od44O844ON44Oz44OI5YaF44Gn5o+P55S744GV44KM44KL44Ki44Kk44OG44Og44GuRE9N6KaB57Sg44Gu6Kqt44G/6L6844G/44Gv44CB55S76Z2i44Gr6KaL44GI44Gd44GG44Gr44Gq44Gj44Gf5pmC44G+44Gn6Ieq5YuV55qE44Gr6YGF5bu244GV44KM44CBXG4gKiAgICAg55S76Z2i44GL44KJ6KaL44GI44Gq44GP44Gq44Gj44Gf5aC05ZCI44Gr44Gv44Gd44Gu6KaB57Sg44Gv5YuV55qE44Gr44Ki44Oz44Ot44O844OJ44GV44KM44G+44GZ44CCXG4gKiAgICAg44GT44Gu44Kz44Oz44Od44O844ON44Oz44OI44KS5L2/44GG44GT44Go44Gn44CB44OR44OV44Kp44O844Oe44Oz44K544KS5Yqj5YyW44GV44Gb44KL44GT44Go54Sh44GX44Gr5beo5aSn44Gq5pWw44Gu6KaB57Sg44KS5o+P55S744Gn44GN44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAY29kZXBlbiBRd3JHQm1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9sYXp5LXJlcGVhdFxuICogQHNlZWFsc28gb25zLWxpc3RcbiAqICAgW2VuXVRoZSBgPG9ucy1saXN0PmAgZWxlbWVudCBpcyB1c2VkIHRvIHJlbmRlciBhIGxpc3QuWy9lbl1cbiAqICAgW2phXWA8b25zLWxpc3Q+YOimgee0oOOBr+ODquOCueODiOOCkuaPj+eUu+OBmeOCi+OBruOBq+S9v+OCj+OCjOOBvuOBmeOAglsvamFdXG4gKiBAZXhhbXBsZVxuICogPHNjcmlwdD5cbiAqICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAqICAgICB2YXIgbGF6eVJlcGVhdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXN0Jyk7XG4gKiAgICAgbGF6eVJlcGVhdC5kZWxlZ2F0ZSA9IHtcbiAqICAgICAgY3JlYXRlSXRlbUNvbnRlbnQ6IGZ1bmN0aW9uKGksIHRlbXBsYXRlKSB7XG4gKiAgICAgICAgdmFyIGRvbSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTtcbiAqICAgICAgICBkb20uaW5uZXJUZXh0ID0gaTtcbiAqXG4gKiAgICAgICAgcmV0dXJuIGRvbTtcbiAqICAgICAgfSxcbiAqICAgICAgY291bnRJdGVtczogZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgcmV0dXJuIDEwMDAwMDAwO1xuICogICAgICB9LFxuICogICAgICBkZXN0cm95SXRlbTogZnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHtcbiAqICAgICAgICBjb25zb2xlLmxvZygnRGVzdHJveWVkIGl0ZW0gd2l0aCBpbmRleDogJyArIGluZGV4KTtcbiAqICAgICAgfVxuICogICAgIH07XG4gKiAgIH0pO1xuICogPC9zY3JpcHQ+XG4gKlxuICogPG9ucy1saXN0IGlkPVwibGlzdFwiPlxuICogICA8b25zLWxhenktcmVwZWF0PlxuICogICAgIDxvbnMtbGlzdC1pdGVtPjwvb25zLWxpc3QtaXRlbT5cbiAqICAgPC9vbnMtbGF6eS1yZXBlYXQ+XG4gKiA8L29ucy1saXN0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYXp5UmVwZWF0RWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAvLyBub3QgdmVyeSBnb29kIGlkZWEgYW5kIGFsc28gbm90IGRvY3VtZW50ZWRcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2RlbGVnYXRlJykpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB3aW5kb3dbdGhpcy5nZXRBdHRyaWJ1dGUoJ2RlbGVnYXRlJyldO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGVsZWdhdGVcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSBhIGRlbGVnYXRlIG9iamVjdCB0byBsb2FkIGFuZCB1bmxvYWQgaXRlbSBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXeimgee0oOOBruODreODvOODieOAgeOCouODs+ODreODvOODieOBquOBqeOBruWHpueQhuOCkuWnlOitsuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGVsZWdhdGUuY3JlYXRlSXRlbUNvbnRlbnRcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBgSFRNTEVsZW1lbnRgLlxuICAgKlxuICAgKiAgICAgVG8gaGVscCByZW5kZXJpbmcgdGhlIGVsZW1lbnQsIHRoZSBjdXJyZW50IGluZGV4IGFuZCBhIHRlbXBsYXRlIGlzIHN1cHBsaWVkIGFzIGFyZ3VtZW50cy4gVGhlIHRlbXBsYXRlIGlzIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgdGhlIGA8b25zLWxhenktcmVwZWF0PmAgZWxlbWVudC5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1cbiAgICogICAgIOOBk+OBrumWouaVsOOBr2BIVE1MRWxlbWVudGDjgpLov5TjgZfjgabjgY/jgaDjgZXjgYTjgIJcbiAgICogICAgIOimgee0oOOCkueUn+aIkOOBl+OChOOBmeOBj+OBmeOCi+OBn+OCgeOBq+OAgeePvuWcqOOBruOCouOCpOODhuODoOOBruOCpOODs+ODh+ODg+OCr+OCueOBqOODhuODs+ODl+ODrOODvOODiOOBjOW8leaVsOOBq+a4oeOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg44GT44Gu44OG44Oz44OX44Os44O844OI44Gv44CBYDxvbnMtbGF6eS1yZXBlYXQ+YOimgee0oOOBruOCs+ODs+ODhuODs+ODhOOBjOa4oeOBleOCjOOBvuOBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGVsZWdhdGUuY291bnRJdGVtc1xuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QuWy9lbl1cbiAgICogICBbamFd44Oq44K544OI5YaF44Gu44Ki44Kk44OG44Og5pWw44KS6L+U44GX44Gm44GP44Gg44GV44GE44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkZWxlZ2F0ZS5jYWxjdWxhdGVJdGVtSGVpZ2h0XG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgU2hvdWxkIHJldHVybiB0aGUgaGVpZ2h0IG9mIGFuIGl0ZW0uIFRoZSBpbmRleCBpcyBwcm92aWRlZCBhcyBhbiBhcmd1bWVudC5cbiAgICpcbiAgICogICAgIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gcmVuZGVyaW5nIGxpc3RzIHdoZXJlIHRoZSBpdGVtcyBoYXZlIGRpZmZlcmVudCBoZWlnaHQuXG4gICAqXG4gICAqICAgICBUaGUgZnVuY3Rpb24gaXMgb3B0aW9uYWwgYW5kIGlmIGl0IGlzbid0IHByZXNlbnQgdGhlIGhlaWdodCBvZiB0aGUgZmlyc3QgaXRlbSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgdXNlZCBmb3IgYWxsIG90aGVyIGl0ZW1zLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg44Ki44Kk44OG44Og44Gu6auY44GVKOODlOOCr+OCu+ODqynjgpLov5TjgZfjgabjgY/jgaDjgZXjgYTjgILjgqLjgqTjg4bjg6Djga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKTjga/lvJXmlbDjgafmuKHjgZXjgozjgb7jgZnjgIJcbiAgICogICAgIOOBk+OBrumWouaVsOOBr+OAgeOBneOCjOOBnuOCjOOBruOCouOCpOODoOOBjOmBleOBo+OBn+mrmOOBleOCkuaMgeOBpOODquOCueODiOOCkuODrOODs+ODgOODquODs+OCsOOBmeOCi+mam+OBq+mHjeimgeOBp+OBmeOAglxuICAgKiAgICAg44GT44Gu6Zai5pWw44Gv44Kq44OX44K344On44OK44Or44Gn44GZ44CC44KC44GX44GT44Gu6Zai5pWw44GM54Sh44GE5aC05ZCI44Gr44Gv44CBXG4gICAqICAgICDmnIDliJ3jga7jgqLjgqTjg4bjg6Djga7pq5jjgZXjgYzku5bjga7jgZnjgbnjgabjga7jgqLjgqTjg4bjg6Djga7pq5jjgZXjgajjgZfjgabliKnnlKjjgZXjgozjgb7jgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRlbGVnYXRlLmRlc3Ryb3lJdGVtXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGNhbGxlZCB3aGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uIFRoZSBpbmRleCBhbmQgRE9NIGVsZW1lbnQgaXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzLlxuICAgKlxuICAgKiAgICAgVGhlIGZ1bmN0aW9uIGlzIG9wdGlvbmFsIGJ1dCBtYXkgYmUgaW1wb3J0YW50IGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1cbiAgICogICAgIOOBk+OBrumWouaVsOOBr+OAgeOBguOCi+OCouOCpOODhuODoOOBjERPTeODhOODquODvOOBi+OCiemZpOOBi+OCjOOBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg44Ki44Kk44OG44Og44Gu44Kk44Oz44OH44OD44Kv44K55YCk44GoRE9N6KaB57Sg44GM5byV5pWw44Go44GX44Gm5rih44GV44KM44G+44GZ44CCXG4gICAqICAgICDjgZPjga7plqLmlbDjga/jgqrjg5fjgrfjg6fjg4rjg6vjgafjgZnjgYzjgIHlkITjgqLjgqTjg4bjg6Djga7lvozlh6bnkIbjgYzlv4XopoHjgarloLTlkIjjgavjga/jg6Hjg6Ljg6rjg7zjg6rjg7zjgq/jgpLpgb/jgZHjgovjgZ/jgoHjgavph43opoHjgafjgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICBzZXQgZGVsZWdhdGUodXNlckRlbGVnYXRlKSB7XG4gICAgdGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyICYmIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlci5kZXN0cm95KCk7XG5cbiAgICBpZiAoIXRoaXMuX3RlbXBsYXRlRWxlbWVudCAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuY2hpbGRyZW5bMF0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGVnYXRlID0gbmV3IExhenlSZXBlYXREZWxlZ2F0ZSh1c2VyRGVsZWdhdGUsIHRoaXMuX3RlbXBsYXRlRWxlbWVudCB8fCBudWxsKTtcbiAgICB0aGlzLl9sYXp5UmVwZWF0UHJvdmlkZXIgPSBuZXcgTGF6eVJlcGVhdFByb3ZpZGVyKHRoaXMucGFyZW50RWxlbWVudCwgZGVsZWdhdGUpO1xuICB9XG5cbiAgZ2V0IGRlbGVnYXRlKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93KCdObyBkZWxlZ2F0ZSBnZXR0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlZnJlc2hcbiAgICogQHNpZ25hdHVyZSByZWZyZXNoKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJlZnJlc2ggdGhlIGxpc3QuIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHRoZSBkYXRhIGhhcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeODquOCueODiOOCkuabtOaWsOOBl+OBvuOBmeOAguOCguOBl+ODh+ODvOOCv+OBjOWkieOCj+OBo+OBn+WgtOWQiOOBq+OBr+OBk+OBruODoeOCveODg+ODieOCkuS9v+OBo+OBpuOBj+OBoOOBleOBhOOAglsvamFdXG4gICAqL1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlciAmJiB0aGlzLl9sYXp5UmVwZWF0UHJvdmlkZXIucmVmcmVzaCgpO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHt9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuX2xhenlSZXBlYXRQcm92aWRlcikge1xuICAgICAgdGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbn1cblxuaW50ZXJuYWwuTGF6eVJlcGVhdERlbGVnYXRlID0gTGF6eVJlcGVhdERlbGVnYXRlO1xuaW50ZXJuYWwuTGF6eVJlcGVhdFByb3ZpZGVyID0gTGF6eVJlcGVhdFByb3ZpZGVyO1xuXG5vbnNFbGVtZW50cy5MYXp5UmVwZWF0ID0gTGF6eVJlcGVhdEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1sYXp5LXJlcGVhdCcsIExhenlSZXBlYXRFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2xpc3QtaGVhZGVyJztcbmNvbnN0IHNjaGVtZSA9IHsnJzogJ2xpc3QtaGVhZGVyLS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3QtaGVhZGVyXG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1IZWFkZXIgZWxlbWVudCBmb3IgbGlzdCBpdGVtcy4gTXVzdCBiZSBwdXQgaW5zaWRlIHRoZSBgPG9ucy1saXN0PmAgY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV3jg6rjgrnjg4jopoHntKDjgavkvb/nlKjjgZnjgovjg5jjg4Pjg4Djg7znlKjjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgIJvbnMtbGlzdOOBqOWFseOBq+S9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGlzdFxuICogICBbZW5dVGhlIGA8b25zLWxpc3Q+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWxpc3TjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWxpc3QtaXRlbVxuICogICBbZW5dVGhlIGA8b25zLWxpc3QtaXRlbT5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbGlzdC1pdGVt44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBjb2RlcGVuIHl4Y0N0XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvbGlzdFxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGxpc3QgaGVhZGVyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtbGlzdD5cbiAqICAgPG9ucy1saXN0LWhlYWRlcj5IZWFkZXIgVGV4dDwvb25zLWxpc3QtaGVhZGVyPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogPC9vbnMtbGlzdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdEhlYWRlckVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBsaXN0IGhlYWRlci5bL2VuXVxuICAgKiAgIFtqYV3jg5jjg4Pjg4Djg7zjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29tcGlsZSgpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5vbnNFbGVtZW50cy5MaXN0SGVhZGVyID0gTGlzdEhlYWRlckVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1saXN0LWhlYWRlcicsIExpc3RIZWFkZXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2xpc3QtdGl0bGUnO1xuY29uc3Qgc2NoZW1lID0geycnOiAnbGlzdC10aXRsZS0tKid9O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1saXN0LXRpdGxlXG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgbGlzdCB0aXRsZS5bL2VuXVxuICogICBbamFd44Oq44K544OI44Gu44K/44Kk44OI44Or44KS6KGo54++44GX44G+44GZ44CCWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWxpc3QtdGl0bGU+TGlzdCBUaXRsZTwvb25zLWxpc3QtdGl0bGU+XG4gKiA8b25zLWxpc3Q+XG4gKiAgIDxvbnMtbGlzdC1pdGVtPkl0ZW08L29ucy1saXN0LWl0ZW0+XG4gKiA8L29ucy1saXN0PlxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGxpc3QgdGl0bGUuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdFRpdGxlRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29tcGlsZSgpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5vbnNFbGVtZW50cy5MaXN0VGl0bGUgPSBMaXN0VGl0bGVFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtbGlzdC10aXRsZScsIExpc3RUaXRsZUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTggQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcblxuZXhwb3J0IGNsYXNzIExpc3RJdGVtQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgc2hvd0V4cGFuc2lvbihsaXN0SXRlbSwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgaGlkZUV4cGFuc2lvbihsaXN0SXRlbSwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTbGlkZUxpc3RJdGVtQW5pbWF0b3IgZXh0ZW5kcyBMaXN0SXRlbUFuaW1hdG9yIHtcblxuICBzaG93RXhwYW5zaW9uKGxpc3RJdGVtLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2FuaW1hdGVFeHBhbnNpb24obGlzdEl0ZW0sIHRydWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGhpZGVFeHBhbnNpb24obGlzdEl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fYW5pbWF0ZUV4cGFuc2lvbihsaXN0SXRlbSwgZmFsc2UsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIF9hbmltYXRlRXhwYW5zaW9uKGxpc3RJdGVtLCBzaG91bGRPcGVuLCBjYWxsYmFjaykge1xuICAgIC8vIFRvIGFuaW1hdGUgdGhlIG9wZW5pbmcgb2YgdGhlIGV4cGFuc2lvbiBwYW5lbCBjb3JyZWN0bHksIHdlIG5lZWQgdG8ga25vdyBpdHNcbiAgICAvLyBoZWlnaHQuIFRvIGNhbGN1bGF0ZSB0aGlzLCB3ZSBzZXQgaXRzIGhlaWdodCB0byBhdXRvLCBhbmQgdGhlbiBnZXQgdGhlIGNvbXB1dGVkXG4gICAgLy8gaGVpZ2h0IGFuZCBwYWRkaW5nLiBPbmNlIHRoaXMgaXMgZG9uZSwgd2Ugc2V0IHRoZSBoZWlnaHQgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUuXG4gICAgY29uc3Qgb2xkSGVpZ2h0ID0gbGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQuc3R5bGUuaGVpZ2h0O1xuICAgIGNvbnN0IG9sZERpc3BsYXkgPSBsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudC5zdHlsZS5kaXNwbGF5O1xuICAgIGxpc3RJdGVtLmV4cGFuZGFibGVDb250ZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICBsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQpO1xuXG4gICAgY29uc3QgZXhwYW5zaW9uT3BlblRyYW5zaXRpb24gPSBbXG4gICAgICB7IGhlaWdodDogMCwgcGFkZGluZ1RvcDogMCwgcGFkZGluZ0JvdHRvbTogMCB9LFxuICAgICAge1xuICAgICAgICBoZWlnaHQ6IGNvbXB1dGVkU3R5bGUuaGVpZ2h0LFxuICAgICAgICBwYWRkaW5nVG9wOiBjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsXG4gICAgICAgIHBhZGRpbmdCb3R0b206IGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSxcbiAgICAgIH1cbiAgICBdO1xuICAgIGNvbnN0IGljb25PcGVuVHJhbnNpdGlvbiA9IFt7dHJhbnNmb3JtOiAncm90YXRlKDQ1ZGVnKSd9LCB7dHJhbnNmb3JtOiAncm90YXRlKDIyNWRlZyknfV07XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSB2YWx1ZXMgd2UgbmVlZCwgcmVzZXQgdGhlIGhlaWdodCBiYWNrIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZVxuICAgIGxpc3RJdGVtLmV4cGFuZGFibGVDb250ZW50LnN0eWxlLmhlaWdodCA9IG9sZEhlaWdodDtcblxuICAgIGFuaW1pdChsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudCwgeyBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbiwgcHJvcGVydHk6ICdoZWlnaHQgcGFkZGluZy10b3AgcGFkZGluZy1ib3R0b20nIH0pXG4gICAgICAuZGVmYXVsdCguLi4oc2hvdWxkT3BlbiA/IGV4cGFuc2lvbk9wZW5UcmFuc2l0aW9uIDogZXhwYW5zaW9uT3BlblRyYW5zaXRpb24ucmV2ZXJzZSgpKSlcbiAgICAgIC5wbGF5KCgpID0+IHtcbiAgICAgICAgbGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQuc3R5bGUuZGlzcGxheSA9IG9sZERpc3BsYXk7XG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcblxuICAgIGlmIChsaXN0SXRlbS5leHBhbmRDaGV2cm9uKSB7XG4gICAgICBhbmltaXQobGlzdEl0ZW0uZXhwYW5kQ2hldnJvbiwgeyBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbiwgcHJvcGVydHk6ICd0cmFuc2Zvcm0nIH0pXG4gICAgICAgIC5kZWZhdWx0KC4uLihzaG91bGRPcGVuID8gaWNvbk9wZW5UcmFuc2l0aW9uIDogaWNvbk9wZW5UcmFuc2l0aW9uLnJldmVyc2UoKSkpXG4gICAgICAgIC5wbGF5KCk7XG4gICAgfVxuICB9XG5cbn0iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBMaXN0SXRlbUFuaW1hdG9yLCBTbGlkZUxpc3RJdGVtQW5pbWF0b3IgfSBmcm9tICcuL29ucy1saXN0LWl0ZW0vYW5pbWF0b3IuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbGlzdC1pdGVtJztcbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5saXN0LWl0ZW0nOiAnbGlzdC1pdGVtLS0qJyxcbiAgJy5saXN0LWl0ZW1fX2xlZnQnOiAnbGlzdC1pdGVtLS0qX19sZWZ0JyxcbiAgJy5saXN0LWl0ZW1fX2NlbnRlcic6ICdsaXN0LWl0ZW0tLSpfX2NlbnRlcicsXG4gICcubGlzdC1pdGVtX19yaWdodCc6ICdsaXN0LWl0ZW0tLSpfX3JpZ2h0JyxcbiAgJy5saXN0LWl0ZW1fX2xhYmVsJzogJ2xpc3QtaXRlbS0tKl9fbGFiZWwnLFxuICAnLmxpc3QtaXRlbV9fdGl0bGUnOiAnbGlzdC1pdGVtLS0qX190aXRsZScsXG4gICcubGlzdC1pdGVtX19zdWJ0aXRsZSc6ICdsaXN0LWl0ZW0tLSpfX3N1YnRpdGxlJyxcbiAgJy5saXN0LWl0ZW1fX3RodW1ibmFpbCc6ICdsaXN0LWl0ZW0tLSpfX3RodW1ibmFpbCcsXG4gICcubGlzdC1pdGVtX19pY29uJzogJ2xpc3QtaXRlbS0tKl9faWNvbidcbn07XG5cbmNvbnN0IF9hbmltYXRvckRpY3QgPSB7XG4gICdkZWZhdWx0JzogU2xpZGVMaXN0SXRlbUFuaW1hdG9yLFxuICAnbm9uZSc6IExpc3RJdGVtQW5pbWF0b3Jcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3QtaXRlbVxuICogQGNhdGVnb3J5IGxpc3RcbiAqIEBtb2RpZmllciB0YXBwYWJsZVxuICogICBbZW5dTWFrZSB0aGUgbGlzdCBpdGVtIGNoYW5nZSBhcHBlYXJhbmNlIHdoZW4gaXQncyB0YXBwZWQuIE9uIGlPUyBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSBcInRhcHBhYmxlXCIgYW5kIFwidGFwLWJhY2tncm91bmQtY29sb3JcIiBhdHRyaWJ1dGUgZm9yIGJldHRlciBiZWhhdmlvciB3aGVuIHNjcm9sbGluZy5bL2VuXVxuICogICBbamFd44K/44OD44OX44KE44Kv44Oq44OD44Kv44GX44Gf5pmC44Gr5Yq55p6c44GM6KGo56S644GV44KM44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBjaGV2cm9uXG4gKiAgIFtlbl1EaXNwbGF5IGEgY2hldnJvbiBhdCB0aGUgcmlnaHQgZW5kIG9mIHRoZSBsaXN0IGl0ZW0gYW5kIG1ha2UgaXQgY2hhbmdlIGFwcGVhcmFuY2Ugd2hlbiB0YXBwZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgbG9uZ2RpdmlkZXJcbiAqICAgW2VuXURpc3BsYXlzIGEgbG9uZyBob3Jpem9udGFsIGRpdmlkZXIgYmV0d2VlbiBpdGVtcy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciBub2RpdmlkZXJcbiAqICAgW2VuXVJlbW92ZXMgdGhlIGRpdmlkZXIgYmV0d2VlbiBsaXN0IGl0ZW1zLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGxpc3QgaXRlbS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBlYWNoIGl0ZW0gaW4gYSBsaXN0LiBUaGUgbGlzdCBpdGVtIGlzIGNvbXBvc2VkIG9mIGZvdXIgcGFydHMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgd2l0aCB0aGUgYGxlZnRgLCBgY2VudGVyYCwgYHJpZ2h0YCBhbmQgYGV4cGFuZGFibGUtY29udGVudGAgY2xhc3Nlcy4gVGhlc2UgY2xhc3NlcyBjYW4gYmUgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgbGlzdCBpdGVtcyBpcyBwcm9wZXJseSBhbGlnbmVkLlxuICpcbiAqICAgICBgYGBcbiAqICAgICA8b25zLWxpc3QtaXRlbT5cbiAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+TGVmdDwvZGl2PlxuICogICAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPkNlbnRlcjwvZGl2PlxuICogICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+UmlnaHQ8L2Rpdj5cbiAqICAgICAgIDxkaXYgY2xhc3M9XCJleHBhbmRhYmxlLWNvbnRlbnRcIj5FeHBhbmRhYmxlIGNvbnRlbnQ8L2Rpdj5cbiAqICAgICA8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgYGBgXG4gKlxuICogICAgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIGNsYXNzZXMgKHByZWZpeGVkIHdpdGggYGxpc3QtaXRlbV9fKmApIHRoYXQgaGVscCB3aGVuIHB1dHRpbmcgdGhpbmdzIGxpa2UgaWNvbnMgYW5kIHRodW1ibmFpbHMgaW50byB0aGUgbGlzdCBpdGVtcy5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGlzdFxuICogICBbZW5db25zLWxpc3QgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN044Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1saXN0LWhlYWRlclxuICogICBbZW5db25zLWxpc3QtaGVhZGVyIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbGlzdC1oZWFkZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGNvZGVwZW4geXhjQ3RcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9saXN0XG4gKiBAZXhhbXBsZVxuICogPG9ucy1saXN0LWl0ZW0+XG4gKiAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gKiAgICAgPG9ucy1pY29uIGljb249XCJtZC1mYWNlXCIgY2xhc3M9XCJsaXN0LWl0ZW1fX2ljb25cIj48L29ucy1pY29uPlxuICogICA8L2Rpdj5cbiAqICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgIDxkaXYgY2xhc3M9XCJsaXN0LWl0ZW1fX3RpdGxlXCI+VGl0bGU8L2Rpdj5cbiAqICAgICA8ZGl2IGNsYXNzPVwibGlzdC1pdGVtX19zdWJ0aXRsZVwiPlN1YnRpdGxlPC9kaXY+XG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAqICAgICA8b25zLXN3aXRjaD48L29ucy1zd2l0Y2g+XG4gKiAgIDwvZGl2PlxuICogPC9vbnMtbGlzdC1pdGVtPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0SXRlbUVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBsaXN0IGl0ZW0uWy9lbl1cbiAgICogICBbamFd5ZCE6KaB57Sg44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbG9jay1vbi1kcmFnXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUHJldmVudCB2ZXJ0aWNhbCBzY3JvbGxpbmcgd2hlbiB0aGUgdXNlciBkcmFncyBob3Jpem9udGFsbHkuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL44Go44CB44Om44O844K244O844GM44GT44Gu6KaB57Sg44KS5qiq5pa55ZCR44Gr44OJ44Op44OD44Kw44GX44Gm44GE44KL5pmC44Gr44CB57im5pa55ZCR44Gu44K544Kv44Ot44O844Or44GM6LW344GN44Gq44GE44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsb2NrT25EcmFnXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUHJldmVudCB2ZXJ0aWNhbCBzY3JvbGxpbmcgd2hlbiB0aGUgdXNlciBkcmFncyBob3Jpem9udGFsbHkuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL44Go44CB44Om44O844K244O844GM44GT44Gu6KaB57Sg44KS5qiq5pa55ZCR44Gr44OJ44Op44OD44Kw44GX44Gm44GE44KL5pmC44Gr44CB57im5pa55ZCR44Gu44K544Kv44Ot44O844Or44GM6LW344GN44Gq44GE44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGFwcGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1NYWtlcyB0aGUgZWxlbWVudCByZWFjdCB0byB0YXBzLiBgcHJldmVudC10YXBgIGF0dHJpYnV0ZSBjYW4gYmUgYWRkZWQgdG8gY2hpbGQgZWxlbWVudHMgbGlrZSBidXR0b25zIG9yIGlucHV0cyB0byBwcmV2ZW50IHRoaXMgZWZmZWN0LiBgb25zLSpgIGVsZW1lbnRzIGFyZSBpZ25vcmVkIGJ5IGRlZmF1bHQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB0YXBwYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU1ha2VzIHRoZSBlbGVtZW50IHJlYWN0IHRvIHRhcHMuIGBwcmV2ZW50LXRhcGAgYXR0cmlidXRlIGNhbiBiZSBhZGRlZCB0byBjaGlsZCBlbGVtZW50cyBsaWtlIGJ1dHRvbnMgb3IgaW5wdXRzIHRvIHByZXZlbnQgdGhpcyBlZmZlY3QuIGBvbnMtKmAgZWxlbWVudHMgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB0YXAtYmFja2dyb3VuZC1jb2xvclxuICAgKiBAdHlwZSB7Q29sb3J9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl0gQ2hhbmdlcyB0aGUgYmFja2dyb3VuZCBjb2xvciB3aGVuIHRhcHBlZC4gRm9yIHRoaXMgdG8gd29yaywgdGhlIGF0dHJpYnV0ZSBcInRhcHBhYmxlXCIgbmVlZHMgdG8gYmUgc2V0LiBUaGUgZGVmYXVsdCBjb2xvciBpcyBcIiNkOWQ5ZDlcIi4gSXQgd2lsbCBkaXNwbGF5IGFzIGEgcmlwcGxlIGVmZmVjdCBvbiBBbmRyb2lkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdGFwQmFja2dyb3VuZENvbG9yXG4gICAqIEB0eXBlIHtDb2xvcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXSBDaGFuZ2VzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHdoZW4gdGFwcGVkLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgYXR0cmlidXRlIFwidGFwcGFibGVcIiBuZWVkcyB0byBiZSBzZXQuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIFwiI2Q5ZDlkOVwiLiBJdCB3aWxsIGRpc3BsYXkgYXMgYSByaXBwbGUgZWZmZWN0IG9uIEFuZHJvaWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZXhwYW5kYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU1ha2VzIHRoZSBlbGVtZW50IGFibGUgdG8gYmUgZXhwYW5kZWQgdG8gcmV2ZWFsIGV4dHJhIGNvbnRlbnQuIEZvciB0aGlzIHRvIHdvcmssIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgbXVzdCBiZSBkZWZpbmVkIGluIGBkaXYuZXhwYW5kYWJsZS1jb250ZW50YC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGV4cGFuZGFibGVcbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTWFrZXMgdGhlIGVsZW1lbnQgYWJsZSB0byBiZSBleHBhbmRlZCB0byByZXZlYWwgZXh0cmEgY29udGVudC4gRm9yIHRoaXMgdG8gd29yaywgdGhlIGV4cGFuZGFibGUgY29udGVudCBtdXN0IGJlIGRlZmluZWQgaW4gYGRpdi5leHBhbmRhYmxlLWNvbnRlbnRgLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGV4cGFuZGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9yIGV4cGFuZGFibGUgbGlzdCBpdGVtcywgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGV4cGFuZGFibGUgY29udGVudCBpcyBleHBhbmRlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBleHBhbmRlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZvciBleHBhbmRhYmxlIGxpc3QgaXRlbXMsIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgaXMgZXhwYW5kZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgZXhwYW5kXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Gb3IgZXhwYW5kYWJsZSBsaXN0IGl0ZW1zLCBmaXJlcyB3aGVuIHRoZSBsaXN0IGl0ZW0gaXMgZXhwYW5kZWQgb3IgY29udHJhY3RlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIGV4cGFuZGFibGUgY29udGVudC4gQ2FuIGJlIGVpdGhlciBgXCJkZWZhdWx0XCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgZXhwYW5kYWJsZSBjb250ZW50LiBDYW4gYmUgZWl0aGVyIGBcImRlZmF1bHRcImAgb3IgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSB0aGlzLl91cGRhdGVBbmltYXRvckZhY3RvcnkoKTtcblxuICAgIC8vIEVsZW1lbnRzIGlnbm9yZWQgd2hlbiB0YXBwaW5nXG4gICAgY29uc3QgcmUgPSAvXm9ucy0oPyFjb2wkfHJvdyR8aWYkKS9pO1xuICAgIHRoaXMuX3Nob3VsZElnbm9yZVRhcCA9IGUgPT4gZS5oYXNBdHRyaWJ1dGUoJ3ByZXZlbnQtdGFwJykgfHwgcmUudGVzdChlLnRhZ05hbWUpO1xuXG4gICAgLy8gc2hvdyBhbmQgaGlkZSBmdW5jdGlvbnMgZm9yIFZ1ZSBoaWRhYmxlIG1peGluXG4gICAgdGhpcy5zaG93ID0gdGhpcy5zaG93RXhwYW5zaW9uO1xuICAgIHRoaXMuaGlkZSA9IHRoaXMuaGlkZUV4cGFuc2lvbjtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGlsZXMgdGhlIGxpc3QgaXRlbS5cbiAgICpcbiAgICogVmFyaW91cyBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiB0aGUgYm9keSBvZiBhIGxpc3QgaXRlbTpcbiAgICpcbiAgICogIC0gZGl2LmxlZnQsIGRpdi5yaWdodCwgYW5kIGRpdi5jZW50ZXIgYXJlIGFsbG93ZWQgYXMgZGlyZWN0IGNoaWxkcmVuXG4gICAqICAtIGlmIGRpdi5jZW50ZXIgaXMgbm90IGRlZmluZWQsIGFueXRoaW5nIHRoYXQgaXNuJ3QgZGl2LmxlZnQsIGRpdi5yaWdodCBvciBkaXYuZXhwYW5kYWJsZS1jb250ZW50IHdpbGwgYmUgcHV0IGluIGEgZGl2LmNlbnRlclxuICAgKiAgLSBpZiBkaXYuY2VudGVyIGlzIGRlZmluZWQsIGFueXRoaW5nIHRoYXQgaXNuJ3QgZGl2LmxlZnQsIGRpdi5yaWdodCBvciBkaXYuZXhwYW5kYWJsZS1jb250ZW50IHdpbGwgYmUgaWdub3JlZFxuICAgKiAgLSBpZiBsaXN0IGl0ZW0gaGFzIGV4cGFuZGFibGUgYXR0cmlidXRlOlxuICAgKiAgICAgIC0gZGl2LmV4cGFuZGFibGUtY29udGVudCBpcyBhbGxvd2VkIGFzIGEgZGlyZWN0IGNoaWxkXG4gICAqICAgICAgLSBkaXYudG9wIGlzIGFsbG93ZWQgYXMgZGlyZWN0IGNoaWxkXG4gICAqICAgICAgLSBpZiBkaXYudG9wIGlzIGRlZmluZWQsIGFueXRoaW5nIHRoYXQgaXNuJ3QgZGl2LmV4cGFuZGFibGUtY29udGVudCBzaG91bGQgYmUgaW5zaWRlIGRpdi50b3AgLSBhbnl0aGluZyBlbHNlIHdpbGwgYmUgaWdub3JlZFxuICAgKiAgICAgIC0gaWYgZGl2LnJpZ2h0IGlzIG5vdCBkZWZpbmVkLCBhIGRpdi5yaWdodCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIGRyb3AtZG93biBjaGV2cm9uXG4gICAqXG4gICAqIFNlZSB0aGUgdGVzdHMgZm9yIGV4YW1wbGVzLlxuICAgKi9cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgbGV0IHRvcCwgZXhwYW5kYWJsZUNvbnRlbnQ7XG4gICAgbGV0IHRvcENvbnRlbnQgPSBbXTtcbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGROb2RlcykuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICB0b3BDb250ZW50LnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCd0b3AnKSkge1xuICAgICAgICB0b3AgPSBub2RlO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygnZXhwYW5kYWJsZS1jb250ZW50JykpIHtcbiAgICAgICAgZXhwYW5kYWJsZUNvbnRlbnQgPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9wQ29udGVudC5wdXNoKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlTmFtZSAhPT0gJ09OUy1SSVBQTEUnKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdG9wQ29udGVudCA9IHRvcCA/IEFycmF5LmZyb20odG9wLmNoaWxkTm9kZXMpIDogdG9wQ29udGVudDtcblxuICAgIGxldCBsZWZ0LCByaWdodCwgY2VudGVyO1xuICAgIGNvbnN0IGNlbnRlckNvbnRlbnQgPSBbXTtcbiAgICB0b3BDb250ZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgY2VudGVyQ29udGVudC5wdXNoKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygnbGVmdCcpKSB7XG4gICAgICAgIGxlZnQgPSBub2RlO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygncmlnaHQnKSkge1xuICAgICAgICByaWdodCA9IG5vZGU7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdjZW50ZXInKSkge1xuICAgICAgICBjZW50ZXIgPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2VudGVyQ29udGVudC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdleHBhbmRhYmxlJykpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtLS1leHBhbmRhYmxlJyk7XG5cbiAgICAgIGlmICghdG9wKSB7XG4gICAgICAgIHRvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0b3AuY2xhc3NMaXN0LmFkZCgndG9wJyk7XG4gICAgICB9XG4gICAgICB0b3AuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX190b3AnKTtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodG9wKTtcbiAgICAgIHRoaXMuX3RvcCA9IHRvcDtcblxuICAgICAgaWYgKGV4cGFuZGFibGVDb250ZW50KSB7XG4gICAgICAgIGV4cGFuZGFibGVDb250ZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fZXhwYW5kYWJsZS1jb250ZW50Jyk7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZXhwYW5kYWJsZUNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJpZ2h0KSB7XG4gICAgICAgIHJpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJpZ2h0LmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fcmlnaHQnLCAncmlnaHQnKTtcblxuICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIGEgcHNldWRvLWVsZW1lbnQgZm9yIHRoaXMgY2hldnJvbiwgYXMgd2UgY2Fubm90IGFuaW1hdGUgaXQgdXNpbmdcbiAgICAgICAgLy8gSlMuIFNvLCB3ZSBtYWtlIGEgY2hldnJvbiBzcGFuIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IGNoZXZyb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIGNoZXZyb24uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX19leHBhbmQtY2hldnJvbicpO1xuICAgICAgICByaWdodC5hcHBlbmRDaGlsZChjaGV2cm9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNhc2Ugd2hlcmUgdGhlIGxpc3QgaXRlbSBzaG91bGQgYWxyZWFkeSBzdGFydCBleHBhbmRlZC5cbiAgICAgIC8vIEFkZGluZyB0aGUgY2xhc3MgZWFybHkgc3RvcHMgdGhlIGFuaW1hdGlvbiBmcm9tIHJ1bm5pbmcgYXQgc3RhcnR1cC5cbiAgICAgIGlmICh0aGlzLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtLS1leHBhbmRlZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0b3AgPSB0aGlzO1xuICAgIH1cblxuICAgIGlmICghY2VudGVyKSB7XG4gICAgICBjZW50ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNlbnRlci5jbGFzc0xpc3QuYWRkKCdjZW50ZXInKTtcbiAgICAgIGNlbnRlckNvbnRlbnQuZm9yRWFjaChub2RlID0+IGNlbnRlci5hcHBlbmRDaGlsZChub2RlKSk7XG4gICAgfVxuICAgIGNlbnRlci5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW1fX2NlbnRlcicpO1xuICAgIHRvcC5hcHBlbmRDaGlsZChjZW50ZXIpO1xuXG4gICAgaWYgKGxlZnQpIHtcbiAgICAgIGxlZnQuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX19sZWZ0Jyk7XG4gICAgICB0b3AuYXBwZW5kQ2hpbGQobGVmdCk7XG4gICAgfVxuICAgIGlmIChyaWdodCkge1xuICAgICAgcmlnaHQuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX19yaWdodCcpO1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHJpZ2h0KTtcbiAgICB9XG5cbiAgICB1dGlsLnVwZGF0ZVJpcHBsZSh0aGlzKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93RXhwYW5zaW9uXG4gICAqIEBzaWduYXR1cmUgc2hvd0V4cGFuc2lvbigpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgaWYgdGhlIGVsZW1lbnQgaXMgZXhwYW5kYWJsZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2hvd0V4cGFuc2lvbigpIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVFeHBhbnNpb25cbiAgICogQHNpZ25hdHVyZSBoaWRlRXhwYW5zaW9uKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIGV4cGFuZGFibGUgY29udGVudCBpZiB0aGUgZWxlbWVudCBleHBhbmRhYmxlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBoaWRlRXhwYW5zaW9uKCkge1xuICAgIHRoaXMuZXhwYW5kZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZUV4cGFuc2lvbigpIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gIH1cblxuICBfYW5pbWF0ZUV4cGFuc2lvbigpIHtcbiAgICAvLyBTdG9wcyB0aGUgYW5pbWF0aW9uIGZyb20gcnVubmluZyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgbGlzdCBpdGVtIHNob3VsZCBzdGFydCBhbHJlYWR5IGV4cGFuZGVkXG4gICAgY29uc3QgZXhwYW5kZWRBdFN0YXJ0dXAgPSB0aGlzLmV4cGFuZGVkICYmIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaXN0LWl0ZW0tLWV4cGFuZGVkJyk7XG5cbiAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdleHBhbmRhYmxlJykgfHwgdGhpcy5fZXhwYW5kaW5nIHx8IGV4cGFuZGVkQXRTdGFydHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZXhwYW5kaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGV4cGFuZGVkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9leHBhbmRpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0tLWV4cGFuZGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2xpc3QtaXRlbS0tZXhwYW5kZWQnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3IoKTtcblxuICAgIGlmIChhbmltYXRvci5fYW5pbWF0ZUV4cGFuc2lvbikge1xuICAgICAgYW5pbWF0b3IuX2FuaW1hdGVFeHBhbnNpb24odGhpcywgdGhpcy5leHBhbmRlZCwgZXhwYW5kZWRDYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGFuZGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogTGlzdEl0ZW1BbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdMaXN0SXRlbUFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSB8fCAnZGVmYXVsdCdcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJywgJ3JpcHBsZScsICdhbmltYXRpb24nLCAnZXhwYW5kZWQnXTtcbiAgfVxuXG4gIGdldCBleHBhbmRhYmxlQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcubGlzdC1pdGVtX19leHBhbmRhYmxlLWNvbnRlbnQnKTtcbiAgfVxuXG4gIGdldCBleHBhbmRDaGV2cm9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5saXN0LWl0ZW1fX2V4cGFuZC1jaGV2cm9uJyk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlwcGxlJzpcbiAgICAgICAgdXRpbC51cGRhdGVSaXBwbGUodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gdGhpcy5fdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXhwYW5kZWQnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fYW5pbWF0ZUV4cGFuc2lvbigpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKHRydWUpO1xuICAgICAgdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIHRoaXMudGFwcGVkID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyhmYWxzZSk7XG4gIH1cblxuICBfc2V0dXBMaXN0ZW5lcnMoYWRkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gKGFkZCA/ICdhZGQnIDogJ3JlbW92ZScpICsgJ0V2ZW50TGlzdGVuZXInO1xuICAgIHV0aWxbYWN0aW9uXSh0aGlzLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2gsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB1dGlsW2FjdGlvbl0odGhpcywgJ3RvdWNobW92ZScsIHRoaXMuX29uUmVsZWFzZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hjYW5jZWwnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hlbmQnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hsZWF2ZScsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgdGhpc1thY3Rpb25dKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICB0aGlzW2FjdGlvbl0oJ21vdXNlZG93bicsIHRoaXMuX29uVG91Y2gpO1xuICAgIHRoaXNbYWN0aW9uXSgnbW91c2V1cCcsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgdGhpc1thY3Rpb25dKCdtb3VzZW91dCcsIHRoaXMuX29uUmVsZWFzZSk7XG5cbiAgICBpZiAodGhpcy5fdG9wKSB7XG4gICAgICB0aGlzLl90b3BbYWN0aW9uXSgnY2xpY2snLCB0aGlzLl9vbkNsaWNrVG9wLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNsaWNrVG9wKCkge1xuICAgIGlmICghdGhpcy5fZXhwYW5kaW5nKSB7XG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuc2lvbigpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXhwYW5kJykpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXhwYW5zaW9uJykpOyAvLyBleHBhbnNpb24gaXMgZGVwcmVjYXRlZCBidXQgZW1pdCB0byBhdm9pZCBicmVha2luZyB1c2VyIGNvZGVcbiAgICB9XG4gIH1cblxuICBfb25EcmFnKGV2ZW50KSB7XG4gICAgY29uc3QgZ2VzdHVyZSA9IGV2ZW50Lmdlc3R1cmU7XG4gICAgLy8gUHJldmVudCB2ZXJ0aWNhbCBzY3JvbGxpbmcgaWYgdGhlIHVzZXJzIHBhbnMgbGVmdCBvciByaWdodC5cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2xvY2stb24tZHJhZycpICYmIFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YoZ2VzdHVyZS5kaXJlY3Rpb24pID4gLTEpIHtcbiAgICAgIGdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBfb25Ub3VjaChlKSB7XG4gICAgaWYgKHRoaXMudGFwcGVkIHx8XG4gICAgICAodGhpcyAhPT0gZS50YXJnZXQgJiYgKHRoaXMuX3Nob3VsZElnbm9yZVRhcChlLnRhcmdldCkgfHwgdXRpbC5maW5kUGFyZW50KGUudGFyZ2V0LCB0aGlzLl9zaG91bGRJZ25vcmVUYXAsIHAgPT4gcCA9PT0gdGhpcykpKVxuICAgICkge1xuICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgdGFwXG4gICAgfVxuXG4gICAgdGhpcy50YXBwZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRvdWNoU3R5bGUgPSB7IHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kLWNvbG9yIDAuMHMgbGluZWFyIDAuMDJzLCBib3gtc2hhZG93IDAuMHMgbGluZWFyIDAuMDJzJyB9O1xuXG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCd0YXBwYWJsZScpKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIH1cblxuICAgICAgdG91Y2hTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGFwLWJhY2tncm91bmQtY29sb3InKSB8fCAnI2Q5ZDlkOSc7XG4gICAgICB0b3VjaFN0eWxlLmJveFNoYWRvdyA9IGAwcHggLTFweCAwcHggMHB4ICR7dG91Y2hTdHlsZS5iYWNrZ3JvdW5kQ29sb3J9YDtcbiAgICB9XG5cbiAgICBzdHlsZXIodGhpcywgdG91Y2hTdHlsZSk7XG4gIH1cblxuICBfb25SZWxlYXNlKCkge1xuICAgIHRoaXMudGFwcGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLl9vcmlnaW5hbEJhY2tncm91bmRDb2xvciB8fCAnJztcbiAgICBzdHlsZXIuY2xlYXIodGhpcywgJ3RyYW5zaXRpb24gYm94U2hhZG93Jyk7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhMaXN0SXRlbUVsZW1lbnQsIFsnZXhwYW5kZWQnLCAnZXhwYW5kYWJsZScsICd0YXBwYWJsZScsICdsb2NrLW9uLWRyYWcnXSk7XG51dGlsLmRlZmluZVN0cmluZ1Byb3BlcnRpZXMoTGlzdEl0ZW1FbGVtZW50LCBbJ2FuaW1hdGlvbicsICd0YXAtYmFja2dyb3VuZC1jb2xvciddKTtcblxub25zRWxlbWVudHMuTGlzdEl0ZW0gPSBMaXN0SXRlbUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1saXN0LWl0ZW0nLCBMaXN0SXRlbUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbGlzdCc7XG5jb25zdCBzY2hlbWUgPSB7Jyc6ICdsaXN0LS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3RcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAbW9kaWZpZXIgaW5zZXRcbiAqICAgW2VuXUluc2V0IGxpc3QgdGhhdCBkb2Vzbid0IGNvdmVyIHRoZSB3aG9sZSB3aWR0aCBvZiB0aGUgcGFyZW50LlsvZW5dXG4gKiAgIFtqYV3opqropoHntKDjga7nlLvpnaLjgYTjgaPjgbHjgYTjgavluoPjgYzjgonjgarjgYTjg6rjgrnjg4jjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIG5vYm9yZGVyXG4gKiAgIFtlbl1BIGxpc3Qgd2l0aCBubyBib3JkZXJzIGF0IHRoZSB0b3AgYW5kIGJvdHRvbS5bL2VuXVxuICogICBbamFd44Oq44K544OI44Gu5LiK5LiL44Gu44Oc44O844OA44O844GM54Sh44GE44Oq44K544OI44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ29tcG9uZW50IHRvIGRlZmluZSBhIGxpc3QsIGFuZCB0aGUgY29udGFpbmVyIGZvciBvbnMtbGlzdC1pdGVtKHMpLlsvZW5dXG4gKiAgIFtqYV3jg6rjgrnjg4jjgpLooajnj77jgZnjgovjgZ/jgoHjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgIJvbnMtbGlzdC1pdGVt44Gu44Kz44Oz44OG44OK44Go44GX44Gm5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1saXN0LWl0ZW1cbiAqICAgW2VuXW9ucy1saXN0LWl0ZW0gY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN0LWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWxpc3QtaGVhZGVyXG4gKiAgIFtlbl1vbnMtbGlzdC1oZWFkZXIgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN0LWhlYWRlcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGF6eS1yZXBlYXRcbiAqICAgW2VuXW9ucy1sYXp5LXJlcGVhdCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWxhenktcmVwZWF044Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBjb2RlcGVuIHl4Y0N0XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvbGlzdFxuICogQGV4YW1wbGVcbiAqIDxvbnMtbGlzdD5cbiAqICAgPG9ucy1saXN0LWhlYWRlcj5IZWFkZXIgVGV4dDwvb25zLWxpc3QtaGVhZGVyPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogPC9vbnMtbGlzdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBsaXN0LlsvZW5dXG4gICAqICAgW2phXeODquOCueODiOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb21waWxlKCk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkxpc3QgPSBMaXN0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWxpc3QnLCBMaXN0RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uLy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBJTlBVVF9BVFRSSUJVVEVTID0gW1xuICAnYXV0b2NhcGl0YWxpemUnLFxuICAnYXV0b2NvbXBsZXRlJyxcbiAgJ2F1dG9jb3JyZWN0JyxcbiAgJ2F1dG9mb2N1cycsXG4gICdkaXNhYmxlZCcsXG4gICdpbnB1dG1vZGUnLFxuICAnbWF4JyxcbiAgJ21heGxlbmd0aCcsXG4gICdtaW4nLFxuICAnbWlubGVuZ3RoJyxcbiAgJ25hbWUnLFxuICAncGF0dGVybicsXG4gICdwbGFjZWhvbGRlcicsXG4gICdyZWFkb25seScsXG4gICdyZXF1aXJlZCcsXG4gICdzaXplJyxcbiAgJ3NwZWxsY2hlY2snLFxuICAnc3RlcCcsXG4gICd2YWxpZGF0b3InLFxuICAndmFsdWUnXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlSW5wdXRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIF91cGRhdGUoKSB7fSAvLyBPcHRpb25hbGx5IGltcGxlbWVudGVkXG5cbiAgZ2V0IF9zY2hlbWUoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIGdldCBfdGVtcGxhdGUoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIGdldCB0eXBlKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VJbnB1dEVsZW1lbnQpIHtcbiAgICAgIHV0aWwudGhyb3dBYnN0cmFjdCgpO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICAgIHRoaXMuX2JvdW5kRGVsZWdhdGVFdmVudCA9IHRoaXMuX2RlbGVnYXRlRXZlbnQuYmluZCh0aGlzKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuX2RlZmF1bHRDbGFzc05hbWUgJiYgdGhpcy5jbGFzc0xpc3QuYWRkKHRoaXMuX2RlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh1dGlsLmNyZWF0ZUZyYWdtZW50KHRoaXMuX3RlbXBsYXRlKSk7XG5cbiAgICB0aGlzLl9zZXRJbnB1dElkKCk7XG5cbiAgICB0aGlzLl91cGRhdGVCb3VuZEF0dHJpYnV0ZXMoKTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIF91cGRhdGVCb3VuZEF0dHJpYnV0ZXMoKSB7XG4gICAgSU5QVVRfQVRUUklCVVRFUy5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKGF0dHIpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0LnNldEF0dHJpYnV0ZShhdHRyLCB0aGlzLmdldEF0dHJpYnV0ZShhdHRyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIF9kZWxlZ2F0ZUV2ZW50KGV2ZW50KSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChldmVudC50eXBlLCB7XG4gICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoZSk7XG4gIH1cblxuICBfc2V0SW5wdXRJZCgpIHtcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2lucHV0LWlkJykpIHtcbiAgICAgIHRoaXMuX2lucHV0LmlkID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lucHV0LWlkJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBfaW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXQgPT09IG51bGxcbiAgICAgID8gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJylcbiAgICAgIDogdGhpcy5faW5wdXQudmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHZhbCA9IHZhbC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm91bmREZWxlZ2F0ZUV2ZW50KTtcbiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9ib3VuZERlbGVnYXRlRXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm91bmREZWxlZ2F0ZUV2ZW50KTtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9ib3VuZERlbGVnYXRlRXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnaW5wdXQtaWQnLCAnY2xhc3MnLCAuLi5JTlBVVF9BVFRSSUJVVEVTXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgdGhpcy5fc2NoZW1lKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5wdXQtaWQnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fc2V0SW5wdXRJZCgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIHRoaXMuX2RlZmF1bHRDbGFzc05hbWUsIHRoaXMuX3NjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChJTlBVVF9BVFRSSUJVVEVTLmluZGV4T2YobmFtZSkgPj0gMCkge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZUJvdW5kQXR0cmlidXRlcygpKTtcbiAgICB9XG4gIH1cblxuICBibHVyKCkge1xuICAgIHRoaXMuX2lucHV0LmJsdXIoKTtcbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuX2lucHV0LmZvY3VzKCk7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhCYXNlSW5wdXRFbGVtZW50LCBbJ2Rpc2FibGVkJ10pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VJbnB1dEVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtaW5wdXQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy50ZXh0LWlucHV0JzogJ3RleHQtaW5wdXQtLSonLFxuICAnLnRleHQtaW5wdXRfX2xhYmVsJzogJ3RleHQtaW5wdXQtLSpfX2xhYmVsJ1xufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtaW5wdXRcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICBbZW5dRGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gaW5wdXQuWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciB1bmRlcmJhclxuICogIFtlbl1EaXNwbGF5cyBhIGhvcml6b250YWwgbGluZSB1bmRlcm5lYXRoIGEgdGV4dCBpbnB1dC5bL2VuXVxuICogIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIHRyYW5zcGFyZW50XG4gKiAgW2VuXURpc3BsYXlzIGEgdHJhbnNwYXJlbnQgaW5wdXQuIFdvcmtzIGZvciBNYXRlcmlhbCBEZXNpZ24uWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1cbiAqICAgIEFuIGlucHV0IGVsZW1lbnQuIFRoZSBgdHlwZWAgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgaW5wdXQgdHlwZS4gQWxsIHRleHQgaW5wdXQgdHlwZXMgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiAgICBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gaW5wdXQgb24gQW5kcm9pZCBkZXZpY2VzLlxuICpcbiAqICAgIE1vc3QgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBhIG5vcm1hbCBgPGlucHV0PmAgZWxlbWVudCBjYW4gYWxzbyBiZSB1c2VkIG9uIHRoZSBgPG9ucy1pbnB1dD5gIGVsZW1lbnQuXG4gKiAgWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9pbnB1dFxuICogQHNlZWFsc28gb25zLWNoZWNrYm94XG4gKiAgIFtlbl1UaGUgYDxvbnMtY2hlY2tib3g+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIGNoZWNrYm94LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhZGlvXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhZGlvIGJ1dHRvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1yYW5nZVxuICogICBbZW5dVGhlIGA8b25zLXJhbmdlPmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSByYW5nZSBzbGlkZXIuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtc3dpdGNoXG4gKiAgIFtlbl1UaGUgYDxvbnMtc3dpdGNoPmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBkcmFnZ2FibGUgdG9nZ2xlIHN3aXRjaC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zZWxlY3RcbiAqICAgW2VuXVRoZSBgPG9ucy1zZWxlY3Q+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHNlbGVjdCBib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI21vZGlmaWVycyBbZW5dTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBgbW9kaWZpZXJgIGF0dHJpYnV0ZVsvZW5dW2phXW1vZGlmaWVy5bGe5oCn44Gu5L2/44GE5pa5Wy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWlucHV0IHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBmbG9hdD48L29ucy1pbnB1dD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5wdXRFbGVtZW50IGV4dGVuZHMgQmFzZUlucHV0RWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JvdW5kT25JbnB1dCA9IHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2JvdW5kT25Gb2N1c2luID0gdGhpcy5fdXBkYXRlLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKiBJbmhlcml0ZWQgcHJvcHMgKi9cblxuICBfdXBkYXRlKCkge1xuICAgIHRoaXMuX3VwZGF0ZUxhYmVsKCk7XG4gICAgdGhpcy5fdXBkYXRlTGFiZWxDbGFzcygpO1xuICB9XG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHNjaGVtZTtcbiAgfVxuXG4gIGdldCBfdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxpbnB1dCB0eXBlPVwiJHt0aGlzLnR5cGV9XCIgY2xhc3M9XCJ0ZXh0LWlucHV0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtaW5wdXRfX2xhYmVsXCI+PC9zcGFuPlxuICAgIGA7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgICByZXR1cm4gKFsnY2hlY2tib3gnLCAncmFkaW8nXS5pbmRleE9mKHR5cGUpIDwgMCkgJiYgdHlwZSB8fCAndGV4dCc7XG4gIH1cblxuICBzZXQgdHlwZSh2YWx1ZSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0eXBlJywgdmFsdWUpO1xuICB9XG5cbiAgLyogT3duIHByb3BzICovXG5cbiAgX3VwZGF0ZUxhYmVsKCkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJykgfHwgJyc7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlbHBlci50ZXh0Q29udGVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuX2hlbHBlci50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oZWxwZXIuaW5uZXJUZXh0ID0gbGFiZWw7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUxhYmVsQ2xhc3MoKSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLl9oZWxwZXIuY2xhc3NMaXN0LnJlbW92ZSgndGV4dC1pbnB1dC0tbWF0ZXJpYWxfX2xhYmVsLS1hY3RpdmUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGVscGVyLmNsYXNzTGlzdC5hZGQoJ3RleHQtaW5wdXQtLW1hdGVyaWFsX19sYWJlbC0tYWN0aXZlJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9oZWxwZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcignc3BhbicpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX2JvdW5kT25JbnB1dCk7XG4gICAgICB0aGlzLl9pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5fYm91bmRPbkZvY3VzaW4pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0eXBlJyk7XG4gICAgaWYgKFsnY2hlY2tib3gnLCAncmFkaW8nXS5pbmRleE9mKHR5cGUpID49IDApIHtcbiAgICAgIHV0aWwud2FybihgV2FybjogPG9ucy1pbnB1dCB0eXBlPVwiJHt0eXBlfVwiPiBpcyBkZXByZWNhdGVkIHNpbmNlIHYyLjQuMC4gVXNlIDxvbnMtJHt0eXBlfT4gaW5zdGVhZC5gKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fYm91bmRPbklucHV0KTtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCB0aGlzLl9ib3VuZE9uRm9jdXNpbik7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWy4uLnN1cGVyLm9ic2VydmVkQXR0cmlidXRlcywgJ3R5cGUnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICd0eXBlJzpcbiAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2lucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsIHRoaXMudHlwZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwbGFjZWhvbGRlclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUGxhY2Vob2xkZXIgdGV4dC4gSW4gTWF0ZXJpYWwgRGVzaWduLCB0aGlzIHBsYWNlaG9sZGVyIHdpbGwgYmUgYSBmbG9hdGluZyBsYWJlbC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBmbG9hdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgcGxhY2Vob2xkZXIgd2lsbCBiZSBhbmltYXRlZCBpbiBNYXRlcmlhbCBEZXNpZ24uWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzoqK3lrprjgZXjgozjgZ/mmYLjgIHjg6njg5njg6vjga/jgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgZnjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGZsb2F0XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIGFuaW1hdGVkIGluIE1hdGVyaWFsIERlc2lnbi5bL2VuXVxuICAgKiAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+aZguOAgeODqeODmeODq+OBr+OCouODi+ODoeODvOOCt+ODp+ODs+OBmeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHR5cGVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICAgIFNwZWNpZnkgdGhlIGlucHV0IHR5cGUuIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIFwidHlwZVwiIGF0dHJpYnV0ZSBmb3Igbm9ybWFsIGlucHV0cy4gSXQgZXhwZWN0cyBzdHJpY3QgdGV4dCB0eXBlcyBzdWNoIGFzIGB0ZXh0YCwgYHBhc3N3b3JkYCwgZXRjLiBGb3IgY2hlY2tib3gsIHJhZGlvIGJ1dHRvbiwgc2VsZWN0IG9yIHJhbmdlLCBwbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuXG4gICAqXG4gICAqICAgIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBbTUROXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjYXR0ci10eXBlKSBmb3IgYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcy4gRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSBhbmQgYnJvd3NlciB2ZXJzaW9uIHNvbWUgb2YgdGhlc2UgbWlnaHQgbm90IHdvcmsuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGlucHV0LWlkXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIFwiaWRcIiBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnB1dC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgaW5wdXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBpbnB1dC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhJbnB1dEVsZW1lbnQsIFsnZmxvYXQnXSk7XG5cbm9uc0VsZW1lbnRzLklucHV0ID0gSW5wdXRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtaW5wdXQnLCBJbnB1dEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBCYXNlSW5wdXRFbGVtZW50IGZyb20gJy4vYmFzZS1pbnB1dC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uLy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUNoZWNrYm94RWxlbWVudCBleHRlbmRzIEJhc2VJbnB1dEVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNoZWNrYm94RWxlbWVudCkge1xuICAgICAgdXRpbC50aHJvd0Fic3RyYWN0KCk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCdjaGVja2VkJywgbnVsbCwgdGhpcy5nZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiBJbmhlcml0ZWQgcHJvcHMgKi9cblxuICBnZXQgX3RlbXBsYXRlKCkge1xuICAgIHJldHVybiBgXG4gICAgICA8aW5wdXQgdHlwZT1cIiR7dGhpcy50eXBlfVwiIGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9faW5wdXRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9fY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgIGA7XG4gIH1cblxuICAvKiBPd24gcHJvcHMgKi9cblxuICBnZXQgX2hlbHBlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XG4gIH1cblxuICBnZXQgY2hlY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXQuY2hlY2tlZDtcbiAgfVxuXG4gIHNldCBjaGVja2VkKHZhbCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9pbnB1dC5jaGVja2VkID0gdmFsO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsICdjaGVja2VkJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGN1cnJlbnQgIT09IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VDaGVja2JveEVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtY2hlY2tib3guanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcuY2hlY2tib3gnOiAnY2hlY2tib3gtLSonLFxuICAnLmNoZWNrYm94X19pbnB1dCc6ICdjaGVja2JveC0tKl9faW5wdXQnLFxuICAnLmNoZWNrYm94X19jaGVja21hcmsnOiAnY2hlY2tib3gtLSpfX2NoZWNrbWFyaydcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWNoZWNrYm94XG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgW2VuXURpc3BsYXlzIGEgTWF0ZXJpYWwgRGVzaWduIGNoZWNrYm94LlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgbm9ib3JkZXJcbiAqICBbZW5daU9TIGJvcmRlcmxlc3MgY2hlY2tib3guWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1cbiAqICAgIEEgY2hlY2tib3ggZWxlbWVudC4gVGhlIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVuZGVyIGFzIGEgTWF0ZXJpYWwgRGVzaWduIGNoZWNrYm94IG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIj5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtY2hlY2tib3g+YCBlbGVtZW50LlxuICogIFsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvY2hlY2tib3hcbiAqIEBzZWVhbHNvIG9ucy1zd2l0Y2hcbiAqICAgW2VuXVRoZSBgPG9ucy1zd2l0Y2g+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIGRyYWdnYWJsZSB0b2dnbGUgc3dpdGNoLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhZGlvXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhZGlvIGJ1dHRvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLWlucHV0PmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXNlYXJjaC1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLXNlYXJjaC1pbnB1dD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgc2VhcmNoIGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhbmdlXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFuZ2U+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhbmdlIHNsaWRlci5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zZWxlY3RcbiAqICAgW2VuXVRoZSBgPG9ucy1zZWxlY3Q+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHNlbGVjdCBib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI21vZGlmaWVycyBbZW5dTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBgbW9kaWZpZXJgIGF0dHJpYnV0ZVsvZW5dW2phXW1vZGlmaWVy5bGe5oCn44Gu5L2/44GE5pa5Wy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWNoZWNrYm94IGNoZWNrZWQ+PC9vbnMtY2hlY2tib3g+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoZWNrYm94RWxlbWVudCBleHRlbmRzIEJhc2VDaGVja2JveEVsZW1lbnQge1xuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdjaGVja2JveCc7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2NoZWNrYm94JztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGlucHV0LWlkXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIFwiaWRcIiBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjaGVja2JveC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNoZWNrZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBjaGVja2JveCBpcyBjaGVja2VkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgY2hlY2tib3guWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBjaGVja2JveC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxub25zRWxlbWVudHMuQ2hlY2tib3ggPSBDaGVja2JveEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1jaGVja2JveCcsIENoZWNrYm94RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUNoZWNrYm94RWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1jaGVja2JveC5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5yYWRpby1idXR0b24nOiAncmFkaW8tYnV0dG9uLS0qJyxcbiAgJy5yYWRpby1idXR0b25fX2lucHV0JzogJ3JhZGlvLWJ1dHRvbi0tKl9faW5wdXQnLFxuICAnLnJhZGlvLWJ1dHRvbl9fY2hlY2ttYXJrJzogJ3JhZGlvLWJ1dHRvbi0tKl9fY2hlY2ttYXJrJ1xufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtcmFkaW9cbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICBbZW5dRGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gcmFkaW8gYnV0dG9uLlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBBIHJhZGlvIGJ1dHRvbiBlbGVtZW50LiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gcmFkaW8gYnV0dG9uIG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxpbnB1dCB0eXBlPVwicmFkaW9cIj5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50LlxuICogIFsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvcmFkaW9cbiAqIEBzZWVhbHNvIG9ucy1zZWxlY3RcbiAqICAgW2VuXVRoZSBgPG9ucy1zZWxlY3Q+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHNlbGVjdCBib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtY2hlY2tib3hcbiAqICAgW2VuXVRoZSBgPG9ucy1jaGVja2JveD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgY2hlY2tib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtc3dpdGNoXG4gKiAgIFtlbl1UaGUgYDxvbnMtc3dpdGNoPmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBkcmFnZ2FibGUgdG9nZ2xlIHN3aXRjaC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLWlucHV0PmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXNlYXJjaC1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLXNlYXJjaC1pbnB1dD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgc2VhcmNoIGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhbmdlXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFuZ2U+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhbmdlIHNsaWRlci5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcmFkaW8gY2hlY2tlZD48L29ucy1yYWRpbz5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaW9FbGVtZW50IGV4dGVuZHMgQmFzZUNoZWNrYm94RWxlbWVudCB7XG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHNjaGVtZTtcbiAgfVxuXG4gIGdldCBfZGVmYXVsdENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ3JhZGlvLWJ1dHRvbic7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3JhZGlvJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGlucHV0LWlkXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIFwiaWRcIiBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSByYWRpbyBidXR0b24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjaGVja2VkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgcmFkaW8gYnV0dG9uIGlzIGNoZWNrZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSByYWRpbyBidXR0b24gaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgcmFkaW8gYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJsdXJcbiAgICogQHNpZ25hdHVyZSBibHVyKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJlbW92ZXMgZm9jdXMgZnJvbSB0aGUgcmFkaW8gYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xufVxuXG5vbnNFbGVtZW50cy5SYWRpbyA9IFJhZGlvRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXJhZGlvJywgUmFkaW9FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlSW5wdXRFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWlucHV0LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnLnNlYXJjaC1pbnB1dCc6ICdzZWFyY2gtaW5wdXQtLSonXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zZWFyY2gtaW5wdXRcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICBbZW5dRGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VhcmNoIGlucHV0LlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBBIHNlYXJjaCBpbnB1dCBlbGVtZW50LiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VhcmNoIGlucHV0IG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxpbnB1dD5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtc2VhcmNoLWlucHV0PmAgZWxlbWVudC5cbiAqICBbL2VuXVxuICogIFtqYV1bL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NlYXJjaC1pbnB1dFxuICogQHNlZWFsc28gb25zLWlucHV0XG4gKiAgIFtlbl1UaGUgYDxvbnMtaW5wdXQ+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHRleHQgaW5wdXQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtcmFuZ2VcbiAqICAgW2VuXVRoZSBgPG9ucy1yYW5nZT5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgcmFuZ2Ugc2xpZGVyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXN3aXRjaFxuICogICBbZW5dVGhlIGA8b25zLXN3aXRjaD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgZHJhZ2dhYmxlIHRvZ2dsZSBzd2l0Y2guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtc2VsZWN0XG4gKiAgIFtlbl1UaGUgYDxvbnMtc2VsZWN0PmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBzZWxlY3QgYm94LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLWNoZWNrYm94XG4gKiAgIFtlbl1UaGUgYDxvbnMtY2hlY2tib3g+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIGNoZWNrYm94LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhZGlvXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhZGlvIGJ1dHRvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc2VhcmNoLWlucHV0IHBsYWNlaG9sZGVyPVwiU2VhcmNoXCI+PC9vbnMtc2VhcmNoLWlucHV0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2hJbnB1dEVsZW1lbnQgZXh0ZW5kcyBCYXNlSW5wdXRFbGVtZW50IHtcblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF90ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICAgPGlucHV0IHR5cGU9XCIke3RoaXMudHlwZX1cIiBjbGFzcz1cInNlYXJjaC1pbnB1dFwiPlxuICAgIGA7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3NlYXJjaCc7XG4gIH1cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpbnB1dC1pZFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBcImlkXCIgYXR0cmlidXRlIG9mIHRoZSBpbm5lciBgPGlucHV0PmAgZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB1c2luZyBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZWxlbWVudHMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW5wdXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGlucHV0IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBmb2N1c1xuICAgKiBAc2lnbmF0dXJlIGZvY3VzKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZvY3VzZXMgdGhlIGlucHV0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJsdXJcbiAgICogQHNpZ25hdHVyZSBibHVyKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJlbW92ZXMgZm9jdXMgZnJvbSB0aGUgaW5wdXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG59XG5cbm9uc0VsZW1lbnRzLlNlYXJjaElucHV0ID0gU2VhcmNoSW5wdXRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc2VhcmNoLWlucHV0JywgU2VhcmNoSW5wdXRFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RhbEFuaW1hdG9yIGV4dGVuZHMgQmFzZUFuaW1hdG9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGltaW5nXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmR1cmF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1vZGFsXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KG1vZGFsLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IE1vZGFsQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbi8qKlxuICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZhZGVNb2RhbEFuaW1hdG9yIGV4dGVuZHMgTW9kYWxBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdsaW5lYXInLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhtb2RhbCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0KG1vZGFsLCB0aGlzLmRlZilcbiAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSlcbiAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSlcbiAgICAgIC5wbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdChtb2RhbCwgdGhpcy5kZWYpXG4gICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pXG4gICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pXG4gICAgICAucGxheSgpO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IE1vZGFsQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbi8qKlxuICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBtb2RhbC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZ0TW9kYWxBbmltYXRvciBleHRlbmRzIE1vZGFsQW5pbWF0b3JcbntcbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoIC4xLCAuNywgLjEsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3cobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdChtb2RhbCwgdGhpcy5kZWYpXG4gICAgICAuZGVmYXVsdChcbiAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKScgfSxcbiAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfVxuICAgICAgKVxuICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KVxuICAgICAgLnBsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShtb2RhbCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0KG1vZGFsLCB0aGlzLmRlZilcbiAgICAgIC5kZWZhdWx0KFxuICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9LFxuICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyB9XG4gICAgICApXG4gICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pXG4gICAgICAucGxheSgpO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgTW9kYWxBbmltYXRvciBmcm9tICcuL29ucy1tb2RhbC9hbmltYXRvci5qcyc7XG5pbXBvcnQgRmFkZU1vZGFsQW5pbWF0b3IgZnJvbSAnLi9vbnMtbW9kYWwvZmFkZS1hbmltYXRvci5qcyc7XG5pbXBvcnQgTGlmdE1vZGFsQW5pbWF0b3IgZnJvbSAnLi9vbnMtbW9kYWwvbGlmdC1hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdtb2RhbC0tKicsXG4gICdtb2RhbF9fY29udGVudCc6ICdtb2RhbC0tKl9fY29udGVudCdcbn07XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbW9kYWwnO1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICAnZGVmYXVsdCc6IE1vZGFsQW5pbWF0b3IsXG4gICdmYWRlJzogRmFkZU1vZGFsQW5pbWF0b3IsXG4gICdsaWZ0JzogTGlmdE1vZGFsQW5pbWF0b3IsXG4gICdub25lJzogTW9kYWxBbmltYXRvclxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtbW9kYWxcbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgTW9kYWwgY29tcG9uZW50IHRoYXQgbWFza3MgY3VycmVudCBzY3JlZW4uIFVuZGVybHlpbmcgY29tcG9uZW50cyBhcmUgbm90IHN1YmplY3QgdG8gYW55IGV2ZW50cyB3aGlsZSB0aGUgbW9kYWwgY29tcG9uZW50IGlzIHNob3duLlxuICpcbiAqICAgICBUaGlzIGNvbXBvbmVudCBjYW4gYmUgdXNlZCB0byBibG9jayB1c2VyIGlucHV0IHdoaWxlIHNvbWUgb3BlcmF0aW9uIGlzIHJ1bm5pbmcgb3IgdG8gc2hvdyBzb21lIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg55S76Z2i5YWo5L2T44KS44Oe44K544Kv44GZ44KL44Oi44O844OA44Or55So44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CC5LiL5YG044Gr44GC44KL44Kz44Oz44Od44O844ON44Oz44OI44Gv44CBXG4gKiAgICAg44Oi44O844OA44Or44GM6KGo56S644GV44KM44Gm44GE44KL6ZaT44Gv44Kk44OZ44Oz44OI6YCa55+l44GM6KGM44KP44KM44G+44Gb44KT44CCXG4gKiAgIFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtZGlhbG9nXG4gKiAgIFtlbl1UaGUgYDxvbnMtZGlhbG9nPmAgY29tcG9uZW50IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG1vZGFsIGRpYWxvZy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIGRldklnXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9yZWZlcmVuY2UvbW9kYWxcbiAqIEBleGFtcGxlXG4gKiA8b25zLW1vZGFsIGlkPVwibW9kYWxcIj5cbiAqICAgTW9kYWwgY29udGVudFxuICogPC9vbnMtbW9kYWw+XG4gKiA8c2NyaXB0PlxuICogICB2YXIgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwnKTtcbiAqICAgbW9kYWwuc2hvdygpO1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGFsRWxlbWVudCBleHRlbmRzIEJhc2VEaWFsb2dFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZXNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgbW9kYWwgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqIFtqYV3jg6Ljg7zjg4Djg6vjgYzooajnpLrjgZXjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubW9kYWxcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIHRvIHN0b3AgdGhlIG1vZGFsIGZyb20gYmVpbmcgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1vZGFsIGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiBbamFd44Oi44O844OA44Or44GM6KGo56S644GV44KM44Gf55u05b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm1vZGFsXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwcmVoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIG1vZGFsIGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44Oi44O844OA44Or44GM6Zqg44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm1vZGFsXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBtb2RhbCBmcm9tIGJlaW5nIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHjg4DjgqTjgqLjg63jgrDjga7pnZ7ooajnpLrjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgbW9kYWwgaXMgaGlkZGVuLlsvZW5dXG4gICAqIFtqYV3jg6Ljg7zjg4Djg6vjgYzpmqDjgozjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubW9kYWxcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIG1vZGFsLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAsIGBcImZhZGVcImAgb3IgYFwibGlmdFwiYC5bL2VuXVxuICAgKiAgW2phXeODouODvOODgOODq+OCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwi44KC44GX44GP44GvXCJmYWRlXCIsXCJsaWZ0XCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIDxjb2RlPntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPlsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgbW9kYWwgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2RlZmF1bHREQkIgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IF9hbmltYXRvckRpY3QsXG4gICAgICBiYXNlQ2xhc3M6IE1vZGFsQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnTW9kYWxBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIF9jb21waWxlKCkge1xuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLnN0eWxlLnpJbmRleCA9IDEwMDAxO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5tb2RhbF9fY29udGVudCcpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ21vZGFsX19jb250ZW50Jyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgY29udGVudC5pbnNlcnRCZWZvcmUobm9kZSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgX3RvZ2dsZVN0eWxlKHNob3VsZFNob3cpIHtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSBzaG91bGRTaG93ID8gJ3RhYmxlJyA6ICdub25lJztcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdyhbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcIm5vbmVcImAgYW5kIGBcImZhZGVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwiZmFkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgbW9kYWwgaGFzIGJlZW4gcmV2ZWFsZWQuWy9lbl1cbiAgICogICBbamFd44Oi44O844OA44Or44GM6KGo56S644GV44KM57WC44KP44Gj44Gf5b6M44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgbW9kYWwuWy9lbl1cbiAgICogICBbamFd44Oi44O844OA44Or44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGRpc3BsYXllZCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwibm9uZVwiYCBhbmQgYFwiZmFkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJmYWRlXCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBtb2RhbCBoYXMgYmVlbiByZXZlYWxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg6Ljg7zjg4Djg6vjgYzooajnpLrjgZXjgozntYLjgo/jgaPjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIG1vZGFsIHZpc2liaWxpdHkuWy9lbl1cbiAgICogICBbamFd44Oi44O844OA44Or44Gu6KGo56S644KS5YiH44KK5pu/44GI44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJmYWRlXCJgLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwiLCBcImZhZGVcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIG1vZGFsIGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODouODvOODgOODq+OBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1IaWRlIG1vZGFsLlsvZW5dXG4gICAqICAgW2phXeODouODvOODgOODq+OCkumdnuihqOekuuOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kYWxBbmltYXRvcikpIHtcbiAgICAgIHV0aWwudGhyb3dBbmltYXRvcignTW9kYWwnKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IE1vZGFsQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIE1vZGFsQW5pbWF0b3I7XG4gIH1cbn1cblxub25zRWxlbWVudHMuTW9kYWwgPSBNb2RhbEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1tb2RhbCcsIE1vZGFsRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4uLy4uL29ucy9nZXN0dXJlLWRldGVjdG9yLmpzJztcblxuY29uc3Qgd2lkdGhUb1B4ID0gKHdpZHRoKSA9PiB7XG4gIGNvbnN0IFt2YWx1ZSwgcHhdID0gW3BhcnNlSW50KHdpZHRoLCAxMCksIC9weC8udGVzdCh3aWR0aCldO1xuICByZXR1cm4gcHggPyB2YWx1ZSA6IE1hdGgucm91bmQoZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAqIHZhbHVlIC8gMTAwKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXBlUmV2ZWFsIHtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAnZWxlbWVudCBpZ25vcmVTd2lwZSBpc0luaXRpYWxTdGF0ZSBvbkRyYWdDYWxsYmFjayBzd2lwZU1heCBzd2lwZU1pbiBzd2lwZU1pZCdcbiAgICAgIC5zcGxpdCgvXFxzKy8pLmZvckVhY2goa2V5ID0+IHRoaXNba2V5XSA9IHBhcmFtc1trZXldKTtcblxuICAgIHRoaXMuZWxlbWVudEhhbmRsZXIgPSBwYXJhbXMuZWxlbWVudEhhbmRsZXIgfHwgcGFyYW1zLmVsZW1lbnQ7XG4gICAgdGhpcy5nZXRUaHJlc2hvbGQgPSBwYXJhbXMuZ2V0VGhyZXNob2xkIHx8ICgoKSA9PiAuNSk7XG4gICAgdGhpcy5nZXRTaWRlID0gcGFyYW1zLmdldFNpZGUgfHwgKCgpID0+ICdsZWZ0Jyk7XG5cbiAgICB0aGlzLmhhbmRsZUdlc3R1cmUgPSB0aGlzLmhhbmRsZUdlc3R1cmUuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX3Nob3VsZEZpeFNjcm9sbCA9IHV0aWwuZ2xvYmFscy5hY3R1YWxNb2JpbGVPUyA9PT0gJ2lvcyc7XG4gIH1cblxuICB1cGRhdGUoc3dpcGVhYmxlID0gdGhpcy5lbGVtZW50Lmhhc0F0dHJpYnV0ZSgnc3dpcGVhYmxlJykpIHtcbiAgICBpZiAoIXRoaXMuZ2VzdHVyZURldGVjdG9yKSB7XG4gICAgICB0aGlzLmdlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcy5lbGVtZW50SGFuZGxlciwgeyBkcmFnTWluRGlzdGFuY2U6IDEsIHBhc3NpdmU6ICF0aGlzLl9zaG91bGRGaXhTY3JvbGwgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gc3dpcGVhYmxlID8gJ29uJyA6ICdvZmYnO1xuICAgIHRoaXMuZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWcgZHJhZ3N0YXJ0IGRyYWdlbmQnLCB0aGlzLmhhbmRsZUdlc3R1cmUpO1xuICB9XG5cbiAgaGFuZGxlR2VzdHVyZShlKSB7XG4gICAgaWYgKGUuZ2VzdHVyZSkge1xuICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdzdGFydCcpIHtcbiAgICAgICAgdGhpcy5vbkRyYWdTdGFydChlKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lnbm9yZURyYWcpIHtcbiAgICAgICAgZS50eXBlID09PSAnZHJhZ2VuZCcgPyB0aGlzLm9uRHJhZ0VuZChlKSA6IHRoaXMub25EcmFnKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50KSB7XG4gICAgY29uc3QgZ2V0RGlzdGFuY2UgPSAoKSA9PiB0aGlzLmdldFNpZGUoKSA9PT0gJ2xlZnQnID8gZXZlbnQuZ2VzdHVyZS5jZW50ZXIuY2xpZW50WCA6IHdpbmRvdy5pbm5lcldpZHRoIC0gZXZlbnQuZ2VzdHVyZS5jZW50ZXIuY2xpZW50WDtcbiAgICB0aGlzLl9pZ25vcmVEcmFnID0gZXZlbnQuY29uc3VtZWQgfHwgIXV0aWwuaXNWYWxpZEdlc3R1cmUoZXZlbnQpIHx8IHRoaXMuaWdub3JlU3dpcGUoZXZlbnQsIGdldERpc3RhbmNlKCkpO1xuXG4gICAgaWYgKCF0aGlzLl9pZ25vcmVEcmFnKSB7XG4gICAgICBldmVudC5jb25zdW1lICYmIGV2ZW50LmNvbnN1bWUoKTtcbiAgICAgIGV2ZW50LmNvbnN1bWVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aFRvUHgodGhpcy5lbGVtZW50LnN0eWxlLndpZHRoIHx8ICcxMDAlJyk7XG4gICAgICB0aGlzLl9zdGFydERpc3RhbmNlID0gdGhpcy5fZGlzdGFuY2UgPSAoISh0aGlzLmlzSW5pdGlhbFN0YXRlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHx8IHRoaXMuaXNJbml0aWFsU3RhdGUoKSkgPyAwIDogdGhpcy5fd2lkdGg7XG5cbiAgICAgIHV0aWwuaW9zUHJldmVudFNjcm9sbCh0aGlzLmdlc3R1cmVEZXRlY3Rvcik7XG4gICAgfVxuICB9XG5cbiAgb25EcmFnKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBkZWx0YSA9IHRoaXMuZ2V0U2lkZSgpID09PSAnbGVmdCcgPyBldmVudC5nZXN0dXJlLmRlbHRhWCA6IC1ldmVudC5nZXN0dXJlLmRlbHRhWDtcbiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuX3dpZHRoLCB0aGlzLl9zdGFydERpc3RhbmNlICsgZGVsdGEpKTtcbiAgICBpZiAoZGlzdGFuY2UgIT09IHRoaXMuX2Rpc3RhbmNlKSB7XG4gICAgICB0aGlzLl9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgdGhpcy5zd2lwZU1pZCh0aGlzLl9kaXN0YW5jZSwgdGhpcy5fd2lkdGgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ0VuZChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gZXZlbnQuZ2VzdHVyZS5pbnRlcmltRGlyZWN0aW9uO1xuICAgIGNvbnN0IGlzU3dpcGVNYXggPSB0aGlzLmdldFNpZGUoKSAhPT0gZGlyZWN0aW9uICYmIHRoaXMuX2Rpc3RhbmNlID4gdGhpcy5fd2lkdGggKiB0aGlzLmdldFRocmVzaG9sZCgpO1xuICAgIGlzU3dpcGVNYXggPyB0aGlzLnN3aXBlTWF4KCkgOiB0aGlzLnN3aXBlTWluKCk7XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuZ2VzdHVyZURldGVjdG9yICYmIHRoaXMuZ2VzdHVyZURldGVjdG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmdlc3R1cmVEZXRlY3RvciA9IHRoaXMuZWxlbWVudCA9IHRoaXMuZWxlbWVudEhhbmRsZXIgPSBudWxsO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF2aWdhdG9yQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgdGltaW5nOiAnbGluZWFyJyxcbiAgICAgIGR1cmF0aW9uOiAnMC40JyxcbiAgICAgIGRlbGF5OiAnMCdcbiAgICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBibG9jayhwYWdlKSB7XG4gICAgY29uc3QgYmxvY2tlciA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgei1pbmRleDogMTAwMDAwXCI+PC9kaXY+XG4gICAgYCk7XG4gICAgcGFnZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGJsb2NrZXIpO1xuICAgIHJldHVybiAoKSA9PiBibG9ja2VyLnJlbW92ZSgpO1xuICB9XG59XG5cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5cbi8qKlxuICogQWJzdHJhY3Qgc3dpcGUgYW5pbWF0b3IgZm9yIGlPUyBuYXZpZ2F0b3IgdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TU3dpcGVOYXZpZ2F0b3JBbmltYXRvciBleHRlbmRzIE5hdmlnYXRvckFuaW1hdG9yIHtcblxuICBzdGF0aWMgZ2V0IHN3aXBlYWJsZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHsgZHVyYXRpb25SZXN0b3JlID0gMC4xLCBkdXJhdGlvblN3aXBlID0gMC4xNSwgdGltaW5nU3dpcGUgPSAnbGluZWFyJywgLi4ucmVzdCB9ID0ge30pIHtcbiAgICBzdXBlcih7Li4ucmVzdH0pO1xuXG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IElPU1N3aXBlTmF2aWdhdG9yQW5pbWF0b3IpIHtcbiAgICAgIHV0aWwudGhyb3dBYnN0cmFjdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZHVyYXRpb25SZXN0b3JlID0gZHVyYXRpb25SZXN0b3JlO1xuICAgIHRoaXMuZHVyYXRpb25Td2lwZSA9IGR1cmF0aW9uU3dpcGU7XG4gICAgdGhpcy50aW1pbmdTd2lwZSA9IHRpbWluZ1N3aXBlO1xuXG4gICAgdGhpcy5vcHRTd2lwZSA9IHsgdGltaW5nOiB0aW1pbmdTd2lwZSwgZHVyYXRpb246IGR1cmF0aW9uU3dpcGUgfTtcbiAgICB0aGlzLm9wdFJlc3RvcmUgPSB7IHRpbWluZzogdGltaW5nU3dpcGUsIGR1cmF0aW9uOiBkdXJhdGlvblJlc3RvcmUgfTtcblxuICAgIHRoaXMuc3dpcGVTaGFkb3cgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTJweDsgcmlnaHQ6IDEwMCU7IHRvcDogMDsgYm90dG9tOiAwOyB6LWluZGV4OiAtMTtgICtcbiAgICAgICAgYGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgMCwgcmdiYSgwLDAsMCwuMDQpIDQwJSwgcmdiYSgwLDAsMCwuMTIpIDgwJSwgcmdiYSgwLDAsMCwuMTYpIDEwMCUpO1wiPjwvZGl2PmBcbiAgICApO1xuXG4gICAgdGhpcy5pc0RyYWdTdGFydCA9IHRydWU7XG4gIH1cblxuICBfZGVjb21wb3NlKCkge1xuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIF9zaG91bGRBbmltYXRlVG9vbGJhcigpIHtcbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBfY2FsY3VsYXRlRGVsdGEoKSB7XG4gICAgdXRpbC50aHJvd01lbWJlcigpO1xuICB9XG5cbiAgX2RyYWdTdGFydFNldHVwKGVudGVyUGFnZSwgbGVhdmVQYWdlKSB7XG4gICAgdGhpcy5pc0RyYWdTdGFydCA9IGZhbHNlO1xuXG4gICAgLy8gQXZvaWQgY29udGVudCBjbGlja3NcbiAgICB0aGlzLnVuYmxvY2sgPSBzdXBlci5ibG9jayhsZWF2ZVBhZ2UpO1xuXG4gICAgLy8gTWFza1xuICAgIGVudGVyUGFnZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLmJhY2tncm91bmRNYXNrLCBlbnRlclBhZ2UpO1xuXG4gICAgLy8gRGVjb21wb3NpdGlvblxuICAgIHRoaXMudGFyZ2V0ID0ge1xuICAgICAgZW50ZXI6IHV0aWwuZmluZFRvb2xiYXJQYWdlKGVudGVyUGFnZSkgfHwgZW50ZXJQYWdlLFxuICAgICAgbGVhdmU6IHV0aWwuZmluZFRvb2xiYXJQYWdlKGxlYXZlUGFnZSkgfHwgbGVhdmVQYWdlLFxuICAgIH07XG4gICAgdGhpcy5kZWNvbXAgPSB7XG4gICAgICBlbnRlcjogdGhpcy5fZGVjb21wb3NlKHRoaXMudGFyZ2V0LmVudGVyKSxcbiAgICAgIGxlYXZlOiB0aGlzLl9kZWNvbXBvc2UodGhpcy50YXJnZXQubGVhdmUpXG4gICAgfTtcblxuICAgIC8vIEFuaW1hdGlvbiB2YWx1ZXNcbiAgICB0aGlzLmRlbHRhID0gdGhpcy5fY2FsY3VsYXRlRGVsdGEobGVhdmVQYWdlLCB0aGlzLmRlY29tcC5sZWF2ZSk7XG4gICAgdGhpcy5zaG91bGRBbmltYXRlVG9vbGJhciA9IHRoaXMuX3Nob3VsZEFuaW1hdGVUb29sYmFyKHRoaXMudGFyZ2V0LmVudGVyLCB0aGlzLnRhcmdldC5sZWF2ZSk7XG5cbiAgICAvLyBTaGFkb3cgJiYgc3R5bGVzXG4gICAgaWYgKHRoaXMuc2hvdWxkQW5pbWF0ZVRvb2xiYXIpIHtcbiAgICAgIHRoaXMuc3dpcGVTaGFkb3cuc3R5bGUudG9wID0gdGhpcy5kZWNvbXAubGVhdmUudG9vbGJhci5vZmZzZXRIZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy50YXJnZXQubGVhdmUuYXBwZW5kQ2hpbGQodGhpcy5zd2lwZVNoYWRvdyk7XG4gICAgICB0aGlzLl9zYXZlU3R5bGUodGhpcy50YXJnZXQuZW50ZXIsIHRoaXMudGFyZ2V0LmxlYXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVhdmVQYWdlLmFwcGVuZENoaWxkKHRoaXMuc3dpcGVTaGFkb3cpO1xuICAgICAgdGhpcy5fc2F2ZVN0eWxlKGVudGVyUGFnZSwgbGVhdmVQYWdlKTtcbiAgICB9XG4gICAgbGVhdmVQYWdlLmNsYXNzTGlzdC5hZGQoJ292ZXJmbG93LXZpc2libGUnKTtcbiAgICB0aGlzLm92ZXJmbG93RWxlbWVudCA9IGxlYXZlUGFnZTtcbiAgICB0aGlzLmRlY29tcC5sZWF2ZS5jb250ZW50LmNsYXNzTGlzdC5hZGQoJ2NvbnRlbnQtc3dpcGluZycpO1xuXG4gIH1cblxuICB0cmFuc2xhdGUoZGlzdGFuY2UsIG1heFdpZHRoLCBlbnRlclBhZ2UsIGxlYXZlUGFnZSkge1xuICAgIHRoaXMuaXNTd2lwaW5nID0gdHJ1ZTtcblxuICAgIGlmIChlbnRlclBhZ2Uuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICBlbnRlclBhZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRHJhZ1N0YXJ0KSB7XG4gICAgICB0aGlzLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICB0aGlzLl9kcmFnU3RhcnRTZXR1cChlbnRlclBhZ2UsIGxlYXZlUGFnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3dpcGVSYXRpbyA9IChkaXN0YW5jZSAtIG1heFdpZHRoKSAvIG1heFdpZHRoO1xuXG4gICAgaWYgKHRoaXMuc2hvdWxkQW5pbWF0ZVRvb2xiYXIpIHtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICAvKiBFbnRlciBwYWdlICovXG5cbiAgICAgICAgYW5pbWl0KFt0aGlzLmRlY29tcC5lbnRlci5jb250ZW50LCB0aGlzLmRlY29tcC5lbnRlci5ib3R0b21Ub29sYmFyLCB0aGlzLmRlY29tcC5lbnRlci5iYWNrZ3JvdW5kXSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHtzd2lwZVJhdGlvICogMjV9JSwgMCwgMClgLFxuICAgICAgICAgICAgb3BhY2l0eTogMSArIHN3aXBlUmF0aW8gKiAxMCAvIDEwMCAvLyAwLjkgLT4gMVxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci50b29sYmFyQ2VudGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMuZGVsdGEudGl0bGUgKiBzd2lwZVJhdGlvfXB4LCAwLCAwKWAsXG4gICAgICAgICAgICBvcGFjaXR5OiAxICsgc3dpcGVSYXRpbyAvLyAwIC0+IDFcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAuZW50ZXIuYmFja0J1dHRvbkxhYmVsKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxICsgc3dpcGVSYXRpbyAqIDEwIC8gMTAwLCAvLyAwLjkgLT4gMVxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLmRlbHRhLmxhYmVsICogc3dpcGVSYXRpb31weCwgMCwgMClgXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmVudGVyLm90aGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxICsgc3dpcGVSYXRpbyAvLyAwIC0+IDFcbiAgICAgICAgICB9KSxcblxuICAgICAgICAvKiBMZWF2ZSBwYWdlICovXG5cbiAgICAgICAgYW5pbWl0KFt0aGlzLmRlY29tcC5sZWF2ZS5jb250ZW50LCB0aGlzLmRlY29tcC5sZWF2ZS5ib3R0b21Ub29sYmFyLCB0aGlzLmRlY29tcC5sZWF2ZS5iYWNrZ3JvdW5kLCB0aGlzLnN3aXBlU2hhZG93XSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHtkaXN0YW5jZX1weCwgMCwgMClgXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmxlYXZlLnRvb2xiYXIpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IC0xICogc3dpcGVSYXRpbyAvLyAxIC0+IDBcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUudG9vbGJhckNlbnRlcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHsoMSArIHN3aXBlUmF0aW8pICogMTI1fSUsIDAsIDApYFxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5sZWF2ZS5iYWNrQnV0dG9uTGFiZWwpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IC0xICogc3dpcGVSYXRpbywgLy8gMSAtPiAwXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMuZGVsdGEudGl0bGUgKiAoMSArIHN3aXBlUmF0aW8pfXB4LCAwLCAwKWBcbiAgICAgICAgICB9KSxcblxuXG4gICAgICAgIC8qIE90aGVyICovXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuc3dpcGVTaGFkb3cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IC0xICogc3dpcGVSYXRpbyAvLyAxIC0+IDBcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7ZGlzdGFuY2V9cHgsIDAsIDApYFxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChlbnRlclBhZ2UpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7c3dpcGVSYXRpbyAqIDI1fSUsIDAsIDApYCxcbiAgICAgICAgICAgIG9wYWNpdHk6IDEgKyBzd2lwZVJhdGlvICogMTAgLyAxMDAgLy8gMC45IC0+IDFcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQodGhpcy5zd2lwZVNoYWRvdylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogLTEgKiBzd2lwZVJhdGlvIC8vIDEgLT4gMFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmUoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRBbmltYXRlVG9vbGJhcikge1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIC8qIEVudGVyIHBhZ2UgKi9cblxuICAgICAgICBhbmltaXQoW3RoaXMuZGVjb21wLmVudGVyLmNvbnRlbnQsIHRoaXMuZGVjb21wLmVudGVyLmJvdHRvbVRvb2xiYXIsIHRoaXMuZGVjb21wLmVudGVyLmJhY2tncm91bmRdKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMjUlLCAwLCAwKScsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjlcbiAgICAgICAgICB9LCB0aGlzLm9wdFJlc3RvcmUpLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci50b29sYmFyQ2VudGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgtJHt0aGlzLmRlbHRhLnRpdGxlfXB4LCAwLCAwKWAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgb3BhY2l0eSAke3RoaXMuZHVyYXRpb25SZXN0b3JlfXMgbGluZWFyLCB0cmFuc2Zvcm0gJHt0aGlzLmR1cmF0aW9uUmVzdG9yZX1zICR7dGhpcy50aW1pbmdTd2lwZX1gLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci5iYWNrQnV0dG9uTGFiZWwpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC0ke3RoaXMuZGVsdGEubGFiZWx9cHgsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmVudGVyLm90aGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSwgdGhpcy5vcHRSZXN0b3JlKSxcblxuICAgICAgICAvKiBMZWF2ZSBwYWdlICovXG5cbiAgICAgICAgYW5pbWl0KFt0aGlzLmRlY29tcC5sZWF2ZS5jb250ZW50LCB0aGlzLmRlY29tcC5sZWF2ZS5ib3R0b21Ub29sYmFyLCB0aGlzLmRlY29tcC5sZWF2ZS5iYWNrZ3JvdW5kLCB0aGlzLnN3aXBlU2hhZG93XSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgMCwgMClgXG4gICAgICAgICAgfSwgdGhpcy5vcHRSZXN0b3JlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUudG9vbGJhcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmxlYXZlLnRvb2xiYXJDZW50ZXIpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmxlYXZlLmJhY2tCdXR0b25MYWJlbClcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApYCxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7dGhpcy5kdXJhdGlvblJlc3RvcmV9cyBsaW5lYXIsIHRyYW5zZm9ybSAke3RoaXMuZHVyYXRpb25SZXN0b3JlfXMgJHt0aGlzLnRpbWluZ1N3aXBlfWBcbiAgICAgICAgICB9KSxcblxuXG4gICAgICAgIC8qIE90aGVyICovXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuc3dpcGVTaGFkb3cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB0aGlzLm9wdFJlc3RvcmUpXG4gICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXQodGhpcy50YXJnZXQuZW50ZXIsIHRoaXMudGFyZ2V0LmxlYXZlKTtcbiAgICAgICAgICAgIGVudGVyUGFnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtMjUlLCAwLCAwKScsXG4gICAgICAgICAgb3BhY2l0eTogMC45XG4gICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKSdcbiAgICAgICAgfSwgdGhpcy5vcHRSZXN0b3JlKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVzZXQoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UpO1xuICAgICAgICAgIGVudGVyUGFnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwb3BTd2lwZShlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZEFuaW1hdGVUb29sYmFyKSB7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgLyogRW50ZXIgcGFnZSAqL1xuXG4gICAgICAgIGFuaW1pdChbdGhpcy5kZWNvbXAuZW50ZXIuY29udGVudCwgdGhpcy5kZWNvbXAuZW50ZXIuYm90dG9tVG9vbGJhciwgdGhpcy5kZWNvbXAuZW50ZXIuYmFja2dyb3VuZF0pXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICB9LCB0aGlzLm9wdFN3aXBlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAuZW50ZXIudG9vbGJhckNlbnRlcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgMCwgMClgLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHt0aGlzLmR1cmF0aW9uU3dpcGV9cyBsaW5lYXIsIHRyYW5zZm9ybSAke3RoaXMuZHVyYXRpb25Td2lwZX1zICR7dGhpcy50aW1pbmdTd2lwZX1gLFxuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci5iYWNrQnV0dG9uTGFiZWwpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci5vdGhlcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpLFxuXG4gICAgICAgIC8qIExlYXZlIHBhZ2UgKi9cblxuICAgICAgICBhbmltaXQoW3RoaXMuZGVjb21wLmxlYXZlLmNvbnRlbnQsIHRoaXMuZGVjb21wLmxlYXZlLmJvdHRvbVRvb2xiYXIsIHRoaXMuZGVjb21wLmxlYXZlLmJhY2tncm91bmRdKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKWBcbiAgICAgICAgICB9LCB0aGlzLm9wdFN3aXBlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUudG9vbGJhcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5sZWF2ZS50b29sYmFyQ2VudGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgxMjUlLCAwLCAwKWBcbiAgICAgICAgICB9LCB0aGlzLm9wdFN3aXBlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUuYmFja0J1dHRvbkxhYmVsKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLmRlbHRhLnRpdGxlfXB4LCAwLCAwKWAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgb3BhY2l0eSAke3RoaXMuZHVyYXRpb25Td2lwZX1zIGxpbmVhciwgdHJhbnNmb3JtICR7dGhpcy5kdXJhdGlvblN3aXBlfXMgJHt0aGlzLnRpbWluZ1N3aXBlfWBcbiAgICAgICAgICB9KSxcblxuXG4gICAgICAgIC8qIE90aGVyICovXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuc3dpcGVTaGFkb3cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMubWF4V2lkdGh9cHgsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpXG4gICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXQodGhpcy50YXJnZXQuZW50ZXIsIHRoaXMudGFyZ2V0LmxlYXZlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlKVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgfSwgdGhpcy5vcHRTd2lwZSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwLCAwKSdcbiAgICAgICAgfSwgdGhpcy5vcHRTd2lwZSlcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0KGVudGVyUGFnZSwgbGVhdmVQYWdlKTtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgX3NhdmVTdHlsZSguLi5hcmdzKSB7XG4gICAgdGhpcy5fc2F2ZWRTdHlsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgY29uc3Qgc2F2ZSA9IGVsID0+IHRoaXMuX3NhdmVkU3R5bGUuc2V0KGVsLCBlbC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpO1xuICAgIGFyZ3MuZm9yRWFjaChzYXZlKTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuZGVjb21wKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5kZWNvbXBbcF0pLmZvckVhY2goayA9PiB7XG4gICAgICAgICh0aGlzLmRlY29tcFtwXVtrXSBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5kZWNvbXBbcF1ba10gOiBbdGhpcy5kZWNvbXBbcF1ba11dKS5mb3JFYWNoKHNhdmUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfcmVzdG9yZVN0eWxlKC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXN0b3JlID0gZWwgPT4ge1xuICAgICAgdGhpcy5fc2F2ZWRTdHlsZS5nZXQoZWwpID09PSBudWxsID8gZWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpIDogZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRoaXMuX3NhdmVkU3R5bGUuZ2V0KGVsKSk7XG4gICAgICB0aGlzLl9zYXZlZFN0eWxlLmRlbGV0ZShlbCk7XG4gICAgfTtcbiAgICBhcmdzLmZvckVhY2gocmVzdG9yZSk7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmRlY29tcCkuZm9yRWFjaChwID0+IHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGVjb21wW3BdKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAodGhpcy5kZWNvbXBbcF1ba10gaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMuZGVjb21wW3BdW2tdIDogW3RoaXMuZGVjb21wW3BdW2tdXSkuZm9yRWFjaChyZXN0b3JlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3Jlc2V0KC4uLmFyZ3MpIHtcbiAgICB0aGlzLmlzU3dpcGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3NhdmVkU3R5bGUgJiYgdGhpcy5fcmVzdG9yZVN0eWxlKC4uLmFyZ3MpO1xuICAgIHRoaXMudW5ibG9jayAmJiB0aGlzLnVuYmxvY2soKTtcbiAgICB0aGlzLnN3aXBlU2hhZG93LnJlbW92ZSgpO1xuICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcmZsb3ctdmlzaWJsZScpO1xuICAgIHRoaXMuZGVjb21wLmxlYXZlLmNvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZSgnY29udGVudC1zd2lwaW5nJyk7XG4gICAgdGhpcy5kZWNvbXAgPSB0aGlzLnRhcmdldCA9IHRoaXMub3ZlcmZsb3dFbGVtZW50ID0gdGhpcy5fc2F2ZWRTdHlsZSA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdTdGFydCA9IHRydWU7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBJT1NTd2lwZU5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vaW9zLXN3aXBlLWFuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uLy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgdHJhbnNsYXRlM2QgPSAoeCA9IDAsIHkgPSAwLCB6ID0gMCkgPT4gYHRyYW5zbGF0ZTNkKCR7eH0sICR7eX0sICR7en0pYDtcblxuLyoqXG4gKiBTbGlkZSBhbmltYXRvciBmb3IgbmF2aWdhdG9yIHRyYW5zaXRpb24gbGlrZSBpT1MncyBzY3JlZW4gc2xpZGUgdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TU2xpZGVOYXZpZ2F0b3JBbmltYXRvciBleHRlbmRzIElPU1N3aXBlTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltaW5nID0gJ2N1YmljLWJlemllcigwLjMsIC40LCAwLCAuOSknLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC40LCAuLi5yZXN0IH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24sIC4uLnJlc3QgfSk7XG5cbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgYDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7YCArXG4gICAgICAgIGBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgei1pbmRleDogMlwiPjwvZGl2PmBcbiAgICApO1xuICB9XG5cbiAgX2RlY29tcG9zZShwYWdlKSB7XG4gICAgY29uc3QgdG9vbGJhciA9IHBhZ2UuX2dldFRvb2xiYXJFbGVtZW50KCk7XG4gICAgY29uc3QgbGVmdCA9IHRvb2xiYXIuX2dldFRvb2xiYXJMZWZ0SXRlbXNFbGVtZW50KCk7XG4gICAgY29uc3QgcmlnaHQgPSB0b29sYmFyLl9nZXRUb29sYmFyUmlnaHRJdGVtc0VsZW1lbnQoKTtcblxuICAgIGNvbnN0IGV4Y2x1ZGVCYWNrQnV0dG9uID0gZnVuY3Rpb24oZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25zLWJhY2stYnV0dG9uJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVsZW1lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBvdGhlciA9IFtdXG4gICAgICAuY29uY2F0KGxlZnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwID8gbGVmdCA6IGV4Y2x1ZGVCYWNrQnV0dG9uKGxlZnQuY2hpbGRyZW4pKVxuICAgICAgLmNvbmNhdChyaWdodC5jaGlsZHJlbi5sZW5ndGggPT09IDAgPyByaWdodCA6IGV4Y2x1ZGVCYWNrQnV0dG9uKHJpZ2h0LmNoaWxkcmVuKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9vbGJhckNlbnRlcjogdG9vbGJhci5fZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCgpLFxuICAgICAgYmFja0J1dHRvbkljb246IHRvb2xiYXIuX2dldFRvb2xiYXJCYWNrQnV0dG9uSWNvbkVsZW1lbnQoKSxcbiAgICAgIGJhY2tCdXR0b25MYWJlbDogdG9vbGJhci5fZ2V0VG9vbGJhckJhY2tCdXR0b25MYWJlbEVsZW1lbnQoKSxcbiAgICAgIG90aGVyOiBvdGhlcixcbiAgICAgIGNvbnRlbnQ6IHBhZ2UuX2dldENvbnRlbnRFbGVtZW50KCksXG4gICAgICBiYWNrZ3JvdW5kOiBwYWdlLl9nZXRCYWNrZ3JvdW5kRWxlbWVudCgpLFxuICAgICAgdG9vbGJhcjogdG9vbGJhcixcbiAgICAgIGJvdHRvbVRvb2xiYXI6IHBhZ2UuX2dldEJvdHRvbVRvb2xiYXJFbGVtZW50KClcbiAgICB9O1xuICB9XG5cbiAgX3Nob3VsZEFuaW1hdGVUb29sYmFyKGVudGVyUGFnZSwgbGVhdmVQYWdlKSB7XG4gICAgY29uc3QgdG9vbGJhcnMgPSBlbnRlclBhZ2UuX2NhbkFuaW1hdGVUb29sYmFyKCkgJiYgbGVhdmVQYWdlLl9jYW5BbmltYXRlVG9vbGJhcigpO1xuXG4gICAgY29uc3QgZW50ZXJUb29sYmFyID0gZW50ZXJQYWdlLl9nZXRUb29sYmFyRWxlbWVudCgpO1xuICAgIGNvbnN0IGxlYXZlVG9vbGJhciA9IGxlYXZlUGFnZS5fZ2V0VG9vbGJhckVsZW1lbnQoKTtcblxuICAgIGNvbnN0IGlzU3RhdGljID0gZW50ZXJUb29sYmFyLmhhc0F0dHJpYnV0ZSgnc3RhdGljJykgfHwgbGVhdmVUb29sYmFyLmhhc0F0dHJpYnV0ZSgnc3RhdGljJyk7XG4gICAgY29uc3QgaXNNYXRlcmlhbCA9IHV0aWwuaGFzTW9kaWZpZXIoZW50ZXJUb29sYmFyLCAnbWF0ZXJpYWwnKSB8fCB1dGlsLmhhc01vZGlmaWVyKGxlYXZlVG9vbGJhciwgJ21hdGVyaWFsJyk7XG4gICAgY29uc3QgaXNUcmFuc3BhcmVudCA9IHV0aWwuaGFzTW9kaWZpZXIoZW50ZXJUb29sYmFyLCAndHJhbnNwYXJlbnQnKSB8fCB1dGlsLmhhc01vZGlmaWVyKGxlYXZlVG9vbGJhciwgJ3RyYW5zcGFyZW50Jyk7XG5cbiAgICByZXR1cm4gdG9vbGJhcnMgJiYgIWlzU3RhdGljICYmICFpc01hdGVyaWFsICYmICFpc1RyYW5zcGFyZW50O1xuICB9XG5cbiAgX2NhbGN1bGF0ZURlbHRhKGVsZW1lbnQsIGRlY29tcG9zaXRpb24pIHtcbiAgICBsZXQgdGl0bGUsIGxhYmVsO1xuXG4gICAgY29uc3QgcGFnZVJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2JhY2stYnV0dG9uX19sYWJlbCcpKSB7XG4gICAgICBjb25zdCBsYWJlbFJlY3QgPSBkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRpdGxlID0gTWF0aC5yb3VuZChwYWdlUmVjdC53aWR0aCAvIDIgLSBsYWJlbFJlY3Qud2lkdGggLyAyIC0gbGFiZWxSZWN0LmxlZnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aXRsZSA9IE1hdGgucm91bmQoKHBhZ2VSZWN0LndpZHRoIC8gMikgKiAwLjYpO1xuICAgIH1cblxuICAgIGlmIChkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25JY29uLmNsYXNzTGlzdC5jb250YWlucygnYmFjay1idXR0b25fX2ljb24nKSkge1xuICAgICAgbGFiZWwgPSBkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25JY29uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0IC0gMjtcbiAgICB9XG5cbiAgICByZXR1cm4ge3RpdGxlLCBsYWJlbH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgbGVhdmVQYWdlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGxlYXZlUGFnZSk7XG5cbiAgICBjb25zdCB1bmJsb2NrID0gc3VwZXIuYmxvY2soZW50ZXJQYWdlKTtcblxuICAgIGNvbnRlbnRSZWFkeShlbnRlclBhZ2UsICgpID0+IHtcbiAgICAgIGNvbnN0IGVudGVyUGFnZVRhcmdldCA9IHV0aWwuZmluZFRvb2xiYXJQYWdlKGVudGVyUGFnZSkgfHwgZW50ZXJQYWdlO1xuICAgICAgY29uc3QgbGVhdmVQYWdlVGFyZ2V0ID0gdXRpbC5maW5kVG9vbGJhclBhZ2UobGVhdmVQYWdlKSB8fCBsZWF2ZVBhZ2U7XG4gICAgICBjb25zdCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGVudGVyUGFnZVRhcmdldCk7XG4gICAgICBjb25zdCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGxlYXZlUGFnZVRhcmdldCk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5fY2FsY3VsYXRlRGVsdGEobGVhdmVQYWdlLCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uKTtcblxuICAgICAgY29uc3Qgc2hvdWxkQW5pbWF0ZVRvb2xiYXIgPSB0aGlzLl9zaG91bGRBbmltYXRlVG9vbGJhcihlbnRlclBhZ2VUYXJnZXQsIGxlYXZlUGFnZVRhcmdldCk7XG5cbiAgICAgIGlmIChzaG91bGRBbmltYXRlVG9vbGJhcikge1xuXG4gICAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgICBhbmltaXQoW2VudGVyUGFnZURlY29tcG9zaXRpb24uY29udGVudCwgZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5ib3R0b21Ub29sYmFyLCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJhY2tncm91bmRdLCB0aGlzLmRlZilcbiAgICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoJzEwMCUnKSB9LFxuICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9XG4gICAgICAgICAgICApLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24udG9vbGJhciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24udG9vbGJhckNlbnRlciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMjUlJyksIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfVxuICAgICAgICAgICAgKSxcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbCwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKGAke2RlbHRhLnRpdGxlfXB4YCksIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7dGhpcy5kdXJhdGlvbn1zIGxpbmVhciwgdHJhbnNmb3JtICR7dGhpcy5kdXJhdGlvbn1zICR7dGhpcy50aW1pbmd9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ub3RoZXIsIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICAgIHsgb3BhY2l0eTogMCB9LFxuICAgICAgICAgICAgICB7IGNzczogeyBvcGFjaXR5OiAxIH0sIHRpbWluZzogJ2xpbmVhcicgfVxuICAgICAgICAgICAgKSxcblxuICAgICAgICAgIGFuaW1pdChbbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0sIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgpLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnLTI1JScpLCBvcGFjaXR5OiAwLjkgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24udG9vbGJhckNlbnRlciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoYC0ke2RlbHRhLnRpdGxlfXB4YCksXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBgb3BhY2l0eSAke3RoaXMuZHVyYXRpb259cyBsaW5lYXIsIHRyYW5zZm9ybSAke3RoaXMuZHVyYXRpb259cyAke3RoaXMudGltaW5nfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbCwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKGAtJHtkZWx0YS5sYWJlbH1weGApLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgICAgICksXG5cbiAgICAgICAgICBhbmltaXQobGVhdmVQYWdlRGVjb21wb3NpdGlvbi5vdGhlciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdCggeyBvcGFjaXR5OiAxIH0sIHsgY3NzOiB7IG9wYWNpdHk6IDAgfSwgdGltaW5nOiAnbGluZWFyJyB9KVxuXG4gICAgICAgICk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnMTAwJScpLCB9LCB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9KSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgpLCBvcGFjaXR5OiAxIH0sIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnLTI1JScpLCBvcGFjaXR5OiAuOSB9KVxuICAgICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHBvcChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5pc1N3aXBpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvcFN3aXBlKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBlbnRlclBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgZW50ZXJQYWdlKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgY29uc3QgZW50ZXJQYWdlVGFyZ2V0ID0gdXRpbC5maW5kVG9vbGJhclBhZ2UoZW50ZXJQYWdlKSB8fCBlbnRlclBhZ2U7XG4gICAgY29uc3QgbGVhdmVQYWdlVGFyZ2V0ID0gdXRpbC5maW5kVG9vbGJhclBhZ2UobGVhdmVQYWdlKSB8fCBsZWF2ZVBhZ2U7XG4gICAgY29uc3QgZW50ZXJQYWdlRGVjb21wb3NpdGlvbiA9IHRoaXMuX2RlY29tcG9zZShlbnRlclBhZ2VUYXJnZXQpO1xuICAgIGNvbnN0IGxlYXZlUGFnZURlY29tcG9zaXRpb24gPSB0aGlzLl9kZWNvbXBvc2UobGVhdmVQYWdlVGFyZ2V0KTtcblxuICAgIGNvbnN0IGRlbHRhID0gdGhpcy5fY2FsY3VsYXRlRGVsdGEobGVhdmVQYWdlLCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uKTtcblxuICAgIGNvbnN0IHNob3VsZEFuaW1hdGVUb29sYmFyID0gdGhpcy5fc2hvdWxkQW5pbWF0ZVRvb2xiYXIoZW50ZXJQYWdlVGFyZ2V0LCBsZWF2ZVBhZ2VUYXJnZXQpO1xuXG4gICAgaWYgKHNob3VsZEFuaW1hdGVUb29sYmFyKSB7XG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChbZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGVudGVyUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0sIHRoaXMuZGVmKVxuICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCctMjUlJyksIG9wYWNpdHk6IC45IH0sXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSwgb3BhY2l0eTogMSB9XG4gICAgICAgICAgKSxcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlRGVjb21wb3NpdGlvbi50b29sYmFyQ2VudGVyLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZChgLSR7ZGVsdGEudGl0bGV9cHhgKSwgb3BhY2l0eTogMCB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7dGhpcy5kdXJhdGlvbn1zIGxpbmVhciwgdHJhbnNmb3JtICR7dGhpcy5kdXJhdGlvbn1zICR7dGhpcy50aW1pbmd9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24uYmFja0J1dHRvbkxhYmVsLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZChgLSR7ZGVsdGEubGFiZWx9cHhgKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCkgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ub3RoZXIsIHRoaXMuZGVmKVxuICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgeyBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgICB7IGNzczogeyBvcGFjaXR5OiAxIH0sIHRpbWluZzogJ2xpbmVhcicgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KFtsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmNvbnRlbnQsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYm90dG9tVG9vbGJhciwgbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5iYWNrZ3JvdW5kXSwgdGhpcy5kZWYpXG4gICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMDAlJykgfVxuICAgICAgICAgIClcbiAgICAgICAgICAud2FpdCgwKVxuICAgICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLnRvb2xiYXIsIHRoaXMuZGVmKVxuICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgeyBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgICB7IG9wYWNpdHk6IDAgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24udG9vbGJhckNlbnRlciwgdGhpcy5kZWYpXG4gICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMjUlJykgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24uYmFja0J1dHRvbkxhYmVsLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgpLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoYCR7ZGVsdGEudGl0bGV9cHhgKSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHt0aGlzLmR1cmF0aW9ufXMgbGluZWFyLCB0cmFuc2Zvcm0gJHt0aGlzLmR1cmF0aW9ufXMgJHt0aGlzLnRpbWluZ31gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnLTI1JScpLCBvcGFjaXR5OiAuOSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMDAlJykgfVxuICAgICAgICAgIClcbiAgICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5cbi8qKlxuICogTGlmdCBzY3JlZW4gdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TTGlmdE5hdmlnYXRvckFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG5cbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7JyArXG4gICAgICAgICdiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoYmxhY2ssIHdoaXRlKTtcIj48L2Rpdj4nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHB1c2goZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBsZWF2ZVBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGVudGVyUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMTAwJSwgMCknIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScgfVxuICAgICAgICApLFxuXG4gICAgICBhbmltaXQobGVhdmVQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIC0xMCUsIDApJywgb3BhY2l0eTogLjkgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIHVuYmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgZW50ZXJQYWdlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGVudGVyUGFnZSk7XG5cbiAgICBjb25zdCB1bmJsb2NrID0gc3VwZXIuYmxvY2soZW50ZXJQYWdlKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIC00M3B4LCAwKScsIG9wYWNpdHk6IC45IH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIHVuYmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChsZWF2ZVBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMTAwJSwgMCknIH1cbiAgICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5cbmNvbnN0IHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSc7XG5cbi8qKlxuICogRmFkZS1pbiBzY3JlZW4gdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TRmFkZU5hdmlnYXRvckFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGVudGVyUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm0sIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm0sIG9wYWNpdHk6IDAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcblxuLyoqXG4gKiBTbGlkZSBhbmltYXRvciBmb3IgbmF2aWdhdG9yIHRyYW5zaXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1EU2xpZGVOYXZpZ2F0b3JBbmltYXRvciBleHRlbmRzIE5hdmlnYXRvckFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2N1YmljLWJlemllciguMSwgLjcsIC40LCAxKScsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjN9ID0ge30pIHtcbiAgICBzdXBlcih7dGltaW5nLCBkZWxheSwgZHVyYXRpb259KTtcblxuICAgIHRoaXMuYmxhY2tNYXNrT3BhY2l0eSA9IDAuNDtcbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IHotaW5kZXg6IDI7JyArXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgb3BhY2l0eTogMDtcIj48L2Rpdj4nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHB1c2goZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBsZWF2ZVBhZ2UucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlLm5leHRTaWJsaW5nKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgb3BhY2l0eTogdGhpcy5ibGFja01hc2tPcGFjaXR5IH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZW50ZXJQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9XG4gICAgICAgICksXG5cbiAgICAgIGFuaW1pdChsZWF2ZVBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTQ1JSwgMCwgMCknIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBwb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBlbnRlclBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgZW50ZXJQYWdlLm5leHRTaWJsaW5nKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogdGhpcy5ibGFja01hc2tPcGFjaXR5IH0sXG4gICAgICAgICAgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZW50ZXJQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNDUlLCAwLCAwKScsIG9wYWNpdHk6IC45IH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApLFxuXG4gICAgICBhbmltaXQobGVhdmVQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIHVuYmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuXG4vKipcbiAqIExpZnQgc2NyZWVuIHRyYW5zaXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ETGlmdE5hdmlnYXRvckFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJywgZGVsYXkgPSAwLjA1LCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG5cbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7JyArXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcIj48L2Rpdj4nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHB1c2goZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBsZWF2ZVBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgY29uc3QgbWFza0NsZWFyID0gYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2spXG4gICAgICAud2FpdCh0aGlzLmRlbGF5ICsgdGhpcy5kdXJhdGlvbilcbiAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBtYXNrQ2xlYXIsXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH1cbiAgICAgICAgKSxcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IC40IH0pXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHBvcChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgIGVudGVyUGFnZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmJhY2tncm91bmRNYXNrLCBlbnRlclBhZ2UpO1xuXG4gICAgY29uc3QgdW5ibG9jayA9IHN1cGVyLmJsb2NrKGVudGVyUGFnZSk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQodGhpcy5iYWNrZ3JvdW5kTWFzaylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSArIHRoaXMuZHVyYXRpb24pXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IC40IH0sIHsgb3BhY2l0eTogMSB9KVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKScgfVxuICAgICAgICApXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcblxuLyoqXG4gKiBGYWRlLWluICsgTGlmdCBzY3JlZW4gdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IgZXh0ZW5kcyBOYXZpZ2F0b3JBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpJywgdGltaW5nUG9wID0gJ2N1YmljLWJlemllcigwLjQsIDAsIDEsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuICAgIHRoaXMudGltaW5nUG9wID0gdGltaW5nUG9wO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bmJsb2NrID0gc3VwZXIuYmxvY2soZW50ZXJQYWdlKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDQycHgsIDApJywgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyBjc3M6IHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMzhweCwgMCknLCBvcGFjaXR5OiAwIH0sIHRpbWluZzogdGhpcy50aW1pbmdQb3AgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb25lTmF2aWdhdG9yQW5pbWF0b3IgZXh0ZW5kcyBOYXZpZ2F0b3JBbmltYXRvciB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxuICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBTd2lwZVJldmVhbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvc3dpcGUtcmV2ZWFsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vb25zLW5hdmlnYXRvci9hbmltYXRvci5qcyc7XG5pbXBvcnQgSU9TU2xpZGVOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL29ucy1uYXZpZ2F0b3IvaW9zLXNsaWRlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBJT1NMaWZ0TmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL2lvcy1saWZ0LWFuaW1hdG9yLmpzJztcbmltcG9ydCBJT1NGYWRlTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL2lvcy1mYWRlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBNRFNsaWRlTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL21kLXNsaWRlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBNRExpZnROYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL29ucy1uYXZpZ2F0b3IvbWQtbGlmdC1hbmltYXRvci5qcyc7XG5pbXBvcnQgTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL21kLWZhZGUtYW5pbWF0b3IuanMnO1xuaW1wb3J0IE5vbmVOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL29ucy1uYXZpZ2F0b3Ivbm9uZS1hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIGZyb20gJy4uL29ucy9pbnRlcm5hbC9kZXZpY2UtYmFjay1idXR0b24tZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQge1BhZ2VMb2FkZXIsIGRlZmF1bHRQYWdlTG9hZGVyLCBpbnN0YW50UGFnZUxvYWRlcn0gZnJvbSAnLi4vb25zL3BhZ2UtbG9hZGVyLmpzJztcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgJ2RlZmF1bHQnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBwbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IE1ERmFkZU5hdmlnYXRvckFuaW1hdG9yIDogSU9TU2xpZGVOYXZpZ2F0b3JBbmltYXRvcjsgfSxcbiAgJ3NsaWRlJzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNRFNsaWRlTmF2aWdhdG9yQW5pbWF0b3IgOiBJT1NTbGlkZU5hdmlnYXRvckFuaW1hdG9yOyB9LFxuICAnbGlmdCc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBsYXRmb3JtLmlzQW5kcm9pZCgpID8gTURMaWZ0TmF2aWdhdG9yQW5pbWF0b3IgOiBJT1NMaWZ0TmF2aWdhdG9yQW5pbWF0b3I7IH0sXG4gICdmYWRlJzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNREZhZGVOYXZpZ2F0b3JBbmltYXRvciA6IElPU0ZhZGVOYXZpZ2F0b3JBbmltYXRvcjsgfSxcbiAgJ3NsaWRlLWlvcyc6IElPU1NsaWRlTmF2aWdhdG9yQW5pbWF0b3IsXG4gICdzbGlkZS1tZCc6IE1EU2xpZGVOYXZpZ2F0b3JBbmltYXRvcixcbiAgJ2xpZnQtaW9zJzogSU9TTGlmdE5hdmlnYXRvckFuaW1hdG9yLFxuICAnbGlmdC1tZCc6IE1ETGlmdE5hdmlnYXRvckFuaW1hdG9yLFxuICAnZmFkZS1pb3MnOiBJT1NGYWRlTmF2aWdhdG9yQW5pbWF0b3IsXG4gICdmYWRlLW1kJzogTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IsXG4gICdub25lJzogTm9uZU5hdmlnYXRvckFuaW1hdG9yXG59O1xuXG5jb25zdCByZXdyaXRhYmxlcyA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbmF2aWdhdG9yU2lkZUVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHJlYWR5KG5hdmlnYXRvckVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufTtcblxuY29uc3QgdmVyaWZ5UGFnZUVsZW1lbnQgPSBlbCA9PiAoZWwubm9kZU5hbWUgIT09ICdPTlMtUEFHRScpICYmIHV0aWwudGhyb3coICdPbmx5IHBhZ2UgZWxlbWVudHMgY2FuIGJlIGNoaWxkcmVuIG9mIG5hdmlnYXRvcicpO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1uYXZpZ2F0b3JcbiAqIEBjYXRlZ29yeSBuYXZpZ2F0aW9uXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEEgY29tcG9uZW50IHRoYXQgcHJvdmlkZXMgcGFnZSBzdGFjayBtYW5hZ2VtZW50IGFuZCBuYXZpZ2F0aW9uLiBTdGFjayBuYXZpZ2F0aW9uIGlzIHRoZSBtb3N0IGNvbW1vbiBuYXZpZ2F0aW9uIHBhdHRlcm4gZm9yIG1vYmlsZSBhcHBzLlxuICpcbiAqICAgICBXaGVuIGEgcGFnZSBpcyBwdXNoZWQgb24gdG9wIG9mIHRoZSBzdGFjayBpdCBpcyBkaXNwbGF5ZWQgd2l0aCBhIHRyYW5zaXRpb24gYW5pbWF0aW9uLiBXaGVuIHRoZSB1c2VyIHJldHVybnMgdG8gdGhlIHByZXZpb3VzIHBhZ2UgdGhlIHRvcCBwYWdlIHdpbGwgYmUgcG9wcGVkIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIGhpZGRlbiB3aXRoIGFuIG9wcG9zaXRlIHRyYW5zaXRpb24gYW5pbWF0aW9uLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHlyaHR2XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvbmF2aWdhdG9yXG4gKiBAZ3VpZGUgbGlmZWN5Y2xlLmh0bWwjZXZlbnRzXG4gKiAgIFtlbl1PdmVydmlldyBvZiBwYWdlIGV2ZW50c1svZW5dXG4gKiAgIFtqYV1PdmVydmlldyBvZiBwYWdlIGV2ZW50c1svamFdXG4gKiBAc2VlYWxzbyBvbnMtdG9vbGJhclxuICogICBbZW5dVGhlIGA8b25zLXRvb2xiYXI+YCBjb21wb25lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgdG9vbGJhciBvbiB0aGUgdG9wIG9mIGEgcGFnZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1iYWNrLWJ1dHRvblxuICogICBbZW5dVGhlIGA8b25zLWJhY2stYnV0dG9uPmAgY29tcG9uZW50IGxldHMgdGhlIHVzZXIgcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBwYWdlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtbmF2aWdhdG9yIGlkPVwibmF2aWdhdG9yXCI+XG4gKiAgIDxvbnMtcGFnZT5cbiAqICAgICA8b25zLXRvb2xiYXI+XG4gKiAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gKiAgICAgICAgIFRpdGxlXG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICA8L29ucy10b29sYmFyPlxuICogICAgIDxwPlxuICogICAgICAgPG9ucy1idXR0b25cbiAqICAgICAgICAgb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXZpZ2F0b3InKS5wdXNoUGFnZSgncGFnZS5odG1sJylcIj5cbiAqICAgICAgICAgUHVzaCBwYWdlXG4gKiAgICAgICA8L29ucy1idXR0b24+XG4gKiAgICAgPC9wPlxuICogICA8L29ucy1wYWdlPlxuICogPC9vbnMtbmF2aWdhdG9yPlxuICpcbiAqIDx0ZW1wbGF0ZSBpZD1cInBhZ2UuaHRtbFwiPlxuICogICA8b25zLXBhZ2U+XG4gKiAgICAgPG9ucy10b29sYmFyPlxuICogICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAqICAgICAgICAgPG9ucy1iYWNrLWJ1dHRvbj5CYWNrPC9vbnMtYmFjay1idXR0b24+XG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAqICAgICAgICAgQW5vdGhlciBwYWdlXG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICA8L29ucy10b29sYmFyPlxuICogICA8L29ucy1wYWdlPlxuICogPC90ZW1wbGF0ZT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF2aWdhdG9yRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwYWdlXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyc3QgcGFnZSB0byBzaG93IHdoZW4gbmF2aWdhdG9yIGlzIGluaXRpYWxpemVkLlsvZW5dXG4gICAqICAgW2phXeODiuODk+OCsuODvOOCv+ODvOOBjOWIneacn+WMluOBleOCjOOBn+aZguOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUVuYWJsZSBpT1MgXCJzd2lwZSB0byBwb3BcIiBmZWF0dXJlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlLXRhcmdldC13aWR0aFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCAyMHB4XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgd2lkdGggb2Ygc3dpcGVhYmxlIGFyZWEgY2FsY3VsYXRlZCBmcm9tIHRoZSBlZGdlIChpbiBwaXhlbHMpLiBVc2UgdGhpcyB0byBlbmFibGUgc3dpcGUgb25seSB3aGVuIHRoZSBmaW5nZXIgdG91Y2ggb24gdGhlIHNjcmVlbiBlZGdlLlsvZW5dXG4gICAqICAgW2phXeOCueODr+OCpOODl+OBruWIpOWumumgmOWfn+OCkuODlOOCr+OCu+ODq+WNmOS9jeOBp+aMh+WumuOBl+OBvuOBmeOAgueUu+mdouOBruerr+OBi+OCieaMh+WumuOBl+OBn+i3nembouOBq+mBlOOBmeOCi+OBqOODmuODvOOCuOOBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlLXRocmVzaG9sZFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwLjJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSBob3cgbXVjaCB0aGUgcGFnZSBuZWVkcyB0byBiZSBzd2lwZWQgYmVmb3JlIHBvcHBpbmcuIEEgdmFsdWUgYmV0d2VlbiBgMGAgYW5kIGAxYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIEFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwic2xpZGVcImAsIGBcImxpZnRcImAsIGBcImZhZGVcImAgYW5kIGBcIm5vbmVcImAuXG4gICAqXG4gICAqICAgICBUaGVzZSBhcmUgcGxhdGZvcm0gYmFzZWQgYW5pbWF0aW9ucy4gRm9yIGZpeGVkIGFuaW1hdGlvbnMsIGFkZCBgXCItaW9zXCJgIG9yIGBcIi1tZFwiYCBzdWZmaXggdG8gdGhlIGFuaW1hdGlvbiBuYW1lLiBFLmcuIGBcImxpZnQtaW9zXCJgLCBgXCJsaWZ0LW1kXCJgLiBEZWZhdWx0cyB2YWx1ZXMgYXJlIGBcInNsaWRlLWlvc1wiYCBhbmQgYFwiZmFkZS1tZFwiYCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YFsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZXB1c2hcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIGEgcGFnZSBpcyBwdXNoZWQuWy9lbl1cbiAgICogICBbamFdcGFnZeOBjHB1c2jjgZXjgozjgovnm7TliY3jgavnmbrngavjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubmF2aWdhdG9yXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmN1cnJlbnRQYWdlXG4gICAqICAgW2VuXUN1cnJlbnQgcGFnZSBvYmplY3QuWy9lbl1cbiAgICogICBbamFd54++5Zyo44GucGFnZeOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1DYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBwdXNoLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWRvOOBs+WHuuOBmeOBqOOAgXB1c2jlh6bnkIbjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZXBvcFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgYSBwYWdlIGlzIHBvcHBlZC5bL2VuXVxuICAgKiAgIFtqYV1wYWdl44GMcG9w44GV44KM44KL55u05YmN44Gr55m654Gr44GV44KM44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm5hdmlnYXRvclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5jdXJyZW50UGFnZVxuICAgKiAgIFtlbl1DdXJyZW50IHBhZ2Ugb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBrnBhZ2Xjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNhbmNlbCB0aGUgcG9wLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWRvOOBs+WHuuOBmeOBqOOAgXBhZ2Xjga5wb3DjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RwdXNoXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIGEgcGFnZSBpcyBwdXNoZWQuWy9lbl1cbiAgICogICBbamFdcGFnZeOBjHB1c2jjgZXjgozjgabjgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgYzntYLkuobjgZfjgabjgYvjgonnmbrngavjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubmF2aWdhdG9yXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmVudGVyUGFnZVxuICAgKiAgIFtlbl1PYmplY3Qgb2YgdGhlIG5leHQgcGFnZS5bL2VuXVxuICAgKiAgIFtqYV1wdXNo44GV44KM44GfcGFnZeOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5sZWF2ZVBhZ2VcbiAgICogICBbZW5dT2JqZWN0IG9mIHRoZSBwcmV2aW91cyBwYWdlLlsvZW5dXG4gICAqICAgW2phXeS7peWJjeOBrnBhZ2Xjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3Rwb3BcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgYSBwYWdlIGlzIHBvcHBlZC5bL2VuXVxuICAgKiAgIFtqYV1wYWdl44GMcG9w44GV44KM44Gm44Ki44OL44Oh44O844K344On44Oz44GM57WC44KP44Gj44Gf5b6M44Gr55m654Gr44GV44KM44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm5hdmlnYXRvclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5lbnRlclBhZ2VcbiAgICogICBbZW5dT2JqZWN0IG9mIHRoZSBuZXh0IHBhZ2UuWy9lbl1cbiAgICogICBbamFdcG9w44GV44KM44Gm6KGo56S644GV44KM44KL44Oa44O844K444Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmxlYXZlUGFnZVxuICAgKiAgIFtlbl1PYmplY3Qgb2YgdGhlIHByZXZpb3VzIHBhZ2UuWy9lbl1cbiAgICogICBbamFdcG9w44GV44KM44Gm5raI44GI44KL44Oa44O844K444Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnN3aXBlVG9Qb3BcbiAgICogICBbZW5dVHJ1ZSBpZiB0aGUgcG9wIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgc3dpcGluZyB0byBwb3AuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm9uc0JhY2tCdXR0b25cbiAgICogICBbZW5dVHJ1ZSBpZiB0aGUgcG9wIHdhcyBjYXVzZWQgYnkgcHJlc3NpbmcgYW4gb25zLWJhY2stYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgbmF2aWdhdG9yIChzd2lwZS10by1wb3ApLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5yYXRpb1xuICAgKiAgIFtlbl1EZWNpbWFsIHJhdGlvICgwLTEpLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbmltYXRpb25PcHRpb25zXG4gICAqICAgW2VuXVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIGdldCBhbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdG9yRmFjdG9yeTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBkZWZhdWx0UGFnZUxvYWRlcjtcbiAgICB0aGlzLl9wYWdlTWFwID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIHRoaXMuX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlTG9hZGVyXG4gICAqIEB0eXBlIHtQYWdlTG9hZGVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUGFnZUxvYWRlciBpbnN0YW5jZS4gSXQgY2FuIGJlIG92ZXJyaWRlbiB0byBjaGFuZ2UgdGhlIHdheSBwYWdlcyBhcmUgbG9hZGVkIGJ5IHRoaXMgZWxlbWVudC4gVXNlZnVsIGZvciBsaWIgZGV2ZWxvcGVycy5bL2VuXVxuICAgKiAgIFtqYV1QYWdlTG9hZGVy44Kk44Oz44K544K/44Oz44K544KS5qC857SN44GX44Gm44GE44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBwYWdlTG9hZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlTG9hZGVyO1xuICB9XG5cbiAgc2V0IHBhZ2VMb2FkZXIocGFnZUxvYWRlcikge1xuICAgIGlmICghKHBhZ2VMb2FkZXIgaW5zdGFuY2VvZiBQYWdlTG9hZGVyKSkge1xuICAgICAgdXRpbC50aHJvd1BhZ2VMb2FkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IHBhZ2VMb2FkZXI7XG4gIH1cblxuICBfZ2V0UGFnZVRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZSB8fCB0aGlzLmdldEF0dHJpYnV0ZSgncGFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlXG4gICAqIEB0eXBlIHsqfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgcGFnZSB0byBiZSBsb2FkZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBUaGlzIHZhbHVlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgYHBhZ2VgIGF0dHJpYnV0ZS4gVXNlZnVsIGZvciBsaWIgZGV2ZWxvcGVycy5bL2VuXVxuICAgKiAgIFtqYV3liJ3mnJ/ljJbmmYLjgavoqq3jgb/ovrzjgoDjg5rjg7zjgrjjgpLmjIflrprjgZfjgb7jgZnjgIJgcGFnZWDlsZ7mgKfjgafmjIflrprjgZfjgZ/lgKTjgojjgorjgoJgcGFnZWDjg5fjg63jg5Hjg4bjgqPjgavmjIflrprjgZfjgZ/lgKTjgpLlhKrlhYjjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICBzZXQgcGFnZShwYWdlKSB7XG4gICAgdGhpcy5fcGFnZSA9IHBhZ2U7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLm9uRGV2aWNlQmFja0J1dHRvbiA9IHRoaXMuX29uRGV2aWNlQmFja0J1dHRvbi5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKCFwbGF0Zm9ybS5pc0FuZHJvaWQoKSB8fCB0aGlzLmdldEF0dHJpYnV0ZSgnc3dpcGVhYmxlJykgPT09ICdmb3JjZScpIHtcbiAgICAgIGxldCBzd2lwZUFuaW1hdG9yO1xuXG4gICAgICB0aGlzLl9zd2lwZSA9IG5ldyBTd2lwZVJldmVhbCh7XG4gICAgICAgIGVsZW1lbnQ6IHRoaXMsXG4gICAgICAgIGdldFRocmVzaG9sZDogKCkgPT4gTWF0aC5tYXgoMC4yLCBwYXJzZUZsb2F0KHRoaXMuZ2V0QXR0cmlidXRlKCdzd2lwZS10aHJlc2hvbGQnKSkgfHwgMCksXG5cbiAgICAgICAgc3dpcGVNYXg6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbyA9IDE7XG4gICAgICAgICAgY29uc3QgYW5pbWF0aW9uT3B0aW9ucyA9IHsgZHVyYXRpb246IHN3aXBlQW5pbWF0b3IuZHVyYXRpb25Td2lwZSwgdGltaW5nOiBzd2lwZUFuaW1hdG9yLnRpbWluZ1N3aXBlIH07XG4gICAgICAgICAgdGhpcy5fb25Td2lwZSAmJiB0aGlzLl9vblN3aXBlKHJhdGlvLCBhbmltYXRpb25PcHRpb25zKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbywgYW5pbWF0aW9uT3B0aW9ucyB9KTtcbiAgICAgICAgICB0aGlzW3RoaXMuc3dpcGVNYXggPyAnc3dpcGVNYXgnIDogJ3BvcFBhZ2UnXSh7IGFuaW1hdG9yOiBzd2lwZUFuaW1hdG9yLCBzd2lwZVRvUG9wOiB0cnVlIH0pO1xuICAgICAgICAgIHN3aXBlQW5pbWF0b3IgPSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBzd2lwZU1pZDogKGRpc3RhbmNlLCB3aWR0aCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGlvID0gZGlzdGFuY2UgLyB3aWR0aDtcbiAgICAgICAgICB0aGlzLl9vblN3aXBlICYmIHRoaXMuX29uU3dpcGUocmF0aW8pO1xuICAgICAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnc3dpcGUnLCB7IHJhdGlvIH0pO1xuICAgICAgICAgIHN3aXBlQW5pbWF0b3IudHJhbnNsYXRlKGRpc3RhbmNlLCB3aWR0aCwgdGhpcy50b3BQYWdlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsIHRoaXMudG9wUGFnZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN3aXBlTWluOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSAwO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSB7IGR1cmF0aW9uOiBzd2lwZUFuaW1hdG9yLmR1cmF0aW9uUmVzdG9yZSwgdGltaW5nOiBzd2lwZUFuaW1hdG9yLnRpbWluZ1N3aXBlIH07XG4gICAgICAgICAgdGhpcy5fb25Td2lwZSAmJiB0aGlzLl9vblN3aXBlKHJhdGlvLCBhbmltYXRpb25PcHRpb25zKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbywgYW5pbWF0aW9uT3B0aW9ucyB9KTtcbiAgICAgICAgICBzd2lwZUFuaW1hdG9yLnJlc3RvcmUodGhpcy50b3BQYWdlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsIHRoaXMudG9wUGFnZSk7XG4gICAgICAgICAgc3dpcGVBbmltYXRvciA9IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaWdub3JlU3dpcGU6IChldmVudCwgZGlzdGFuY2UpID0+IHtcbiAgICAgICAgICAvLyBCYXNpYyBjb25kaXRpb25zXG4gICAgICAgICAgaWYgKCF0aGlzLl9pc1J1bm5pbmcgJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XG5cbiAgICAgICAgICAgIC8vIEFyZWEgb3IgZGlyZWN0aW9uYWwgaXNzdWVzXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3N3aXBlLXRhcmdldC13aWR0aCcpIHx8IDI1LCAxMCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb24gPT09ICAncmlnaHQnICYmIGFyZWEgPiBkaXN0YW5jZSkge1xuXG4gICAgICAgICAgICAgIC8vIFN3aXBlcyBvbiBvbnMtYmFjay1idXR0b24gYW5kIGl0cyBjaGlsZHJlblxuICAgICAgICAgICAgICBjb25zdCBpc0JCID0gZWwgPT4gL29ucy1iYWNrLWJ1dHRvbi9pLnRlc3QoZWwudGFnTmFtZSk7XG4gICAgICAgICAgICAgIGlmICghaXNCQihldmVudC50YXJnZXQpICYmICF1dGlsLmZpbmRQYXJlbnQoZXZlbnQudGFyZ2V0LCBpc0JCLCBwID0+IC9vbnMtcGFnZS9pLnRlc3QocC50YWdOYW1lKSkpIHtcblxuICAgICAgICAgICAgICAgIC8vIEFuaW1hdG9yIGlzIHN3aXBlYWJsZVxuICAgICAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9ICh0aGlzLnRvcFBhZ2UucHVzaGVkT3B0aW9ucyB8fCB7fSkuYW5pbWF0aW9uIHx8IHRoaXMuYW5pbWF0b3JGYWN0b3J5Ll9hbmltYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgQW5pbWF0b3IgPSBfYW5pbWF0b3JEaWN0W2FuaW1hdGlvbl0gaW5zdGFuY2VvZiBGdW5jdGlvblxuICAgICAgICAgICAgICAgICAgPyBfYW5pbWF0b3JEaWN0W2FuaW1hdGlvbl0uY2FsbCgpXG4gICAgICAgICAgICAgICAgICA6IF9hbmltYXRvckRpY3RbYW5pbWF0aW9uXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQW5pbWF0b3IgIT09ICd1bmRlZmluZWQnICYmIEFuaW1hdG9yLnN3aXBlYWJsZSkge1xuICAgICAgICAgICAgICAgICAgc3dpcGVBbmltYXRvciA9IG5ldyBBbmltYXRvcigpOyAvLyBQcmVwYXJlIGZvciB0aGUgc3dpcGVcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSWdub3JlIHN3aXBlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnc3dpcGVhYmxlJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgZGVmZXJyZWQgPSB1dGlsLmRlZmVyKCk7XG4gICAgdGhpcy5sb2FkZWQgPSBkZWZlcnJlZC5wcm9taXNlO1xuXG4gICAgcmV3cml0YWJsZXMucmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2hvdyA9ICF1dGlsLmhhc0FueUNvbXBvbmVudEFzUGFyZW50KHRoaXMpO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgYW5pbWF0aW9uOiAnbm9uZScsIHNob3cgfTtcblxuICAgICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09PSAwICYmIHRoaXMuX2dldFBhZ2VUYXJnZXQoKSkge1xuICAgICAgICB0aGlzLnB1c2hQYWdlKHRoaXMuX2dldFBhZ2VUYXJnZXQoKSwgb3B0aW9ucykudGhlbigoKSA9PiBkZWZlcnJlZC5yZXNvbHZlKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmVyaWZ5UGFnZUVsZW1lbnQodGhpcy5wYWdlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50b3BQYWdlKSB7XG4gICAgICAgICAgY29udGVudFJlYWR5KHRoaXMudG9wUGFnZSwgKCkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIHNob3cgJiYgdGhpcy50b3BQYWdlLl9zaG93KCk7XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxhc3RQYWdlQmFja0J1dHRvbigpO1xuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9nZXRQYWdlVGFyZ2V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFBhZ2UodGhpcy5fZ2V0UGFnZVRhcmdldCgpLCBvcHRpb25zKS50aGVuKCgpID0+IGRlZmVycmVkLnJlc29sdmUoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogTmF2aWdhdG9yQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnTmF2aWdhdG9yQW5pbWF0b3InLFxuICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpXG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgdGhpcy5fc3dpcGUgJiYgdGhpcy5fc3dpcGUuZGlzcG9zZSgpO1xuICAgIHRoaXMuX3N3aXBlID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2FuaW1hdGlvbicsICdzd2lwZWFibGUnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdhbmltYXRpb24nOlxuICAgICAgICB0aGlzLl91cGRhdGVBbmltYXRvckZhY3RvcnkoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzd2lwZWFibGUnOlxuICAgICAgICB0aGlzLl9zd2lwZSAmJiB0aGlzLl9zd2lwZS51cGRhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcG9wUGFnZVxuICAgKiBAc2lnbmF0dXJlIHBvcFBhZ2UoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dXG4gICAqICAgICBBbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcInNsaWRlXCJgLCBgXCJsaWZ0XCJgLCBgXCJmYWRlXCJgIGFuZCBgXCJub25lXCJgLlxuICAgKlxuICAgKiAgICAgVGhlc2UgYXJlIHBsYXRmb3JtIGJhc2VkIGFuaW1hdGlvbnMuIEZvciBmaXhlZCBhbmltYXRpb25zLCBhZGQgYFwiLWlvc1wiYCBvciBgXCItbWRcImAgc3VmZml4IHRvIHRoZSBhbmltYXRpb24gbmFtZS4gRS5nLiBgXCJsaWZ0LWlvc1wiYCwgYFwibGlmdC1tZFwiYC4gRGVmYXVsdHMgdmFsdWVzIGFyZSBgXCJzbGlkZS1pb3NcImAgYW5kIGBcImZhZGUtbWRcImAuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1GdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2l0aW9uIGhhcyBlbmRlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jg6Hjgr3jg4Pjg4njgavjgojjgovnlLvpnaLpgbfnp7vjgYzntYLkuobjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZGF0YV1cbiAgICogICBbZW5dQ3VzdG9tIGRhdGEgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbmV3IHBhZ2UgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZXNdXG4gICAqICAgW2VuXU51bWJlciBvZiBwYWdlcyB0byBiZSBwb3BwZWQuIE9ubHkgb25lIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIHJldmVhbGVkIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5piO44KJ44GL44Gr44GX44Gf44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Qb3BzIHRoZSBjdXJyZW50IHBhZ2UgZnJvbSB0aGUgcGFnZSBzdGFjay4gVGhlIHByZXZpb3VzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S65Lit44Gu44Oa44O844K444KS44Oa44O844K444K544K/44OD44Kv44GL44KJ5Y+W44KK6Zmk44GN44G+44GZ44CC5LiA44Gk5YmN44Gu44Oa44O844K444Gr5oi744KK44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHBvcFBhZ2Uob3B0aW9ucyA9IHt9KSB7XG4gICAgKHtvcHRpb25zfSA9IHRoaXMuX3ByZXBhcmVQYWdlQW5kT3B0aW9ucyhudWxsLCBvcHRpb25zKSk7XG5cbiAgICBpZiAodXRpbC5pc0ludGVnZXIob3B0aW9ucy50aW1lcykgJiYgb3B0aW9ucy50aW1lcyA+IDEpIHtcbiAgICAgIHRoaXMuX3JlbW92ZVBhZ2VzKG9wdGlvbnMudGltZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcFVwZGF0ZSA9ICgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLnBhZ2VzW3RoaXMucGFnZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3BvcFBhZ2Uob3B0aW9ucywgcG9wVXBkYXRlKTtcbiAgfVxuXG4gIF9wb3BQYWdlKG9wdGlvbnMsIHVwZGF0ZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpKSB7XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdwb3BQYWdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYWdlcy5sZW5ndGggPD0gMSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdvbnMtbmF2aWdhdG9yXFwncyBwYWdlIHN0YWNrIGlzIGVtcHR5LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9lbWl0UHJlUG9wRXZlbnQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDYW5jZWxlZCBpbiBwcmVwb3AgZXZlbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5wYWdlcy5sZW5ndGg7XG5cbiAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5wYWdlc1tsZW5ndGggLSAyXS51cGRhdGVCYWNrQnV0dG9uKChsZW5ndGggLSAyKSA+IDApO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5wYWdlc1tsZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGVudGVyUGFnZSA9IHRoaXMucGFnZXNbbGVuZ3RoIC0gMl07XG5cbiAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zIHx8IHt9LCBvcHRpb25zKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgICBlbnRlclBhZ2UuZGF0YSA9IHV0aWwuZXh0ZW5kKHt9LCBlbnRlclBhZ2UuZGF0YSB8fCB7fSwgb3B0aW9ucy5kYXRhIHx8IHt9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgICAgdXBkYXRlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICBlbnRlclBhZ2UuX3Nob3coKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3Bvc3Rwb3AnLCB7XG4gICAgICAgICAgICBsZWF2ZVBhZ2UsXG4gICAgICAgICAgICBlbnRlclBhZ2UsXG4gICAgICAgICAgICBuYXZpZ2F0b3I6IHRoaXMsXG4gICAgICAgICAgICBzd2lwZVRvUG9wOiAhIW9wdGlvbnMuc3dpcGVUb1BvcCwgICAgICAgIC8vIHdoZXRoZXIgdGhlIHBvcCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHN3aXBpbmdcbiAgICAgICAgICAgIG9uc0JhY2tCdXR0b246ICEhb3B0aW9ucy5vbnNCYWNrQnV0dG9uICAgLy8gd2hldGhlciB0aGUgcG9wIHdhcyB0cmlnZ2VyZWQgYnkgY2xpY2tpbmcgb25zLWJhY2stYnV0dG9uXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrICYmIG9wdGlvbnMuY2FsbGJhY2soZW50ZXJQYWdlKTtcblxuICAgICAgICAgIHJlc29sdmUoZW50ZXJQYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBsZWF2ZVBhZ2UuX2hpZGUoKTtcbiAgICAgIGVudGVyUGFnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICAgIGNvbnN0IGFuaW1hdG9yID0gb3B0aW9ucy5hbmltYXRvciB8fCB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG4gICAgICBhbmltYXRvci5wb3AodGhpcy5wYWdlc1tsZW5ndGggLSAyXSwgdGhpcy5wYWdlc1tsZW5ndGggLSAxXSwgZG9uZSk7XG4gICAgfSkuY2F0Y2goKCkgPT4gdGhpcy5faXNSdW5uaW5nID0gZmFsc2UpO1xuICB9XG5cblxuICAvKipcbiAgICogQG1ldGhvZCBwdXNoUGFnZVxuICAgKiBAc2lnbmF0dXJlIHB1c2hQYWdlKHBhZ2UsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogICBbZW5dUGFnZSBVUkwuIENhbiBiZSBlaXRoZXIgYSBIVE1MIGRvY3VtZW50IG9yIGEgdGVtcGxhdGUgZGVmaW5lZCB3aXRoIHRoZSBgPHRlbXBsYXRlPmAgdGFnLlsvZW5dXG4gICAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucGFnZV1cbiAgICogICBbZW5dUGFnZSBVUkwuIE9ubHkgbmVjZXNzYXJ5IGlmIGBwYWdlYCBwYXJhbWV0ZXIgaXMgbnVsbCBvciB1bmRlZmluZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhZ2VIVE1MXVxuICAgKiAgIFtlbl1IVE1MIGNvZGUgdGhhdCB3aWxsIGJlIGNvbXB1dGVkIGFzIGEgbmV3IHBhZ2UuIE92ZXJ3cml0ZXMgYHBhZ2VgIHBhcmFtZXRlci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1cbiAgICogICAgIEFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwic2xpZGVcImAsIGBcImxpZnRcImAsIGBcImZhZGVcImAgYW5kIGBcIm5vbmVcImAuXG4gICAqXG4gICAqICAgICBUaGVzZSBhcmUgcGxhdGZvcm0gYmFzZWQgYW5pbWF0aW9ucy4gRm9yIGZpeGVkIGFuaW1hdGlvbnMsIGFkZCBgXCItaW9zXCJgIG9yIGBcIi1tZFwiYCBzdWZmaXggdG8gdGhlIGFuaW1hdGlvbiBuYW1lLiBFLmcuIGBcImxpZnQtaW9zXCJgLCBgXCJsaWZ0LW1kXCJgLiBEZWZhdWx0cyB2YWx1ZXMgYXJlIGBcInNsaWRlLWlvc1wiYCBhbmQgYFwiZmFkZS1tZFwiYC5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YCBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNpdGlvbiBoYXMgZW5kZWQuWy9lbl1cbiAgICogICBbamFdcHVzaFBhZ2UoKeOBq+OCiOOCi+eUu+mdoumBt+enu+OBjOe1guS6huOBl+OBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kYXRhXVxuICAgKiAgIFtlbl1DdXN0b20gZGF0YSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBuZXcgcGFnZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIHB1c2hlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXei/veWKoOOBl+OBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUHVzaGVzIHRoZSBzcGVjaWZpZWQgcGFnZSBpbnRvIHRoZSBzdGFjay5bL2VuXVxuICAgKiAgIFtqYV3mjIflrprjgZfjgZ9wYWdl44KS5paw44GX44GE44Oa44O844K444K544K/44OD44Kv44Gr6L+95Yqg44GX44G+44GZ44CC5paw44GX44GE44Oa44O844K444GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHB1c2hQYWdlKHBhZ2UsIG9wdGlvbnMgPSB7fSkge1xuICAgICh7cGFnZSwgb3B0aW9uc30gPSB0aGlzLl9wcmVwYXJlUGFnZUFuZE9wdGlvbnMocGFnZSwgb3B0aW9ucykpO1xuXG4gICAgY29uc3QgcHJlcGFyZSA9IHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgIHZlcmlmeVBhZ2VFbGVtZW50KHBhZ2VFbGVtZW50KTtcbiAgICAgIHRoaXMuX3BhZ2VNYXAuc2V0KHBhZ2VFbGVtZW50LCBwYWdlKTtcbiAgICAgIHBhZ2VFbGVtZW50ID0gdXRpbC5leHRlbmQocGFnZUVsZW1lbnQsIHtcbiAgICAgICAgZGF0YTogb3B0aW9ucy5kYXRhXG4gICAgICB9KTtcbiAgICAgIHBhZ2VFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMucGFnZUhUTUwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wdXNoUGFnZShvcHRpb25zLCAoKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgaW5zdGFudFBhZ2VMb2FkZXIubG9hZCh7cGFnZTogb3B0aW9ucy5wYWdlSFRNTCwgcGFyZW50OiB0aGlzLCBwYXJhbXM6IG9wdGlvbnMuZGF0YX0sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgICBwcmVwYXJlKHBhZ2VFbGVtZW50KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wdXNoUGFnZShvcHRpb25zLCAoKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuX3BhZ2VMb2FkZXIubG9hZCh7cGFnZSwgcGFyZW50OiB0aGlzLCBwYXJhbXM6IG9wdGlvbnMuZGF0YX0sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgcHJlcGFyZShwYWdlRWxlbWVudCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgX3B1c2hQYWdlKG9wdGlvbnMgPSB7fSwgdXBkYXRlID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpIHtcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ3B1c2hQYWdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZW1pdFByZVB1c2hFdmVudCgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NhbmNlbGVkIGluIHByZXB1c2ggZXZlbnQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSB0aGlzLmFuaW1hdGlvbk9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMgfHwge30sIHthbmltYXRpb25PcHRpb25zfSwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zKTtcblxuICAgIHJldHVybiB1cGRhdGUoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IHBhZ2VMZW5ndGggPSB0aGlzLnBhZ2VzLmxlbmd0aDtcblxuICAgICAgY29uc3QgZW50ZXJQYWdlICA9IHRoaXMucGFnZXNbcGFnZUxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgbGVhdmVQYWdlID0gb3B0aW9ucy5sZWF2ZVBhZ2UgfHwgdGhpcy5wYWdlc1twYWdlTGVuZ3RoIC0gMl07XG5cbiAgICAgIHZlcmlmeVBhZ2VFbGVtZW50KGVudGVyUGFnZSk7XG5cbiAgICAgIGVudGVyUGFnZS51cGRhdGVCYWNrQnV0dG9uKHBhZ2VMZW5ndGggPiAob3B0aW9ucy5fcmVwbGFjZVBhZ2UgPyAyIDogMSkpO1xuXG4gICAgICBlbnRlclBhZ2UucHVzaGVkT3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCBlbnRlclBhZ2UucHVzaGVkT3B0aW9ucyB8fCB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgICBlbnRlclBhZ2UuZGF0YSA9IHV0aWwuZXh0ZW5kKHt9LCBlbnRlclBhZ2UuZGF0YSB8fCB7fSwgb3B0aW9ucy5kYXRhIHx8IHt9KTtcbiAgICAgIGVudGVyUGFnZS51bmxvYWQgPSBlbnRlclBhZ2UudW5sb2FkIHx8IG9wdGlvbnMudW5sb2FkO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICBvcHRpb25zLnNob3cgIT09IGZhbHNlICYmIHNldEltbWVkaWF0ZSgoKSA9PiBlbnRlclBhZ2UuX3Nob3coKSk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdwb3N0cHVzaCcsIHtsZWF2ZVBhZ2UsIGVudGVyUGFnZSwgbmF2aWdhdG9yOiB0aGlzfSk7XG5cbiAgICAgICAgICBpZiAobGVhdmVQYWdlKSB7XG4gICAgICAgICAgICBsZWF2ZVBhZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrICYmIG9wdGlvbnMuY2FsbGJhY2soZW50ZXJQYWdlKTtcblxuICAgICAgICAgIHJlc29sdmUoZW50ZXJQYWdlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBlbnRlclBhZ2Uuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICBpZiAobGVhdmVQYWdlKSB7XG4gICAgICAgICAgbGVhdmVQYWdlLl9oaWRlKCk7XG4gICAgICAgICAgYW5pbWF0b3IucHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgZG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXBsYWNlUGFnZVxuICAgKiBAc2lnbmF0dXJlIHJlcGxhY2VQYWdlKHBhZ2UsIFtvcHRpb25zXSlcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byB0aGUgbmV3IHBhZ2UuWy9lbl1cbiAgICogICBbamFd5paw44GX44GE44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXBsYWNlcyB0aGUgY3VycmVudCB0b3AgcGFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgb25lLiBFeHRlbmRzIGBwdXNoUGFnZSgpYCBwYXJhbWV0ZXJzLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOihqOekuuS4reOBruODmuODvOOCuOOCkuOCkuaMh+WumuOBl+OBn+ODmuODvOOCuOOBq+e9ruOBjeaPm+OBiOOBvuOBmeOAglsvamFdXG4gICAqL1xuICByZXBsYWNlUGFnZShwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5wdXNoUGFnZShwYWdlLCBvcHRpb25zKVxuICAgICAgLnRoZW4ocmVzb2x2ZWRWYWx1ZSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLnBhZ2VzW3RoaXMucGFnZXMubGVuZ3RoIC0gMl0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxhc3RQYWdlQmFja0J1dHRvbigpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzb2x2ZWRWYWx1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGluc2VydFBhZ2VcbiAgICogQHNpZ25hdHVyZSBpbnNlcnRQYWdlKGluZGV4LCBwYWdlLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIFtlbl1UaGUgaW5kZXggd2hlcmUgaXQgc2hvdWxkIGJlIGluc2VydGVkLlsvZW5dXG4gICAqICAgW2phXeOCueOCv+ODg+OCr+OBq+aMv+WFpeOBmeOCi+S9jee9ruOBruOCpOODs+ODh+ODg+OCr+OCueOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIGluc2VydGVkIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5oyH5a6a44GX44Gf44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JbnNlcnQgdGhlIHNwZWNpZmllZCBwYWdlIGludG8gdGhlIHN0YWNrIHdpdGggYXQgYSBwb3NpdGlvbiBkZWZpbmVkIGJ5IHRoZSBgaW5kZXhgIGFyZ3VtZW50LiBFeHRlbmRzIGBwdXNoUGFnZSgpYCBwYXJhbWV0ZXJzLlsvZW5dXG4gICAqICAgW2phXeaMh+WumuOBl+OBn3BhZ2XjgpLjg5rjg7zjgrjjgrnjgr/jg4Pjgq/jga5pbmRleOOBp+aMh+WumuOBl+OBn+S9jee9ruOBq+i/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBpbnNlcnRQYWdlKGluZGV4LCBwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICAoe3BhZ2UsIG9wdGlvbnN9ID0gdGhpcy5fcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMpKTtcbiAgICBpbmRleCA9IHRoaXMuX25vcm1hbGl6ZUluZGV4KGluZGV4KTtcblxuICAgIGlmIChpbmRleCA+PSB0aGlzLnBhZ2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMucHVzaFBhZ2UocGFnZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcGFnZSA9IHR5cGVvZiBvcHRpb25zLnBhZ2VIVE1MID09PSAnc3RyaW5nJyA/IG9wdGlvbnMucGFnZUhUTUwgOiBwYWdlO1xuICAgIGNvbnN0IGxvYWRlciA9IHR5cGVvZiBvcHRpb25zLnBhZ2VIVE1MID09PSAnc3RyaW5nJyA/IGluc3RhbnRQYWdlTG9hZGVyIDogdGhpcy5fcGFnZUxvYWRlcjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxvYWRlci5sb2FkKHtwYWdlLCBwYXJlbnQ6IHRoaXN9LCBwYWdlRWxlbWVudCA9PiB7XG4gICAgICAgIHZlcmlmeVBhZ2VFbGVtZW50KHBhZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fcGFnZU1hcC5zZXQocGFnZUVsZW1lbnQsIHBhZ2UpO1xuICAgICAgICBwYWdlRWxlbWVudCA9IHV0aWwuZXh0ZW5kKHBhZ2VFbGVtZW50LCB7XG4gICAgICAgICAgZGF0YTogb3B0aW9ucy5kYXRhLFxuICAgICAgICAgIHB1c2hlZE9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zID0gdXRpbC5leHRlbmQoXG4gICAgICAgICAge30sXG4gICAgICAgICAgdGhpcy5hbmltYXRpb25PcHRpb25zLFxuICAgICAgICAgIG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9ucyB8fCB7fVxuICAgICAgICApO1xuXG4gICAgICAgIHBhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKHBhZ2VFbGVtZW50LCB0aGlzLnBhZ2VzW2luZGV4XSk7XG4gICAgICAgIHRoaXMudG9wUGFnZS51cGRhdGVCYWNrQnV0dG9uKHRydWUpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHBhZ2VFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGFnZXNbaW5kZXhdKTtcbiAgICAgICAgfSwgMTAwMCAvIDYwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVtb3ZlUGFnZVxuICAgKiBAc2lnbmF0dXJlIHJlbW92ZVBhZ2UoaW5kZXgsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgW2VuXVRoZSBpbmRleCB3aGVyZSBpdCBzaG91bGQgYmUgcmVtb3ZlZC5bL2VuXVxuICAgKiAgIFtqYV3jgrnjgr/jg4Pjgq/jgYvjgonliYrpmaTjgZnjgovjg5rjg7zjgrjjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByZXZlYWxlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXeWJiumZpOOBq+OCiOOBo+OBpuihqOekuuOBleOCjOOBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGFnZSBhdCBhIHBvc2l0aW9uIGluIHRoZSBzdGFjayBkZWZpbmVkIGJ5IHRoZSBgaW5kZXhgIGFyZ3VtZW50LiBFeHRlbmRzIGBwb3BQYWdlKClgIHBhcmFtZXRlcnMuWy9lbl1cbiAgICogICBbamFd5oyH5a6a44GX44Gf44Kk44Oz44OH44OD44Kv44K544Gr44GC44KL44Oa44O844K444KS5YmK6Zmk44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHJlbW92ZVBhZ2UoaW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGluZGV4ID0gdGhpcy5fbm9ybWFsaXplSW5kZXgoaW5kZXgpO1xuXG4gICAgaWYgKGluZGV4IDwgdGhpcy5wYWdlcy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IGxlYXZlUGFnZSA9IHRoaXMucGFnZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBlbnRlclBhZ2UgPSB0aGlzLnRvcFBhZ2U7XG5cbiAgICAgICAgdGhpcy5fcGFnZU1hcC5kZWxldGUobGVhdmVQYWdlKTtcbiAgICAgICAgdGhpcy5fcGFnZUxvYWRlci51bmxvYWQobGVhdmVQYWdlKTtcbiAgICAgICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09PSAxKSB7IC8vIGVkZ2UgY2FzZVxuICAgICAgICAgIHRoaXMudG9wUGFnZS51cGRhdGVCYWNrQnV0dG9uKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoZW50ZXJQYWdlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3BQYWdlKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlc2V0VG9QYWdlXG4gICAqIEBzaWduYXR1cmUgcmVzZXRUb1BhZ2UocGFnZSwgW29wdGlvbnNdKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBuZXcgdG9wIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5paw44GX44GE44OI44OD44OX44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucG9wXVxuICAgKiAgIFtlbl1QZXJmb3JtcyAncG9wJyBlZmZlY3QgaWYgYHRydWVgIGluc3RlYWQgb2YgJ3B1c2gnIG9yIG5vbmUuIFRoaXMgYWxzbyBzZXRzIGBvcHRpb25zLmFuaW1hdGlvbmAgdmFsdWUgdG8gYGRlZmF1bHRgIGluc3RlYWQgb2YgYG5vbmVgLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DbGVhcnMgcGFnZSBzdGFjayBhbmQgYWRkcyB0aGUgc3BlY2lmaWVkIHBhZ2UgdG8gdGhlIHN0YWNrLiBFeHRlbmRzIGBwdXNoUGFnZSgpYCBwYXJhbWV0ZXJzLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOCueOCv+ODg+OCr+OCkuODquOCu+ODg+ODiOOBl+OAgeaMh+WumuOBl+OBn+ODmuODvOOCuOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICByZXNldFRvUGFnZShwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICAoe3BhZ2UsIG9wdGlvbnN9ID0gdGhpcy5fcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMpKTtcblxuICAgIGlmICghb3B0aW9ucy5hbmltYXRvciAmJiAhb3B0aW9ucy5hbmltYXRpb24gJiYgIW9wdGlvbnMucG9wKSB7XG4gICAgICBvcHRpb25zLmFuaW1hdGlvbiA9ICdub25lJztcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMucGFnZSAmJiAhb3B0aW9ucy5wYWdlSFRNTCAmJiB0aGlzLl9nZXRQYWdlVGFyZ2V0KCkpIHtcbiAgICAgIHBhZ2UgPSBvcHRpb25zLnBhZ2UgPSB0aGlzLl9nZXRQYWdlVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9wKSB7XG4gICAgICB0aGlzLl9yZW1vdmVQYWdlcygpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0UGFnZSgwLCBwYWdlLCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9KVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnBvcFBhZ2Uob3B0aW9ucykpO1xuICAgIH1cblxuICAgIC8vIFRpcDogY2FsbGJhY2sgcnVucyBiZWZvcmUgcmVzb2x2ZWQgcHJvbWlzZVxuICAgIGNvbnN0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBvcHRpb25zLmNhbGxiYWNrID0gbmV3UGFnZSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVQYWdlcygpO1xuICAgICAgbmV3UGFnZS51cGRhdGVCYWNrQnV0dG9uKGZhbHNlKTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG5ld1BhZ2UpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoUGFnZShwYWdlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJyaW5nUGFnZVRvcFxuICAgKiBAc2lnbmF0dXJlIGJyaW5nUGFnZVRvcChpdGVtLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gaXRlbVxuICAgKiAgIFtlbl1QYWdlIFVSTCBvciBpbmRleCBvZiBhbiBleGlzdGluZyBwYWdlIGluIG5hdmlnYXRvcidzIHN0YWNrLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOBrlVSTOOBi+OCguOBl+OBj+OBr29ucy1uYXZpZ2F0b3Ljga7jg5rjg7zjgrjjgrnjgr/jg4Pjgq/jga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBuZXcgdG9wIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5paw44GX44GE44OI44OD44OX44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CcmluZ3MgdGhlIGdpdmVuIHBhZ2UgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZSBzdGFjayBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvciBwdXNoZXMgaXQgaW50byB0aGUgc3RhY2sgaWYgZG9lc24ndC4gRXh0ZW5kcyBgcHVzaFBhZ2UoKWAgcGFyYW1ldGVycy5bL2VuXVxuICAgKiAgIFtqYV3mjIflrprjgZfjgZ/jg5rjg7zjgrjjgpLjg5rjg7zjgrjjgrnjgr/jg4Pjgq/jga7kuIDnlarkuIrjgavnp7vli5XjgZfjgb7jgZnjgILjgoLjgZfmjIflrprjgZfjgZ/jg5rjg7zjgrjjgYznhKHjgYvjgaPjgZ/loLTlkIjmlrDjgZfjgY9wdXNo44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGJyaW5nUGFnZVRvcChpdGVtLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoWydudW1iZXInLCAnc3RyaW5nJ10uaW5kZXhPZih0eXBlb2YgaXRlbSkgPT09IC0xKSB7XG4gICAgICB1dGlsLnRocm93KCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcGFnZSBuYW1lIG9yIHRoZSBpbmRleCBvZiBhbiBleGlzdGluZyBwYWdlLiBZb3Ugc3VwcGxpZWQgJyArIGl0ZW0pO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyA/IHRoaXMuX25vcm1hbGl6ZUluZGV4KGl0ZW0pIDogdGhpcy5fbGFzdEluZGV4T2ZQYWdlKGl0ZW0pO1xuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VzW2luZGV4XTtcblxuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnB1c2hQYWdlKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAoe29wdGlvbnN9ID0gdGhpcy5fcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMpKTtcblxuICAgIGlmIChpbmRleCA9PT0gdGhpcy5wYWdlcy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2UpO1xuICAgIH1cbiAgICBpZiAoIXBhZ2UpIHtcbiAgICAgIHV0aWwudGhyb3coJ0ZhaWxlZCB0byBmaW5kIGl0ZW0gJyArIGl0ZW0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ3B1c2hQYWdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2VtaXRQcmVQdXNoRXZlbnQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDYW5jZWxlZCBpbiBwcmVwdXNoIGV2ZW50LicpO1xuICAgIH1cblxuICAgIHBhZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHBhZ2Uuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIHBhZ2UucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChwYWdlKTtcbiAgICByZXR1cm4gdGhpcy5fcHVzaFBhZ2Uob3B0aW9ucyk7XG4gIH1cblxuICBfcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0Jykge1xuICAgICAgdXRpbC50aHJvdygnb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdC4gWW91IHN1cHBsaWVkICcgKyBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoKHBhZ2UgPT09IG51bGwgfHwgcGFnZSA9PT0gdW5kZWZpbmVkKSAmJiBvcHRpb25zLnBhZ2UpIHtcbiAgICAgIHBhZ2UgPSBvcHRpb25zLnBhZ2U7XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMgfHwge30sIG9wdGlvbnMsIHtwYWdlfSk7XG5cbiAgICByZXR1cm4ge3BhZ2UsIG9wdGlvbnN9O1xuICB9XG5cbiAgX3JlbW92ZVBhZ2VzKHRpbWVzKSB7XG4gICAgY29uc3QgcGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgIGxldCB1bnRpbCA9IHRpbWVzID09PSB1bmRlZmluZWQgPyAwIDogcGFnZXMubGVuZ3RoIC0gdGltZXM7XG4gICAgdW50aWwgPSB1bnRpbCA8IDAgPyAxIDogdW50aWw7XG5cbiAgICBmb3IgKGxldCBpID0gcGFnZXMubGVuZ3RoIC0gMjsgaSA+PSB1bnRpbDsgaS0tKSB7XG4gICAgICB0aGlzLl9wYWdlTWFwLmRlbGV0ZShwYWdlc1tpXSk7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZChwYWdlc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUxhc3RQYWdlQmFja0J1dHRvbigpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gMTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5wYWdlc1tpbmRleF0udXBkYXRlQmFja0J1dHRvbihpbmRleCA+IDApO1xuICAgIH1cbiAgfVxuXG4gIF9ub3JtYWxpemVJbmRleChpbmRleCkge1xuICAgIHJldHVybiBpbmRleCA+PSAwID8gaW5kZXggOiBNYXRoLmFicyh0aGlzLnBhZ2VzLmxlbmd0aCArIGluZGV4KSAlIHRoaXMucGFnZXMubGVuZ3RoO1xuICB9XG5cbiAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMucG9wUGFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgIH1cbiAgfVxuXG4gIF9sYXN0SW5kZXhPZlBhZ2UocGFnZU5hbWUpIHtcbiAgICBsZXQgaW5kZXg7XG4gICAgZm9yIChpbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgaWYgKHBhZ2VOYW1lID09PSB0aGlzLl9wYWdlTWFwLmdldCh0aGlzLnBhZ2VzW2luZGV4XSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIF9lbWl0UHJlRXZlbnQobmFtZSwgZGF0YSA9IHt9KSB7XG4gICAgbGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcblxuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncHJlJyArIG5hbWUsIHV0aWwuZXh0ZW5kKHtcbiAgICAgIG5hdmlnYXRvcjogdGhpcyxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VzW3RoaXMucGFnZXMubGVuZ3RoIC0gMV0sXG4gICAgICBjYW5jZWw6ICgpID0+IGlzQ2FuY2VsZWQgPSB0cnVlXG4gICAgfSwgZGF0YSkpO1xuXG4gICAgcmV0dXJuIGlzQ2FuY2VsZWQ7XG4gIH1cblxuICBfZW1pdFByZVB1c2hFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW1pdFByZUV2ZW50KCdwdXNoJyk7XG4gIH1cblxuICBfZW1pdFByZVBvcEV2ZW50KCkge1xuICAgIGNvbnN0IGwgPSB0aGlzLnBhZ2VzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5fZW1pdFByZUV2ZW50KCdwb3AnLCB7XG4gICAgICBsZWF2ZVBhZ2U6IHRoaXMucGFnZXNbbCAtIDFdLFxuICAgICAgZW50ZXJQYWdlOiB0aGlzLnBhZ2VzW2wgLSAyXVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVE9ETzog5pu444GN55u044GZXG4gIF9jcmVhdGVQYWdlRWxlbWVudCh0ZW1wbGF0ZUhUTUwpIHtcbiAgICBjb25zdCBwYWdlRWxlbWVudCA9IHV0aWwuY3JlYXRlRWxlbWVudChpbnRlcm5hbC5ub3JtYWxpemVQYWdlSFRNTCh0ZW1wbGF0ZUhUTUwpKTtcbiAgICB2ZXJpZnlQYWdlRWxlbWVudChwYWdlRWxlbWVudCk7XG4gICAgcmV0dXJuIHBhZ2VFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG4gIGdldCBvbkRldmljZUJhY2tCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uRGV2aWNlQmFja0J1dHRvbihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcikge1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyID0gZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHRvcFBhZ2VcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgdG9wIHBhZ2UgZWxlbWVudC4gVXNlIHRoaXMgbWV0aG9kIHRvIGFjY2VzcyBvcHRpb25zIHBhc3NlZCBieSBgcHVzaFBhZ2UoKWAtbGlrZSBtZXRob2RzLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruODmuODvOOCuOOCkuWPluW+l+OBl+OBvuOBmeOAgnB1c2hQYWdlKCnjgoRyZXNldFRvUGFnZSgp44Oh44K944OD44OJ44Gu5byV5pWw44KS5Y+W5b6X44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCB0b3BQYWdlKCkge1xuICAgIGxldCBsYXN0ID0gdGhpcy5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChsYXN0ICYmIGxhc3QudGFnTmFtZSAhPT0gJ09OUy1QQUdFJykgeyBsYXN0ID0gbGFzdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyB9XG4gICAgcmV0dXJuIGxhc3Q7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHBhZ2VzXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7QXJyYXl9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Db3B5IG9mIHRoZSBuYXZpZ2F0b3IncyBwYWdlIHN0YWNrLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgcGFnZXMoKSB7XG4gICAgcmV0dXJuIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC50YWdOYW1lID09PSAnT05TLVBBR0UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25Td2lwZVxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIG5hdmlnYXRvciAoc3dpcGUtdG8tcG9wKS4gSXQgZ2V0cyBhIGRlY2ltYWwgcmF0aW8gKDAtMSkgYW5kIGFuIGFuaW1hdGlvbk9wdGlvbnMgb2JqZWN0IGFzIGFyZ3VtZW50cy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IG9uU3dpcGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uU3dpcGU7XG4gIH1cblxuICBzZXQgb25Td2lwZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICB1dGlsLnRocm93KCdcIm9uU3dpcGVcIiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdGhpcy5fb25Td2lwZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1EZWZhdWx0IG9wdGlvbnMgb2JqZWN0LiBBdHRyaWJ1dGVzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGlzIHByb3BlcnR5LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9ucy5hbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJzbGlkZVwiYCwgYFwibGlmdFwiYCwgYFwiZmFkZVwiYCBhbmQgYFwibm9uZVwiYC5cbiAgICogICAgIFRoZXNlIGFyZSBwbGF0Zm9ybSBiYXNlZCBhbmltYXRpb25zLiBGb3IgZml4ZWQgYW5pbWF0aW9ucywgYWRkIGBcIi1pb3NcImAgb3IgYFwiLW1kXCJgIHN1ZmZpeCB0byB0aGUgYW5pbWF0aW9uIG5hbWUuIEUuZy4gYFwibGlmdC1pb3NcImAsIGBcImxpZnQtbWRcImAuIERlZmF1bHRzIHZhbHVlcyBhcmUgYFwic2xpZGUtaW9zXCJgIGFuZCBgXCJmYWRlLW1kXCJgLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YCBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9wdGlvbnMuY2FsbGJhY2tcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHRyYW5zaXRpb24gaGFzIGVuZGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruODoeOCveODg+ODieOBq+OCiOOCi+eUu+mdoumBt+enu+OBjOe1guS6huOBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICB9XG4gIHNldCBvcHRpb25zKG9iamVjdCkge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvYmplY3Q7XG4gIH1cblxuICBnZXQgYW5pbWF0aW9uT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykgP1xuICAgICAgQW5pbWF0b3JGYWN0b3J5LnBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgOiB7fTtcbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBfaXNSdW5uaW5nKHZhbHVlKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ19pcy1ydW5uaW5nJywgdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxuICBnZXQgX2lzUnVubmluZygpIHtcbiAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZ2V0QXR0cmlidXRlKCdfaXMtcnVubmluZycpKTtcbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIHRoaXMubG9hZGVkLnRoZW4oKCkgPT4gdGhpcy50b3BQYWdlICYmIHRoaXMudG9wUGFnZS5fc2hvdygpKTtcbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHRoaXMudG9wUGFnZSAmJiB0aGlzLnRvcFBhZ2UuX2hpZGUoKTtcbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLnBhZ2VzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIE5hdmlnYXRvckFuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdOYXZpZ2F0b3InKTtcbiAgICB9XG5cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTmF2aWdhdG9yQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIE5hdmlnYXRvckFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncHJlcHVzaCcsICdwb3N0cHVzaCcsICdwcmVwb3AnLCAncG9zdHBvcCcsICdzd2lwZSddO1xuICB9XG5cbiAgc3RhdGljIGdldCByZXdyaXRhYmxlcygpIHtcbiAgICByZXR1cm4gcmV3cml0YWJsZXM7XG4gIH1cbn1cblxub25zRWxlbWVudHMuTmF2aWdhdG9yID0gTmF2aWdhdG9yRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLW5hdmlnYXRvcicsIE5hdmlnYXRvckVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3Rvb2xiYXInO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAndG9vbGJhci0tKicsXG4gICcudG9vbGJhcl9fbGVmdCc6ICd0b29sYmFyLS0qX19sZWZ0JyxcbiAgJy50b29sYmFyX19jZW50ZXInOiAndG9vbGJhci0tKl9fY2VudGVyJyxcbiAgJy50b29sYmFyX19yaWdodCc6ICd0b29sYmFyLS0qX19yaWdodCdcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXRvb2xiYXJcbiAqIEBjYXRlZ29yeSBwYWdlXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiB0b29sYmFyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIHRyYW5zcGFyZW50XG4gKiAgIFtlbl1UcmFuc3BhcmVudCB0b29sYmFyLlsvZW5dXG4gKiAgIFtqYV3pgI/mmI7jgarog4zmma/jgpLmjIHjgaTjg4Tjg7zjg6vjg5Djg7zjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIGNvdmVyLWNvbnRlbnRcbiAqICAgW2VuXURpc3BsYXlzIHRoZSB0b29sYmFyIG9uIHRvcCBvZiB0aGUgcGFnZSdzIGNvbnRlbnQuIFNob3VsZCBiZSBjb21iaW5lZCB3aXRoIGB0cmFuc3BhcmVudGAgbW9kaWZpZXIuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgbm9zaGFkb3dcbiAqICAgW2VuXVRvb2xiYXIgd2l0aG91dCBzaGFkb3cuWy9lbl1cbiAqICAgW2phXeODhOODvOODq+ODkOODvOOBq+W9seOCkuS7mOOBkeOBmuOBq+ihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFRvb2xiYXIgY29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqICAgICBMZWZ0LCBjZW50ZXIgYW5kIHJpZ2h0IGNvbnRhaW5lcnMgY2FuIGJlIHNwZWNpZmllZCBieSBjbGFzcyBuYW1lcy5cbiAqXG4gKiAgICAgVGhpcyBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgYXMgYSBNYXRlcmlhbCBEZXNpZ24gdG9vbGJhciB3aGVuIHJ1bm5pbmcgb24gQW5kcm9pZCBkZXZpY2VzLlxuICogICBbL2VuXVxuICogICBbamFd44OK44OT44Ky44O844K344On44Oz44Gn5L2/55So44GZ44KL44OE44O844Or44OQ44O855So44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CC44Kv44Op44K55ZCN44Gr44KI44KK44CB5bem44CB5Lit5aSu44CB5Y+z44Gu44Kz44Oz44OG44OK44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIGFIbUdMXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvdG9vbGJhclxuICogQGd1aWRlIGNvbXBpbGF0aW9uLmh0bWwjdG9vbGJhci1jb21waWxhdGlvbiBbZW5dQWRkaW5nIGEgdG9vbGJhclsvZW5dW2phXeODhOODvOODq+ODkOODvOOBrui/veWKoFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtYm90dG9tLXRvb2xiYXJcbiAqICAgW2VuXVRoZSBgPG9ucy1ib3R0b20tdG9vbGJhcj5gIGRpc3BsYXlzIGEgdG9vbGJhciBvbiB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1vbnMtYm90dG9tLXRvb2xiYXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWJhY2stYnV0dG9uXG4gKiAgIFtlbl1UaGUgYDxvbnMtYmFjay1idXR0b24+YCBjb21wb25lbnQgZGlzcGxheXMgYSBiYWNrIGJ1dHRvbiBpbnNpZGUgdGhlIHRvb2xiYXIuWy9lbl1cbiAqICAgW2phXW9ucy1iYWNrLWJ1dHRvbuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtdG9vbGJhci1idXR0b25cbiAqICAgW2VuXVRoZSBgPG9ucy10b29sYmFyLWJ1dHRvbj5gIGNvbXBvbmVudCBkaXNwbGF5cyBhIHRvb2xiYXIgYnV0dG9uIGluc2lkZSB0aGUgdG9vbGJhci5bL2VuXVxuICogICBbamFdb25zLXRvb2xiYXItYnV0dG9u44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtdG9vbGJhcj5cbiAqICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICogICAgICAgPG9ucy1iYWNrLWJ1dHRvbj5cbiAqICAgICAgICAgQmFja1xuICogICAgICAgPC9vbnMtYmFjay1idXR0b24+XG4gKiAgICAgPC9kaXY+XG4gKiAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgICAgVGl0bGVcbiAqICAgICA8L2Rpdj5cbiAqICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAqICAgICAgIDxvbnMtdG9vbGJhci1idXR0b24+XG4gKiAgICAgICAgIDxvbnMtaWNvbiBpY29uPVwibWQtbWVudVwiPjwvb25zLWljb24+XG4gKiAgICAgICA8L29ucy10b29sYmFyLWJ1dHRvbj5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9vbnMtdG9vbGJhcj5cbiAqIDwvb25zLXBhZ2U+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9vbGJhckVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5saW5lXG4gICAqIEBpbml0b25seVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRGlzcGxheSB0aGUgdG9vbGJhciBhcyBhbiBpbmxpbmUgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV3jg4Tjg7zjg6vjg5Djg7zjgpLjgqTjg7Pjg6njgqTjg7Pjgavnva7jgY3jgb7jgZnjgILjgrnjgq/jg63jg7zjg6vpoJjln5/lhoXjgavjgZ3jga7jgb7jgb7ooajnpLrjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVN0YXRpYyB0b29sYmFycyBhcmUgbm90IGFuaW1hdGVkIGJ5IGBvbnMtbmF2aWdhdG9yYCB3aGVuIHB1c2hpbmcgb3IgcG9wcGluZyBwYWdlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc3RhdGljXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3RhdGljIHRvb2xiYXJzIGFyZSBub3QgYW5pbWF0ZWQgYnkgYG9ucy1uYXZpZ2F0b3JgIHdoZW4gcHVzaGluZyBvciBwb3BwaW5nIHBhZ2VzLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSB0b29sYmFyLlsvZW5dXG4gICAqICAgW2phXeODhOODvOODq+ODkOODvOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgdG9vbGJhciBpcyBzaG93biBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFZpc2liaWxpdHlcbiAgICogQHNpZ25hdHVyZSBzZXRWaXNpYmlsaXR5KHZpc2libGUpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdmlzaWJsZVxuICAgKiAgIFtlbl1TZXQgdG8gdHJ1ZSB0byBzaG93IHRoZSB0b29sYmFyLCBmYWxzZSB0byBoaWRlIGl0Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3dzIHRoZSB0b29sYmFyIGlmIHZpc2libGUgaXMgdHJ1ZSwgb3RoZXJ3aXNlIGhpZGVzIGl0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBzZXRWaXNpYmlsaXR5KHZpc2libGUpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fdmlzaWJsZSA9IHZpc2libGU7XG5cbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnJyA6ICdub25lJztcblxuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgICBjb25zdCBzaWJsaW5nQmFja2dyb3VuZCA9IHV0aWwuZmluZENoaWxkKHRoaXMucGFyZW50Tm9kZSwgJy5wYWdlX19iYWNrZ3JvdW5kJyk7XG4gICAgICAgIGlmIChzaWJsaW5nQmFja2dyb3VuZCkge1xuICAgICAgICAgIHNpYmxpbmdCYWNrZ3JvdW5kLnN0eWxlLnRvcCA9IHZpc2libGUgPyBudWxsIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpYmxpbmdDb250ZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcy5wYXJlbnROb2RlLCAnLnBhZ2VfX2NvbnRlbnQnKTtcbiAgICAgICAgaWYgKHNpYmxpbmdDb250ZW50KSB7XG4gICAgICAgICAgc2libGluZ0NvbnRlbnQuc3R5bGUudG9wID0gdmlzaWJsZSA/IG51bGwgOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSB0b29sYmFyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBzaG93KCkge1xuICAgIHRoaXMuc2V0VmlzaWJpbGl0eSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIHRvb2xiYXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5zZXRWaXNpYmlsaXR5KGZhbHNlKTtcbiAgfVxuXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICB9XG5cbiAgc2V0IHZpc2libGUodmFsdWUpIHtcbiAgICB0aGlzLnNldFZpc2liaWxpdHkodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgKi9cbiAgX2dldFRvb2xiYXJMZWZ0SXRlbXNFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5sZWZ0JykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBfZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcuY2VudGVyJykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBfZ2V0VG9vbGJhclJpZ2h0SXRlbXNFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5yaWdodCcpIHx8IGludGVybmFsLm51bGxFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgKi9cbiAgX2dldFRvb2xiYXJCYWNrQnV0dG9uTGFiZWxFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29ucy1iYWNrLWJ1dHRvbiAuYmFjay1idXR0b25fX2xhYmVsJykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBfZ2V0VG9vbGJhckJhY2tCdXR0b25JY29uRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdvbnMtYmFjay1idXR0b24gLmJhY2stYnV0dG9uX19pY29uJykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgdGhpcy5fZW5zdXJlVG9vbGJhckl0ZW1FbGVtZW50cygpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9lbnN1cmVUb29sYmFySXRlbUVsZW1lbnRzKCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwIDsgaS0tKSB7XG4gICAgICAvLyBjYXNlIG9mIG5vdCBlbGVtZW50XG4gICAgICBpZiAodGhpcy5jaGlsZE5vZGVzW2ldLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuX2Vuc3VyZVRvb2xiYXJFbGVtZW50KCdjZW50ZXInKTtcbiAgICBjZW50ZXIuY2xhc3NMaXN0LmFkZCgndG9vbGJhcl9fdGl0bGUnKTtcblxuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAhPT0gMSB8fCAhdGhpcy5jaGlsZHJlblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ2NlbnRlcicpKSB7XG4gICAgICBjb25zdCBsZWZ0ID0gdGhpcy5fZW5zdXJlVG9vbGJhckVsZW1lbnQoJ2xlZnQnKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fZW5zdXJlVG9vbGJhckVsZW1lbnQoJ3JpZ2h0Jyk7XG5cbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuWzBdICE9PSBsZWZ0IHx8IHRoaXMuY2hpbGRyZW5bMV0gIT09IGNlbnRlciB8fCB0aGlzLmNoaWxkcmVuWzJdICE9PSByaWdodCkge1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGxlZnQpO1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNlbnRlcik7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQocmlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9lbnN1cmVUb29sYmFyRWxlbWVudChuYW1lKSB7XG4gICAgaWYgKHV0aWwuZmluZENoaWxkKHRoaXMsICcudG9vbGJhcl9fJyArIG5hbWUpKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50b29sYmFyX18nICsgbmFtZSk7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQobmFtZSk7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy4nICsgbmFtZSkgfHwgdXRpbC5jcmVhdGUoJy4nICsgbmFtZSk7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0b29sYmFyX18nICsgbmFtZSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFRvb2xiYXJFbGVtZW50LCBbJ3N0YXRpYyddKTtcblxub25zRWxlbWVudHMuVG9vbGJhciA9IFRvb2xiYXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtdG9vbGJhcicsIFRvb2xiYXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIgZnJvbSAnLi4vb25zL2ludGVybmFsL2RldmljZS1iYWNrLWJ1dHRvbi1kaXNwYXRjaGVyLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5pbXBvcnQgJy4vb25zLXRvb2xiYXIuanMnOyAvLyBlbnN1cmVzIHRoYXQgJ29ucy10b29sYmFyJyBlbGVtZW50IGlzIHJlZ2lzdGVyZWRcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdwYWdlJztcbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdwYWdlLS0qJyxcbiAgJy5wYWdlX19jb250ZW50JzogJ3BhZ2UtLSpfX2NvbnRlbnQnLFxuICAnLnBhZ2VfX2JhY2tncm91bmQnOiAncGFnZS0tKl9fYmFja2dyb3VuZCdcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXBhZ2VcbiAqIEBjYXRlZ29yeSBwYWdlXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiBzdHlsZVsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBUaGlzIGNvbXBvbmVudCBkZWZpbmVzIHRoZSByb290IG9mIGVhY2ggcGFnZS4gSWYgdGhlIGNvbnRlbnQgaXMgbGFyZ2UgaXQgd2lsbCBiZWNvbWUgc2Nyb2xsYWJsZS5cbiAqXG4gKiAgICAgQSBuYXZpZ2F0aW9uIGJhciBjYW4gYmUgYWRkZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZSB1c2luZyB0aGUgYDxvbnMtdG9vbGJhcj5gIGVsZW1lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jg5rjg7zjgrjlrprnvqnjga7jgZ/jgoHjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgILjgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lhoXlrrnjga/jgrnjgq/jg63jg7zjg6vjgYzoqLHlj6/jgZXjgozjgb7jgZnjgIJbL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3BhZ2VcbiAqIEBndWlkZSBsaWZlY3ljbGUuaHRtbCNldmVudHNcbiAqICAgW2VuXU92ZXJ2aWV3IG9mIHBhZ2UgZXZlbnRzWy9lbl1cbiAqICAgW2phXU92ZXJ2aWV3IG9mIHBhZ2UgZXZlbnRzWy9qYV1cbiAqIEBndWlkZSBmdW5kYW1lbnRhbHMuaHRtbCNtYW5hZ2luZy1wYWdlc1xuICogICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXNbL2VuXVxuICogICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLXRvb2xiYXJcbiAqICAgW2VuXVVzZSB0aGUgYDxvbnMtdG9vbGJhcj5gIGVsZW1lbnQgdG8gYWRkIGEgbmF2aWdhdGlvbiBiYXIgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtdG9vbGJhcj5cbiAqICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICogICAgICAgPG9ucy1iYWNrLWJ1dHRvbj5CYWNrPC9vbnMtYmFjay1idXR0b24+XG4gKiAgICAgPC9kaXY+XG4gKiAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlRpdGxlPC9kaXY+XG4gKiAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gKiAgICAgICA8b25zLXRvb2xiYXItYnV0dG9uPlxuICogICAgICAgICA8b25zLWljb24gaWNvbj1cIm1kLW1lbnVcIj48L29ucy1pY29uPlxuICogICAgICAgPC9vbnMtdG9vbGJhci1idXR0b24+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvb25zLXRvb2xiYXI+XG4gKlxuICogICA8cD5QYWdlIGNvbnRlbnQ8L3A+XG4gKiA8L29ucy1wYWdlPlxuICpcbiAqIEBleGFtcGxlXG4gKiA8c2NyaXB0PlxuICogICBteUFwcC5oYW5kbGVyID0gZnVuY3Rpb24oZG9uZSkge1xuICogICAgIGxvYWRNb3JlKCkudGhlbihkb25lKTtcbiAqICAgfVxuICogPC9zY3JpcHQ+XG4gKlxuICogPG9ucy1wYWdlIG9uLWluZmluaXRlLXNjcm9sbD1cIm15QXBwLmhhbmRsZXJcIj5cbiAqICAgPG9ucy10b29sYmFyPlxuICogICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5MaXN0PC9kaXY+XG4gKiAgIDwvb25zLXRvb2xiYXI+XG4gKlxuICogICA8b25zLWxpc3Q+XG4gKiAgICAgPG9ucy1saXN0LWl0ZW0+IzE8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgPG9ucy1saXN0LWl0ZW0+IzI8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgPG9ucy1saXN0LWl0ZW0+IzM8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLWxpc3Q+XG4gKiA8L29ucy1wYWdlPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IGluaXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHJpZ2h0IGFmdGVyIHRoZSBwYWdlIGlzIGF0dGFjaGVkLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOBjOOCouOCv+ODg+ODgeOBleOCjOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQgcmlnaHQgYWZ0ZXIgdGhlIHBhZ2UgaXMgc2hvd24uWy9lbl1cbiAgICogICBbamFd44Oa44O844K444GM6KGo56S644GV44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCByaWdodCBhZnRlciB0aGUgcGFnZSBpcyBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44Oa44O844K444GM6Zqg44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBkZXN0cm95XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCByaWdodCBiZWZvcmUgdGhlIHBhZ2UgaXMgZGVzdHJveWVkLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOBjOegtOajhOOBleOCjOOCi+WJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IG1vZGlmaWVyIG5hbWUgdG8gc3BlY2lmeSBjdXN0b20gc3R5bGVzLlsvZW5dXG4gICAqICAgW2phXeOCueOCv+OCpOODq+Wumue+qeOCkuOCq+OCueOCv+ODnuOCpOOCuuOBmeOCi+OBn+OCgeOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG9uLWluZmluaXRlLXNjcm9sbFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUGF0aCBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb24gaW5maW5pdGUgc2Nyb2xsaW5nLiBFeGFtcGxlOiBgYXBwLmxvYWREYXRhYC4gVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgZG9uZSBjYWxsYmFjayB0aGF0IG11c3QgYmUgY2FsbGVkIHdoZW4gaXQncyBmaW5pc2hlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fZGVyaXZlSG9va3MoKTtcblxuICAgIHRoaXMuX2RlZmF1bHRDbGFzc05hbWUgPSBkZWZhdWx0Q2xhc3NOYW1lO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuXG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9jb250ZW50RWxlbWVudCA9IHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCk7XG4gICAgICB0aGlzLl9iYWNrZ3JvdW5kRWxlbWVudCA9IHRoaXMuX2dldEJhY2tncm91bmRFbGVtZW50KCk7XG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIGNvbnN0IHRvb2xiYXIgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKTtcblxuICAgIGNvbnN0IGJhY2tncm91bmQgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2JhY2tncm91bmQnKSB8fCB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmJhY2tncm91bmQnKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWNrZ3JvdW5kLmNsYXNzTGlzdC5hZGQoJ3BhZ2VfX2JhY2tncm91bmQnKTtcbiAgICB0aGlzLmluc2VydEJlZm9yZShiYWNrZ3JvdW5kLCAhdG9vbGJhciAmJiB0aGlzLmZpcnN0Q2hpbGQgfHwgdG9vbGJhciAmJiB0b29sYmFyLm5leHRTaWJsaW5nKTtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2NvbnRlbnQnKSB8fCB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmNvbnRlbnQnKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ3BhZ2VfX2NvbnRlbnQnKTtcbiAgICBpZiAoIWNvbnRlbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgdXRpbC5hcnJheUZyb20odGhpcy5jaGlsZE5vZGVzKS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSB8fCB0aGlzLl9lbGVtZW50U2hvdWxkQmVNb3ZlZChub2RlKSkge1xuICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQobm9kZSk7IC8vIENhbiB0cmlnZ2VyIGRldGFjaGVkIGNvbm5lY3RlZENhbGxiYWNrc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl90cnlUb0ZpbGxTdGF0dXNCYXIoY29udGVudCk7IC8vIE11c3QgcnVuIGJlZm9yZSBjaGlsZCBwYWdlcyB0cnkgdG8gZmlsbCBzdGF0dXMgYmFyLlxuICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGNvbnRlbnQsIGJhY2tncm91bmQubmV4dFNpYmxpbmcpOyAvLyBDYW4gdHJpZ2dlciBhdHRhY2hlZCBjb25uZWN0ZWRDYWxsYmFja3NcblxuICAgIGlmICgoIXRvb2xiYXIgfHwgIXV0aWwuaGFzTW9kaWZpZXIodG9vbGJhciwgJ3RyYW5zcGFyZW50JykpXG4gICAgICAmJiBjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMVxuICAgICAgJiYgdXRpbC5pc1BhZ2VDb250cm9sKGNvbnRlbnQuY2hpbGRyZW5bMF0pXG4gICAgKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lICs9ICcgcGFnZS0td3JhcHBlcic7XG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnY2xhc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib3R0b21Ub29sYmFyID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1ib3R0b20tdG9vbGJhcicpO1xuICAgIGlmIChib3R0b21Ub29sYmFyKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lICs9ICcgcGFnZS13aXRoLWJvdHRvbS10b29sYmFyJztcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCdjbGFzcycpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9lbGVtZW50U2hvdWxkQmVNb3ZlZChlbCkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2VfX2JhY2tncm91bmQnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0YWdOYW1lID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0YWdOYW1lID09PSAnb25zLWZhYicpIHtcbiAgICAgIHJldHVybiAhZWwuaGFzQXR0cmlidXRlKCdwb3NpdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBmaXhlZEVsZW1lbnRzID0gWydzY3JpcHQnLCAnb25zLXRvb2xiYXInLCAnb25zLWJvdHRvbS10b29sYmFyJywgJ29ucy1tb2RhbCcsICdvbnMtc3BlZWQtZGlhbCcsICdvbnMtZGlhbG9nJywgJ29ucy1hbGVydC1kaWFsb2cnLCAnb25zLXBvcG92ZXInLCAnb25zLWFjdGlvbi1zaGVldCddO1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUoJ2lubGluZScpIHx8IGZpeGVkRWxlbWVudHMuaW5kZXhPZih0YWdOYW1lKSA9PT0gLTE7XG4gIH1cblxuICBfdHJ5VG9GaWxsU3RhdHVzQmFyKGNvbnRlbnQgPSB0aGlzLl9jb250ZW50RWxlbWVudCkge1xuICAgIGludGVybmFsLmF1dG9TdGF0dXNCYXJGaWxsKCgpID0+IHtcbiAgICAgIHV0aWwudG9nZ2xlQXR0cmlidXRlKHRoaXMsICdzdGF0dXMtYmFyLWZpbGwnLFxuICAgICAgICAhdXRpbC5maW5kUGFyZW50KHRoaXMsIGUgPT4gZS5oYXNBdHRyaWJ1dGUoJ3N0YXR1cy1iYXItZmlsbCcpKSAvLyBOb3QgYWxyZWFkeSBmaWxsZWRcbiAgICAgICAgJiYgKHRoaXMuX2NhbkFuaW1hdGVUb29sYmFyKGNvbnRlbnQpIHx8ICF1dGlsLmZpbmRDaGlsZChjb250ZW50LCB1dGlsLmlzUGFnZUNvbnRyb2wpKSAvLyBIYXMgdG9vbGJhciBvciBjYW5ub3QgZGVsZWdhdGVcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBfY2FuQW5pbWF0ZVRvb2xiYXIoY29udGVudCA9IHRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgaWYgKHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtdG9vbGJhcicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISF1dGlsLmZpbmRDaGlsZChjb250ZW50LCBlbCA9PiB7XG4gICAgICByZXR1cm4gdXRpbC5tYXRjaChlbCwgJ29ucy10b29sYmFyJykgJiYgIWVsLmhhc0F0dHJpYnV0ZSgnaW5saW5lJyk7XG4gICAgfSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAoIXV0aWwuaXNBdHRhY2hlZCh0aGlzKSkgeyAvLyBBdm9pZCBkZXRhY2hlZCBjYWxsc1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl90cnlUb0ZpbGxTdGF0dXNCYXIoKTsgLy8gRW5zdXJlIHN0YXR1cyBiYXIgd2hlbiB0aGUgZWxlbWVudCB3YXMgY29tcGlsZWQgYmVmb3JlIGNvbm5lY3RlZFxuXG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ29uLWluZmluaXRlLXNjcm9sbCcpKSB7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCdvbi1pbmZpbml0ZS1zY3JvbGwnLCBudWxsLCB0aGlzLmdldEF0dHJpYnV0ZSgnb24taW5maW5pdGUtc2Nyb2xsJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25Jbml0ICYmIHRoaXMub25Jbml0KCk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdpbml0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdXRpbC5oYXNBbnlDb21wb25lbnRBc1BhcmVudCh0aGlzKSkge1xuICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9zaG93KCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVCYWNrQnV0dG9uKHNob3cpIHtcbiAgICBpZiAodGhpcy5iYWNrQnV0dG9uKSB7XG4gICAgICBzaG93ID8gdGhpcy5iYWNrQnV0dG9uLnNob3coKSA6IHRoaXMuYmFja0J1dHRvbi5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0IG5hbWUoc3RyKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBzdHIpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gIH1cblxuICBnZXQgYmFja0J1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdvbnMtYmFjay1idXR0b24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25JbmZpbml0ZVNjcm9sbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1GdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHNjcm9sbGluZyB0byB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgYSBkb25lIGNhbGxiYWNrIGFzIGFuIGFyZ3VtZW50IHRoYXQgbXVzdCBiZSBjYWxsZWQgd2hlbiBpdCdzIGZpbmlzaGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHNldCBvbkluZmluaXRlU2Nyb2xsKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmICEodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wib25JbmZpbml0ZVNjcm9sbFwiIG11c3QgYmUgZnVuY3Rpb24gb3IgbnVsbCcpO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX2JvdW5kT25TY3JvbGwpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5fb25JbmZpbml0ZVNjcm9sbCkge1xuICAgICAgICB0aGlzLl9pbmZpbml0ZVNjcm9sbExpbWl0ID0gMC45O1xuICAgICAgICB0aGlzLl9ib3VuZE9uU2Nyb2xsID0gdGhpcy5fb25TY3JvbGwuYmluZCh0aGlzKTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX2NvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX2JvdW5kT25TY3JvbGwpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29uSW5maW5pdGVTY3JvbGwgPSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBvbkluZmluaXRlU2Nyb2xsKCkge1xuICAgIHJldHVybiB0aGlzLl9vbkluZmluaXRlU2Nyb2xsO1xuICB9XG5cbiAgX29uU2Nyb2xsKCkge1xuICAgIGNvbnN0IGMgPSB0aGlzLl9jb250ZW50RWxlbWVudCxcbiAgICAgIG92ZXJMaW1pdCA9IChjLnNjcm9sbFRvcCArIGMuY2xpZW50SGVpZ2h0KSAvIGMuc2Nyb2xsSGVpZ2h0ID49IHRoaXMuX2luZmluaXRlU2Nyb2xsTGltaXQ7XG5cbiAgICBpZiAodGhpcy5fb25JbmZpbml0ZVNjcm9sbCAmJiAhdGhpcy5fbG9hZGluZ0NvbnRlbnQgJiYgb3ZlckxpbWl0KSB7XG4gICAgICB0aGlzLl9sb2FkaW5nQ29udGVudCA9IHRydWU7XG4gICAgICB0aGlzLl9vbkluZmluaXRlU2Nyb2xsKCgpID0+IHRoaXMuX2xvYWRpbmdDb250ZW50ID0gZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuICBnZXQgb25EZXZpY2VCYWNrQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcjtcbiAgfVxuXG4gIHNldCBvbkRldmljZUJhY2tCdXR0b24oY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fYmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlciA9IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgZ2V0IHNjcm9sbFRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICB9XG5cbiAgc2V0IHNjcm9sbFRvcChuZXdWYWx1ZSkge1xuICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbFRvcCA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgX2dldENvbnRlbnRFbGVtZW50KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fY29udGVudCcpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHV0aWwudGhyb3coJ0ZhaWwgdG8gZ2V0IFwiLnBhZ2VfX2NvbnRlbnRcIiBlbGVtZW50Jyk7XG4gIH1cblxuICBfZ2V0QmFja2dyb3VuZEVsZW1lbnQoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wYWdlX19iYWNrZ3JvdW5kJyk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdXRpbC50aHJvdygnRmFpbCB0byBnZXQgXCIucGFnZV9fYmFja2dyb3VuZFwiIGVsZW1lbnQnKTtcbiAgfVxuXG4gIF9nZXRCb3R0b21Ub29sYmFyRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1ib3R0b20tdG9vbGJhcicpIHx8IGludGVybmFsLm51bGxFbGVtZW50O1xuICB9XG5cbiAgX2dldFRvb2xiYXJFbGVtZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbnMtdG9vbGJhcicpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnb24taW5maW5pdGUtc2Nyb2xsJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb24taW5maW5pdGUtc2Nyb2xsJzpcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLm9uSW5maW5pdGVTY3JvbGwgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25JbmZpbml0ZVNjcm9sbCA9IChkb25lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmID0gdXRpbC5maW5kRnJvbVBhdGgoY3VycmVudCk7XG4gICAgICAgICAgICB0aGlzLm9uSW5maW5pdGVTY3JvbGwgPSBmO1xuICAgICAgICAgICAgZihkb25lKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICghdGhpcy5faXNTaG93biAmJiB1dGlsLmlzQXR0YWNoZWQodGhpcykpIHtcbiAgICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nob3duJywgJycpO1xuICAgICAgdGhpcy5vblNob3cgJiYgdGhpcy5vblNob3coKTtcbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnc2hvdycpO1xuICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ19zaG93Jyk7XG4gICAgfVxuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzaG93bicpO1xuICAgICAgdGhpcy5vbkhpZGUgJiYgdGhpcy5vbkhpZGUoKTtcbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnaGlkZScpO1xuICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ19oaWRlJyk7XG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdGhpcy5faGlkZSgpO1xuXG4gICAgdGhpcy5vbkRlc3Ryb3kgJiYgdGhpcy5vbkRlc3Ryb3koKTtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ2Rlc3Ryb3knKTtcblxuICAgIGlmICh0aGlzLm9uRGV2aWNlQmFja0J1dHRvbikge1xuICAgICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHV0aWwucHJvcGFnYXRlQWN0aW9uKHRoaXMsICdfZGVzdHJveScpO1xuXG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIF9kZXJpdmVIb29rcygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGtleSA9ICdvbicgKyBldmVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGV2ZW50LnNsaWNlKDEpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gdGhpc1tgXyR7a2V5fWBdLFxuICAgICAgICBzZXQ6IHZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgdXRpbC50aHJvdyhgXCIke2tleX1cIiBob29rIG11c3QgYmUgYSBmdW5jdGlvbmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzW2BfJHtrZXl9YF0gPSB2YWx1ZS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ2luaXQnLCAnc2hvdycsICdoaWRlJywgJ2Rlc3Ryb3knXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGF0YVxuICAgKiBAdHlwZSB7Kn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVVzZXIncyBjdXN0b20gZGF0YSBwYXNzZWQgdG8gYHB1c2hQYWdlKClgLWxpa2UgbWV0aG9kcy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxub25zRWxlbWVudHMuUGFnZSA9IFBhZ2VFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcGFnZScsIFBhZ2VFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb3BvdmVyQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICBzaG93KHBvcG92ZXIsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIGhpZGUocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2FuaW1hdGUoZWxlbWVudCwge2Zyb20sIHRvLCBvcHRpb25zLCBjYWxsYmFjaywgcmVzdG9yZSA9IGZhbHNlLCBhbmltYXRpb259KSB7XG4gICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKGFuaW1hdGlvbikge1xuICAgICAgZnJvbSA9IGFuaW1hdGlvbi5mcm9tO1xuICAgICAgdG8gPSBhbmltYXRpb24udG87XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uID0gYW5pbWl0KGVsZW1lbnQpO1xuICAgIGlmIChyZXN0b3JlKSB7XG4gICAgICBhbmltYXRpb24gPSBhbmltYXRpb24uc2F2ZVN0eWxlKCk7XG4gICAgfVxuICAgIGFuaW1hdGlvbiA9IGFuaW1hdGlvbi5xdWV1ZShmcm9tKS53YWl0KHRoaXMuZGVsYXkpLnF1ZXVlKHtcbiAgICAgIGNzczogdG8sXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICB9KTtcbiAgICBpZiAocmVzdG9yZSkge1xuICAgICAgYW5pbWF0aW9uID0gYW5pbWF0aW9uLnJlc3RvcmVTdHlsZSgpO1xuICAgIH1cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGFuaW1hdGlvbiA9IGFuaW1hdGlvbi5xdWV1ZSgoZG9uZSkgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFuaW1hdGlvbjtcbiAgfVxuXG4gIF9hbmltYXRlQWxsKGVsZW1lbnQsIGFuaW1hdGlvbnMpIHtcbiAgICBPYmplY3Qua2V5cyhhbmltYXRpb25zKS5mb3JFYWNoKGtleSA9PiB0aGlzLl9hbmltYXRlKGVsZW1lbnRba2V5XSwgYW5pbWF0aW9uc1trZXldKS5wbGF5KCkpO1xuICB9XG5cbn1cblxuY29uc3QgZmFkZSA9IHtcbiAgb3V0OiB7XG4gICAgZnJvbToge29wYWNpdHk6IDEuMH0sXG4gICAgdG86IHtvcGFjaXR5OiAwfVxuICB9LFxuICBpbjoge1xuICAgIGZyb206IHtvcGFjaXR5OiAwfSxcbiAgICB0bzoge29wYWNpdHk6IDEuMH1cbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE1ERmFkZVBvcG92ZXJBbmltYXRvciBleHRlbmRzIFBvcG92ZXJBbmltYXRvciB7XG4gIHNob3cocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9hbmltYXRlQWxsKHBvcG92ZXIsIHtcbiAgICAgIF9tYXNrOiBmYWRlLmluLFxuICAgICAgX3BvcG92ZXI6IHthbmltYXRpb246IGZhZGUuaW4sIHJlc3RvcmU6IHRydWUsIGNhbGxiYWNrfVxuICAgIH0pO1xuICB9XG5cbiAgaGlkZShwb3BvdmVyLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2FuaW1hdGVBbGwocG9wb3Zlciwge1xuICAgICAgX21hc2s6IGZhZGUub3V0LFxuICAgICAgX3BvcG92ZXI6IHthbmltYXRpb246IGZhZGUub3V0LCByZXN0b3JlOiB0cnVlLCBjYWxsYmFja31cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSU9TRmFkZVBvcG92ZXJBbmltYXRvciBleHRlbmRzIE1ERmFkZVBvcG92ZXJBbmltYXRvciB7XG4gIHNob3cocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9hbmltYXRlQWxsKHBvcG92ZXIsIHtcbiAgICAgIF9tYXNrOiBmYWRlLmluLFxuICAgICAgX3BvcG92ZXI6IHtcbiAgICAgICAgZnJvbToge1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMS4zLCAxLjMsIDEuMCknLFxuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDEuMCwgMS4wLCAgMS4wKScsXG4gICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3RvcmU6IHRydWUsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBQb3BvdmVyQW5pbWF0b3IsIElPU0ZhZGVQb3BvdmVyQW5pbWF0b3IsIE1ERmFkZVBvcG92ZXJBbmltYXRvciB9IGZyb20gJy4vb25zLXBvcG92ZXIvYW5pbWF0b3IuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgaVBob25lWFBhdGNoIGZyb20gJy4uL29ucy9pcGhvbmV4LXBhdGNoLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5wb3BvdmVyJzogJ3BvcG92ZXItLSonLFxuICAnLnBvcG92ZXItbWFzayc6ICdwb3BvdmVyLW1hc2stLSonLFxuICAnLnBvcG92ZXJfX2NvbnRlbnQnOiAncG9wb3Zlci0tKl9fY29udGVudCcsXG4gICcucG9wb3Zlcl9fYXJyb3cnOiAncG9wb3Zlci0tKl9fYXJyb3cnXG59O1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICAnZGVmYXVsdCc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNREZhZGVQb3BvdmVyQW5pbWF0b3IgOiBJT1NGYWRlUG9wb3ZlckFuaW1hdG9yOyB9LFxuICAnbm9uZSc6IFBvcG92ZXJBbmltYXRvcixcbiAgJ2ZhZGUtaW9zJzogSU9TRmFkZVBvcG92ZXJBbmltYXRvcixcbiAgJ2ZhZGUtbWQnOiBNREZhZGVQb3BvdmVyQW5pbWF0b3Jcbn07XG5cbmNvbnN0IHBvc2l0aW9ucyA9IHtcbiAgdXA6ICdib3R0b20nLFxuICBsZWZ0OiAncmlnaHQnLFxuICBkb3duOiAndG9wJyxcbiAgcmlnaHQ6ICdsZWZ0J1xufTtcblxuY29uc3QgZGlyZWN0aW9ucyA9IE9iamVjdC5rZXlzKHBvc2l0aW9ucyk7XG4vKipcbiAqIEBlbGVtZW50IG9ucy1wb3BvdmVyXG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBBIGNvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGEgcG9wb3ZlciBuZXh0IHRvIGFuIGVsZW1lbnQuIFRoZSBwb3BvdmVyIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21wb25lbnQgb3IgYSB0b29sdGlwLlxuICpcbiAqICAgIFRvIHVzZSB0aGUgZWxlbWVudCBpdCBjYW4gZWl0aGVyIGJlIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBgPGJvZHk+YCBlbGVtZW50IG9yIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnJvbSBhIHRlbXBsYXRlIHVzaW5nIHRoZSBgb25zLmNyZWF0ZVBvcG92ZXIodGVtcGxhdGUpYCB1dGlsaXR5IGZ1bmN0aW9uIGFuZCB0aGUgYDx0ZW1wbGF0ZT5gIHRhZy5cbiAqXG4gKiAgICBBbm90aGVyIGNvbW1vbiB3YXkgdG8gdXNlIHRoZSBwb3BvdmVyIGlzIHRvIGRpc3BsYXkgYSBtZW51IHdoZW4gYSBidXR0b24gb24gdGhlIHNjcmVlbiBpcyB0YXBwZWQuIEZvciBNYXRlcmlhbCBEZXNpZ24sIHBvcG92ZXIgbG9va3MgZXhhY3RseSBhcyBhIGRyb3Bkb3duIG1lbnUuXG4gKiAgWy9lbl1cbiAqICBbamFd44GC44KL6KaB57Sg44KS5a++6LGh44Go44GZ44KL44Od44OD44OX44Kq44O844OQ44O844KS6KGo56S644GZ44KL44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIFpZWVJLb1xuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3BvcG92ZXJcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYnV0dG9uIG9uY2xpY2s9XCJzaG93UG9wb3Zlcih0aGlzKVwiPlxuICogICBDbGljayBtZSFcbiAqIDwvb25zLWJ1dHRvbj5cbiAqXG4gKiA8b25zLXBvcG92ZXIgZGlyZWN0aW9uPVwiZG93blwiIGlkPVwicG9wb3ZlclwiPlxuICogICA8cD5UaGlzIGlzIGEgcG9wb3ZlciE8L3A+XG4gKiA8L29ucy1wb3BvdmVyPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIHZhciBzaG93UG9wb3ZlciA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAqICAgICB2YXIgcG9wb3ZlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3BvdmVyJyk7XG4gKiAgICAgcG9wb3Zlci5zaG93KGVsZW1lbnQpO1xuICogICB9O1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcG92ZXJFbGVtZW50IGV4dGVuZHMgQmFzZURpYWxvZ0VsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHBvcG92ZXIgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBjOihqOekuuOBleOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5wb3BvdmVyXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUNhbGwgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBwb3BvdmVyIGZyb20gYmVpbmcgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5ZG844Gz5Ye644GZ44Go44CB44Od44OD44OX44Kq44O844OQ44O844Gu6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgcG9wb3ZlciBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogICBbamFd44Od44OD44OX44Kq44O844OQ44O844GM6KGo56S644GV44KM44Gf55u05b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnBvcG92ZXJcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBwb3BvdmVyIGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzpmqDjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucG9wb3ZlclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1DYWxsIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCB0aGUgcG9wb3ZlciBmcm9tIGJlaW5nIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlkbzjgbPlh7rjgZnjgajjgIHjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzpmqDjgozjgovlh6bnkIbjgpLjgq3jg6Pjg7Pjgrvjg6vjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBwb3BvdmVyIGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzpmqDjgozjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucG9wb3ZlclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgZGlhbG9nY2FuY2VsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQgd2hlbiB0aGUgcG9wb3ZlciBpcyBjYW5jZWxlZC5bL2VuXVxuICAgKiBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHBvcG92ZXIuWy9lbl1cbiAgICogIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXJlY3Rpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICAgIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0aW9ucy4gSWYgbW9yZSB0aGFuIG9uZSBkaXJlY3Rpb24gaXMgc3BlY2lmaWVkLFxuICAgKiAgICBpdCB3aWxsIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5LiBWYWxpZCBkaXJlY3Rpb25zIGFyZSBgXCJ1cFwiYCwgYFwiZG93blwiYCwgYFwibGVmdFwiYCBhbmQgYFwicmlnaHRcImAuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVxuICAgKiAgICDjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgpLooajnpLrjgZnjgovmlrnlkJHjgpLnqbrnmb3ljLrliIfjgorjgafopIfmlbDmjIflrprjgafjgY3jgb7jgZnjgIJcbiAgICogICAg5oyH5a6a44Gn44GN44KL5pa55ZCR44Gv44CBXCJ1cFwiLCBcImRvd25cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIuOBrjTjgaTjgafjgZnjgILnqbrnmb3ljLrliIfjgorjgafopIfmlbDmjIflrprjgZnjgovjgZPjgajjgoLjgafjgY3jgb7jgZnjgIJcbiAgICogICAg6KSH5pWw5oyH5a6a44GV44KM44Gf5aC05ZCI44CB5a++6LGh44Go44GZ44KL6KaB57Sg44Gr5ZCI44KP44Gb44Gm5oyH5a6a44GX44Gf5YCk44GL44KJ6Ieq5YuV55qE44Gr6YG45oqe44GV44KM44G+44GZ44CCXG4gICAqICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjYW5jZWxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIHBvcG92ZXIgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIHjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzooajnpLrjgZXjgozjgZ/mmYLjgavjgIHog4zmma/jgoTjg5Djg4Pjgq/jg5zjgr/jg7PjgpLjgr/jg4Pjg5fjgZfjgZ/mmYLjgavjgpLjg53jg4Pjg5fjgqrjg7zjg5Djg7zplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjb3Zlci10YXJnZXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHNldCB0aGUgcG9wb3ZlciB3aWxsIGNvdmVyIHRoZSB0YXJnZXQgb24gdGhlIHNjcmVlbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNvdmVyVGFyZ2V0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiBzZXQgdGhlIHBvcG92ZXIgd2lsbCBjb3ZlciB0aGUgdGFyZ2V0IG9uIHRoZSBzY3JlZW4uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuIGhpZGluZyB0aGUgcG9wb3Zlci4gQ2FuIGJlIGVpdGhlciBgXCJub25lXCJgLCBgXCJkZWZhdWx0XCJgLCBgXCJmYWRlLWlvc1wiYCBvciBgXCJmYWRlLW1kXCJgLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbWFzay1jb2xvclxuICAgKiBAdHlwZSB7Q29sb3J9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIGBcInJnYmEoMCwgMCwgMCwgMC4yKVwiYC5bL2VuXVxuICAgKiAgIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga9cInJnYmEoMCwgMCwgMCwgMC4yKVwi44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JvdW5kT25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX21hc2soKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcucG9wb3Zlci1tYXNrJyk7XG4gIH1cblxuICBnZXQgX3BvcG92ZXIoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcucG9wb3ZlcicpO1xuICB9XG5cbiAgZ2V0IF9jb250ZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLl9wb3BvdmVyLCAnLnBvcG92ZXJfX2NvbnRlbnQnKTtcbiAgfVxuXG4gIGdldCBfYXJyb3coKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMuX3BvcG92ZXIsICcucG9wb3Zlcl9fYXJyb3cnKTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgYW5pbWF0b3JzOiBfYW5pbWF0b3JEaWN0LFxuICAgICAgYmFzZUNsYXNzOiBQb3BvdmVyQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnUG9wb3ZlckFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSB8fCAnZGVmYXVsdCdcbiAgICB9KTtcbiAgfVxuXG4gIF90b2dnbGVTdHlsZShzaG91bGRTaG93LCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2hvdWxkU2hvdykge1xuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3ZlcihvcHRpb25zLnRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuX2NsZWFyU3R5bGVzKCk7XG4gICAgfVxuICB9XG5cbiAgX3Bvc2l0aW9uUG9wb3Zlcih0YXJnZXQpIHtcbiAgICBjb25zdCB7X3JhZGl1czogcmFkaXVzLCBfY29udGVudDogY29udGVudEVsZW1lbnQsIF9tYXJnaW46IG1hcmdpbn0gPSB0aGlzO1xuICAgIGNvbnN0IHNhZmVBcmVhTGVuZ3RocyA9IGlQaG9uZVhQYXRjaC5nZXRTYWZlQXJlYUxlbmd0aHMoKTtcbiAgICBjb25zdCBzYWZlQXJlYVJlY3QgPSBpUGhvbmVYUGF0Y2guZ2V0U2FmZUFyZWFET01SZWN0KCk7XG4gICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpc01EID0gdXRpbC5oYXNNb2RpZmllcih0aGlzLCAnbWF0ZXJpYWwnKTtcbiAgICBjb25zdCBjb3ZlciA9IGlzTUQgJiYgdGhpcy5oYXNBdHRyaWJ1dGUoJ2NvdmVyLXRhcmdldCcpO1xuICAgIGNvbnN0IHBhcmVudCA9IHV0aWwuZmluZFBhcmVudCh0aGlzLCAnb25zLXBhZ2UnKSB8fCBkb2N1bWVudC5ib2R5O1xuICAgIGNvbnN0IHBhcmVudERpbWVuc2lvbnMgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0ge1xuICAgICAgdG9wOiBNYXRoLm1heChwYXJlbnREaW1lbnNpb25zLnRvcCwgc2FmZUFyZWFSZWN0LnRvcCksXG4gICAgICBsZWZ0OiBNYXRoLm1heChwYXJlbnREaW1lbnNpb25zLmxlZnQsIHNhZmVBcmVhUmVjdC5sZWZ0KSxcbiAgICAgIGJvdHRvbTogTWF0aC5taW4ocGFyZW50RGltZW5zaW9ucy5ib3R0b20sIHNhZmVBcmVhUmVjdC5ib3R0b20pLFxuICAgICAgcmlnaHQ6IE1hdGgubWluKHBhcmVudERpbWVuc2lvbnMucmlnaHQsIHNhZmVBcmVhUmVjdC5yaWdodCksXG4gICAgfTtcblxuICAgIC8vIERpc3RhbmNlIGZyb20gZWFjaCBzaWRlIG9mIHRoZSBzYWZlIGFyZWEgKHdpdGggbWFyZ2luKSB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgICBjb25zdCB0YXJnZXREaXN0YW5jZSA9IHtcbiAgICAgIHRvcDogdGFyZ2V0UmVjdC50b3AgLSAobWF4UG9zaXRpb25zLnRvcCArIG1hcmdpbiksXG4gICAgICBsZWZ0OiB0YXJnZXRSZWN0LmxlZnQgLSAobWF4UG9zaXRpb25zLmxlZnQgKyBtYXJnaW4pLFxuICAgICAgYm90dG9tOiAobWF4UG9zaXRpb25zLmJvdHRvbSAtIG1hcmdpbikgLSB0YXJnZXRSZWN0LmJvdHRvbSxcbiAgICAgIHJpZ2h0OiAobWF4UG9zaXRpb25zLnJpZ2h0IC0gbWFyZ2luKSAtIHRhcmdldFJlY3QucmlnaHRcbiAgICB9O1xuXG4gICAgLy8gRGlzdGFuY2UgZnJvbSBlYWNoIHNpZGUgb2YgdGhlIHNhZmUgYXJlYSAod2l0aCBtYXJnaW4pIHRvIHRoZSBnZW9tZXRyaWMgY2VudGVyIG9mIHRoZSB0YXJnZXQgZWxlbWVudFxuICAgIGNvbnN0IHRhcmdldENlbnRlckRpc3RhbmNlRnJvbSA9IHtcbiAgICAgIHRvcDogdGFyZ2V0UmVjdC50b3AgKyBNYXRoLnJvdW5kKHRhcmdldFJlY3QuaGVpZ2h0IC8gMikgLSAobWF4UG9zaXRpb25zLnRvcCArIG1hcmdpbiksXG4gICAgICBsZWZ0OiB0YXJnZXRSZWN0LmxlZnQgKyBNYXRoLnJvdW5kKHRhcmdldFJlY3Qud2lkdGggLyAyKSAtIChtYXhQb3NpdGlvbnMubGVmdCArIG1hcmdpbiksXG4gICAgICBib3R0b206IChtYXhQb3NpdGlvbnMuYm90dG9tIC0gbWFyZ2luKSAtIHRhcmdldFJlY3QuYm90dG9tICsgTWF0aC5yb3VuZCh0YXJnZXRSZWN0LmhlaWdodCAvIDIpLFxuICAgICAgcmlnaHQ6IChtYXhQb3NpdGlvbnMucmlnaHQgLSBtYXJnaW4pIC0gdGFyZ2V0UmVjdC5yaWdodCArIE1hdGgucm91bmQodGFyZ2V0UmVjdC53aWR0aCAvIDIpXG4gICAgfTtcblxuICAgIGNvbnN0IHt2ZXJ0aWNhbCwgcHJpbWFyeTogcHJpbWFyeURpcmVjdGlvbiwgc2Vjb25kYXJ5OiBzZWNvbmRhcnlEaXJlY3Rpb259ID0gdGhpcy5fY2FsY3VsYXRlRGlyZWN0aW9ucyh0YXJnZXREaXN0YW5jZSk7XG4gICAgdGhpcy5fY3VycmVudERpcmVjdGlvbiA9IHByaW1hcnlEaXJlY3Rpb247XG4gICAgdXRpbC5hZGRNb2RpZmllcih0aGlzLCBwcmltYXJ5RGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IHNpemVOYW1lID0gdmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgLy8gR2V0IC5wb3BvdmVyX19jb250ZW50IHNpemVcbiAgICBjb25zdCBjb250ZW50U2l6ZSA9IChzdHlsZSA9PiAoe1xuICAgICAgd2lkdGg6IHBhcnNlSW50KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyksIDEwKSxcbiAgICAgIGhlaWdodDogcGFyc2VJbnQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JyksIDEwKVxuICAgIH0pKSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb250ZW50RWxlbWVudCkpO1xuXG4gICAgLy8gU2V0dGluZyAucG9wb3ZlciBwb3NpdGlvbi5cbiAgICBjb25zdCB0YXJnZXRBbmRBcnJvd0xlbmd0aCA9IGNvdmVyID8gMCA6ICh2ZXJ0aWNhbCA/IHRhcmdldFJlY3QuaGVpZ2h0IDogdGFyZ2V0UmVjdC53aWR0aCkgKyAoaXNNRCA/IDAgOiAxNCk7XG4gICAgY29uc3QgcHJpbWFyeU9mZnNldCA9IE1hdGgubWF4KFxuICAgICAgc2FmZUFyZWFMZW5ndGhzW3ByaW1hcnlEaXJlY3Rpb25dICsgbWFyZ2luLFxuICAgICAgc2FmZUFyZWFMZW5ndGhzW3ByaW1hcnlEaXJlY3Rpb25dICsgbWFyZ2luICsgdGFyZ2V0RGlzdGFuY2VbcHJpbWFyeURpcmVjdGlvbl0gKyB0YXJnZXRBbmRBcnJvd0xlbmd0aFxuICAgICk7XG4gICAgY29uc3Qgc2Vjb25kYXJ5T2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgICBzYWZlQXJlYUxlbmd0aHNbc2Vjb25kYXJ5RGlyZWN0aW9uXSArIG1hcmdpbixcbiAgICAgIHNhZmVBcmVhTGVuZ3Roc1tzZWNvbmRhcnlEaXJlY3Rpb25dICsgbWFyZ2luICsgdGFyZ2V0Q2VudGVyRGlzdGFuY2VGcm9tW3NlY29uZGFyeURpcmVjdGlvbl0gLSAoY29udGVudFNpemVbc2l6ZU5hbWVdIC8gMilcbiAgICApO1xuICAgIHRoaXMuX3BvcG92ZXIuc3R5bGVbcHJpbWFyeURpcmVjdGlvbl0gPSBwcmltYXJ5T2Zmc2V0ICsgJ3B4JztcbiAgICB0aGlzLl9wb3BvdmVyLnN0eWxlW3NlY29uZGFyeURpcmVjdGlvbl0gPSBzZWNvbmRhcnlPZmZzZXQgKyAncHgnO1xuXG4gICAgLy8gU2V0dGluZyAucG9wb3Zlcl9fYXJyb3cgcG9zaXRpb24uXG4gICAgdGhpcy5fYXJyb3cuc3R5bGVbc2Vjb25kYXJ5RGlyZWN0aW9uXSA9IE1hdGgubWF4KFxuICAgICAgcmFkaXVzLFxuICAgICAgKHNhZmVBcmVhTGVuZ3Roc1tzZWNvbmRhcnlEaXJlY3Rpb25dICsgbWFyZ2luKSArIHRhcmdldENlbnRlckRpc3RhbmNlRnJvbVtzZWNvbmRhcnlEaXJlY3Rpb25dIC0gc2Vjb25kYXJ5T2Zmc2V0XG4gICAgKSArICdweCc7XG4gIH1cblxuICBfY2FsY3VsYXRlRGlyZWN0aW9ucyhkaXN0YW5jZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5nZXRBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpIHx8ICd1cCBkb3duIGxlZnQgcmlnaHQnKS5zcGxpdCgvXFxzKy8pLm1hcChlID0+IHBvc2l0aW9uc1tlXSk7XG4gICAgY29uc3QgcHJpbWFyeSA9IG9wdGlvbnMuc29ydCgoYSwgYikgPT4gZGlzdGFuY2VbYV0gLSBkaXN0YW5jZVtiXSlbMF07XG4gICAgY29uc3QgdmVydGljYWwgPSAndG9wJyA9PSBwcmltYXJ5IHx8ICdib3R0b20nID09IHByaW1hcnk7XG4gICAgbGV0IHNlY29uZGFyeTtcblxuICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgc2Vjb25kYXJ5ID0gZGlzdGFuY2UubGVmdCA8IGRpc3RhbmNlLnJpZ2h0ID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICB9IGVsc2Uge1xuICAgICAgc2Vjb25kYXJ5ID0gZGlzdGFuY2UudG9wIDwgZGlzdGFuY2UuYm90dG9tID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgICB9XG5cbiAgICByZXR1cm4ge3ZlcnRpY2FsLCBwcmltYXJ5LCBzZWNvbmRhcnl9O1xuICB9XG5cbiAgX2NsZWFyU3R5bGVzKCkge1xuICAgIHRoaXMuX2N1cnJlbnREaXJlY3Rpb24gPSBudWxsO1xuICAgIFsndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0J10uZm9yRWFjaChlID0+IHtcbiAgICAgIHRoaXMuX2Fycm93LnN0eWxlW2VdID0gdGhpcy5fY29udGVudC5zdHlsZVtlXSA9IHRoaXMuX3BvcG92ZXIuc3R5bGVbZV0gPSAnJztcbiAgICAgIHV0aWwucmVtb3ZlTW9kaWZpZXIodGhpcywgZSk7XG4gICAgfSk7XG4gIH1cblxuICBfb25DaGFuZ2UoKSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3Zlcih0aGlzLl9jdXJyZW50VGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuX3BvcG92ZXIgJiYgdGhpcy5fbWFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0RlZmF1bHRDb250YWluZXIgPSB0aGlzLl9wb3BvdmVyICYmIHRoaXMuX2NvbnRlbnQ7XG5cbiAgICBpZiAoaGFzRGVmYXVsdENvbnRhaW5lcikge1xuXG4gICAgICBpZiAoIXRoaXMuX21hc2spIHtcbiAgICAgICAgY29uc3QgbWFzayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBtYXNrLmNsYXNzTGlzdC5hZGQoJ3BvcG92ZXItbWFzaycpO1xuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShtYXNrLCB0aGlzLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2Fycm93KSB7XG4gICAgICAgIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGFycm93LmNsYXNzTGlzdC5hZGQoJ3BvcG92ZXJfX2Fycm93Jyk7XG4gICAgICAgIHRoaXMuX3BvcG92ZXIuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSB1dGlsLmNyZWF0ZUZyYWdtZW50KGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItbWFza1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3ZlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyX19jb250ZW50XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXJfX2Fycm93XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYCk7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGUucXVlcnlTZWxlY3RvcignLnBvcG92ZXJfX2NvbnRlbnQnKTtcblxuICAgICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGUpO1xuICAgIH1cblxuICAgIC8vIEZJWE1FIVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgdGhpcy5fcG9wb3Zlci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpO1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3codGFyZ2V0LCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7U3RyaW5nfEV2ZW50fEhUTUxFbGVtZW50fSB0YXJnZXRcbiAgICogICBbZW5dVGFyZ2V0IGVsZW1lbnQuIENhbiBiZSBlaXRoZXIgYSBDU1Mgc2VsZWN0b3IsIGFuIGV2ZW50IG9iamVjdCBvciBhIERPTSBlbGVtZW50LiBJdCBjYW4gYmUgYWxzbyBwcm92aWRlZCBhcyAnb3B0aW9ucy50YXJnZXQnIGluc3RlYWQuIFsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBruOCv+ODvOOCsuODg+ODiOOBqOOBquOCi+imgee0oOOCkuaMh+WumuOBl+OBvuOBmeOAgkNTU+OCu+ODrOOCr+OCv+OBi2V2ZW5044Kq44OW44K444Kn44Kv44OI44GLRE9N6KaB57Sg44Gu44GE44Ga44KM44GL44KS5rih44Gb44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiAgVXNlIG9uZSBvZiBgXCJmYWRlLWlvc1wiYCwgYFwiZmFkZS1tZFwiYCwgYFwibm9uZVwiYCBhbmQgYFwiZGVmYXVsdFwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcImZhZGUtaW9zXCIsIFwiZmFkZS1tZFwiLCBcIm5vbmVcIiwgXCJkZWZhdWx0XCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBwb3BvdmVyIGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1PcGVuIHRoZSBwb3BvdmVyIGFuZCBwb2ludCBpdCBhdCBhIHRhcmdldC4gVGhlIHRhcmdldCBjYW4gYmUgZWl0aGVyIGFuIGV2ZW50LCBhIENTUyBzZWxlY3RvciBvciBhIERPTSBlbGVtZW50Li5bL2VuXVxuICAgKiAgIFtqYV3lr77osaHjgajjgZnjgovopoHntKDjgavjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgpLooajnpLrjgZfjgb7jgZnjgIJ0YXJnZXTlvJXmlbDjgavjga/jgIEkZXZlbnTjgqrjg5bjgrjjgqfjgq/jg4jjgoRET03jgqjjg6zjg6Hjg7Pjg4jjgoRDU1Pjgrvjg6zjgq/jgr/jgpLmuKHjgZnjgZPjgajjgYzlh7rmnaXjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgZGlzcGxheWVkIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2hvdyh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuICAgIC8vIENvcHkgb3B0aW9ucyBhbmQgaW5jbHVkZSBvcHRpb25zLnRhcmdldFxuICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBFdmVudCkgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIG9wdGlvbnMgPSB7IC4uLnRhcmdldCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCB0YXJnZXQgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudGFyZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0aW9ucy50YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdGlvbnMudGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMudGFyZ2V0IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQudGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICghKG9wdGlvbnMudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdGFyZ2V0IHR5cGUgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnNob3cob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlXG4gICAqIEBzaWduYXR1cmUgaGlkZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gIFVzZSBvbmUgb2YgYFwiZmFkZS1pb3NcImAsIGBcImZhZGUtbWRcImAsIGBcIm5vbmVcImAgYW5kIGBcImRlZmF1bHRcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJmYWRlLWlvc1wiLCBcImZhZGUtbWRcIiwgXCJub25lXCIsIFwiZGVmYXVsdFwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHBvcG92ZXIgaGFzIGJlZW4gaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBjOmaoOOCjOOBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DbG9zZSB0aGUgcG9wb3Zlci5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgpLplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgaGlkZGVuIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZpc2libGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeimgee0oOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2FuY2VsYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgQSBib29sZWFuIHZhbHVlIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgY2FuY2VsYWJsZSBvciBub3QuXG4gICAqXG4gICAqICAgICBXaGVuIHRoZSBwb3BvdmVyIGlzIGNhbmNlbGFibGUgaXQgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtYXNrQ29sb3JcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgcmdiYSgwLCAwLCAwLCAwLjIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgXCJyZ2JhKDAsIDAsIDAsIDAuMilcIi5bL2VuXVxuICAgKiAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglwicmdiYSgwLCAwLCAwLCAwLjIpXCLjgYzjg4fjg5Xjgqnjg6vjg4jlgKTjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcbiAgICB0aGlzLl9tYXJnaW4gPSB0aGlzLl9tYXJnaW4gfHwgcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZ2V0UHJvcGVydHlWYWx1ZSgndG9wJykpO1xuICAgIHRoaXMuX21hcmdpbiA9IHRoaXMuX21hcmdpbiB8fCA2OyAvLyBGaXggZm9yIGlmcmFtZXNcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9yYWRpdXMgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9jb250ZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLWxlZnQtcmFkaXVzJykpO1xuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgZmFsc2UpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsICdkaXJlY3Rpb24nXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdkaXJlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYm91bmRPbkNoYW5nZSgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgdGhpcy5fY3VycmVudERpcmVjdGlvbiAmJiB1dGlsLmFkZE1vZGlmaWVyKHRoaXMsIHRoaXMuX2N1cnJlbnREaXJlY3Rpb24pO1xuICAgIH1cbiAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtQb3BvdmVyQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIFBvcG92ZXJBbmltYXRvcikpIHtcbiAgICAgIHV0aWwudGhyb3dBbmltYXRvcignUG9wb3ZlcicpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgUG9wb3ZlckFuaW1hdG9yKCkge1xuICAgIHJldHVybiBQb3BvdmVyQW5pbWF0b3I7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhQb3BvdmVyRWxlbWVudCwgWydjb3Zlci10YXJnZXQnXSk7XG5cbm9uc0VsZW1lbnRzLlBvcG92ZXIgPSBQb3BvdmVyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXBvcG92ZXInLCBQb3BvdmVyRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcucHJvZ3Jlc3MtYmFyJzogJ3Byb2dyZXNzLWJhci0tKicsXG4gICcucHJvZ3Jlc3MtYmFyX19wcmltYXJ5JzogJ3Byb2dyZXNzLWJhci0tKl9fcHJpbWFyeScsXG4gICcucHJvZ3Jlc3MtYmFyX19zZWNvbmRhcnknOiAncHJvZ3Jlc3MtYmFyLS0qX19zZWNvbmRhcnknXG59O1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyX19zZWNvbmRhcnlcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyX19wcmltYXJ5XCI+PC9kaXY+XG4gIDwvZGl2PlxuYCk7XG5cbmNvbnN0IElOREVUID0gJ2luZGV0ZXJtaW5hdGUnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1wcm9ncmVzcy1iYXJcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dRGlzcGxheSBhIE1hdGVyaWFsIERlc2lnbiBwcm9ncmVzcyBiYXIuWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruOCueOCv+OCpOODq+OBp+ODl+ODreOCsOODrOOCueODkOODvOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFRoZSBjb21wb25lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgbGluZWFyIHByb2dyZXNzIGJhci4gSXQgY2FuIGVpdGhlciBkaXNwbGF5IGEgcHJvZ3Jlc3MgYmFyIHRoYXQgc2hvd3MgdGhlIHVzZXIgaG93IG11Y2ggb2YgYSB0YXNrIGhhcyBiZWVuIGNvbXBsZXRlZC4gSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHBlcmNlbnRhZ2UgaXMgbm90IGtub3duIGl0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYW4gYW5pbWF0ZWQgcHJvZ3Jlc3MgYmFyIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhhdCBhbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4genZRYkdqXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvcHJvZ3Jlc3NcbiAqIEBzZWVhbHNvIG9ucy1wcm9ncmVzcy1jaXJjdWxhclxuICogICBbZW5dVGhlIGA8b25zLXByb2dyZXNzLWNpcmN1bGFyPmAgY29tcG9uZW50IGRpc3BsYXlzIGEgY2lyY3VsYXIgcHJvZ3Jlc3MgaW5kaWNhdG9yLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcHJvZ3Jlc3MtYmFyXG4gKiAgdmFsdWU9XCI1NVwiXG4gKiAgc2Vjb25kYXJ5LXZhbHVlPVwiODdcIj5cbiAqIDwvb25zLXByb2dyZXNzLWJhcj5cbiAqXG4gKiA8b25zLXByb2dyZXNzLWJhclxuICogIGluZGV0ZXJtaW5hdGU+XG4gKiA8L29ucy1wcm9ncmVzcy1iYXI+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyZXNzQmFyRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAgICogICBbamFd44OX44Ot44Kw44Os44K544Kk44Oz44K444Kx44O844K/44Gu6KaL44Gf55uu44KS5aSJ5pu044GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBrumAsuihjOeKtuazgeOBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAgjDjgYvjgokxMDDjga7plpPjga7lgKTjgpLmjIflrprjgZfjgabkuIvjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzZWNvbmRhcnktdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgc2Vjb25kYXJ5IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7vvJLnlarnm67jga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5kZXRlcm1pbmF0ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGlmICghdGhpcy5faXNDb21waWxlZCgpKSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVtcGxhdGUgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnByb2dyZXNzLWJhcicpO1xuICAgIH1cblxuICAgIHRoaXMuX3ByaW1hcnkgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSwgJy5wcm9ncmVzcy1iYXJfX3ByaW1hcnknKTtcbiAgICB0aGlzLl9zZWNvbmRhcnkgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSwgJy5wcm9ncmVzcy1iYXJfX3NlY29uZGFyeScpO1xuXG4gICAgdGhpcy5fdXBkYXRlRGV0ZXJtaW5hdGUoKTtcbiAgICB0aGlzLl91cGRhdGVWYWx1ZSgpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSk7XG5cbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBfaXNDb21waWxlZCgpIHtcbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHRoaXMsICcucHJvZ3Jlc3MtYmFyJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXJFbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1iYXInKTtcblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQoYmFyRWxlbWVudCwgJy5wcm9ncmVzcy1iYXJfX3NlY29uZGFyeScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZChiYXJFbGVtZW50LCAnLnByb2dyZXNzLWJhcl9fcHJpbWFyeScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICd2YWx1ZScsICdzZWNvbmRhcnktdmFsdWUnLCBJTkRFVF07XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIHRoaXMuaGFzQXR0cmlidXRlKElOREVUKSAmJiB0aGlzLl91cGRhdGVEZXRlcm1pbmF0ZSgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3ZhbHVlJyB8fCBuYW1lID09PSAnc2Vjb25kYXJ5LXZhbHVlJykge1xuICAgICAgdGhpcy5fdXBkYXRlVmFsdWUoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09IElOREVUKSB7XG4gICAgICB0aGlzLl91cGRhdGVEZXRlcm1pbmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVEZXRlcm1pbmF0ZSgpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdXRpbC50b2dnbGVNb2RpZmllcih0aGlzLCBJTkRFVCwgeyBmb3JjZTogdGhpcy5oYXNBdHRyaWJ1dGUoSU5ERVQpIH0pKTtcbiAgfVxuXG4gIF91cGRhdGVWYWx1ZSgpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fcHJpbWFyeS5zdHlsZS53aWR0aCA9ICh0aGlzLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSkgPyB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKSArICclJyA6ICcwJSc7XG4gICAgICB0aGlzLl9zZWNvbmRhcnkuc3R5bGUud2lkdGggPSB0aGlzLmhhc0F0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgPyB0aGlzLmdldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgKyAnJScgOiAnMCUnO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBNYXRoLmZsb29yKHZhbHVlKSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIHx8ICcwJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNlY29uZGFyeVZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHNlY29uZGFyeSBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu77yS55Wq55uu44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgc2Vjb25kYXJ5VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJywgTWF0aC5mbG9vcih2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0IHNlY29uZGFyeVZhbHVlKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgfHwgJzAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaW5kZXRlcm1pbmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgLCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuICBzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoSU5ERVQsICcnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShJTkRFVCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGluZGV0ZXJtaW5hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKElOREVUKTtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5Qcm9ncmVzc0JhciA9IFByb2dyZXNzQmFyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXByb2dyZXNzLWJhcicsIFByb2dyZXNzQmFyRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcucHJvZ3Jlc3MtY2lyY3VsYXInOiAncHJvZ3Jlc3MtY2lyY3VsYXItLSonLFxuICAnLnByb2dyZXNzLWNpcmN1bGFyX19iYWNrZ3JvdW5kJzogJ3Byb2dyZXNzLWNpcmN1bGFyLS0qX19iYWNrZ3JvdW5kJyxcbiAgJy5wcm9ncmVzcy1jaXJjdWxhcl9fcHJpbWFyeSc6ICdwcm9ncmVzcy1jaXJjdWxhci0tKl9fcHJpbWFyeScsXG4gICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3NlY29uZGFyeSc6ICdwcm9ncmVzcy1jaXJjdWxhci0tKl9fc2Vjb25kYXJ5J1xufTtcblxuY29uc3QgdGVtcGxhdGUgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICA8c3ZnIGNsYXNzPVwicHJvZ3Jlc3MtY2lyY3VsYXJcIj5cbiAgICA8Y2lyY2xlIGNsYXNzPVwicHJvZ3Jlc3MtY2lyY3VsYXJfX2JhY2tncm91bmRcIiAvPlxuICAgIDxjaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1jaXJjdWxhcl9fc2Vjb25kYXJ5XCIgY3g9XCI1MCVcIiBjeT1cIjUwJVwiIHI9XCI0MCVcIiAvPlxuICAgIDxjaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1jaXJjdWxhcl9fcHJpbWFyeVwiIGN4PVwiNTAlXCIgY3k9XCI1MCVcIiByPVwiNDAlXCIgLz5cbiAgPC9zdmc+XG5gKTtcblxuY29uc3QgSU5ERVQgPSAnaW5kZXRlcm1pbmF0ZSc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXByb2dyZXNzLWNpcmN1bGFyXG4gKiBAY2F0ZWdvcnkgdmlzdWFsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFRoaXMgY29tcG9uZW50IGRpc3BsYXlzIGEgY2lyY3VsYXIgcHJvZ3Jlc3MgaW5kaWNhdG9yLiBJdCBjYW4gZWl0aGVyIGJlIHVzZWQgdG8gc2hvdyBob3cgbXVjaCBvZiBhIHRhc2sgaGFzIGJlZW4gY29tcGxldGVkIG9yIHRvIHNob3cgYSBsb29waW5nIGFuaW1hdGlvbiB0byBpbmRpY2F0ZSB0aGF0IGFuIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBFVnpNalJcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9wcm9ncmVzcy1jaXJjdWxhclxuICogQHNlZWFsc28gb25zLXByb2dyZXNzLWJhclxuICogICBbZW5dVGhlIGA8b25zLXByb2dyZXNzLWJhcj5gIGNvbXBvbmVudCBkaXNwbGF5cyBhIGJhciBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1wcm9ncmVzcy1jaXJjdWxhclxuICogIHZhbHVlPVwiNTVcIlxuICogIHNlY29uZGFyeS12YWx1ZT1cIjg3XCI+XG4gKiA8L29ucy1wcm9ncmVzcy1jaXJjdWxhcj5cbiAqXG4gKiA8b25zLXByb2dyZXNzLWNpcmN1bGFyXG4gKiAgaW5kZXRlcm1pbmF0ZT5cbiAqIDwvb25zLXByb2dyZXNzLWNpcmN1bGFyPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9ncmVzc0NpcmN1bGFyRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAgICogICBbamFd44OX44Ot44Kw44Os44K544Kk44Oz44K444Kx44O844K/44Gu6KaL44Gf55uu44KS5aSJ5pu044GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBrumAsuihjOeKtuazgeOBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAgjDjgYvjgokxMDDjga7plpPjga7lgKTjgpLmjIflrprjgZfjgabkuIvjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzZWNvbmRhcnktdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgc2Vjb25kYXJ5IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7vvJLnlarnm67jga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5kZXRlcm1pbmF0ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3ZhbHVlJywgJ3NlY29uZGFyeS12YWx1ZScsIElOREVUXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgdGhpcy5oYXNBdHRyaWJ1dGUoSU5ERVQpICYmIHRoaXMuX3VwZGF0ZURldGVybWluYXRlKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAndmFsdWUnIHx8IG5hbWUgPT09ICdzZWNvbmRhcnktdmFsdWUnKSB7XG4gICAgICB0aGlzLl91cGRhdGVWYWx1ZSgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gSU5ERVQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURldGVybWluYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZURldGVybWluYXRlKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB1dGlsLnRvZ2dsZU1vZGlmaWVyKHRoaXMsIElOREVULCB7IGZvcmNlOiB0aGlzLmhhc0F0dHJpYnV0ZShJTkRFVCkgfSkpO1xuICB9XG5cbiAgX3VwZGF0ZVZhbHVlKCkge1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSkge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGVyID0gTWF0aC5jZWlsKHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpICogMjUxLjMyICogMC4wMSk7XG4gICAgICAgIHRoaXMuX3ByaW1hcnkuc3R5bGVbJ3N0cm9rZS1kYXNoYXJyYXknXSA9IHBlciArICclLCAyNTEuMzIlJztcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ3NlY29uZGFyeS12YWx1ZScpKSB7XG4gICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXIgPSAgTWF0aC5jZWlsKHRoaXMuZ2V0QXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnKSAqIDI1MS4zMiAqIDAuMDEpO1xuICAgICAgICB0aGlzLl9zZWNvbmRhcnkuc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlY29uZGFyeS5zdHlsZVsnc3Ryb2tlLWRhc2hhcnJheSddID0gcGVyICsgJyUsIDI1MS4zMiUnO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NlY29uZGFyeS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBNYXRoLmZsb29yKHZhbHVlKSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIHx8ICcwJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNlY29uZGFyeVZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHNlY29uZGFyeSBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu77yS55Wq55uu44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgc2Vjb25kYXJ5VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJywgTWF0aC5mbG9vcih2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0IHNlY29uZGFyeVZhbHVlKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgfHwgJzAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaW5kZXRlcm1pbmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgLCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuICBzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoSU5ERVQsICcnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShJTkRFVCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGluZGV0ZXJtaW5hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKElOREVUKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGlmICh0aGlzLl9pc0NvbXBpbGVkKCkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1jaXJjdWxhcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmltYXJ5ID0gdXRpbC5maW5kQ2hpbGQodGhpcy5fdGVtcGxhdGUsICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3ByaW1hcnknKTtcbiAgICB0aGlzLl9zZWNvbmRhcnkgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSwgJy5wcm9ncmVzcy1jaXJjdWxhcl9fc2Vjb25kYXJ5Jyk7XG5cbiAgICB0aGlzLl91cGRhdGVEZXRlcm1pbmF0ZSgpO1xuICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuX3RlbXBsYXRlKTtcblxuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9pc0NvbXBpbGVkKCkge1xuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1jaXJjdWxhcicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ZnID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1jaXJjdWxhcicpO1xuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZChzdmcsICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3NlY29uZGFyeScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZChzdmcsICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3ByaW1hcnknKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLlByb2dyZXNzQ2lyY3VsYXIgPSBQcm9ncmVzc0NpcmN1bGFyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXByb2dyZXNzLWNpcmN1bGFyJywgUHJvZ3Jlc3NDaXJjdWxhckVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4uL29ucy9nZXN0dXJlLWRldGVjdG9yLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vb25zL2FuaW1pdC5qcyc7XG5cbmNvbnN0IFNUQVRFX0lOSVRJQUwgPSAnaW5pdGlhbCc7XG5jb25zdCBTVEFURV9QUkVBQ1RJT04gPSAncHJlYWN0aW9uJztcbmNvbnN0IFNUQVRFX0FDVElPTiA9ICdhY3Rpb24nO1xuXG5jb25zdCB0aHJvd1R5cGUgPSAoZWwsIHR5cGUpID0+IHV0aWwudGhyb3coYFwiJHtlbH1cIiBtdXN0IGJlICR7dHlwZX1gKTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtcHVsbC1ob29rXG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDb21wb25lbnQgdGhhdCBhZGRzICoqUHVsbCB0byByZWZyZXNoKiogZnVuY3Rpb25hbGl0eSB0byBhbiBgPG9ucy1wYWdlPmAgZWxlbWVudC5cbiAqXG4gKiAgICAgSXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhIHRhc2sgd2hlbiB0aGUgdXNlciBwdWxscyBkb3duIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UuIEEgY29tbW9uIHVzYWdlIGlzIHRvIHJlZnJlc2ggdGhlIGRhdGEgZGlzcGxheWVkIGluIGEgcGFnZS5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBXYkpvZ01cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9wdWxsLWhvb2tcbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtcHVsbC1ob29rPlxuICogICAgIFJlbGVhc2UgdG8gcmVmcmVzaFxuICogICA8L29ucy1wdWxsLWhvb2s+XG4gKiA8L29ucy1wYWdlPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ29ucy1wdWxsLWhvb2snKS5vbkFjdGlvbiA9IGZ1bmN0aW9uKGRvbmUpIHtcbiAqICAgICBzZXRUaW1lb3V0KGRvbmUsIDEwMDApO1xuICogICB9O1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFB1bGxIb29rRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IGNoYW5nZXN0YXRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCB3aGVuIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkLiBUaGUgc3RhdGUgY2FuIGJlIGVpdGhlciBcImluaXRpYWxcIiwgXCJwcmVhY3Rpb25cIiBvciBcImFjdGlvblwiLlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBrueKtuaFi+OBjOWkieOCj+OBo+OBn+WgtOWQiOOBq+eZuueBq+OBl+OBvuOBmeOAgueKtuaFi+OBr+OAgVwiaW5pdGlhbFwiLCBcInByZWFjdGlvblwiLCBcImFjdGlvblwi44Gu44GE44Ga44KM44GL44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucHVsbEhvb2tcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQuc3RhdGVcbiAgICogICBbZW5dQ3VycmVudCBzdGF0ZS5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7nirbmhYvlkI3jgpLlj4LnhafjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHB1bGxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIHB1bGwgaG9vayBpcyBwdWxsZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucmF0aW9cbiAgICogICBbZW5dVGhlIHB1bGxlZCBkaXN0YW5jZSByYXRpbyAoc2Nyb2xsIC8gaGVpZ2h0KS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQuYW5pbWF0aW9uT3B0aW9uc1xuICAgKiAgIFtlbl1UaGUgYW5pbWF0aW9uIG9wdGlvbnMgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIFwicHVsbC10by1yZWZyZXNoXCIgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIFkaXNhYmxlZOeKtuaFi+OBq+OBquOCiuOCouOCr+OCt+ODp+ODs+OBjOWun+ihjOOBleOCjOOBquOBj+OBquOCiuOBvuOBmVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGhlaWdodFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgaGVpZ2h0IG9mIHRoZSBjb21wb25lbnQuIFdoZW4gcHVsbGVkIGRvd24gZnVydGhlciB0aGFuIHRoaXMgdmFsdWUgaXQgd2lsbCBzd2l0Y2ggdG8gdGhlIFwicHJlYWN0aW9uXCIgc3RhdGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwiNjRweFwiLlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBrumrmOOBleOCkuaMh+WumuOBl+OBvuOBmeOAguOBk+OBrumrmOOBleS7peS4iuOBq3B1bGwgZG93buOBmeOCi+OBqFwicHJlYWN0aW9uXCLnirbmhYvjgavnp7vooYzjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga7lgKTjga9cIjY0cHhcIuOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHRocmVzaG9sZC1oZWlnaHRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIHRocmVzaG9sZCBoZWlnaHQuIFRoZSBjb21wb25lbnQgYXV0b21hdGljYWxseSBzd2l0Y2hlcyB0byB0aGUgXCJhY3Rpb25cIiBzdGF0ZSB3aGVuIHB1bGxlZCBmdXJ0aGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCI5NnB4XCIuIEEgbmVnYXRpdmUgdmFsdWUgd2lsbCBkaXNhYmxlIHRoaXMgcHJvcGVydHkuIElmIHRoaXMgdmFsdWUgaXMgbG93ZXIgdGhhbiB0aGUgaGVpZ2h0LCBpdCB3aWxsIHNraXAgXCJwcmVhY3Rpb25cIiBzdGF0ZS5bL2VuXVxuICAgKiAgIFtqYV3plr7lgKTjgajjgarjgovpq5jjgZXjgpLmjIflrprjgZfjgb7jgZnjgILjgZPjga7lgKTjgafmjIflrprjgZfjgZ/pq5jjgZXjgojjgorjgoJwdWxsIGRvd27jgZnjgovjgajjgIHjgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga/oh6rli5XnmoTjgatcImFjdGlvblwi54q25oWL44Gr56e76KGM44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZml4ZWQtY29udGVudFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIHdpbGwgbm90IG1vdmUgd2hlbiBwdWxsaW5nLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeODl+ODq+ODleODg+OCr+OBjOW8leOBjeWHuuOBleOCjOOBpuOBhOOCi+aZguOBq+OCguOCs+ODs+ODhuODs+ODhOOBr+WLleOBjeOBvuOBm+OCk+OAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZml4ZWRDb250ZW50XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2Ugd2lsbCBub3QgbW92ZSB3aGVuIHB1bGxpbmcuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44OX44Or44OV44OD44Kv44GM5byV44GN5Ye644GV44KM44Gm44GE44KL5pmC44Gr44KC44Kz44Oz44OG44Oz44OE44Gv5YuV44GN44G+44Gb44KT44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX29uRHJhZyA9IHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uRHJhZ1N0YXJ0ID0gdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkRyYWdFbmQgPSB0aGlzLl9vbkRyYWdFbmQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblNjcm9sbCA9IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9JTklUSUFMLCB0cnVlKTtcbiAgICB0aGlzLl9oaWRlKCk7IC8vIEZpeCBmb3IgdHJhbnNwYXJlbnQgdG9vbGJhciB0cmFuc2l0aW9uc1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ3B1bGwnKTtcbiAgICB0aGlzLl9jb25uZWN0T25QdWxsID0gb25Db25uZWN0ZWQ7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uUHVsbCA9IG9uRGlzY29ubmVjdGVkO1xuICB9XG5cbiAgX3NldFN0eWxlKCkge1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgJ3B4JztcbiAgICBzdHlsZXIodGhpcywgeyBoZWlnaHQsIGxpbmVIZWlnaHQ6IGhlaWdodCB9KTtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPT09ICcnICYmIHRoaXMuX3Nob3coKTtcbiAgfVxuXG4gIF9vblNjcm9sbChldmVudCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9wYWdlRWxlbWVudDtcblxuICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCA8IDApIHtcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBfY2FuQ29uc3VtZUdlc3R1cmUoZ2VzdHVyZSkge1xuICAgIHJldHVybiBnZXN0dXJlLmRpcmVjdGlvbiA9PT0gJ3VwJyB8fCBnZXN0dXJlLmRpcmVjdGlvbiA9PT0gJ2Rvd24nO1xuICB9XG5cbiAgX29uRHJhZ1N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5nZXN0dXJlIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXBZID0gZXZlbnQuZ2VzdHVyZS5jZW50ZXIuY2xpZW50WSArIHRoaXMuX3BhZ2VFbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBtYXhZID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIC8vIE9ubHkgdXNlIGRyYWdzIHRoYXQgc3RhcnQgbmVhciB0aGUgcHVsbEhvb2sgdG8gcmVkdWNlIGZsaWNrZXJpbmdzXG4gICAgY29uc3QgZHJhZ2dhYmxlQXJlYVJhdGlvID0gMTtcblxuICAgIHRoaXMuX2lnbm9yZURyYWcgPSBldmVudC5jb25zdW1lZCB8fCAodGFwWSA+IG1heFkgKiBkcmFnZ2FibGVBcmVhUmF0aW8pO1xuXG4gICAgaWYgKCF0aGlzLl9pZ25vcmVEcmFnKSB7XG4gICAgICBjb25zdCBjb25zdW1lID0gZXZlbnQuY29uc3VtZTtcbiAgICAgIGV2ZW50LmNvbnN1bWUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN1bWUgJiYgY29uc3VtZSgpO1xuICAgICAgICB0aGlzLl9pZ25vcmVEcmFnID0gdHJ1ZTtcbiAgICAgICAgLy8gVGhpcyBlbGVtZW50cyByZXNpemVzIC5wYWdlX19jb250ZW50IHNvIGl0IGlzIHNhZmVyXG4gICAgICAgIC8vIHRvIGhpZGUgaXQgd2hlbiBvdGhlciBjb21wb25lbnRzIGFyZSBkcmFnZ2VkLlxuICAgICAgICB0aGlzLl9oaWRlKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5fY2FuQ29uc3VtZUdlc3R1cmUoZXZlbnQuZ2VzdHVyZSkpIHtcbiAgICAgICAgY29uc3VtZSAmJiBjb25zdW1lKCk7XG4gICAgICAgIGV2ZW50LmNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc2hvdygpOyAvLyBOb3QgZW5vdWdoIGR1ZSB0byAnZHJhZ0xvY2tBeGlzJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3N0YXJ0U2Nyb2xsID0gdGhpcy5fcGFnZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICB9XG5cbiAgX29uRHJhZyhldmVudCkge1xuICAgIGlmICghZXZlbnQuZ2VzdHVyZSB8fCB0aGlzLmRpc2FibGVkIHx8IHRoaXMuX2lnbm9yZURyYWcgfHwgIXRoaXMuX2NhbkNvbnN1bWVHZXN0dXJlKGV2ZW50Lmdlc3R1cmUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTmVjZXNzYXJ5IGR1ZSB0byAnZHJhZ0xvY2tBeGlzJyAoMjVweClcbiAgICBpZiAodGhpcy5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRoaXMuX3Nob3coKTtcbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHRhcFkgPSBldmVudC5nZXN0dXJlLmNlbnRlci5jbGllbnRZICsgdGhpcy5fcGFnZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IG1heFkgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICBjb25zdCBzY3JvbGwgPSBNYXRoLm1heChldmVudC5nZXN0dXJlLmRlbHRhWSAtIHRoaXMuX3N0YXJ0U2Nyb2xsLCAwKTtcbiAgICBpZiAoc2Nyb2xsICE9PSB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24pIHtcblxuICAgICAgY29uc3QgdGggPSB0aGlzLnRocmVzaG9sZEhlaWdodDtcbiAgICAgIGlmICh0aCA+IDAgJiYgc2Nyb2xsID49IHRoKSB7XG4gICAgICAgIGV2ZW50Lmdlc3R1cmUuc3RvcERldGVjdCgpO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fZmluaXNoKCkpO1xuXG4gICAgICB9IGVsc2UgaWYgKHNjcm9sbCA+PSB0aGlzLmhlaWdodCkge1xuICAgICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9QUkVBQ1RJT04pO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9JTklUSUFMKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oc2Nyb2xsKTtcbiAgICB9XG4gIH1cblxuICBfb25EcmFnRW5kKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5nZXN0dXJlIHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5faWdub3JlRHJhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiA+IDApIHtcbiAgICAgIGNvbnN0IHNjcm9sbCA9IHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbjtcblxuICAgICAgaWYgKHNjcm9sbCA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oMCwge2FuaW1hdGU6IHRydWV9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9uQWN0aW9uXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGBhY3Rpb25gIHN0YXRlIGlmIGl0IGV4aXN0cy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgZ2l2ZW4gYSBgZG9uZWAgY2FsbGJhY2sgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgb25BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uQWN0aW9uO1xuICB9XG5cbiAgc2V0IG9uQWN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmICEodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHRocm93VHlwZSgnb25BY3Rpb24nLCAnZnVuY3Rpb24gb3IgbnVsbCcpO1xuICAgIH1cbiAgICB0aGlzLl9vbkFjdGlvbiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvblB1bGxcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSG9vayBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgcHVsbHMgdGhlIGVsZW1lbnQuIEl0IGdldHMgdGhlIHB1bGxlZCBkaXN0YW5jZSByYXRpbyAoc2Nyb2xsIC8gaGVpZ2h0KSBhbmQgYW4gYW5pbWF0aW9uT3B0aW9ucyBvYmplY3QgYXMgYXJndW1lbnRzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIF9maW5pc2goKSB7XG4gICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfQUNUSU9OKTtcbiAgICB0aGlzLl90cmFuc2xhdGVUbyh0aGlzLmhlaWdodCwge2FuaW1hdGU6IHRydWV9KTtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLm9uQWN0aW9uIHx8IChkb25lID0+IGRvbmUoKSk7XG4gICAgYWN0aW9uKCgpID0+IHtcbiAgICAgIHRoaXMuX3RyYW5zbGF0ZVRvKDAsIHthbmltYXRlOiB0cnVlfSk7XG4gICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9JTklUSUFMKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaGVpZ2h0XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgaGVpZ2h0IG9mIHRoZSBwdWxsIGhvb2sgaW4gcGl4ZWxzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgNjRweGAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldCBoZWlnaHQodmFsdWUpIHtcbiAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgdGhyb3dUeXBlKCdoZWlnaHQnLCAnaW50ZWdlcicpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHt2YWx1ZX1weGApO1xuICB9XG5cbiAgZ2V0IGhlaWdodCgpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpIHx8ICc2NCcsIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdGhyZXNob2xkSGVpZ2h0XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgdGhyZXNob2xkSGVpZ2h0IG9mIHRoZSBwdWxsIGhvb2sgaW4gcGl4ZWxzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgOTZweGAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldCB0aHJlc2hvbGRIZWlnaHQodmFsdWUpIHtcbiAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgdGhyb3dUeXBlKCd0aHJlc2hvbGRIZWlnaHQnLCAnaW50ZWdlcicpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0aHJlc2hvbGQtaGVpZ2h0JywgYCR7dmFsdWV9cHhgKTtcbiAgfVxuXG4gIGdldCB0aHJlc2hvbGRIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCd0aHJlc2hvbGQtaGVpZ2h0JykgfHwgJzk2JywgMTApO1xuICB9XG5cbiAgX3NldFN0YXRlKHN0YXRlLCBub0V2ZW50KSB7XG4gICAgY29uc3QgbGFzdFN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHN0YXRlKTtcblxuICAgIGlmICghbm9FdmVudCAmJiBsYXN0U3RhdGUgIT09IHRoaXMuc3RhdGUpIHtcbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnY2hhbmdlc3RhdGUnLCB7XG4gICAgICAgIHB1bGxIb29rOiB0aGlzLFxuICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgIGxhc3RTdGF0ZTogbGFzdFN0YXRlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHN0YXRlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBzdGF0ZSBvZiB0aGUgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IHN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcHVsbERpc3RhbmNlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBpeGVscyB0aGUgcHVsbCBob29rIGhhcyBtb3ZlZC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7jg5fjg6vjg5Xjg4Pjgq/jgYzlvJXjgY3lh7rjgZXjgozjgZ/ot53pm6LjgpLjg5Tjgq/jgrvjg6vmlbDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHB1bGxEaXN0YW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFRyYW5zbGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIF9zaG93KCkge1xuICAgIC8vIFJ1biBhc3luY3Job25vdXNseSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBBbmltaXQncyBzdHlsZSBjbGVhblxuICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGlmICh0aGlzLl9wYWdlRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9wYWdlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBgLSR7dGhpcy5oZWlnaHR9cHhgO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmICh0aGlzLl9wYWdlRWxlbWVudCkge1xuICAgICAgdGhpcy5fcGFnZUVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBzY3JvbGxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqL1xuICBfdHJhbnNsYXRlVG8oc2Nyb2xsLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5fY3VycmVudFRyYW5zbGF0aW9uID09IDAgJiYgc2Nyb2xsID09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gPSBzY3JvbGw7XG4gICAgY29uc3Qgb3B0ID0gb3B0aW9ucy5hbmltYXRlID8geyBkdXJhdGlvbjogLjMsIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKScgfSA6IHt9O1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncHVsbCcsIHsgcmF0aW86IChzY3JvbGwgLyB0aGlzLmhlaWdodCkudG9GaXhlZCgyKSwgYW5pbWF0aW9uT3B0aW9uczogb3B0IH0pO1xuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSAgdGhpcy5oYXNBdHRyaWJ1dGUoJ2ZpeGVkLWNvbnRlbnQnKSA/IHRoaXMgOiB0aGlzLl9wYWdlRWxlbWVudDtcblxuICAgIGFuaW1pdChzY3JvbGxFbGVtZW50KVxuICAgICAgLnF1ZXVlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMHB4LCAke3Njcm9sbH1weCwgMHB4KWAgfSwgb3B0KVxuICAgICAgLnBsYXkoKCkgPT4ge1xuICAgICAgICBzY3JvbGwgPT09IDAgJiYgc3R5bGVyLmNsZWFyKHNjcm9sbEVsZW1lbnQsICd0cmFuc2l0aW9uIHRyYW5zZm9ybScpO1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb3B0aW9ucy5jYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgX2Rpc2FibGVEcmFnTG9jaygpIHsgLy8gZTJlIHRlc3RzIG5lZWQgaXRcbiAgICB0aGlzLl9kcmFnTG9ja0Rpc2FibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyh0cnVlKTtcbiAgfVxuXG4gIF9zZXR1cExpc3RlbmVycyhhZGQpIHtcbiAgICBjb25zdCBzY3JvbGxUb2dnbGUgPSBhY3Rpb24gPT4gdGhpcy5fcGFnZUVsZW1lbnRbYCR7YWN0aW9ufUV2ZW50TGlzdGVuZXJgXSgnc2Nyb2xsJywgdGhpcy5fb25TY3JvbGwsIGZhbHNlKTtcbiAgICBjb25zdCBnZFRvZ2dsZSA9IGFjdGlvbiA9PiB7XG4gICAgICBjb25zdCBwYXNzaXZlID0geyBwYXNzaXZlOiB0cnVlIH07XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3JbYWN0aW9uXSgnZHJhZycsIHRoaXMuX29uRHJhZywgcGFzc2l2ZSk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3JbYWN0aW9uXSgnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQsIHBhc3NpdmUpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWdlbmQnLCB0aGlzLl9vbkRyYWdFbmQsIHBhc3NpdmUpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5fZ2VzdHVyZURldGVjdG9yKSB7XG4gICAgICBnZFRvZ2dsZSgnb2ZmJyk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbnVsbDtcbiAgICB9XG4gICAgc2Nyb2xsVG9nZ2xlKCdyZW1vdmUnKTtcblxuICAgIGlmIChhZGQpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcy5fcGFnZUVsZW1lbnQsIHtcbiAgICAgICAgZHJhZ01pbkRpc3RhbmNlOiAxLFxuICAgICAgICBkcmFnRGlzdGFuY2VDb3JyZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgZHJhZ0xvY2tUb0F4aXM6ICF0aGlzLl9kcmFnTG9ja0Rpc2FibGVkLFxuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgZ2RUb2dnbGUoJ29uJyk7XG4gICAgICBzY3JvbGxUb2dnbGUoJ2FkZCcpO1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiA9IDA7XG4gICAgdGhpcy5fcGFnZUVsZW1lbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyh0cnVlKTtcbiAgICB0aGlzLl9zZXRTdHlsZSgpO1xuXG4gICAgdGhpcy5fY29ubmVjdE9uUHVsbCgpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5faGlkZSgpO1xuICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKGZhbHNlKTtcblxuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPblB1bGwoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2hlaWdodCddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ2hlaWdodCcgJiYgdGhpcy5fcGFnZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsnY2hhbmdlc3RhdGUnLCAncHVsbCddO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoUHVsbEhvb2tFbGVtZW50LCBbJ2Rpc2FibGVkJywgJ2ZpeGVkLWNvbnRlbnQnXSk7XG5cbm9uc0VsZW1lbnRzLlB1bGxIb29rID0gUHVsbEhvb2tFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcHVsbC1ob29rJywgUHVsbEhvb2tFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBCYXNlSW5wdXRFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWlucHV0LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3JhbmdlLS0qJyxcbiAgJy5yYW5nZV9faW5wdXQnOiAncmFuZ2UtLSpfX2lucHV0JyxcbiAgJy5yYW5nZV9fZm9jdXMtcmluZyc6ICdyYW5nZS0tKl9fZm9jdXMtcmluZydcbn07XG5cbmNvbnN0IGFjdGl2ZUNsYXNzVG9rZW4gPSAncmFuZ2VfX2lucHV0LS1hY3RpdmUnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1yYW5nZVxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIHNsaWRlclsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBSYW5nZSBpbnB1dCBjb21wb25lbnQuIFVzZWQgdG8gZGlzcGxheSBhIGRyYWdnYWJsZSBzbGlkZXIuXG4gKlxuICogICAgIFdvcmtzIHZlcnkgc2ltaWxhciB0byB0aGUgYDxpbnB1dCB0eXBlPVwicmFuZ2VcIj5gIGVsZW1lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4geFpRb21NXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvcmFuZ2VcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLWlucHV0XG4gKiAgIFtlbl1UaGUgYDxvbnMtaW5wdXQ+YCBjb21wb25lbnQgaXMgdXNlZCB0byBkaXNwbGF5IHRleHQgaW5wdXRzLCByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcmFuZ2UgdmFsdWU9XCIyMFwiPjwvb25zLXJhbmdlPlxuICogPG9ucy1yYW5nZSBtb2RpZmllcj1cIm1hdGVyaWFsXCIgdmFsdWU9XCIxMFwiPjwvcmFuZ2U+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZ2VFbGVtZW50IGV4dGVuZHMgQmFzZUlucHV0RWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX29uTW91c2VEb3duID0gdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbk1vdXNlVXAgPSB0aGlzLl9vbk1vdXNlVXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblRvdWNoU3RhcnQgPSB0aGlzLl9vblRvdWNoU3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblRvdWNoRW5kID0gdGhpcy5fb25Ub3VjaEVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uSW5wdXQgPSB0aGlzLl91cGRhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkRyYWdzdGFydCA9IHRoaXMuX29uRHJhZ3N0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25EcmFnZW5kID0gdGhpcy5fb25EcmFnZW5kLmJpbmQodGhpcyk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBzdXBlci5fY29tcGlsZSgpO1xuICAgIHRoaXMuX3VwZGF0ZURpc2FibGVkKHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKTtcbiAgfVxuXG4gIC8qIEluaGVyaXRlZCBwcm9wcyAqL1xuXG4gIF91cGRhdGUoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9pbnB1dDtcbiAgICBjb25zdCBmb2N1c1JpbmcgPSB0aGlzLl9mb2N1c1Jpbmc7XG5cbiAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IGAkezEwMCAqIHRoaXMuX3JhdGlvfSUgMnB4YDtcbiAgICBmb2N1c1JpbmcudmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgLy8gTk9URTogXCJfemVyb1wiIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDU1Mgc3R5bGluZy5cbiAgICBpZiAoKGlucHV0Lm1pbiA9PT0gJycgJiYgaW5wdXQudmFsdWUgPT09ICcwJykgfHwgaW5wdXQubWluID09PSBpbnB1dC52YWx1ZSkge1xuICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCdfemVybycsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdfemVybycpO1xuICAgIH1cblxuICAgIFsnbWluJywgJ21heCddLmZvckVhY2goYXR0ciA9PiBmb2N1c1JpbmdbYXR0cl0gPSBpbnB1dFthdHRyXSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF90ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICAgPGlucHV0IHR5cGU9XCIke3RoaXMudHlwZX1cIiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENsYXNzTmFtZX1fX2lucHV0XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJyYW5nZV9fZm9jdXMtcmluZ1wiIHRhYkluZGV4PVwiLTFcIj5cbiAgICBgO1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAncmFuZ2UnO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdyYW5nZSc7XG4gIH1cblxuICAvKiBPd24gcHJvcHMgKi9cblxuICBfb25Nb3VzZURvd24oZSkge1xuICAgIHRoaXMuX2lucHV0LmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3NUb2tlbik7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX2lucHV0LmZvY3VzKCkpO1xuICB9XG5cbiAgX29uVG91Y2hTdGFydChlKSB7XG4gICAgdGhpcy5fb25Nb3VzZURvd24oKTtcbiAgfVxuXG4gIF9vbk1vdXNlVXAoZSkge1xuICAgIHRoaXMuX2lucHV0LmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3NUb2tlbik7XG4gIH1cblxuICBfb25Ub3VjaEVuZChlKSB7XG4gICAgdGhpcy5fb25Nb3VzZVVwKGUpO1xuICB9XG5cbiAgX29uRHJhZ3N0YXJ0KGUpIHtcbiAgICBlLmNvbnN1bWVkID0gdHJ1ZTtcbiAgICBlLmdlc3R1cmUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5faW5wdXQuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzc1Rva2VuKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLl9vbkRyYWcpO1xuICB9XG5cbiAgX29uRHJhZyhlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIF9vbkRyYWdlbmQoZSkge1xuICAgIHRoaXMuX2lucHV0LmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3NUb2tlbik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgfVxuXG4gIGdldCBfZm9jdXNSaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzFdO1xuICB9XG5cbiAgZ2V0IF9yYXRpbygpIHtcbiAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHJhdGlvLlxuICAgIGNvbnN0IG1pbiA9IHRoaXMuX2lucHV0Lm1pbiA9PT0gJycgPyAwIDogcGFyc2VJbnQodGhpcy5faW5wdXQubWluKTtcbiAgICBjb25zdCBtYXggPSB0aGlzLl9pbnB1dC5tYXggPT09ICcnID8gMTAwIDogcGFyc2VJbnQodGhpcy5faW5wdXQubWF4KTtcblxuICAgIHJldHVybiAodGhpcy52YWx1ZSAtIG1pbikgLyAobWF4IC0gbWluKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2Rpc2FibGVkJywgLi4uQmFzZUlucHV0RWxlbWVudC5vYnNlcnZlZEF0dHJpYnV0ZXNdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgdGhpcy5fdXBkYXRlRGlzYWJsZWQoY3VycmVudCk7XG4gICAgfVxuICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRpc2FibGVkXG4gICAqL1xuICBfdXBkYXRlRGlzYWJsZWQoZGlzYWJsZWQpIHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgncmFuZ2UtLWRpc2FibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgncmFuZ2UtLWRpc2FibGVkJyk7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fc2V0dXBMaXN0ZW5lcnModHJ1ZSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyhmYWxzZSk7XG4gIH1cblxuICBfc2V0dXBMaXN0ZW5lcnMoYWRkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gKGFkZCA/ICdhZGQnIDogJ3JlbW92ZScpICsgJ0V2ZW50TGlzdGVuZXInO1xuICAgIHV0aWxbYWN0aW9uXSh0aGlzLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHRoaXNbYWN0aW9uXSgnbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24pO1xuICAgIHRoaXNbYWN0aW9uXSgnbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgdGhpc1thY3Rpb25dKCd0b3VjaGVuZCcsIHRoaXMuX29uVG91Y2hFbmQpO1xuICAgIHRoaXNbYWN0aW9uXSgnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnc3RhcnQpO1xuICAgIHRoaXNbYWN0aW9uXSgnZHJhZ2VuZCcsIHRoaXMuX29uRHJhZ2VuZCk7XG4gICAgdGhpc1thY3Rpb25dKCdpbnB1dCcsIHRoaXMuX29uSW5wdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHZhbHVlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgcmFuZ2UuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSByYW5nZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxub25zRWxlbWVudHMuUmFuZ2UgPSBSYW5nZUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1yYW5nZScsIFJhbmdlRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtcm93XG4gKiBAY2F0ZWdvcnkgZ3JpZFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgcm93IGluIHRoZSBncmlkIHN5c3RlbS4gVXNlIHdpdGggYDxvbnMtY29sPmAgdG8gbGF5b3V0IGNvbXBvbmVudHMuWy9lbl1cbiAqICAgW2phXeOCsOODquODg+ODieOCt+OCueODhuODoOOBq+OBpuihjOOCkuWumue+qeOBl+OBvuOBmeOAgm9ucy1jb2zjgajjgajjgoLjgavkvb/nlKjjgZfjgIHjgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7phY3nva7jgavkvb/nlKjjgZfjgb7jgZnjgIJbL2phXVxuICogQGNvZGVwZW4gR2d1akMge3dpZGV9XG4gKiBAZ3VpZGUgZmVhdHVyZXMuaHRtbFxuICogICBbZW5dTGF5b3V0aW5nIGd1aWRlWy9lbl1cbiAqICAgW2phXeODrOOCpOOCouOCpuODiOiqv+aVtFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtY29sXG4gKiAgIFtlbl1UaGUgYDxvbnMtY29sPmAgY29tcG9uZW50IGlzIHVzZWQgYXMgY2hpbGRyZW4gb2YgYDxvbnMtcm93PmAuWy9lbl1cbiAqICAgW2phXW9ucy1jb2zjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQG5vdGVcbiAqICAgW2VuXUZvciBBbmRyb2lkIDQuMyBhbmQgZWFybGllciwgYW5kIGlPUzYgYW5kIGVhcmxpZXIsIHdoZW4gdXNpbmcgbWl4ZWQgYWxpZ25tZW50IHdpdGggb25zLXJvdyBhbmQgb25zLWNvbCwgdGhleSBtYXkgbm90IGJlIGRpc3BsYXllZCBjb3JyZWN0bHkuIFlvdSBjYW4gdXNlIG9ubHkgb25lIHZlcnRpY2FsLWFsaWduLlsvZW5dXG4gKiAgIFtqYV1BbmRyb2lkIDQuM+S7peWJjeOAgeOCguOBl+OBj+OBr2lPUyA25Lul5YmN44GuT1Pjga7loLTlkIjjgIFvbnMtcm9344Gob25zLWNvbOOCkue1hOOBv+WQiOOCj+OBm+OBpuOBneOCjOOBnuOCjOOBrm9ucy1jb2zopoHntKDjga52ZXJ0aWNhbC1hbGlnbuWxnuaAp+OBruWApOOBq+WIpeOAheOBruWApOOCkuaMh+WumuOBmeOCi+OBqOOAgeaPj+eUu+OBjOW0qeOCjOOCi+WgtOWQiOOBjOOBguOCiuOBvuOBmeOAgnZlcnRpY2FsLWFsaWdu5bGe5oCn44Gu5YCk44Gr44Gv5LiA44Gk44Gu5YCk44Gg44GR44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXJvdz5cbiAqICAgPG9ucy1jb2wgd2lkdGg9XCI1MHB4XCI+PG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj48L29ucy1jb2w+XG4gKiAgIDxvbnMtY29sPlRleHQ8L29ucy1jb2w+XG4gKiA8L29ucy1yb3c+XG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZlcnRpY2FsLWFsaWduXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TaG9ydCBoYW5kIGF0dHJpYnV0ZSBmb3IgYWxpZ25pbmcgdmVydGljYWxseS4gVmFsaWQgdmFsdWVzIGFyZSB0b3AsIGJvdHRvbSwgYW5kIGNlbnRlci5bL2VuXVxuICogICBbamFd57im44Gr5pW05YiX44GZ44KL44Gf44KB44Gr5oyH5a6a44GX44G+44GZ44CCdG9w44CBYm90dG9t44CBY2VudGVy44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3dFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xufVxuXG5vbnNFbGVtZW50cy5Sb3cgPSBSb3dFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcm93JywgUm93RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3NlZ21lbnQnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3NlZ21lbnQtLSonLFxuICAnLnNlZ21lbnRfX2l0ZW0nOiAnc2VnbWVudC0tKl9faXRlbScsXG4gICcuc2VnbWVudF9faW5wdXQnOiAnc2VnbWVudC0tKl9faW5wdXQnLFxuICAnLnNlZ21lbnRfX2J1dHRvbic6ICdzZWdtZW50LS0qX19idXR0b24nXG59O1xuXG5jb25zdCBnZW5lcmF0ZUlkID0gKCgpID0+IHtcbiAgbGV0IGkgPSAwO1xuICByZXR1cm4gKCkgPT4gJ29ucy1zZWdtZW50LWdlbi0nICsgKGkrKyk7XG59KSgpO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zZWdtZW50XG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc2VnbWVudFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBTZWdtZW50IGNvbXBvbmVudC4gVXNlIHRoaXMgY29tcG9uZW50IHRvIGhhdmUgYSBidXR0b24gYmFyIHdpdGggYXV0b21hdGljIHN0eWxlcyB0aGF0IHN3aXRjaCBvbiBjbGljayBvZiBhbm90aGVyIGJ1dHRvbi5cbiAqXG4gKiAgICAgV2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgYXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VnbWVudCBvbiBBbmRyb2lkLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIGhMYXl4XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2Uvc2VnbWVudFxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNlZ21lbnQ+XG4gKiAgIDxvbnMtYnV0dG9uPkxhYmVsIDE8L29ucy1idXR0b24+XG4gKiAgIDxvbnMtYnV0dG9uPkxhYmVsIDI8L29ucy1idXR0b24+XG4gKiAgIDxvbnMtYnV0dG9uPkxhYmVsIDM8L29ucy1idXR0b24+XG4gKiA8L29ucy1zZWdtZW50PlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlZ21lbnRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMgYWZ0ZXIgdGhlIGFjdGl2ZSBidXR0b24gaXMgY2hhbmdlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5pbmRleFxuICAgKiAgIFtlbl1UYXBwZWQgYnV0dG9uIGluZGV4LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zZWdtZW50SXRlbVxuICAgKiAgIFtlbl1TZWdtZW50IGl0ZW0gb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzZWdtZW50LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGFiYmFyLWlkXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JRCBvZiB0aGUgdGFiYmFyIGVsZW1lbnQgdG8gXCJjb25uZWN0XCIgdG8gdGhlIHNlZ21lbnQuIE11c3QgYmUgaW5zaWRlIHRoZSBzYW1lIHBhZ2UuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhY3RpdmUtaW5kZXhcbiAgICogQGRlZmF1bHQgMFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JbmRleCBvZiB0aGUgYWN0aXZlIGJ1dHRvbi4gSWYgYSB0YWJiYXIgaXMgY29ubmVjdGVkLCB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZSB0YWJiYXIncyBhY3RpdmUgaW5kZXguWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFjdGl2ZUluZGV4XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSW5kZXggb2YgdGhlIGFjdGl2ZSBidXR0b24uIElmIGEgdGFiYmFyIGlzIGNvbm5lY3RlZCwgdGhpcyB3aWxsIGJlIHNldCB0byB0aGUgdGFiYmFyJ3MgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgc2VnbWVudCBzaG91bGQgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44Oc44K/44Oz44KS54Sh5Yq55YyW44GZ44KL5aC05ZCI44Gv5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fc2VnbWVudElkID0gZ2VuZXJhdGVJZCgpO1xuICAgIHRoaXMuX3RhYmJhciA9IG51bGw7XG4gICAgdGhpcy5fb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uVGFiYmFyUHJlQ2hhbmdlID0gdGhpcy5fb25UYWJiYXJQcmVDaGFuZ2UuYmluZCh0aGlzKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fdGFiYmFyID8gdGhpcy5fdGFiYmFyLmdldEFjdGl2ZVRhYkluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUJ1dHRvbkluZGV4KCkpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNoaWxkcmVuW2luZGV4XTtcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnc2VnbWVudF9faXRlbScpO1xuXG4gICAgICBjb25zdCBpbnB1dCA9IHV0aWwuZmluZENoaWxkKGl0ZW0sICcuc2VnbWVudF9faW5wdXQnKSB8fCB1dGlsLmNyZWF0ZSgnaW5wdXQuc2VnbWVudF9faW5wdXQnKTtcbiAgICAgIGlucHV0LnR5cGUgPSAncmFkaW8nO1xuICAgICAgaW5wdXQudmFsdWUgPSBpbmRleDtcbiAgICAgIGlucHV0Lm5hbWUgPSBpbnB1dC5uYW1lIHx8IHRoaXMuX3NlZ21lbnRJZDtcbiAgICAgIGlucHV0LmNoZWNrZWQgPSAhdGhpcy5oYXNBdHRyaWJ1dGUoJ3RhYmJhci1pZCcpICYmIGluZGV4ID09PSAodGhpcy5hY3RpdmVJbmRleCB8fCAwKTtcblxuICAgICAgY29uc3QgYnV0dG9uID0gdXRpbC5maW5kQ2hpbGQoaXRlbSwgJy5zZWdtZW50X19idXR0b24nKSB8fCB1dGlsLmNyZWF0ZSgnLnNlZ21lbnRfX2J1dHRvbicpO1xuICAgICAgaWYgKGJ1dHRvbi5wYXJlbnRFbGVtZW50ICE9PSBpdGVtKSB7XG4gICAgICAgIHdoaWxlIChpdGVtLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoaXRlbS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpdGVtLmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICB9XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCd0YWJiYXItaWQnKSkge1xuICAgICAgICBjb25zdCBwYWdlID0gdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtcGFnZScpO1xuICAgICAgICB0aGlzLl90YWJiYXIgPSBwYWdlICYmIHBhZ2UucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLmdldEF0dHJpYnV0ZSgndGFiYmFyLWlkJykpO1xuICAgICAgICBpZiAoIXRoaXMuX3RhYmJhciB8fCB0aGlzLl90YWJiYXIudGFnTmFtZSAhPT0gJ09OUy1UQUJCQVInKSB7XG4gICAgICAgICAgdXRpbC50aHJvdyhgTm8gdGFiYmFyIHdpdGggaWQgJHt0aGlzLmdldEF0dHJpYnV0ZSgndGFiYmFyLWlkJyl9IHdhcyBmb3VuZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RhYmJhci5zZXRBdHRyaWJ1dGUoJ2hpZGUtdGFicycsICcnKTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3RhYmJhci5nZXRBY3RpdmVUYWJJbmRleCgpO1xuICAgICAgICAgIHRoaXMuX3NldENoZWNrZWQoaW5kZXgpO1xuICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fdGFiYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ3ByZWNoYW5nZScsIHRoaXMuX29uVGFiYmFyUHJlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl90YWJiYXIpIHtcbiAgICAgICAgdGhpcy5fdGFiYmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3ByZWNoYW5nZScsIHRoaXMuX29uVGFiYmFyUHJlQ2hhbmdlKTtcbiAgICAgICAgdGhpcy5fdGFiYmFyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX29uQ2hhbmdlKTtcbiAgfVxuXG4gIF9zZXRDaGVja2VkKGluZGV4KSB7XG4gICAgdGhpcy5jaGlsZHJlbltpbmRleF0uZmlyc3RFbGVtZW50Q2hpbGQuY2hlY2tlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRBY3RpdmVCdXR0b25cbiAgICogQHNpZ25hdHVyZSBzZXRBY3RpdmVCdXR0b24oaW5kZXgsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgW2VuXUJ1dHRvbiBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QsIHdvcmtzIG9ubHkgaWYgdGhlcmUgaXMgYSBjb25uZWN0ZWQgdGFiYmFyLiBTdXBwb3J0cyB0aGUgc2FtZSBvcHRpb25zIGFzIGBvbnMtdGFiYmFyYCdzIGBzZXRBY3RpdmVUYWJgIG1ldGhvZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTWFrZSBidXR0b24gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGFjdGl2ZS4gSWYgdGhlcmUgaXMgYSBjb25uZWN0ZWQgdGFiYmFyIGl0IHNob3dzIHRoZSBjb3JyZXNwb25kaW5nIHRhYiBwYWdlLiBJbiB0aGlzIGNhc2UgYW5pbWF0aW9ucyBhbmQgdGhlaXIgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBzZWxlY3RlZCBpbmRleCBvciB0byB0aGUgbmV3IHBhZ2UgZWxlbWVudCBpZiB0aGVyZSBpcyBhIGNvbm5lY3RlZCB0YWJiYXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldEFjdGl2ZUJ1dHRvbihpbmRleCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl90YWJiYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl90YWJiYXIuc2V0QWN0aXZlVGFiKGluZGV4LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDaGVja2VkKGluZGV4KTtcbiAgICB0aGlzLl9wb3N0Q2hhbmdlKGluZGV4KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGdldEFjdGl2ZUJ1dHRvbkluZGV4XG4gICAqIEBzaWduYXR1cmUgZ2V0QWN0aXZlQnV0dG9uSW5kZXgoKVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqICAgW2VuXVRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBidXR0b24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgYnV0dG9uIGluZGV4IG9mIGN1cnJlbnQgYWN0aXZlIGJ1dHRvbi4gSWYgYWN0aXZlIGJ1dHRvbiBpcyBub3QgZm91bmQsIHJldHVybnMgLTEuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldEFjdGl2ZUJ1dHRvbkluZGV4KCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7IC8vIEFycmF5LmZpbmRJbmRleFxuICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0uZmlyc3RFbGVtZW50Q2hpbGQuY2hlY2tlZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgX29uQ2hhbmdlKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5fdGFiYmFyXG4gICAgICA/IHRoaXMuX3RhYmJhci5zZXRBY3RpdmVUYWIodGhpcy5nZXRBY3RpdmVCdXR0b25JbmRleCgpLCB7IHJlamVjdDogZmFsc2UgfSlcbiAgICAgIDogdGhpcy5fcG9zdENoYW5nZSh0aGlzLmdldEFjdGl2ZUJ1dHRvbkluZGV4KCkpO1xuICB9XG5cbiAgX29uVGFiYmFyUHJlQ2hhbmdlKGV2ZW50KSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGV0YWlsLmNhbmNlbGVkKSB7XG4gICAgICAgIHRoaXMuX3NldENoZWNrZWQoZXZlbnQuaW5kZXgpO1xuICAgICAgICB0aGlzLl9wb3N0Q2hhbmdlKGV2ZW50LmluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9wb3N0Q2hhbmdlKGluZGV4KSB7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdwb3N0Y2hhbmdlJywge1xuICAgICAgaW5kZXgsXG4gICAgICBhY3RpdmVJbmRleDogaW5kZXgsXG4gICAgICBsYXN0QWN0aXZlSW5kZXg6IHRoaXMuX2xhc3RBY3RpdmVJbmRleCxcbiAgICAgIHNlZ21lbnRJdGVtOiB0aGlzLmNoaWxkcmVuW2luZGV4XVxuICAgIH0pO1xuICAgIHRoaXMuX2xhc3RBY3RpdmVJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBzZWdtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBnZXQgYWN0aXZlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdhY3RpdmUtaW5kZXgnKSk7XG4gIH1cblxuICBzZXQgYWN0aXZlSW5kZXgodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydjbGFzcycsICdtb2RpZmllcicsICdhY3RpdmUtaW5kZXgnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY3RpdmUtaW5kZXgnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUJ1dHRvbkluZGV4KCkgIT09IHRoaXMuYWN0aXZlSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQnV0dG9uKHRoaXMuYWN0aXZlSW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ3Bvc3RjaGFuZ2UnXTtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFNlZ21lbnRFbGVtZW50LCBbJ2Rpc2FibGVkJ10pO1xuXG5vbnNFbGVtZW50cy5TZWdtZW50ID0gU2VnbWVudEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zZWdtZW50JywgU2VnbWVudEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3NlbGVjdC0qIHNlbGVjdC0tKicsXG4gICcuc2VsZWN0LWlucHV0JzogJ3NlbGVjdC1pbnB1dC0tKidcbn07XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnc2VsZWN0JztcblxuY29uc3QgSU5QVVRfQVRUUklCVVRFUyA9IFtcbiAgJ2F1dG9mb2N1cycsXG4gICdkaXNhYmxlZCcsXG4gICdmb3JtJyxcbiAgJ211bHRpcGxlJyxcbiAgJ25hbWUnLFxuICAncmVxdWlyZWQnLFxuICAnc2l6ZSdcbl07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNlbGVjdFxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogIFtlbl1EaXNwbGF5cyBhIE1hdGVyaWFsIERlc2lnbiBzZWxlY3QgaW5wdXQuWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciB1bmRlcmJhclxuICogIFtlbl1EaXNwbGF5cyBhIGhvcml6b250YWwgbGluZSB1bmRlcm5lYXRoIGEgc2VsZWN0IGlucHV0LlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFNlbGVjdCBjb21wb25lbnQuIElmIHlvdSB3YW50IHRvIHBsYWNlIGEgc2VsZWN0IHdpdGggYW4gSUQgb2YgYG15LWlkYCBvbiBhIHBhZ2UsIHVzZSBgPG9ucy1zZWxlY3Qgc2VsZWN0LWlkPVwibXktaWRcIj5gLlxuICpcbiAqICAgICBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5IGFzIGEgTWF0ZXJpYWwgRGVzaWduIHNlbGVjdCBvbiBBbmRyb2lkLlxuICpcbiAqICAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxzZWxlY3Q+YCBlbGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgb24gdGhlIGA8b25zLXNlbGVjdD5gIGVsZW1lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgpLooajnpLrjgZnjgovjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJgc2VsZWN0YCDopoHntKDjgavkvb/nlKjjgafjgY3jgovlsZ7mgKfjga7lpJrjgY/jgYwgYG9ucy1zZWxlY3RgIOimgee0oOOBp+OCguWIqeeUqOOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBoTGF5eFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NlbGVjdFxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNlbGVjdD5cbiAqICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj4xPC9vcHRpb24+XG4gKiAgIDxvcHRpb24gdmFsdWU9XCIyXCI+Mm5kPC9vcHRpb24+XG4gKiAgIDxvcHRpb24gdmFsdWU9XCIzXCI+M3JkIG9wdGlvbjwvb3B0aW9uPlxuICogPC9vbnMtc2VsZWN0PlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYXV0b2ZvY3VzXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1FbGVtZW50IGF1dG9tYXRpY2FsbHkgZ2FpbnMgZm9jdXMgb24gcGFnZSBsb2FkLlsvZW5dXG4gICAqICBbamFd44Oa44O844K444Ot44O844OJ5pmC44Gr44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544Gr44OV44Kp44O844Kr44K544GM56e744KL44KI44GG44Gr44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IGlmIHNlbGVjdCBpbnB1dCBzaG91bGQgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544KS54Sh5Yq55YyW44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZm9ybVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQXNzb2NpYXRlIGEgc2VsZWN0IGVsZW1lbnQgdG8gYW4gZXhpc3RpbmcgZm9ybSBvbiB0aGUgcGFnZSwgZXZlbiBpZiBub3QgbmVzdGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOCkuOAgeaMh+WumuOBl+OBnyBgZm9ybWAg6KaB57Sg44Gr57SQ5LuY44GR44G+44GZ44CC44K744Os44Kv44OI44Oc44OD44Kv44K544KSIGBmb3JtYCDopoHntKDjga7lpJblgbTjgavphY3nva7jgZnjgovpmpvjgavkvb/nlKjjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtdWx0aXBsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgYXQgb25jZS5bL2VuXVxuICAgKiAgW2phXemBuOaKnuiCouOBruikh+aVsOmBuOaKnuOCkuacieWKueOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG5hbWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU5hbWUgdGhlIHNlbGVjdCBlbGVtZW50LCB1c2VmdWwgZm9yIGluc3RhbmNlIGlmIGl0IGlzIHBhcnQgb2YgYSBmb3JtLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAgumAmuW4uCBgZm9ybWAg6KaB57Sg44Go5YWx44Gr5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcmVxdWlyZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1NYWtlIHRoZSBzZWxlY3QgaW5wdXQgcmVxdWlyZWQgZm9yIHN1Ym1pdHRpbmcgdGhlIGZvcm0gaXQgaXMgcGFydCBvZi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgpLlhaXlipvlv4XpoIjjgavjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgILpgJrluLggYGZvcm1gIOimgee0oOOBqOWFseOBq+S9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNlbGVjdC1pZFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSUQgZ2l2ZW4gdG8gdGhlIGlubmVyIHNlbGVjdCwgdXNlZnVsIGZvciBkeW5hbWljIG1hbmlwdWxhdGlvbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgYzlhoXpg6jjgavmjIHjgaQgc2VsZWN0IOimgee0oOOBq+S4juOBiOOCiyBJRCDjgpLmjIflrprjgZfjgb7jgZnjgILjgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjga7lhoXlrrnjgpLli5XnmoTjgavlpInmm7TjgZnjgovlv4XopoHjgYzjgYLjgovloLTlkIjjgavkvb/nlKjjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzaXplXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhvdyBtYW55IG9wdGlvbnMgYXJlIGRpc3BsYXllZDsgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGUgc2l6ZSB0aGVuIGEgc2Nyb2xsIGFwcGVhcnMgdG8gbmF2aWdhdGUgdGhlbS5bL2VuXVxuICAgKiAgIFtqYV3kuIDluqbjgavooajnpLrjgZnjgovpgbjmip7ogqLjga7lgIvmlbDjgpLmjIflrprjgZfjgb7jgZnjgILpgbjmip7ogqLjgYzjgZPjga7lsZ7mgKfjgafmjIflrprjgZfjgZ/lgIvmlbDjgojjgorjgoLlpJrjgYTloLTlkIjjgIHjgrnjgq/jg63jg7zjg6vjgYzmnInlirnjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG5cbiAgICB0aGlzLl9kZXJpdmVHZXR0ZXJzKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdjbGFzcycsIC4uLklOUFVUX0FUVFJJQlVURVNdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoSU5QVVRfQVRUUklCVVRFUy5pbmRleE9mKG5hbWUpID49IDApIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVCb3VuZEF0dHJpYnV0ZXMoKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9zZWxlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcignc2VsZWN0Jyk7XG4gIH1cblxuICBfdXBkYXRlQm91bmRBdHRyaWJ1dGVzKCkge1xuICAgIElOUFVUX0FUVFJJQlVURVMuZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKGF0dHIpKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdC5zZXRBdHRyaWJ1dGUoYXR0ciwgdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGxlbmd0aFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTnVtYmVyIG9mIG9wdGlvbnMgaW4gdGhlIHNlbGVjdCBib3guWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544Gr5ZCr44G+44KM44KL6YG45oqe6IKi44Gu5YCL5pWw44KS6L+U44GX44G+44GZ44CCIGBzZWxlY3RgIOimgee0oFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9uc1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2V2ZXJhbCBvcHRpb25zIGZvciBoYW5kbGluZyB0aGUgc2VsZWN0IERPTSBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544Gr5ZCr44G+44KM44KLIGBvcHRpb25gIOimgee0oOOBrumFjeWIl+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc2VsZWN0ZWRJbmRleFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uWy9lbl1cbiAgICogICBbamFd54++5Zyo6YG45oqe44GV44KM44Gm44GE44KL6YG45oqe6IKi44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVmFsdWUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uWy9lbl1cbiAgICogICBbamFd54++5Zyo6YG45oqe44GV44KM44Gm44GE44KL6YG45oqe6IKi44Gu5YCk44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuX3NlbGVjdCB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcbiAgICBpZiAoIXNlbC5pZCAmJiB0aGlzLmhhc0F0dHJpYnV0ZSgnc2VsZWN0LWlkJykpIHtcbiAgICAgIHNlbC5pZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdzZWxlY3QtaWQnKTtcbiAgICB9XG4gICAgc2VsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdC1pbnB1dCcpO1xuICAgIGlmICghdGhpcy5fc2VsZWN0KSB7XG4gICAgICB1dGlsLmFycmF5RnJvbSh0aGlzLmNoaWxkTm9kZXMpLmZvckVhY2goZWxlbWVudCA9PiBzZWwuYXBwZW5kQ2hpbGQoZWxlbWVudCkpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChzZWwpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9kZXJpdmVHZXR0ZXJzKCkge1xuICAgIFsnZGlzYWJsZWQnLCAnbGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAnb3B0aW9ucycsICdzZWxlY3RlZEluZGV4JywgJ3NpemUnLCAndmFsdWUnLCAnZm9ybScsICd0eXBlJ11cbiAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX3NlbGVjdFtrZXldLFxuICAgICAgICAgIHNldDogWydmb3JtJywgJ3R5cGUnXS5pbmRleE9mKGtleSkgPT09IC0xXG4gICAgICAgICAgICA/IHZhbHVlID0+IGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9zZWxlY3Rba2V5XSA9IHZhbHVlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFkZChvcHRpb24sIGluZGV4ID0gbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdC5hZGQob3B0aW9uLCBpbmRleCk7XG4gIH1cblxuICAvLyBJZiBjYWxsZWQgd2l0aCBhbiBpbmRleCBhcmd1bWVudCwgcmVtb3ZlcyB0aGUgb3B0aW9uIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguXG4gIC8vIElmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgcmVtb3ZlcyB0aGlzLlxuICAvLyBUaGlzIGJlaGF2aW91ciBtaWdodCBzb3VuZCBjcmF6eSBidXQgaXQgaXMgdGhlIHNhbWUgYXMgPHNlbGVjdD4ncyBgcmVtb3ZlYCBtZXRob2QuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MU2VsZWN0RWxlbWVudC9yZW1vdmVcbiAgcmVtb3ZlKGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3QucmVtb3ZlKGluZGV4KTtcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuU2VsZWN0ID0gU2VsZWN0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNlbGVjdCcsIFNlbGVjdEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2ZhYiBmYWItLW1pbmkgc3BlZWQtZGlhbF9faXRlbSc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdmYWItLSogc3BlZWQtZGlhbF9faXRlbS0tKidcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNwZWVkLWRpYWwtaXRlbVxuICogQGNhdGVnb3J5IGNvbnRyb2xcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhpcyBjb21wb25lbnQgZGlzcGxheXMgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBNYXRlcmlhbCBEZXNpZ24gU3BlZWQgZGlhbCBjb21wb25lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICBNYXRlcmlhbCBEZXNpZ27jga5TcGVlZCBkaWFs44Gu5a2Q6KaB57Sg44KS6KGo54++44GZ44KL6KaB57Sg44Gn44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAY29kZXBlbiBkWVFZTGdcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGVlZC1kaWFsXG4gKiBAc2VlYWxzbyBvbnMtc3BlZWQtZGlhbFxuICogICBbZW5dVGhlIGA8b25zLXNwZWVkLWRpYWw+YCBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXW9ucy1zcGVlZC1kaWFs44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1mYWJcbiAqICAgW2VuXW9ucy1mYWIgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1mYWLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3BlZWQtZGlhbCBwb3NpdGlvbj1cImxlZnQgYm90dG9tXCI+XG4gKiAgIDxvbnMtZmFiPlxuICogICAgIDxvbnMtaWNvbiBpY29uPVwiZmEtdHdpdHRlclwiPjwvb25zLWljb24+XG4gKiAgIDwvb25zLWZhYj5cbiAqICAgPG9ucy1zcGVlZC1kaWFsLWl0ZW0+QTwvb25zLXNwZWVkLWRpYWwtaXRlbT5cbiAqICAgPG9ucy1zcGVlZC1kaWFsLWl0ZW0+Qjwvb25zLXNwZWVkLWRpYWwtaXRlbT5cbiAqICAgPG9ucy1zcGVlZC1kaWFsLWl0ZW0+Qzwvb25zLXNwZWVkLWRpYWwtaXRlbT5cbiAqIDwvb25zLXNwZWVkLWRpYWw+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNwZWVkRGlhbEl0ZW1FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgY29tcG9uZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCs+ODs+ODneODvOODjeODs+ODiOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHJpcHBsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHJpcHBsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIHRoaXMuX2JvdW5kT25DbGljayA9IHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3JpcHBsZScsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICB1dGlsLmFkZE1vZGlmaWVyKHRoaXMsICdtaW5pJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlwcGxlJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlUmlwcGxlKCk7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICB9XG5cbiAgX3VwZGF0ZVJpcHBsZSgpIHtcbiAgICB1dGlsLnVwZGF0ZVJpcHBsZSh0aGlzKTtcbiAgfVxuXG4gIF9vbkNsaWNrKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICBkZWZhdWx0Q2xhc3NOYW1lLnNwbGl0KC9cXHMrLykuZm9yRWFjaCh0b2tlbiA9PiB0aGlzLmNsYXNzTGlzdC5hZGQodG9rZW4pKTtcblxuICAgIHV0aWwuYWRkTW9kaWZpZXIodGhpcywgJ21pbmknKTtcbiAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFNwZWVkRGlhbEl0ZW1FbGVtZW50LCBbJ3JpcHBsZSddKTtcblxub25zRWxlbWVudHMuU3BlZWREaWFsSXRlbSA9IFNwZWVkRGlhbEl0ZW1FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc3BlZWQtZGlhbC1pdGVtJywgU3BlZWREaWFsSXRlbUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3NwZWVkLWRpYWwnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3NwZWVkLWRpYWwtLSonLFxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtc3BlZWQtZGlhbFxuICogQGNhdGVnb3J5IGNvbnRyb2xcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRWxlbWVudCB0aGF0IGRpc3BsYXlzIGEgTWF0ZXJpYWwgRGVzaWduIFNwZWVkIERpYWxvZyBjb21wb25lbnQuIEl0IGlzIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHByaW1hcnkgYWN0aW9uIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBpbiBhIHBhZ2UuXG4gKlxuICogICAgIFRoZSBTcGVlZCBkaWFsIGxvb2tzIGxpa2UgYSBgPG9ucy1mYWI+YCBlbGVtZW50IGJ1dCB3aWxsIGV4cGFuZCBhIG1lbnUgd2hlbiB0YXBwZWQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4gZFlRWUxnXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2Uvc3BlZWQtZGlhbFxuICogQHNlZWFsc28gb25zLXNwZWVkLWRpYWwtaXRlbVxuICogICBbZW5dVGhlIGA8b25zLXNwZWVkLWRpYWwtaXRlbT5gIHJlcHJlc2VudHMgYSBtZW51IGl0ZW0uWy9lbl1cbiAqICAgW2phXW9ucy1zcGVlZC1kaWFsLWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWZhYlxuICogICBbZW5db25zLWZhYiBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWZhYuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1zcGVlZC1kaWFsIHBvc2l0aW9uPVwibGVmdCBib3R0b21cIj5cbiAqICAgPG9ucy1mYWI+XG4gKiAgICAgPG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj5cbiAqICAgPC9vbnMtZmFiPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5BPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5CPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5DPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogPC9vbnMtc3BlZWQtZGlhbD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BlZWREaWFsRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IG9wZW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIG1lbnUgaXRlbXMgYXJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgY2xvc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIG1lbnUgaXRlbXMgYXJlIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGNvbXBvbmVudC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSByaXBwbGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSByaXBwbGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcG9zaXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgU3BlY2lmeSB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGNvbXBvbmVudC5cbiAgICogICAgIEkuZS4gdG8gZGlzcGxheSBpdCBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBzcGVjaWZ5IFwicmlnaHQgdG9wXCIuXG4gICAqICAgICBDaG9vc2UgZnJvbSBcInJpZ2h0XCIsIFwibGVmdFwiLCBcInRvcFwiIGFuZCBcImJvdHRvbVwiLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg44GT44Gu6KaB57Sg44KS6KGo56S644GZ44KL5bem5Y+z44Go5LiK5LiL44Gu5L2N572u44KS5oyH5a6a44GX44G+44GZ44CCXG4gICAqICAgICDkvovjgYjjgbDjgIHlj7PkuIrjgavooajnpLrjgZnjgovloLTlkIjjgavjga9cInJpZ2h0IHRvcFwi44KS5oyH5a6a44GX44G+44GZ44CCXG4gICAqICAgICDlt6blj7PjgajkuIrkuIvjga7kvY3nva7jga7mjIflrprjgavjga/jgIFyaWdodOOBqGxlZnTjgIF0b3Djgahib3R0b23jgYzjgZ3jgozjgZ7jgozmjIflrprjgafjgY3jgb7jgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXJlY3Rpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGRpcmVjdGlvbiB0aGUgaXRlbXMgYXJlIGRpc3BsYXllZC4gUG9zc2libGUgdmFsdWVzIGFyZSBcInVwXCIsIFwiZG93blwiLCBcImxlZnRcIiBhbmQgXCJyaWdodFwiLlsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg6KaB57Sg44GM6KGo56S644GZ44KL5pa55ZCR44KS5oyH5a6a44GX44G+44GZ44CCdXAsIGRvd24sIGxlZnQsIHJpZ2h044GM5oyH5a6a44Gn44GN44G+44GZ44CCXG4gICAqICAgWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2JvdW5kT25DbGljayA9IHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKTtcblxuICAgIGNvbnN0IHtvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWR9ID0gdXRpbC5kZWZpbmVMaXN0ZW5lclByb3BlcnR5KHRoaXMsICdjbGljaycpO1xuICAgIHRoaXMuX2Nvbm5lY3RPbkNsaWNrID0gb25Db25uZWN0ZWQ7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uQ2xpY2sgPSBvbkRpc2Nvbm5lY3RlZDtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKSB7XG4gICAgICB0aGlzLl91cGRhdGVEaXJlY3Rpb24odGhpcy5nZXRBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXBkYXRlRGlyZWN0aW9uKCd1cCcpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydjbGFzcycsICdtb2RpZmllcicsICdyaXBwbGUnLCAnZGlyZWN0aW9uJywgJ3Bvc2l0aW9uJywgJ29wZW4nXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaXBwbGUnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fdXBkYXRlUmlwcGxlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RpcmVjdGlvbic6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVEaXJlY3Rpb24oY3VycmVudCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Bvc2l0aW9uJzpcbiAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wZW4nOlxuICAgICAgICBpZiAoIXRoaXMuX2lnbm9yZU9wZW5TaWRlRWZmZWN0KSB7XG4gICAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZU9wZW4obGFzdCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2ssIGZhbHNlKTtcbiAgICB0aGlzLl9jb25uZWN0T25DbGljaygpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBnZXQgaXRlbXMoKSB7XG4gICAgcmV0dXJuIHV0aWwuYXJyYXlGcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnb25zLXNwZWVkLWRpYWwtaXRlbScpKTtcbiAgfVxuXG4gIGdldCBfZmFiKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLWZhYicpO1xuICB9XG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLnZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlSXRlbXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICghdGhpcy5pbmxpbmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3coKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlubGluZSkge1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5oaWRlKCkudGhlbihyZXNvbHZlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfdXBkYXRlUmlwcGxlKCkge1xuICAgIGlmICh0aGlzLl9mYWIpIHtcbiAgICAgIHRoaXMuaGFzQXR0cmlidXRlKCdyaXBwbGUnKSA/IHRoaXMuX2ZhYi5zZXRBdHRyaWJ1dGUoJ3JpcHBsZScsICcnKSA6IHRoaXMuX2ZhYi5yZW1vdmVBdHRyaWJ1dGUoJ3JpcHBsZScpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVEaXJlY3Rpb24oZGlyZWN0aW9uKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLml0ZW1zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN0eWxlcihjaGlsZHJlbltpXSwge1xuICAgICAgICB0cmFuc2l0aW9uRGVsYXk6IDI1ICogaSArICdtcycsXG4gICAgICAgIGJvdHRvbTogJ2F1dG8nLFxuICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICB0b3A6ICdhdXRvJyxcbiAgICAgICAgbGVmdDogJ2F1dG8nXG4gICAgICB9KTtcbiAgICB9XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLmJvdHRvbSA9IDcyICsgNTYgKiBpICsgJ3B4JztcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5yaWdodCA9ICc4cHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS50b3AgPSA3MiArIDU2ICogaSArICdweCc7XG4gICAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUubGVmdCA9ICc4cHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS50b3AgPSAnOHB4JztcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5yaWdodCA9IDcyICsgNTYgKiBpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnRvcCA9ICc4cHgnO1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLmxlZnQgPSA3MiArIDU2ICogaSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB1dGlsLnRocm93KCdBcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB1cCwgZG93biwgbGVmdCBvciByaWdodC4nKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAnZmFiLS10b3BfX2xlZnQnLFxuICAgICAgJ2ZhYi0tYm90dG9tX19yaWdodCcsXG4gICAgICAnZmFiLS1ib3R0b21fX2xlZnQnLFxuICAgICAgJ2ZhYi0tdG9wX19yaWdodCcsXG4gICAgICAnZmFiLS10b3BfX2NlbnRlcicsXG4gICAgICAnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcCByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCB0b3AnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tdG9wX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcCBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgdG9wJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLXRvcF9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCBib3R0b20nOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tYm90dG9tX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgYm90dG9tJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLWJvdHRvbV9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciB0b3AnOlxuICAgICAgY2FzZSAndG9wIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS10b3BfX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciBib3R0b20nOlxuICAgICAgY2FzZSAnYm90dG9tIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRUcmFuc2xhdGUoKSB7XG4gICAgY29uc3QgaXNCb3R0b20gPSAodGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJycpLmluZGV4T2YoJ2JvdHRvbScpID49IDA7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gaXNCb3R0b20gPyBgdHJhbnNsYXRlM2QoMHB4LCAtJHt1dGlsLmdsb2JhbHMuZmFiT2Zmc2V0IHx8IDB9cHgsIDBweCkgYCA6ICcnO1xuICAgIHJldHVybiB0cmFuc2xhdGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBzcGVlZCBkaWFsLlsvZW5dXG4gICAqICAgW2phXVNwZWVkIGRpYWzjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgc2hvdygpIHtcbiAgICB0aGlzLl9mYWIuc2hvdygpO1xuICAgIHN0eWxlcih0aGlzLCB7IHRyYW5zZm9ybTogdGhpcy5fZ2V0VHJhbnNsYXRlIH0pO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIHNwZWVkIGRpYWwuWy9lbl1cbiAgICogICBbamFdU3BlZWQgZGlhbOOCkumdnuihqOekuuOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBoaWRlKCkge1xuICAgIHJldHVybiB0aGlzLmhpZGVJdGVtcygpLnRoZW4oKCk9PiB0aGlzLl9mYWIuaGlkZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dJdGVtc1xuICAgKiBAc2lnbmF0dXJlIHNob3dJdGVtcygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBzcGVlZCBkaWFsIGl0ZW1zLlsvZW5dXG4gICAqICAgW2phXVNwZWVkIGRpYWzjga7lrZDopoHntKDjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgc2hvd0l0ZW1zKCkge1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLm9wZW47XG4gICAgdGhpcy5faWdub3JlT3BlblNpZGVFZmZlY3QgPSB0cnVlO1xuICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgdGhpcy5faWdub3JlT3BlblNpZGVFZmZlY3QgPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLl91cGRhdGVPcGVuKGxhc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZUl0ZW1zXG4gICAqIEBzaWduYXR1cmUgaGlkZUl0ZW1zKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIHNwZWVkIGRpYWwgaXRlbXMuWy9lbl1cbiAgICogICBbamFdU3BlZWQgZGlhbOOBruWtkOimgee0oOOCkumdnuihqOekuuOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBoaWRlSXRlbXMoKSB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMub3BlbjtcbiAgICB0aGlzLl9pZ25vcmVPcGVuU2lkZUVmZmVjdCA9IHRydWU7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5faWdub3JlT3BlblNpZGVFZmZlY3QgPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLl91cGRhdGVPcGVuKGxhc3QpO1xuICB9XG5cbiAgX3VwZGF0ZU9wZW4obGFzdCkge1xuICAgIC8vIHVwZGF0ZSBkaXJlY3Rpb25cbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURpcmVjdGlvbih0aGlzLmdldEF0dHJpYnV0ZSgnZGlyZWN0aW9uJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlyZWN0aW9uKCd1cCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0b3RhbERlbGF5ID0gMDtcbiAgICBpZiAobGFzdCAhPT0gdGhpcy5vcGVuKSB7IC8vIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBvcGVuL2Nsb3NlZFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLml0ZW1zO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkZWxheSA9IDI1ICogKHRoaXMub3BlbiA/IGkgOiBjaGlsZHJlbi5sZW5ndGggLSBpKTtcbiAgICAgICAgdG90YWxEZWxheSArPSBkZWxheTtcbiAgICAgICAgc3R5bGVyKGNoaWxkcmVuW2ldLCB7XG4gICAgICAgICAgdHJhbnNmb3JtOiBgc2NhbGUoJHt0aGlzLm9wZW4gPyAxIDogMH0pYCxcbiAgICAgICAgICB0cmFuc2l0aW9uRGVsYXk6IGRlbGF5ICsgJ21zJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRvdGFsRGVsYXkgKz0gNTA7XG5cbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCB0aGlzLm9wZW4gPyAnb3BlbicgOiAnY2xvc2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZlcnJlZCA9IHV0aWwuZGVmZXIoKTtcbiAgICBzZXRUaW1lb3V0KGRlZmVycmVkLnJlc29sdmUsIHRvdGFsRGVsYXkpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuaGlkZUl0ZW1zKCk7XG4gICAgfVxuICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2hpbGRyZW4pLmZvckVhY2goZSA9PiB7XG4gICAgICB1dGlsLm1hdGNoKGUsICcuZmFiJykgJiYgdXRpbC50b2dnbGVBdHRyaWJ1dGUoZSwgJ2Rpc2FibGVkJywgdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgdXRpbC50b2dnbGVBdHRyaWJ1dGUodGhpcywgJ2Rpc2FibGVkJywgdmFsdWUpO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaW5saW5lXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaW5saW5lIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg7Pjg6njgqTjg7PopoHntKDjga7loLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IGlubGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2lubGluZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9mYWIgJiYgdGhpcy5fZmFiLnZpc2libGUgJiYgdGhpcy5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpc09wZW5cbiAgICogQHNpZ25hdHVyZSBpc09wZW4oKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBtZW51IGlzIG9wZW4gb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBpc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG9wZW5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIG1lbnUgaXMgb3BlbiBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcGVuXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBtZW51IGlzIG9wZW4gb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZVxuICAgKiBAc2lnbmF0dXJlIHRvZ2dsZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ub2dnbGUgdmlzaWJpbGl0eS5bL2VuXVxuICAgKiAgIFtqYV1TcGVlZCBkaWFs44Gu6KGo56S66Z2e6KGo56S644KS5YiH44KK5pu/44GI44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZUl0ZW1zXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlSXRlbXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIGl0ZW0gdmlzaWJpbGl0eS5bL2VuXVxuICAgKiAgIFtqYV1TcGVlZCBkaWFs44Gu5a2Q6KaB57Sg44Gu6KGo56S66Z2e6KGo56S644KS5YiH44KK5pu/44GI44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHRvZ2dsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW4gPyB0aGlzLmhpZGVJdGVtcygpIDogdGhpcy5zaG93SXRlbXMoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ29wZW4nLCAnY2xvc2UnXTtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFNwZWVkRGlhbEVsZW1lbnQsIFsnb3BlbicsICdyaXBwbGUnXSk7XG5cbm9uc0VsZW1lbnRzLlNwZWVkRGlhbCA9IFNwZWVkRGlhbEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zcGVlZC1kaWFsJywgU3BlZWREaWFsRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQge1BhZ2VMb2FkZXIsIGRlZmF1bHRQYWdlTG9hZGVyfSBmcm9tICcuLi9vbnMvcGFnZS1sb2FkZXIuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHJld3JpdGFibGVzID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICByZWFkeShlbGVtZW50LCBjYWxsYmFjaykge1xuICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gIH1cbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNwbGl0dGVyLWNvbnRlbnRcbiAqIEBjYXRlZ29yeSBtZW51XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBUaGUgYDxvbnMtc3BsaXR0ZXItY29udGVudD5gIGVsZW1lbnQgaXMgdXNlZCBhcyBhIGNoaWxkIGVsZW1lbnQgb2YgYDxvbnMtc3BsaXR0ZXI+YC5cbiAqXG4gKiAgICBJdCBjb250YWlucyB0aGUgbWFpbiBjb250ZW50IG9mIHRoZSBwYWdlIHdoaWxlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBjb250YWlucyB0aGUgbGlzdC5cbiAqICBbL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXItY29udGVudOimgee0oOOBr+OAgW9ucy1zcGxpdHRlcuimgee0oOOBruWtkOimgee0oOOBqOOBl+OBpuWIqeeUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiByT1FPTUxcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGxpdHRlclxuICogQGd1aWRlIGZ1bmRhbWVudGFscy5odG1sI21hbmFnaW5nLXBhZ2VzXG4gKiAgW2VuXU1hbmFnaW5nIG11bHRpcGxlIHBhZ2VzLlsvZW5dXG4gKiAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BsaXR0ZXJcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyPmAgY29tcG9uZW50IGlzIHRoZSBwYXJlbnQgZWxlbWVudC5bL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXNwbGl0dGVyLXNpZGVcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBjb21wb25lbnQgY29udGFpbnMgdGhlIG1lbnUuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVyLXNpZGXjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3BsaXR0ZXI+XG4gKiAgIDxvbnMtc3BsaXR0ZXItY29udGVudD5cbiAqICAgICAuLi5cbiAqICAgPC9vbnMtc3BsaXR0ZXItY29udGVudD5cbiAqXG4gKiAgIDxvbnMtc3BsaXR0ZXItc2lkZSBzaWRlPVwibGVmdFwiIHdpZHRoPVwiODAlXCIgY29sbGFwc2U+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLXNwbGl0dGVyLXNpZGU+XG4gKiA8L29ucy1zcGxpdHRlcj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJDb250ZW50RWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwYWdlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIFRoZSB1cmwgb2YgdGhlIGNvbnRlbnQgcGFnZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0aGUgY29udGVudCB3aWxsIGJlIGxvYWRlZCBmcm9tIGEgYDx0ZW1wbGF0ZT5gIHRhZyBvciBhIHJlbW90ZSBmaWxlLlxuICAgKlxuICAgKiAgICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwdXQgYDxvbnMtcGFnZT5gIGVsZW1lbnQgYXMgYSBjaGlsZCBvZiB0aGUgZWxlbWVudC5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1vbnMtc3BsaXR0ZXItY29udGVudOimgee0oOOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOBrlVSTOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9wYWdlID0gbnVsbDtcbiAgICB0aGlzLl9wYWdlTG9hZGVyID0gZGVmYXVsdFBhZ2VMb2FkZXI7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgcmV3cml0YWJsZXMucmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5fZ2V0UGFnZVRhcmdldCgpO1xuXG4gICAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgICAgdGhpcy5sb2FkKHBhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdXRpbC5tYXRjaCh0aGlzLnBhcmVudE5vZGUsICdvbnMtc3BsaXR0ZXInKSkge1xuICAgICAgdXRpbC50aHJvdygnXCJvbnMtc3BsaXR0ZXItY29udGVudFwiIG11c3QgaGF2ZSBcIm9ucy1zcGxpdHRlclwiIGFzIHBhcmVudCcpO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRQYWdlVGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJyk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHt9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGFnZVxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgcGFnZSB0byBsb2FkIGluIHRoZSBzcGxpdHRlciBjb250ZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOWGheOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBnZXQgcGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IHBhZ2VcbiAgICovXG4gIHNldCBwYWdlKHBhZ2UpIHtcbiAgICB0aGlzLl9wYWdlID0gcGFnZTtcbiAgfVxuXG4gIGdldCBfY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGFnZUxvYWRlclxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1QYWdlIGVsZW1lbnQgbG9hZGVkIGluIHRoZSBzcGxpdHRlciBjb250ZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOWGheOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBnZXQgcGFnZUxvYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUxvYWRlcjtcbiAgfVxuXG4gIHNldCBwYWdlTG9hZGVyKGxvYWRlcikge1xuICAgIGlmICghKGxvYWRlciBpbnN0YW5jZW9mIFBhZ2VMb2FkZXIpKSB7XG4gICAgICB1dGlsLnRocm93UGFnZUxvYWRlcigpO1xuICAgIH1cbiAgICB0aGlzLl9wYWdlTG9hZGVyID0gbG9hZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbG9hZFxuICAgKiBAc2lnbmF0dXJlIGxvYWQocGFnZSwgW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZSwgW29wdGlvbnNdXG4gICAqICAgW2VuXVBhZ2UgVVJMLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZG9jdW1lbnQgb3IgYW4gYDx0ZW1wbGF0ZT5gIGlkLlsvZW5dXG4gICAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIFgPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBwYWdlIHNwZWNpZmllZCBpbiBgcGFnZWAgaW4gdGhlIGNvbnRlbnQuWy9lbl1cbiAgICogICBbamFd5oyH5a6a44GX44GfVVJM44KS44Oh44Kk44Oz44Oa44O844K444KS6Kqt44G/6L6844G/44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIG5ldyBgPG9ucy1wYWdlPmAgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXWA8b25zLXBhZ2U+YOimgee0oOOCkuino+axuuOBmeOCi1Byb21pc2Xjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgbG9hZChwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLl9wYWdlID0gcGFnZTtcbiAgICBjb25zdCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxldCBvbGRDb250ZW50ID0gdGhpcy5fY29udGVudCB8fCBudWxsO1xuXG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLmxvYWQoe3BhZ2UsIHBhcmVudDogdGhpc30sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZChvbGRDb250ZW50KTtcbiAgICAgICAgICBvbGRDb250ZW50ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9zaG93KCkpO1xuXG4gICAgICAgIGNhbGxiYWNrKHBhZ2VFbGVtZW50KTtcbiAgICAgICAgcmVzb2x2ZShwYWdlRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9jb250ZW50Ll9zaG93KCk7XG4gICAgfVxuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2NvbnRlbnQuX2hpZGUoKTtcbiAgICB9XG4gIH1cblxuICBfZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fcGFnZUxvYWRlci51bmxvYWQodGhpcy5fY29udGVudCk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHJld3JpdGFibGVzKCkge1xuICAgIHJldHVybiByZXdyaXRhYmxlcztcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5TcGxpdHRlckNvbnRlbnQgPSBTcGxpdHRlckNvbnRlbnRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc3BsaXR0ZXItY29udGVudCcsIFNwbGl0dGVyQ29udGVudEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJNYXNrRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYm91bmRPbkNsaWNrID0gdGhpcy5fb25DbGljay5iaW5kKHRoaXMpO1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wYXJlbnROb2RlLl9zaWRlcy5ldmVyeShzaWRlID0+IHNpZGUubW9kZSA9PT0gJ3NwbGl0JykpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAodGhpcy5vbkNsaWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMub25DbGljaygpO1xuICAgIH0gZWxzZSBpZiAodXRpbC5tYXRjaCh0aGlzLnBhcmVudE5vZGUsICdvbnMtc3BsaXR0ZXInKSkge1xuICAgICAgdGhpcy5wYXJlbnROb2RlLl9zaWRlcy5mb3JFYWNoKHNpZGUgPT4gc2lkZS5jbG9zZSgnbGVmdCcpLmNhdGNoKCgpID0+IHt9KSk7XG4gICAgfVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2spO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljayk7XG4gIH1cbn1cblxub25zRWxlbWVudHMuU3BsaXR0ZXJNYXNrID0gU3BsaXR0ZXJNYXNrRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNwbGl0dGVyLW1hc2snLCBTcGxpdHRlck1hc2tFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBzdHlsZXIgZnJvbSAnLi4vLi4vb25zL3N0eWxlci5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uLy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGxpdHRlckFuaW1hdG9yIGV4dGVuZHMgQmFzZUFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKScsIGR1cmF0aW9uID0gMC4zLCBkZWxheSA9IDB9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZHVyYXRpb24sIGRlbGF5IH0pO1xuICB9XG5cbiAgdXBkYXRlT3B0aW9ucyhvcHRpb25zID0ge30pIHtcbiAgICB1dGlsLmV4dGVuZCh0aGlzLCB7XG4gICAgICB0aW1pbmc6IHRoaXMudGltaW5nLCBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbiwgZGVsYXk6IHRoaXMuZGVsYXlcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNpZGVFbGVtZW50XG4gICAqL1xuICBhY3RpdmF0ZShzaWRlRWxlbWVudCkge1xuICAgIGNvbnN0IHNwbGl0dGVyID0gc2lkZUVsZW1lbnQucGFyZW50Tm9kZTtcblxuICAgIGNvbnRlbnRSZWFkeShzcGxpdHRlciwgKCkgPT4ge1xuICAgICAgdGhpcy5fc2lkZSA9IHNpZGVFbGVtZW50O1xuICAgICAgdGhpcy5fb3Bwb3NpdGVTaWRlID0gc3BsaXR0ZXIucmlnaHQgIT09IHNpZGVFbGVtZW50ICYmIHNwbGl0dGVyLnJpZ2h0IHx8IHNwbGl0dGVyLmxlZnQgIT09IHNpZGVFbGVtZW50ICYmIHNwbGl0dGVyLmxlZnQ7XG4gICAgICB0aGlzLl9jb250ZW50ID0gc3BsaXR0ZXIuY29udGVudDtcbiAgICAgIHRoaXMuX21hc2sgPSBzcGxpdHRlci5tYXNrO1xuICAgIH0pO1xuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmNsZWFyVHJhbnNpdGlvbigpO1xuICAgIHRoaXMuX21hc2sgJiYgdGhpcy5jbGVhck1hc2soKTtcbiAgICB0aGlzLl9jb250ZW50ID0gdGhpcy5fc2lkZSA9IHRoaXMuX29wcG9zaXRlU2lkZSA9IHRoaXMuX21hc2sgPSBudWxsO1xuICB9XG5cbiAgZ2V0IG1pbnVzKCkge1xuICAgIHJldHVybiB0aGlzLl9zaWRlLnNpZGUgPT09ICdyaWdodCcgPyAnLScgOiAnJztcbiAgfVxuXG4gIGNsZWFyVHJhbnNpdGlvbigpIHtcbiAgICAnc2lkZSBtYXNrIGNvbnRlbnQnLnNwbGl0KC9cXHMrLylcbiAgICAgIC5mb3JFYWNoKGUgPT4gdGhpc1snXycgKyBlXSAmJiBzdHlsZXIuY2xlYXIodGhpc1snXycgKyBlXSwgJ3RyYW5zZm9ybSB0cmFuc2l0aW9uJykpO1xuICB9XG5cbiAgY2xlYXJNYXNrKCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBvdGhlciBzaWRlIG5lZWRzIHRoZSBtYXNrIGJlZm9yZSBjbGVhcmluZ1xuICAgIGlmICghdGhpcy5fb3Bwb3NpdGVTaWRlIHx8IHRoaXMuX29wcG9zaXRlU2lkZS5tb2RlID09PSAnc3BsaXQnIHx8ICF0aGlzLl9vcHBvc2l0ZVNpZGUuaXNPcGVuKSB7XG4gICAgICB0aGlzLl9tYXNrLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIHRoaXMuX21hc2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuICB0cmFuc2xhdGUoZGlzdGFuY2UpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIG9wZW4oZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBjbG9zZShkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IFNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE92ZXJsYXlTcGxpdHRlckFuaW1hdG9yIGV4dGVuZHMgU3BsaXR0ZXJBbmltYXRvciB7XG5cbiAgdHJhbnNsYXRlKGRpc3RhbmNlKSB7XG4gICAgdGhpcy5fbWFzay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsgLy8gQXZvaWQgY29udGVudCBjbGlja3NcblxuICAgIGFuaW1pdCh0aGlzLl9zaWRlKVxuICAgICAgLnF1ZXVlKHtcbiAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLm1pbnVzICsgZGlzdGFuY2V9cHgsIDAsIDApYFxuICAgICAgfSlcbiAgICAgIC5wbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgb3Blbihkb25lKSB7XG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0aGlzLl9zaWRlKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51c30xMDAlLCAwLCAwKWBcbiAgICAgICAgfSwgdGhpcy5kZWYpXG4gICAgICAgIC5xdWV1ZShjYWxsYmFjayA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9tYXNrKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgfSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAnMSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogJ2xpbmVhcicsXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBjbG9zZShkb25lKSB7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRoaXMuX3NpZGUpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgIH0sIHRoaXMuZGVmKVxuICAgICAgICAucXVldWUoY2FsbGJhY2sgPT4ge1xuICAgICAgICAgIGRvbmUgJiYgZG9uZSgpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fbWFzaylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAnMCdcbiAgICAgICAgfSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogJ2xpbmVhcicsXG4gICAgICAgIH0pXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBTcGxpdHRlckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdXNoU3BsaXR0ZXJBbmltYXRvciBleHRlbmRzIFNwbGl0dGVyQW5pbWF0b3Ige1xuXG4gIF9nZXRTbGlkaW5nRWxlbWVudHMoKSB7XG4gICAgY29uc3Qgc2xpZGluZ0VsZW1lbnRzID0gW3RoaXMuX3NpZGUsIHRoaXMuX2NvbnRlbnRdO1xuICAgIGlmICh0aGlzLl9vcHBvc2l0ZVNpZGUgJiYgdGhpcy5fb3Bwb3NpdGVTaWRlLm1vZGUgPT09ICdzcGxpdCcpIHtcbiAgICAgIHNsaWRpbmdFbGVtZW50cy5wdXNoKHRoaXMuX29wcG9zaXRlU2lkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNsaWRpbmdFbGVtZW50cztcbiAgfVxuXG4gIHRyYW5zbGF0ZShkaXN0YW5jZSkge1xuICAgIGlmICghdGhpcy5fc2xpZGluZ0VsZW1lbnRzKSB7XG4gICAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSB0aGlzLl9nZXRTbGlkaW5nRWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBBdm9pZCBjb250ZW50IGNsaWNrc1xuXG4gICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgIC5xdWV1ZSh7XG4gICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51cyArIGRpc3RhbmNlfXB4LCAwLCAwKWBcbiAgICAgIH0pXG4gICAgICAucGxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIG9wZW4oZG9uZSkge1xuICAgIGNvbnN0IG1heCA9IHRoaXMuX3NpZGUub2Zmc2V0V2lkdGg7XG4gICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gdGhpcy5fZ2V0U2xpZGluZ0VsZW1lbnRzKCk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMubWludXMgKyBtYXh9cHgsIDAsIDApYFxuICAgICAgICB9LCB0aGlzLmRlZilcbiAgICAgICAgLnF1ZXVlKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSAmJiBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fbWFzaylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBjbG9zZShkb25lKSB7XG4gICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gdGhpcy5fZ2V0U2xpZGluZ0VsZW1lbnRzKCk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSdcbiAgICAgICAgfSwgdGhpcy5kZWYpXG4gICAgICAgIC5xdWV1ZShjYWxsYmFjayA9PiB7XG4gICAgICAgICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gbnVsbDtcbiAgICAgICAgICBzdXBlci5jbGVhclRyYW5zaXRpb24oKTtcbiAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KHRoaXMuX21hc2spXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi8uLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uLy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBTcGxpdHRlckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXZlYWxTcGxpdHRlckFuaW1hdG9yIGV4dGVuZHMgU3BsaXR0ZXJBbmltYXRvciB7XG5cbiAgX2dldFNsaWRpbmdFbGVtZW50cygpIHtcbiAgICBjb25zdCBzbGlkaW5nRWxlbWVudHMgPSBbdGhpcy5fY29udGVudCwgdGhpcy5fbWFza107XG4gICAgaWYgKHRoaXMuX29wcG9zaXRlU2lkZSAmJiB0aGlzLl9vcHBvc2l0ZVNpZGUubW9kZSA9PT0gJ3NwbGl0Jykge1xuICAgICAgc2xpZGluZ0VsZW1lbnRzLnB1c2godGhpcy5fb3Bwb3NpdGVTaWRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpZGluZ0VsZW1lbnRzO1xuICB9XG5cbiAgYWN0aXZhdGUoc2lkZUVsZW1lbnQpIHtcbiAgICBzdXBlci5hY3RpdmF0ZShzaWRlRWxlbWVudCk7XG4gICAgaWYgKHNpZGVFbGVtZW50Lm1vZGUgPT09ICdjb2xsYXBzZScpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlcyhzaWRlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLl9zaWRlICYmIHRoaXMuX3Vuc2V0U3R5bGVzKHRoaXMuX3NpZGUpO1xuICAgIHN1cGVyLmRlYWN0aXZhdGUoKTtcbiAgfVxuXG4gIF9zZXRTdHlsZXMoc2lkZUVsZW1lbnQpIHtcbiAgICBzdHlsZXIoc2lkZUVsZW1lbnQsIHtcbiAgICAgIGxlZnQ6IHNpZGVFbGVtZW50LnNpZGUgPT09ICdyaWdodCcgPyAnYXV0bycgOiAwLFxuICAgICAgcmlnaHQ6IHNpZGVFbGVtZW50LnNpZGUgPT09ICdyaWdodCcgID8gMCA6ICdhdXRvJyxcbiAgICAgIHpJbmRleDogMCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ2JsYWNrJyxcbiAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVCZWhpbmRQYWdlU3R5bGUoMCkuY29udGFpbmVyLnRyYW5zZm9ybSxcbiAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3BsaXR0ZXIgPSBzaWRlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnRlbnRSZWFkeShzcGxpdHRlciwgKCkgPT4gc3BsaXR0ZXIuY29udGVudCAmJiBzdHlsZXIoc3BsaXR0ZXIuY29udGVudCwgeyBib3hTaGFkb3c6ICcwIDAgMTJweCAwIHJnYmEoMCwgMCwgMCwgMC4yKScgfSkpO1xuICB9XG5cbiAgX3Vuc2V0U3R5bGVzKHNpZGVFbGVtZW50KSB7XG4gICAgc3R5bGVyLmNsZWFyKHNpZGVFbGVtZW50LCAnbGVmdCByaWdodCB6SW5kZXggYmFja2dyb3VuZENvbG9yIGRpc3BsYXknKTtcbiAgICBpZiAoc2lkZUVsZW1lbnQuX2NvbnRlbnQpIHtcbiAgICAgIHNpZGVFbGVtZW50Ll9jb250ZW50LnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgb3RoZXIgc2lkZSBuZWVkcyB0aGUgY29tbW9uIHN0eWxlc1xuICAgIGlmICghdGhpcy5fb3Bwb3NpdGVTaWRlIHx8IHRoaXMuX29wcG9zaXRlU2lkZS5tb2RlID09PSAnc3BsaXQnKSB7XG4gICAgICBzaWRlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNvbnRlbnQgJiYgc3R5bGVyLmNsZWFyKHNpZGVFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGVudCwgJ2JveFNoYWRvdycpO1xuICAgIH1cbiAgfVxuXG4gIF9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZShkaXN0YW5jZSkge1xuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4V2lkdGg7XG5cbiAgICBsZXQgYmVoaW5kRGlzdGFuY2UgPSAoZGlzdGFuY2UgLSBtYXgpIC8gbWF4ICogMTA7XG4gICAgYmVoaW5kRGlzdGFuY2UgPSBpc05hTihiZWhpbmREaXN0YW5jZSkgPyAwIDogTWF0aC5tYXgoTWF0aC5taW4oYmVoaW5kRGlzdGFuY2UsIDApLCAtMTApO1xuXG4gICAgY29uc3QgYmVoaW5kVHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7KHRoaXMubWludXMgPyAtMSA6IDEpICogYmVoaW5kRGlzdGFuY2V9JSwgMCwgMClgO1xuICAgIGNvbnN0IG9wYWNpdHkgPSAxICsgYmVoaW5kRGlzdGFuY2UgLyAxMDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDoge1xuICAgICAgICBvcGFjaXR5XG4gICAgICB9LFxuICAgICAgY29udGFpbmVyOiB7XG4gICAgICAgIHRyYW5zZm9ybTogYmVoaW5kVHJhbnNmb3JtXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHRyYW5zbGF0ZShkaXN0YW5jZSkge1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuekluZGV4ID0gMTtcbiAgICB0aGlzLm1heFdpZHRoID0gdGhpcy5tYXhXaWR0aCB8fCB0aGlzLl9nZXRNYXhXaWR0aCgpO1xuICAgIGNvbnN0IG1lbnVTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKE1hdGgubWluKGRpc3RhbmNlLCB0aGlzLm1heFdpZHRoKSk7XG5cbiAgICBpZiAoIXRoaXMuX3NsaWRpbmdFbGVtZW50cykge1xuICAgICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gdGhpcy5fZ2V0U2xpZGluZ0VsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWFzay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsgLy8gQXZvaWQgY29udGVudCBjbGlja3NcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51cyArIGRpc3RhbmNlfXB4LCAwLCAwKWBcbiAgICAgICAgfSksXG4gICAgICBhbmltaXQodGhpcy5fc2lkZS5fY29udGVudClcbiAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZS5jb250ZW50KSxcbiAgICAgIGFuaW1pdCh0aGlzLl9zaWRlKVxuICAgICAgICAucXVldWUobWVudVN0eWxlLmNvbnRhaW5lcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIG9wZW4oZG9uZSkge1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuekluZGV4ID0gMTtcbiAgICB0aGlzLm1heFdpZHRoID0gdGhpcy5tYXhXaWR0aCB8fCB0aGlzLl9nZXRNYXhXaWR0aCgpO1xuICAgIGNvbnN0IG1lbnVTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKHRoaXMubWF4V2lkdGgpO1xuICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IHRoaXMuX2dldFNsaWRpbmdFbGVtZW50cygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7IC8vIEZpeDogVGltZSB0byB1cGRhdGUgcHJldmlvdXMgdHJhbnNsYXRlM2QgYWZ0ZXIgY2hhbmdpbmcgc3R5bGUuZGlzcGxheVxuICAgICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMubWludXMgKyB0aGlzLm1heFdpZHRofXB4LCAwLCAwKWBcbiAgICAgICAgICB9LCB0aGlzLmRlZiksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuX21hc2spXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLl9zaWRlLl9jb250ZW50KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZS5jb250ZW50LCB0aGlzLmRlZiksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuX3NpZGUpXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUobWVudVN0eWxlLmNvbnRhaW5lciwgdGhpcy5kZWYpXG4gICAgICAgICAgLnF1ZXVlKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IG51bGw7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSAmJiBkb25lKCk7XG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0sIDEwMDAvNjApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGNsb3NlKGRvbmUpIHtcbiAgICBjb25zdCBtZW51U3R5bGUgPSB0aGlzLl9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZSgwKTtcbiAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSB0aGlzLl9nZXRTbGlkaW5nRWxlbWVudHMoKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJ1xuICAgICAgICB9LCB0aGlzLmRlZiksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9tYXNrKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KHRoaXMuX3NpZGUuX2NvbnRlbnQpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZShtZW51U3R5bGUuY29udGVudCwgdGhpcy5kZWYpLFxuXG4gICAgICBhbmltaXQodGhpcy5fc2lkZSlcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZS5jb250YWluZXIsIHRoaXMuZGVmKVxuICAgICAgICAucXVldWUoY2FsbGJhY2sgPT4ge1xuICAgICAgICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fc2lkZS5zdHlsZS56SW5kZXggPSAwO1xuICAgICAgICAgIHRoaXMuX3NpZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB0aGlzLl9zaWRlLl9jb250ZW50LnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgX2dldE1heFdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLl9zaWRlLm9mZnNldFdpZHRoO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgT3ZlcmxheVNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9vbnMtc3BsaXR0ZXIvb3ZlcmxheS1hbmltYXRvci5qcyc7XG5pbXBvcnQgUHVzaFNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9vbnMtc3BsaXR0ZXIvcHVzaC1hbmltYXRvci5qcyc7XG5pbXBvcnQgUmV2ZWFsU3BsaXR0ZXJBbmltYXRvciBmcm9tICcuL29ucy1zcGxpdHRlci9yZXZlYWwtYW5pbWF0b3IuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIGZyb20gJy4uL29ucy9pbnRlcm5hbC9kZXZpY2UtYmFjay1idXR0b24tZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgZGVmYXVsdDogT3ZlcmxheVNwbGl0dGVyQW5pbWF0b3IsXG4gIG92ZXJsYXk6IE92ZXJsYXlTcGxpdHRlckFuaW1hdG9yLFxuICBwdXNoOiBQdXNoU3BsaXR0ZXJBbmltYXRvcixcbiAgcmV2ZWFsOiBSZXZlYWxTcGxpdHRlckFuaW1hdG9yXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zcGxpdHRlclxuICogQGNhdGVnb3J5IG1lbnVcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1cbiAqICAgIEEgY29tcG9uZW50IHRoYXQgZW5hYmxlcyByZXNwb25zaXZlIGxheW91dCBieSBpbXBsZW1lbnRpbmcgYm90aCBhIHR3by1jb2x1bW4gbGF5b3V0IGFuZCBhIHNsaWRpbmcgbWVudSBsYXlvdXQuXG4gKlxuICogICAgSXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBleHBhbmQgaW50byBhIGNvbHVtbiBsYXlvdXQgb24gbGFyZ2Ugc2NyZWVucyBhbmQgY29sbGFwc2UgdGhlIG1lbnUgb24gc21hbGxlciBzY3JlZW5zLiBXaGVuIHRoZSBtZW51IGlzIGNvbGxhcHNlZCB0aGUgdXNlciBjYW4gb3BlbiBpdCBieSBzd2lwaW5nLlxuICogIFsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAY29kZXBlbiByT1FPTUxcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGxpdHRlclxuICogQGd1aWRlIGZ1bmRhbWVudGFscy5odG1sI21hbmFnaW5nLXBhZ2VzXG4gKiAgW2VuXU1hbmFnaW5nIG11bHRpcGxlIHBhZ2VzLlsvZW5dXG4gKiAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BsaXR0ZXItY29udGVudFxuICogIFtlbl1UaGUgYDxvbnMtc3BsaXR0ZXItY29udGVudD5gIGNvbXBvbmVudCBjb250YWlucyB0aGUgbWFpbiBjb250ZW50IG9mIHRoZSBwYWdlLlsvZW5dXG4gKiAgW2phXW9ucy1zcGxpdHRlci1jb250ZW5044Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGxpdHRlci1zaWRlXG4gKiAgW2VuXVRoZSBgPG9ucy1zcGxpdHRlci1zaWRlPmAgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBtZW51LlsvZW5dXG4gKiAgW2phXW9ucy1zcGxpdHRlci1zaWRl44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNwbGl0dGVyIGlkPVwic3BsaXR0ZXJcIj5cbiAqICAgPG9ucy1zcGxpdHRlci1jb250ZW50PlxuICogICAgIC4uLlxuICogICA8L29ucy1zcGxpdHRlci1jb250ZW50PlxuICpcbiAqICAgPG9ucy1zcGxpdHRlci1zaWRlIHNpZGU9XCJsZWZ0XCIgd2lkdGg9XCI4MCVcIiBjb2xsYXBzZSBzd2lwZWFibGU+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLXNwbGl0dGVyLXNpZGU+XG4gKiA8L29ucy1zcGxpdHRlcj5cbiAqXG4gKiA8c2NyaXB0PlxuICogICB2YXIgc3BsaXR0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BsaXR0ZXInKTtcbiAqICAgc3BsaXR0ZXIubGVmdC5vcGVuKCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIF9nZXRTaWRlKHNpZGUpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgZSA9PiB7XG4gICAgICByZXR1cm4gdXRpbC5tYXRjaChlLCAnb25zLXNwbGl0dGVyLXNpZGUnKSAmJiBlLmdldEF0dHJpYnV0ZSgnc2lkZScpID09PSBzaWRlO1xuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsZWZ0XG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1MZWZ0IGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgbGVmdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0U2lkZSgnbGVmdCcpO1xuICB9XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcmlnaHRcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJpZ2h0IGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgcmlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNpZGUoJ3JpZ2h0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNpZGVcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcnN0IGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50IHJlZ2FyZGxlc3MgdGhlIGFjdHVhbCBzaWRlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgc2lkZSgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1zcGxpdHRlci1zaWRlJyk7XG4gIH1cblxuICBnZXQgX3NpZGVzKCkge1xuICAgIHJldHVybiBbdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0XS5maWx0ZXIoZSA9PiBlKTtcbiAgfVxuICAvKipcbiAgICogQHByb3BlcnR5IGNvbnRlbnRcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBgPG9ucy1zcGxpdHRlci1jb250ZW50PmAgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtc3BsaXR0ZXItY29udGVudCcpO1xuICB9XG5cbiAgZ2V0IHRvcFBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudC5fY29udGVudDtcbiAgfVxuXG4gIGdldCBtYXNrKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXNwbGl0dGVyLW1hc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuICBnZXQgb25EZXZpY2VCYWNrQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcjtcbiAgfVxuXG4gIHNldCBvbkRldmljZUJhY2tCdXR0b24oY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fYmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlciA9IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgIHRoaXMuX3NpZGVzLnNvbWUocyA9PiBzLmlzT3BlbiA/IHMuY2xvc2UoKSA6IGZhbHNlKSB8fCBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICB9XG5cbiAgX29uTW9kZUNoYW5nZShlKSB7XG4gICAgaWYgKGUudGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xheW91dCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX2xheW91dCgpIHtcbiAgICB0aGlzLl9zaWRlcy5mb3JFYWNoKHNpZGUgPT4ge1xuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQuc3R5bGVbc2lkZS5zaWRlXSA9IHNpZGUubW9kZSA9PT0gJ3NwbGl0JyA/IHNpZGUuc3R5bGUud2lkdGggOiAwO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX29uTW9kZUNoYW5nZSA9IHRoaXMuX29uTW9kZUNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICF0aGlzLm1hc2sgJiYgdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbnMtc3BsaXR0ZXItbWFzaycpKTtcbiAgICAgIHRoaXMuX2xheW91dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24gPSB0aGlzLl9vbkRldmljZUJhY2tCdXR0b24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCB0aGlzLl9vbk1vZGVDaGFuZ2UsIGZhbHNlKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb2RlY2hhbmdlJywgdGhpcy5fb25Nb2RlQ2hhbmdlLCBmYWxzZSk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge31cblxuICBfc2hvdygpIHtcbiAgICB1dGlsLnByb3BhZ2F0ZUFjdGlvbih0aGlzLCAnX3Nob3cnKTtcbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHV0aWwucHJvcGFnYXRlQWN0aW9uKHRoaXMsICdfaGlkZScpO1xuICB9XG5cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ19kZXN0cm95Jyk7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IgaW5zdGFuY2VvZiBTcGxpdHRlckFuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdTcGxpdHRlcicpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFNwbGl0dGVyQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIFNwbGl0dGVyQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5TcGxpdHRlciA9IFNwbGl0dGVyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNwbGl0dGVyJywgU3BsaXR0ZXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgb3JpZW50YXRpb24gZnJvbSAnLi4vb25zL29yaWVudGF0aW9uLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgU3BsaXR0ZXJBbmltYXRvciBmcm9tICcuL29ucy1zcGxpdHRlci9hbmltYXRvci5qcyc7XG5pbXBvcnQgU3dpcGVSZXZlYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL3N3aXBlLXJldmVhbC5qcyc7XG5pbXBvcnQgRG9vckxvY2sgZnJvbSAnLi4vb25zL2Rvb3Jsb2NrLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IHsgUGFnZUxvYWRlciwgZGVmYXVsdFBhZ2VMb2FkZXJ9IGZyb20gJy4uL29ucy9wYWdlLWxvYWRlci5qcyc7XG5pbXBvcnQgU3BsaXR0ZXJFbGVtZW50IGZyb20gJy4vb25zLXNwbGl0dGVyLmpzJztcblxuY29uc3QgU1BMSVRfTU9ERSA9ICdzcGxpdCc7XG5jb25zdCBDT0xMQVBTRV9NT0RFID0gJ2NvbGxhcHNlJztcbmNvbnN0IENMT1NFRF9TVEFURSA9ICdjbG9zZWQnO1xuY29uc3QgT1BFTl9TVEFURSA9ICdvcGVuJztcbmNvbnN0IENIQU5HSU5HX1NUQVRFID0gJ2NoYW5naW5nJztcblxuY29uc3QgcmV3cml0YWJsZXMgPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNwbGl0dGVyU2lkZUVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHJlYWR5KHNwbGl0dGVyU2lkZUVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuY2xhc3MgQ29sbGFwc2VEZXRlY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCB0YXJnZXQpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGFyZ2V0ICYmIHRoaXMuY2hhbmdlVGFyZ2V0KHRhcmdldCk7XG4gIH1cblxuICBjaGFuZ2VUYXJnZXQodGFyZ2V0KSB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gWydwb3J0cmFpdCcsICdsYW5kc2NhcGUnXS5pbmRleE9mKHRhcmdldCkgIT09IC0xO1xuICAgICAgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXRjaCh2YWx1ZSkge1xuICAgIGlmICh0aGlzLl9vcmllbnRhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldCA9PT0gKHZhbHVlLmlzUG9ydHJhaXQgPyAncG9ydHJhaXQnIDogJ2xhbmRzY2FwZScpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUubWF0Y2hlcztcbiAgfVxuXG4gIF9vbkNoYW5nZSh2YWx1ZSkge1xuICAgIHRoaXMuX2VsZW1lbnQuX3VwZGF0ZU1vZGUodGhpcy5fbWF0Y2godmFsdWUpID8gQ09MTEFQU0VfTU9ERSA6IFNQTElUX01PREUpO1xuICB9XG5cbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX29yaWVudGF0aW9uKSB7XG4gICAgICBvcmllbnRhdGlvbi5vbignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICAgICAgdGhpcy5fb25DaGFuZ2Uoe2lzUG9ydHJhaXQ6IG9yaWVudGF0aW9uLmlzUG9ydHJhaXQoKX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9xdWVyeVJlc3VsdCA9IHdpbmRvdy5tYXRjaE1lZGlhKHRoaXMuX3RhcmdldCk7XG4gICAgICB0aGlzLl9xdWVyeVJlc3VsdC5hZGRMaXN0ZW5lcih0aGlzLl9vbkNoYW5nZSk7XG4gICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl9xdWVyeVJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZSgpIHtcbiAgICBpZiAodGhpcy5fb3JpZW50YXRpb24pIHtcbiAgICAgIG9yaWVudGF0aW9uLm9mZignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcXVlcnlSZXN1bHQpIHtcbiAgICAgIHRoaXMuX3F1ZXJ5UmVzdWx0LnJlbW92ZUxpc3RlbmVyKHRoaXMuX29uQ2hhbmdlKTtcbiAgICAgIHRoaXMuX3F1ZXJ5UmVzdWx0ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgd2lkdGhUb1B4ID0gKHdpZHRoLCBwYXJlbnQpID0+IHtcbiAgY29uc3QgW3ZhbHVlLCBweF0gPSBbcGFyc2VJbnQod2lkdGgsIDEwKSwgL3B4Ly50ZXN0KHdpZHRoKV07XG4gIHJldHVybiBweCA/IHZhbHVlIDogTWF0aC5yb3VuZChwYXJlbnQub2Zmc2V0V2lkdGggKiB2YWx1ZSAvIDEwMCk7XG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zcGxpdHRlci1zaWRlXG4gKiBAY2F0ZWdvcnkgbWVudVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVxuICogICAgVGhlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50IGlzIHVzZWQgYXMgYSBjaGlsZCBlbGVtZW50IG9mIGA8b25zLXNwbGl0dGVyPmAuXG4gKlxuICogICAgSXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZWl0aGVyIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgb2YgdGhlIGA8b25zLXNwbGl0dGVyLWNvbnRlbnQ+YCBlbGVtZW50LlxuICpcbiAqICAgIEl0IHN1cHBvcnRzIHR3byBtb2RlczogY29sbGFwc2VkIGFuZCBzcGxpdC4gV2hlbiBpdCdzIGluIGNvbGxhcHNlZCBtb2RlIGl0IHdpbGwgYmUgaGlkZGVuIGZyb20gdmlldyBhbmQgY2FuIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIHN3aXBlcyB0aGUgc2NyZWVuIG9yIHRhcHMgYSBidXR0b24uIEluIHNwbGl0IG1vZGUgdGhlIGVsZW1lbnQgaXMgYWx3YXlzIHNob3duLiBJdCBjYW4gYmUgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gbW9kZXMgZGVwZW5kaW5nIG9uIHRoZSBzY3JlZW4gc2l6ZS5cbiAqICBbL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXItc2lkZeimgee0oOOBr+OAgW9ucy1zcGxpdHRlcuimgee0oOOBruWtkOimgee0oOOBqOOBl+OBpuWIqeeUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiByT1FPTUxcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGxpdHRlclxuICogQGd1aWRlIGZ1bmRhbWVudGFscy5odG1sI21hbmFnaW5nLXBhZ2VzXG4gKiAgW2VuXU1hbmFnaW5nIG11bHRpcGxlIHBhZ2VzLlsvZW5dXG4gKiAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BsaXR0ZXJcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyPmAgaXMgdGhlIHBhcmVudCBjb21wb25lbnQuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVy44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGxpdHRlci1jb250ZW50XG4gKiAgW2VuXVRoZSBgPG9ucy1zcGxpdHRlci1jb250ZW50PmAgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBtYWluIGNvbnRlbnQgb2YgdGhlIHBhZ2UuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVyLWNvbnRlbnTjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3BsaXR0ZXI+XG4gKiAgIDxvbnMtc3BsaXR0ZXItY29udGVudD5cbiAqICAgICAuLi5cbiAqICAgPC9vbnMtc3BsaXR0ZXItY29udGVudD5cbiAqXG4gKiAgIDxvbnMtc3BsaXR0ZXItc2lkZSBzaWRlPVwibGVmdFwiIHdpZHRoPVwiODAlXCIgY29sbGFwc2U+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLXNwbGl0dGVyLXNpZGU+XG4gKiA8L29ucy1zcGxpdHRlcj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJTaWRlRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IG1vZGVjaGFuZ2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGNvbXBvbmVudCdzIG1vZGUgY2hhbmdlcy5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDjga7jg6Ljg7zjg4njgYzlpInljJbjgZfjgZ/pmpvjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zaWRlXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50Lm1vZGVcbiAgICogICBbZW5dUmV0dXJucyB0aGUgY3VycmVudCBtb2RlLiBDYW4gYmUgZWl0aGVyIGBcImNvbGxhcHNlXCJgIG9yIGBcInNwbGl0XCJgLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruODouODvOODieOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlb3BlblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHNsaWRpbmcgbWVudSBpcyBvcGVuZWQuWy9lbl1cbiAgICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844GM6ZaL44GP5YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dQ2FsbCB0byBjYW5jZWwgb3BlbmluZyBzbGlkaW5nIG1lbnUuWy9lbl1cbiAgICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844GM6ZaL44GP44Gu44KS44Kt44Oj44Oz44K744Or44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RvcGVuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBzbGlkaW5nIG1lbnUgaXMgb3BlbmVkLlsvZW5dXG4gICAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWi+OBhOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWNsb3NlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgc2xpZGluZyBtZW51IGlzIGNsb3NlZC5bL2VuXVxuICAgKiAgIFtqYV3jgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgYzplonjgZjjgovliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zaWRlXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUNhbGwgdG8gY2FuY2VsIG9wZW5pbmcgc2xpZGluZy1tZW51LlsvZW5dXG4gICAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWieOBmOOCi+OBruOCkuOCreODo+ODs+OCu+ODq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGNsb3NlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBzbGlkaW5nIG1lbnUgaXMgY2xvc2VkLlsvZW5dXG4gICAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWieOBmOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHN3aXBlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIHNwbGl0dGVyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5yYXRpb1xuICAgKiAgIFtlbl1EZWNpbWFsIHJhdGlvICgwLTEpLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbmltYXRpb25PcHRpb25zXG4gICAqICAgW2VuXVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCAgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24uIFVzZSBvbmUgb2YgYG92ZXJsYXlgLCBgcHVzaGAsIGByZXZlYWxgIG9yICBgZGVmYXVsdGAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgpLmjIflrprjgZfjgb7jgZnjgIJcIm92ZXJsYXlcIiwgXCJwdXNoXCIsIFwicmV2ZWFsXCIsIFwiZGVmYXVsdFwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uLW9wdGlvbnNcbiAgICogQHR5cGUge0V4cHJlc3Npb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBvcGVuLXRocmVzaG9sZFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVmYXVsdCAgMC4zXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgaG93IG11Y2ggdGhlIG1lbnUgbmVlZHMgdG8gYmUgc3dpcGVkIGJlZm9yZSBvcGVuaW5nLiBBIHZhbHVlIGJldHdlZW4gYDBgIGFuZCBgMWAuWy9lbl1cbiAgICogIFtqYV3jganjga7jgY/jgonjgYTjgrnjg6/jgqTjg5fjgZnjgozjgbDjgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgpLplovjgY/jgYvjganjgYbjgYvjga7libLlkIjjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMeOBrumWk+OBruaVsOWApOOCkuaMh+WumuOBl+OBvuOBmeOAguOCueODr+OCpOODl+OBrui3nembouOBjOOBk+OBk+OBp+aMh+WumuOBl+OBn+aVsOWApOaOm+OBkeOCi+OBk+OBruimgee0oOOBruW5heOCiOOCiuOCguWkp+OBjeOBkeOCjOOBsOOAgeOCueODr+OCpOODl+OBjOe1guOCj+OBo+OBn+aZguOBq+OBk+OBruimgee0oOOCkumWi+OBjeOBvuOBmeOAguODh+ODleOCqeODq+ODiOOBrzAuM+OBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNvbGxhcHNlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIFNwZWNpZnkgdGhlIGNvbGxhcHNlIGJlaGF2aW9yLiBWYWxpZCB2YWx1ZXMgYXJlIGBcInBvcnRyYWl0XCJgLCBgXCJsYW5kc2NhcGVcImAgb3IgYSBtZWRpYSBxdWVyeS5cbiAgICogICAgIFRoZSBzdHJpbmcgYFwicG9ydHJhaXRcImAgbWVhbnMgdGhlIHZpZXcgd2lsbCBjb2xsYXBzZSB3aGVuIHRoZSBkZXZpY2UgaXMgaW4gcG9ydHJhaXQgb3JpZW50YXRpb24uXG4gICAqICAgICBUaGUgc3RyaW5nIGBcImxhbmRzY2FwZVwiYCBtZWFucyB0aGUgdmlldyB3aWxsIGNvbGxhcHNlIHdoZW4gdGhlIGRldmljZSBpcyBpbiBsYW5kc2NhcGUgb3JpZW50YXRpb24uXG4gICAqICAgICBJZiB0aGUgdmFsdWUgaXMgYSBtZWRpYSBxdWVyeSwgdGhlIHZpZXcgd2lsbCBjb2xsYXBzZSB3aGVuIHRoZSBtZWRpYSBxdWVyeSByZXNvbHZlcyB0byBgdHJ1ZWAuXG4gICAqICAgICBJZiB0aGUgYXR0cmlidXRlIGlzIHNldCwgaW5jbHVkaW5nIGFzIGFuIGVtcHR5IHN0cmluZywgdGhlIHZpZXcgd2lsbCBhbHdheXMgYmUgaW4gYFwiY29sbGFwc2VcImAgbW9kZS5cbiAgICogICAgIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIHZpZXcgd2lsbCBiZSBpbiBgXCJzcGxpdFwiYCBtb2RlLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg5bem5YG044Gu44Oa44O844K444KS6Z2e6KGo56S644Gr44GZ44KL5p2h5Lu244KS5oyH5a6a44GX44G+44GZ44CCcG9ydHJhaXQsIGxhbmRzY2FwZeOAgXdpZHRoICNweOOCguOBl+OBj+OBr+ODoeODh+OCo+OCouOCr+OCqOODquOBruaMh+WumuOBjOWPr+iDveOBp+OBmeOAglxuICAgKiAgICAgcG9ydHJhaXTjgoLjgZfjgY/jga9sYW5kc2NhcGXjgpLmjIflrprjgZnjgovjgajjgIHjg4fjg5DjgqTjgrnjga7nlLvpnaLjgYznuKblkJHjgY3jgoLjgZfjgY/jga/mqKrlkJHjgY3jgavjgarjgaPjgZ/mmYLjgavpgannlKjjgZXjgozjgb7jgZnjgIJcbiAgICogICAgIOODoeODh+OCo+OCouOCr+OCqOODquOCkuaMh+WumuOBmeOCi+OBqOOAgeaMh+WumuOBl+OBn+OCr+OCqOODquOBq+mBqeWQiOOBl+OBpuOBhOOCi+WgtOWQiOOBq+mBqeeUqOOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg5YCk44Gr5L2V44KC5oyH5a6a44GX44Gq44GE5aC05ZCI44Gr44Gv44CB5bi444GrY29sbGFwc2Xjg6Ljg7zjg4njgavjgarjgorjgb7jgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzd2lwZS10YXJnZXQtd2lkdGhcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSB3aWR0aCBvZiBzd2lwZWFibGUgYXJlYSBjYWxjdWxhdGVkIGZyb20gdGhlIGVkZ2UgKGluIHBpeGVscykuIFVzZSB0aGlzIHRvIGVuYWJsZSBzd2lwZSBvbmx5IHdoZW4gdGhlIGZpbmdlciB0b3VjaCBvbiB0aGUgc2NyZWVuIGVkZ2UuWy9lbl1cbiAgICogICBbamFd44K544Ov44Kk44OX44Gu5Yik5a6a6aCY5Z+f44KS44OU44Kv44K744Or5Y2Y5L2N44Gn5oyH5a6a44GX44G+44GZ44CC55S76Z2i44Gu56uv44GL44KJ5oyH5a6a44GX44Gf6Led6Zui44Gr6YGU44GZ44KL44Go44Oa44O844K444GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgd2lkdGhcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNhbiBiZSBzcGVjaWZpZWQgaW4gZWl0aGVyIHBpeGVscyBvciBhcyBhIHBlcmNlbnRhZ2UsIGUuZy4gYDkwJWAgb3IgYDIwMHB4YC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDjga7mqKrluYXjgpLmjIflrprjgZfjgb7jgZnjgIJweOOBqCXjgafjga7mjIflrprjgYzlj6/og73jgafjgZnjgIJlZy4gOTAlLCAyMDBweFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNpZGVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgbGVmdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB3aGljaCBzaWRlIG9mIHRoZSBzY3JlZW4gdGhlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50IGlzIGxvY2F0ZWQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYFwibGVmdFwiYCBhbmQgYFwicmlnaHRcImAuWy9lbl1cbiAgICogICBbamFd44GT44Gu6KaB57Sg44GM5bem44GL5Y+z44GL44KS5oyH5a6a44GX44G+44GZ44CC5oyH5a6a44Gn44GN44KL5YCk44GvXCJsZWZ0XCLjgYtcInJpZ2h0XCLjga7jgb/jgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IG1vZGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYFwiY29sbGFwc2VcImAgb3IgYFwic3BsaXRcImAuIFRoaXMgYXR0cmlidXRlIGlzIHJlYWQgb25seS5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7jg6Ljg7zjg4njgYzoqK3lrprjgZXjgozjgb7jgZnjgIJcImNvbGxhcHNlXCLjgoLjgZfjgY/jga9cInNwbGl0XCLjgYzmjIflrprjgZXjgozjgb7jgZnjgILjgZPjga7lsZ7mgKfjga/oqq3jgb/ovrzjgb/lsILnlKjjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwYWdlXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIFVSTCBvZiB0aGUgbWVudSBwYWdlLlsvZW5dXG4gICAqICAgW2phXW9ucy1zcGxpdHRlci1zaWRl6KaB57Sg44Gr6KGo56S644GZ44KL44Oa44O844K444GuVVJM44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc3dpcGVhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0byBlbmFibGUgc3dpcGUgaW50ZXJhY3Rpb24gb24gY29sbGFwc2UgbW9kZS5bL2VuXVxuICAgKiAgIFtqYV1jb2xsYXBzZeODouODvOODieaZguOBq+OCueODr+OCpOODl+aTjeS9nOOCkuacieWKueOBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc3dpcGVhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0byBlbmFibGUgc3dpcGUgaW50ZXJhY3Rpb24gb24gY29sbGFwc2UgbW9kZS5bL2VuXVxuICAgKiAgIFtqYV1jb2xsYXBzZeODouODvOODieaZguOBq+OCueODr+OCpOODl+aTjeS9nOOCkuacieWKueOBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9wYWdlID0gbnVsbDtcbiAgICB0aGlzLl9zdGF0ZSA9IENMT1NFRF9TVEFURTtcbiAgICB0aGlzLl9sb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IGRlZmF1bHRQYWdlTG9hZGVyO1xuICAgIHRoaXMuX2NvbGxhcHNlRGV0ZWN0aW9uID0gbmV3IENvbGxhcHNlRGV0ZWN0aW9uKHRoaXMpO1xuXG4gICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IFNwbGl0dGVyRWxlbWVudC5hbmltYXRvcnMsXG4gICAgICBiYXNlQ2xhc3M6IFNwbGl0dGVyQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnU3BsaXR0ZXJBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFyZSB1c2VkIGVhcmx5IGJ5IHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soJ3dpZHRoJyk7XG4gICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdzaWRlJykpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3NpZGUnLCAnbGVmdCcpO1xuICAgICAgfVxuXG4gICAgICByZXdyaXRhYmxlcy5yZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLl9wYWdlIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJyk7XG4gICAgICAgIHBhZ2UgJiYgdGhpcy5sb2FkKHBhZ2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAoIXV0aWwubWF0Y2godGhpcy5wYXJlbnROb2RlLCAnb25zLXNwbGl0dGVyJykpIHtcbiAgICAgIHV0aWwudGhyb3coJ1BhcmVudCBtdXN0IGJlIGFuIG9ucy1zcGxpdHRlciBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zd2lwZSkge1xuICAgICAgdGhpcy5fc3dpcGUgPSBuZXcgU3dpcGVSZXZlYWwoe1xuICAgICAgICBlbGVtZW50OiB0aGlzLFxuICAgICAgICBlbGVtZW50SGFuZGxlcjogdGhpcy5wYXJlbnRFbGVtZW50LFxuICAgICAgICBzd2lwZU1heDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGlvID0gMTtcbiAgICAgICAgICB0aGlzLl9vblN3aXBlICYmIHRoaXMuX29uU3dpcGUocmF0aW8sIHRoaXMuX2FuaW1hdGlvbk9wdCk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgcmF0aW8sIGFuaW1hdGlvbk9wdGlvbnM6IHRoaXMuX2FuaW1hdGlvbk9wdCB9KTtcbiAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3dpcGVNaWQ6IChkaXN0YW5jZSwgd2lkdGgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbyA9IGRpc3RhbmNlIC8gd2lkdGg7XG4gICAgICAgICAgdGhpcy5fb25Td2lwZSAmJiB0aGlzLl9vblN3aXBlKHJhdGlvKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbyB9KTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRvci50cmFuc2xhdGUoZGlzdGFuY2UpO1xuICAgICAgICB9LFxuICAgICAgICBzd2lwZU1pbjogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGlvID0gMDtcbiAgICAgICAgICB0aGlzLl9vblN3aXBlICYmIHRoaXMuX29uU3dpcGUocmF0aW8sIHRoaXMuX2FuaW1hdGlvbk9wdCk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgcmF0aW8sIGFuaW1hdGlvbk9wdGlvbnM6IHRoaXMuX2FuaW1hdGlvbk9wdCB9KTtcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFRocmVzaG9sZDogKCkgPT4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcGFyc2VGbG9hdCh0aGlzLmdldEF0dHJpYnV0ZSgnb3Blbi10aHJlc2hvbGQnKSkgfHwgMC4zKSksXG4gICAgICAgIGdldFNpZGU6ICgpID0+IHRoaXMuc2lkZSxcbiAgICAgICAgaXNJbml0aWFsU3RhdGU6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbG9zZWQgPSB0aGlzLl9zdGF0ZSA9PT0gQ0xPU0VEX1NUQVRFO1xuICAgICAgICAgIHRoaXMuX3N0YXRlID0gQ0hBTkdJTkdfU1RBVEU7XG4gICAgICAgICAgcmV0dXJuIGNsb3NlZDtcbiAgICAgICAgfSxcbiAgICAgICAgaWdub3JlU3dpcGU6IChldmVudCwgZGlzdGFuY2UpID0+IHtcbiAgICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLmlzT3BlbjtcbiAgICAgICAgICBjb25zdCB2YWxpZERyYWcgPSBkID0+IHRoaXMuc2lkZSA9PT0gJ2xlZnQnXG4gICAgICAgICAgICA/ICgoZCA9PT0gJ2xlZnQnICYmIGlzT3BlbikgfHwgKGQgPT09ICdyaWdodCcgJiYgIWlzT3BlbikpXG4gICAgICAgICAgICA6ICgoZCA9PT0gJ2xlZnQnICYmICFpc09wZW4pIHx8IChkID09PSAncmlnaHQnICYmIGlzT3BlbikpO1xuXG4gICAgICAgICAgY29uc3QgYXJlYSA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdzd2lwZS10YXJnZXQtd2lkdGgnKSwgMTApIHx8IDApO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX21vZGUgPT09IFNQTElUX01PREUgfHwgdGhpcy5fbG9jay5pc0xvY2tlZCgpIHx8IHRoaXMuX2lzT3RoZXJTaWRlT3BlbigpXG4gICAgICAgICAgICB8fCAhdmFsaWREcmFnKGV2ZW50Lmdlc3R1cmUuZGlyZWN0aW9uKVxuICAgICAgICAgICAgfHwgKCFpc09wZW4gJiYgYXJlYSAhPT0gMCAmJiBkaXN0YW5jZSA+IGFyZWEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soJ3N3aXBlYWJsZScpO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yLm9ic2VydmVkQXR0cmlidXRlcy5mb3JFYWNoKGF0dHIgPT4gdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0ciwgbnVsbCwgdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cikpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzaWRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc2lkZScpID09PSAncmlnaHQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgfVxuXG4gIHNldCBzaWRlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2lkZScsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGlocy5yZW1vdmVBdHRyaWJ1dGUoJ3NpZGUnKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zd2lwZSAmJiB0aGlzLl9zd2lwZS5kaXNwb3NlKCk7XG4gICAgdGhpcy5fYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRpb25PcHQgPSB0aGlzLl9zd2lwZSA9IG51bGw7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydhbmltYXRpb24nLCAnd2lkdGgnLCAnY29sbGFwc2UnLCAnc3dpcGVhYmxlJywgJ2FuaW1hdGlvbi1vcHRpb25zJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnc3dpcGVhYmxlJzpcbiAgICAgICAgdGhpcy5fc3dpcGUgJiYgdGhpcy5fc3dpcGUudXBkYXRlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICBjdXJyZW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7IC8vIFNvbWV0aW1lcyB1bmRlZmluZWQuIENFIGJ1Zz9cbiAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IC9eXFxkKyhweHwlKSQvLnRlc3QoY3VycmVudCkgPyBjdXJyZW50IDogJzgwJSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgIGNhc2UgJ2FuaW1hdGlvbi1vcHRpb25zJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpc1t1dGlsLmNhbWVsaXplKGBfdXBkYXRlLSR7bmFtZX1gKV0oY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgX2VtaXRFdmVudChuYW1lKSB7XG4gICAgaWYgKG5hbWUuc2xpY2UoMCwgMykgIT09ICdwcmUnKSB7XG4gICAgICByZXR1cm4gdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsIG5hbWUsIHtzaWRlOiB0aGlzfSk7XG4gICAgfVxuICAgIGxldCBpc0NhbmNlbGVkID0gZmFsc2U7XG5cbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgbmFtZSwge1xuICAgICAgc2lkZTogdGhpcyxcbiAgICAgIGNhbmNlbDogKCkgPT4gaXNDYW5jZWxlZCA9IHRydWVcbiAgICB9KTtcblxuICAgIHJldHVybiBpc0NhbmNlbGVkO1xuICB9XG5cbiAgX2lzT3RoZXJTaWRlT3BlbigpIHtcbiAgICByZXR1cm4gISF1dGlsLmZpbmRDaGlsZCh0aGlzLnBhcmVudEVsZW1lbnQsXG4gICAgICBlbCA9PiBlbCBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IgJiYgZWwgIT09IHRoaXMgJiYgZWwuX21vZGUgPT09IENPTExBUFNFX01PREUgJiYgZWwuaXNPcGVuXG4gICAgKTtcbiAgfVxuXG4gIF91cGRhdGVDb2xsYXBzZSh2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdjb2xsYXBzZScpKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSAnc3BsaXQnKSB7XG4gICAgICB0aGlzLl9jb2xsYXBzZURldGVjdGlvbi5kaXNhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5fdXBkYXRlTW9kZShTUExJVF9NT0RFKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ2NvbGxhcHNlJykge1xuICAgICAgdGhpcy5fY29sbGFwc2VEZXRlY3Rpb24uZGlzYWJsZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU1vZGUoQ09MTEFQU0VfTU9ERSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29sbGFwc2VEZXRlY3Rpb24uY2hhbmdlVGFyZ2V0KHZhbHVlKTtcbiAgfVxuXG4gIF91cGRhdGVNb2RlKG1vZGUpIHtcbiAgICBpZiAobW9kZSAhPT0gdGhpcy5fbW9kZSkge1xuICAgICAgdGhpcy5fbW9kZSA9IG1vZGU7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbW9kZScsIG1vZGUpOyAvLyByZWFkb25seSBhdHRyaWJ1dGUgZm9yIHRoZSB1c2Vyc1xuXG4gICAgICBpZiAobW9kZSA9PT0gU1BMSVRfTU9ERSkge1xuICAgICAgICB0aGlzLl9hbmltYXRvciAmJiB0aGlzLl9hbmltYXRvci5kZWFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gQ0xPU0VEX1NUQVRFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgJiYgdGhpcy5fYW5pbWF0b3IuYWN0aXZhdGUodGhpcyk7XG4gICAgICAgIHRoaXMuX3N0YXRlID09PSBPUEVOX1NUQVRFICYmIHRoaXMuX2FuaW1hdG9yLm9wZW4oKTtcbiAgICAgIH1cblxuICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdtb2RlY2hhbmdlJywgeyBzaWRlOiB0aGlzLCBtb2RlIH0pO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVBbmltYXRpb24oYW5pbWF0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpKSB7XG4gICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5fYW5pbWF0b3IgJiYgdGhpcy5fYW5pbWF0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgdGhpcy5fYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Ioe2FuaW1hdGlvbn0pO1xuICAgICAgdGhpcy5fYW5pbWF0b3IuYWN0aXZhdGUodGhpcyk7XG4gICAgICB0aGlzLl9hbmltYXRpb25PcHQgPSB7XG4gICAgICAgIHRpbWluZzogdGhpcy5fYW5pbWF0b3IuZHVyYXRpb24sXG4gICAgICAgIGR1cmF0aW9uOiB0aGlzLl9hbmltYXRvci5kdXJhdGlvblxuICAgICAgfTtcbiAgICAgIHRoaXMuX2FuaW1hdG9yLnVwZGF0ZU9wdGlvbnModGhpcy5hbmltYXRpb25PcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHBhZ2VcbiAgICogQHR5cGUgeyp9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1QYWdlIGxvY2F0aW9uIHRvIGxvYWQgaW4gdGhlIHNwbGl0dGVyIHNpZGUuWy9lbl1cbiAgICogICBbamFd44GT44Gu6KaB57Sg5YaF44Gr6KGo56S644GZ44KL44Oa44O844K444KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBwYWdlKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gcGFnZVxuICAgKi9cbiAgc2V0IHBhZ2UocGFnZSkge1xuICAgIHRoaXMuX3BhZ2UgPSBwYWdlO1xuICB9XG5cbiAgZ2V0IF9jb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlTG9hZGVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IHBhZ2VMb2FkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VMb2FkZXI7XG4gIH1cblxuICBzZXQgcGFnZUxvYWRlcihsb2FkZXIpIHtcbiAgICBpZiAoIShsb2FkZXIgaW5zdGFuY2VvZiBQYWdlTG9hZGVyKSkge1xuICAgICAgdXRpbC50aHJvd1BhZ2VMb2FkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IGxvYWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbW9kZVxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgbW9kZS4gUG9zc2libGUgdmFsdWVzIGFyZSBcInNwbGl0XCIsIFwiY29sbGFwc2VcIiwgXCJjbG9zZWRcIiwgXCJvcGVuXCIgb3IgXCJjaGFuZ2luZ1wiLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25Td2lwZVxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIHNwbGl0dGVyLiBJdCBnZXRzIGEgZGVjaW1hbCByYXRpbyAoMC0xKSBhbmQgYW4gYW5pbWF0aW9uT3B0aW9ucyBvYmplY3QgYXMgYXJndW1lbnRzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgb25Td2lwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb25Td2lwZTtcbiAgfVxuXG4gIHNldCBvblN3aXBlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmICEodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wib25Td2lwZVwiIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLl9vblN3aXBlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgYW5pbWF0aW9uT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykgP1xuICAgICAgQW5pbWF0b3JGYWN0b3J5LnBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgOiB7fTtcbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaXNPcGVuXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1lbnUgaXMgb3BlbmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgaXNPcGVuKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlID09PSBDT0xMQVBTRV9NT0RFICYmIHRoaXMuX3N0YXRlICE9PSBDTE9TRURfU1RBVEU7XG4gIH1cblxuICBzZXQgaXNPcGVuKHZhbHVlKSB7XG4gICAgdGhpcy50b2dnbGUoe30sIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIG9wZW5cbiAgICogQHNpZ25hdHVyZSBvcGVuKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBtZW51IGhhcyBiZWVuIG9wZW5lZC5bL2VuXVxuICAgKiAgIFtqYV3jg6Hjg4vjg6Xjg7zjgYzplovjgYTjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dT3BlbiBtZW51IGluIGNvbGxhcHNlIG1vZGUuWy9lbl1cbiAgICogICBbamFdY29sbGFwc2Xjg6Ljg7zjg4njgavjgarjgaPjgabjgYTjgotvbnMtc3BsaXR0ZXItc2lkZeimgee0oOOCkumWi+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBzcGxpdHRlciBzaWRlIGVsZW1lbnQgb3IgZmFsc2UgaWYgbm90IGluIGNvbGxhcHNlIG1vZGVbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgb3BlbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlKG9wdGlvbnMsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY2xvc2VcbiAgICogQHNpZ25hdHVyZSBjbG9zZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbWVudSBoYXMgYmVlbiBjbG9zZWQuWy9lbl1cbiAgICogICBbamFd44Oh44OL44Ol44O844GM6ZaJ44GY44Gf5b6M44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNsb3NlIG1lbnUgaW4gY29sbGFwc2UgbW9kZS5bL2VuXVxuICAgKiAgIFtqYV1jb2xsYXBzZeODouODvOODieOBq+OBquOBo+OBpuOBhOOCi29ucy1zcGxpdHRlci1zaWRl6KaB57Sg44KS6ZaJ44GY44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIHNwbGl0dGVyIHNpZGUgZWxlbWVudCBvciBmYWxzZSBpZiBub3QgaW4gY29sbGFwc2UgbW9kZVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBjbG9zZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlKG9wdGlvbnMsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZVxuICAgKiBAc2lnbmF0dXJlIHRvZ2dsZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU9wZW5zIGlmIGl0J3MgY2xvc2VkLiBDbG9zZXMgaWYgaXQncyBvcGVuLlsvZW5dXG4gICAqICAgW2phXemWi+OBkeOBpuOBhOOCi+WgtOWQiOOBr+imgee0oOOCkumWieOBmOOBvuOBmeOBneOBl+OBpumWi+OBkeOBpuOBhOOCi+WgtOWQiOOBr+imgee0oOOCkumWi+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBzcGxpdHRlciBzaWRlIGVsZW1lbnQgb3IgZmFsc2UgaWYgbm90IGluIGNvbGxhcHNlIG1vZGVbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgdG9nZ2xlKG9wdGlvbnMgPSB7fSwgZm9yY2UpIHtcbiAgICBjb25zdCBzaG91bGRPcGVuID0gdHlwZW9mIGZvcmNlID09PSAnYm9vbGVhbicgPyBmb3JjZSA6ICF0aGlzLmlzT3BlbjtcbiAgICBjb25zdCBhY3Rpb24gPSBzaG91bGRPcGVuID8gJ29wZW4nIDogJ2Nsb3NlJztcbiAgICBjb25zdCBGSU5BTF9TVEFURSA9IHNob3VsZE9wZW4gPyBPUEVOX1NUQVRFIDogQ0xPU0VEX1NUQVRFO1xuXG4gICAgaWYgKHRoaXMuX21vZGUgPT09IFNQTElUX01PREUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IEZJTkFMX1NUQVRFKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbG9jay5pc0xvY2tlZCgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0Fub3RoZXIgc3BsaXR0ZXItc2lkZSBhY3Rpb24gaXMgYWxyZWFkeSBydW5uaW5nLicpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkT3BlbiAmJiB0aGlzLl9pc090aGVyU2lkZU9wZW4oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdBbm90aGVyIG1lbnUgaXMgYWxyZWFkeSBvcGVuLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZW1pdEV2ZW50KGBwcmUke2FjdGlvbn1gKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBDYW5jZWxlZCBpbiBwcmUke2FjdGlvbn0gZXZlbnQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5sb2NrID0gdGhpcy5fbG9jay5sb2NrKCk7XG4gICAgdGhpcy5fc3RhdGUgPSBDSEFOR0lOR19TVEFURTtcblxuICAgIGlmIChvcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKG9wdGlvbnMuYW5pbWF0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLl9hbmltYXRvclthY3Rpb25dKCgpID0+IHtcbiAgICAgICAgdXRpbC5pb3NQYWdlU2Nyb2xsRml4KHNob3VsZE9wZW4pO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEZJTkFMX1NUQVRFO1xuICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgdGhpcy5fZW1pdEV2ZW50KGBwb3N0JHthY3Rpb259YCk7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvcHRpb25zLmNhbGxiYWNrKHRoaXMpO1xuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBsb2FkXG4gICAqIEBzaWduYXR1cmUgbG9hZChwYWdlLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqICAgW2VuXVBhZ2UgVVJMLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZG9jdW1lbnQgb3IgYSBgPHRlbXBsYXRlPmAuWy9lbl1cbiAgICogICBbamFdcGFnZeOBrlVSTOOBi+OAgWA8dGVtcGxhdGU+YOOBp+Wuo+iogOOBl+OBn+ODhuODs+ODl+ODrOODvOODiOOBrmlk5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHBhZ2VVcmwgaW4gdGhlIHJpZ2h0IHNlY3Rpb25bL2VuXVxuICAgKiAgIFtqYV3mjIflrprjgZfjgZ9VUkzjgpLjg6HjgqTjg7Pjg5rjg7zjgrjjgpLoqq3jgb/ovrzjgb/jgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgbmV3IHBhZ2UgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBsb2FkKHBhZ2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX3BhZ2UgPSBwYWdlO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCAoKCkgPT4ge30pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgbGV0IG9sZENvbnRlbnQgPSB0aGlzLl9jb250ZW50IHx8IG51bGw7XG5cbiAgICAgIHRoaXMuX3BhZ2VMb2FkZXIubG9hZCh7cGFnZSwgcGFyZW50OiB0aGlzfSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAob2xkQ29udGVudCkge1xuICAgICAgICAgIHRoaXMuX3BhZ2VMb2FkZXIudW5sb2FkKG9sZENvbnRlbnQpO1xuICAgICAgICAgIG9sZENvbnRlbnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3Nob3coKSk7XG5cbiAgICAgICAgY2FsbGJhY2socGFnZUVsZW1lbnQpO1xuICAgICAgICByZXNvbHZlKHBhZ2VFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3Nob3coKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2NvbnRlbnQuX3Nob3coKTtcbiAgICB9XG4gIH1cblxuICBfaGlkZSgpIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fY29udGVudC5faGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLl9jb250ZW50KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ3ByZW9wZW4nLCAncG9zdG9wZW4nLCAncHJlY2xvc2UnLCAncG9zdGNsb3NlJywgJ21vZGVjaGFuZ2UnLCAnc3dpcGUnXTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcmV3cml0YWJsZXMoKSB7XG4gICAgcmV0dXJuIHJld3JpdGFibGVzO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoU3BsaXR0ZXJTaWRlRWxlbWVudCwgWydzd2lwZWFibGUnXSk7XG5cbm9uc0VsZW1lbnRzLlNwbGl0dGVyU2lkZSA9IFNwbGl0dGVyU2lkZUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zcGxpdHRlci1zaWRlJywgU3BsaXR0ZXJTaWRlRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlQ2hlY2tib3hFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWNoZWNrYm94LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IEdlc3R1cmVEZXRlY3RvciBmcm9tICcuLi9vbnMvZ2VzdHVyZS1kZXRlY3Rvci5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdzd2l0Y2gtLSonLFxuICAnLnN3aXRjaF9faW5wdXQnOiAnc3dpdGNoLS0qX19pbnB1dCcsXG4gICcuc3dpdGNoX19oYW5kbGUnOiAnc3dpdGNoLS0qX19oYW5kbGUnLFxuICAnLnN3aXRjaF9fdG9nZ2xlJzogJ3N3aXRjaC0tKl9fdG9nZ2xlJ1xufTtcblxuY29uc3QgbG9jYXRpb25zID0ge1xuICBpb3M6IFsxLCAyMV0sXG4gIG1hdGVyaWFsOiBbMCwgMTZdXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zd2l0Y2hcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFN3aXRjaCBjb21wb25lbnQuIFRoZSBzd2l0Y2ggY2FuIGJlIHRvZ2dsZWQgYm90aCBieSBkcmFnZ2luZyBhbmQgdGFwcGluZy5cbiAqXG4gKiAgICAgV2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXlzIGEgTWF0ZXJpYWwgRGVzaWduIHN3aXRjaCBvbiBBbmRyb2lkIGRldmljZXMuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jgrnjgqTjg4Pjg4HjgpLooajnpLrjgZnjgovjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc3dpdGNoWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBMcFhaUVFcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zd2l0Y2hcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3dpdGNoIGNoZWNrZWQ+PC9vbnMtc3dpdGNoPlxuICogPG9ucy1zd2l0Y2ggZGlzYWJsZWQ+PC9vbnMtc3dpdGNoPlxuICogPG9ucy1zd2l0Y2ggbW9kaWZpZXI9XCJtYXRlcmlhbFwiPjwvb25zLXN3aXRjaD5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2hFbGVtZW50IGV4dGVuZHMgQmFzZUNoZWNrYm94RWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnbW9kaWZpZXInLCBudWxsLCB0aGlzLmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25SZWxlYXNlID0gdGhpcy5fb25SZWxlYXNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbGFzdFRpbWVTdGFtcCA9IDA7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnc3dpdGNoJztcbiAgfVxuXG4gIGdldCBfdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxpbnB1dCB0eXBlPVwiJHt0aGlzLnR5cGV9XCIgY2xhc3M9XCIke3RoaXMuX2RlZmF1bHRDbGFzc05hbWV9X19pbnB1dFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENsYXNzTmFtZX1fX3RvZ2dsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9faGFuZGxlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENsYXNzTmFtZX1fX3RvdWNoXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnY2hlY2tib3gnO1xuICB9XG5cbiAgLyogT3duIHByb3BzICovXG5cbiAgX2dldFBvc2l0aW9uKGUpIHtcbiAgICBjb25zdCBsID0gdGhpcy5fbG9jYXRpb25zO1xuICAgIHJldHVybiBNYXRoLm1pbihsWzFdLCBNYXRoLm1heChsWzBdLCB0aGlzLl9zdGFydFggKyBlLmdlc3R1cmUuZGVsdGFYKSk7XG4gIH1cblxuICBfZW1pdENoYW5nZUV2ZW50KCkge1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnY2hhbmdlJywge1xuICAgICAgdmFsdWU6IHRoaXMuY2hlY2tlZCxcbiAgICAgIHN3aXRjaDogdGhpcyxcbiAgICAgIGlzSW50ZXJhY3RpdmU6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIF9vbkNoYW5nZShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpO1xuICB9XG5cbiAgX29uQ2xpY2soZXYpIHtcbiAgICBpZiAoZXYudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhgJHt0aGlzLmRlZmF1bHRFbGVtZW50Q2xhc3N9X190b3VjaGApXG4gICAgICB8fCAoZXYudGltZVN0YW1wIC0gdGhpcy5fbGFzdFRpbWVTdGFtcCA8IDUwKSAvLyBQcmV2ZW50IHNlY29uZCBjbGljayB0cmlnZ2VyZWQgYnkgPGxhYmVsPlxuICAgICkge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5fbGFzdFRpbWVTdGFtcCA9IGV2LnRpbWVTdGFtcDtcbiAgfVxuXG4gIF9vbkhvbGQoZSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgTW9kaWZpZXJVdGlsLmFkZE1vZGlmaWVyKHRoaXMsICdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlbGVhc2UnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRyYWdTdGFydChlKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihlLmdlc3R1cmUuZGlyZWN0aW9uKSA9PT0gLTEpIHtcbiAgICAgIE1vZGlmaWVyVXRpbC5yZW1vdmVNb2RpZmllcih0aGlzLCAnYWN0aXZlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5jb25zdW1lZCA9IHRydWU7XG5cbiAgICBNb2RpZmllclV0aWwuYWRkTW9kaWZpZXIodGhpcywgJ2FjdGl2ZScpO1xuICAgIHRoaXMuX3N0YXJ0WCA9IHRoaXMuX2xvY2F0aW9uc1t0aGlzLmNoZWNrZWQgPyAxIDogMF07Ly8gLSBlLmdlc3R1cmUuZGVsdGFYO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWxlYXNlJywgdGhpcy5fb25SZWxlYXNlKTtcbiAgfVxuXG4gIF9vbkRyYWcoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5faGFuZGxlLnN0eWxlLmxlZnQgPSB0aGlzLl9nZXRQb3NpdGlvbihlKSArICdweCc7XG4gIH1cblxuICBfb25SZWxlYXNlKGUpIHtcbiAgICBjb25zdCBsID0gdGhpcy5fbG9jYXRpb25zO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fZ2V0UG9zaXRpb24oZSk7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuY2hlY2tlZDtcblxuICAgIHRoaXMuY2hlY2tlZCA9IHBvc2l0aW9uID49IChsWzBdICsgbFsxXSkgLyAyO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWxlYXNlJywgdGhpcy5fb25SZWxlYXNlKTtcblxuICAgIHRoaXMuX2hhbmRsZS5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgTW9kaWZpZXJVdGlsLnJlbW92ZU1vZGlmaWVyKHRoaXMsICdhY3RpdmUnKTtcbiAgfVxuXG4gIGNsaWNrKGV2ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICAgIHRoaXMuX2xhc3RUaW1lU3RhbXAgPSBldi50aW1lU3RhbXAgfHwgMDtcbiAgICB9XG4gIH1cblxuICBnZXQgX2hhbmRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9faGFuZGxlYCk7XG4gIH1cblxuICBnZXQgY2hlY2tib3goKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0O1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX29uQ2hhbmdlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignaG9sZCcsIHRoaXMuX29uSG9sZCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd0YXAnLCB0aGlzLmNsaWNrKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG4gICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbmV3IEdlc3R1cmVEZXRlY3Rvcih0aGlzLCB7IGRyYWdNaW5EaXN0YW5jZTogMSwgaG9sZFRpbWVvdXQ6IDI1MSwgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9pbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9vbkNoYW5nZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2hvbGQnLCB0aGlzLl9vbkhvbGQpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGFwJywgdGhpcy5jbGljayk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgIGlmICh0aGlzLl9nZXN0dXJlRGV0ZWN0b3IpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsICdtb2RpZmllciddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgY29uc3QgbWQgPSAoY3VycmVudCB8fCAnJykuaW5kZXhPZignbWF0ZXJpYWwnKSAhPT0gLTE7XG4gICAgICB0aGlzLl9sb2NhdGlvbnMgPSBsb2NhdGlvbnNbbWQgPyAnbWF0ZXJpYWwnIDogJ2lvcyddO1xuICAgIH1cblxuICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZXZlbnQgY2hhbmdlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCB3aGVuIHRoZSBzd2l0Y2ggaXMgdG9nZ2xlZC5bL2VuXVxuICAgKiAgIFtqYV1PTi9PRkbjgYzlpInjgo/jgaPjgZ/mmYLjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zd2l0Y2hcbiAgICogICBbZW5dU3dpdGNoIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9Td2l0Y2jjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnZhbHVlXG4gICAqICAgW2VuXUN1cnJlbnQgdmFsdWUuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu5YCk44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5pc0ludGVyYWN0aXZlXG4gICAqICAgW2VuXVRydWUgaWYgdGhlIGNoYW5nZSB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIGNsaWNraW5nIG9uIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogICBbamFd44K/44OD44OX44KE44Kv44Oq44OD44Kv44Gq44Gp44Gu44Om44O844K244Gu5pON5L2c44Gr44KI44Gj44Gm5aSJ44KP44Gj44Gf5aC05ZCI44Gr44GvdHJ1ZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogIFtqYV3jgrnjgqTjg4Pjg4Hjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgc3dpdGNoIGlzIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeOCueOCpOODg+ODgeOCkueEoeWKueOBrueKtuaFi+OBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNoZWNrZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIHN3aXRjaCBpcyBjaGVja2VkLlsvZW5dXG4gICAqICAgW2phXeOCueOCpOODg+ODgeOBjE9O44Gu54q25oWL44Gr44GZ44KL44Go44GN44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5wdXQtaWRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGBpZGAgYXR0cmlidXRlIG9mIHRoZSBpbm5lciBgPGlucHV0PmAgZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB1c2luZyBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZWxlbWVudHMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjaGVja2VkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhpcyB2YWx1ZSBpcyBgdHJ1ZWAgaWYgdGhlIHN3aXRjaCBpcyBjaGVja2VkLlsvZW5dXG4gICAqICAgW2phXeOCueOCpOODg+ODgeOBjE9O44Gu5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNoZWNrYm94XG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgdW5kZXJseWluZyBjaGVja2JveCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOWGhemDqOOBrmNoZWNrYm946KaB57Sg44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZm9jdXNcbiAgICogQHNpZ25hdHVyZSBmb2N1cygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Gb2N1c2VzIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG59XG5cbm9uc0VsZW1lbnRzLlN3aXRjaCA9IFN3aXRjaEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zd2l0Y2gnLCBTd2l0Y2hFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IFN3aXBlciBmcm9tICcuLi9vbnMvaW50ZXJuYWwvc3dpcGVyLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy50YWJiYXJfX2NvbnRlbnQnOiAndGFiYmFyLS0qX19jb250ZW50JyxcbiAgJy50YWJiYXJfX2JvcmRlcic6ICd0YWJiYXItLSpfX2JvcmRlcicsXG4gICcudGFiYmFyJzogJ3RhYmJhci0tKidcbn07XG5cbmNvbnN0IHJld3JpdGFibGVzID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YWJiYXJFbGVtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICByZWFkeSh0YWJiYXJFbGVtZW50LCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn07XG5cbmNvbnN0IG51bGxQYWdlID0gaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG5jb25zdCBsZXJwID0gKHgwLCB4MSwgdCkgPT4gKDEgLSB0KSAqIHgwICsgdCAqIHgxO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy10YWJiYXJcbiAqIEBjYXRlZ29yeSB0YWJiYXJcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQSBjb21wb25lbnQgdG8gZGlzcGxheSBhIHRhYiBiYXIgb24gdGhlIGJvdHRvbSBvZiBhIHBhZ2UuIFVzZWQgd2l0aCBgPG9ucy10YWI+YCB0byBtYW5hZ2UgcGFnZXMgdXNpbmcgdGFicy5bL2VuXVxuICogICBbamFd44K/44OW44OQ44O844KS44Oa44O844K45LiL6YOo44Gr6KGo56S644GZ44KL44Gf44KB44Gu44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CCb25zLXRhYuOBqOe1hOOBv+WQiOOCj+OBm+OBpuS9v+OBhuOBk+OBqOOBp+OAgeODmuODvOOCuOOCkueuoeeQhuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBwR3VETFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3RhYmJhclxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1BIHRhYmJhciBpbiBNYXRlcmlhbCBEZXNpZ24uWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgYXV0b2dyb3dcbiAqICAgW2VuXVRhYnMgYXV0b21hdGljYWxseSBncm93IGRlcGVuZGluZyBvbiB0aGVpciBjb250ZW50IGluc3RlYWQgb2YgaGF2aW5nIGEgZml4ZWQgd2lkdGguWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgdG9wLWJvcmRlclxuICogICBbZW5dU2hvd3MgYSBzdGF0aWMgYm9yZGVyLWJvdHRvbSBpbiB0YWJzIGZvciBpT1MgdG9wIHRhYmJhcnMuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgZnVuZGFtZW50YWxzLmh0bWwjbWFuYWdpbmctcGFnZXNcbiAqICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXMuWy9lbl1cbiAqICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10YWJcbiAqICAgW2VuXVRoZSBgPG9ucy10YWI+YCBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXW9ucy10YWLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXBhZ2VcbiAqICAgW2VuXVRoZSBgPG9ucy1wYWdlPmAgY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV1vbnMtcGFnZeOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy10YWJiYXI+XG4gKiAgIDxvbnMtdGFiXG4gKiAgICAgcGFnZT1cImhvbWUuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJIb21lXCJcbiAqICAgICBhY3RpdmU+XG4gKiAgIDwvb25zLXRhYj5cbiAqICAgPG9ucy10YWJcbiAqICAgICBwYWdlPVwic2V0dGluZ3MuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJTZXR0aW5nc1wiXG4gKiAgICAgYWN0aXZlPlxuICogICA8L29ucy10YWI+XG4gKiA8L29ucy10YWJiYXI+XG4gKlxuICogPHRlbXBsYXRlIGlkPVwiaG9tZS5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cbiAqXG4gKiA8dGVtcGxhdGUgaWQ9XCJzZXR0aW5ncy5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFiYmFyRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZWNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMganVzdCBiZWZvcmUgdGhlIHRhYiBpcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+ODhuOCo+ODluOBquOCv+ODluOBjOWkieOCj+OCi+WJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KLb25zLXRhYuOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50YWJJdGVtXG4gICAqICAgW2VuXVRhYiBpdGVtIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV10YWJJdGVt44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUNhbGwgdGhpcyBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGNoYW5nZSBldmVudC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlkbzjgbPlh7rjgZnjgajjgIHjgqLjgq/jg4bjgqPjg5bjgarjgr/jg5bjga7lpInmm7TjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RjaGFuZ2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVzIGp1c3QgYWZ0ZXIgdGhlIHRhYiBpcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+ODhuOCo+ODluOBquOCv+ODluOBjOWkieOCj+OBo+OBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KLb25zLXRhYuOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50YWJJdGVtXG4gICAqICAgW2VuXVRhYiBpdGVtIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV10YWJJdGVt44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCByZWFjdGl2ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMgaWYgdGhlIGFscmVhZHkgb3BlbiB0YWIgaXMgdGFwcGVkIGFnYWluLlsvZW5dXG4gICAqICAgW2phXeOBmeOBp+OBq+OCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+OCv+ODluOBjOOCguOBhuS4gOW6puOCv+ODg+ODl+OChOOCr+ODquODg+OCr+OBleOCjOOBn+WgtOWQiOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KLb25zLXRhYuOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50YWJJdGVtXG4gICAqICAgW2VuXVRhYiBpdGVtIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV10YWJJdGVt44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMgd2hlbiB0aGUgdGFiYmFyIHN3aXBlcy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5pbmRleFxuICAgKiAgIFtlbl1DdXJyZW50IGluZGV4LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi29ucy10YWLjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3B0aW9uc1xuICAgKiAgIFtlbl1BbmltYXRpb24gb3B0aW9ucyBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBgXCJub25lXCJgIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBvc2l0aW9uXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBib3R0b21cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRhYmJhcidzIHBvc2l0aW9uLiBBdmFpbGFibGUgdmFsdWVzIGFyZSBgXCJib3R0b21cImAgYW5kIGBcInRvcFwiYC4gVXNlIGBcImF1dG9cImAgdG8gY2hvb3NlIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwbGF0Zm9ybSAoYm90dG9tIGZvciBpT1MgZmxhdCBkZXNpZ24sIHRvcCBmb3IgTWF0ZXJpYWwgRGVzaWduKS5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjg5Djg7zjga7kvY3nva7jgpLmjIflrprjgZfjgb7jgZnjgIJcImJvdHRvbVwi44KC44GX44GP44GvXCJ0b3BcIuOCkumBuOaKnuOBp+OBjeOBvuOBmeOAguODh+ODleOCqeODq+ODiOOBr1wiYm90dG9tXCLjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzd2lwZWFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgdGFiIGJhciBjYW4gYmUgc2Nyb2xsZWQgYnkgZHJhZyBvciBzd2lwZS5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjgr/jg5bjg5Djg7zjgpLjgrnjg6/jgqTjg5fjgoTjg4njg6njg4PjgrDjgafnp7vli5XjgafjgY3jgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpZ25vcmUtZWRnZS13aWR0aFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVmYXVsdCAyMFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gYm90aCBlZGdlcy4gU3dpcGluZyBvbiB0aGVzZSBhcmVhcyB3aWxsIHByaW9yaXRpemUgcGFyZW50IGNvbXBvbmVudHMgc3VjaCBhcyBgb25zLXNwbGl0dGVyYCBvciBgb25zLW5hdmlnYXRvcmAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYWN0aXZlLWluZGV4XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBpbmRleCBvZiB0aGUgdGFiIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFjdGl2ZUluZGV4XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBpbmRleCBvZiB0aGUgdGFiIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBoaWRlLXRhYnNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdG8gaGlkZSB0aGUgdGFicy5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjgpLpnZ7ooajnpLrjgavjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGhpZGVUYWJzXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRvIGhpZGUgdGhlIHRhYnMuWy9lbl1cbiAgICogICBbamFd44K/44OW44KS6Z2e6KGo56S644Gr44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGFiLWJvcmRlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSB0YWJzIHNob3cgYSBkeW5hbWljIGJvdHRvbSBib3JkZXIuIE9ubHkgd29ya3MgZm9yIGlPUyBmbGF0IGRlc2lnbiBzaW5jZSB0aGUgYm9yZGVyIGlzIGFsd2F5cyB2aXNpYmxlIGluIE1hdGVyaWFsIERlc2lnbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHRhYkJvcmRlclxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRoZSB0YWJzIHNob3cgYSBkeW5hbWljIGJvdHRvbSBib3JkZXIuIE9ubHkgd29ya3MgZm9yIGlPUyBmbGF0IGRlc2lnbiBzaW5jZSB0aGUgYm9yZGVyIGlzIGFsd2F5cyB2aXNpYmxlIGluIE1hdGVyaWFsIERlc2lnbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHRhYmJhci5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjg5Djg7zjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2xvYWRJbmFjdGl2ZSA9IHV0aWwuZGVmZXIoKTsgLy8gSW1wcm92ZXMgIzIzMjRcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcblxuICAgIGNvbnN0IHtvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWR9ID0gdXRpbC5kZWZpbmVMaXN0ZW5lclByb3BlcnR5KHRoaXMsICdzd2lwZScpO1xuICAgIHRoaXMuX2Nvbm5lY3RPblN3aXBlID0gb25Db25uZWN0ZWQ7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uU3dpcGUgPSBvbkRpc2Nvbm5lY3RlZDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdGhpcy5fc3dpcGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZXIgPSBuZXcgU3dpcGVyKHtcbiAgICAgICAgZ2V0RWxlbWVudDogKCkgPT4gdGhpcy5fY29udGVudEVsZW1lbnQsXG4gICAgICAgIGdldEluaXRpYWxJbmRleDogKCkgPT4gdGhpcy5hY3RpdmVJbmRleCB8fCB0aGlzLmdldEF0dHJpYnV0ZSgnYWN0aXZlSW5kZXgnKSxcbiAgICAgICAgZ2V0QXV0b1Njcm9sbFJhdGlvOiB0aGlzLl9nZXRBdXRvU2Nyb2xsUmF0aW8uYmluZCh0aGlzKSxcbiAgICAgICAgZ2V0QnViYmxlV2lkdGg6ICgpID0+IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdpZ25vcmUtZWRnZS13aWR0aCcpIHx8IDI1LCAxMCksXG4gICAgICAgIGlzQXV0b1Njcm9sbGFibGU6ICgpID0+IHRydWUsXG4gICAgICAgIHByZUNoYW5nZUhvb2s6IHRoaXMuX29uUHJlQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICAgIHBvc3RDaGFuZ2VIb29rOiB0aGlzLl9vblBvc3RDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgcmVmcmVzaEhvb2s6IHRoaXMuX29uUmVmcmVzaC5iaW5kKHRoaXMpLFxuICAgICAgICBzY3JvbGxIb29rOiB0aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpXG4gICAgICB9KTtcblxuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyID0gdXRpbC5maW5kQ2hpbGQodGhpcy5fdGFiYmFyRWxlbWVudCwgJy50YWJiYXJfX2JvcmRlcicpO1xuICAgICAgICB0aGlzLl9zd2lwZXIuaW5pdCh7IHN3aXBlYWJsZTogdGhpcy5oYXNBdHRyaWJ1dGUoJ3N3aXBlYWJsZScpIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KCk7XG5cbiAgICAgIGlmICghdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtcGFnZScsIHAgPT4gcCA9PT0gZG9jdW1lbnQuYm9keSkpIHtcbiAgICAgICAgdGhpcy5fc2hvdygpOyAvLyBUaGlzIHRhYmJhciBpcyB0aGUgdG9wIGNvbXBvbmVudFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdE9uU3dpcGUoKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLl9zd2lwZXIgJiYgdGhpcy5fc3dpcGVyLmluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9zd2lwZXIuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fc3dpcGVyID0gbnVsbDtcbiAgICAgIHRoaXMuX3RhYmJhckJvcmRlciA9IG51bGw7XG4gICAgICB0aGlzLl90YWJzUmVjdCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzY29ubmVjdE9uU3dpcGUoKTtcbiAgfVxuXG4gIF9ub3JtYWxpemVFdmVudChldmVudCkge1xuICAgIHJldHVybiB7IC4uLmV2ZW50LCBpbmRleDogZXZlbnQuYWN0aXZlSW5kZXgsIHRhYkl0ZW06IHRoaXMudGFic1tldmVudC5hY3RpdmVJbmRleF0gfTtcbiAgfVxuXG4gIF9vblBvc3RDaGFuZ2UoZXZlbnQpIHtcbiAgICBldmVudCA9IHRoaXMuX25vcm1hbGl6ZUV2ZW50KGV2ZW50KTtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3Bvc3RjaGFuZ2UnLCBldmVudCk7XG4gICAgY29uc3QgcGFnZSA9IGV2ZW50LnRhYkl0ZW0ucGFnZUVsZW1lbnQ7XG4gICAgcGFnZSAmJiBwYWdlLl9zaG93KCk7XG4gIH1cblxuICBfb25QcmVDaGFuZ2UoZXZlbnQpIHtcbiAgICBldmVudCA9IHRoaXMuX25vcm1hbGl6ZUV2ZW50KGV2ZW50KTtcbiAgICBldmVudC5jYW5jZWwgPSAoKSA9PiBldmVudC5jYW5jZWxlZCA9IHRydWU7XG5cbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3ByZWNoYW5nZScsIGV2ZW50KTtcblxuICAgIGlmICghZXZlbnQuY2FuY2VsZWQpIHtcbiAgICAgIGNvbnN0IHsgYWN0aXZlSW5kZXgsIGxhc3RBY3RpdmVJbmRleCB9ID0gZXZlbnQ7XG4gICAgICBjb25zdCB0YWJzID0gdGhpcy50YWJzO1xuXG4gICAgICB0YWJzW2FjdGl2ZUluZGV4XS5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgICBpZiAobGFzdEFjdGl2ZUluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgcHJldlRhYiA9IHRhYnNbbGFzdEFjdGl2ZUluZGV4XTtcbiAgICAgICAgcHJldlRhYi5zZXRBY3RpdmUoZmFsc2UpO1xuICAgICAgICBwcmV2VGFiLnBhZ2VFbGVtZW50ICYmIHByZXZUYWIucGFnZUVsZW1lbnQuX2hpZGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQuY2FuY2VsZWQ7XG4gIH1cblxuICBfb25TY3JvbGwoaW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0aGlzLl90YWJiYXJCb3JkZXIpIHtcbiAgICAgIHRoaXMuX3RhYmJhckJvcmRlci5zdHlsZS50cmFuc2l0aW9uID0gYGFsbCAke29wdGlvbnMuZHVyYXRpb24gfHwgMH1zICR7b3B0aW9ucy50aW1pbmcgfHwgJyd9YDtcblxuICAgICAgaWYgKHRoaXMuX2F1dG9ncm93ICYmIHRoaXMuX3RhYnNSZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYSA9IE1hdGguZmxvb3IoaW5kZXgpLCBiID0gTWF0aC5jZWlsKGluZGV4KSwgciA9IGluZGV4ICUgMTtcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLndpZHRoID0gbGVycCh0aGlzLl90YWJzUmVjdFthXS53aWR0aCwgdGhpcy5fdGFic1JlY3RbYl0ud2lkdGgsIHIpICsgJ3B4JztcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke2xlcnAodGhpcy5fdGFic1JlY3RbYV0ubGVmdCwgdGhpcy5fdGFic1JlY3RbYl0ubGVmdCwgcil9cHgsIDAsIDApYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3RhYmJhckJvcmRlci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHtpbmRleCAqIDEwMH0lLCAwLCAwKWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgaW5kZXgsIG9wdGlvbnMgfSk7XG4gIH1cblxuICBfb25SZWZyZXNoKCkge1xuICAgIHRoaXMuX2F1dG9ncm93ID0gdXRpbC5oYXNNb2RpZmllcih0aGlzLCAnYXV0b2dyb3cnKTtcbiAgICB0aGlzLl90YWJzUmVjdCA9IHRoaXMudGFicy5tYXAodGFiID0+IHRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgaWYgKHRoaXMuX3RhYmJhckJvcmRlcikge1xuICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmhhc0F0dHJpYnV0ZSgndGFiLWJvcmRlcicpIHx8IHV0aWwuaGFzTW9kaWZpZXIodGhpcywgJ21hdGVyaWFsJykgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4KCk7XG4gICAgICBpZiAodGhpcy5fdGFic1JlY3QubGVuZ3RoID4gMCAmJiBpbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuX3RhYmJhckJvcmRlci5zdHlsZS53aWR0aCA9IHRoaXMuX3RhYnNSZWN0W2luZGV4XS53aWR0aCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2dldEF1dG9TY3JvbGxSYXRpbyhtYXRjaGVzLCB2ZWxvY2l0eSwgc2l6ZSkge1xuICAgIGNvbnN0IHJhdGlvID0gLjY7IC8vIEJhc2UgcmF0aW9cbiAgICBjb25zdCBtb2RpZmllciA9IHNpemUgLyAzMDAgKiAobWF0Y2hlcyA/IC0xIDogMSk7IC8vIEJhc2VkIG9uIHNjcmVlbiBzaXplXG4gICAgcmV0dXJuIE1hdGgubWluKDEsIE1hdGgubWF4KDAsIHJhdGlvICsgdmVsb2NpdHkgKiBtb2RpZmllcikpO1xuICB9XG5cbiAgZ2V0IF90YWJiYXJFbGVtZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYmJhcicpO1xuICB9XG5cbiAgZ2V0IF9jb250ZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWJiYXJfX2NvbnRlbnQnKTtcbiAgfVxuXG4gIGdldCBfdGFyZ2V0RWxlbWVudCgpIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fY29udGVudEVsZW1lbnQ7XG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlblswXSB8fCBudWxsO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fY29udGVudEVsZW1lbnQgfHwgdXRpbC5jcmVhdGUoJy50YWJiYXJfX2NvbnRlbnQnKTtcbiAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ29ucy10YWJiYXJfX2NvbnRlbnQnKTtcbiAgICBjb25zdCB0YWJiYXIgPSB0aGlzLl90YWJiYXJFbGVtZW50IHx8IHV0aWwuY3JlYXRlKCcudGFiYmFyJyk7XG4gICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ29ucy10YWJiYXJfX2Zvb3RlcicpO1xuXG4gICAgaWYgKCF0YWJiYXIucGFyZW50Tm9kZSkge1xuICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkge1xuICAgICAgICB0YWJiYXIuYXBwZW5kQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFiYmFyLmNoaWxkcmVuLmxlbmd0aCA+IHRoaXMuYWN0aXZlSW5kZXggJiYgIXV0aWwuZmluZENoaWxkKHRhYmJhciwgJ1thY3RpdmVdJykpIHtcbiAgICAgIHRhYmJhci5jaGlsZHJlblt0aGlzLmFjdGl2ZUluZGV4XS5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJiYXJCb3JkZXIgPSB1dGlsLmZpbmRDaGlsZCh0YWJiYXIsICcudGFiYmFyX19ib3JkZXInKSB8fCB1dGlsLmNyZWF0ZSgnLnRhYmJhcl9fYm9yZGVyJyk7XG4gICAgdGFiYmFyLmFwcGVuZENoaWxkKHRoaXMuX3RhYmJhckJvcmRlcik7XG4gICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ29ucy1zd2lwZXItdGFiYmFyJyk7IC8vIEhpZGVzIG1hdGVyaWFsIGJvcmRlclxuXG4gICAgIWNvbnRlbnQuY2hpbGRyZW5bMF0gJiYgY29udGVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgIWNvbnRlbnQuY2hpbGRyZW5bMV0gJiYgY29udGVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgY29udGVudC5hcHBlbmRDaGlsZCA9IGNvbnRlbnQuYXBwZW5kQ2hpbGQuYmluZChjb250ZW50LmNoaWxkcmVuWzBdKTtcbiAgICBjb250ZW50Lmluc2VydEJlZm9yZSA9IGNvbnRlbnQuaW5zZXJ0QmVmb3JlLmJpbmQoY29udGVudC5jaGlsZHJlblswXSk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGFiYmFyKTsgLy8gVHJpZ2dlcnMgb25zLXRhYiBjb25uZWN0ZWRDYWxsYmFja1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgX3VwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykpIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLl90b3AgPSBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgKHBvc2l0aW9uID09PSAnYXV0bycgJiYgdXRpbC5oYXNNb2RpZmllcih0aGlzLCAnbWF0ZXJpYWwnKSk7XG4gICAgY29uc3QgYWN0aW9uID0gdG9wID8gdXRpbC5hZGRNb2RpZmllciA6IHV0aWwucmVtb3ZlTW9kaWZpZXI7XG5cbiAgICBhY3Rpb24odGhpcywgJ3RvcCcpO1xuXG4gICAgY29uc3QgcGFnZSA9IHV0aWwuZmluZFBhcmVudCh0aGlzLCAnb25zLXBhZ2UnKTtcbiAgICBpZiAocGFnZSkge1xuICAgICAgY29udGVudFJlYWR5KHBhZ2UsICgpID0+IHtcbiAgICAgICAgbGV0IHAgPSAwO1xuICAgICAgICBpZiAocGFnZS5jaGlsZHJlblswXSAmJiB1dGlsLm1hdGNoKHBhZ2UuY2hpbGRyZW5bMF0sICdvbnMtdG9vbGJhcicpKSB7XG4gICAgICAgICAgYWN0aW9uKHBhZ2UuY2hpbGRyZW5bMF0sICdub3NoYWRvdycpO1xuICAgICAgICAgIHAgPSAxOyAvLyBWaXN1YWwgZml4IGZvciBzb21lIGRldmljZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYWdlLl9nZXRDb250ZW50RWxlbWVudCgpO1xuICAgICAgICBjb25zdCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhZ2UuX2dldENvbnRlbnRFbGVtZW50KCksIG51bGwpO1xuXG4gICAgICAgIHRoaXMuc3R5bGUudG9wID0gdG9wID8gcGFyc2VJbnQoY3MuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSwgMTApIC0gcCArICdweCcgOiAnJztcblxuICAgICAgICAvLyBSZWZyZXNoIGNvbnRlbnQgdG9wIC0gRml4IGZvciBpT1MgOFxuICAgICAgICBjb250ZW50LnN0eWxlLnRvcCA9IGNzLnRvcDtcbiAgICAgICAgY29udGVudC5zdHlsZS50b3AgPSAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGludGVybmFsLmF1dG9TdGF0dXNCYXJGaWxsKCgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGxlZCA9IHV0aWwuZmluZFBhcmVudCh0aGlzLCBlID0+IGUuaGFzQXR0cmlidXRlKCdzdGF0dXMtYmFyLWZpbGwnKSk7XG4gICAgICB1dGlsLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLCAnc3RhdHVzLWJhci1maWxsJywgdG9wICYmICFmaWxsZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHRvcFBhZ2UoKSB7XG4gICAgY29uc3QgdGFicyA9IHRoaXMudGFicyxcbiAgICAgIGluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleCgpO1xuICAgIHJldHVybiB0YWJzW2luZGV4XVxuICAgICAgPyB0YWJzW2luZGV4XS5wYWdlRWxlbWVudCB8fCB0aGlzLnBhZ2VzWzBdIHx8IG51bGxcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIGdldCBwYWdlcygpIHtcbiAgICByZXR1cm4gdXRpbC5hcnJheUZyb20odGhpcy5fdGFyZ2V0RWxlbWVudC5jaGlsZHJlbik7XG4gIH1cblxuICBnZXQgdGFicygpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX3RhYmJhckVsZW1lbnQuY2hpbGRyZW4sIGUgPT4gZS50YWdOYW1lID09PSAnT05TLVRBQicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0QWN0aXZlVGFiXG4gICAqIEBzaWduYXR1cmUgc2V0QWN0aXZlVGFiKGluZGV4LCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIFtlbl1UYWIgaW5kZXguWy9lbl1cbiAgICogICBbamFd44K/44OW44Gu44Kk44Oz44OH44OD44Kv44K544KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1GdW5jdGlvbiB0aGF0IHJ1bnMgd2hlbiB0aGUgbmV3IHBhZ2UgaGFzIGxvYWRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1JZiB0aGlzIG9wdGlvbiBpcyBcIm5vbmVcIiwgdGhlIHRyYW5zaXRpb24gd29uJ3Qgc2xpZGUuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHNwZWNpZmllZCB0YWIgcGFnZS4gQW5pbWF0aW9ucyBhbmQgdGhlaXIgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLlsvZW5dXG4gICAqICAgW2phXeaMh+WumuOBl+OBn+OCpOODs+ODh+ODg+OCr+OCueOBruOCv+ODluOCkuihqOekuuOBl+OBvuOBmeOAguOCouODi+ODoeODvOOCt+ODp+ODs+OBquOBqeOBruOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXUEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGFnZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBzZXRBY3RpdmVUYWIobmV4dEluZGV4LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gdGhpcy5hY3RpdmVJbmRleDtcblxuICAgIHRoaXMuX2FjdGl2ZUluZGV4U2tpcEVmZmVjdCA9IHRydWU7XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IG5leHRJbmRleDtcblxuICAgIHJldHVybiB0aGlzLl91cGRhdGVBY3RpdmVJbmRleChuZXh0SW5kZXgsIHByZXZpb3VzSW5kZXgsIG9wdGlvbnMpO1xuICB9XG5cbiAgX3VwZGF0ZUFjdGl2ZUluZGV4KG5leHRJbmRleCwgcHJldkluZGV4LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBwcmV2VGFiID0gdGhpcy50YWJzW3ByZXZJbmRleF0sXG4gICAgICBuZXh0VGFiID0gdGhpcy50YWJzW25leHRJbmRleF07XG5cbiAgICBpZiAoIW5leHRUYWIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnU3BlY2lmaWVkIGluZGV4IGRvZXMgbm90IG1hdGNoIGFueSB0YWIuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5leHRJbmRleCA9PT0gcHJldkluZGV4KSB7XG4gICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3JlYWN0aXZlJywgeyBpbmRleDogbmV4dEluZGV4LCBhY3RpdmVJbmRleDogbmV4dEluZGV4LCB0YWJJdGVtOiBuZXh0VGFiIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0VGFiLnBhZ2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRTogbmV4dFRhYi5sb2FkZWQgaXMgYnJva2VuIGluIFpvbmUuanMgcHJvbWlzZXMgKEFuZ3VsYXIyKVxuICAgIGNvbnN0IG5leHRQYWdlID0gbmV4dFRhYi5wYWdlRWxlbWVudDtcbiAgICByZXR1cm4gKG5leHRQYWdlID8gUHJvbWlzZS5yZXNvbHZlKG5leHRQYWdlKSA6IG5leHRUYWIubG9hZGVkKVxuICAgICAgLnRoZW4obmV4dFBhZ2UgPT4gdGhpcy5fc3dpcGVyLnNldEFjdGl2ZUluZGV4KG5leHRJbmRleCwge1xuICAgICAgICByZWplY3Q6IHRydWUsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGFuaW1hdGlvbjogcHJldlRhYiAmJiBuZXh0UGFnZSA/IG9wdGlvbnMuYW5pbWF0aW9uIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSA6ICdub25lJyxcbiAgICAgICAgYW5pbWF0aW9uT3B0aW9uczogdXRpbC5leHRlbmQoXG4gICAgICAgICAgeyBkdXJhdGlvbjogLjMsIHRpbWluZzogJ2N1YmljLWJlemllciguNCwgLjcsIC41LCAxKScgfSxcbiAgICAgICAgICB0aGlzLmFuaW1hdGlvbk9wdGlvbnMsXG4gICAgICAgICAgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zIHx8IHt9XG4gICAgICAgIClcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb3B0aW9ucy5jYWxsYmFjayhuZXh0UGFnZSk7XG4gICAgICAgIHJldHVybiBuZXh0UGFnZTtcbiAgICAgIH0pKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0VGFiYmFyVmlzaWJpbGl0eVxuICAgKiBAc2lnbmF0dXJlIHNldFRhYmJhclZpc2liaWxpdHkodmlzaWJsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSB2aXNpYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Vc2VkIHRvIGhpZGUgb3Igc2hvdyB0aGUgdGFiIGJhci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2V0VGFiYmFyVmlzaWJpbGl0eSh2aXNpYmxlKSB7XG4gICAgdGhpcy5oaWRlVGFicyA9ICF2aXNpYmxlO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmhpZGVUYWJzID0gZmFsc2U7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuaGlkZVRhYnMgPSB0cnVlO1xuICB9XG5cbiAgX3VwZGF0ZVZpc2liaWxpdHkoKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGNvbnN0IHZpc2libGUgPSAhdGhpcy5oaWRlVGFicztcbiAgICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnN0eWxlW3RoaXMuX3RvcCA/ICd0b3AnIDogJ2JvdHRvbSddID0gdmlzaWJsZSA/ICcnIDogJzBweCc7XG4gICAgICB0aGlzLl90YWJiYXJFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgICB2aXNpYmxlICYmIHRoaXMuX29uUmVmcmVzaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIHRhYmJhciBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjg5Djg7zjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmJhckVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBzd2lwZWFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1FbmFibGUgc3dpcGUgaW50ZXJhY3Rpb24uWy9lbl1cbiAgICogICBbamFdc3dpcGVhYmxl44Gn44GC44KM44GwdHJ1ZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25Td2lwZVxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIHRhYmJhci4gSXQgZ2V0cyBhIGRlY2ltYWwgaW5kZXggYW5kIGFuIGFuaW1hdGlvbk9wdGlvbnMgb2JqZWN0IGFzIGFyZ3VtZW50cy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRBY3RpdmVUYWJJbmRleFxuICAgKiBAc2lnbmF0dXJlIGdldEFjdGl2ZVRhYkluZGV4KClcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKiAgIFtlbl1UaGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+OCv+ODluOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHRhYiBpbmRleCBvbiBjdXJyZW50IGFjdGl2ZSB0YWIuIElmIGFjdGl2ZSB0YWIgaXMgbm90IGZvdW5kLCByZXR1cm5zIC0xLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+OCv+ODluOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAguePvuWcqOOCouOCr+ODhuOCo+ODluOBquOCv+ODluOBjOOBquOBhOWgtOWQiOOBq+OBry0x44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldEFjdGl2ZVRhYkluZGV4KHRhYnMgPSB0aGlzLnRhYnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0YWJzW2ldICYmIHRhYnNbaV0udGFnTmFtZSA9PT0gJ09OUy1UQUInICYmIHRhYnNbaV0uaXNBY3RpdmUoKSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUluZGV4KCkge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcpKTtcbiAgfVxuXG4gIHNldCBhY3RpdmVJbmRleCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYWN0aXZlLWluZGV4JywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIHRoaXMuX3N3aXBlci5zaG93KCk7XG5cbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgY29uc3QgdGFicyA9IHRoaXMudGFicztcbiAgICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleCh0YWJzKTtcbiAgICAgIHRoaXMuX2xvYWRJbmFjdGl2ZS5yZXNvbHZlKCk7XG4gICAgICBpZiAodGFicy5sZW5ndGggPiAwICYmIGFjdGl2ZUluZGV4ID49IDApIHtcbiAgICAgICAgdGFic1thY3RpdmVJbmRleF0ubG9hZGVkLnRoZW4oZWwgPT4gZWwgJiYgc2V0SW1tZWRpYXRlKCgpID0+IGVsLl9zaG93KCkpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHRoaXMuX3N3aXBlci5oaWRlKCk7XG4gICAgY29uc3QgdG9wUGFnZSA9IHRoaXMudG9wUGFnZTtcbiAgICB0b3BQYWdlICYmIHRvcFBhZ2UuX2hpZGUoKTtcbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIHRoaXMudGFicy5mb3JFYWNoKHRhYiA9PiB0YWIucmVtb3ZlKCkpO1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdwb3NpdGlvbicsICdzd2lwZWFibGUnLCAndGFiLWJvcmRlcicsICdoaWRlLXRhYnMnLCAnYWN0aXZlLWluZGV4J107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIGNvbnN0IGlzVG9wID0gbSA9PiAvKF58XFxzKyl0b3AoJHxcXHMrKS9pLnRlc3QobSk7XG4gICAgICBpc1RvcChsYXN0KSAhPT0gaXNUb3AoY3VycmVudCkgJiYgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwb3NpdGlvbicpIHtcbiAgICAgIHV0aWwuaXNBdHRhY2hlZCh0aGlzKSAmJiB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3N3aXBlYWJsZScpIHtcbiAgICAgIHRoaXMuX3N3aXBlciAmJiB0aGlzLl9zd2lwZXIudXBkYXRlU3dpcGVhYmxlKHRoaXMuaGFzQXR0cmlidXRlKCdzd2lwZWFibGUnKSk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnaGlkZS10YWJzJykge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCAmJiB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnYWN0aXZlLWluZGV4Jykge1xuICAgICAgaWYgKHRoaXMuX2FjdGl2ZUluZGV4U2tpcEVmZmVjdCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVJbmRleFNraXBFZmZlY3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fdXBkYXRlQWN0aXZlSW5kZXgoY3VycmVudCwgbGFzdCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgcmV3cml0YWJsZXMoKSB7XG4gICAgcmV0dXJuIHJld3JpdGFibGVzO1xuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncHJlY2hhbmdlJywgJ3Bvc3RjaGFuZ2UnLCAncmVhY3RpdmUnLCAnc3dpcGUnXTtcbiAgfVxuXG4gIGdldCBhbmltYXRpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSA/XG4gICAgICB1dGlsLmFuaW1hdGlvbk9wdGlvbnNQYXJzZSh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgOiB7fTtcbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFRhYmJhckVsZW1lbnQsIFsnaGlkZS10YWJzJywgJ3N3aXBlYWJsZScsICd0YWItYm9yZGVyJ10pO1xuXG5vbnNFbGVtZW50cy5UYWJiYXIgPSBUYWJiYXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtdGFiYmFyJywgVGFiYmFyRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBUYWJiYXJFbGVtZW50IGZyb20gJy4vb25zLXRhYmJhci5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCB7IFBhZ2VMb2FkZXIsIGRlZmF1bHRQYWdlTG9hZGVyIH0gZnJvbSAnLi4vb25zL3BhZ2UtbG9hZGVyLmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICd0YWJiYXJfX2l0ZW0nO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAndGFiYmFyLS0qX19pdGVtJyxcbiAgJy50YWJiYXJfX2J1dHRvbic6ICd0YWJiYXItLSpfX2J1dHRvbidcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXRhYlxuICogQGNhdGVnb3J5IHRhYmJhclxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgdGFiIGluc2lkZSB0YWIgYmFyLiBFYWNoIGA8b25zLXRhYj5gIHJlcHJlc2VudHMgYSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjgr/jg5bjg5Djg7zjgavphY3nva7jgZXjgozjgovlkITjgqLjgqTjg4bjg6Djga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgILjgZ3jgozjgZ7jgozjga5vbnMtdGFi44Gv44Oa44O844K444KS6KGo44GX44G+44GZ44CCXG4gKiAgICAgb25zLXRhYuimgee0oOOBruS4reOBq+OBr+OAgeOCv+ODluOBq+ihqOekuuOBleOCjOOCi+OCs+ODs+ODhuODs+ODhOOCkuebtOaOpeiomOi/sOOBmeOCi+OBk+OBqOOBjOWHuuadpeOBvuOBmeOAglxuICogICBbL2phXVxuICogQGNvZGVwZW4gcEd1RExcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS90YWJiYXJcbiAqIEBndWlkZSBmdW5kYW1lbnRhbHMuaHRtbCNtYW5hZ2luZy1wYWdlc1xuICogICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXMuWy9lbl1cbiAqICAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXVxuICogQGd1aWRlIGFwcHNpemUuaHRtbCNyZW1vdmluZy1pY29uLXBhY2tzIFtlbl1SZW1vdmluZyBpY29uIHBhY2tzLlsvZW5dW2phXVsvamFdXG4gKiBAZ3VpZGUgZmFxLmh0bWwjaG93LWNhbi1pLXVzZS1jdXN0b20taWNvbi1wYWNrcyBbZW5dQWRkaW5nIGN1c3RvbSBpY29uIHBhY2tzLlsvZW5dW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtdGFiYmFyXG4gKiAgIFtlbl1vbnMtdGFiYmFyIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtdGFiYmFy44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1wYWdlXG4gKiAgIFtlbl1vbnMtcGFnZSBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXBhZ2XjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWljb25cbiAqICAgW2VuXW9ucy1pY29uIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtaWNvbuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy10YWJiYXI+XG4gKiAgIDxvbnMtdGFiXG4gKiAgICAgcGFnZT1cImhvbWUuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJIb21lXCJcbiAqICAgICBhY3RpdmU+XG4gKiAgIDwvb25zLXRhYj5cbiAqICAgPG9ucy10YWJcbiAqICAgICBwYWdlPVwic2V0dGluZ3MuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJTZXR0aW5nc1wiXG4gKiAgICAgYWN0aXZlPlxuICogICA8L29ucy10YWI+XG4gKiA8L29ucy10YWJiYXI+XG4gKlxuICogPHRlbXBsYXRlIGlkPVwiaG9tZS5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cbiAqXG4gKiA8dGVtcGxhdGUgaWQ9XCJzZXR0aW5ncy5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYWJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBhZ2VcbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSB0YWIgaXMgdGFwcGVkLlsvZW5dXG4gICAqICAgW2phXW9ucy10YWLjgYzlj4LnhafjgZnjgovjg5rjg7zjgrjjgbjjga5VUkzjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpY29uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIFRoZSBpY29uIG5hbWUgZm9yIHRoZSB0YWIuIENhbiBzcGVjaWZ5IHRoZSBzYW1lIGljb24gbmFtZSBhcyBgPG9ucy1pY29uPmAuIENoZWNrIFtTZWUgYWxzb10oI3NlZWFsc28pIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdXG4gICAqICAgICDjgqLjgqTjgrPjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJvbnMtaWNvbuOBqOWQjOOBmOOCouOCpOOCs+ODs+WQjeOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglxuICAgKiAgICAg5YCL5Yil44Gr44Ki44Kk44Kz44Oz44KS44Kr44K544K/44Oe44Kk44K644GZ44KL5aC05ZCI44Gv44CBYmFja2dyb3VuZC1pbWFnZeOBquOBqeOBrkNTU+OCueOCv+OCpOODq+OCkueUqOOBhOOBpuaMh+WumuOBp+OBjeOBvuOBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFjdGl2ZS1pY29uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgbmFtZSBvZiB0aGUgaWNvbiB3aGVuIHRoZSB0YWIgaXMgYWN0aXZlLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+ODhuOCo+ODluOBrumam+OBruOCouOCpOOCs+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGxhYmVsXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgbGFiZWwgb2YgdGhlIHRhYiBpdGVtLlsvZW5dXG4gICAqICAgW2phXeOCouOCpOOCs+ODs+S4i+OBq+ihqOekuuOBleOCjOOCi+ODqeODmeODq+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGJhZGdlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1EaXNwbGF5IGEgbm90aWZpY2F0aW9uIGJhZGdlIG9uIHRvcCBvZiB0aGUgdGFiLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCuOOBq+ihqOekuuOBmeOCi+WGheWuueOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFjdGl2ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgdGFiIHRoYXQgaXMgYWN0aXZlIGJ5IGRlZmF1bHQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChbJ2xhYmVsJywgJ2ljb24nLCAnYmFkZ2UnXS5zb21lKHRoaXMuaGFzQXR0cmlidXRlLmJpbmQodGhpcykpKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBkZWZhdWx0UGFnZUxvYWRlcjtcbiAgICB0aGlzLl9vbkNsaWNrID0gdGhpcy5fb25DbGljay5iaW5kKHRoaXMpO1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ2NsaWNrJyk7XG4gICAgdGhpcy5fY29ubmVjdE9uQ2xpY2sgPSBvbkNvbm5lY3RlZDtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25DbGljayA9IG9uRGlzY29ubmVjdGVkO1xuICB9XG5cbiAgc2V0IHBhZ2VMb2FkZXIobG9hZGVyKSB7XG4gICAgaWYgKCEobG9hZGVyIGluc3RhbmNlb2YgUGFnZUxvYWRlcikpIHtcbiAgICAgIHV0aWwudGhyb3dQYWdlTG9hZGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBsb2FkZXI7XG4gIH1cblxuICBnZXQgcGFnZUxvYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUxvYWRlcjtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIGlmICh0aGlzLl9idXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidXR0b24gPSB1dGlsLmNyZWF0ZSgnYnV0dG9uLnRhYmJhcl9fYnV0dG9uJyk7XG4gICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuY2hpbGROb2Rlc1swXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB1dGlsLmNyZWF0ZSgnaW5wdXQnLCB7IGRpc3BsYXk6ICdub25lJyB9KTtcbiAgICBpbnB1dC50eXBlID0gJ3JhZGlvJztcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgIHRoaXMuX3VwZGF0ZUJ1dHRvbkNvbnRlbnQoKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gICAgdGhpcy5fdXBkYXRlUmlwcGxlKCk7XG4gIH1cblxuICBfdXBkYXRlUmlwcGxlKCkge1xuICAgIHRoaXMuX2J1dHRvbiAmJiB1dGlsLnVwZGF0ZVJpcHBsZSh0aGlzLl9idXR0b24sIHRoaXMuaGFzQXR0cmlidXRlKCdyaXBwbGUnKSk7XG4gIH1cblxuICBfdXBkYXRlQnV0dG9uQ29udGVudCgpIHtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLl9idXR0b247XG5cbiAgICBsZXQgaWNvbldyYXBwZXIgPSB0aGlzLl9pY29uO1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnaWNvbicpKSB7XG4gICAgICBpY29uV3JhcHBlciA9IGljb25XcmFwcGVyIHx8IHV0aWwuY3JlYXRlRWxlbWVudCgnPGRpdiBjbGFzcz1cInRhYmJhcl9faWNvblwiPjxvbnMtaWNvbj48L29ucy1pY29uPjwvZGl2PicpO1xuICAgICAgY29uc3QgaWNvbiA9IGljb25XcmFwcGVyLmNoaWxkcmVuWzBdO1xuICAgICAgY29uc3QgZml4ID0gKGxhc3QgPT4gKCkgPT4gaWNvbi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soJ2ljb24nLCBsYXN0LCB0aGlzLmdldEF0dHJpYnV0ZSgnaWNvbicpKSkoaWNvbi5nZXRBdHRyaWJ1dGUoJ2ljb24nKSk7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2ljb24nKSAmJiB0aGlzLmhhc0F0dHJpYnV0ZSgnYWN0aXZlLWljb24nKSkge1xuICAgICAgICBpY29uLnNldEF0dHJpYnV0ZSgnaWNvbicsIHRoaXMuZ2V0QXR0cmlidXRlKHRoaXMuaXNBY3RpdmUoKSA/ICdhY3RpdmUtaWNvbicgOiAnaWNvbicpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2ljb24nKSkge1xuICAgICAgICBpY29uLnNldEF0dHJpYnV0ZSgnaWNvbicsIHRoaXMuZ2V0QXR0cmlidXRlKCdpY29uJykpO1xuICAgICAgfVxuICAgICAgaWNvbldyYXBwZXIucGFyZW50RWxlbWVudCAhPT0gYnV0dG9uICYmIGJ1dHRvbi5pbnNlcnRCZWZvcmUoaWNvbldyYXBwZXIsIGJ1dHRvbi5maXJzdENoaWxkKTtcblxuICAgICAgLy8gZGlydHkgZml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vT25zZW5VSS9PbnNlblVJL2lzc3Vlcy8xNjU0XG4gICAgICBpY29uLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uXG4gICAgICAgID8gZml4KClcbiAgICAgICAgOiBzZXRJbW1lZGlhdGUoKCkgPT4gaWNvbi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBmaXgoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb25XcmFwcGVyICYmIGljb25XcmFwcGVyLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIFsnbGFiZWwnLCAnYmFkZ2UnXS5mb3JFYWNoKChhdHRyLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IHByb3AgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYC50YWJiYXJfXyR7YXR0cn1gKTtcbiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShhdHRyKSkge1xuICAgICAgICBwcm9wID0gcHJvcCB8fCB1dGlsLmNyZWF0ZShgLnRhYmJhcl9fJHthdHRyfWAgKyAoYXR0ciA9PT0gJ2JhZGdlJyA/ICcgbm90aWZpY2F0aW9uJyA6ICcnKSk7XG4gICAgICAgIHByb3AudGV4dENvbnRlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgcHJvcC5wYXJlbnRFbGVtZW50ICE9PSBidXR0b24gJiYgYnV0dG9uLmFwcGVuZENoaWxkKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcCAmJiBwcm9wLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IF9pbnB1dCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ2lucHV0Jyk7XG4gIH1cblxuICBnZXQgX2J1dHRvbigpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWJiYXJfX2J1dHRvbicpO1xuICB9XG5cbiAgZ2V0IF9pY29uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy50YWJiYXJfX2ljb24nKTtcbiAgfVxuXG4gIGdldCBfdGFiYmFyKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy10YWJiYXInKTtcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIHRoaXMpO1xuICB9XG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICB0aGlzLl90YWJiYXIuc2V0QWN0aXZlVGFiKHRoaXMuaW5kZXgsIHsgcmVqZWN0OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldEFjdGl2ZShhY3RpdmUgPSB0cnVlKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LmNoZWNrZWQgPSBhY3RpdmU7XG4gICAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGFjdGl2ZSk7XG4gICAgICB1dGlsLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLCAnYWN0aXZlJywgYWN0aXZlKTtcblxuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdpY29uJykgJiYgdGhpcy5oYXNBdHRyaWJ1dGUoJ2FjdGl2ZS1pY29uJykpIHtcbiAgICAgICAgdGhpcy5faWNvbi5jaGlsZHJlblswXS5zZXRBdHRyaWJ1dGUoJ2ljb24nLCB0aGlzLmdldEF0dHJpYnV0ZShhY3RpdmUgPyAnYWN0aXZlLWljb24nIDogJ2ljb24nKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfbG9hZFBhZ2VFbGVtZW50KHBhcmVudCwgcGFnZSkge1xuICAgIHRoaXMuX2hhc0xvYWRlZCA9IHRydWU7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLmxvYWQoeyBwYXJlbnQsIHBhZ2UgfSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHBhZ2VFbGVtZW50LCBwYXJlbnQuY2hpbGRyZW5bdGhpcy5pbmRleF0pOyAvLyBFbnN1cmUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5fbG9hZGVkUGFnZSA9IHBhZ2VFbGVtZW50O1xuICAgICAgICByZXNvbHZlKHBhZ2VFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHBhZ2VFbGVtZW50KCkge1xuICAgIC8vIEl0IGhhcyBiZWVuIGxvYWRlZCBieSBvbnMtdGFiXG4gICAgaWYgKHRoaXMuX2xvYWRlZFBhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2FkZWRQYWdlO1xuICAgIH1cbiAgICAvLyBNYW51YWxseSBhdHRhY2hlZCB0byBET00sIDEgcGVyIHRhYlxuICAgIGNvbnN0IHRhYmJhciA9IHRoaXMuX3RhYmJhcjtcbiAgICBpZiAodGFiYmFyLnBhZ2VzLmxlbmd0aCA9PT0gdGFiYmFyLnRhYnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFiYmFyLnBhZ2VzW3RoaXMuaW5kZXhdO1xuICAgIH1cbiAgICAvLyBMb2FkZWQgaW4gYW5vdGhlciB3YXlcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCBmYWxzZSk7XG4gICAgaWYgKHRoaXMuX2xvYWRlZFBhZ2UpIHtcbiAgICAgIHRoaXMuX2hhc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sb2FkZWQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljaywgZmFsc2UpO1xuXG4gICAgaWYgKCF1dGlsLmlzQXR0YWNoZWQodGhpcykgfHwgdGhpcy5sb2FkZWQpIHtcbiAgICAgIHJldHVybjsgLy8gb25zLXRhYmJhciBjb21waWxhdGlvbiBtYXkgdHJpZ2dlciB0aGlzXG4gICAgfVxuXG4gICAgY29uc3QgZGVmZXJyZWQgPSB1dGlsLmRlZmVyKCk7XG4gICAgdGhpcy5sb2FkZWQgPSBkZWZlcnJlZC5wcm9taXNlO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIGNvbnN0IHRhYmJhciA9IHRoaXMuX3RhYmJhcjtcbiAgICAgIGlmICghdGFiYmFyKSB7XG4gICAgICAgIHV0aWwudGhyb3coJ1RhYiBlbGVtZW50cyBtdXN0IGJlIGNoaWxkcmVuIG9mIFRhYmJhcicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFiYmFyLmhhc0F0dHJpYnV0ZSgnbW9kaWZpZXInKSkge1xuICAgICAgICB1dGlsLmFkZE1vZGlmaWVyKHRoaXMsIHRhYmJhci5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2hhc0xvYWRlZCkge1xuICAgICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2FjdGl2ZScpKSB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgICAgICAgdGFiYmFyLmFjdGl2ZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPT09IHRhYmJhci50YWJzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0YWJiYXIuX29uUmVmcmVzaCgpO1xuICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0YWJiYXIuX29uUmVmcmVzaCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFRhYmJhckVsZW1lbnQucmV3cml0YWJsZXMucmVhZHkodGFiYmFyLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFnZVRhcmdldCA9IHRoaXMucGFnZSB8fCB0aGlzLmdldEF0dHJpYnV0ZSgncGFnZScpO1xuICAgICAgICAgIGlmICghdGhpcy5wYWdlRWxlbWVudCAmJiBwYWdlVGFyZ2V0KSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRUYXJnZXQgPSB0YWJiYXIuX3RhcmdldEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBkdW1teVBhZ2UgPSB1dGlsLmNyZWF0ZSgnZGl2JywgeyBoZWlnaHQ6ICcxMDAlJywgd2lkdGg6ICcxMDAlJywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSk7XG4gICAgICAgICAgICBwYXJlbnRUYXJnZXQuaW5zZXJ0QmVmb3JlKGR1bW15UGFnZSwgcGFyZW50VGFyZ2V0LmNoaWxkcmVuW2luZGV4XSk7IC8vIEVuc3VyZSBwb3NpdGlvblxuXG4gICAgICAgICAgICBjb25zdCBsb2FkID0gKCkgPT4gdGhpcy5fbG9hZFBhZ2VFbGVtZW50KHBhcmVudFRhcmdldCwgcGFnZVRhcmdldCkudGhlbihkZWZlcnJlZC5yZXNvbHZlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzQWN0aXZlKCkgPyBsb2FkKCkgOiB0YWJiYXIuX2xvYWRJbmFjdGl2ZS5wcm9taXNlLnRoZW4obG9hZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnJlc29sdmUodGhpcy5wYWdlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdE9uQ2xpY2soKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3JpcHBsZScsICdpY29uJywgJ2xhYmVsJywgJ3BhZ2UnLCAnYmFkZ2UnLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpcHBsZSc6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVSaXBwbGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaWNvbic6XG4gICAgICBjYXNlICdsYWJlbCc6XG4gICAgICBjYXNlICdiYWRnZSc6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVCdXR0b25Db250ZW50KCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgICB0aGlzLnBhZ2UgPSBjdXJyZW50IHx8ICcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuVGFiID0gVGFiRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXRhYicsIFRhYkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3cobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShtb2RhbCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG4iLCJcbi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBpT1Mgc3R5bGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmFkZVRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjN9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KHRvYXN0LCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KVxuICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KVxuICAgICAgLnBsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZSh0b2FzdCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IDAgfSlcbiAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSlcbiAgICAgIC5wbGF5KCk7XG4gIH1cbn1cbiIsIlxuLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi8uLi9vbnMvcGxhdGZvcm0uanMnO1xuaW1wb3J0IGlQaG9uZVhQYXRjaCBmcm9tICcuLi8uLi9vbnMvaXBob25leC1wYXRjaC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBBc2NlbmQgVG9hc3QgQW5pbWF0b3IuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFzY2VuZFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWluZyA9ICdlYXNlJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMjUgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcblxuICAgIHRoaXMubWVzc2FnZURlbGF5ID0gdGhpcy5kdXJhdGlvbiAqIDAuNCArIHRoaXMuZGVsYXk7IC8vIERlbGF5IG1lc3NhZ2Ugb3BhY2l0eSBjaGFuZ2VcbiAgICBpZiAocGxhdGZvcm0uaXNBbmRyb2lkKCkpIHtcbiAgICAgIHRoaXMuYXNjZW5zaW9uID0gNDg7IC8vIFRvYXN0cyBhcmUgYWx3YXlzIDEgbGluZVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgICAgICB0aGlzLmFzY2Vuc2lvbiA9IDk4OyAvLyA2NCArIDM0XG4gICAgICB9IGVsc2UgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhMYW5kc2NhcGVQYXRjaEFjdGl2ZSgpKSB7XG4gICAgICAgIHRoaXMuYXNjZW5zaW9uID0gODU7IC8vIDY0ICsgMjFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXNjZW5zaW9uID0gNjQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KHRvYXN0LCBjYWxsYmFjaykge1xuICAgIHRvYXN0ID0gdG9hc3QuX3RvYXN0O1xuICAgIHV0aWwuZ2xvYmFscy5mYWJPZmZzZXQgPSB0aGlzLmFzY2Vuc2lvbjtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5hc2NlbnNpb259cHgsIDApYCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fZ2V0RmFicygpKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAtJHt0aGlzLmFzY2Vuc2lvbn1weCwgMCkgc2NhbGUoMSlgIH0sIHRoaXMuZGVmKSxcblxuICAgICAgYW5pbWl0KHV0aWwuYXJyYXlGcm9tKHRvYXN0LmNoaWxkcmVuKSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUodG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG4gICAgdXRpbC5nbG9iYWxzLmZhYk9mZnNldCA9IDA7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5hc2NlbnNpb259cHgsIDApYCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KHRoaXMuX2dldEZhYnMoKSwgdGhpcy5kZWYpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApIHNjYWxlKDEpYCB9LCB0aGlzLmRlZiksXG5cbiAgICAgIGFuaW1pdCh1dGlsLmFycmF5RnJvbSh0b2FzdC5jaGlsZHJlbiksIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pXG4gICAgKTtcbiAgfVxuXG4gIF9nZXRGYWJzKCkge1xuICAgIHJldHVybiB1dGlsLmFycmF5RnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdvbnMtZmFiW3Bvc2l0aW9ufj1ib3R0b21dLCBvbnMtc3BlZWQtZGlhbFtwb3NpdGlvbn49Ym90dG9tXScpKS5maWx0ZXIoZmFiID0+IGZhYi52aXNpYmxlKTtcbiAgfVxufVxuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IGlQaG9uZVhQYXRjaCBmcm9tICcuLi8uLi9vbnMvaXBob25leC1wYXRjaC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBMaWZ0LWZhZGUgVG9hc3QgQW5pbWF0b3JcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmdFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWluZyA9ICdlYXNlJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMzUgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgICB0aGlzLmJvZHlIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsgLy8gYXZvaWQgRm9yY2VkIFN5bmNocm9ub3VzIExheW91dFxuICAgIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYUG9ydHJhaXRQYXRjaEFjdGl2ZSgpKSB7XG4gICAgICB0aGlzLmxpZnRBbW91bnQgPSAnY2FsYygxMDAlICsgMzRweCknO1xuICAgIH0gZWxzZSBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWExhbmRzY2FwZVBhdGNoQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMubGlmdEFtb3VudCA9ICdjYWxjKDEwMCUgKyAyMXB4KSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGlmdEFtb3VudCA9ICcxMDAlJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3codG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMubGlmdEFtb3VudH0sIDApYCwgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKHRvYXN0LCBjYWxsYmFjaykge1xuICAgIHRvYXN0ID0gdG9hc3QuX3RvYXN0O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0b2FzdCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMubGlmdEFtb3VudH0sIDApYCwgb3BhY2l0eTogMCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24odG9hc3QpIHtcbiAgICBpZiAocGFyc2VJbnQodG9hc3Quc3R5bGUudG9wLCAxMCkgPT09IDApIHtcbiAgICAgIHRvYXN0LnN0eWxlLnRvcCA9IHRvYXN0LnN0eWxlLmJvdHRvbSA9ICcnO1xuICAgIH1cbiAgfVxufVxuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IGlQaG9uZVhQYXRjaCBmcm9tICcuLi8uLi9vbnMvaXBob25leC1wYXRjaC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBGYWxsLWZhZGUgVG9hc3QgQW5pbWF0b3JcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmFsbFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWluZyA9ICdlYXNlJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMzUgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgICAgdGhpcy5mYWxsQW1vdW50ID0gJ2NhbGMoLTEwMCUgLSA0NHB4KSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmFsbEFtb3VudCA9ICctMTAwJSc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KHRvYXN0LCBjYWxsYmFjaykge1xuICAgIHRvYXN0ID0gdG9hc3QuX3RvYXN0O1xuICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKHRvYXN0KTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5mYWxsQW1vdW50fSwgMClgLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUodG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG4gICAgdGhpcy5fdXBkYXRlUG9zaXRpb24odG9hc3QpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0b2FzdCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMuZmFsbEFtb3VudH0sIDApYCwgb3BhY2l0eTogMCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKHRvYXN0LCB0cnVlKTtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgX3VwZGF0ZVBvc2l0aW9uKHRvYXN0LCBjbGVhblVwKSB7XG4gICAgbGV0IGNvcnJlY3RUb3A7XG4gICAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICAgIGNvcnJlY3RUb3AgPSAnNDRweCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvcnJlY3RUb3AgPSAnMCc7XG4gICAgfVxuXG4gICAgaWYgKHRvYXN0LnN0eWxlLnRvcCAhPT0gY29ycmVjdFRvcCkge1xuICAgICAgdG9hc3Quc3R5bGUudG9wID0gY29ycmVjdFRvcDtcbiAgICAgIHRvYXN0LnN0eWxlLmJvdHRvbSA9ICdpbml0aWFsJztcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL29ucy10b2FzdC9hbmltYXRvci5qcyc7XG5pbXBvcnQgRmFkZVRvYXN0QW5pbWF0b3IgZnJvbSAnLi9vbnMtdG9hc3QvZmFkZS1hbmltYXRvci5qcyc7XG5pbXBvcnQgQXNjZW5kVG9hc3RBbmltYXRvciBmcm9tICcuL29ucy10b2FzdC9hc2NlbmQtYW5pbWF0b3IuanMnO1xuaW1wb3J0IExpZnRUb2FzdEFuaW1hdG9yIGZyb20gJy4vb25zLXRvYXN0L2xpZnQtYW5pbWF0b3IuanMnO1xuaW1wb3J0IEZhbGxUb2FzdEFuaW1hdG9yIGZyb20gJy4vb25zLXRvYXN0L2ZhbGwtYW5pbWF0b3IuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgQmFzZURpYWxvZ0VsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZGlhbG9nLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcudG9hc3QnOiAndG9hc3QtLSonLFxuICAnLnRvYXN0X19tZXNzYWdlJzogJ3RvYXN0LS0qX19tZXNzYWdlJyxcbiAgJy50b2FzdF9fYnV0dG9uJzogJ3RvYXN0LS0qX19idXR0b24nXG59O1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3RvYXN0JztcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgJ2RlZmF1bHQnOiBwbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFzY2VuZFRvYXN0QW5pbWF0b3IgOiBMaWZ0VG9hc3RBbmltYXRvcixcbiAgJ2ZhZGUnOiBGYWRlVG9hc3RBbmltYXRvcixcbiAgJ2FzY2VuZCc6IEFzY2VuZFRvYXN0QW5pbWF0b3IsXG4gICdsaWZ0JzogTGlmdFRvYXN0QW5pbWF0b3IsXG4gICdmYWxsJzogRmFsbFRvYXN0QW5pbWF0b3IsXG4gICdub25lJzogVG9hc3RBbmltYXRvclxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtdG9hc3RcbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhlIFRvYXN0IG9yIFNuYWNrYmFyIGNvbXBvbmVudCBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgZGlzbWlzc2FibGUgaW5mb3JtYXRpb24gb3Igc2ltcGxlIGFjdGlvbnMgYXQgKG5vcm1hbGx5KSB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLlxuICpcbiAqICAgICBUaGlzIGNvbXBvbmVudCBkb2VzIG5vdCBibG9jayB1c2VyIGlucHV0LCBhbGxvd2luZyB0aGUgYXBwIHRvIGNvbnRpbnVlIGl0cyBmbG93LiBGb3Igc2ltcGxlIHRvYXN0cywgY29uc2lkZXIgYG9ucy5ub3RpZmljYXRpb24udG9hc3RgIGluc3RlYWQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3RvYXN0XG4gKiBAc2VlYWxzbyBvbnMtYWxlcnQtZGlhbG9nXG4gKiAgIFtlbl1UaGUgYDxvbnMtYWxlcnQtZGlhbG9nPmAgY29tcG9uZW50IGlzIHByZWZlcnJlZCBmb3IgZGlzcGxheWluZyB1bmRpc21pc3NhYmxlIGluZm9ybWF0aW9uLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2FzdEVsZW1lbnQgZXh0ZW5kcyBCYXNlRGlhbG9nRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBldmVudCBwcmVzaG93XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgdG9hc3QgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50b2FzdFxuICAgKiAgIFtlbl1Ub2FzdCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdG8gc3RvcCB0aGUgdG9hc3QgZnJvbSBzaG93aW5nLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBruihqOekuuOCkuatouOCgeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdHNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIHRvYXN0IGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgZ/nm7TlvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudG9hc3RcbiAgICogICBbZW5dVG9hc3Qgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlaGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHRvYXN0IGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudG9hc3RcbiAgICogICBbZW5dVG9hc3Qgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRvIHN0b3AgdGhlIHRvYXN0IGZyb20gaGlkaW5nLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBjOmWieOBmOOCiOOBhuOBqOOBmeOCi+OBruOCkuatouOCgeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSB0b2FzdCBpcyBoaWRkZW4uWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOmaoOOCjOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50b2FzdFxuICAgKiAgIFtlbl1Ub2FzdCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IGRlZmF1bHRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gc2hvd2luZyBhbmQgaGlkaW5nIHRoZSB0b2FzdC4gQ2FuIGJlIGVpdGhlciBgXCJkZWZhdWx0XCJgLCBgXCJhc2NlbmRcImAgKEFuZHJvaWQpLCBgXCJsaWZ0XCJgIChpT1MpLCBgXCJmYWxsXCJgLCBgXCJmYWRlXCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIDxjb2RlPntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPlsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgdG9hc3QgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2RlZmF1bHREQkIgPSBudWxsO1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICB9XG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHNjaGVtZTtcbiAgfVxuXG4gIGdldCBfdG9hc3QoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsIGAuJHtkZWZhdWx0Q2xhc3NOYW1lfWApO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICAvLyBSZXNldCBwb3NpdGlvbiBzdHlsZVxuICAgIHRoaXMuX3RvYXN0ICYmICh0aGlzLl90b2FzdC5zdHlsZS50b3AgPSB0aGlzLl90b2FzdC5zdHlsZS5ib3R0b20gPSAnJyk7XG5cbiAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IF9hbmltYXRvckRpY3QsXG4gICAgICBiYXNlQ2xhc3M6IFRvYXN0QW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnVG9hc3RBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc3R5bGUuekluZGV4ID0gMTAwMDA7IC8vIExvd2VyIHRoYW4gZGlhbG9nc1xuXG4gICAgY29uc3QgbWVzc2FnZUNsYXNzTmFtZSA9ICd0b2FzdF9fbWVzc2FnZSc7XG4gICAgY29uc3QgYnV0dG9uQ2xhc3NOYW1lID0gJ3RvYXN0X19idXR0b24nO1xuXG4gICAgbGV0IHRvYXN0ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgYC4ke2RlZmF1bHRDbGFzc05hbWV9YCk7XG4gICAgaWYgKCF0b2FzdCkge1xuICAgICAgdG9hc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRvYXN0LmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgICB3aGlsZSAodGhpcy5jaGlsZE5vZGVzWzBdKSB7XG4gICAgICAgIHRvYXN0LmFwcGVuZENoaWxkKHRoaXMuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJ1dHRvbiA9IHV0aWwuZmluZENoaWxkKHRvYXN0LCBgLiR7YnV0dG9uQ2xhc3NOYW1lfWApO1xuICAgIGlmICghYnV0dG9uKSB7XG4gICAgICBidXR0b24gPSB1dGlsLmZpbmRDaGlsZCh0b2FzdCwgZSA9PiB1dGlsLm1hdGNoKGUsICcuYnV0dG9uJykgfHwgdXRpbC5tYXRjaChlLCAnYnV0dG9uJykpO1xuICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYnV0dG9uJyk7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKGJ1dHRvbkNsYXNzTmFtZSk7XG4gICAgICAgIHRvYXN0LmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZCh0b2FzdCwgYC4ke21lc3NhZ2VDbGFzc05hbWV9YCkpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gdXRpbC5maW5kQ2hpbGQodG9hc3QsICcubWVzc2FnZScpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRvYXN0LmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAodG9hc3QuY2hpbGROb2Rlc1tpXSAhPT0gYnV0dG9uKSB7XG4gICAgICAgICAgICBtZXNzYWdlLmluc2VydEJlZm9yZSh0b2FzdC5jaGlsZE5vZGVzW2ldLCBtZXNzYWdlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVzc2FnZS5jbGFzc0xpc3QuYWRkKG1lc3NhZ2VDbGFzc05hbWUpO1xuXG4gICAgICB0b2FzdC5pbnNlcnRCZWZvcmUobWVzc2FnZSwgdG9hc3QuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHRvYXN0LnBhcmVudE5vZGUgIT09IHRoaXMpIHtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodG9hc3QpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3coW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJkZWZhdWx0XCJgLCBgXCJhc2NlbmRcImAgKEFuZHJvaWQpLCBgXCJsaWZ0XCJgIChpT1MpLCBgXCJmYWxsXCJgLCBgXCJmYWRlXCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBkaXNwbGF5ZWQgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZVxuICAgKiBAc2lnbmF0dXJlIHRvZ2dsZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcImRlZmF1bHRcImAsIGBcImFzY2VuZFwiYCAoQW5kcm9pZCksIGBcImxpZnRcImAgKGlPUyksIGBcImZhbGxcImAsIGBcImZhZGVcImAgb3IgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRvZ2dsZSB0b2FzdCB2aXNpYmlsaXR5LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwiZGVmYXVsdFwiYCwgYFwiYXNjZW5kXCJgIChBbmRyb2lkKSwgYFwibGlmdFwiYCAoaU9TKSwgYFwiZmFsbFwiYCwgYFwiZmFkZVwiYCBvciBgXCJub25lXCJgLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0b2FzdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgaGlkZGVuIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgVG9hc3RBbmltYXRvcikpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wiQW5pbWF0b3JcIiBwYXJhbSBtdXN0IGluaGVyaXQgT25zVG9hc3RFbGVtZW50LlRvYXN0QW5pbWF0b3InKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFRvYXN0QW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIFRvYXN0QW5pbWF0b3I7XG4gIH1cbn1cblxub25zRWxlbWVudHMuVG9hc3QgPSBUb2FzdEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy10b2FzdCcsIFRvYXN0RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlQnV0dG9uRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1idXR0b24uanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy10b29sYmFyLWJ1dHRvblxuICogQGNhdGVnb3J5IHBhZ2VcbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIHRvb2xiYXIgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIG91dGxpbmVcbiAqICAgW2VuXUEgYnV0dG9uIHdpdGggYW4gb3V0bGluZS5bL2VuXVxuICogICBbamFd44Ki44Km44OI44Op44Kk44Oz44KS44KC44Gj44Gf44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQnV0dG9uIGNvbXBvbmVudCBmb3Igb25zLXRvb2xiYXIgYW5kIG9ucy1ib3R0b20tdG9vbGJhci5bL2VuXVxuICogICBbamFdb25zLXRvb2xiYXLjgYLjgovjgYTjga9vbnMtYm90dG9tLXRvb2xiYXLjgavoqK3nva7jgafjgY3jgovjg5zjgr/jg7PnlKjjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJbL2phXVxuICogQGNvZGVwZW4gYUhtR0xcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9wYWdlXG4gKiBAZ3VpZGUgY29tcGlsYXRpb24uaHRtbCN0b29sYmFyLWNvbXBpbGF0aW9uXG4gKiAgIFtlbl1BZGRpbmcgYSB0b29sYmFyWy9lbl1cbiAqICAgW2phXeODhOODvOODq+ODkOODvOOBrui/veWKoFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtdG9vbGJhclxuICogICBbZW5dVGhlIGA8b25zLXRvb2xiYXI+YCBjb21wb25lbnQgZGlzcGxheXMgYSBuYXZpZ2F0aW9uIGJhciBhdCB0aGUgdG9wIG9mIGEgcGFnZS5bL2VuXVxuICogICBbamFdb25zLXRvb2xiYXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWJhY2stYnV0dG9uXG4gKiAgIFtlbl1UaGUgYDxvbnMtYmFjay1idXR0b24+YCBkaXNwbGF5cyBhIGJhY2sgYnV0dG9uIGluIHRoZSBuYXZpZ2F0aW9uIGJhci5bL2VuXVxuICogICBbamFdb25zLWJhY2stYnV0dG9u44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXRvb2xiYXI+XG4gKiAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gKiAgICAgPG9ucy10b29sYmFyLWJ1dHRvbj5cbiAqICAgICAgIEJ1dHRvblxuICogICAgIDwvb25zLXRvb2xiYXItYnV0dG9uPlxuICogICA8L2Rpdj5cbiAqICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgIFRpdGxlXG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAqICAgICA8b25zLXRvb2xiYXItYnV0dG9uPlxuICogICAgICAgPG9ucy1pY29uIGljb249XCJpb24tbmF2aWNvblwiIHNpemU9XCIyOHB4XCI+PC9vbnMtaWNvbj5cbiAqICAgICA8L29ucy10b29sYmFyLWJ1dHRvbj5cbiAqICAgPC9kaXY+XG4gKiA8L29ucy10b29sYmFyPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb29sYmFyQnV0dG9uRWxlbWVudCBleHRlbmRzIEJhc2VCdXR0b25FbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGJ1dHRvbi5bL2VuXVxuICAgKiAgIFtqYV3jg5zjgr/jg7Pjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpY29uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNyZWF0ZXMgYW4gYG9ucy1pY29uYCBjb21wb25lbnQgd2l0aCB0aGlzIHN0cmluZy5bL2VuXVxuICAgKiAgW2phXWBvbnMtaWNvbmDjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgpLmgqrmgKfjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OCkueEoeWKueWMluOBmeOCi+WgtOWQiOOBr+aMh+WumuOBl+OBpuOBj+OBoOOBleOBhOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4geyAnJzogJ3Rvb2xiYXItYnV0dG9uLS0qJyB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAndG9vbGJhci1idXR0b24nO1xuICB9XG5cbiAgZ2V0IF9yaXBwbGVPcHQoKSB7XG4gICAgcmV0dXJuIFt0aGlzLCB1bmRlZmluZWQsIHsgY2VudGVyOiAnJywgJ3NpemUnOiAnY29udGFpbicsICdiYWNrZ3JvdW5kJzogJ3RyYW5zcGFyZW50JyB9XTtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5Ub29sYmFyQnV0dG9uID0gVG9vbGJhckJ1dHRvbkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy10b29sYmFyLWJ1dHRvbicsIFRvb2xiYXJCdXR0b25FbGVtZW50KTtcbiIsImltcG9ydCBzZXR1cCBmcm9tICcuL3NldHVwLmpzJzsgLy8gQWRkIHBvbHlmaWxsc1xuaW1wb3J0IG9ucyBmcm9tICcuL29ucy9pbmRleC5qcyc7IC8vIEFkZCBvbnMgaW50ZXJuYWxzXG5cbi8vIEFkZCBhbmQgcmVnaXN0ZXIgQ3VzdG9tIEVsZW1lbnRzXG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWlmLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYWN0aW9uLXNoZWV0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWFsZXJ0LWRpYWxvZy5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWFsZXJ0LWRpYWxvZy1idXR0b24uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1iYWNrLWJ1dHRvbi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWJvdHRvbS10b29sYmFyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYnV0dG9uLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtY2FyZC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWNhcm91c2VsLWl0ZW0uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1jYXJvdXNlbC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWNvbC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWRpYWxvZy5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWZhYi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWdlc3R1cmUtZGV0ZWN0b3IuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1pY29uLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtbGF6eS1yZXBlYXQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1saXN0LWhlYWRlci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWxpc3QtdGl0bGUuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1saXN0LWl0ZW0uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1saXN0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtaW5wdXQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1jaGVja2JveC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXJhZGlvLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc2VhcmNoLWlucHV0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtbW9kYWwuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1wYWdlLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcG9wb3Zlci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXByb2dyZXNzLWJhci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXByb2dyZXNzLWNpcmN1bGFyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcHVsbC1ob29rLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcmFuZ2UuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1yaXBwbGUuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1yb3cuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zZWdtZW50LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc2VsZWN0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BlZWQtZGlhbC1pdGVtLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BlZWQtZGlhbC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXNwbGl0dGVyLWNvbnRlbnQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zcGxpdHRlci1tYXNrLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BsaXR0ZXItc2lkZS5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXNwbGl0dGVyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3dpdGNoLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtdGFiLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtdGFiYmFyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtdG9hc3QuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy10b29sYmFyLWJ1dHRvbi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXRvb2xiYXIuanMnO1xuXG5zZXR1cChvbnMpOyAvLyBTZXR1cCBpbml0aWFsIGxpc3RlbmVyc1xud2luZG93Ll9zdXBlclNlY3JldE9ucyA9IG9ucztcblxuZXhwb3J0IGRlZmF1bHQgb25zO1xuIl0sIm5hbWVzIjpbIk5hdGl2ZUhUTUxFbGVtZW50Iiwid2luZG93IiwiSFRNTEVsZW1lbnQiLCJQbGF0Zm9ybSIsIl9zZWxlY3RlZFBsYXRmb3JtIiwiX2lnbm9yZVBsYXRmb3JtU2VsZWN0IiwicGxhdGZvcm0iLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJmbiIsInJlc3VsdCIsImRvY3VtZW50IiwicmVhZHlTdGF0ZSIsIkVycm9yIiwiY29yZG92YSIsInBob25lZ2FwIiwiUGhvbmVHYXAiLCJ0ZXN0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiaXNJUGhvbmUiLCJzY3JlZW4iLCJ3aWR0aCIsImhlaWdodCIsImlzSVBhZE9TIiwiZm9yY2VBY3R1YWxQbGF0Zm9ybSIsIl9nZXRTZWxlY3RlZFBsYXRmb3JtIiwiZGV2aWNlIiwicGFyc2VJbnQiLCJ2ZXJzaW9uIiwic3BsaXQiLCJ2ZXIiLCJtYXRjaCIsInJlcGxhY2UiLCJtYXhUb3VjaFBvaW50cyIsInVhIiwiaXNJT1MiLCJpbmRleE9mIiwic3RhbmRhbG9uZSIsImx0ZTkiLCJ3ZWJraXQiLCJtZXNzYWdlSGFuZGxlcnMiLCJpbmRleGVkREIiLCJvcGVyYSIsIkluc3RhbGxUcmlnZ2VyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwicCIsInNhZmFyaSIsInB1c2hOb3RpZmljYXRpb24iLCJjaHJvbWUiLCJkb2N1bWVudE1vZGUiLCJpc0FuZHJvaWQiLCJpc1dQIiwiaXNJUGFkIiwiaXNJUG9kIiwiY3VzdG9tRWxlbWVudHMiLCJmb3JjZVBvbHlmaWxsIiwiQWxyZWFkeUNvbnN0cnVjdGVkTWFya2VyIiwiJGpzY29tcERlZmF1bHRFeHBvcnQiLCJnbG9iYWwiLCJKc011dGF0aW9uT2JzZXJ2ZXIiLCJyZWdpc3RyYXRpb25zVGFibGUiLCJXZWFrTWFwIiwic2V0SW1tZWRpYXRlIiwic2V0VGltZW91dCIsInNldEltbWVkaWF0ZVF1ZXVlIiwic2VudGluZWwiLCJTdHJpbmciLCJNYXRoIiwicmFuZG9tIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJkYXRhIiwicXVldWUiLCJmb3JFYWNoIiwiZnVuYyIsInB1c2giLCJwb3N0TWVzc2FnZSIsImlzU2NoZWR1bGVkIiwic2NoZWR1bGVkT2JzZXJ2ZXJzIiwic2NoZWR1bGVDYWxsYmFjayIsIm9ic2VydmVyIiwiZGlzcGF0Y2hDYWxsYmFja3MiLCJ3cmFwSWZOZWVkZWQiLCJub2RlIiwiU2hhZG93RE9NUG9seWZpbGwiLCJvYnNlcnZlcnMiLCJzb3J0IiwibzEiLCJvMiIsInVpZF8iLCJhbnlOb25FbXB0eSIsInRha2VSZWNvcmRzIiwicmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzRm9yIiwibGVuZ3RoIiwiY2FsbGJhY2tfIiwibm9kZXNfIiwicmVnaXN0cmF0aW9ucyIsImdldCIsInJlZ2lzdHJhdGlvbiIsInJlbW92ZVRyYW5zaWVudE9ic2VydmVycyIsImZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCIsInRhcmdldCIsImNhbGxiYWNrIiwicGFyZW50Tm9kZSIsImoiLCJvcHRpb25zIiwic3VidHJlZSIsInJlY29yZCIsImVucXVldWUiLCJ1aWRDb3VudGVyIiwicmVjb3Jkc18iLCJvYnNlcnZlIiwiY2hpbGRMaXN0IiwiYXR0cmlidXRlcyIsImNoYXJhY3RlckRhdGEiLCJhdHRyaWJ1dGVPbGRWYWx1ZSIsImF0dHJpYnV0ZUZpbHRlciIsImNoYXJhY3RlckRhdGFPbGRWYWx1ZSIsIlN5bnRheEVycm9yIiwic2V0IiwiaSIsInJlbW92ZUxpc3RlbmVycyIsIlJlZ2lzdHJhdGlvbiIsImFkZExpc3RlbmVycyIsImRpc2Nvbm5lY3QiLCJzcGxpY2UiLCJjb3B5T2ZSZWNvcmRzIiwiTXV0YXRpb25SZWNvcmQiLCJ0eXBlIiwiYWRkZWROb2RlcyIsInJlbW92ZWROb2RlcyIsInByZXZpb3VzU2libGluZyIsIm5leHRTaWJsaW5nIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZU5hbWVzcGFjZSIsIm9sZFZhbHVlIiwiY29weU11dGF0aW9uUmVjb3JkIiwib3JpZ2luYWwiLCJzbGljZSIsImN1cnJlbnRSZWNvcmQiLCJyZWNvcmRXaXRoT2xkVmFsdWUiLCJnZXRSZWNvcmQiLCJnZXRSZWNvcmRXaXRoT2xkVmFsdWUiLCJjbGVhclJlY29yZHMiLCJ1bmRlZmluZWQiLCJyZWNvcmRSZXByZXNlbnRzQ3VycmVudE11dGF0aW9uIiwic2VsZWN0UmVjb3JkIiwibGFzdFJlY29yZCIsIm5ld1JlY29yZCIsInRyYW5zaWVudE9ic2VydmVkTm9kZXMiLCJyZWNvcmRzIiwicmVjb3JkVG9SZXBsYWNlTGFzdCIsImFkZExpc3RlbmVyc18iLCJyZW1vdmVMaXN0ZW5lcnNfIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZFRyYW5zaWVudE9ic2VydmVyIiwiaGFuZGxlRXZlbnQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJuYW1lIiwiYXR0ck5hbWUiLCJuYW1lc3BhY2UiLCJyZWxhdGVkTm9kZSIsIm5hbWVzcGFjZVVSSSIsImF0dHJDaGFuZ2UiLCJNdXRhdGlvbkV2ZW50IiwiQURESVRJT04iLCJwcmV2VmFsdWUiLCJjaGFuZ2VkTm9kZSIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJfaXNQb2x5ZmlsbGVkIiwic2VsZiIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyIsImFyZ3MiLCJwYXJ0aWFsbHlBcHBsaWVkIiwiYXBwbHkiLCJoYW5kbGVyIiwiYXJndW1lbnRzIiwiRnVuY3Rpb24iLCJydW5JZlByZXNlbnQiLCJoYW5kbGUiLCJ0YXNrIiwiY2xlYXJJbW1lZGlhdGUiLCJpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbiIsInByb2Nlc3MiLCJuZXh0VGljayIsImNhblVzZVBvc3RNZXNzYWdlIiwiaW1wb3J0U2NyaXB0cyIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJvbm1lc3NhZ2UiLCJpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbiIsIm1lc3NhZ2VQcmVmaXgiLCJvbkdsb2JhbE1lc3NhZ2UiLCJldmVudCIsInNvdXJjZSIsImF0dGFjaEV2ZW50IiwiaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24iLCJjaGFubmVsIiwiTWVzc2FnZUNoYW5uZWwiLCJwb3J0MSIsInBvcnQyIiwiaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbiIsImh0bWwiLCJkb2N1bWVudEVsZW1lbnQiLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24iLCJhdHRhY2hUbyIsImdldFByb3RvdHlwZU9mIiwiREVGQVVMVF9WSUVXUE9SVCIsIlZpZXdwb3J0IiwiZW5zdXJlVmlld3BvcnRFbGVtZW50Iiwidmlld3BvcnRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsImhlYWQiLCJzZXR1cCIsImhhc0F0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsIk1pY3JvRXZlbnQiLCJvbiIsImZjdCIsIl9ldmVudHMiLCJvbmNlIiwid3JhcHBlciIsIm9mZiIsImZpbHRlciIsIl9mY3QiLCJlbWl0IiwiQXJyYXkiLCJtaXhpbiIsImRlc3RPYmplY3QiLCJwcm9wcyIsInByZWZpeCIsInN0eWxlcyIsImdldENvbXB1dGVkU3R5bGUiLCJqb2luIiwiT0xpbmsiLCJ1dGlsIiwiaHlwaGVuYXRlIiwic3R5bGVyIiwiZWxlbWVudCIsInN0eWxlIiwia2V5cyIsImtleSIsIndhcm4iLCJjbGVhciIsImNsZWFybGlzdCIsInJlZHVjZSIsInIiLCJzIiwiY29uY2F0Iiwic29tZSIsImdldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImF1dG9TdHlsZUVuYWJsZWQiLCJtb2RpZmllcnNNYXAiLCJwbGF0Zm9ybXMiLCJhbmRyb2lkIiwiZWxlbWVudE5hbWUiLCJ0YWdOYW1lIiwiaGFzTW9kaWZpZXIiLCJvbGRNb2RpZmllciIsIm5ld01vZGlmaWVyIiwibWFwIiwiaGFzT3duUHJvcGVydHkiLCJ1bnNoaWZ0IiwiZWxlbWVudHMiLCJpb3MiLCJyZW1vdmVNb2RpZmllciIsImFkZE1vZGlmaWVyIiwidW5sb2NrZWQiLCJnZXRQbGF0Zm9ybSIsImZvcmNlIiwibW9iaWxlT1MiLCJvbnNQbGF0Zm9ybSIsImdldE1vYmlsZU9TIiwicHJlcGFyZSIsIm1hcE1vZGlmaWVyIiwibW9kaWZpZXIiLCJtIiwicmVzdG9yZU1vZGlmaWVyIiwiaXNFbmFibGVkIiwiZW5hYmxlIiwiZGlzYWJsZSIsIk1vZGlmaWVyVXRpbCIsImxhc3QiLCJjdXJyZW50IiwibWFrZURpY3QiLCJyZW1vdmVkIiwidG9rZW4iLCJhZGRlZCIsImRpY3QiLCJkaWZmIiwiY2xhc3NMaXN0IiwidGVtcGxhdGUiLCJrbGFzcyIsImsiLCJhZGQiLCJyZW1vdmUiLCJzY2hlbWUiLCJzZWxlY3RvciIsInRhcmdldEVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsInRhcmdldEVsZW1lbnQiLCJmaW5kUGFyZW50IiwicGFyZW50IiwiYXBwbHlEaWZmVG9DbGFzc0xpc3QiLCJhcHBseURpZmZUb0VsZW1lbnQiLCJhdXRvU3R5bGUiLCJtb2RpZmllclRva2VuIiwidG9rZW5zIiwiaW5kZXgiLCJzdGFydHNXaXRoIiwiYyIsInN1YnN0ciIsImVuZHNXaXRoIiwidW53cmFwIiwiaXNPYmplY3RTdHJpbmciLCJpc0FycmF5U3RyaW5nIiwiaXNRdW90ZWRTdHJpbmciLCJlcnJvciIsInN0cmluZyIsIm9yaWdpbmFsU3RyaW5nIiwicHJvY2Vzc1Rva2VuIiwiaXNOYU4iLCJwYXJzZU9iamVjdCIsInBhcnNlQXJyYXkiLCJuZXh0VG9rZW4iLCJsaW1pdCIsImNoYXJDb2RlQXQiLCJuZXN0ZWRPYmplY3QiLCJpc1ZhbGlkS2V5Iiwib2JqZWN0IiwicmVhZGluZ0tleSIsInByZXZpb3VzVG9rZW4iLCJhcnJheSIsInBhcnNlIiwiZXJyb3JQcmVmaXgiLCJnbG9iYWxzIiwiZmFiT2Zmc2V0Iiwic3VwcG9ydHNQYXNzaXZlIiwiX3J1bk9uQWN0dWFsUGxhdGZvcm0iLCJhY3R1YWxNb2JpbGVPUyIsImlzV0tXZWJWaWV3Iiwib3B0cyIsImRlZmluZVByb3BlcnR5IiwiZWwiLCJvcHQiLCJpc0dEIiwiY2FwdHVyZSIsInByZXBhcmVRdWVyeSIsInF1ZXJ5IiwibWF0Y2hlcyIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsIm1vek1hdGNoZXNTZWxlY3RvciIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwiZmluZENoaWxkIiwiY2hpbGROb2RlcyIsIm5vZGVUeXBlIiwiTm9kZSIsIkVMRU1FTlRfTk9ERSIsInVudGlsIiwiRG9jdW1lbnRGcmFnbWVudCIsImlzQXR0YWNoZWQiLCJib2R5IiwiY29udGFpbnMiLCJoYXNBbnlDb21wb25lbnRBc1BhcmVudCIsIm5vZGVOYW1lIiwiZ2V0QWxsQ2hpbGROb2RlcyIsImZyb20iLCJjaGlsZHJlbiIsImNoaWxkRWwiLCJpc1BhZ2VDb250cm9sIiwicHJvcGFnYXRlQWN0aW9uIiwiYWN0aW9uIiwiY2hpbGQiLCJjYW1lbGl6ZSIsImwiLCJ0b1VwcGVyQ2FzZSIsImNyZWF0ZSIsInNoaWZ0IiwiY2xhc3NOYW1lIiwiaW1wb3J0Tm9kZSIsImlubmVySFRNTCIsInRocm93IiwiY3JlYXRlRnJhZ21lbnQiLCJjb250ZW50IiwiZXh0ZW5kIiwiZHN0IiwiYXJyYXlGcm9tIiwiYXJyYXlMaWtlIiwicGFyc2VKU09OT2JqZWN0U2FmZWx5IiwianNvblN0cmluZyIsImZhaWxTYWZlIiwiSlNPTiIsImZpbmRGcm9tUGF0aCIsInBhdGgiLCJnZXRUb3BQYWdlIiwiY29udGFpbmVyIiwidG9wUGFnZSIsImZpbmRUb29sYmFyUGFnZSIsInBhZ2UiLCJfY2FuQW5pbWF0ZVRvb2xiYXIiLCJfY29udGVudEVsZW1lbnQiLCJuZXh0UGFnZSIsInRyaWdnZXJFbGVtZW50RXZlbnQiLCJldmVudE5hbWUiLCJkZXRhaWwiLCJDdXN0b21FdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiZGlzcGF0Y2hFdmVudCIsIm1vZGlmaWVyTmFtZSIsIlJlZ0V4cCIsImZvcmNlQXV0b1N0eWxlIiwibmV3TW9kaWZpZXJzIiwidG9nZ2xlTW9kaWZpZXIiLCJ0b2dnbGUiLCJyZXN0b3JlQ2xhc3MiLCJkZWZhdWx0Q2xhc3MiLCJyZWZyZXNoIiwidXBkYXRlUGFyZW50UG9zaXRpb24iLCJfcGFyZW50VXBkYXRlZCIsInBhcmVudEVsZW1lbnQiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicG9zaXRpb24iLCJ0b2dnbGVBdHRyaWJ1dGUiLCJ2YWx1ZSIsImJpbmRMaXN0ZW5lcnMiLCJsaXN0ZW5lck5hbWVzIiwiYm91bmROYW1lIiwiYmluZCIsImVhY2giLCJvYmoiLCJmIiwidXBkYXRlUmlwcGxlIiwiaGFzUmlwcGxlIiwiYXR0cnMiLCJyaXBwbGVFbGVtZW50IiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RDaGlsZCIsImFuaW1hdGlvbk9wdGlvbnNQYXJzZSIsImlzSW50ZWdlciIsImlzRmluaXRlIiwiZmxvb3IiLCJkZWZlciIsImRlZmVycmVkIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiaW50ZXJuYWwiLCJjb25maWciLCJ3YXJuaW5nc0Rpc2FibGVkIiwiY29uc29sZSIsIm1lc3NhZ2UiLCJ0aHJvd0Fic3RyYWN0IiwidGhyb3dNZW1iZXIiLCJ0aHJvd1BhZ2VMb2FkZXIiLCJ0aHJvd0FuaW1hdG9yIiwicHJldmVudCIsInByZXZlbnREZWZhdWx0IiwiaW9zUHJldmVudFNjcm9sbCIsImdkIiwiY2xlYW4iLCJpb3NQYWdlU2Nyb2xsRml4IiwiaXNWYWxpZEdlc3R1cmUiLCJnZXN0dXJlIiwiZGlzdGFuY2UiLCJkZWx0YVRpbWUiLCJjaGVja01pc3NpbmdJbXBvcnQiLCJlbGVtZW50TmFtZXMiLCJvbnNFbGVtZW50cyIsImRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzIiwiYXR0cmlidXRlTGlzdCIsInByb3BlcnR5TmFtZSIsImNvbmZpZ3VyYWJsZSIsImRlZmluZVN0cmluZ1Byb3BlcnRpZXMiLCJkZWZpbmVMaXN0ZW5lclByb3BlcnR5IiwiY2FtZWxpemVkIiwiY2hhckF0IiwibmV3SGFuZGxlciIsImlzQ29ubmVjdGVkIiwib25Db25uZWN0ZWQiLCJvbkRpc2Nvbm5lY3RlZCIsInBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uIiwiX3ZhcmlhYmxlcyIsImRlZmluZVZhcmlhYmxlIiwib3ZlcndyaXRlIiwiZ2V0VmFyaWFibGUiLCJyZW1vdmVWYXJpYWJsZSIsImdldEFsbFZhcmlhYmxlcyIsIl9wYXJzZVBhcnQiLCJwYXJ0IiwiaW5JbnRlcnBvbGF0aW9uIiwiY3VycmVudEluZGV4Iiwic3Vic3RyaW5nIiwiX3JlcGxhY2VUb2tlbiIsInJlIiwidmFyaWFibGUiLCJydiIsIl9yZXBsYWNlVG9rZW5zIiwiX3BhcnNlRXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJldmFsdWF0ZSIsImdldElPU0RldmljZSIsImlzV2ViVmlldyIsImF1dG9TdGF0dXNCYXJGaWxsIiwiYW5pbWF0aW9uc0Rpc2FibGVkIiwibnVsbEVsZW1lbnQiLCJpc0VuYWJsZWRBdXRvU3RhdHVzQmFyRmlsbCIsIm5vcm1hbGl6ZVBhZ2VIVE1MIiwid2FpdERPTUNvbnRlbnRMb2FkZWQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJvblJlYWR5Iiwic2hvdWxkRmlsbFN0YXR1c0JhciIsImlzSU9TN2Fib3ZlIiwiaXNJUGhvbmVYIiwidGVtcGxhdGVTdG9yZSIsIl9zdG9yYWdlIiwiZ2V0VGVtcGxhdGVIVE1MQXN5bmMiLCJjYWNoZSIsImxvY2FsIiwiZ2V0RWxlbWVudEJ5SWQiLCJ0ZXh0Q29udGVudCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlVGV4dCIsInN0YXR1cyIsImZyYWdtZW50IiwiY3JlYXRlVGV4dE5vZGUiLCJ0ZXh0IiwicmVwbGFjZUNoaWxkIiwib25lcnJvciIsInNlbmQiLCJnZXRQYWdlSFRNTEFzeW5jIiwicGFnZXMiLCJnZXRQYWdlIiwiY2F0Y2giLCJBbmltYXRvckZhY3RvcnkiLCJfYW5pbWF0b3JzIiwiYW5pbWF0b3JzIiwiX2Jhc2VDbGFzcyIsImJhc2VDbGFzcyIsIl9iYXNlQ2xhc3NOYW1lIiwiYmFzZUNsYXNzTmFtZSIsIl9hbmltYXRpb24iLCJkZWZhdWx0QW5pbWF0aW9uIiwiX2FuaW1hdGlvbk9wdGlvbnMiLCJkZWZhdWx0QW5pbWF0aW9uT3B0aW9ucyIsImRlZmF1bHRBbmltYXRvciIsImFuaW1hdG9yIiwiYW5pbWF0aW9uIiwiQW5pbWF0b3IiLCJhbmltYXRpb25PcHRzIiwiYW5pbWF0aW9uT3B0aW9ucyIsImR1cmF0aW9uIiwiZGVsYXkiLCJfcmVhZHkiLCJfZG9tQ29udGVudExvYWRlZCIsIl9vbkRPTUNvbnRlbnRMb2FkZWQiLCJhZGRCYWNrQnV0dG9uTGlzdGVuZXIiLCJyZW1vdmVCYWNrQnV0dG9uTGlzdGVuZXIiLCJIYW5kbGVyUmVwb3NpdG9yeSIsIl9zdG9yZSIsIl9nZW5JZCIsImRhdGFzZXQiLCJkZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkIiwiaWQiLCJoYXMiLCJEZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciIsIl9pc0VuYWJsZWQiLCJfYm91bmRDYWxsYmFjayIsIl9jYWxsYmFjayIsImNyZWF0ZUV2ZW50IiwiaW5pdEV2ZW50IiwiX2Rpc3BhdGNoRGV2aWNlQmFja0J1dHRvbkV2ZW50IiwiX2VsZW1lbnQiLCJzZXRMaXN0ZW5lciIsImRlc3Ryb3kiLCJ0cmVlIiwiX2NhcHR1cmVUcmVlIiwiX2ZpbmRIYW5kbGVyTGVhZkVsZW1lbnQiLCJjYWxsUGFyZW50SGFuZGxlciIsImNyZWF0ZVRyZWUiLCJhcnJheU9mIiwiY2hpbGRFbGVtZW50IiwiZGlzcGxheSIsIl9pc1Nob3duIiwic3ViVHJlZSIsImZpbmQiLCJjaGlsZE5vZGUiLCJsZWZ0IiwicmlnaHQiLCJsZWZ0WiIsInpJbmRleCIsInJpZ2h0WiIsImRiYkRpc3BhdGNoZXIiLCJkZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciIsIm9ucyIsInJlZ2lzdGVyIiwidGVtcGxhdGVzIiwiX29uc0xvYWRlZCIsIl91dGlsIiwicmVhZHkiLCJlbmFibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlciIsIl9kZWZhdWx0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXIiLCJfaW50ZXJuYWwiLCJjcmVhdGVIYW5kbGVyIiwiYXBwIiwiZXhpdEFwcCIsIl9nZXN0dXJlRGV0ZWN0b3IiLCJHZXN0dXJlRGV0ZWN0b3IiLCJwYXNzaXZlIiwia2V5Q29kZSIsImZpcmVEZXZpY2VCYWNrQnV0dG9uRXZlbnQiLCJfc2V0dXBMb2FkaW5nUGxhY2VIb2xkZXJzIiwiVElNRU9VVF9SQVRJTyIsImNhcGl0YWxpemUiLCJzdHIiLCJidWlsZFRyYW5zaXRpb25WYWx1ZSIsInBhcmFtcyIsInByb3BlcnR5IiwidGltaW5nIiwicHJvcCIsIm9uY2VPblRyYW5zaXRpb25FbmQiLCJfdHJhbnNpdGlvbkVuZEV2ZW50cyIsInN0b3BQcm9wYWdhdGlvbiIsInZlbmRvclByZWZpeCIsIl9jc3NQcm9wZXJ0eURpY3QiLCJhIiwieiIsInVwcGVyIiwiaGFzQ3NzUHJvcGVydHkiLCJwcmUiLCJmb3JjZUxheW91dEF0T25jZSIsImJhdGNoSW1tZWRpYXRlIiwib2Zmc2V0SGVpZ2h0IiwiY2FsbGJhY2tzIiwiY29uY3JlYXRlQ2FsbGJhY2tzIiwiYmF0Y2hBbmltYXRpb25GcmFtZSIsInJhZiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtc1JlcXVlc3RBbmltYXRpb25GcmFtZSIsInRyYW5zaXRpb25Qcm9wZXJ0eU5hbWUiLCJBbmltaXQiLCJkZWZhdWx0cyIsInRyYW5zaXRpb25RdWV1ZSIsImxhc3RTdHlsZUF0dHJpYnV0ZURpY3QiLCJwbGF5IiwiZG9uZSIsInN0YXJ0QW5pbWF0aW9uIiwiZGVmYXVsdCIsInRvIiwic3RlcCIsImNzcyIsInNhdmVTdHlsZSIsIndhaXQiLCJyZXN0b3JlU3R5bGUiLCJ0cmFuc2l0aW9uIiwiVHJhbnNpdGlvbiIsImJ1aWxkIiwic2Vjb25kcyIsInRyYW5zaXRpb25OYW1lIiwidHJhbnNpdGlvblZhbHVlIiwidGltZW91dElkIiwiY2xlYXJUcmFuc2l0aW9uIiwiY2xlYXJUaW1lb3V0IiwibGVuIiwicmVzZXQiLCJfZGVxdWV1ZVRyYW5zaXRpb24iLCJfY3VycmVudFRyYW5zaXRpb24iLCJjYWxsZWQiLCJydW5BbGwiLCJjcmVhdGVBY3R1YWxDc3NQcm9wcyIsInRpbWVvdXQiLCJwcmVmaXhlZCIsIkV2ZW50IiwiVXRpbHMiLCJEZXRlY3Rpb24iLCJQb2ludGVyRXZlbnQiLCJJbnN0YW5jZSIsImJlaGF2aW9yIiwidG91Y2hBY3Rpb24iLCJ0b3VjaENhbGxvdXQiLCJjb250ZW50Wm9vbWluZyIsInVzZXJEcmFnIiwidGFwSGlnaGxpZ2h0Q29sb3IiLCJET0NVTUVOVCIsIkhBU19QT0lOVEVSRVZFTlRTIiwicG9pbnRlckVuYWJsZWQiLCJtc1BvaW50ZXJFbmFibGVkIiwiSEFTX1RPVUNIRVZFTlRTIiwiSVNfTU9CSUxFIiwiTk9fTU9VU0VFVkVOVFMiLCJDQUxDVUxBVEVfSU5URVJWQUwiLCJFVkVOVF9UWVBFUyIsIkRJUkVDVElPTl9ET1dOIiwiRElSRUNUSU9OX0xFRlQiLCJESVJFQ1RJT05fVVAiLCJESVJFQ1RJT05fUklHSFQiLCJQT0lOVEVSX01PVVNFIiwiUE9JTlRFUl9UT1VDSCIsIlBPSU5URVJfUEVOIiwiRVZFTlRfU1RBUlQiLCJFVkVOVF9NT1ZFIiwiRVZFTlRfRU5EIiwiRVZFTlRfUkVMRUFTRSIsIkVWRU5UX1RPVUNIIiwiUkVBRFkiLCJwbHVnaW5zIiwiZ2VzdHVyZXMiLCJkZXRlcm1pbmVFdmVudFR5cGVzIiwib25Ub3VjaCIsImRldGVjdCIsInV0aWxzIiwiZGVzdCIsInNyYyIsIm1lcmdlIiwiaXRlcmF0b3IiLCJjb250ZXh0IiwiaW5TdHIiLCJpbkFycmF5IiwiZGVlcCIsImV2ZXJ5IiwidG9BcnJheSIsImhhc1BhcmVudCIsImdldENlbnRlciIsInRvdWNoZXMiLCJwYWdlWCIsInBhZ2VZIiwiY2xpZW50WCIsImNsaWVudFkiLCJtaW4iLCJtYXgiLCJ0b3VjaCIsImdldFZlbG9jaXR5IiwiZGVsdGFYIiwiZGVsdGFZIiwieCIsImFicyIsInkiLCJnZXRBbmdsZSIsInRvdWNoMSIsInRvdWNoMiIsImF0YW4yIiwiUEkiLCJnZXREaXJlY3Rpb24iLCJnZXREaXN0YW5jZSIsInNxcnQiLCJnZXRTY2FsZSIsInN0YXJ0IiwiZW5kIiwiZ2V0Um90YXRpb24iLCJpc1ZlcnRpY2FsIiwiZGlyZWN0aW9uIiwic2V0UHJlZml4ZWRDc3MiLCJwcmVmaXhlcyIsInRvQ2FtZWxDYXNlIiwidG9nZ2xlQmVoYXZpb3IiLCJmYWxzZUZuIiwidXNlclNlbGVjdCIsIm9uc2VsZWN0c3RhcnQiLCJvbmRyYWdzdGFydCIsInByZXZlbnRNb3VzZUV2ZW50cyIsInN0YXJ0ZWQiLCJzaG91bGREZXRlY3QiLCJob29rIiwidHlwZXMiLCJldmVudFR5cGUiLCJvblRvdWNoSGFuZGxlciIsImV2Iiwic3JjVHlwZSIsImlzUG9pbnRlciIsImlzTW91c2UiLCJ0cmlnZ2VyVHlwZSIsImJ1dHRvbiIsImJ1dHRvbnMiLCJtYXRjaFR5cGUiLCJ1cGRhdGVQb2ludGVyIiwiZG9EZXRlY3QiLCJ0b3VjaExpc3QiLCJnZXRUb3VjaExpc3QiLCJ0b3VjaExpc3RMZW5ndGgiLCJ0cmlnZ2VyQ2hhbmdlIiwidHJpZ2dlciIsImNoYW5nZWRMZW5ndGgiLCJjaGFuZ2VkVG91Y2hlcyIsImV2RGF0YSIsImNvbGxlY3RFdmVudERhdGEiLCJpZGVudGlmaWVycyIsImlkZW50aWZpZXIiLCJwb2ludGVyVHlwZSIsImNlbnRlciIsInRpbWVTdGFtcCIsIkRhdGUiLCJub3ciLCJzcmNFdmVudCIsInByZXZlbnRNYW5pcHVsYXRpb24iLCJzdG9wRGV0ZWN0IiwicG9pbnRlcnMiLCJ0b3VjaGxpc3QiLCJwb2ludGVyIiwicG9pbnRlckV2ZW50IiwicG9pbnRlcklkIiwicHQiLCJNU1BPSU5URVJfVFlQRV9NT1VTRSIsIk1TUE9JTlRFUl9UWVBFX1RPVUNIIiwiTVNQT0lOVEVSX1RZUEVfUEVOIiwicmVzZXRMaXN0IiwiZGV0ZWN0aW9uIiwicHJldmlvdXMiLCJzdG9wcGVkIiwic3RhcnREZXRlY3QiLCJpbnN0IiwiZXZlbnREYXRhIiwic3RhcnRFdmVudCIsImxhc3RFdmVudCIsImxhc3RDYWxjRXZlbnQiLCJmdXR1cmVDYWxjRXZlbnQiLCJsYXN0Q2FsY0RhdGEiLCJleHRlbmRFdmVudERhdGEiLCJpbnN0T3B0aW9ucyIsInRyaWdnZXJHZXN0dXJlIiwiZW5hYmxlZCIsImdldENhbGN1bGF0ZWREYXRhIiwiY3VyIiwicmVjYWxjIiwiY2FsY0V2IiwiY2FsY0RhdGEiLCJ2ZWxvY2l0eSIsImFuZ2xlIiwidmVsb2NpdHlYIiwidmVsb2NpdHlZIiwiaW50ZXJpbUFuZ2xlIiwiaW50ZXJpbURpcmVjdGlvbiIsInN0YXJ0RXYiLCJsYXN0RXYiLCJzY2FsZSIsInJvdGF0aW9uIiwiYiIsImxpc3RlbmVyT3B0aW9ucyIsImV2ZW50U3RhcnRIYW5kbGVyIiwiZXZlbnRIYW5kbGVycyIsIm9uRXZlbnQiLCJvZmZFdmVudCIsInRyaWdnZXJFdmVudCIsInN0YXRlIiwiZGlzcG9zZSIsImVoIiwidHJpZ2dlcmVkIiwiZHJhZ0dlc3R1cmUiLCJkcmFnTWF4VG91Y2hlcyIsImRyYWdNaW5EaXN0YW5jZSIsInN0YXJ0Q2VudGVyIiwiZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvbiIsImZhY3RvciIsImRyYWdMb2NrVG9BeGlzIiwiZHJhZ0xvY2tNaW5EaXN0YW5jZSIsImxhc3REaXJlY3Rpb24iLCJkcmFnQmxvY2tWZXJ0aWNhbCIsImRyYWdCbG9ja0hvcml6b250YWwiLCJEcmFnIiwiR2VzdHVyZSIsInJlbGVhc2VHZXN0dXJlIiwidGltZXIiLCJob2xkR2VzdHVyZSIsImhvbGRUaW1lb3V0IiwiaG9sZFRocmVzaG9sZCIsIkhvbGQiLCJSZWxlYXNlIiwiSW5maW5pdHkiLCJTd2lwZSIsInN3aXBlTWluVG91Y2hlcyIsInN3aXBlTWF4VG91Y2hlcyIsInN3aXBlVmVsb2NpdHlYIiwic3dpcGVWZWxvY2l0eVkiLCJzd2lwZUdlc3R1cmUiLCJoYXNNb3ZlZCIsInRhcEdlc3R1cmUiLCJwcmV2Iiwic2luY2VQcmV2IiwiZGlkRG91YmxlVGFwIiwidGFwTWF4RGlzdGFuY2UiLCJ0YXBNYXhUaW1lIiwiZG91YmxlVGFwSW50ZXJ2YWwiLCJkb3VibGVUYXBEaXN0YW5jZSIsInRhcEFsd2F5cyIsIlRhcCIsIlRvdWNoIiwicHJldmVudE1vdXNlIiwidG91Y2hHZXN0dXJlIiwidHJhbnNmb3JtR2VzdHVyZSIsInNjYWxlVGhyZXNob2xkIiwicm90YXRpb25UaHJlc2hvbGQiLCJ0cmFuc2Zvcm1NaW5TY2FsZSIsInRyYW5zZm9ybU1pblJvdGF0aW9uIiwiVHJhbnNmb3JtIiwicmVhZHlNYXAiLCJxdWV1ZU1hcCIsImlzQ29udGVudFJlYWR5Iiwic2V0Q29udGVudFJlYWR5IiwiYWRkQ2FsbGJhY2siLCJjb25zdW1lUXVldWUiLCJkZWxldGUiLCJjb250ZW50UmVhZHkiLCJjaGFuZ2VzIiwiVG9hc3RRdWV1ZSIsInRoZW4iLCJfc2V0QXR0cmlidXRlcyIsIl9ub3JtYWxpemVBcmd1bWVudHMiLCJfb2JqZWN0U3ByZWFkIiwibWVzc2FnZUhUTUwiLCJidXR0b25MYWJlbHMiLCJidXR0b25MYWJlbCIsImlzQXJyYXkiLCJjb21waWxlIiwicGFyYW0iLCJwcmltYXJ5QnV0dG9uSW5kZXgiLCJub3RpZmljYXRpb24iLCJfY3JlYXRlQWxlcnREaWFsb2ciLCJpbnB1dFN0cmluZyIsImlzUHJvbXB0IiwiaW5wdXRUeXBlIiwicGxhY2Vob2xkZXIiLCJkZWZhdWx0VmFsdWUiLCJsYWJlbCIsIl9kZXN0cm95RGlhbG9nIiwiZGlhbG9nIiwib25EaWFsb2dDYW5jZWwiLCJtYXNrQ29sb3IiLCJ0aXRsZSIsImlucHV0Iiwic3VibWl0T25FbnRlciIsIm9ua2V5cHJlc3MiLCJoaWRlIiwicmVzb2x2ZVZhbHVlIiwiZm9vdGVyIiwiYnV0dG9uRWxlbWVudCIsIm9uY2xpY2siLCJzaG93IiwiYXV0b2ZvY3VzIiwic3RyTGVuZ3RoIiwiZm9jdXMiLCJpbmNsdWRlcyIsInNldFNlbGVjdGlvblJhbmdlIiwiYWxlcnQiLCJjb25maXJtIiwicHJvbXB0IiwidG9hc3QiLCJvcmlnaW5hbEhpZGUiLCJmaW5pc2giLCJfdG9hc3QiLCJjaGVja09wdGlvbnMiLCJlcnIiLCJpbnN0YW5jZU9mIiwiY2IiLCJkIiwiYWN0aW9uU2hlZXQiLCJjbGFzcyIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJpdGVtIiwiYnV0dG9uT3B0aW9ucyIsImRlc3RydWN0aXZlIiwiaWNvbiIsIl9pc1BvcnRyYWl0IiwiaXNQb3J0cmFpdCIsImlzTGFuZHNjYXBlIiwiX2luaXQiLCJfb25PcmllbnRhdGlvbkNoYW5nZSIsIl9vblJlc2l6ZSIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsIl9pbnN0YWxsSXNQb3J0cmFpdEltcGxlbWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJuSXRlciIsImludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJ3IiwiaCIsImNsZWFySW50ZXJ2YWwiLCJtb2RpZmllcnMiLCJzb2Z0d2FyZUtleWJvYXJkIiwiX3Zpc2libGUiLCJvblNob3ciLCJvbkhpZGUiLCJiaW5kRXZlbnRzIiwiS2V5Ym9hcmQiLCJvbnNob3ciLCJvbmhpZGUiLCJ2aXNpYmxlIiwiaXNWaXNpYmxlIiwibm9QbHVnaW5FcnJvciIsImdlbmVyYXRlSWQiLCJEb29yTG9jayIsIl9sb2NrTGlzdCIsIl93YWl0TGlzdCIsIl9sb2ciLCJsb2ciLCJ1bmxvY2siLCJfdW5sb2NrIiwiX3RyeVRvRnJlZVdhaXRMaXN0IiwiaXNMb2NrZWQiLCJsb2FkUGFnZSIsInBhZ2VFbGVtZW50IiwidW5sb2FkUGFnZSIsIl9kZXN0cm95IiwiUGFnZUxvYWRlciIsImxvYWRlciIsInVubG9hZGVyIiwiX2xvYWRlciIsIl91bmxvYWRlciIsIkVsZW1lbnQiLCJkZWZhdWx0UGFnZUxvYWRlciIsImluc3RhbnRQYWdlTG9hZGVyIiwiYW5pbWl0IiwiX2F1dG9TdHlsZSIsIl9yZWFkeUxvY2siLCJzZWxlY3QiLCJsb2NhdGlvbiIsInNlYXJjaCIsIndhaXREZXZpY2VSZWFkeSIsInJlYWR5RXJyb3IiLCJhZnRlciIsImlzUmVhZHkiLCJ3YWl0VW5sb2NrIiwic2V0RGVmYXVsdERldmljZUJhY2tCdXR0b25MaXN0ZW5lciIsImxpc3RlbmVyIiwiZGlzYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyIiwiZW5hYmxlQXV0b1N0YXR1c0JhckZpbGwiLCJkaXNhYmxlQXV0b1N0YXR1c0JhckZpbGwiLCJtb2NrU3RhdHVzQmFyIiwibW9jayIsImRpc2FibGVBbmltYXRpb25zIiwiZW5hYmxlQW5pbWF0aW9ucyIsIl9kaXNhYmxlV2FybmluZ3MiLCJfZW5hYmxlV2FybmluZ3MiLCJkaXNhYmxlQXV0b1N0eWxpbmciLCJlbmFibGVBdXRvU3R5bGluZyIsImRpc2FibGVJY29uQXV0b1ByZWZpeCIsIkljb24iLCJzZXRBdXRvUHJlZml4IiwiZm9yY2VQbGF0Zm9ybVN0eWxpbmciLCJuZXdQbGF0Zm9ybSIsIl9wbGF0Zm9ybVVwZGF0ZSIsIl91cGRhdGVQb3NpdGlvbiIsInByZWxvYWQiLCJhbGwiLCJhcHBlbmQiLCJsaW5rIiwiY3JlYXRlUG9wb3ZlciIsImNyZWF0ZURpYWxvZyIsImNyZWF0ZUFsZXJ0RGlhbG9nIiwib3BlbkFjdGlvblNoZWV0IiwicmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlciIsIl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyIiwidW5sb2NrRGV2aWNlUmVhZHkiLCJsb2NrIiwiZ2V0Q1MiLCJjdXJyZW50U2NyaXB0Iiwic2NyaXB0cyIsImdldFNjcmlwdFBhZ2UiLCJnZXRFbGVtZW50Q2xhc3MiLCJCYXNlRWxlbWVudCIsIklmRWxlbWVudCIsIl9pc0FsbG93ZWRQbGF0Zm9ybSIsImNvbmRpdGlvbmFsT3JpZW50YXRpb24iLCJjdXJyZW50T3JpZW50YXRpb24iLCJJZiIsImRlZmluZSIsIkJhc2VBbmltYXRvciIsImRlZiIsInByb3BlcnRpZXMiLCJleHRlbmRlZEFuaW1hdG9yIiwibmV3QW5pbWF0b3IiLCJpUGhvbmVYUGF0Y2giLCJpc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlIiwiaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUiLCJnZXRTYWZlQXJlYUxlbmd0aHMiLCJzYWZlQXJlYUxlbmd0aHMiLCJ0b3AiLCJib3R0b20iLCJnZXRTYWZlQXJlYURPTVJlY3QiLCJzYWZlQXJlYVJlY3QiLCJBY3Rpb25TaGVldEFuaW1hdG9yIiwiTURBY3Rpb25TaGVldEFuaW1hdG9yIiwibWFza1RpbWluZyIsIm1hc2tEdXJhdGlvbiIsIl9tYXNrIiwib3BhY2l0eSIsIl9zaGVldCIsInRyYW5zZm9ybSIsIklPU0FjdGlvblNoZWV0QW5pbWF0b3IiLCJsaWZ0QW1vdW50IiwiY2xpZW50SGVpZ2h0IiwiQmFzZURpYWxvZ0VsZW1lbnQiLCJjb25zdHJ1Y3RvciIsIl9kb29yTG9jayIsIl9jYW5jZWwiLCJfc2VsZkNhbWVsTmFtZSIsIl9kZWZhdWx0REJCIiwiX2FuaW1hdG9yRmFjdG9yeSIsIl91cGRhdGVBbmltYXRvckZhY3RvcnkiLCJzaG91bGRTaG93IiwiX2JhY2tCdXR0b25IYW5kbGVyIiwiX2JhY2tCdXR0b25DYWxsYmFjayIsIl9ydW5uaW5nIiwiX3NldFZpc2libGUiLCJjYW5jZWxlZCIsIl90b2dnbGVTdHlsZSIsInBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyIsInN0cmluZ2lmeSIsImJhY2tncm91bmRDb2xvciIsIm9uRGV2aWNlQmFja0J1dHRvbiIsIm9uTW9kaWZpZXJDaGFuZ2VkIiwiX3NjaGVtZSIsIl91cGRhdGVBbmltYXRpb24iLCJfdXBkYXRlTWFzayIsIl9hbmltYXRvckRpY3QiLCJBY3Rpb25TaGVldEVsZW1lbnQiLCJfY29tcGlsZSIsInNoZWV0IiwiX3RpdGxlIiwiaGlkZGVuIiwibWFzayIsImluaXRNb2RpZmllciIsIl91cGRhdGVUaXRsZSIsIkFjdGlvblNoZWV0IiwiQW5pbWF0b3JDU1MiLCJfcXVldWUiLCJfaW5kZXgiLCJmaW5hbCIsImdldFRpbWUiLCJpbml0aWFsIiwibmV4dCIsInVwZGF0ZVN0eWxlcyIsInN0b3AiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJzdG9wTmV4dCIsInNwZWVkIiwibmV3RHVyYXRpb24iLCJwYXNzZWQiLCJyZW1haW5pbmciLCJzcGVlZFVwVGltZSIsIm1pbGxpc2Vjb25kcyIsInYiLCJwYXJzZUZsb2F0IiwidHJhbnNpdGlvblByb3BlcnR5IiwiX29uU3RvcEFuaW1hdGlvbnMiLCJzdG9wQW5pbWF0aW9ucyIsImFuaW1hdGUiLCJkZWZhdWx0Q2xhc3NOYW1lIiwiUmlwcGxlRWxlbWVudCIsIl9vblRhcCIsIl9vbkhvbGQiLCJfb25EcmFnU3RhcnQiLCJfb25SZWxlYXNlIiwiX2FuaW1hdG9yIiwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIiwiX3dhdmUiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiX2JhY2tncm91bmQiLCJzaXplcyIsInNpemUiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfZ2V0RWZmZWN0U2l6ZSIsIl9jZW50ZXIiLCJyb3VuZCIsIl9taW5SIiwiX2NhbGN1bGF0ZUNvb3JkcyIsInN0b3BBbGwiLCJjb21wdXRlZFN0eWxlIiwiZGlzYWJsZWQiLCJyaXBwbGUiLCJfdXBkYXRlUGFyZW50IiwiX3JpcHBsZUFuaW1hdGlvbiIsImZhZGUiLCJfaG9sZGluZyIsIl9wYXJlbnROb2RlIiwicG4iLCJiYWNrZ3JvdW5kIiwiUmlwcGxlIiwiQmFzZUJ1dHRvbkVsZW1lbnQiLCJfZGVmYXVsdENsYXNzTmFtZSIsIl9pY29uIiwiX2hpZGRlbkJ1dHRvbiIsIl91cGRhdGVSaXBwbGUiLCJfcmlwcGxlT3B0IiwiX3VwZGF0ZUljb24iLCJBY3Rpb25TaGVldEJ1dHRvbkVsZW1lbnQiLCJBY3Rpb25TaGVldEJ1dHRvbiIsIkFsZXJ0RGlhbG9nQW5pbWF0b3IiLCJBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciIsIl9kaWFsb2ciLCJJT1NBbGVydERpYWxvZ0FuaW1hdG9yIiwiQWxlcnREaWFsb2dFbGVtZW50IiwiQWxlcnREaWFsb2ciLCJBbGVydERpYWxvZ0J1dHRvbkVsZW1lbnQiLCJBbGVydERpYWxvZ0J1dHRvbiIsImlvc0JhY2tCdXR0b25JY29uIiwibWRCYWNrQnV0dG9uSWNvbiIsIkJhY2tCdXR0b25FbGVtZW50IiwiX29wdGlvbnMiLCJfYm91bmRPbkNsaWNrIiwiX29uQ2xpY2siLCJfY29ubmVjdE9uQ2xpY2siLCJfZGlzY29ubmVjdE9uQ2xpY2siLCJkZWZhdWx0UHJldmVudGVkIiwicG9wUGFnZSIsIm9uc0JhY2tCdXR0b24iLCJCYWNrQnV0dG9uIiwiQm90dG9tVG9vbGJhckVsZW1lbnQiLCJCb3R0b21Ub29sYmFyIiwiQnV0dG9uRWxlbWVudCIsIkJ1dHRvbiIsIkNhcmRFbGVtZW50IiwiQ2FyZCIsIkNhcm91c2VsSXRlbUVsZW1lbnQiLCJDYXJvdXNlbEl0ZW0iLCJkaXJlY3Rpb25NYXAiLCJ2ZXJ0aWNhbCIsImF4aXMiLCJkaXIiLCJ0M2QiLCJob3Jpem9udGFsIiwiU3dpcGVyIiwiRkFMU0UiLCJnZXRFbGVtZW50Iiwic2Nyb2xsSG9vayIsIml0ZW1TaXplIiwiZ2V0QXV0b1Njcm9sbFJhdGlvIiwicmF0aW8iLCJzaG91bGRCbG9jayIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnIiwib25EcmFnRW5kIiwib25SZXNpemUiLCJfc2hvdWxkRml4U2Nyb2xsIiwic3dpcGVhYmxlIiwiYXV0b1JlZnJlc2giLCJpbml0aWFsaXplZCIsImJsb2NrZXIiLCJfbXV0YXRpb25PYnNlcnZlciIsInVwZGF0ZVN3aXBlYWJsZSIsInVwZGF0ZUF1dG9SZWZyZXNoIiwiX3Njcm9sbCIsIl9vZmZzZXQiLCJfbGFzdEFjdGl2ZUluZGV4IiwiX3VwZGF0ZUxheW91dCIsIl9zZXR1cEluaXRpYWxJbmRleCIsInNldHVwUmVzaXplIiwiaXRlbU51bVNpemUiLCJfcmVzZXQiLCJzZXRBY3RpdmVJbmRleCIsIl9pdGVtTnVtU2l6ZSIsIl9jYWxjdWxhdGVJdGVtU2l6ZSIsIml0ZW1Db3VudCIsInRhcmdldFNpemUiLCJjZWlsIiwiTnVtYmVyIiwiZ2V0SW5pdGlhbEluZGV4IiwiX3Njcm9sbFRvIiwiX3NldFN3aXBpbmciLCJzY3JvbGwiLCJtYXhTY3JvbGwiLCJfY2hhbmdlVG8iLCJjb3VudCIsInNob3VsZFVwZGF0ZSIsInNob3VsZFdhdGNoIiwibmV3U2l6ZSIsImJsb2NrIiwicG9pbnRlckV2ZW50cyIsImlzRmlyc3QiLCJpc092ZXJTY3JvbGxhYmxlIiwiaXNMYXN0IiwiX2lnbm9yZURyYWciLCJjb25zdW1lZCIsImNvbnN1bWUiLCJfY2FuQ29uc3VtZUdlc3R1cmUiLCJzdGFydFgiLCJkaXN0RnJvbUVkZ2UiLCJnZXRCdWJibGVXaWR0aCIsIl9zdGFydGVkIiwidG9nZ2xlQmxvY2tlciIsIl9jb250aW51ZWQiLCJfZ2V0RGVsdGEiLCJ0aHJvdHRsZSIsIm5vcm1hbGl6ZWRTY3JvbGwiLCJfbm9ybWFsaXplU2Nyb2xsIiwiX3N0YXJ0TW9tZW50dW1TY3JvbGwiLCJfa2lsbE92ZXJTY3JvbGwiLCJfZ2V0VmVsb2NpdHkiLCJtYXRjaGVzRGlyZWN0aW9uIiwiZE0iLCJuZXh0U2Nyb2xsIiwiX2dldEF1dG9TY3JvbGwiLCJzd2lwZSIsImtpbGxPdmVyU2Nyb2xsIiwib3ZlclNjcm9sbEhvb2siLCJhY3RpdmVJbmRleCIsImdldEFjdGl2ZUluZGV4IiwibGFzdEFjdGl2ZUluZGV4IiwiY2hhbmdlIiwicHJlQ2hhbmdlSG9vayIsInBvc3RDaGFuZ2VIb29rIiwidG9GaXhlZCIsIl9nZXRUcmFuc2Zvcm0iLCJvZmZzZXQiLCJpc0F1dG9TY3JvbGxhYmxlIiwiYXJyIiwicG9zIiwibGFzdFNjcm9sbCIsInNjcm9sbFJhdGlvIiwiX3RhcmdldFNpemUiLCJyZWZyZXNoSG9vayIsIm5leHRFbGVtZW50U2libGluZyIsImlzQ2VudGVyZWQiLCJDYXJvdXNlbEVsZW1lbnQiLCJfY29ubmVjdE9uU3dpcGUiLCJfZGlzY29ubmVjdE9uU3dpcGUiLCJfc3dpcGVyIiwiYXV0b1Njcm9sbFJhdGlvIiwib3ZlcnNjcm9sbGFibGUiLCJjZW50ZXJlZCIsImF1dG9TY3JvbGwiLCJfb25PdmVyU2Nyb2xsIiwiX29uUHJlQ2hhbmdlIiwiX29uUG9zdENoYW5nZSIsIl9vblJlZnJlc2giLCJpbml0IiwidXBkYXRlSXRlbVNpemUiLCJ3YWl0Rm9yQWN0aW9uIiwiY2Fyb3VzZWwiLCJ3YWl0VG9SZXR1cm4iLCJpdGVtU2l6ZUF0dHIiLCJhdHRyIiwiQ2Fyb3VzZWwiLCJDb2xFbGVtZW50IiwiX3VwZGF0ZVdpZHRoIiwiZmxleCIsIm1heFdpZHRoIiwiQ29sIiwiRGlhbG9nQW5pbWF0b3IiLCJBbmRyb2lkRGlhbG9nQW5pbWF0b3IiLCJJT1NEaWFsb2dBbmltYXRvciIsImJvZHlIZWlnaHQiLCJTbGlkZURpYWxvZ0FuaW1hdG9yIiwiRGlhbG9nRWxlbWVudCIsIkRpYWxvZyIsIkZhYkVsZW1lbnQiLCJfaGlkZSIsIl9zaG93IiwiX21hbnVhbGx5SGlkZGVuIiwiX3RvZ2dsZSIsImlzQm90dG9tIiwidHJhbnNsYXRlIiwiRmFiIiwiR2VzdHVyZURldGVjdG9yRWxlbWVudCIsImF1dG9QcmVmaXgiLCJJY29uRWxlbWVudCIsIl9jbGVhbkNsYXNzQXR0cmlidXRlIiwiX3VwZGF0ZSIsIl9idWlsZENsYXNzQW5kU3R5bGUiLCJfcGFyc2VBdHRyIiwicGFydHMiLCJtZCIsImxhc3RJY29uIiwibGFzdE1vZGlmaWVyIiwiX3ByZWZpeEljb24iLCJjdXN0b21QcmVmaXhSRSIsImljb25OYW1lIiwicmVtb3ZlUHJvcGVydHkiLCJmb250U2l6ZSIsIkxhenlSZXBlYXREZWxlZ2F0ZSIsInVzZXJEZWxlZ2F0ZSIsInRlbXBsYXRlRWxlbWVudCIsIl91c2VyRGVsZWdhdGUiLCJfdGVtcGxhdGVFbGVtZW50IiwiaXRlbUhlaWdodCIsIl9yZW5kZXIiLCJsb2FkSXRlbUVsZW1lbnQiLCJjcmVhdGVJdGVtQ29udGVudCIsImNvdW50SXRlbXMiLCJ1cGRhdGVJdGVtQ29udGVudCIsImNhbGN1bGF0ZUl0ZW1IZWlnaHQiLCJkZXN0cm95SXRlbSIsIkxhenlSZXBlYXRQcm92aWRlciIsIndyYXBwZXJFbGVtZW50IiwiZGVsZWdhdGUiLCJfd3JhcHBlckVsZW1lbnQiLCJfZGVsZWdhdGUiLCJfaW5zZXJ0SW5kZXgiLCJfcGFnZUNvbnRlbnQiLCJfZmluZFBhZ2VDb250ZW50RWxlbWVudCIsImxhc3RTY3JvbGxUb3AiLCJzY3JvbGxUb3AiLCJwYWRkaW5nIiwiX3RvcFBvc2l0aW9ucyIsIl9yZW5kZXJlZEl0ZW1zIiwiX3Vua25vd25JdGVtSGVpZ2h0IiwiX2FkZEV2ZW50TGlzdGVuZXJzIiwiX29uQ2hhbmdlIiwicGFkZGluZ1RvcCIsIm5ld1ZhbHVlIiwicGFnZUNvbnRlbnQiLCJfaXRlbUhlaWdodCIsInZpc2liaWxpdHkiLCJzdGF0aWNJdGVtSGVpZ2h0IiwiX2dldEl0ZW1IZWlnaHQiLCJmb3JjZVJlbmRlciIsImZvcmNlU2Nyb2xsRG93biIsImZpcnN0SXRlbUluZGV4IiwiX2ZpcnN0SXRlbVJlbmRlcmVkIiwiX2NhbGN1bGF0ZVJlbmRlcmVkSGVpZ2h0IiwiZm9yY2VGaXJzdEluZGV4IiwiX3JlbW92ZUFsbEVsZW1lbnRzIiwiZm9yY2VMYXN0SW5kZXgiLCJfY2hlY2tJdGVtSGVpZ2h0IiwiaXNTY3JvbGxVcCIsImtlZXAiLCJfY291bnRJdGVtcyIsIl9jYWxjdWxhdGVTdGFydEluZGV4IiwiaGFzUmVuZGVyRnVuY3Rpb24iLCJfcmVuZGVyRWxlbWVudCIsImxhc3RJbmRleCIsIl9yZW1vdmVFbGVtZW50IiwidXBkYXRlSXRlbSIsImxhc3RJdGVtSW5kZXgiLCJfbGFzdEl0ZW1SZW5kZXJlZCIsIl9yZWNhbGN1bGF0ZVRvcFBvc2l0aW9ucyIsIm1pZGRsZSIsImltbWVkaWF0ZSIsImNhbGxOb3ciLCJfZGVib3VuY2UiLCJfYm91bmRPbkNoYW5nZSIsIl9ib3VuZERvdWJsZUZpcmVPblRvdWNoZW5kIiwiX3BhcmVudEVsZW1lbnQiLCJfcmVtb3ZlRXZlbnRMaXN0ZW5lcnMiLCJMYXp5UmVwZWF0RWxlbWVudCIsIl9sYXp5UmVwZWF0UHJvdmlkZXIiLCJMYXp5UmVwZWF0IiwiTGlzdEhlYWRlckVsZW1lbnQiLCJMaXN0SGVhZGVyIiwiTGlzdFRpdGxlRWxlbWVudCIsIkxpc3RUaXRsZSIsIkxpc3RJdGVtQW5pbWF0b3IiLCJsaXN0SXRlbSIsIlNsaWRlTGlzdEl0ZW1BbmltYXRvciIsIl9hbmltYXRlRXhwYW5zaW9uIiwic2hvdWxkT3BlbiIsIm9sZEhlaWdodCIsImV4cGFuZGFibGVDb250ZW50Iiwib2xkRGlzcGxheSIsImV4cGFuc2lvbk9wZW5UcmFuc2l0aW9uIiwicGFkZGluZ0JvdHRvbSIsImljb25PcGVuVHJhbnNpdGlvbiIsInJldmVyc2UiLCJleHBhbmRDaGV2cm9uIiwiTGlzdEl0ZW1FbGVtZW50IiwiX3Nob3VsZElnbm9yZVRhcCIsInNob3dFeHBhbnNpb24iLCJoaWRlRXhwYW5zaW9uIiwidG9wQ29udGVudCIsImNlbnRlckNvbnRlbnQiLCJfdG9wIiwiY2hldnJvbiIsImV4cGFuZGVkIiwiZXhwYW5kZWRBdFN0YXJ0dXAiLCJfZXhwYW5kaW5nIiwiZXhwYW5kZWRDYWxsYmFjayIsIl9zZXR1cExpc3RlbmVycyIsIl9vcmlnaW5hbEJhY2tncm91bmRDb2xvciIsInRhcHBlZCIsIl9vblRvdWNoIiwiX29uRHJhZyIsIl9vbkNsaWNrVG9wIiwidG9nZ2xlRXhwYW5zaW9uIiwidG91Y2hTdHlsZSIsImJveFNoYWRvdyIsIkxpc3RJdGVtIiwiTGlzdEVsZW1lbnQiLCJMaXN0IiwiSU5QVVRfQVRUUklCVVRFUyIsIkJhc2VJbnB1dEVsZW1lbnQiLCJfYm91bmREZWxlZ2F0ZUV2ZW50IiwiX2RlbGVnYXRlRXZlbnQiLCJfdGVtcGxhdGUiLCJfc2V0SW5wdXRJZCIsIl91cGRhdGVCb3VuZEF0dHJpYnV0ZXMiLCJfaW5wdXQiLCJ2YWwiLCJ0b0lTT1N0cmluZyIsImJsdXIiLCJJbnB1dEVsZW1lbnQiLCJfYm91bmRPbklucHV0IiwiX2JvdW5kT25Gb2N1c2luIiwiX3VwZGF0ZUxhYmVsIiwiX3VwZGF0ZUxhYmVsQ2xhc3MiLCJfaGVscGVyIiwiaW5uZXJUZXh0IiwiSW5wdXQiLCJCYXNlQ2hlY2tib3hFbGVtZW50IiwiY2hlY2tlZCIsIkNoZWNrYm94RWxlbWVudCIsIkNoZWNrYm94IiwiUmFkaW9FbGVtZW50IiwiUmFkaW8iLCJTZWFyY2hJbnB1dEVsZW1lbnQiLCJTZWFyY2hJbnB1dCIsIk1vZGFsQW5pbWF0b3IiLCJtb2RhbCIsIkZhZGVNb2RhbEFuaW1hdG9yIiwiTGlmdE1vZGFsQW5pbWF0b3IiLCJNb2RhbEVsZW1lbnQiLCJNb2RhbCIsIndpZHRoVG9QeCIsInB4Iiwib2Zmc2V0V2lkdGgiLCJTd2lwZVJldmVhbCIsImVsZW1lbnRIYW5kbGVyIiwiZ2V0VGhyZXNob2xkIiwiZ2V0U2lkZSIsImhhbmRsZUdlc3R1cmUiLCJnZXN0dXJlRGV0ZWN0b3IiLCJpZ25vcmVTd2lwZSIsIl93aWR0aCIsIl9zdGFydERpc3RhbmNlIiwiX2Rpc3RhbmNlIiwiaXNJbml0aWFsU3RhdGUiLCJkZWx0YSIsInN3aXBlTWlkIiwiaXNTd2lwZU1heCIsInN3aXBlTWF4Iiwic3dpcGVNaW4iLCJOYXZpZ2F0b3JBbmltYXRvciIsImVudGVyUGFnZSIsImxlYXZlUGFnZSIsIklPU1N3aXBlTmF2aWdhdG9yQW5pbWF0b3IiLCJkdXJhdGlvblJlc3RvcmUiLCJkdXJhdGlvblN3aXBlIiwidGltaW5nU3dpcGUiLCJyZXN0IiwiX2V4Y2x1ZGVkIiwib3B0U3dpcGUiLCJvcHRSZXN0b3JlIiwic3dpcGVTaGFkb3ciLCJpc0RyYWdTdGFydCIsInVuYmxvY2siLCJiYWNrZ3JvdW5kTWFzayIsImVudGVyIiwibGVhdmUiLCJkZWNvbXAiLCJfZGVjb21wb3NlIiwiX2NhbGN1bGF0ZURlbHRhIiwic2hvdWxkQW5pbWF0ZVRvb2xiYXIiLCJfc2hvdWxkQW5pbWF0ZVRvb2xiYXIiLCJ0b29sYmFyIiwiX3NhdmVTdHlsZSIsIm92ZXJmbG93RWxlbWVudCIsImlzU3dpcGluZyIsIl9kcmFnU3RhcnRTZXR1cCIsInN3aXBlUmF0aW8iLCJib3R0b21Ub29sYmFyIiwidG9vbGJhckNlbnRlciIsImJhY2tCdXR0b25MYWJlbCIsIm90aGVyIiwiX3NhdmVkU3R5bGUiLCJzYXZlIiwicmVzdG9yZSIsIl9yZXN0b3JlU3R5bGUiLCJ0cmFuc2xhdGUzZCIsIklPU1NsaWRlTmF2aWdhdG9yQW5pbWF0b3IiLCJfZ2V0VG9vbGJhckVsZW1lbnQiLCJfZ2V0VG9vbGJhckxlZnRJdGVtc0VsZW1lbnQiLCJfZ2V0VG9vbGJhclJpZ2h0SXRlbXNFbGVtZW50IiwiZXhjbHVkZUJhY2tCdXR0b24iLCJfZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCIsImJhY2tCdXR0b25JY29uIiwiX2dldFRvb2xiYXJCYWNrQnV0dG9uSWNvbkVsZW1lbnQiLCJfZ2V0VG9vbGJhckJhY2tCdXR0b25MYWJlbEVsZW1lbnQiLCJfZ2V0Q29udGVudEVsZW1lbnQiLCJfZ2V0QmFja2dyb3VuZEVsZW1lbnQiLCJfZ2V0Qm90dG9tVG9vbGJhckVsZW1lbnQiLCJ0b29sYmFycyIsImVudGVyVG9vbGJhciIsImxlYXZlVG9vbGJhciIsImlzU3RhdGljIiwiaXNNYXRlcmlhbCIsImlzVHJhbnNwYXJlbnQiLCJkZWNvbXBvc2l0aW9uIiwicGFnZVJlY3QiLCJsYWJlbFJlY3QiLCJlbnRlclBhZ2VUYXJnZXQiLCJsZWF2ZVBhZ2VUYXJnZXQiLCJlbnRlclBhZ2VEZWNvbXBvc2l0aW9uIiwibGVhdmVQYWdlRGVjb21wb3NpdGlvbiIsInBvcFN3aXBlIiwiSU9TTGlmdE5hdmlnYXRvckFuaW1hdG9yIiwiSU9TRmFkZU5hdmlnYXRvckFuaW1hdG9yIiwiTURTbGlkZU5hdmlnYXRvckFuaW1hdG9yIiwiYmxhY2tNYXNrT3BhY2l0eSIsIk1ETGlmdE5hdmlnYXRvckFuaW1hdG9yIiwibWFza0NsZWFyIiwiTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IiLCJ0aW1pbmdQb3AiLCJOb25lTmF2aWdhdG9yQW5pbWF0b3IiLCJyZXdyaXRhYmxlcyIsIm5hdmlnYXRvckVsZW1lbnQiLCJ2ZXJpZnlQYWdlRWxlbWVudCIsIk5hdmlnYXRvckVsZW1lbnQiLCJfaXNSdW5uaW5nIiwiX2luaXRpYWxpemVkIiwiX3BhZ2VMb2FkZXIiLCJfcGFnZU1hcCIsInBhZ2VMb2FkZXIiLCJfcGFnZSIsIl9vbkRldmljZUJhY2tCdXR0b24iLCJzd2lwZUFuaW1hdG9yIiwiX3N3aXBlIiwiX29uU3dpcGUiLCJzd2lwZVRvUG9wIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImFyZWEiLCJpc0JCIiwicHVzaGVkT3B0aW9ucyIsImFuaW1hdG9yRmFjdG9yeSIsImxvYWRlZCIsIl9nZXRQYWdlVGFyZ2V0IiwicHVzaFBhZ2UiLCJfdXBkYXRlTGFzdFBhZ2VCYWNrQnV0dG9uIiwidXBkYXRlIiwiX3ByZXBhcmVQYWdlQW5kT3B0aW9ucyIsInRpbWVzIiwiX3JlbW92ZVBhZ2VzIiwicG9wVXBkYXRlIiwidW5sb2FkIiwiX3BvcFBhZ2UiLCJfZW1pdFByZVBvcEV2ZW50IiwidXBkYXRlQmFja0J1dHRvbiIsInBvcCIsInBhZ2VIVE1MIiwiX3B1c2hQYWdlIiwibG9hZCIsIl9lbWl0UHJlUHVzaEV2ZW50IiwicGFnZUxlbmd0aCIsIl9yZXBsYWNlUGFnZSIsInJlc29sdmVkVmFsdWUiLCJfbm9ybWFsaXplSW5kZXgiLCJpbnNlcnRQYWdlIiwibmV3UGFnZSIsIl9sYXN0SW5kZXhPZlBhZ2UiLCJwYWdlTmFtZSIsImlzQ2FuY2VsZWQiLCJjdXJyZW50UGFnZSIsImNhbmNlbCIsIl9lbWl0UHJlRXZlbnQiLCJ0ZW1wbGF0ZUhUTUwiLCJsYXN0RWxlbWVudENoaWxkIiwiTmF2aWdhdG9yIiwiVG9vbGJhckVsZW1lbnQiLCJzaWJsaW5nQmFja2dyb3VuZCIsInNpYmxpbmdDb250ZW50Iiwic2V0VmlzaWJpbGl0eSIsIl9lbnN1cmVUb29sYmFySXRlbUVsZW1lbnRzIiwiX2Vuc3VyZVRvb2xiYXJFbGVtZW50IiwiVG9vbGJhciIsIlBhZ2VFbGVtZW50IiwiX2Rlcml2ZUhvb2tzIiwiX2JhY2tncm91bmRFbGVtZW50IiwiX2VsZW1lbnRTaG91bGRCZU1vdmVkIiwiX3RyeVRvRmlsbFN0YXR1c0JhciIsImZpeGVkRWxlbWVudHMiLCJvbkluaXQiLCJiYWNrQnV0dG9uIiwiX29uSW5maW5pdGVTY3JvbGwiLCJfYm91bmRPblNjcm9sbCIsIl9pbmZpbml0ZVNjcm9sbExpbWl0IiwiX29uU2Nyb2xsIiwib3ZlckxpbWl0Iiwic2Nyb2xsSGVpZ2h0IiwiX2xvYWRpbmdDb250ZW50Iiwib25JbmZpbml0ZVNjcm9sbCIsIm9uRGVzdHJveSIsImV2ZW50cyIsImVudW1lcmFibGUiLCJQYWdlIiwiUG9wb3ZlckFuaW1hdG9yIiwicG9wb3ZlciIsImFuaW1hdGlvbnMiLCJfYW5pbWF0ZSIsIm91dCIsImluIiwiTURGYWRlUG9wb3ZlckFuaW1hdG9yIiwiX2FuaW1hdGVBbGwiLCJfcG9wb3ZlciIsIklPU0ZhZGVQb3BvdmVyQW5pbWF0b3IiLCJwb3NpdGlvbnMiLCJ1cCIsImRvd24iLCJQb3BvdmVyRWxlbWVudCIsIl9jdXJyZW50VGFyZ2V0IiwiX3Bvc2l0aW9uUG9wb3ZlciIsIl9jbGVhclN0eWxlcyIsInJhZGl1cyIsIl9yYWRpdXMiLCJjb250ZW50RWxlbWVudCIsIl9jb250ZW50IiwibWFyZ2luIiwiX21hcmdpbiIsInRhcmdldFJlY3QiLCJpc01EIiwiY292ZXIiLCJwYXJlbnREaW1lbnNpb25zIiwibWF4UG9zaXRpb25zIiwidGFyZ2V0RGlzdGFuY2UiLCJ0YXJnZXRDZW50ZXJEaXN0YW5jZUZyb20iLCJfY2FsY3VsYXRlRGlyZWN0aW9ucyIsInByaW1hcnlEaXJlY3Rpb24iLCJwcmltYXJ5Iiwic2Vjb25kYXJ5RGlyZWN0aW9uIiwic2Vjb25kYXJ5IiwiX2N1cnJlbnREaXJlY3Rpb24iLCJzaXplTmFtZSIsImNvbnRlbnRTaXplIiwidGFyZ2V0QW5kQXJyb3dMZW5ndGgiLCJwcmltYXJ5T2Zmc2V0Iiwic2Vjb25kYXJ5T2Zmc2V0IiwiX2Fycm93IiwiaGFzRGVmYXVsdENvbnRhaW5lciIsImFycm93IiwiUG9wb3ZlciIsIklOREVUIiwiUHJvZ3Jlc3NCYXJFbGVtZW50IiwiX2lzQ29tcGlsZWQiLCJjbG9uZU5vZGUiLCJfcHJpbWFyeSIsIl9zZWNvbmRhcnkiLCJfdXBkYXRlRGV0ZXJtaW5hdGUiLCJfdXBkYXRlVmFsdWUiLCJiYXJFbGVtZW50IiwiUHJvZ3Jlc3NCYXIiLCJQcm9ncmVzc0NpcmN1bGFyRWxlbWVudCIsInBlciIsInN2ZyIsIlByb2dyZXNzQ2lyY3VsYXIiLCJTVEFURV9JTklUSUFMIiwiU1RBVEVfUFJFQUNUSU9OIiwiU1RBVEVfQUNUSU9OIiwidGhyb3dUeXBlIiwiUHVsbEhvb2tFbGVtZW50IiwiX29uRHJhZ0VuZCIsIl9zZXRTdGF0ZSIsIl9jb25uZWN0T25QdWxsIiwiX2Rpc2Nvbm5lY3RPblB1bGwiLCJsaW5lSGVpZ2h0IiwiX3BhZ2VFbGVtZW50IiwidGFwWSIsIm1heFkiLCJkcmFnZ2FibGVBcmVhUmF0aW8iLCJfc3RhcnRTY3JvbGwiLCJfY3VycmVudFRyYW5zbGF0aW9uIiwidGgiLCJ0aHJlc2hvbGRIZWlnaHQiLCJfZmluaXNoIiwiX3RyYW5zbGF0ZVRvIiwiX29uQWN0aW9uIiwib25BY3Rpb24iLCJub0V2ZW50IiwibGFzdFN0YXRlIiwicHVsbEhvb2siLCJtYXJnaW5Ub3AiLCJzY3JvbGxFbGVtZW50IiwiX2RyYWdMb2NrRGlzYWJsZWQiLCJzY3JvbGxUb2dnbGUiLCJnZFRvZ2dsZSIsIl9zZXRTdHlsZSIsIlB1bGxIb29rIiwiYWN0aXZlQ2xhc3NUb2tlbiIsIlJhbmdlRWxlbWVudCIsIl9vbk1vdXNlRG93biIsIl9vbk1vdXNlVXAiLCJfb25Ub3VjaFN0YXJ0IiwiX29uVG91Y2hFbmQiLCJfb25JbnB1dCIsIl9vbkRyYWdzdGFydCIsIl9vbkRyYWdlbmQiLCJfdXBkYXRlRGlzYWJsZWQiLCJmb2N1c1JpbmciLCJfZm9jdXNSaW5nIiwiYmFja2dyb3VuZFNpemUiLCJfcmF0aW8iLCJvYnNlcnZlZEF0dHJpYnV0ZXMiLCJSYW5nZSIsIlJvd0VsZW1lbnQiLCJSb3ciLCJTZWdtZW50RWxlbWVudCIsIl9zZWdtZW50SWQiLCJfdGFiYmFyIiwiX29uVGFiYmFyUHJlQ2hhbmdlIiwiZ2V0QWN0aXZlVGFiSW5kZXgiLCJnZXRBY3RpdmVCdXR0b25JbmRleCIsIl9zZXRDaGVja2VkIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJzZXRBY3RpdmVUYWIiLCJfcG9zdENoYW5nZSIsInNlZ21lbnRJdGVtIiwic2V0QWN0aXZlQnV0dG9uIiwiU2VnbWVudCIsIlNlbGVjdEVsZW1lbnQiLCJfZGVyaXZlR2V0dGVycyIsIl9zZWxlY3QiLCJzZWwiLCJvcHRpb24iLCJTZWxlY3QiLCJTcGVlZERpYWxJdGVtRWxlbWVudCIsIlNwZWVkRGlhbEl0ZW0iLCJTcGVlZERpYWxFbGVtZW50IiwiX3VwZGF0ZURpcmVjdGlvbiIsIl9pZ25vcmVPcGVuU2lkZUVmZmVjdCIsIl91cGRhdGVPcGVuIiwidG9nZ2xlSXRlbXMiLCJpbmxpbmUiLCJfZmFiIiwiaXRlbXMiLCJ0cmFuc2l0aW9uRGVsYXkiLCJfZ2V0VHJhbnNsYXRlIiwiaGlkZUl0ZW1zIiwidG90YWxEZWxheSIsInNob3dJdGVtcyIsIlNwZWVkRGlhbCIsIlNwbGl0dGVyQ29udGVudEVsZW1lbnQiLCJvbGRDb250ZW50IiwiU3BsaXR0ZXJDb250ZW50IiwiU3BsaXR0ZXJNYXNrRWxlbWVudCIsIl9zaWRlcyIsInNpZGUiLCJtb2RlIiwib25DbGljayIsImNsb3NlIiwiU3BsaXR0ZXJNYXNrIiwiU3BsaXR0ZXJBbmltYXRvciIsInNpZGVFbGVtZW50Iiwic3BsaXR0ZXIiLCJfc2lkZSIsIl9vcHBvc2l0ZVNpZGUiLCJjbGVhck1hc2siLCJpc09wZW4iLCJPdmVybGF5U3BsaXR0ZXJBbmltYXRvciIsIm1pbnVzIiwiUHVzaFNwbGl0dGVyQW5pbWF0b3IiLCJzbGlkaW5nRWxlbWVudHMiLCJfc2xpZGluZ0VsZW1lbnRzIiwiX2dldFNsaWRpbmdFbGVtZW50cyIsIlJldmVhbFNwbGl0dGVyQW5pbWF0b3IiLCJfc2V0U3R5bGVzIiwiX3Vuc2V0U3R5bGVzIiwiX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlIiwiYmVoaW5kRGlzdGFuY2UiLCJiZWhpbmRUcmFuc2Zvcm0iLCJfZ2V0TWF4V2lkdGgiLCJtZW51U3R5bGUiLCJvdmVybGF5IiwicmV2ZWFsIiwiU3BsaXR0ZXJFbGVtZW50IiwiX29uTW9kZUNoYW5nZSIsIl9sYXlvdXQiLCJfZ2V0U2lkZSIsIlNwbGl0dGVyIiwiU1BMSVRfTU9ERSIsIkNPTExBUFNFX01PREUiLCJDTE9TRURfU1RBVEUiLCJPUEVOX1NUQVRFIiwiQ0hBTkdJTkdfU1RBVEUiLCJzcGxpdHRlclNpZGVFbGVtZW50IiwiQ29sbGFwc2VEZXRlY3Rpb24iLCJjaGFuZ2VUYXJnZXQiLCJfdGFyZ2V0IiwiX29yaWVudGF0aW9uIiwiYWN0aXZhdGUiLCJfdXBkYXRlTW9kZSIsIl9tYXRjaCIsIl9xdWVyeVJlc3VsdCIsIm1hdGNoTWVkaWEiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiU3BsaXR0ZXJTaWRlRWxlbWVudCIsIl9zdGF0ZSIsIl9sb2NrIiwiX2NvbGxhcHNlRGV0ZWN0aW9uIiwiX2FuaW1hdGlvbk9wdCIsImNsb3NlZCIsInZhbGlkRHJhZyIsIl9tb2RlIiwiX2lzT3RoZXJTaWRlT3BlbiIsInRpaHMiLCJkZWFjdGl2YXRlIiwidXBkYXRlT3B0aW9ucyIsIkZJTkFMX1NUQVRFIiwiX2VtaXRFdmVudCIsIlNwbGl0dGVyU2lkZSIsImxvY2F0aW9ucyIsIm1hdGVyaWFsIiwiU3dpdGNoRWxlbWVudCIsIl9sYXN0VGltZVN0YW1wIiwiX2xvY2F0aW9ucyIsIl9zdGFydFgiLCJzd2l0Y2giLCJpc0ludGVyYWN0aXZlIiwiX2VtaXRDaGFuZ2VFdmVudCIsImRlZmF1bHRFbGVtZW50Q2xhc3MiLCJfaGFuZGxlIiwiX2dldFBvc2l0aW9uIiwicHJldmlvdXNWYWx1ZSIsImNsaWNrIiwiU3dpdGNoIiwidGFiYmFyRWxlbWVudCIsImxlcnAiLCJ4MCIsIngxIiwidCIsIlRhYmJhckVsZW1lbnQiLCJfbG9hZEluYWN0aXZlIiwiX2dldEF1dG9TY3JvbGxSYXRpbyIsIl90YWJiYXJCb3JkZXIiLCJfdGFiYmFyRWxlbWVudCIsIl91cGRhdGVWaXNpYmlsaXR5IiwiX3RhYnNSZWN0IiwidGFiSXRlbSIsInRhYnMiLCJfbm9ybWFsaXplRXZlbnQiLCJzZXRBY3RpdmUiLCJwcmV2VGFiIiwiX2F1dG9ncm93IiwidGFiIiwidGFiYmFyIiwiY3MiLCJmaWxsZWQiLCJfdGFyZ2V0RWxlbWVudCIsIm5leHRJbmRleCIsInByZXZpb3VzSW5kZXgiLCJfYWN0aXZlSW5kZXhTa2lwRWZmZWN0IiwiX3VwZGF0ZUFjdGl2ZUluZGV4IiwicHJldkluZGV4IiwibmV4dFRhYiIsImhpZGVUYWJzIiwiaXNBY3RpdmUiLCJpc1RvcCIsIlRhYmJhciIsIlRhYkVsZW1lbnQiLCJfYnV0dG9uIiwiX3VwZGF0ZUJ1dHRvbkNvbnRlbnQiLCJpY29uV3JhcHBlciIsImZpeCIsImFjdGl2ZSIsIl9oYXNMb2FkZWQiLCJfbG9hZGVkUGFnZSIsInBhZ2VUYXJnZXQiLCJwYXJlbnRUYXJnZXQiLCJkdW1teVBhZ2UiLCJfbG9hZFBhZ2VFbGVtZW50IiwiVGFiIiwiVG9hc3RBbmltYXRvciIsIkZhZGVUb2FzdEFuaW1hdG9yIiwiQXNjZW5kVG9hc3RBbmltYXRvciIsIm1lc3NhZ2VEZWxheSIsImFzY2Vuc2lvbiIsIl9nZXRGYWJzIiwiZmFiIiwiTGlmdFRvYXN0QW5pbWF0b3IiLCJGYWxsVG9hc3RBbmltYXRvciIsImZhbGxBbW91bnQiLCJjbGVhblVwIiwiY29ycmVjdFRvcCIsIlRvYXN0RWxlbWVudCIsIm1lc3NhZ2VDbGFzc05hbWUiLCJidXR0b25DbGFzc05hbWUiLCJUb2FzdCIsIlRvb2xiYXJCdXR0b25FbGVtZW50IiwiVG9vbGJhckJ1dHRvbiIsIl9zdXBlclNlY3JldE9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFBQTtFQUNBO0FBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtFQUNBO0FBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7RUFDQTtFQUVBO0VBQ0EsSUFBTUEsaUJBQWlCLEdBQUdDLE1BQU0sQ0FBQ0MsV0FBakMsQ0FBQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztNQUNNQztFQUVKO0VBQ0Y7RUFDQTtFQUNBO0lBQ0UsU0FBYyxRQUFBLEdBQUE7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsUUFBQSxDQUFBLENBQUE7O01BQ1osSUFBS0MsQ0FBQUEsaUJBQUwsR0FBeUIsSUFBekIsQ0FBQTtNQUNBLElB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QUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtF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RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFDcUJhOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFFRSxTQUFjLGVBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGVBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQSxJQUFBLEtBQUEsQ0FBS3JXLGdCQUFMLEdBQXdCLEtBQUEsQ0FBS0Msc0JBQUwsRUFBeEIsQ0FIWTs7TUFNWixJQUFNam1CLEVBQUUsR0FBRyx5QkFBWCxDQUFBOztNQUNBLEtBQUtzOEIsQ0FBQUEsZ0JBQUwsR0FBd0IsVUFBQXozQyxDQUFDLEVBQUE7RUFBQSxNQUFBLE9BQUlBLENBQUMsQ0FBQ3lKLFlBQUYsQ0FBZSxhQUFmLENBQUEsSUFBaUMwUixFQUFFLENBQUM1ZSxJQUFILENBQVF5RCxDQUFDLENBQUNvTSxPQUFWLENBQXJDLENBQUE7RUFBQSxLQUF6QixDQVBZOzs7TUFVWixLQUFLOHFCLENBQUFBLElBQUwsR0FBWSxLQUFBLENBQUt3Z0IsYUFBakIsQ0FBQTtNQUNBLEtBQUs3Z0IsQ0FBQUEsSUFBTCxHQUFZLEtBQUEsQ0FBSzhnQixhQUFqQixDQUFBO0VBRUE1aUIsSUFBQUEsWUFBWSxnQ0FBTyxZQUFNO0VBQ3ZCLE1BQUEsS0FBQSxDQUFLdU4sUUFBTCxFQUFBLENBQUE7RUFDRCxLQUZXLENBQVosQ0FBQTtFQWJZLElBQUEsT0FBQSxLQUFBLENBQUE7RUFnQmIsR0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7OzthQUNFLFNBQVcsUUFBQSxHQUFBO1FBQ1RqekIsU0FBUyxDQUFDaEMsT0FBVixDQUFrQixJQUFsQixDQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS2lCLFNBQUwsQ0FBZUksR0FBZixDQUFtQjIxQixrQkFBbkIsQ0FBQSxDQUFBO1FBRUEsSUFBSXZFLEdBQUosRUFBU21YLGlCQUFULENBQUE7UUFDQSxJQUFJVyxVQUFVLEdBQUcsRUFBakIsQ0FBQTtRQUNBdnRDLEtBQUssQ0FBQzZJLElBQU4sQ0FBVyxJQUFLWixDQUFBQSxVQUFoQixFQUE0Qm5TLE9BQTVCLENBQW9DLFVBQUFVLElBQUksRUFBSTtFQUMxQyxRQUFBLElBQUlBLElBQUksQ0FBQzBSLFFBQUwsS0FBa0JDLElBQUksQ0FBQ0MsWUFBM0IsRUFBeUM7WUFDdkNtbEMsVUFBVSxDQUFDdjNDLElBQVgsQ0FBZ0JRLElBQWhCLENBQUEsQ0FBQTtXQURGLE1BRU8sSUFBSUEsSUFBSSxDQUFDeU4sU0FBTCxDQUFld0UsUUFBZixDQUF3QixLQUF4QixDQUFKLEVBQW9DO0VBQ3pDZ3RCLFVBQUFBLEdBQUcsR0FBR2ovQixJQUFOLENBQUE7V0FESyxNQUVBLElBQUlBLElBQUksQ0FBQ3lOLFNBQUwsQ0FBZXdFLFFBQWYsQ0FBd0Isb0JBQXhCLENBQUosRUFBbUQ7RUFDeERta0MsVUFBQUEsaUJBQWlCLEdBQUdwMkMsSUFBcEIsQ0FBQTtFQUNELFNBRk0sTUFFQTtZQUNMKzJDLFVBQVUsQ0FBQ3YzQyxJQUFYLENBQWdCUSxJQUFoQixDQUFBLENBQUE7RUFDRCxTQUFBOztFQUVELFFBQUEsSUFBSUEsSUFBSSxDQUFDbVMsUUFBTCxLQUFrQixZQUF0QixFQUFvQztFQUNsQ25TLFVBQUFBLElBQUksQ0FBQzhOLE1BQUwsRUFBQSxDQUFBO0VBQ0QsU0FBQTtTQWJILENBQUEsQ0FBQTtFQWVBaXBDLE1BQUFBLFVBQVUsR0FBRzlYLEdBQUcsR0FBR3oxQixLQUFLLENBQUM2SSxJQUFOLENBQVc0c0IsR0FBRyxDQUFDeHRCLFVBQWYsQ0FBSCxHQUFnQ3NsQyxVQUFoRCxDQUFBO0VBRUEsTUFBQSxJQUFJejJCLElBQUosRUFBVUMsS0FBVixFQUFpQjJNLE1BQWpCLENBQUE7UUFDQSxJQUFNOHBCLGFBQWEsR0FBRyxFQUF0QixDQUFBO0VBQ0FELE1BQUFBLFVBQVUsQ0FBQ3ozQyxPQUFYLENBQW1CLFVBQUFVLElBQUksRUFBSTtFQUN6QixRQUFBLElBQUlBLElBQUksQ0FBQzBSLFFBQUwsS0FBa0JDLElBQUksQ0FBQ0MsWUFBM0IsRUFBeUM7WUFDdkNvbEMsYUFBYSxDQUFDeDNDLElBQWQsQ0FBbUJRLElBQW5CLENBQUEsQ0FBQTtXQURGLE1BRU8sSUFBSUEsSUFBSSxDQUFDeU4sU0FBTCxDQUFld0UsUUFBZixDQUF3QixNQUF4QixDQUFKLEVBQXFDO0VBQzFDcU8sVUFBQUEsSUFBSSxHQUFHdGdCLElBQVAsQ0FBQTtXQURLLE1BRUEsSUFBSUEsSUFBSSxDQUFDeU4sU0FBTCxDQUFld0UsUUFBZixDQUF3QixPQUF4QixDQUFKLEVBQXNDO0VBQzNDc08sVUFBQUEsS0FBSyxHQUFHdmdCLElBQVIsQ0FBQTtXQURLLE1BRUEsSUFBSUEsSUFBSSxDQUFDeU4sU0FBTCxDQUFld0UsUUFBZixDQUF3QixRQUF4QixDQUFKLEVBQXVDO0VBQzVDaWIsVUFBQUEsTUFBTSxHQUFHbHRCLElBQVQsQ0FBQTtFQUNELFNBRk0sTUFFQTtZQUNMZzNDLGFBQWEsQ0FBQ3gzQyxJQUFkLENBQW1CUSxJQUFuQixDQUFBLENBQUE7RUFDRCxTQUFBO1NBWEgsQ0FBQSxDQUFBOztFQWNBLE1BQUEsSUFBSSxJQUFLNEksQ0FBQUEsWUFBTCxDQUFrQixZQUFsQixDQUFKLEVBQXFDO0VBQ25DLFFBQUEsSUFBQSxDQUFLNkUsU0FBTCxDQUFlSSxHQUFmLENBQW1CLHVCQUFuQixDQUFBLENBQUE7O1VBRUEsSUFBSSxDQUFDb3hCLEdBQUwsRUFBVTtFQUNSQSxVQUFBQSxHQUFHLEdBQUc3akMsUUFBUSxDQUFDME0sYUFBVCxDQUF1QixLQUF2QixDQUFOLENBQUE7RUFDQW0zQixVQUFBQSxHQUFHLENBQUN4eEIsU0FBSixDQUFjSSxHQUFkLENBQWtCLEtBQWxCLENBQUEsQ0FBQTtFQUNELFNBQUE7O0VBQ0RveEIsUUFBQUEsR0FBRyxDQUFDeHhCLFNBQUosQ0FBY0ksR0FBZCxDQUFrQixnQkFBbEIsQ0FBQSxDQUFBO1VBQ0EsSUFBSzVGLENBQUFBLFdBQUwsQ0FBaUJnM0IsR0FBakIsQ0FBQSxDQUFBO1VBQ0EsSUFBS2dZLENBQUFBLElBQUwsR0FBWWhZLEdBQVosQ0FBQTs7RUFFQSxRQUFBLElBQUltWCxpQkFBSixFQUF1QjtFQUNyQkEsVUFBQUEsaUJBQWlCLENBQUMzb0MsU0FBbEIsQ0FBNEJJLEdBQTVCLENBQWdDLCtCQUFoQyxDQUFBLENBQUE7WUFDQSxJQUFLNUYsQ0FBQUEsV0FBTCxDQUFpQm11QyxpQkFBakIsQ0FBQSxDQUFBO0VBQ0QsU0FBQTs7VUFFRCxJQUFJLENBQUM3MUIsS0FBTCxFQUFZO0VBQ1ZBLFVBQUFBLEtBQUssR0FBR25sQixRQUFRLENBQUMwTSxhQUFULENBQXVCLEtBQXZCLENBQVIsQ0FBQTtZQUNBeVksS0FBSyxDQUFDOVMsU0FBTixDQUFnQkksR0FBaEIsQ0FBb0Isa0JBQXBCLEVBQXdDLE9BQXhDLENBQUEsQ0FGVTtFQUtWOztFQUNBLFVBQUEsSUFBTXFwQyxPQUFPLEdBQUc5N0MsUUFBUSxDQUFDME0sYUFBVCxDQUF1QixNQUF2QixDQUFoQixDQUFBO0VBQ0FvdkMsVUFBQUEsT0FBTyxDQUFDenBDLFNBQVIsQ0FBa0JJLEdBQWxCLENBQXNCLDJCQUF0QixDQUFBLENBQUE7WUFDQTBTLEtBQUssQ0FBQ3RZLFdBQU4sQ0FBa0JpdkMsT0FBbEIsQ0FBQSxDQUFBO0VBQ0QsU0F6QmtDO0VBNEJuQzs7O1VBQ0EsSUFBSSxJQUFBLENBQUtDLFFBQVQsRUFBbUI7RUFDakIsVUFBQSxJQUFBLENBQUsxcEMsU0FBTCxDQUFlSSxHQUFmLENBQW1CLHFCQUFuQixDQUFBLENBQUE7RUFDRCxTQUFBO0VBQ0YsT0FoQ0QsTUFnQ087RUFDTG94QixRQUFBQSxHQUFHLEdBQUcsSUFBTixDQUFBO0VBQ0QsT0FBQTs7UUFFRCxJQUFJLENBQUMvUixNQUFMLEVBQWE7RUFDWEEsUUFBQUEsTUFBTSxHQUFHOXhCLFFBQVEsQ0FBQzBNLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBVCxDQUFBO0VBQ0FvbEIsUUFBQUEsTUFBTSxDQUFDemYsU0FBUCxDQUFpQkksR0FBakIsQ0FBcUIsUUFBckIsQ0FBQSxDQUFBO0VBQ0FtcEMsUUFBQUEsYUFBYSxDQUFDMTNDLE9BQWQsQ0FBc0IsVUFBQVUsSUFBSSxFQUFBO0VBQUEsVUFBQSxPQUFJa3RCLE1BQU0sQ0FBQ2psQixXQUFQLENBQW1CakksSUFBbkIsQ0FBSixDQUFBO1dBQTFCLENBQUEsQ0FBQTtFQUNELE9BQUE7O0VBQ0RrdEIsTUFBQUEsTUFBTSxDQUFDemYsU0FBUCxDQUFpQkksR0FBakIsQ0FBcUIsbUJBQXJCLENBQUEsQ0FBQTtRQUNBb3hCLEdBQUcsQ0FBQ2gzQixXQUFKLENBQWdCaWxCLE1BQWhCLENBQUEsQ0FBQTs7RUFFQSxNQUFBLElBQUk1TSxJQUFKLEVBQVU7RUFDUkEsUUFBQUEsSUFBSSxDQUFDN1MsU0FBTCxDQUFlSSxHQUFmLENBQW1CLGlCQUFuQixDQUFBLENBQUE7VUFDQW94QixHQUFHLENBQUNoM0IsV0FBSixDQUFnQnFZLElBQWhCLENBQUEsQ0FBQTtFQUNELE9BQUE7O0VBQ0QsTUFBQSxJQUFJQyxLQUFKLEVBQVc7RUFDVEEsUUFBQUEsS0FBSyxDQUFDOVMsU0FBTixDQUFnQkksR0FBaEIsQ0FBb0Isa0JBQXBCLENBQUEsQ0FBQTtVQUNBb3hCLEdBQUcsQ0FBQ2gzQixXQUFKLENBQWdCc1ksS0FBaEIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7UUFFRHRXLE1BQUksQ0FBQ3NNLFlBQUwsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBO0VBQ0F2SixNQUFBQSxZQUFZLENBQUM4MEIsWUFBYixDQUEwQixJQUExQixFQUFnQy96QixRQUFoQyxDQUFBLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUFnQixhQUFBLEdBQUE7UUFDZCxJQUFLb3BDLENBQUFBLFFBQUwsR0FBZ0IsSUFBaEIsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OzthQUNFLFNBQWdCLGFBQUEsR0FBQTtRQUNkLElBQUtBLENBQUFBLFFBQUwsR0FBZ0IsS0FBaEIsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWtCLGVBQUEsR0FBQTtFQUNoQixNQUFBLElBQUEsQ0FBS0EsUUFBTCxHQUFnQixDQUFDLElBQUEsQ0FBS0EsUUFBdEIsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQW9CLGlCQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDbEI7UUFDQSxJQUFNQyxpQkFBaUIsR0FBRyxJQUFBLENBQUtELFFBQUwsSUFBaUIsSUFBSzFwQyxDQUFBQSxTQUFMLENBQWV3RSxRQUFmLENBQXdCLHFCQUF4QixDQUEzQyxDQUFBOztRQUVBLElBQUksQ0FBQyxJQUFLckosQ0FBQUEsWUFBTCxDQUFrQixZQUFsQixDQUFELElBQW9DLElBQUt5dUMsQ0FBQUEsVUFBekMsSUFBdURELGlCQUEzRCxFQUE4RTtFQUM1RSxRQUFBLE9BQUE7RUFDRCxPQUFBOztRQUVELElBQUtDLENBQUFBLFVBQUwsR0FBa0IsSUFBbEIsQ0FBQTs7RUFFQSxNQUFBLElBQU1DLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsR0FBTTtVQUM3QixNQUFJLENBQUNELFVBQUwsR0FBa0IsS0FBbEIsQ0FBQTs7VUFFQSxJQUFJLE1BQUksQ0FBQ0YsUUFBVCxFQUFtQjtFQUNqQixVQUFBLE1BQUksQ0FBQzFwQyxTQUFMLENBQWVJLEdBQWYsQ0FBbUIscUJBQW5CLENBQUEsQ0FBQTtFQUNELFNBRkQsTUFFTztFQUNMLFVBQUEsTUFBSSxDQUFDSixTQUFMLENBQWVLLE1BQWYsQ0FBc0IscUJBQXRCLENBQUEsQ0FBQTtFQUNELFNBQUE7U0FQSCxDQUFBOztFQVVBLE1BQUEsSUFBTStQLFFBQVEsR0FBRyxJQUFBLENBQUt5aUIsZ0JBQUwsQ0FBc0IzQixXQUF0QixFQUFqQixDQUFBOztRQUVBLElBQUk5Z0IsUUFBUSxDQUFDbzRCLGlCQUFiLEVBQWdDO1VBQzlCcDRCLFFBQVEsQ0FBQ280QixpQkFBVCxDQUEyQixJQUEzQixFQUFpQyxJQUFLa0IsQ0FBQUEsUUFBdEMsRUFBZ0RHLGdCQUFoRCxDQUFBLENBQUE7RUFDRCxPQUZELE1BRU87VUFDTEEsZ0JBQWdCLEVBQUEsQ0FBQTtFQUNqQixPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBeUIsc0JBQUEsR0FBQTtRQUN2QixPQUFPLElBQUlyNkIsZUFBSixDQUFvQjtFQUN6QkUsUUFBQUEsU0FBUyxFQUFFb2tCLGVBRGM7RUFFekJsa0IsUUFBQUEsU0FBUyxFQUFFeTRCLGdCQUZjO0VBR3pCdjRCLFFBQUFBLGFBQWEsRUFBRSxrQkFIVTtFQUl6QkUsUUFBQUEsZ0JBQWdCLEVBQUUsSUFBQSxDQUFLelMsWUFBTCxDQUFrQixXQUFsQixDQUFrQyxJQUFBLFNBQUE7RUFKM0IsT0FBcEIsQ0FBUCxDQUFBO0VBTUQsS0FBQTs7O1dBTUQsU0FBd0IsR0FBQSxHQUFBO0VBQ3RCLE1BQUEsT0FBTyxJQUFLdkMsQ0FBQUEsYUFBTCxDQUFtQixnQ0FBbkIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBb0IsR0FBQSxHQUFBO0VBQ2xCLE1BQUEsT0FBTyxJQUFLQSxDQUFBQSxhQUFMLENBQW1CLDRCQUFuQixDQUFQLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLHdCQUFBLENBQXlCOUQsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDNUMsTUFBQSxRQUFRdkksSUFBUjtFQUNFLFFBQUEsS0FBSyxPQUFMO0VBQ0VzRixVQUFBQSxNQUFJLENBQUNxTCxZQUFMLENBQWtCLElBQWxCLEVBQXdCa3VCLGtCQUF4QixFQUEwQ3oxQixRQUExQyxDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLFVBQUw7WUFDRWYsWUFBWSxDQUFDbTBCLGlCQUFiLENBQStCbDBCLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QyxJQUE5QyxFQUFvRGEsUUFBcEQsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxRQUFMO1lBQ0U5RCxNQUFJLENBQUNzTSxZQUFMLENBQWtCLElBQWxCLENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTs7RUFDRixRQUFBLEtBQUssV0FBTDtFQUNFLFVBQUEsSUFBQSxDQUFLK3BCLGdCQUFMLEdBQXdCLElBQUtDLENBQUFBLHNCQUFMLEVBQXhCLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLFVBQUw7WUFDRXJNLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBQTtjQUFBLE9BQU0sTUFBSSxDQUFDK2hCLGlCQUFMLEVBQU4sQ0FBQTtFQUFBLFdBQVAsQ0FBWixDQUFBO0VBQ0EsVUFBQSxNQUFBO0VBZkosT0FBQTtFQWlCRCxLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2xCL2hCLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBTTtVQUN2QixNQUFJLENBQUNxakIsZUFBTCxDQUFxQixJQUFyQixDQUFBLENBQUE7O0VBQ0EsUUFBQSxNQUFJLENBQUNDLHdCQUFMLEdBQWdDLE1BQUksQ0FBQ250QyxLQUFMLENBQVc0MkIsZUFBM0MsQ0FBQTtVQUNBLE1BQUksQ0FBQ3dXLE1BQUwsR0FBYyxLQUFkLENBQUE7RUFDRCxPQUpXLENBQVosQ0FBQTtFQUtELEtBQUE7OzthQUVELFNBQXVCLG9CQUFBLEdBQUE7UUFDckIsSUFBS0YsQ0FBQUEsZUFBTCxDQUFxQixLQUFyQixDQUFBLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLGVBQUEsQ0FBZ0IxcEMsR0FBaEIsRUFBcUI7UUFDbkIsSUFBTTZFLE1BQU0sR0FBRyxDQUFDN0UsR0FBRyxHQUFHLEtBQUgsR0FBVyxRQUFmLElBQTJCLGVBQTFDLENBQUE7UUFDQTVELE1BQUksQ0FBQ3lJLE1BQUQsQ0FBSixDQUFhLElBQWIsRUFBbUIsWUFBbkIsRUFBaUMsSUFBS2dsQyxDQUFBQSxRQUF0QyxFQUFnRDtFQUFFLzFCLFFBQUFBLE9BQU8sRUFBRSxJQUFBO1NBQTNELENBQUEsQ0FBQTtRQUNBMVgsTUFBSSxDQUFDeUksTUFBRCxDQUFKLENBQWEsSUFBYixFQUFtQixXQUFuQixFQUFnQyxJQUFLbXhCLENBQUFBLFVBQXJDLEVBQWlEO0VBQUVsaUIsUUFBQUEsT0FBTyxFQUFFLElBQUE7U0FBNUQsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtqUCxNQUFMLENBQUEsQ0FBYSxhQUFiLEVBQTRCLEtBQUtteEIsVUFBakMsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtueEIsTUFBTCxDQUFBLENBQWEsVUFBYixFQUF5QixLQUFLbXhCLFVBQTlCLENBQUEsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLbnhCLE1BQUwsQ0FBQSxDQUFhLFlBQWIsRUFBMkIsS0FBS214QixVQUFoQyxDQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS254QixNQUFMLENBQUEsQ0FBYSxNQUFiLEVBQXFCLEtBQUtpbEMsT0FBMUIsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtqbEMsTUFBTCxDQUFBLENBQWEsV0FBYixFQUEwQixLQUFLZ2xDLFFBQS9CLENBQUEsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLaGxDLE1BQUwsQ0FBQSxDQUFhLFNBQWIsRUFBd0IsS0FBS214QixVQUE3QixDQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS254QixNQUFMLENBQUEsQ0FBYSxVQUFiLEVBQXlCLEtBQUtteEIsVUFBOUIsQ0FBQSxDQUFBOztRQUVBLElBQUksSUFBQSxDQUFLb1QsSUFBVCxFQUFlO0VBQ2IsUUFBQSxJQUFBLENBQUtBLElBQUwsQ0FBVXZrQyxNQUFWLENBQUEsQ0FBa0IsT0FBbEIsRUFBMkIsSUFBS2tsQyxDQUFBQSxXQUFMLENBQWlCemhDLElBQWpCLENBQXNCLElBQXRCLENBQTNCLENBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFjLFdBQUEsR0FBQTtRQUNaLElBQUksQ0FBQyxJQUFLa2hDLENBQUFBLFVBQVYsRUFBc0I7RUFDcEIsUUFBQSxJQUFBLENBQUtRLGVBQUwsRUFBQSxDQUFBO0VBQ0EsUUFBQSxJQUFBLENBQUs5aUMsYUFBTCxDQUFtQixJQUFJK1EsS0FBSixDQUFVLFFBQVYsQ0FBbkIsQ0FBQSxDQUFBO1VBQ0EsSUFBSy9RLENBQUFBLGFBQUwsQ0FBbUIsSUFBSStRLEtBQUosQ0FBVSxXQUFWLENBQW5CLEVBSG9CO0VBSXJCLE9BQUE7RUFDRixLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLE9BQUEsQ0FBUTVlLEtBQVIsRUFBZTtFQUNiLE1BQUEsSUFBTXFSLE9BQU8sR0FBR3JSLEtBQUssQ0FBQ3FSLE9BQXRCLENBRGE7O0VBR2IsTUFBQSxJQUFJLEtBQUszUCxZQUFMLENBQWtCLGNBQWxCLENBQXFDLElBQUEsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUFrQjlMLENBQUFBLE9BQWxCLENBQTBCeWIsT0FBTyxDQUFDcVMsU0FBbEMsQ0FBK0MsR0FBQSxDQUFDLENBQXpGLEVBQTRGO0VBQzFGclMsUUFBQUEsT0FBTyxDQUFDTixjQUFSLEVBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFFBQUEsQ0FBUzlZLENBQVQsRUFBWTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNWLElBQUksSUFBQSxDQUFLczRDLE1BQUwsSUFDRCxJQUFTdDRDLEtBQUFBLENBQUMsQ0FBQytCLE1BQVgsS0FBc0IsSUFBQSxDQUFLMDFDLGdCQUFMLENBQXNCejNDLENBQUMsQ0FBQytCLE1BQXhCLENBQUEsSUFBbUMrSSxNQUFJLENBQUNtRSxVQUFMLENBQWdCalAsQ0FBQyxDQUFDK0IsTUFBbEIsRUFBMEIsSUFBSzAxQyxDQUFBQSxnQkFBL0IsRUFBaUQsVUFBQWw1QyxDQUFDLEVBQUE7VUFBQSxPQUFJQSxDQUFDLEtBQUssTUFBVixDQUFBO1NBQWxELENBQXpELENBREgsRUFFRTtFQUNBLFFBQUEsT0FEQTtFQUVELE9BQUE7O1FBRUQsSUFBSys1QyxDQUFBQSxNQUFMLEdBQWMsSUFBZCxDQUFBO0VBQ0EsTUFBQSxJQUFNSyxVQUFVLEdBQUc7RUFBRWx6QixRQUFBQSxVQUFVLEVBQUUsa0VBQUE7U0FBakMsQ0FBQTs7RUFFQSxNQUFBLElBQUksSUFBS2hjLENBQUFBLFlBQUwsQ0FBa0IsVUFBbEIsQ0FBSixFQUFtQztFQUNqQyxRQUFBLElBQUksSUFBS3lCLENBQUFBLEtBQUwsQ0FBVzQyQixlQUFmLEVBQWdDO0VBQzlCLFVBQUEsSUFBQSxDQUFLdVcsd0JBQUwsR0FBZ0MsSUFBS250QyxDQUFBQSxLQUFMLENBQVc0MkIsZUFBM0MsQ0FBQTtFQUNELFNBQUE7O1VBRUQ2VyxVQUFVLENBQUM3VyxlQUFYLEdBQTZCLElBQUEsQ0FBS2oyQixZQUFMLENBQWtCLHNCQUFsQixLQUE2QyxTQUExRSxDQUFBO0VBQ0E4c0MsUUFBQUEsVUFBVSxDQUFDQyxTQUFYLEdBQTJDRCxtQkFBQUEsQ0FBQUEsTUFBQUEsQ0FBQUEsVUFBVSxDQUFDN1csZUFBdEQsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRDkyQixNQUFBQSxNQUFNLENBQUMsSUFBRCxFQUFPMnRDLFVBQVAsQ0FBTixDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBYSxVQUFBLEdBQUE7UUFDWCxJQUFLTCxDQUFBQSxNQUFMLEdBQWMsS0FBZCxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtwdEMsS0FBTCxDQUFXNDJCLGVBQVgsR0FBNkIsSUFBS3VXLENBQUFBLHdCQUFMLElBQWlDLEVBQTlELENBQUE7RUFDQXJ0QyxNQUFBQSxNQUFNLENBQUNNLEtBQVAsQ0FBYSxJQUFiLEVBQW1CLHNCQUFuQixDQUFBLENBQUE7RUFDRCxLQUFBOzs7V0F2R0QsU0FBZ0MsR0FBQSxHQUFBO1FBQzlCLE9BQU8sQ0FBQyxVQUFELEVBQWEsT0FBYixFQUFzQixRQUF0QixFQUFnQyxXQUFoQyxFQUE2QyxVQUE3QyxDQUFQLENBQUE7RUFDRCxLQUFBOzs7O0lBeFQwQ3V6QjtBQWdhN0MvekIsUUFBSSxDQUFDNE8sdUJBQUwsQ0FBNkI4OUIsZUFBN0IsRUFBOEMsQ0FBQyxVQUFELEVBQWEsWUFBYixFQUEyQixVQUEzQixFQUF1QyxjQUF2QyxDQUE5QyxDQUFBLENBQUE7QUFDQTFzQyxRQUFJLENBQUNnUCxzQkFBTCxDQUE0QjA5QixlQUE1QixFQUE2QyxDQUFDLFdBQUQsRUFBYyxzQkFBZCxDQUE3QyxDQUFBLENBQUE7RUFFQS85QixXQUFXLENBQUNvL0IsUUFBWixHQUF1QnJCLGVBQXZCLENBQUE7RUFDQXg0QyxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixlQUF0QixFQUF1Q3FZLGVBQXZDLENBQUE7O0VDbmZBLElBQU1uVCxrQkFBZ0IsR0FBRyxNQUF6QixDQUFBO0VBQ0EsSUFBTXoxQixRQUFNLEdBQUc7SUFBQyxFQUFJLEVBQUEsU0FBQTtFQUFMLENBQWYsQ0FBQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFDcUJrcUM7Ozs7O0VBRW5CO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0lBRUUsU0FBYyxXQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxXQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBOztFQUVBLElBQUEsS0FBQSxDQUFLeFcsUUFBTCxFQUFBLENBQUE7O0VBSFksSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQUliLEdBQUE7Ozs7YUFFRCxTQUFXLFFBQUEsR0FBQTtRQUNUanpCLFNBQVMsQ0FBQ2hDLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtpQixTQUFMLENBQWVJLEdBQWYsQ0FBbUIyMUIsa0JBQW5CLENBQUEsQ0FBQTtFQUNBeDJCLE1BQUFBLFlBQVksQ0FBQzgwQixZQUFiLENBQTBCLElBQTFCLEVBQWdDL3pCLFFBQWhDLENBQUEsQ0FBQTtFQUNELEtBQUE7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUJwSixJQUF6QixFQUErQnNJLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QztFQUM1QyxNQUFBLFFBQVF2SSxJQUFSO0VBQ0UsUUFBQSxLQUFLLE9BQUw7RUFDRXNGLFVBQUFBLE1BQUksQ0FBQ3FMLFlBQUwsQ0FBa0IsSUFBbEIsRUFBd0JrdUIsa0JBQXhCLEVBQTBDejFCLFFBQTFDLENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTs7RUFDRixRQUFBLEtBQUssVUFBTDtZQUNFZixZQUFZLENBQUNtMEIsaUJBQWIsQ0FBK0JsMEIsSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDLElBQTlDLEVBQW9EYSxRQUFwRCxDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7RUFOSixPQUFBO0VBUUQsS0FBQTs7O1dBYkQsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBTyxDQUFDLFVBQUQsRUFBYSxPQUFiLENBQVAsQ0FBQTtFQUNELEtBQUE7Ozs7SUF4QnNDaXdCO0VBc0N6Q3BsQixXQUFXLENBQUNzL0IsSUFBWixHQUFtQkQsV0FBbkIsQ0FBQTtFQUNBOTVDLGNBQWMsQ0FBQ21nQyxNQUFmLENBQXNCLFVBQXRCLEVBQWtDMlosV0FBbEMsQ0FBQTs7RUM1RUEsSUFBTUUsa0JBQWdCLEdBQUcsQ0FDdkIsZ0JBRHVCLEVBRXZCLGNBRnVCLEVBR3ZCLGFBSHVCLEVBSXZCLFdBSnVCLEVBS3ZCLFVBTHVCLEVBTXZCLFdBTnVCLEVBT3ZCLEtBUHVCLEVBUXZCLFdBUnVCLEVBU3ZCLEtBVHVCLEVBVXZCLFdBVnVCLEVBV3ZCLE1BWHVCLEVBWXZCLFNBWnVCLEVBYXZCLGFBYnVCLEVBY3ZCLFVBZHVCLEVBZXZCLFVBZnVCLEVBZ0J2QixNQWhCdUIsRUFpQnZCLFlBakJ1QixFQWtCdkIsTUFsQnVCLEVBbUJ2QixXQW5CdUIsRUFvQnZCLE9BcEJ1QixDQUF6QixDQUFBOztNQXVCcUJDOzs7OztJQWdCbkIsU0FBYyxnQkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsZ0JBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7O0VBRUEsSUFBQSxJQUFJLEtBQUtuWSxDQUFBQSxXQUFMLEtBQXFCbVksZ0JBQXpCLEVBQTJDO0VBQ3pDbnVDLE1BQUFBLE1BQUksQ0FBQzJOLGFBQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTs7RUFFRHNjLElBQUFBLFlBQVksQ0FBTyxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFlBQUE7UUFBQSxPQUFNLEtBQUEsQ0FBS3VOLFFBQUwsRUFBTixDQUFBO0VBQUEsS0FBUCxDQUFaLENBQUE7RUFDQSxJQUFBLEtBQUEsQ0FBSzRXLG1CQUFMLEdBQTJCLEtBQUEsQ0FBS0MsY0FBTCxDQUFvQm5pQyxJQUFwQixDQUEzQixzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFSWSxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBU2IsR0FBQTs7OzthQXZCRCxTQUFVLE9BQUEsR0FBQTs7OztXQUVWLFNBQWMsR0FBQSxHQUFBO0VBQUU7RUFDZGxNLE1BQUFBLE1BQUksQ0FBQzROLFdBQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBZ0IsR0FBQSxHQUFBO0VBQUU7RUFDaEI1TixNQUFBQSxNQUFJLENBQUM0TixXQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQVcsR0FBQSxHQUFBO0VBQUU7RUFDWDVOLE1BQUFBLE1BQUksQ0FBQzROLFdBQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBYUQsU0FBVyxRQUFBLEdBQUE7UUFDVHJKLFNBQVMsQ0FBQ2hDLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBO1FBQ0EsSUFBS2c1QixDQUFBQSxpQkFBTCxJQUEwQixJQUFLLzNCLENBQUFBLFNBQUwsQ0FBZUksR0FBZixDQUFtQixJQUFLMjNCLENBQUFBLGlCQUF4QixDQUExQixDQUFBOztFQUVBLE1BQUEsSUFBSSxLQUFLbHpCLFFBQUwsQ0FBYzVSLE1BQWQsS0FBeUIsQ0FBN0IsRUFBZ0M7RUFDOUIsUUFBQSxPQUFBO0VBQ0QsT0FBQTs7UUFFRCxJQUFLdUgsQ0FBQUEsV0FBTCxDQUFpQmdDLE1BQUksQ0FBQ29KLGNBQUwsQ0FBb0IsSUFBQSxDQUFLa2xDLFNBQXpCLENBQWpCLENBQUEsQ0FBQTs7RUFFQSxNQUFBLElBQUEsQ0FBS0MsV0FBTCxFQUFBLENBQUE7O0VBRUEsTUFBQSxJQUFBLENBQUtDLHNCQUFMLEVBQUEsQ0FBQTs7RUFFQXpyQyxNQUFBQSxZQUFZLENBQUM4MEIsWUFBYixDQUEwQixJQUExQixFQUFnQyxLQUFLVixPQUFyQyxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF5QixzQkFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ3ZCK1csTUFBQUEsa0JBQWdCLENBQUM3NEMsT0FBakIsQ0FBeUIsVUFBQTB2QyxJQUFJLEVBQUk7RUFDL0IsUUFBQSxJQUFJLE1BQUksQ0FBQ3BtQyxZQUFMLENBQWtCb21DLElBQWxCLENBQUosRUFBNkI7RUFDM0IsVUFBQSxNQUFJLENBQUMwSixNQUFMLENBQVk3dkMsWUFBWixDQUF5Qm1tQyxJQUF6QixFQUErQixNQUFJLENBQUNoa0MsWUFBTCxDQUFrQmdrQyxJQUFsQixDQUEvQixDQUFBLENBQUE7RUFDRCxTQUZELE1BRU87RUFDTCxVQUFBLE1BQUksQ0FBQzBKLE1BQUwsQ0FBWXp0QyxlQUFaLENBQTRCK2pDLElBQTVCLENBQUEsQ0FBQTtFQUNELFNBQUE7U0FMSCxDQUFBLENBQUE7O0VBUUEsTUFBQSxJQUFBLENBQUswQixPQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsY0FBQSxDQUFleHBDLEtBQWYsRUFBc0I7UUFDcEIsSUFBTS9ILENBQUMsR0FBRyxJQUFJeVYsV0FBSixDQUFnQjFOLEtBQUssQ0FBQ3JFLElBQXRCLEVBQTRCO0VBQ3BDZ1MsUUFBQUEsT0FBTyxFQUFFLEtBRDJCO0VBRXBDQyxRQUFBQSxVQUFVLEVBQUUsSUFBQTtFQUZ3QixPQUE1QixDQUFWLENBQUE7RUFLQSxNQUFBLE9BQU8sSUFBS0MsQ0FBQUEsYUFBTCxDQUFtQjVWLENBQW5CLENBQVAsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWMsV0FBQSxHQUFBO0VBQ1osTUFBQSxJQUFJLElBQUt5SixDQUFBQSxZQUFMLENBQWtCLFVBQWxCLENBQUosRUFBbUM7VUFDakMsSUFBSzh2QyxDQUFBQSxNQUFMLENBQVk1NUIsRUFBWixHQUFpQixLQUFLOVQsWUFBTCxDQUFrQixVQUFsQixDQUFqQixDQUFBO0VBQ0QsT0FBQTtFQUNGLEtBQUE7OztXQUVELFNBQXdCLEdBQUEsR0FBQTtFQUN0QixNQUFBLE9BQU8sRUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBYSxHQUFBLEdBQUE7RUFDWCxNQUFBLE9BQU8sSUFBS3ZDLENBQUFBLGFBQUwsQ0FBbUIsT0FBbkIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBWSxHQUFBLEdBQUE7RUFDVixNQUFBLE9BQU8sSUFBS2l3QyxDQUFBQSxNQUFMLEtBQWdCLElBQWhCLEdBQ0gsSUFBSzF0QyxDQUFBQSxZQUFMLENBQWtCLE9BQWxCLENBREcsR0FFSCxJQUFLMHRDLENBQUFBLE1BQUwsQ0FBWTNpQyxLQUZoQixDQUFBOztFQUtGLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFVNGlDLEdBQVYsRUFBZTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNiemtCLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBTTtVQUN2QixJQUFJeWtCLEdBQUcsWUFBWXZyQixJQUFuQixFQUF5QjtZQUN2QnVyQixHQUFHLEdBQUdBLEdBQUcsQ0FBQ0MsV0FBSixFQUFBLENBQWtCeCtCLFNBQWxCLENBQTRCLENBQTVCLEVBQStCLEVBQS9CLENBQU4sQ0FBQTtFQUNELFNBQUE7O0VBQ0QsUUFBQSxNQUFJLENBQUNzK0IsTUFBTCxDQUFZM2lDLEtBQVosR0FBb0I0aUMsR0FBcEIsQ0FBQTs7RUFDQSxRQUFBLE1BQUksQ0FBQ2pJLE9BQUwsRUFBQSxDQUFBO0VBQ0QsT0FOVyxDQUFaLENBQUE7RUFPRCxLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2xCeGMsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO1VBQ3ZCLE1BQUksQ0FBQ3drQixNQUFMLENBQVl4NUMsZ0JBQVosQ0FBNkIsT0FBN0IsRUFBc0MsTUFBSSxDQUFDbTVDLG1CQUEzQyxDQUFBLENBQUE7O1VBQ0EsTUFBSSxDQUFDSyxNQUFMLENBQVl4NUMsZ0JBQVosQ0FBNkIsTUFBN0IsRUFBcUMsTUFBSSxDQUFDbTVDLG1CQUExQyxDQUFBLENBQUE7RUFDRCxPQUhXLENBQVosQ0FBQTtFQUlELEtBQUE7OzthQUVELFNBQXVCLG9CQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDckJua0IsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO1VBQ3ZCLE1BQUksQ0FBQ3drQixNQUFMLENBQVluMEMsbUJBQVosQ0FBZ0MsT0FBaEMsRUFBeUMsTUFBSSxDQUFDOHpDLG1CQUE5QyxDQUFBLENBQUE7O1VBQ0EsTUFBSSxDQUFDSyxNQUFMLENBQVluMEMsbUJBQVosQ0FBZ0MsTUFBaEMsRUFBd0MsTUFBSSxDQUFDOHpDLG1CQUE3QyxDQUFBLENBQUE7RUFDRCxPQUhXLENBQVosQ0FBQTtFQUlELEtBQUE7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUIxekMsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDNUMsTUFBQSxRQUFRdkksSUFBUjtFQUNFLFFBQUEsS0FBSyxVQUFMO1lBQ0V1dkIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFBO0VBQUEsWUFBQSxPQUFNbG5CLFlBQVksQ0FBQ20wQixpQkFBYixDQUErQmwwQixJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEMsTUFBOUMsRUFBb0QsTUFBSSxDQUFDazBCLE9BQXpELENBQU4sQ0FBQTtFQUFBLFdBQVAsQ0FBWixDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxVQUFMO1lBQ0VsTixZQUFZLENBQUMsSUFBRCxFQUFPLFlBQUE7Y0FBQSxPQUFNLE1BQUksQ0FBQ3NrQixXQUFMLEVBQU4sQ0FBQTtFQUFBLFdBQVAsQ0FBWixDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxPQUFMO1lBQ0V2dUMsTUFBSSxDQUFDcUwsWUFBTCxDQUFrQixJQUFsQixFQUF3QixJQUFLa3dCLENBQUFBLGlCQUE3QixFQUFnRCxJQUFBLENBQUtwRSxPQUFyRCxDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7RUFUSixPQUFBOztFQVlBLE1BQUEsSUFBSStXLGtCQUFnQixDQUFDcjdDLE9BQWpCLENBQXlCNkgsSUFBekIsQ0FBQSxJQUFrQyxDQUF0QyxFQUF5QztVQUN2Q3V2QixZQUFZLENBQUMsSUFBRCxFQUFPLFlBQUE7WUFBQSxPQUFNLE1BQUksQ0FBQ3VrQixzQkFBTCxFQUFOLENBQUE7RUFBQSxTQUFQLENBQVosQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFPLElBQUEsR0FBQTtRQUNMLElBQUtDLENBQUFBLE1BQUwsQ0FBWUcsSUFBWixFQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFRLEtBQUEsR0FBQTtRQUNOLElBQUtILENBQUFBLE1BQUwsQ0FBWWxpQixLQUFaLEVBQUEsQ0FBQTtFQUNELEtBQUE7OztXQTVCRCxTQUFnQyxHQUFBLEdBQUE7RUFDOUIsTUFBQSxPQUFBLENBQVEsVUFBUixFQUFvQixVQUFwQixFQUFnQyxPQUFoQyxTQUE0QzJoQixrQkFBNUMsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7OztJQS9HMkNuYTtBQTRJOUMvekIsUUFBSSxDQUFDNE8sdUJBQUwsQ0FBNkJ1L0IsZ0JBQTdCLEVBQStDLENBQUMsVUFBRCxDQUEvQyxDQUFBOztFQ3BLQSxJQUFNcnFDLFFBQU0sR0FBRztFQUNiLEVBQUEsYUFBQSxFQUFlLGVBREY7SUFFYixvQkFBc0IsRUFBQSxzQkFBQTtFQUZULENBQWYsQ0FBQTtFQUtBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BQ3FCK3FDOzs7OztJQUVuQixTQUFjLFlBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQSxJQUFBLEtBQUEsQ0FBS0MsYUFBTCxHQUFxQixLQUFBLENBQUtySSxPQUFMLENBQWF2NkIsSUFBYixDQUFyQixzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFDQSxJQUFBLEtBQUEsQ0FBSzZpQyxlQUFMLEdBQXVCLEtBQUEsQ0FBS3RJLE9BQUwsQ0FBYXY2QixJQUFiLENBQXZCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUpZLElBQUEsT0FBQSxLQUFBLENBQUE7RUFLYixHQUFBO0VBRUQ7Ozs7O2FBRUEsU0FBVSxPQUFBLEdBQUE7RUFDUixNQUFBLElBQUEsQ0FBSzhpQyxZQUFMLEVBQUEsQ0FBQTs7RUFDQSxNQUFBLElBQUEsQ0FBS0MsaUJBQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU9uckMsUUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBZ0IsR0FBQSxHQUFBO0VBQ2QsTUFBQSxPQUFBLHdCQUFBLENBQUEsTUFBQSxDQUNpQixLQUFLbEwsSUFEdEIsRUFBQSxpRkFBQSxDQUFBLENBQUE7RUFJRCxLQUFBOzs7V0FFRCxTQUFXLEdBQUEsR0FBQTtFQUNULE1BQUEsSUFBTUEsSUFBSSxHQUFHLElBQUEsQ0FBS21JLFlBQUwsQ0FBa0IsTUFBbEIsQ0FBYixDQUFBO0VBQ0EsTUFBQSxPQUFRLENBQUMsVUFBRCxFQUFhLE9BQWIsQ0FBc0JsTyxDQUFBQSxPQUF0QixDQUE4QitGLElBQTlCLENBQXNDLEdBQUEsQ0FBdkMsSUFBNkNBLElBQTdDLElBQXFELE1BQTVELENBQUE7O0VBR0YsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQVNrVCxLQUFULEVBQWdCO0VBQ2QsTUFBQSxJQUFBLENBQUtsTixZQUFMLENBQWtCLE1BQWxCLEVBQTBCa04sS0FBMUIsQ0FBQSxDQUFBO0VBQ0QsS0FBQTtFQUVEOzs7O2FBRUEsU0FBZSxZQUFBLEdBQUE7RUFDYixNQUFBLElBQU13ZixLQUFLLEdBQUcsSUFBQSxDQUFLdnFCLFlBQUwsQ0FBa0IsYUFBbEIsS0FBb0MsRUFBbEQsQ0FBQTs7RUFFQSxNQUFBLElBQUksT0FBTyxJQUFLbXVDLENBQUFBLE9BQUwsQ0FBYW45QixXQUFwQixLQUFvQyxXQUF4QyxFQUFxRDtFQUNuRCxRQUFBLElBQUEsQ0FBS205QixPQUFMLENBQWFuOUIsV0FBYixHQUEyQnVaLEtBQTNCLENBQUE7RUFDRCxPQUZELE1BRU87RUFDTCxRQUFBLElBQUEsQ0FBSzRqQixPQUFMLENBQWFDLFNBQWIsR0FBeUI3akIsS0FBekIsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO0VBQ2xCLE1BQUEsSUFBSSxJQUFLeGYsQ0FBQUEsS0FBTCxLQUFlLEVBQW5CLEVBQXVCO0VBQ3JCLFFBQUEsSUFBQSxDQUFLb2pDLE9BQUwsQ0FBYTFyQyxTQUFiLENBQXVCSyxNQUF2QixDQUE4QixxQ0FBOUIsQ0FBQSxDQUFBO0VBQ0QsT0FGRCxNQUVPO0VBQ0wsUUFBQSxJQUFBLENBQUtxckMsT0FBTCxDQUFhMXJDLFNBQWIsQ0FBdUJJLEdBQXZCLENBQTJCLHFDQUEzQixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O1dBRUQsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU8sSUFBS3BGLENBQUFBLGFBQUwsQ0FBbUIsTUFBbkIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBb0IsaUJBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNsQixNQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFBLG1CQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBOztRQUVBeXJCLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBTTtVQUN2QixNQUFJLENBQUN3a0IsTUFBTCxDQUFZeDVDLGdCQUFaLENBQTZCLE9BQTdCLEVBQXNDLE1BQUksQ0FBQzY1QyxhQUEzQyxDQUFBLENBQUE7O1VBQ0EsTUFBSSxDQUFDTCxNQUFMLENBQVl4NUMsZ0JBQVosQ0FBNkIsU0FBN0IsRUFBd0MsTUFBSSxDQUFDODVDLGVBQTdDLENBQUEsQ0FBQTtFQUNELE9BSFcsQ0FBWixDQUFBO0VBS0EsTUFBQSxJQUFNbjJDLElBQUksR0FBRyxJQUFBLENBQUttSSxZQUFMLENBQWtCLE1BQWxCLENBQWIsQ0FBQTs7UUFDQSxJQUFJLENBQUMsVUFBRCxFQUFhLE9BQWIsQ0FBQSxDQUFzQmxPLE9BQXRCLENBQThCK0YsSUFBOUIsQ0FBdUMsSUFBQSxDQUEzQyxFQUE4QztFQUM1Q29ILFFBQUFBLE1BQUksQ0FBQ08sSUFBTCxDQUFvQzNILDBCQUFBQSxDQUFBQSxNQUFBQSxDQUFBQSxJQUFwQyxzREFBbUZBLElBQW5GLEVBQUEsWUFBQSxDQUFBLENBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUF1QixvQkFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ3JCLE1BQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQUEsc0JBQUEsRUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7O1FBRUFxeEIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO1VBQ3ZCLE1BQUksQ0FBQ3drQixNQUFMLENBQVluMEMsbUJBQVosQ0FBZ0MsT0FBaEMsRUFBeUMsTUFBSSxDQUFDdzBDLGFBQTlDLENBQUEsQ0FBQTs7VUFDQSxNQUFJLENBQUNMLE1BQUwsQ0FBWW4wQyxtQkFBWixDQUFnQyxTQUFoQyxFQUEyQyxNQUFJLENBQUN5MEMsZUFBaEQsQ0FBQSxDQUFBO0VBQ0QsT0FIVyxDQUFaLENBQUE7RUFJRCxLQUFBOzs7RUFNRCxJQUFBLEtBQUEsRUFBQSxTQUFBLHdCQUFBLENBQXlCcjBDLElBQXpCLEVBQStCc0ksSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQzVDLE1BQUEsUUFBUXZJLElBQVI7RUFDRSxRQUFBLEtBQUssTUFBTDtZQUNFdXZCLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBQTtjQUFBLE9BQU0sTUFBSSxDQUFDd2tCLE1BQUwsQ0FBWTd2QyxZQUFaLENBQXlCLE1BQXpCLEVBQWlDLE1BQUksQ0FBQ2hHLElBQXRDLENBQU4sQ0FBQTtFQUFBLFdBQVAsQ0FBWixDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUE7RUFDRSxVQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFBLDBCQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBK0I4QixJQUEvQixFQUFxQ3NJLElBQXJDLEVBQTJDQyxPQUEzQyxDQUFBLENBQUE7O0VBTEosT0FBQTtFQU9ELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQXZGRSxTQUFnQyxHQUFBLEdBQUE7RUFDOUIsTUFBQSxPQUFBLEVBQUEsQ0FBQSxNQUFBLENBQUEsa0JBQUEsQ0FBQSxJQUFBLENBQUEsZUFBQSxDQUFBLFlBQUEsQ0FBQSxFQUFBLG9CQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxDQUFxQyxNQUFyQyxDQUFBLENBQUEsQ0FBQTtFQUNELEtBQUE7Ozs7SUFyRnVDa3JDO0FBNksxQ251QyxRQUFJLENBQUM0Tyx1QkFBTCxDQUE2QmlnQyxZQUE3QixFQUEyQyxDQUFDLE9BQUQsQ0FBM0MsQ0FBQSxDQUFBO0VBRUFsZ0MsV0FBVyxDQUFDeWdDLEtBQVosR0FBb0JQLFlBQXBCLENBQUE7RUFDQTM2QyxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixXQUF0QixFQUFtQ3dhLFlBQW5DLENBQUE7O01DaE9xQlE7Ozs7O0lBRW5CLFNBQWMsbUJBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLG1CQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBOztFQUVBLElBQUEsSUFBSSxLQUFLclosQ0FBQUEsV0FBTCxLQUFxQnFaLG1CQUF6QixFQUE4QztFQUM1Q3J2QyxNQUFBQSxJQUFJLENBQUMyTixhQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7O0VBRURzYyxJQUFBQSxZQUFZLGdDQUFPLFlBQU07UUFDdkIsS0FBSzZQLENBQUFBLHdCQUFMLENBQThCLFNBQTlCLEVBQXlDLElBQXpDLEVBQStDLEtBQUsvNEIsQ0FBQUEsWUFBTCxDQUFrQixTQUFsQixDQUEvQyxDQUFBLENBQUE7RUFDRCxLQUZXLENBQVosQ0FBQTtFQVBZLElBQUEsT0FBQSxLQUFBLENBQUE7RUFVYixHQUFBO0VBRUQ7Ozs7O1dBRUEsU0FBZ0IsR0FBQSxHQUFBO0VBQ2QsTUFBQSxPQUFBLHdCQUFBLENBQUEsTUFBQSxDQUNpQixLQUFLbkksSUFEdEIsRUFBQSxhQUFBLENBQUEsQ0FBQSxNQUFBLENBQ3NDLEtBQUsyaUMsaUJBRDNDLEVBQUEsa0NBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FFaUIsS0FBS0EsaUJBRnRCLEVBQUEsNkJBQUEsQ0FBQSxDQUFBO0VBSUQsS0FBQTtFQUVEOzs7O1dBRUEsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU8sSUFBSy84QixDQUFBQSxhQUFMLENBQW1CLE1BQW5CLENBQVAsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQWMsR0FBQSxHQUFBO1FBQ1osT0FBTyxJQUFBLENBQUtpd0MsTUFBTCxDQUFZYSxPQUFuQixDQUFBOztFQUdGLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFZWixHQUFaLEVBQWlCO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2Z6a0IsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO0VBQ3ZCLFFBQUEsTUFBSSxDQUFDd2tCLE1BQUwsQ0FBWWEsT0FBWixHQUFzQlosR0FBdEIsQ0FBQTtFQUNELE9BRlcsQ0FBWixDQUFBO0VBR0QsS0FBQTs7O0VBTUQsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5QmgwQyxJQUF6QixFQUErQnNJLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QztFQUM1QyxNQUFBLFFBQVF2SSxJQUFSO0VBQ0UsUUFBQSxLQUFLLFNBQUw7RUFDRSxVQUFBLElBQUEsQ0FBSzQwQyxPQUFMLEdBQWVyc0MsT0FBTyxLQUFLLElBQTNCLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQTtFQUNFLFVBQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxtQkFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFBLDBCQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBK0J2SSxJQUEvQixFQUFxQ3NJLElBQXJDLEVBQTJDQyxPQUEzQyxDQUFBLENBQUE7O0VBTEosT0FBQTtFQU9ELEtBQUE7OztXQVpELFNBQWdDLEdBQUEsR0FBQTtFQUM5QixNQUFBLE9BQUEsRUFBQSxDQUFBLE1BQUEsQ0FBQSxrQkFBQSxDQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsbUJBQUEsQ0FBQSxFQUFBLG9CQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxDQUFxQyxTQUFyQyxDQUFBLENBQUEsQ0FBQTtFQUNELEtBQUE7Ozs7SUF6QzhDa3JDOztFQ0FqRCxJQUFNcnFDLFFBQU0sR0FBRztFQUNiLEVBQUEsV0FBQSxFQUFhLGFBREE7RUFFYixFQUFBLGtCQUFBLEVBQW9CLG9CQUZQO0lBR2Isc0JBQXdCLEVBQUEsd0JBQUE7RUFIWCxDQUFmLENBQUE7RUFNQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BQ3FCeXJDOzs7Ozs7Ozs7Ozs7O1dBRW5CLFNBQWMsR0FBQSxHQUFBO0VBQ1osTUFBQSxPQUFPenJDLFFBQVAsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQXdCLEdBQUEsR0FBQTtFQUN0QixNQUFBLE9BQU8sVUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBVyxHQUFBLEdBQUE7RUFDVCxNQUFBLE9BQU8sVUFBUCxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7OztJQTVENkN1ckM7RUErRDdDMWdDLFdBQVcsQ0FBQzZnQyxRQUFaLEdBQXVCRCxlQUF2QixDQUFBO0VBQ0FyN0MsY0FBYyxDQUFDbWdDLE1BQWYsQ0FBc0IsY0FBdEIsRUFBc0NrYixlQUF0QyxDQUFBOztFQzdHQSxJQUFNenJDLFFBQU0sR0FBRztFQUNiLEVBQUEsZUFBQSxFQUFpQixpQkFESjtFQUViLEVBQUEsc0JBQUEsRUFBd0Isd0JBRlg7SUFHYiwwQkFBNEIsRUFBQSw0QkFBQTtFQUhmLENBQWYsQ0FBQTtFQU1BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFDcUIyckM7Ozs7Ozs7Ozs7Ozs7V0FFbkIsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU8zckMsUUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBd0IsR0FBQSxHQUFBO0VBQ3RCLE1BQUEsT0FBTyxjQUFQLENBQUE7RUFDRCxLQUFBOzs7V0FFRCxTQUFXLEdBQUEsR0FBQTtFQUNULE1BQUEsT0FBTyxPQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7O0lBNUQwQ3VyQztFQStEMUMxZ0MsV0FBVyxDQUFDK2dDLEtBQVosR0FBb0JELFlBQXBCLENBQUE7RUFDQXY3QyxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixXQUF0QixFQUFtQ29iLFlBQW5DLENBQUE7O0VDMUdBLElBQU0zckMsUUFBTSxHQUFHO0lBQ2IsZUFBaUIsRUFBQSxpQkFBQTtFQURKLENBQWYsQ0FBQTtFQUlBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFDcUI2ckM7Ozs7Ozs7Ozs7Ozs7V0FFbkIsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU83ckMsUUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBZ0IsR0FBQSxHQUFBO0VBQ2QsTUFBQSxPQUFBLHdCQUFBLENBQUEsTUFBQSxDQUNpQixLQUFLbEwsSUFEdEIsRUFBQSxrQ0FBQSxDQUFBLENBQUE7RUFHRCxLQUFBOzs7V0FFRCxTQUFXLEdBQUEsR0FBQTtFQUNULE1BQUEsT0FBTyxRQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7O0lBdERnRHUxQztFQXlEaER4L0IsV0FBVyxDQUFDaWhDLFdBQVosR0FBMEJELGtCQUExQixDQUFBO0VBQ0F6N0MsY0FBYyxDQUFDbWdDLE1BQWYsQ0FBc0Isa0JBQXRCLEVBQTBDc2Isa0JBQTFDLENBQUE7O01DL0ZxQkU7Ozs7O0VBRW5CO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNFLFNBQWlFLGFBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxJQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUosRUFBSTtFQUFBLFFBQUEsV0FBQSxHQUFBLElBQUEsQ0FBcER6M0IsTUFBb0Q7VUFBcERBLE1BQW9ELDRCQUEzQyxRQUEyQyxHQUFBLFdBQUE7RUFBQSxRQUFBLFVBQUEsR0FBQSxJQUFBLENBQWpDbEUsS0FBaUM7VUFBakNBLEtBQWlDLDJCQUF6QixDQUF5QixHQUFBLFVBQUE7RUFBQSxRQUFBLGFBQUEsR0FBQSxJQUFBLENBQXRCRCxRQUFzQjtVQUF0QkEsUUFBc0IsOEJBQVgsR0FBVyxHQUFBLGFBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsYUFBQSxDQUFBLENBQUE7O01BQUEsT0FDekQsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQUE7RUFBRW1FLE1BQUFBLE1BQU0sRUFBTkEsTUFBRjtFQUFVbEUsTUFBQUEsS0FBSyxFQUFMQSxLQUFWO0VBQWlCRCxNQUFBQSxRQUFRLEVBQVJBLFFBQUFBO09BRHdDLENBQUEsQ0FBQTtFQUVoRSxHQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7Ozs7O2FBQ0UsU0FBSzY3QixJQUFBQSxDQUFBQSxLQUFMLEVBQVk1NEMsUUFBWixFQUFzQjtRQUNwQkEsUUFBUSxFQUFBLENBQUE7RUFDVCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUFLNDRDLElBQUFBLENBQUFBLEtBQUwsRUFBWTU0QyxRQUFaLEVBQXNCO1FBQ3BCQSxRQUFRLEVBQUEsQ0FBQTtFQUNULEtBQUE7Ozs7SUExQndDbzlCOztFQ0UzQztFQUNBO0VBQ0E7O01BQ3FCeWI7Ozs7O0lBRW5CLFNBQWlFLGlCQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsSUFBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFKLEVBQUk7RUFBQSxRQUFBLFdBQUEsR0FBQSxJQUFBLENBQXBEMzNCLE1BQW9EO1VBQXBEQSxNQUFvRCw0QkFBM0MsUUFBMkMsR0FBQSxXQUFBO0VBQUEsUUFBQSxVQUFBLEdBQUEsSUFBQSxDQUFqQ2xFLEtBQWlDO1VBQWpDQSxLQUFpQywyQkFBekIsQ0FBeUIsR0FBQSxVQUFBO0VBQUEsUUFBQSxhQUFBLEdBQUEsSUFBQSxDQUF0QkQsUUFBc0I7VUFBdEJBLFFBQXNCLDhCQUFYLEdBQVcsR0FBQSxhQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGlCQUFBLENBQUEsQ0FBQTs7TUFBQSxPQUN6RCxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBQTtFQUFFbUUsTUFBQUEsTUFBTSxFQUFOQSxNQUFGO0VBQVVsRSxNQUFBQSxLQUFLLEVBQUxBLEtBQVY7RUFBaUJELE1BQUFBLFFBQVEsRUFBUkEsUUFBQUE7T0FEd0MsQ0FBQSxDQUFBO0VBRWhFLEdBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTs7Ozs7YUFDRSxTQUFLNjdCLElBQUFBLENBQUFBLEtBQUwsRUFBWTU0QyxRQUFaLEVBQXNCO0VBQ3BCQSxNQUFBQSxRQUFRLEdBQUdBLFFBQVEsR0FBR0EsUUFBSCxHQUFjLFlBQVcsRUFBNUMsQ0FBQTtRQUVBNjVCLE1BQU0sQ0FBQytlLEtBQUQsRUFBUSxJQUFBLENBQUt2YixHQUFiLENBQU4sQ0FDR25hLE9BREgsQ0FDVztFQUFFcWIsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBWCxPQURYLEVBQzJCO0VBQUVBLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQVgsT0FEM0IsQ0FFR3JnQyxDQUFBQSxLQUZILENBRVMsVUFBQThrQixJQUFJLEVBQUk7VUFDYmhqQixRQUFRLEVBQUEsQ0FBQTtVQUNSZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsT0FMSCxFQU1HRCxJQU5ILEVBQUEsQ0FBQTtFQU9ELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTs7OzthQUNFLFNBQUs2MUIsSUFBQUEsQ0FBQUEsS0FBTCxFQUFZNTRDLFFBQVosRUFBc0I7RUFDcEJBLE1BQUFBLFFBQVEsR0FBR0EsUUFBUSxHQUFHQSxRQUFILEdBQWMsWUFBVyxFQUE1QyxDQUFBO1FBRUE2NUIsTUFBTSxDQUFDK2UsS0FBRCxFQUFRLElBQUEsQ0FBS3ZiLEdBQWIsQ0FBTixDQUNHbmEsT0FESCxDQUNXO0VBQUVxYixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFYLE9BRFgsRUFDMkI7RUFBRUEsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBWCxPQUQzQixDQUVHcmdDLENBQUFBLEtBRkgsQ0FFUyxVQUFBOGtCLElBQUksRUFBSTtVQUNiaGpCLFFBQVEsRUFBQSxDQUFBO1VBQ1JnakIsSUFBSSxFQUFBLENBQUE7RUFDTCxPQUxILEVBTUdELElBTkgsRUFBQSxDQUFBO0VBT0QsS0FBQTs7OztJQXBDNEM0MUI7O0VDSi9DO0VBQ0E7RUFDQTs7TUFFcUJHOzs7OztJQUVuQixTQUF1RixpQkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLElBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBSixFQUFJO0VBQUEsUUFBQSxXQUFBLEdBQUEsSUFBQSxDQUExRTUzQixNQUEwRTtVQUExRUEsTUFBMEUsNEJBQWpFLDhCQUFpRSxHQUFBLFdBQUE7RUFBQSxRQUFBLFVBQUEsR0FBQSxJQUFBLENBQWpDbEUsS0FBaUM7VUFBakNBLEtBQWlDLDJCQUF6QixDQUF5QixHQUFBLFVBQUE7RUFBQSxRQUFBLGFBQUEsR0FBQSxJQUFBLENBQXRCRCxRQUFzQjtVQUF0QkEsUUFBc0IsOEJBQVgsR0FBVyxHQUFBLGFBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsaUJBQUEsQ0FBQSxDQUFBOztNQUFBLE9BQy9FLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFBO0VBQUVtRSxNQUFBQSxNQUFNLEVBQU5BLE1BQUY7RUFBVWxFLE1BQUFBLEtBQUssRUFBTEEsS0FBVjtFQUFpQkQsTUFBQUEsUUFBUSxFQUFSQSxRQUFBQTtPQUQ4RCxDQUFBLENBQUE7RUFFdEYsR0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBOzs7OzthQUNFLFNBQUs2N0IsSUFBQUEsQ0FBQUEsS0FBTCxFQUFZNTRDLFFBQVosRUFBc0I7RUFDcEJBLE1BQUFBLFFBQVEsR0FBR0EsUUFBUSxHQUFHQSxRQUFILEdBQWMsWUFBVyxFQUE1QyxDQUFBO1FBRUE2NUIsTUFBTSxDQUFDK2UsS0FBRCxFQUFRLElBQUEsQ0FBS3ZiLEdBQWIsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUseUJBQUE7RUFBYixPQUZKLEVBR0k7RUFBRUEsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO0VBQWIsT0FISixDQUtHdmdDLENBQUFBLEtBTEgsQ0FLUyxVQUFBOGtCLElBQUksRUFBSTtVQUNiaGpCLFFBQVEsRUFBQSxDQUFBO1VBQ1JnakIsSUFBSSxFQUFBLENBQUE7RUFDTCxPQVJILEVBU0dELElBVEgsRUFBQSxDQUFBO0VBVUQsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBOzs7O2FBQ0UsU0FBSzYxQixJQUFBQSxDQUFBQSxLQUFMLEVBQVk1NEMsUUFBWixFQUFzQjtFQUNwQkEsTUFBQUEsUUFBUSxHQUFHQSxRQUFRLEdBQUdBLFFBQUgsR0FBYyxZQUFXLEVBQTVDLENBQUE7UUFFQTY1QixNQUFNLENBQUMrZSxLQUFELEVBQVEsSUFBQSxDQUFLdmIsR0FBYixDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXViLFFBQUFBLFNBQVMsRUFBRSxzQkFBQTtFQUFiLE9BRkosRUFHSTtFQUFFQSxRQUFBQSxTQUFTLEVBQUUseUJBQUE7RUFBYixPQUhKLENBS0d2Z0MsQ0FBQUEsS0FMSCxDQUtTLFVBQUE4a0IsSUFBSSxFQUFJO1VBQ2JoakIsUUFBUSxFQUFBLENBQUE7VUFDUmdqQixJQUFJLEVBQUEsQ0FBQTtFQUNMLE9BUkgsRUFTR0QsSUFUSCxFQUFBLENBQUE7RUFVRCxLQUFBOzs7O0lBMUM0QzQxQjs7RUNJL0MsSUFBTS9yQyxRQUFNLEdBQUc7RUFDYixFQUFBLEVBQUEsRUFBSSxVQURTO0lBRWIsZ0JBQWtCLEVBQUEsbUJBQUE7RUFGTCxDQUFmLENBQUE7RUFLQSxJQUFNeTFCLGtCQUFnQixHQUFHLE9BQXpCLENBQUE7RUFFQSxJQUFNakMsZUFBYSxHQUFHO0VBQ3BCLEVBQUEsU0FBQSxFQUFXdVksYUFEUztFQUVwQixFQUFBLE1BQUEsRUFBUUUsaUJBRlk7RUFHcEIsRUFBQSxNQUFBLEVBQVFDLGlCQUhZO0lBSXBCLE1BQVFILEVBQUFBLGFBQUFBO0VBSlksQ0FBdEIsQ0FBQTtFQU9BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFDcUJJOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0lBRUUsU0FBYyxZQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxZQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBOztFQUVBLElBQUEsS0FBQSxDQUFLN1osV0FBTCxHQUFtQixZQUFBO0VBQUEsTUFBQSxPQUFNeDhCLFNBQU4sQ0FBQTtPQUFuQixDQUFBOztFQUNBcXdCLElBQUFBLFlBQVksQ0FBTyxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFlBQUE7UUFBQSxPQUFNLEtBQUEsQ0FBS3VOLFFBQUwsRUFBTixDQUFBO0VBQUEsS0FBUCxDQUFaLENBQUE7RUFKWSxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBS2IsR0FBQTs7OztXQUVELFNBQWMsR0FBQSxHQUFBO0VBQ1osTUFBQSxPQUFPMXpCLFFBQVAsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQXlCLHNCQUFBLEdBQUE7UUFDdkIsT0FBTyxJQUFJa1AsZUFBSixDQUFvQjtFQUN6QkUsUUFBQUEsU0FBUyxFQUFFb2tCLGVBRGM7RUFFekJsa0IsUUFBQUEsU0FBUyxFQUFFeThCLGFBRmM7RUFHekJ2OEIsUUFBQUEsYUFBYSxFQUFFLGVBSFU7RUFJekJFLFFBQUFBLGdCQUFnQixFQUFFLElBQUEsQ0FBS3pTLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBQTtFQUpPLE9BQXBCLENBQVAsQ0FBQTtFQU1ELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OzthQUVFLFNBQVcsUUFBQSxHQUFBO0VBQ1QsTUFBQSxJQUFBLENBQUtYLEtBQUwsQ0FBVzRWLE9BQVgsR0FBcUIsTUFBckIsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLNVYsS0FBTCxDQUFXb1csTUFBWCxHQUFvQixLQUFwQixDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtoVCxTQUFMLENBQWVJLEdBQWYsQ0FBbUIyMUIsa0JBQW5CLENBQUEsQ0FBQTs7UUFFQSxJQUFJLENBQUN2NUIsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsaUJBQXJCLENBQUwsRUFBOEM7RUFDNUMsUUFBQSxJQUFNOEIsT0FBTyxHQUFHbFksUUFBUSxDQUFDME0sYUFBVCxDQUF1QixLQUF2QixDQUFoQixDQUFBO0VBQ0F3TCxRQUFBQSxPQUFPLENBQUM3RixTQUFSLENBQWtCSSxHQUFsQixDQUFzQixnQkFBdEIsQ0FBQSxDQUFBOztFQUVBLFFBQUEsT0FBTyxJQUFLNEQsQ0FBQUEsVUFBTCxDQUFnQixDQUFoQixDQUFQLEVBQTJCO0VBQ3pCLFVBQUEsSUFBTXpSLElBQUksR0FBRyxJQUFBLENBQUt5UixVQUFMLENBQWdCLENBQWhCLENBQWIsQ0FBQTtZQUNBLElBQUt6SixDQUFBQSxXQUFMLENBQWlCaEksSUFBakIsQ0FBQSxDQUFBO0VBQ0FzVCxVQUFBQSxPQUFPLENBQUNxRCxZQUFSLENBQXFCM1csSUFBckIsRUFBMkIsSUFBM0IsQ0FBQSxDQUFBO0VBQ0QsU0FBQTs7VUFFRCxJQUFLaUksQ0FBQUEsV0FBTCxDQUFpQnFMLE9BQWpCLENBQUEsQ0FBQTtFQUNELE9BQUE7O0VBRUR0RyxNQUFBQSxZQUFZLENBQUM4MEIsWUFBYixDQUEwQixJQUExQixFQUFnQyxLQUFLVixPQUFyQyxDQUFBLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFlBQUEsQ0FBYVosVUFBYixFQUF5QjtRQUN2QixJQUFLbjJCLENBQUFBLEtBQUwsQ0FBVzRWLE9BQVgsR0FBcUJ1Z0IsVUFBVSxHQUFHLE9BQUgsR0FBYSxNQUE1QyxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBb0IsaUJBQUEsR0FBQTtFQUNsQixNQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFBLG1CQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBdUIsb0JBQUEsR0FBQTtFQUNyQixNQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFBLHNCQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O0VBTUUsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5Qjc3QixJQUF6QixFQUErQnNJLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QztRQUM1QyxJQUFJdkksSUFBSSxLQUFLLE9BQWIsRUFBc0I7RUFDcEJzRixRQUFBQSxNQUFJLENBQUNxTCxZQUFMLENBQWtCLElBQWxCLEVBQXdCa3VCLGtCQUF4QixFQUEwQ3oxQixRQUExQyxDQUFBLENBQUE7RUFDRCxPQUZELE1BRU87RUFDTCxRQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsWUFBQSxDQUFBLFNBQUEsQ0FBQSxFQUFBLDBCQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBK0JwSixJQUEvQixFQUFxQ3NJLElBQXJDLEVBQTJDQyxPQUEzQyxDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBOzs7O1dBZkUsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBQSxFQUFBLENBQUEsTUFBQSxDQUFBLGtCQUFBLENBQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxZQUFBLENBQUEsRUFBQSxvQkFBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBcUMsT0FBckMsQ0FBQSxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFjRCxTQUF3QnZJLGdCQUFBQSxDQUFBQSxJQUF4QixFQUE4Qm9aLFFBQTlCLEVBQXdDO0VBQ3RDLE1BQUEsSUFBSSxFQUFFQSxRQUFRLENBQUN4Z0IsU0FBVCxZQUE4QnU4QyxhQUFoQyxDQUFKLEVBQW9EO1VBQ2xEN3ZDLE1BQUksQ0FBQzhOLGFBQUwsQ0FBbUIsT0FBbkIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFDRHdwQixNQUFBQSxlQUFhLENBQUM1OEIsSUFBRCxDQUFiLEdBQXNCb1osUUFBdEIsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQXVCLEdBQUEsR0FBQTtFQUNyQixNQUFBLE9BQU93akIsZUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBMkIsR0FBQSxHQUFBO0VBQ3pCLE1BQUEsT0FBT3VZLGFBQVAsQ0FBQTtFQUNELEtBQUE7Ozs7SUF6UHVDOVo7RUE0UDFDcG5CLFdBQVcsQ0FBQ3VoQyxLQUFaLEdBQW9CRCxZQUFwQixDQUFBO0VBQ0EvN0MsY0FBYyxDQUFDbWdDLE1BQWYsQ0FBc0IsV0FBdEIsRUFBbUM0YixZQUFuQyxDQUFBOztFQzlTQSxJQUFNRSxTQUFTLEdBQUcsU0FBWkEsU0FBWSxDQUFDcitDLEtBQUQsRUFBVztFQUMzQixFQUFBLElBQUEsSUFBQSxHQUFvQixDQUFDTSxRQUFRLENBQUNOLEtBQUQsRUFBUSxFQUFSLENBQVQsRUFBc0IsSUFBS0wsQ0FBQUEsSUFBTCxDQUFVSyxLQUFWLENBQXRCLENBQXBCO0VBQUEsTUFBT2dhLEtBQVAsR0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBO0VBQUEsTUFBY3NrQyxFQUFkLEdBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQSxDQUFBO0VBQ0EsRUFBQSxPQUFPQSxFQUFFLEdBQUd0a0MsS0FBSCxHQUFXL1csSUFBSSxDQUFDd2xDLEtBQUwsQ0FBV3BwQyxRQUFRLENBQUM0VyxJQUFULENBQWNzb0MsV0FBZCxHQUE0QnZrQyxLQUE1QixHQUFvQyxHQUEvQyxDQUFwQixDQUFBO0VBQ0QsQ0FIRCxDQUFBOztNQUtxQndrQztFQUVuQixFQUFBLFNBQUEsV0FBQSxDQUFZcDRCLE1BQVosRUFBb0I7RUFBQSxJQUFBLElBQUEsS0FBQSxHQUFBLElBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsV0FBQSxDQUFBLENBQUE7O0VBQ2xCLElBQUEsOEVBQUEsQ0FDRzVsQixLQURILENBQ1MsS0FEVCxFQUNnQitDLE9BRGhCLENBQ3dCLFVBQUFpTCxHQUFHLEVBQUE7UUFBQSxPQUFJLEtBQUksQ0FBQ0EsR0FBRCxDQUFKLEdBQVk0WCxNQUFNLENBQUM1WCxHQUFELENBQXRCLENBQUE7T0FEM0IsQ0FBQSxDQUFBO01BR0EsSUFBS2l3QyxDQUFBQSxjQUFMLEdBQXNCcjRCLE1BQU0sQ0FBQ3E0QixjQUFQLElBQXlCcjRCLE1BQU0sQ0FBQy9YLE9BQXRELENBQUE7O0VBQ0EsSUFBQSxJQUFBLENBQUtxd0MsWUFBTCxHQUFvQnQ0QixNQUFNLENBQUNzNEIsWUFBUCxJQUF3QixZQUFBO0VBQUEsTUFBQSxPQUFNLEVBQU4sQ0FBQTtPQUE1QyxDQUFBOztFQUNBLElBQUEsSUFBQSxDQUFLQyxPQUFMLEdBQWV2NEIsTUFBTSxDQUFDdTRCLE9BQVAsSUFBbUIsWUFBQTtFQUFBLE1BQUEsT0FBTSxNQUFOLENBQUE7T0FBbEMsQ0FBQTs7TUFFQSxJQUFLQyxDQUFBQSxhQUFMLEdBQXFCLElBQUtBLENBQUFBLGFBQUwsQ0FBbUJ4a0MsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBckIsQ0FBQTtNQUVBLElBQUsyeUIsQ0FBQUEsZ0JBQUwsR0FBd0I3K0IsTUFBSSxDQUFDcUcsT0FBTCxDQUFhSSxjQUFiLEtBQWdDLEtBQXhELENBQUE7RUFDRCxHQUFBOzs7O2FBRUQsU0FBMkQsTUFBQSxHQUFBO1FBQUEsSUFBcERxNEIsU0FBb0QsdUVBQXhDLElBQUszK0IsQ0FBQUEsT0FBTCxDQUFheEIsWUFBYixDQUEwQixXQUExQixDQUF3QyxDQUFBOztRQUN6RCxJQUFJLENBQUMsSUFBS2d5QyxDQUFBQSxlQUFWLEVBQTJCO0VBQ3pCLFFBQUEsSUFBQSxDQUFLQSxlQUFMLEdBQXVCLElBQUlsNUIsZUFBSixDQUFvQixJQUFBLENBQUs4NEIsY0FBekIsRUFBeUM7RUFBRTFwQixVQUFBQSxlQUFlLEVBQUUsQ0FBbkI7WUFBc0JuUCxPQUFPLEVBQUUsQ0FBQyxJQUFLbW5CLENBQUFBLGdCQUFBQTtFQUFyQyxTQUF6QyxDQUF2QixDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQU1wMkIsTUFBTSxHQUFHcTJCLFNBQVMsR0FBRyxJQUFILEdBQVUsS0FBbEMsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLNlIsZUFBTCxDQUFxQmxvQyxNQUFyQixFQUE2Qix3QkFBN0IsRUFBdUQsS0FBS2lvQyxhQUE1RCxDQUFBLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLGFBQUEsQ0FBY3g3QyxDQUFkLEVBQWlCO1FBQ2YsSUFBSUEsQ0FBQyxDQUFDb1osT0FBTixFQUFlO0VBQ2IsUUFBQSxJQUFJcFosQ0FBQyxDQUFDMEQsSUFBRixLQUFXLFdBQWYsRUFBNEI7WUFDMUIsSUFBSzZsQyxDQUFBQSxXQUFMLENBQWlCdnBDLENBQWpCLENBQUEsQ0FBQTtFQUNELFNBRkQsTUFFTyxJQUFJLENBQUMsSUFBQSxDQUFLaXNDLFdBQVYsRUFBdUI7RUFDNUJqc0MsVUFBQUEsQ0FBQyxDQUFDMEQsSUFBRixLQUFXLFNBQVgsR0FBdUIsSUFBSytsQyxDQUFBQSxTQUFMLENBQWV6cEMsQ0FBZixDQUF2QixHQUEyQyxJQUFBLENBQUt3cEMsTUFBTCxDQUFZeHBDLENBQVosQ0FBM0MsQ0FBQTtFQUNELFNBQUE7RUFDRixPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxXQUFBLENBQVkrSCxLQUFaLEVBQW1CO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2pCLElBQU1takIsV0FBVyxHQUFHLFNBQWRBLFdBQWMsR0FBQTtVQUFBLE9BQU0sTUFBSSxDQUFDcXdCLE9BQUwsRUFBbUIsS0FBQSxNQUFuQixHQUE0Qnh6QyxLQUFLLENBQUNxUixPQUFOLENBQWMyVSxNQUFkLENBQXFCOUQsT0FBakQsR0FBMkQxdUIsTUFBTSxDQUFDMjlCLFVBQVAsR0FBb0JueEIsS0FBSyxDQUFDcVIsT0FBTixDQUFjMlUsTUFBZCxDQUFxQjlELE9BQTFHLENBQUE7U0FBcEIsQ0FBQTs7UUFDQSxJQUFLZ2lCLENBQUFBLFdBQUwsR0FBbUJsa0MsS0FBSyxDQUFDbWtDLFFBQU4sSUFBa0IsQ0FBQ3BoQyxNQUFJLENBQUNxTyxjQUFMLENBQW9CcFIsS0FBcEIsQ0FBbkIsSUFBaUQsSUFBSzJ6QyxDQUFBQSxXQUFMLENBQWlCM3pDLEtBQWpCLEVBQXdCbWpCLFdBQVcsRUFBbkMsQ0FBcEUsQ0FBQTs7UUFFQSxJQUFJLENBQUMsSUFBSytnQixDQUFBQSxXQUFWLEVBQXVCO0VBQ3JCbGtDLFFBQUFBLEtBQUssQ0FBQ29rQyxPQUFOLElBQWlCcGtDLEtBQUssQ0FBQ29rQyxPQUFOLEVBQWpCLENBQUE7VUFDQXBrQyxLQUFLLENBQUNta0MsUUFBTixHQUFpQixJQUFqQixDQUFBO0VBRUEsUUFBQSxJQUFBLENBQUt5UCxNQUFMLEdBQWNWLFNBQVMsQ0FBQyxJQUFLaHdDLENBQUFBLE9BQUwsQ0FBYUMsS0FBYixDQUFtQnRPLEtBQW5CLElBQTRCLE1BQTdCLENBQXZCLENBQUE7RUFDQSxRQUFBLElBQUEsQ0FBS2cvQyxjQUFMLEdBQXNCLElBQUEsQ0FBS0MsU0FBTCxHQUFrQixFQUFFLEtBQUtDLGNBQUwsWUFBK0IvMEMsUUFBakMsQ0FBQSxJQUE4QyxLQUFLKzBDLGNBQUwsRUFBL0MsR0FBd0UsQ0FBeEUsR0FBNEUsS0FBS0gsTUFBeEgsQ0FBQTtFQUVBN3dDLFFBQUFBLE1BQUksQ0FBQ2lPLGdCQUFMLENBQXNCLElBQUEsQ0FBSzBpQyxlQUEzQixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxNQUFBLENBQU8xekMsS0FBUCxFQUFjO0VBQ1pBLE1BQUFBLEtBQUssQ0FBQ3ViLGVBQU4sRUFBQSxDQUFBO0VBRUEsTUFBQSxJQUFNeTRCLEtBQUssR0FBRyxJQUFBLENBQUtSLE9BQUwsRUFBbUIsS0FBQSxNQUFuQixHQUE0Qnh6QyxLQUFLLENBQUNxUixPQUFOLENBQWNtUixNQUExQyxHQUFtRCxDQUFDeGlCLEtBQUssQ0FBQ3FSLE9BQU4sQ0FBY21SLE1BQWhGLENBQUE7UUFDQSxJQUFNbFIsUUFBUSxHQUFHeFosSUFBSSxDQUFDdXFCLEdBQUwsQ0FBUyxDQUFULEVBQVl2cUIsSUFBSSxDQUFDc3FCLEdBQUwsQ0FBUyxJQUFBLENBQUt3eEIsTUFBZCxFQUFzQixJQUFBLENBQUtDLGNBQUwsR0FBc0JHLEtBQTVDLENBQVosQ0FBakIsQ0FBQTs7RUFDQSxNQUFBLElBQUkxaUMsUUFBUSxLQUFLLElBQUt3aUMsQ0FBQUEsU0FBdEIsRUFBaUM7VUFDL0IsSUFBS0EsQ0FBQUEsU0FBTCxHQUFpQnhpQyxRQUFqQixDQUFBO0VBQ0EsUUFBQSxJQUFBLENBQUsyaUMsUUFBTCxDQUFjLElBQUEsQ0FBS0gsU0FBbkIsRUFBOEIsS0FBS0YsTUFBbkMsQ0FBQSxDQUFBO0VBQ0QsT0FBQTtFQUNGLEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsU0FBQSxDQUFVNXpDLEtBQVYsRUFBaUI7RUFDZkEsTUFBQUEsS0FBSyxDQUFDdWIsZUFBTixFQUFBLENBQUE7RUFFQSxNQUFBLElBQU1tSSxTQUFTLEdBQUcxakIsS0FBSyxDQUFDcVIsT0FBTixDQUFjcVgsZ0JBQWhDLENBQUE7RUFDQSxNQUFBLElBQU13ckIsVUFBVSxHQUFHLElBQUtWLENBQUFBLE9BQUwsT0FBbUI5dkIsU0FBbkIsSUFBZ0MsSUFBS293QixDQUFBQSxTQUFMLEdBQWlCLElBQUtGLENBQUFBLE1BQUwsR0FBYyxJQUFBLENBQUtMLFlBQUwsRUFBbEYsQ0FBQTtFQUNBVyxNQUFBQSxVQUFVLEdBQUcsSUFBS0MsQ0FBQUEsUUFBTCxFQUFILEdBQXFCLElBQUEsQ0FBS0MsUUFBTCxFQUEvQixDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBVSxPQUFBLEdBQUE7RUFDUixNQUFBLElBQUEsQ0FBS1YsZUFBTCxJQUF3QixJQUFBLENBQUtBLGVBQUwsQ0FBcUJucUIsT0FBckIsRUFBeEIsQ0FBQTtRQUNBLElBQUttcUIsQ0FBQUEsZUFBTCxHQUF1QixJQUFLeHdDLENBQUFBLE9BQUwsR0FBZSxJQUFLb3dDLENBQUFBLGNBQUwsR0FBc0IsSUFBNUQsQ0FBQTtFQUNELEtBQUE7Ozs7OztNQzVFa0JlOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRSxFQUFBLFNBQUEsaUJBQUEsQ0FBWWo2QyxPQUFaLEVBQXFCO0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGlCQUFBLENBQUEsQ0FBQTs7RUFDbkJBLElBQUFBLE9BQU8sR0FBRzJJLE1BQUksQ0FBQ3NKLE1BQUwsQ0FBWTtFQUNwQjhPLE1BQUFBLE1BQU0sRUFBRSxRQURZO0VBRXBCbkUsTUFBQUEsUUFBUSxFQUFFLEtBRlU7RUFHcEJDLE1BQUFBLEtBQUssRUFBRSxHQUFBO0VBSGEsS0FBWixFQUlQN2MsT0FBTyxJQUFJLEVBSkosQ0FBVixDQUFBO0VBRG1CLElBQUEsT0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFPYkEsT0FQYSxDQUFBLENBQUE7RUFRcEIsR0FBQTs7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsSUFBQSxDQUFLazZDLFNBQUwsRUFBZ0JDLFNBQWhCLEVBQTJCdDZDLFFBQTNCLEVBQXFDO1FBQ25DQSxRQUFRLEVBQUEsQ0FBQTtFQUNULEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFJcTZDLFNBQUosRUFBZUMsU0FBZixFQUEwQnQ2QyxRQUExQixFQUFvQztRQUNsQ0EsUUFBUSxFQUFBLENBQUE7RUFDVCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLEtBQUEsQ0FBTWtULElBQU4sRUFBWTtFQUNWLE1BQUEsSUFBTTYwQixPQUFPLEdBQUdqL0IsTUFBSSxDQUFDbkMsYUFBTCxDQUFoQixtSUFBQSxDQUFBLENBQUE7RUFHQXVNLE1BQUFBLElBQUksQ0FBQ2pULFVBQUwsQ0FBZ0I2RyxXQUFoQixDQUE0QmloQyxPQUE1QixDQUFBLENBQUE7UUFDQSxPQUFPLFlBQUE7VUFBQSxPQUFNQSxPQUFPLENBQUNwN0IsTUFBUixFQUFOLENBQUE7U0FBUCxDQUFBO0VBQ0QsS0FBQTs7OztJQWhDNEN5d0I7OztFQ0MvQztFQUNBO0VBQ0E7O01BQ3FCbWQ7Ozs7O0lBTW5CLFNBQW1HLHlCQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsSUFBQSxJQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUosRUFBSTtFQUFBLFFBQUEsb0JBQUEsR0FBQSxJQUFBLENBQXJGQyxlQUFxRjtVQUFyRkEsZUFBcUYscUNBQW5FLEdBQW1FLEdBQUEsb0JBQUE7RUFBQSxRQUFBLGtCQUFBLEdBQUEsSUFBQSxDQUE5REMsYUFBOEQ7VUFBOURBLGFBQThELG1DQUE5QyxJQUE4QyxHQUFBLGtCQUFBO0VBQUEsUUFBQSxnQkFBQSxHQUFBLElBQUEsQ0FBeENDLFdBQXdDO1VBQXhDQSxXQUF3QyxpQ0FBMUIsUUFBMEIsR0FBQSxnQkFBQTtFQUFBLFFBQWJDLElBQWEsR0FBQSx3QkFBQSxDQUFBLElBQUEsRUFBQUMsV0FBQSxDQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLHlCQUFBLENBQUEsQ0FBQTs7RUFDakcsSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQUF2bkIsY0FBQSxDQUFBLEVBQUEsRUFBVXNuQixJQUFWLENBQUEsQ0FBQSxDQUFBOztFQUVBLElBQUEsSUFBSSxLQUFLN2IsQ0FBQUEsV0FBTCxLQUFxQnliLHlCQUF6QixFQUFvRDtFQUNsRHp4QyxNQUFBQSxNQUFJLENBQUMyTixhQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7O01BRUQsS0FBSytqQyxDQUFBQSxlQUFMLEdBQXVCQSxlQUF2QixDQUFBO01BQ0EsS0FBS0MsQ0FBQUEsYUFBTCxHQUFxQkEsYUFBckIsQ0FBQTtNQUNBLEtBQUtDLENBQUFBLFdBQUwsR0FBbUJBLFdBQW5CLENBQUE7RUFFQSxJQUFBLEtBQUEsQ0FBS0csUUFBTCxHQUFnQjtFQUFFMzVCLE1BQUFBLE1BQU0sRUFBRXc1QixXQUFWO0VBQXVCMzlCLE1BQUFBLFFBQVEsRUFBRTA5QixhQUFBQTtPQUFqRCxDQUFBO0VBQ0EsSUFBQSxLQUFBLENBQUtLLFVBQUwsR0FBa0I7RUFBRTU1QixNQUFBQSxNQUFNLEVBQUV3NUIsV0FBVjtFQUF1QjM5QixNQUFBQSxRQUFRLEVBQUV5OUIsZUFBQUE7T0FBbkQsQ0FBQTtFQUVBLElBQUEsS0FBQSxDQUFLTyxXQUFMLEdBQW1CanlDLE1BQUksQ0FBQ25DLGFBQUwsQ0FDakIsNk9BRGlCLENBQW5CLENBQUE7TUFLQSxLQUFLcTBDLENBQUFBLFdBQUwsR0FBbUIsSUFBbkIsQ0FBQTtFQW5CaUcsSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQW9CbEcsR0FBQTs7OzthQUVELFNBQWEsVUFBQSxHQUFBO0VBQ1hseUMsTUFBQUEsTUFBSSxDQUFDNE4sV0FBTCxFQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF3QixxQkFBQSxHQUFBO0VBQ3RCNU4sTUFBQUEsTUFBSSxDQUFDNE4sV0FBTCxFQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFrQixlQUFBLEdBQUE7RUFDaEI1TixNQUFBQSxNQUFJLENBQUM0TixXQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWdCMmpDLGVBQUFBLENBQUFBLFNBQWhCLEVBQTJCQyxTQUEzQixFQUFzQztFQUNwQyxNQUFBLElBQUEsQ0FBS1UsV0FBTCxHQUFtQixLQUFuQixDQURvQzs7RUFJcEMsTUFBQSxJQUFBLENBQUtDLE9BQUwsR0FBQSxJQUFBLENBQUEsZUFBQSxDQUFBLHlCQUFBLENBQUEsU0FBQSxDQUFBLEVBQUEsT0FBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQTJCWCxTQUEzQixDQUFBLENBSm9DOztRQU9wQ0QsU0FBUyxDQUFDN2xDLGFBQVYsQ0FBd0JnQixZQUF4QixDQUFxQyxLQUFLMGxDLGNBQTFDLEVBQTBEYixTQUExRCxDQUFBLENBUG9DOztFQVVwQyxNQUFBLElBQUEsQ0FBS3Q2QyxNQUFMLEdBQWM7RUFDWm83QyxRQUFBQSxLQUFLLEVBQUVyeUMsTUFBSSxDQUFDbUssZUFBTCxDQUFxQm9uQyxTQUFyQixLQUFtQ0EsU0FEOUI7RUFFWmUsUUFBQUEsS0FBSyxFQUFFdHlDLE1BQUksQ0FBQ21LLGVBQUwsQ0FBcUJxbkMsU0FBckIsQ0FBbUNBLElBQUFBLFNBQUFBO1NBRjVDLENBQUE7RUFJQSxNQUFBLElBQUEsQ0FBS2UsTUFBTCxHQUFjO1VBQ1pGLEtBQUssRUFBRSxLQUFLRyxVQUFMLENBQWdCLEtBQUt2N0MsTUFBTCxDQUFZbzdDLEtBQTVCLENBREs7RUFFWkMsUUFBQUEsS0FBSyxFQUFFLElBQUtFLENBQUFBLFVBQUwsQ0FBZ0IsSUFBS3Y3QyxDQUFBQSxNQUFMLENBQVlxN0MsS0FBNUIsQ0FBQTtFQUZLLE9BQWQsQ0Fkb0M7O1FBb0JwQyxJQUFLckIsQ0FBQUEsS0FBTCxHQUFhLElBQUEsQ0FBS3dCLGVBQUwsQ0FBcUJqQixTQUFyQixFQUFnQyxJQUFLZSxDQUFBQSxNQUFMLENBQVlELEtBQTVDLENBQWIsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLSSxvQkFBTCxHQUE0QixJQUFBLENBQUtDLHFCQUFMLENBQTJCLEtBQUsxN0MsTUFBTCxDQUFZbzdDLEtBQXZDLEVBQThDLEtBQUtwN0MsTUFBTCxDQUFZcTdDLEtBQTFELENBQTVCLENBckJvQzs7UUF3QnBDLElBQUksSUFBQSxDQUFLSSxvQkFBVCxFQUErQjtFQUM3QixRQUFBLElBQUEsQ0FBS1QsV0FBTCxDQUFpQjd4QyxLQUFqQixDQUF1QjQwQixHQUF2QixHQUE2QixJQUFBLENBQUt1ZCxNQUFMLENBQVlELEtBQVosQ0FBa0JNLE9BQWxCLENBQTBCMTVCLFlBQTFCLEdBQXlDLElBQXRFLENBQUE7RUFDQSxRQUFBLElBQUEsQ0FBS2ppQixNQUFMLENBQVlxN0MsS0FBWixDQUFrQnQwQyxXQUFsQixDQUE4QixLQUFLaTBDLFdBQW5DLENBQUEsQ0FBQTs7VUFDQSxJQUFLWSxDQUFBQSxVQUFMLENBQWdCLElBQUEsQ0FBSzU3QyxNQUFMLENBQVlvN0MsS0FBNUIsRUFBbUMsSUFBQSxDQUFLcDdDLE1BQUwsQ0FBWXE3QyxLQUEvQyxDQUFBLENBQUE7RUFDRCxPQUpELE1BSU87RUFDTGQsUUFBQUEsU0FBUyxDQUFDeHpDLFdBQVYsQ0FBc0IsSUFBQSxDQUFLaTBDLFdBQTNCLENBQUEsQ0FBQTs7RUFDQSxRQUFBLElBQUEsQ0FBS1ksVUFBTCxDQUFnQnRCLFNBQWhCLEVBQTJCQyxTQUEzQixDQUFBLENBQUE7RUFDRCxPQUFBOztFQUNEQSxNQUFBQSxTQUFTLENBQUNodUMsU0FBVixDQUFvQkksR0FBcEIsQ0FBd0Isa0JBQXhCLENBQUEsQ0FBQTtRQUNBLElBQUtrdkMsQ0FBQUEsZUFBTCxHQUF1QnRCLFNBQXZCLENBQUE7UUFDQSxJQUFLZSxDQUFBQSxNQUFMLENBQVlELEtBQVosQ0FBa0JqcEMsT0FBbEIsQ0FBMEI3RixTQUExQixDQUFvQ0ksR0FBcEMsQ0FBd0MsaUJBQXhDLENBQUEsQ0FBQTtFQUVELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsU0FBQSxDQUFVMkssUUFBVixFQUFvQjYyQixRQUFwQixFQUE4Qm1NLFNBQTlCLEVBQXlDQyxTQUF6QyxFQUFvRDtRQUNsRCxJQUFLdUIsQ0FBQUEsU0FBTCxHQUFpQixJQUFqQixDQUFBOztFQUVBLE1BQUEsSUFBSXhCLFNBQVMsQ0FBQ254QyxLQUFWLENBQWdCNFYsT0FBaEIsS0FBNEIsTUFBaEMsRUFBd0M7RUFDdEN1N0IsUUFBQUEsU0FBUyxDQUFDbnhDLEtBQVYsQ0FBZ0I0VixPQUFoQixHQUEwQixFQUExQixDQUFBO0VBQ0QsT0FBQTs7UUFFRCxJQUFJLElBQUEsQ0FBS2s4QixXQUFULEVBQXNCO1VBQ3BCLElBQUs5TSxDQUFBQSxRQUFMLEdBQWdCQSxRQUFoQixDQUFBOztFQUNBLFFBQUEsSUFBQSxDQUFLNE4sZUFBTCxDQUFxQnpCLFNBQXJCLEVBQWdDQyxTQUFoQyxDQUFBLENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsSUFBTXlCLFVBQVUsR0FBRyxDQUFDMWtDLFFBQVEsR0FBRzYyQixRQUFaLElBQXdCQSxRQUEzQyxDQUFBOztRQUVBLElBQUksSUFBQSxDQUFLc04sb0JBQVQsRUFBK0I7RUFFN0IzaEIsUUFBQUEsTUFBTSxDQUFDdFYsTUFBUDtFQUVFO1VBRUFzVixNQUFNLENBQUMsQ0FBQyxJQUFBLENBQUt3aEIsTUFBTCxDQUFZRixLQUFaLENBQWtCaHBDLE9BQW5CLEVBQTRCLElBQUtrcEMsQ0FBQUEsTUFBTCxDQUFZRixLQUFaLENBQWtCYSxhQUE5QyxFQUE2RCxJQUFLWCxDQUFBQSxNQUFMLENBQVlGLEtBQVosQ0FBa0JqWCxVQUEvRSxDQUFELENBQU4sQ0FDR2htQyxLQURILENBQ1M7RUFDTHVnQyxVQUFBQSxTQUFTLEVBQWlCc2QsY0FBQUEsQ0FBQUEsTUFBQUEsQ0FBQUEsVUFBVSxHQUFHLEVBQTlCLEVBREosVUFBQSxDQUFBO0VBRUx4ZCxVQUFBQSxPQUFPLEVBQUUsQ0FBSXdkLEdBQUFBLFVBQVUsR0FBRyxFQUFiLEdBQWtCLEdBRjFCOztFQUFBLFNBRFQsQ0FKRixFQVVFbGlCLE1BQU0sQ0FBQyxJQUFLd2hCLENBQUFBLE1BQUwsQ0FBWUYsS0FBWixDQUFrQmMsYUFBbkIsQ0FBTixDQUNHLzlDLEtBREgsQ0FDUztFQUNMdWdDLFVBQUFBLFNBQVMsd0JBQWlCLElBQUtzYixDQUFBQSxLQUFMLENBQVd0bEIsS0FBWCxHQUFtQnNuQixVQUFwQyxFQURKLFdBQUEsQ0FBQTtZQUVMeGQsT0FBTyxFQUFFLENBQUl3ZCxHQUFBQSxVQUZSOztFQUFBLFNBRFQsQ0FWRixFQWdCRWxpQixNQUFNLENBQUMsSUFBS3doQixDQUFBQSxNQUFMLENBQVlGLEtBQVosQ0FBa0JlLGVBQW5CLENBQU4sQ0FDR2grQyxLQURILENBQ1M7RUFDTHFnQyxVQUFBQSxPQUFPLEVBQUUsQ0FBSXdkLEdBQUFBLFVBQVUsR0FBRyxFQUFiLEdBQWtCLEdBRDFCO0VBQytCO0VBQ3BDdGQsVUFBQUEsU0FBUyx3QkFBaUIsSUFBS3NiLENBQUFBLEtBQUwsQ0FBVzNsQixLQUFYLEdBQW1CMm5CLFVBQXBDLEVBQUEsV0FBQSxDQUFBO0VBRkosU0FEVCxDQWhCRixFQXNCRWxpQixNQUFNLENBQUMsSUFBS3doQixDQUFBQSxNQUFMLENBQVlGLEtBQVosQ0FBa0JnQixLQUFuQixDQUFOLENBQ0dqK0MsS0FESCxDQUNTO1lBQ0xxZ0MsT0FBTyxFQUFFLENBQUl3ZCxHQUFBQSxVQURSOztFQUFBLFNBRFQsQ0F0QkY7RUEyQkU7RUFFQWxpQixRQUFBQSxNQUFNLENBQUMsQ0FBQyxJQUFLd2hCLENBQUFBLE1BQUwsQ0FBWUQsS0FBWixDQUFrQmpwQyxPQUFuQixFQUE0QixJQUFBLENBQUtrcEMsTUFBTCxDQUFZRCxLQUFaLENBQWtCWSxhQUE5QyxFQUE2RCxJQUFLWCxDQUFBQSxNQUFMLENBQVlELEtBQVosQ0FBa0JsWCxVQUEvRSxFQUEyRixJQUFBLENBQUs2VyxXQUFoRyxDQUFELENBQU4sQ0FDRzc4QyxLQURILENBQ1M7RUFDTHVnQyxVQUFBQSxTQUFTLHdCQUFpQnBuQixRQUFqQixFQUFBLFdBQUEsQ0FBQTtFQURKLFNBRFQsQ0E3QkYsRUFrQ0V3aUIsTUFBTSxDQUFDLElBQUt3aEIsQ0FBQUEsTUFBTCxDQUFZRCxLQUFaLENBQWtCTSxPQUFuQixDQUFOLENBQ0d4OUMsS0FESCxDQUNTO0VBQ0xxZ0MsVUFBQUEsT0FBTyxFQUFFLENBQUMsQ0FBRCxHQUFLd2QsVUFEVDs7RUFBQSxTQURULENBbENGLEVBdUNFbGlCLE1BQU0sQ0FBQyxJQUFLd2hCLENBQUFBLE1BQUwsQ0FBWUQsS0FBWixDQUFrQmEsYUFBbkIsQ0FBTixDQUNHLzlDLEtBREgsQ0FDUztFQUNMdWdDLFVBQUFBLFNBQVMsRUFBaUIsY0FBQSxDQUFBLE1BQUEsQ0FBQSxDQUFDLENBQUlzZCxHQUFBQSxVQUFMLElBQW1CLEdBQXBDLEVBQUEsVUFBQSxDQUFBO0VBREosU0FEVCxDQXZDRixFQTRDRWxpQixNQUFNLENBQUMsSUFBS3doQixDQUFBQSxNQUFMLENBQVlELEtBQVosQ0FBa0JjLGVBQW5CLENBQU4sQ0FDR2grQyxLQURILENBQ1M7RUFDTHFnQyxVQUFBQSxPQUFPLEVBQUUsQ0FBQyxDQUFELEdBQUt3ZCxVQURUO0VBQ3FCO1lBQzFCdGQsU0FBUyxFQUFBLGNBQUEsQ0FBQSxNQUFBLENBQWlCLEtBQUtzYixLQUFMLENBQVd0bEIsS0FBWCxJQUFvQixDQUFBLEdBQUlzbkIsVUFBeEIsQ0FBakIsRUFBQSxXQUFBLENBQUE7RUFGSixTQURULENBNUNGO0VBbURFO0VBRUFsaUIsUUFBQUEsTUFBTSxDQUFDLElBQUtraEIsQ0FBQUEsV0FBTixDQUFOLENBQ0c3OEMsS0FESCxDQUNTO0VBQ0xxZ0MsVUFBQUEsT0FBTyxFQUFFLENBQUMsQ0FBRCxHQUFLd2QsVUFEVDs7RUFBQSxTQURULENBckRGLENBQUEsQ0FBQTtFQTRERCxPQTlERCxNQThETztVQUNMbGlCLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FDRXNWLE1BQU0sQ0FBQ3lnQixTQUFELENBQU4sQ0FDR3A4QyxLQURILENBQ1M7RUFDTHVnQyxVQUFBQSxTQUFTLHdCQUFpQnBuQixRQUFqQixFQUFBLFdBQUEsQ0FBQTtXQUZiLENBREYsRUFNRXdpQixNQUFNLENBQUN3Z0IsU0FBRCxDQUFOLENBQ0duOEMsS0FESCxDQUNTO0VBQ0x1Z0MsVUFBQUEsU0FBUyxFQUFpQnNkLGNBQUFBLENBQUFBLE1BQUFBLENBQUFBLFVBQVUsR0FBRyxFQUE5QixFQURKLFVBQUEsQ0FBQTtFQUVMeGQsVUFBQUEsT0FBTyxFQUFFLENBQUl3ZCxHQUFBQSxVQUFVLEdBQUcsRUFBYixHQUFrQixHQUYxQjs7V0FEVCxDQU5GLEVBWUVsaUIsTUFBTSxDQUFDLEtBQUtraEIsV0FBTixDQUFOLENBQ0c3OEMsS0FESCxDQUNTO0VBQ0xxZ0MsVUFBQUEsT0FBTyxFQUFFLENBQUMsQ0FBRCxHQUFLd2QsVUFEVDs7RUFBQSxTQURULENBWkYsQ0FBQSxDQUFBO0VBaUJELE9BQUE7RUFDRixLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLE9BQUEsQ0FBUTFCLFNBQVIsRUFBbUJDLFNBQW5CLEVBQThCdDZDLFFBQTlCLEVBQXdDO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ3RDLElBQUksSUFBQSxDQUFLZzdDLFdBQVQsRUFBc0I7RUFDcEIsUUFBQSxPQUFBO0VBQ0QsT0FBQTs7UUFFRCxJQUFJLElBQUEsQ0FBS1Esb0JBQVQsRUFBK0I7RUFFN0IzaEIsUUFBQUEsTUFBTSxDQUFDdFYsTUFBUDtFQUVFO1VBRUFzVixNQUFNLENBQUMsQ0FBQyxJQUFBLENBQUt3aEIsTUFBTCxDQUFZRixLQUFaLENBQWtCaHBDLE9BQW5CLEVBQTRCLElBQUtrcEMsQ0FBQUEsTUFBTCxDQUFZRixLQUFaLENBQWtCYSxhQUE5QyxFQUE2RCxJQUFLWCxDQUFBQSxNQUFMLENBQVlGLEtBQVosQ0FBa0JqWCxVQUEvRSxDQUFELENBQU4sQ0FDR2htQyxLQURILENBQ1M7RUFDTHVnQyxVQUFBQSxTQUFTLEVBQUUseUJBRE47RUFFTEYsVUFBQUEsT0FBTyxFQUFFLEdBQUE7RUFGSixTQURULEVBSUssSUFBS3VjLENBQUFBLFVBSlYsQ0FKRixFQVVFamhCLE1BQU0sQ0FBQyxJQUFBLENBQUt3aEIsTUFBTCxDQUFZRixLQUFaLENBQWtCYyxhQUFuQixDQUFOLENBQ0cvOUMsS0FESCxDQUNTO0VBQ0x1Z0MsVUFBQUEsU0FBUyxFQUFrQixlQUFBLENBQUEsTUFBQSxDQUFBLElBQUEsQ0FBS3NiLEtBQUwsQ0FBV3RsQixLQUE3QixFQURKLFdBQUEsQ0FBQTtZQUVMaFIsVUFBVSxFQUFBLFVBQUEsQ0FBQSxNQUFBLENBQWEsS0FBSysyQixlQUFsQixFQUFBLHNCQUFBLENBQUEsQ0FBQSxNQUFBLENBQXdELEtBQUtBLGVBQTdELEVBQUEsSUFBQSxDQUFBLENBQUEsTUFBQSxDQUFpRixJQUFLRSxDQUFBQSxXQUF0RixDQUZMO0VBR0xuYyxVQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUhKLFNBRFQsQ0FWRixFQWlCRTFFLE1BQU0sQ0FBQyxJQUFLd2hCLENBQUFBLE1BQUwsQ0FBWUYsS0FBWixDQUFrQmUsZUFBbkIsQ0FBTixDQUNHaCtDLEtBREgsQ0FDUztFQUNMdWdDLFVBQUFBLFNBQVMsRUFBa0IsZUFBQSxDQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUtzYixLQUFMLENBQVczbEIsS0FBN0IsRUFBQSxXQUFBLENBQUE7RUFESixTQURULEVBR0ssSUFBSzBtQixDQUFBQSxVQUhWLENBakJGLEVBc0JFamhCLE1BQU0sQ0FBQyxJQUFBLENBQUt3aEIsTUFBTCxDQUFZRixLQUFaLENBQWtCZ0IsS0FBbkIsQ0FBTixDQUNHaitDLEtBREgsQ0FDUztFQUNMcWdDLFVBQUFBLE9BQU8sRUFBRSxDQUFBO1dBRmIsRUFHSyxJQUFLdWMsQ0FBQUEsVUFIVixDQXRCRjtFQTJCRTtFQUVBamhCLFFBQUFBLE1BQU0sQ0FBQyxDQUFDLElBQUt3aEIsQ0FBQUEsTUFBTCxDQUFZRCxLQUFaLENBQWtCanBDLE9BQW5CLEVBQTRCLElBQUEsQ0FBS2twQyxNQUFMLENBQVlELEtBQVosQ0FBa0JZLGFBQTlDLEVBQTZELElBQUtYLENBQUFBLE1BQUwsQ0FBWUQsS0FBWixDQUFrQmxYLFVBQS9FLEVBQTJGLElBQUEsQ0FBSzZXLFdBQWhHLENBQUQsQ0FBTixDQUNHNzhDLEtBREgsQ0FDUztZQUNMdWdDLFNBQVMsRUFBQSxzQkFBQTtFQURKLFNBRFQsRUFHSyxJQUFLcWMsQ0FBQUEsVUFIVixDQTdCRixFQWtDRWpoQixNQUFNLENBQUMsSUFBQSxDQUFLd2hCLE1BQUwsQ0FBWUQsS0FBWixDQUFrQk0sT0FBbkIsQ0FBTixDQUNHeDlDLEtBREgsQ0FDUztFQUNMcWdDLFVBQUFBLE9BQU8sRUFBRSxDQUFBO0VBREosU0FEVCxFQUdLLElBQUt1YyxDQUFBQSxVQUhWLENBbENGLEVBdUNFamhCLE1BQU0sQ0FBQyxJQUFBLENBQUt3aEIsTUFBTCxDQUFZRCxLQUFaLENBQWtCYSxhQUFuQixDQUFOLENBQ0cvOUMsS0FESCxDQUNTO1lBQ0x1Z0MsU0FBUyxFQUFBLHNCQUFBO0VBREosU0FEVCxFQUdLLElBQUtxYyxDQUFBQSxVQUhWLENBdkNGLEVBNENFamhCLE1BQU0sQ0FBQyxJQUFBLENBQUt3aEIsTUFBTCxDQUFZRCxLQUFaLENBQWtCYyxlQUFuQixDQUFOLENBQ0doK0MsS0FESCxDQUNTO0VBQ0xxZ0MsVUFBQUEsT0FBTyxFQUFFLENBREo7RUFFTEUsVUFBQUEsU0FBUyxFQUZKLHNCQUFBO1lBR0xoYixVQUFVLEVBQUEsVUFBQSxDQUFBLE1BQUEsQ0FBYSxLQUFLKzJCLGVBQWxCLEVBQUEsc0JBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBd0QsS0FBS0EsZUFBN0QsRUFBQSxJQUFBLENBQUEsQ0FBQSxNQUFBLENBQWlGLEtBQUtFLFdBQXRGLENBQUE7RUFITCxTQURULENBNUNGO0VBb0RFO0VBRUE3Z0IsUUFBQUEsTUFBTSxDQUFDLElBQUtraEIsQ0FBQUEsV0FBTixDQUFOLENBQ0c3OEMsS0FESCxDQUNTO0VBQ0xxZ0MsVUFBQUEsT0FBTyxFQUFFLENBQUE7V0FGYixFQUdLLEtBQUt1YyxVQUhWLENBQUEsQ0FJRzU4QyxLQUpILENBSVMsVUFBQThrQixJQUFJLEVBQUk7RUFDYixVQUFBLE1BQUksQ0FBQzBsQixNQUFMLENBQVksTUFBSSxDQUFDM29DLE1BQUwsQ0FBWW83QyxLQUF4QixFQUErQixNQUFJLENBQUNwN0MsTUFBTCxDQUFZcTdDLEtBQTNDLENBQUEsQ0FBQTs7RUFDQWYsVUFBQUEsU0FBUyxDQUFDbnhDLEtBQVYsQ0FBZ0I0VixPQUFoQixHQUEwQixNQUExQixDQUFBO1lBQ0E5ZSxRQUFRLElBQUlBLFFBQVEsRUFBcEIsQ0FBQTtZQUNBZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsU0FUSCxDQXRERixDQUFBLENBQUE7RUFtRUQsT0FyRUQsTUFxRU87VUFDTDZXLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FFRXNWLE1BQU0sQ0FBQ3dnQixTQUFELENBQU4sQ0FDQ244QyxLQURELENBQ087RUFDTHVnQyxVQUFBQSxTQUFTLEVBQUUseUJBRE47RUFFTEYsVUFBQUEsT0FBTyxFQUFFLEdBQUE7V0FIWCxFQUlHLElBQUt1YyxDQUFBQSxVQUpSLENBRkYsRUFRRWpoQixNQUFNLENBQUN5Z0IsU0FBRCxDQUFOLENBQ0NwOEMsS0FERCxDQUNPO0VBQ0x1Z0MsVUFBQUEsU0FBUyxFQUFFLHNCQUFBO1dBRmIsRUFHRyxLQUFLcWMsVUFIUixDQUFBLENBSUM1OEMsS0FKRCxDQUlPLFVBQUE4a0IsSUFBSSxFQUFJO0VBQ2IsVUFBQSxNQUFJLENBQUMwbEIsTUFBTCxDQUFZMlIsU0FBWixFQUF1QkMsU0FBdkIsQ0FBQSxDQUFBOztFQUNBRCxVQUFBQSxTQUFTLENBQUNueEMsS0FBVixDQUFnQjRWLE9BQWhCLEdBQTBCLE1BQTFCLENBQUE7WUFDQTllLFFBQVEsSUFBSUEsUUFBUSxFQUFwQixDQUFBO1lBQ0FnakIsSUFBSSxFQUFBLENBQUE7RUFDTCxTQVRELENBUkYsQ0FBQSxDQUFBO0VBbUJELE9BQUE7RUFDRixLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFFBQUEsQ0FBU3EzQixTQUFULEVBQW9CQyxTQUFwQixFQUErQnQ2QyxRQUEvQixFQUF5QztFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUN2QyxJQUFJLElBQUEsQ0FBS2c3QyxXQUFULEVBQXNCO0VBQ3BCLFFBQUEsT0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBSSxJQUFBLENBQUtRLG9CQUFULEVBQStCO0VBRTdCM2hCLFFBQUFBLE1BQU0sQ0FBQ3RWLE1BQVA7RUFFRTtVQUVBc1YsTUFBTSxDQUFDLENBQUMsSUFBQSxDQUFLd2hCLE1BQUwsQ0FBWUYsS0FBWixDQUFrQmhwQyxPQUFuQixFQUE0QixJQUFLa3BDLENBQUFBLE1BQUwsQ0FBWUYsS0FBWixDQUFrQmEsYUFBOUMsRUFBNkQsSUFBS1gsQ0FBQUEsTUFBTCxDQUFZRixLQUFaLENBQWtCalgsVUFBL0UsQ0FBRCxDQUFOLENBQ0dobUMsS0FESCxDQUNTO0VBQ0x1Z0MsVUFBQUEsU0FBUyxFQUFFLHNCQUROO0VBRUxGLFVBQUFBLE9BQU8sRUFBRSxDQUFBO0VBRkosU0FEVCxFQUlLLElBQUtzYyxDQUFBQSxRQUpWLENBSkYsRUFVRWhoQixNQUFNLENBQUMsSUFBQSxDQUFLd2hCLE1BQUwsQ0FBWUYsS0FBWixDQUFrQmMsYUFBbkIsQ0FBTixDQUNHLzlDLEtBREgsQ0FDUztFQUNMdWdDLFVBQUFBLFNBQVMsRUFESixzQkFBQTtZQUVMaGIsVUFBVSxFQUFBLFVBQUEsQ0FBQSxNQUFBLENBQWEsS0FBS2czQixhQUFsQixFQUFBLHNCQUFBLENBQUEsQ0FBQSxNQUFBLENBQXNELEtBQUtBLGFBQTNELEVBQUEsSUFBQSxDQUFBLENBQUEsTUFBQSxDQUE2RSxJQUFLQyxDQUFBQSxXQUFsRixDQUZMO0VBR0xuYyxVQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUhKLFNBRFQsQ0FWRixFQWlCRTFFLE1BQU0sQ0FBQyxJQUFLd2hCLENBQUFBLE1BQUwsQ0FBWUYsS0FBWixDQUFrQmUsZUFBbkIsQ0FBTixDQUNHaCtDLEtBREgsQ0FDUztZQUNMdWdDLFNBQVMsRUFBQSxzQkFBQTtFQURKLFNBRFQsRUFHSyxJQUFLb2MsQ0FBQUEsUUFIVixDQWpCRixFQXNCRWhoQixNQUFNLENBQUMsSUFBQSxDQUFLd2hCLE1BQUwsQ0FBWUYsS0FBWixDQUFrQmdCLEtBQW5CLENBQU4sQ0FDR2orQyxLQURILENBQ1M7RUFDTHFnQyxVQUFBQSxPQUFPLEVBQUUsQ0FBQTtXQUZiLEVBR0ssSUFBS3NjLENBQUFBLFFBSFYsQ0F0QkY7RUEyQkU7VUFFQWhoQixNQUFNLENBQUMsQ0FBQyxJQUFBLENBQUt3aEIsTUFBTCxDQUFZRCxLQUFaLENBQWtCanBDLE9BQW5CLEVBQTRCLElBQUtrcEMsQ0FBQUEsTUFBTCxDQUFZRCxLQUFaLENBQWtCWSxhQUE5QyxFQUE2RCxJQUFLWCxDQUFBQSxNQUFMLENBQVlELEtBQVosQ0FBa0JsWCxVQUEvRSxDQUFELENBQU4sQ0FDR2htQyxLQURILENBQ1M7WUFDTHVnQyxTQUFTLEVBQUEseUJBQUE7RUFESixTQURULEVBR0ssSUFBS29jLENBQUFBLFFBSFYsQ0E3QkYsRUFrQ0VoaEIsTUFBTSxDQUFDLElBQUEsQ0FBS3doQixNQUFMLENBQVlELEtBQVosQ0FBa0JNLE9BQW5CLENBQU4sQ0FDR3g5QyxLQURILENBQ1M7RUFDTHFnQyxVQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQURKLFNBRFQsRUFHSyxJQUFLc2MsQ0FBQUEsUUFIVixDQWxDRixFQXVDRWhoQixNQUFNLENBQUMsSUFBQSxDQUFLd2hCLE1BQUwsQ0FBWUQsS0FBWixDQUFrQmEsYUFBbkIsQ0FBTixDQUNHLzlDLEtBREgsQ0FDUztZQUNMdWdDLFNBQVMsRUFBQSx5QkFBQTtFQURKLFNBRFQsRUFHSyxJQUFLb2MsQ0FBQUEsUUFIVixDQXZDRixFQTRDRWhoQixNQUFNLENBQUMsSUFBQSxDQUFLd2hCLE1BQUwsQ0FBWUQsS0FBWixDQUFrQmMsZUFBbkIsQ0FBTixDQUNHaCtDLEtBREgsQ0FDUztFQUNMcWdDLFVBQUFBLE9BQU8sRUFBRSxDQURKO0VBRUxFLFVBQUFBLFNBQVMsRUFBaUIsY0FBQSxDQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUtzYixLQUFMLENBQVd0bEIsS0FBNUIsRUFGSixXQUFBLENBQUE7WUFHTGhSLFVBQVUsRUFBQSxVQUFBLENBQUEsTUFBQSxDQUFhLEtBQUtnM0IsYUFBbEIsRUFBQSxzQkFBQSxDQUFBLENBQUEsTUFBQSxDQUFzRCxLQUFLQSxhQUEzRCxFQUFBLElBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBNkUsS0FBS0MsV0FBbEYsQ0FBQTtFQUhMLFNBRFQsQ0E1Q0Y7RUFvREU7RUFFQTdnQixRQUFBQSxNQUFNLENBQUMsSUFBS2toQixDQUFBQSxXQUFOLENBQU4sQ0FDRzc4QyxLQURILENBQ1M7RUFDTHFnQyxVQUFBQSxPQUFPLEVBQUUsQ0FESjtZQUVMRSxTQUFTLEVBQUEsY0FBQSxDQUFBLE1BQUEsQ0FBaUIsS0FBS3lQLFFBQXRCLEVBQUEsV0FBQSxDQUFBO1dBSGIsRUFJSyxLQUFLMk0sUUFKVixDQUFBLENBS0czOEMsS0FMSCxDQUtTLFVBQUE4a0IsSUFBSSxFQUFJO0VBQ2IsVUFBQSxNQUFJLENBQUMwbEIsTUFBTCxDQUFZLE1BQUksQ0FBQzNvQyxNQUFMLENBQVlvN0MsS0FBeEIsRUFBK0IsTUFBSSxDQUFDcDdDLE1BQUwsQ0FBWXE3QyxLQUEzQyxDQUFBLENBQUE7O1lBQ0FwN0MsUUFBUSxJQUFJQSxRQUFRLEVBQXBCLENBQUE7WUFDQWdqQixJQUFJLEVBQUEsQ0FBQTtFQUNMLFNBVEgsQ0F0REYsQ0FBQSxDQUFBO0VBa0VELE9BcEVELE1Bb0VPO1VBQ0w2VyxNQUFNLENBQUN0VixNQUFQLENBRUVzVixNQUFNLENBQUN3Z0IsU0FBRCxDQUFOLENBQ0NuOEMsS0FERCxDQUNPO0VBQ0x1Z0MsVUFBQUEsU0FBUyxFQUFFLHNCQUROO0VBRUxGLFVBQUFBLE9BQU8sRUFBRSxHQUFBO1dBSFgsRUFJRyxJQUFLc2MsQ0FBQUEsUUFKUixDQUZGLEVBUUVoaEIsTUFBTSxDQUFDeWdCLFNBQUQsQ0FBTixDQUNDcDhDLEtBREQsQ0FDTztFQUNMdWdDLFVBQUFBLFNBQVMsRUFBRSx5QkFBQTtXQUZiLEVBR0csS0FBS29jLFFBSFIsQ0FBQSxDQUlDMzhDLEtBSkQsQ0FJTyxVQUFBOGtCLElBQUksRUFBSTtFQUNiLFVBQUEsTUFBSSxDQUFDMGxCLE1BQUwsQ0FBWTJSLFNBQVosRUFBdUJDLFNBQXZCLENBQUEsQ0FBQTs7WUFDQXQ2QyxRQUFRLElBQUlBLFFBQVEsRUFBcEIsQ0FBQTtZQUNBZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsU0FSRCxDQVJGLENBQUEsQ0FBQTtFQWtCRCxPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBb0IsVUFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ2xCLE1BQUEsSUFBQSxDQUFLbzVCLFdBQUwsR0FBbUIsSUFBSTcrQyxPQUFKLEVBQW5CLENBQUE7O0VBQ0EsTUFBQSxJQUFNOCtDLElBQUksR0FBRyxTQUFQQSxJQUFPLENBQUExc0MsRUFBRSxFQUFBO0VBQUEsUUFBQSxPQUFJLE1BQUksQ0FBQ3lzQyxXQUFMLENBQWlCbjdDLEdBQWpCLENBQXFCME8sRUFBckIsRUFBeUJBLEVBQUUsQ0FBQzlGLFlBQUgsQ0FBZ0IsT0FBaEIsQ0FBekIsQ0FBSixDQUFBO1NBQWYsQ0FBQTs7RUFGa0IsTUFBQSxLQUFBLElBQUEsSUFBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEVBQU5uRixJQUFNLEdBQUEsSUFBQSxLQUFBLENBQUEsSUFBQSxDQUFBLEVBQUEsSUFBQSxHQUFBLENBQUEsRUFBQSxJQUFBLEdBQUEsSUFBQSxFQUFBLElBQUEsRUFBQSxFQUFBO1VBQU5BLElBQU0sQ0FBQSxJQUFBLENBQUEsR0FBQSxTQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFBQSxPQUFBOztRQUdsQkEsSUFBSSxDQUFDdkcsT0FBTCxDQUFhaytDLElBQWIsQ0FBQSxDQUFBO1FBRUFsZ0QsTUFBTSxDQUFDZ04sSUFBUCxDQUFZLElBQUtreUMsQ0FBQUEsTUFBakIsRUFBeUJsOUMsT0FBekIsQ0FBaUMsVUFBQTVCLENBQUMsRUFBSTtFQUNwQ0osUUFBQUEsTUFBTSxDQUFDZ04sSUFBUCxDQUFZLE1BQUksQ0FBQ2t5QyxNQUFMLENBQVk5K0MsQ0FBWixDQUFaLENBQTRCNEIsQ0FBQUEsT0FBNUIsQ0FBb0MsVUFBQXNPLENBQUMsRUFBSTtFQUN2QyxVQUFBLENBQUMsTUFBSSxDQUFDNHVDLE1BQUwsQ0FBWTkrQyxDQUFaLENBQWVrUSxDQUFBQSxDQUFmLENBQTZCcEUsWUFBQUEsS0FBN0IsR0FBcUMsTUFBSSxDQUFDZ3pDLE1BQUwsQ0FBWTkrQyxDQUFaLENBQUEsQ0FBZWtRLENBQWYsQ0FBckMsR0FBeUQsQ0FBQyxNQUFJLENBQUM0dUMsTUFBTCxDQUFZOStDLENBQVosQ0FBZWtRLENBQUFBLENBQWYsQ0FBRCxDQUExRCxFQUErRXRPLE9BQS9FLENBQXVGaytDLElBQXZGLENBQUEsQ0FBQTtXQURGLENBQUEsQ0FBQTtTQURGLENBQUEsQ0FBQTtFQUtELEtBQUE7OzthQUVELFNBQXVCLGFBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNyQixNQUFBLElBQU1DLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQUEzc0MsRUFBRSxFQUFJO0VBQ3BCLFFBQUEsTUFBSSxDQUFDeXNDLFdBQUwsQ0FBaUJ6OEMsR0FBakIsQ0FBcUJnUSxFQUFyQixDQUE2QixLQUFBLElBQTdCLEdBQW9DQSxFQUFFLENBQUM3RixlQUFILENBQW1CLE9BQW5CLENBQXBDLEdBQWtFNkYsRUFBRSxDQUFDakksWUFBSCxDQUFnQixPQUFoQixFQUF5QixNQUFJLENBQUMwMEMsV0FBTCxDQUFpQno4QyxHQUFqQixDQUFxQmdRLEVBQXJCLENBQXpCLENBQWxFLENBQUE7O0VBQ0EsUUFBQSxNQUFJLENBQUN5c0MsV0FBTCxDQUFpQnRwQixNQUFqQixDQUF3Qm5qQixFQUF4QixDQUFBLENBQUE7U0FGRixDQUFBOztFQURxQixNQUFBLEtBQUEsSUFBQSxLQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsRUFBTmpMLElBQU0sR0FBQSxJQUFBLEtBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxLQUFBLEdBQUEsQ0FBQSxFQUFBLEtBQUEsR0FBQSxLQUFBLEVBQUEsS0FBQSxFQUFBLEVBQUE7VUFBTkEsSUFBTSxDQUFBLEtBQUEsQ0FBQSxHQUFBLFNBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQTtFQUFBLE9BQUE7O1FBS3JCQSxJQUFJLENBQUN2RyxPQUFMLENBQWFtK0MsT0FBYixDQUFBLENBQUE7UUFFQW5nRCxNQUFNLENBQUNnTixJQUFQLENBQVksSUFBS2t5QyxDQUFBQSxNQUFqQixFQUF5Qmw5QyxPQUF6QixDQUFpQyxVQUFBNUIsQ0FBQyxFQUFJO0VBQ3BDSixRQUFBQSxNQUFNLENBQUNnTixJQUFQLENBQVksTUFBSSxDQUFDa3lDLE1BQUwsQ0FBWTkrQyxDQUFaLENBQVosQ0FBNEI0QixDQUFBQSxPQUE1QixDQUFvQyxVQUFBc08sQ0FBQyxFQUFJO0VBQ3ZDLFVBQUEsQ0FBQyxNQUFJLENBQUM0dUMsTUFBTCxDQUFZOStDLENBQVosQ0FBZWtRLENBQUFBLENBQWYsQ0FBNkJwRSxZQUFBQSxLQUE3QixHQUFxQyxNQUFJLENBQUNnekMsTUFBTCxDQUFZOStDLENBQVosQ0FBQSxDQUFla1EsQ0FBZixDQUFyQyxHQUF5RCxDQUFDLE1BQUksQ0FBQzR1QyxNQUFMLENBQVk5K0MsQ0FBWixDQUFla1EsQ0FBQUEsQ0FBZixDQUFELENBQTFELEVBQStFdE8sT0FBL0UsQ0FBdUZtK0MsT0FBdkYsQ0FBQSxDQUFBO1dBREYsQ0FBQSxDQUFBO1NBREYsQ0FBQSxDQUFBO0VBS0QsS0FBQTs7O2FBRUQsU0FBZ0IsTUFBQSxHQUFBO1FBQ2QsSUFBS1QsQ0FBQUEsU0FBTCxHQUFpQixLQUFqQixDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtPLFdBQUwsSUFBb0IsSUFBS0csQ0FBQUEsYUFBTCxDQUFwQixLQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUt0QixPQUFMLElBQWdCLElBQUtBLENBQUFBLE9BQUwsRUFBaEIsQ0FBQTtRQUNBLElBQUtGLENBQUFBLFdBQUwsQ0FBaUJwdUMsTUFBakIsRUFBQSxDQUFBO1FBQ0EsSUFBS3V1QyxDQUFBQSxjQUFMLENBQW9CdnVDLE1BQXBCLEVBQUEsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLaXZDLGVBQUwsQ0FBcUJ0dkMsU0FBckIsQ0FBK0JLLE1BQS9CLENBQXNDLGtCQUF0QyxDQUFBLENBQUE7UUFDQSxJQUFLMHVDLENBQUFBLE1BQUwsQ0FBWUQsS0FBWixDQUFrQmpwQyxPQUFsQixDQUEwQjdGLFNBQTFCLENBQW9DSyxNQUFwQyxDQUEyQyxpQkFBM0MsQ0FBQSxDQUFBO1FBQ0EsSUFBSzB1QyxDQUFBQSxNQUFMLEdBQWMsSUFBQSxDQUFLdDdDLE1BQUwsR0FBYyxJQUFLNjdDLENBQUFBLGVBQUwsR0FBdUIsSUFBQSxDQUFLUSxXQUFMLEdBQW1CLElBQXRFLENBQUE7UUFDQSxJQUFLcEIsQ0FBQUEsV0FBTCxHQUFtQixJQUFuQixDQUFBO0VBQ0QsS0FBQTs7O1dBalpELFNBQXVCLEdBQUEsR0FBQTtFQUNyQixNQUFBLE9BQU8sSUFBUCxDQUFBO0VBQ0QsS0FBQTs7OztJQUpvRFo7Ozs7RUNGdkQsSUFBTW9DLFdBQVcsR0FBRyxTQUFkQSxXQUFjLEdBQUE7SUFBQSxJQUFDL3pCLENBQUQsdUVBQUssQ0FBTCxDQUFBO0lBQUEsSUFBUUUsQ0FBUix1RUFBWSxDQUFaLENBQUE7SUFBQSxJQUFlakgsQ0FBZix1RUFBbUIsQ0FBbkIsQ0FBQTtFQUFBLEVBQUEsT0FBQSxjQUFBLENBQUEsTUFBQSxDQUF3QytHLENBQXhDLEVBQUEsSUFBQSxDQUFBLENBQUEsTUFBQSxDQUE4Q0UsQ0FBOUMsRUFBQSxJQUFBLENBQUEsQ0FBQSxNQUFBLENBQW9EakgsQ0FBcEQsRUFBQSxHQUFBLENBQUEsQ0FBQTtFQUFBLENBQXBCLENBQUE7RUFFQTtFQUNBO0VBQ0E7OztNQUNxQis2Qjs7Ozs7SUFFbkIsU0FBa0cseUJBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxJQUFBLElBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBSixFQUFJO0VBQUEsUUFBQSxXQUFBLEdBQUEsSUFBQSxDQUFwRnY3QixNQUFvRjtVQUFwRkEsTUFBb0YsNEJBQTNFLDhCQUEyRSxHQUFBLFdBQUE7RUFBQSxRQUFBLFVBQUEsR0FBQSxJQUFBLENBQTNDbEUsS0FBMkM7VUFBM0NBLEtBQTJDLDJCQUFuQyxDQUFtQyxHQUFBLFVBQUE7RUFBQSxRQUFBLGFBQUEsR0FBQSxJQUFBLENBQWhDRCxRQUFnQztVQUFoQ0EsUUFBZ0MsOEJBQXJCLEdBQXFCLEdBQUEsYUFBQTtFQUFBLFFBQWI0OUIsSUFBYSxHQUFBLHdCQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsQ0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSx5QkFBQSxDQUFBLENBQUE7O0VBQ2hHLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFBdG5CLGNBQUEsQ0FBQTtFQUFRblMsTUFBQUEsTUFBTSxFQUFOQSxNQUFSO0VBQWdCbEUsTUFBQUEsS0FBSyxFQUFMQSxLQUFoQjtFQUF1QkQsTUFBQUEsUUFBUSxFQUFSQSxRQUFBQTtFQUF2QixLQUFBLEVBQW9DNDlCLElBQXBDLENBQUEsQ0FBQSxDQUFBO0VBRUEsSUFBQSxLQUFBLENBQUtPLGNBQUwsR0FBc0JweUMsTUFBSSxDQUFDbkMsYUFBTCxDQUNwQiw4R0FEb0IsQ0FBdEIsQ0FBQTtFQUhnRyxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBT2pHLEdBQUE7Ozs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFVBQUEsQ0FBV3VNLElBQVgsRUFBaUI7RUFDZixNQUFBLElBQU13b0MsT0FBTyxHQUFHeG9DLElBQUksQ0FBQ3dwQyxrQkFBTCxFQUFoQixDQUFBOztFQUNBLE1BQUEsSUFBTXY5QixJQUFJLEdBQUd1OEIsT0FBTyxDQUFDaUIsMkJBQVIsRUFBYixDQUFBOztFQUNBLE1BQUEsSUFBTXY5QixLQUFLLEdBQUdzOEIsT0FBTyxDQUFDa0IsNEJBQVIsRUFBZCxDQUFBOztFQUVBLE1BQUEsSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUFTbHlDLFFBQVQsRUFBbUI7VUFDM0MsSUFBTTNRLE1BQU0sR0FBRyxFQUFmLENBQUE7O0VBRUEsUUFBQSxLQUFLLElBQUlrSCxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHeUosUUFBUSxDQUFDcEwsTUFBN0IsRUFBcUMyQixDQUFDLEVBQXRDLEVBQTBDO1lBQ3hDLElBQUl5SixRQUFRLENBQUN6SixDQUFELENBQVIsQ0FBWThQLFFBQVosQ0FBcUJsWCxXQUFyQixFQUF1QyxLQUFBLGlCQUEzQyxFQUE4RDtFQUM1REUsWUFBQUEsTUFBTSxDQUFDcUUsSUFBUCxDQUFZc00sUUFBUSxDQUFDekosQ0FBRCxDQUFwQixDQUFBLENBQUE7RUFDRCxXQUFBO0VBQ0YsU0FBQTs7RUFFRCxRQUFBLE9BQU9sSCxNQUFQLENBQUE7U0FURixDQUFBOztFQVlBLE1BQUEsSUFBTW1pRCxLQUFLLEdBQUcsRUFBQSxDQUNYeHlDLE1BRFcsQ0FDSndWLElBQUksQ0FBQ2hPLFFBQUwsQ0FBYzVSLE1BQWQsS0FBeUIsQ0FBekIsR0FBNkI0ZixJQUE3QixHQUFvQzA5QixpQkFBaUIsQ0FBQzE5QixJQUFJLENBQUNoTyxRQUFOLENBRGpELENBQUEsQ0FFWHhILE1BRlcsQ0FFSnlWLEtBQUssQ0FBQ2pPLFFBQU4sQ0FBZTVSLE1BQWYsS0FBMEIsQ0FBMUIsR0FBOEI2ZixLQUE5QixHQUFzQ3k5QixpQkFBaUIsQ0FBQ3o5QixLQUFLLENBQUNqTyxRQUFQLENBRm5ELENBQWQsQ0FBQTtRQUlBLE9BQU87RUFDTDhxQyxRQUFBQSxhQUFhLEVBQUVQLE9BQU8sQ0FBQ29CLDZCQUFSLEVBRFY7RUFFTEMsUUFBQUEsY0FBYyxFQUFFckIsT0FBTyxDQUFDc0IsZ0NBQVIsRUFGWDtFQUdMZCxRQUFBQSxlQUFlLEVBQUVSLE9BQU8sQ0FBQ3VCLGlDQUFSLEVBSFo7RUFJTGQsUUFBQUEsS0FBSyxFQUFFQSxLQUpGO0VBS0xocUMsUUFBQUEsT0FBTyxFQUFFZSxJQUFJLENBQUNncUMsa0JBQUwsRUFMSjtFQU1MaFosUUFBQUEsVUFBVSxFQUFFaHhCLElBQUksQ0FBQ2lxQyxxQkFBTCxFQU5QO0VBT0x6QixRQUFBQSxPQUFPLEVBQUVBLE9BUEo7VUFRTE0sYUFBYSxFQUFFOW9DLElBQUksQ0FBQ2txQyx3QkFBTCxFQUFBO1NBUmpCLENBQUE7RUFVRCxLQUFBOzs7YUFFRCxTQUFzQi9DLHFCQUFBQSxDQUFBQSxTQUF0QixFQUFpQ0MsU0FBakMsRUFBNEM7UUFDMUMsSUFBTStDLFFBQVEsR0FBR2hELFNBQVMsQ0FBQ2xuQyxrQkFBVixFQUFrQ21uQyxJQUFBQSxTQUFTLENBQUNubkMsa0JBQVYsRUFBbkQsQ0FBQTs7RUFFQSxNQUFBLElBQU1tcUMsWUFBWSxHQUFHakQsU0FBUyxDQUFDcUMsa0JBQVYsRUFBckIsQ0FBQTs7RUFDQSxNQUFBLElBQU1hLFlBQVksR0FBR2pELFNBQVMsQ0FBQ29DLGtCQUFWLEVBQXJCLENBQUE7O0VBRUEsTUFBQSxJQUFNYyxRQUFRLEdBQUdGLFlBQVksQ0FBQzcxQyxZQUFiLENBQTBCLFFBQTFCLENBQUEsSUFBdUM4MUMsWUFBWSxDQUFDOTFDLFlBQWIsQ0FBMEIsUUFBMUIsQ0FBeEQsQ0FBQTtFQUNBLE1BQUEsSUFBTWcyQyxVQUFVLEdBQUczMEMsTUFBSSxDQUFDdUIsV0FBTCxDQUFpQml6QyxZQUFqQixFQUErQixVQUEvQixDQUFBLElBQThDeDBDLE1BQUksQ0FBQ3VCLFdBQUwsQ0FBaUJrekMsWUFBakIsRUFBK0IsVUFBL0IsQ0FBakUsQ0FBQTtFQUNBLE1BQUEsSUFBTUcsYUFBYSxHQUFHNTBDLE1BQUksQ0FBQ3VCLFdBQUwsQ0FBaUJpekMsWUFBakIsRUFBK0IsYUFBL0IsQ0FBQSxJQUFpRHgwQyxNQUFJLENBQUN1QixXQUFMLENBQWlCa3pDLFlBQWpCLEVBQStCLGFBQS9CLENBQXZFLENBQUE7UUFFQSxPQUFPRixRQUFRLElBQUksQ0FBQ0csUUFBYixJQUF5QixDQUFDQyxVQUExQixJQUF3QyxDQUFDQyxhQUFoRCxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBZ0J6MEMsZUFBQUEsQ0FBQUEsT0FBaEIsRUFBeUIwMEMsYUFBekIsRUFBd0M7UUFDdEMsSUFBSWxwQixLQUFKLEVBQVdMLEtBQVgsQ0FBQTtFQUVBLE1BQUEsSUFBTXdwQixRQUFRLEdBQUczMEMsT0FBTyxDQUFDaTZCLHFCQUFSLEVBQWpCLENBQUE7O1FBQ0EsSUFBSXlhLGFBQWEsQ0FBQ3pCLGVBQWQsQ0FBOEI1dkMsU0FBOUIsQ0FBd0N3RSxRQUF4QyxDQUFpRCxvQkFBakQsQ0FBSixFQUE0RTtFQUMxRSxRQUFBLElBQU0rc0MsU0FBUyxHQUFHRixhQUFhLENBQUN6QixlQUFkLENBQThCaFoscUJBQTlCLEVBQWxCLENBQUE7VUFDQXpPLEtBQUssR0FBRzUyQixJQUFJLENBQUN3bEMsS0FBTCxDQUFXdWEsUUFBUSxDQUFDaGpELEtBQVQsR0FBaUIsQ0FBakIsR0FBcUJpakQsU0FBUyxDQUFDampELEtBQVYsR0FBa0IsQ0FBdkMsR0FBMkNpakQsU0FBUyxDQUFDMStCLElBQWhFLENBQVIsQ0FBQTtFQUNELE9BSEQsTUFHTztFQUNMc1YsUUFBQUEsS0FBSyxHQUFHNTJCLElBQUksQ0FBQ3dsQyxLQUFMLENBQVl1YSxRQUFRLENBQUNoakQsS0FBVCxHQUFpQixDQUFsQixHQUF1QixHQUFsQyxDQUFSLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUkraUQsYUFBYSxDQUFDWixjQUFkLENBQTZCendDLFNBQTdCLENBQXVDd0UsUUFBdkMsQ0FBZ0QsbUJBQWhELENBQUosRUFBMEU7VUFDeEVzakIsS0FBSyxHQUFHdXBCLGFBQWEsQ0FBQ1osY0FBZCxDQUE2QjdaLHFCQUE3QixFQUFBLENBQXFEOWpCLEtBQXJELEdBQTZELENBQXJFLENBQUE7RUFDRCxPQUFBOztRQUVELE9BQU87RUFBQ3FWLFFBQUFBLEtBQUssRUFBTEEsS0FBRDtFQUFRTCxRQUFBQSxLQUFLLEVBQUxBLEtBQUFBO1NBQWYsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBOzs7O0VBQ0UsSUFBQSxLQUFBLEVBQUEsU0FBQSxJQUFBLENBQUtpbUIsU0FBTCxFQUFnQkMsU0FBaEIsRUFBMkJ0NkMsUUFBM0IsRUFBcUM7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDbkMsSUFBS2s3QyxDQUFBQSxjQUFMLENBQW9CdnVDLE1BQXBCLEVBQUEsQ0FBQTtRQUNBMnRDLFNBQVMsQ0FBQ3I2QyxVQUFWLENBQXFCdVYsWUFBckIsQ0FBa0MsSUFBSzBsQyxDQUFBQSxjQUF2QyxFQUF1RFosU0FBdkQsQ0FBQSxDQUFBOztRQUVBLElBQU1XLE9BQU8sR0FBZVosSUFBQUEsQ0FBQUEsZUFBQUEsQ0FBQUEseUJBQUFBLENBQUFBLFNBQUFBLENBQUFBLEVBQUFBLE9BQUFBLEVBQUFBLElBQUFBLENBQUFBLENBQUFBLElBQUFBLENBQUFBLElBQUFBLEVBQUFBLFNBQWYsQ0FBYixDQUFBOztRQUVBdG5CLFlBQVksQ0FBQ3NuQixTQUFELEVBQVksWUFBTTtVQUM1QixJQUFNeUQsZUFBZSxHQUFHaDFDLE1BQUksQ0FBQ21LLGVBQUwsQ0FBcUJvbkMsU0FBckIsS0FBbUNBLFNBQTNELENBQUE7VUFDQSxJQUFNMEQsZUFBZSxHQUFHajFDLE1BQUksQ0FBQ21LLGVBQUwsQ0FBcUJxbkMsU0FBckIsS0FBbUNBLFNBQTNELENBQUE7O0VBQ0EsUUFBQSxJQUFNMEQsc0JBQXNCLEdBQUcsTUFBSSxDQUFDMUMsVUFBTCxDQUFnQndDLGVBQWhCLENBQS9CLENBQUE7O0VBQ0EsUUFBQSxJQUFNRyxzQkFBc0IsR0FBRyxNQUFJLENBQUMzQyxVQUFMLENBQWdCeUMsZUFBaEIsQ0FBL0IsQ0FBQTs7VUFFQSxJQUFNaEUsS0FBSyxHQUFHLE1BQUksQ0FBQ3dCLGVBQUwsQ0FBcUJqQixTQUFyQixFQUFnQzBELHNCQUFoQyxDQUFkLENBQUE7O1VBRUEsSUFBTXhDLG9CQUFvQixHQUFHLE1BQUksQ0FBQ0MscUJBQUwsQ0FBMkJxQyxlQUEzQixFQUE0Q0MsZUFBNUMsQ0FBN0IsQ0FBQTs7RUFFQSxRQUFBLElBQUl2QyxvQkFBSixFQUEwQjtZQUV4QjNoQixNQUFNLENBQUN0VixNQUFQLENBRUVzVixNQUFNLENBQUMsQ0FBQ21rQixzQkFBc0IsQ0FBQzdyQyxPQUF4QixFQUFpQzZyQyxzQkFBc0IsQ0FBQ2hDLGFBQXhELEVBQXVFZ0Msc0JBQXNCLENBQUM5WixVQUE5RixDQUFELEVBQTRHLE1BQUksQ0FBQzdHLEdBQWpILENBQU4sQ0FDR25hLE9BREgsQ0FFSTtjQUFFdWIsU0FBUyxFQUFFK2QsV0FBVyxDQUFDLE1BQUQsQ0FBQTtFQUF4QixXQUZKLEVBR0k7RUFBRS9kLFlBQUFBLFNBQVMsRUFBRStkLFdBQVcsRUFBQTtFQUF4QixXQUhKLENBRkYsRUFRRTNpQixNQUFNLENBQUNta0Isc0JBQXNCLENBQUN0QyxPQUF4QixFQUFpQyxNQUFJLENBQUNyZSxHQUF0QyxDQUFOLENBQ0duYSxPQURILENBQ1c7RUFBRXFiLFlBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQVgsV0FEWCxFQUMyQjtFQUFFQSxZQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFYLFdBRDNCLENBUkYsRUFXRTFFLE1BQU0sQ0FBQ21rQixzQkFBc0IsQ0FBQy9CLGFBQXhCLEVBQXVDLE1BQUksQ0FBQzVlLEdBQTVDLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsWUFBQUEsU0FBUyxFQUFFK2QsV0FBVyxDQUFDLE1BQUQsQ0FBeEI7RUFBa0NqZSxZQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUEzQyxXQUZKLEVBR0k7Y0FBRUUsU0FBUyxFQUFFK2QsV0FBVyxFQUF4QjtFQUE0QmplLFlBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQXJDLFdBSEosQ0FYRixFQWlCRTFFLE1BQU0sQ0FBQ21rQixzQkFBc0IsQ0FBQzlCLGVBQXhCLEVBQXlDLE1BQUksQ0FBQzdlLEdBQTlDLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsWUFBQUEsU0FBUyxFQUFFK2QsV0FBVyxDQUFBLEVBQUEsQ0FBQSxNQUFBLENBQUl6QyxLQUFLLENBQUN0bEIsS0FBVixFQUF4QixJQUFBLENBQUEsQ0FBQTtFQUE4QzhKLFlBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQXZELFdBRkosRUFHSTtjQUNFRSxTQUFTLEVBQUUrZCxXQUFXLEVBRHhCO0VBRUVqZSxZQUFBQSxPQUFPLEVBQUUsQ0FGWDtjQUdFOWEsVUFBVSxFQUFBLFVBQUEsQ0FBQSxNQUFBLENBQWEsTUFBSSxDQUFDMUcsUUFBbEIsRUFBQSxzQkFBQSxDQUFBLENBQUEsTUFBQSxDQUFpRCxNQUFJLENBQUNBLFFBQXRELEVBQUEsSUFBQSxDQUFBLENBQUEsTUFBQSxDQUFtRSxNQUFJLENBQUNtRSxNQUF4RSxDQUFBO0VBSFosV0FISixDQWpCRixFQTJCRTJZLE1BQU0sQ0FBQ21rQixzQkFBc0IsQ0FBQzdCLEtBQXhCLEVBQStCLE1BQUksQ0FBQzllLEdBQXBDLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFcWIsWUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBWCxXQUZKLEVBR0k7RUFBRWxiLFlBQUFBLEdBQUcsRUFBRTtFQUFFa2IsY0FBQUEsT0FBTyxFQUFFLENBQUE7ZUFBbEI7RUFBdUJyZCxZQUFBQSxNQUFNLEVBQUUsUUFBQTthQUhuQyxDQTNCRixFQWlDRTJZLE1BQU0sQ0FBQyxDQUFDb2tCLHNCQUFzQixDQUFDOXJDLE9BQXhCLEVBQWlDOHJDLHNCQUFzQixDQUFDakMsYUFBeEQsRUFBdUVpQyxzQkFBc0IsQ0FBQy9aLFVBQTlGLENBQUQsRUFBNEcsTUFBSSxDQUFDN0csR0FBakgsQ0FBTixDQUNHbmEsT0FESCxDQUVJO2NBQUV1YixTQUFTLEVBQUUrZCxXQUFXLEVBQXhCO0VBQTRCamUsWUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBckMsV0FGSixFQUdJO0VBQUVFLFlBQUFBLFNBQVMsRUFBRStkLFdBQVcsQ0FBQyxNQUFELENBQXhCO0VBQWtDamUsWUFBQUEsT0FBTyxFQUFFLEdBQUE7RUFBM0MsV0FISixDQUtHcmdDLENBQUFBLEtBTEgsQ0FLUyxVQUFBOGtCLElBQUksRUFBSTtjQUNiLE1BQUksQ0FBQ2s0QixjQUFMLENBQW9CdnVDLE1BQXBCLEVBQUEsQ0FBQTs7Y0FDQXN1QyxPQUFPLEVBQUEsQ0FBQTtjQUNQajdDLFFBQVEsRUFBQSxDQUFBO2NBQ1JnakIsSUFBSSxFQUFBLENBQUE7RUFDTCxXQVZILENBakNGLEVBNkNFNlcsTUFBTSxDQUFDb2tCLHNCQUFzQixDQUFDaEMsYUFBeEIsRUFBdUMsTUFBSSxDQUFDNWUsR0FBNUMsQ0FBTixDQUNHbmEsT0FESCxDQUVJO2NBQUV1YixTQUFTLEVBQUUrZCxXQUFXLEVBQXhCO0VBQTRCamUsWUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBckMsV0FGSixFQUdJO0VBQ0VFLFlBQUFBLFNBQVMsRUFBRStkLFdBQVcsQ0FBQSxHQUFBLENBQUEsTUFBQSxDQUFLekMsS0FBSyxDQUFDdGxCLEtBQVgsRUFEeEIsSUFBQSxDQUFBLENBQUE7RUFFRThKLFlBQUFBLE9BQU8sRUFBRSxDQUZYO2NBR0U5YSxVQUFVLEVBQUEsVUFBQSxDQUFBLE1BQUEsQ0FBYSxNQUFJLENBQUMxRyxRQUFsQixFQUFBLHNCQUFBLENBQUEsQ0FBQSxNQUFBLENBQWlELE1BQUksQ0FBQ0EsUUFBdEQsRUFBQSxJQUFBLENBQUEsQ0FBQSxNQUFBLENBQW1FLE1BQUksQ0FBQ21FLE1BQXhFLENBQUE7RUFIWixXQUhKLENBN0NGLEVBdURFMlksTUFBTSxDQUFDb2tCLHNCQUFzQixDQUFDL0IsZUFBeEIsRUFBeUMsTUFBSSxDQUFDN2UsR0FBOUMsQ0FBTixDQUNHbmEsT0FESCxDQUVJO2NBQUV1YixTQUFTLEVBQUUrZCxXQUFXLEVBQXhCO0VBQTRCamUsWUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBckMsV0FGSixFQUdJO0VBQUVFLFlBQUFBLFNBQVMsRUFBRStkLFdBQVcsQ0FBQSxHQUFBLENBQUEsTUFBQSxDQUFLekMsS0FBSyxDQUFDM2xCLEtBQVgsRUFBeEIsSUFBQSxDQUFBLENBQUE7RUFBK0NtSyxZQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUF4RCxXQUhKLENBdkRGLEVBNkRFMUUsTUFBTSxDQUFDb2tCLHNCQUFzQixDQUFDOUIsS0FBeEIsRUFBK0IsTUFBSSxDQUFDOWUsR0FBcEMsQ0FBTixDQUNHbmEsT0FESCxDQUNZO0VBQUVxYixZQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFYLFdBRFosRUFDNEI7RUFBRWxiLFlBQUFBLEdBQUcsRUFBRTtFQUFFa2IsY0FBQUEsT0FBTyxFQUFFLENBQUE7ZUFBbEI7RUFBdUJyZCxZQUFBQSxNQUFNLEVBQUUsUUFBQTtFQUEvQixXQUQ1QixDQTdERixDQUFBLENBQUE7RUFrRUQsU0FwRUQsTUFvRU87RUFFTDJZLFVBQUFBLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FFRXNWLE1BQU0sQ0FBQ3dnQixTQUFELEVBQVksTUFBSSxDQUFDaGQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUNZO2NBQUV1YixTQUFTLEVBQUUrZCxXQUFXLENBQUMsTUFBRCxDQUFBO0VBQXhCLFdBRFosRUFDaUQ7RUFBRS9kLFlBQUFBLFNBQVMsRUFBRStkLFdBQVcsRUFBQTtFQUF4QixXQURqRCxDQUZGLEVBS0UzaUIsTUFBTSxDQUFDeWdCLFNBQUQsRUFBWSxNQUFJLENBQUNqZCxHQUFqQixDQUFOLENBQ0duYSxPQURILENBQ1k7Y0FBRXViLFNBQVMsRUFBRStkLFdBQVcsRUFBeEI7RUFBNEJqZSxZQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFyQyxXQURaLEVBQ3NEO0VBQUVFLFlBQUFBLFNBQVMsRUFBRStkLFdBQVcsQ0FBQyxNQUFELENBQXhCO0VBQWtDamUsWUFBQUEsT0FBTyxFQUFFLEVBQUE7RUFBM0MsV0FEdEQsQ0FFR3JnQyxDQUFBQSxLQUZILENBRVMsVUFBQThrQixJQUFJLEVBQUk7Y0FDYixNQUFJLENBQUNrNEIsY0FBTCxDQUFvQnZ1QyxNQUFwQixFQUFBLENBQUE7O2NBQ0FzdUMsT0FBTyxFQUFBLENBQUE7Y0FDUGo3QyxRQUFRLEVBQUEsQ0FBQTtjQUNSZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsV0FQSCxDQUxGLENBQUEsQ0FBQTtFQWVELFNBQUE7RUFDRixPQWhHVyxDQUFaLENBQUE7RUFpR0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBSXEzQixTQUFKLEVBQWVDLFNBQWYsRUFBMEJ0NkMsUUFBMUIsRUFBb0M7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDbEMsSUFBSSxJQUFBLENBQUs2N0MsU0FBVCxFQUFvQjtVQUNsQixPQUFPLElBQUEsQ0FBS3FDLFFBQUwsQ0FBYzdELFNBQWQsRUFBeUJDLFNBQXpCLEVBQW9DdDZDLFFBQXBDLENBQVAsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS2s3QyxDQUFBQSxjQUFMLENBQW9CdnVDLE1BQXBCLEVBQUEsQ0FBQTtRQUNBMHRDLFNBQVMsQ0FBQ3A2QyxVQUFWLENBQXFCdVYsWUFBckIsQ0FBa0MsSUFBSzBsQyxDQUFBQSxjQUF2QyxFQUF1RGIsU0FBdkQsQ0FBQSxDQUFBOztRQUVBLElBQU1ZLE9BQU8sR0FBZVosSUFBQUEsQ0FBQUEsZUFBQUEsQ0FBQUEseUJBQUFBLENBQUFBLFNBQUFBLENBQUFBLEVBQUFBLE9BQUFBLEVBQUFBLElBQUFBLENBQUFBLENBQUFBLElBQUFBLENBQUFBLElBQUFBLEVBQUFBLFNBQWYsQ0FBYixDQUFBOztRQUVBLElBQU15RCxlQUFlLEdBQUdoMUMsTUFBSSxDQUFDbUssZUFBTCxDQUFxQm9uQyxTQUFyQixLQUFtQ0EsU0FBM0QsQ0FBQTtRQUNBLElBQU0wRCxlQUFlLEdBQUdqMUMsTUFBSSxDQUFDbUssZUFBTCxDQUFxQnFuQyxTQUFyQixLQUFtQ0EsU0FBM0QsQ0FBQTs7RUFDQSxNQUFBLElBQU0wRCxzQkFBc0IsR0FBRyxJQUFBLENBQUsxQyxVQUFMLENBQWdCd0MsZUFBaEIsQ0FBL0IsQ0FBQTs7RUFDQSxNQUFBLElBQU1HLHNCQUFzQixHQUFHLElBQUEsQ0FBSzNDLFVBQUwsQ0FBZ0J5QyxlQUFoQixDQUEvQixDQUFBOztRQUVBLElBQU1oRSxLQUFLLEdBQUcsSUFBS3dCLENBQUFBLGVBQUwsQ0FBcUJqQixTQUFyQixFQUFnQzJELHNCQUFoQyxDQUFkLENBQUE7O1FBRUEsSUFBTXpDLG9CQUFvQixHQUFHLElBQUtDLENBQUFBLHFCQUFMLENBQTJCcUMsZUFBM0IsRUFBNENDLGVBQTVDLENBQTdCLENBQUE7O0VBRUEsTUFBQSxJQUFJdkMsb0JBQUosRUFBMEI7VUFDeEIzaEIsTUFBTSxDQUFDdFYsTUFBUCxDQUVFc1YsTUFBTSxDQUFDLENBQUNta0Isc0JBQXNCLENBQUM3ckMsT0FBeEIsRUFBaUM2ckMsc0JBQXNCLENBQUNoQyxhQUF4RCxFQUF1RWdDLHNCQUFzQixDQUFDOVosVUFBOUYsQ0FBRCxFQUE0RyxLQUFLN0csR0FBakgsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixVQUFBQSxTQUFTLEVBQUUrZCxXQUFXLENBQUMsTUFBRCxDQUF4QjtFQUFrQ2plLFVBQUFBLE9BQU8sRUFBRSxFQUFBO0VBQTNDLFNBRkosRUFHSTtZQUFFRSxTQUFTLEVBQUUrZCxXQUFXLEVBQXhCO0VBQTRCamUsVUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBckMsU0FISixDQUZGLEVBUUUxRSxNQUFNLENBQUNta0Isc0JBQXNCLENBQUMvQixhQUF4QixFQUF1QyxJQUFLNWUsQ0FBQUEsR0FBNUMsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixVQUFBQSxTQUFTLEVBQUUrZCxXQUFXLENBQUEsR0FBQSxDQUFBLE1BQUEsQ0FBS3pDLEtBQUssQ0FBQ3RsQixLQUFYLEVBQXhCLElBQUEsQ0FBQSxDQUFBO0VBQStDOEosVUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBeEQsU0FGSixFQUdJO1lBQ0VFLFNBQVMsRUFBRStkLFdBQVcsRUFEeEI7RUFFRWplLFVBQUFBLE9BQU8sRUFBRSxDQUZYO1lBR0U5YSxVQUFVLEVBQUEsVUFBQSxDQUFBLE1BQUEsQ0FBYSxLQUFLMUcsUUFBbEIsRUFBQSxzQkFBQSxDQUFBLENBQUEsTUFBQSxDQUFpRCxLQUFLQSxRQUF0RCxFQUFBLElBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBbUUsS0FBS21FLE1BQXhFLENBQUE7RUFIWixTQUhKLENBUkYsRUFrQkUyWSxNQUFNLENBQUNta0Isc0JBQXNCLENBQUM5QixlQUF4QixFQUF5QyxJQUFLN2UsQ0FBQUEsR0FBOUMsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixVQUFBQSxTQUFTLEVBQUUrZCxXQUFXLENBQUt6QyxHQUFBQSxDQUFBQSxNQUFBQSxDQUFBQSxLQUFLLENBQUMzbEIsS0FBWCxFQUFBLElBQUEsQ0FBQSxDQUFBO0VBQXhCLFNBRkosRUFHSTtFQUFFcUssVUFBQUEsU0FBUyxFQUFFK2QsV0FBVyxFQUFBO0VBQXhCLFNBSEosQ0FsQkYsRUF3QkUzaUIsTUFBTSxDQUFDbWtCLHNCQUFzQixDQUFDN0IsS0FBeEIsRUFBK0IsSUFBSzllLENBQUFBLEdBQXBDLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFcWIsVUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBWCxTQUZKLEVBR0k7RUFBRWxiLFVBQUFBLEdBQUcsRUFBRTtFQUFFa2IsWUFBQUEsT0FBTyxFQUFFLENBQUE7YUFBbEI7RUFBdUJyZCxVQUFBQSxNQUFNLEVBQUUsUUFBQTtXQUhuQyxDQXhCRixFQThCRTJZLE1BQU0sQ0FBQyxDQUFDb2tCLHNCQUFzQixDQUFDOXJDLE9BQXhCLEVBQWlDOHJDLHNCQUFzQixDQUFDakMsYUFBeEQsRUFBdUVpQyxzQkFBc0IsQ0FBQy9aLFVBQTlGLENBQUQsRUFBNEcsS0FBSzdHLEdBQWpILENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsVUFBQUEsU0FBUyxFQUFFK2QsV0FBVyxFQUFBO0VBQXhCLFNBRkosRUFHSTtZQUFFL2QsU0FBUyxFQUFFK2QsV0FBVyxDQUFDLE1BQUQsQ0FBQTtXQUg1QixDQUFBLENBS0dqNUIsSUFMSCxDQUtRLENBTFIsRUFNR3JsQixLQU5ILENBTVMsVUFBQThrQixJQUFJLEVBQUk7WUFDYixNQUFJLENBQUNrNEIsY0FBTCxDQUFvQnZ1QyxNQUFwQixFQUFBLENBQUE7O1lBQ0FzdUMsT0FBTyxFQUFBLENBQUE7WUFDUGo3QyxRQUFRLEVBQUEsQ0FBQTtZQUNSZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsU0FYSCxDQTlCRixFQTJDRTZXLE1BQU0sQ0FBQ29rQixzQkFBc0IsQ0FBQ3ZDLE9BQXhCLEVBQWlDLElBQUtyZSxDQUFBQSxHQUF0QyxDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXFiLFVBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQVgsU0FGSixFQUdJO0VBQUVBLFVBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQVgsU0FISixDQTNDRixFQWlERTFFLE1BQU0sQ0FBQ29rQixzQkFBc0IsQ0FBQ2hDLGFBQXhCLEVBQXVDLElBQUs1ZSxDQUFBQSxHQUE1QyxDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXViLFVBQUFBLFNBQVMsRUFBRStkLFdBQVcsRUFBQTtFQUF4QixTQUZKLEVBR0k7WUFBRS9kLFNBQVMsRUFBRStkLFdBQVcsQ0FBQyxNQUFELENBQUE7RUFBeEIsU0FISixDQWpERixFQXVERTNpQixNQUFNLENBQUNva0Isc0JBQXNCLENBQUMvQixlQUF4QixFQUF5QyxJQUFLN2UsQ0FBQUEsR0FBOUMsQ0FBTixDQUNHbmEsT0FESCxDQUVJO1lBQUV1YixTQUFTLEVBQUUrZCxXQUFXLEVBQXhCO0VBQTRCamUsVUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBckMsU0FGSixFQUdJO0VBQ0VFLFVBQUFBLFNBQVMsRUFBRStkLFdBQVcsQ0FBQSxFQUFBLENBQUEsTUFBQSxDQUFJekMsS0FBSyxDQUFDdGxCLEtBQVYsRUFEeEIsSUFBQSxDQUFBLENBQUE7RUFFRThKLFVBQUFBLE9BQU8sRUFBRSxDQUZYO1lBR0U5YSxVQUFVLEVBQUEsVUFBQSxDQUFBLE1BQUEsQ0FBYSxLQUFLMUcsUUFBbEIsRUFBQSxzQkFBQSxDQUFBLENBQUEsTUFBQSxDQUFpRCxLQUFLQSxRQUF0RCxFQUFBLElBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FBbUUsS0FBS21FLE1BQXhFLENBQUE7RUFIWixTQUhKLENBdkRGLENBQUEsQ0FBQTtFQWlFRCxPQWxFRCxNQWtFTztFQUNMMlksUUFBQUEsTUFBTSxDQUFDdFYsTUFBUCxDQUVFc1YsTUFBTSxDQUFDd2dCLFNBQUQsRUFBWSxJQUFBLENBQUtoZCxHQUFqQixDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXViLFVBQUFBLFNBQVMsRUFBRStkLFdBQVcsQ0FBQyxNQUFELENBQXhCO0VBQWtDamUsVUFBQUEsT0FBTyxFQUFFLEVBQUE7RUFBM0MsU0FGSixFQUdJO1lBQUVFLFNBQVMsRUFBRStkLFdBQVcsRUFBeEI7RUFBNEJqZSxVQUFBQSxPQUFPLEVBQUUsQ0FBQTtXQUh6QyxDQUZGLEVBUUUxRSxNQUFNLENBQUN5Z0IsU0FBRCxFQUFZLElBQUEsQ0FBS2pkLEdBQWpCLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsVUFBQUEsU0FBUyxFQUFFK2QsV0FBVyxFQUFBO0VBQXhCLFNBRkosRUFHSTtZQUFFL2QsU0FBUyxFQUFFK2QsV0FBVyxDQUFDLE1BQUQsQ0FBQTtFQUF4QixTQUhKLENBS0d0K0MsQ0FBQUEsS0FMSCxDQUtTLFVBQUE4a0IsSUFBSSxFQUFJO1lBQ2IsTUFBSSxDQUFDazRCLGNBQUwsQ0FBb0J2dUMsTUFBcEIsRUFBQSxDQUFBOztZQUNBc3VDLE9BQU8sRUFBQSxDQUFBO1lBQ1BqN0MsUUFBUSxFQUFBLENBQUE7WUFDUmdqQixJQUFJLEVBQUEsQ0FBQTtFQUNMLFNBVkgsQ0FSRixDQUFBLENBQUE7RUFvQkQsT0FBQTtFQUNGLEtBQUE7Ozs7SUF6U29EdTNCOztFQ052RDtFQUNBO0VBQ0E7O01BQ3FCNEQ7Ozs7O0lBRW5CLFNBQXNGLHdCQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsSUFBQSxJQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUosRUFBSTtFQUFBLFFBQUEsV0FBQSxHQUFBLElBQUEsQ0FBekVqOUIsTUFBeUU7VUFBekVBLE1BQXlFLDRCQUFoRSw2QkFBZ0UsR0FBQSxXQUFBO0VBQUEsUUFBQSxVQUFBLEdBQUEsSUFBQSxDQUFqQ2xFLEtBQWlDO1VBQWpDQSxLQUFpQywyQkFBekIsQ0FBeUIsR0FBQSxVQUFBO0VBQUEsUUFBQSxhQUFBLEdBQUEsSUFBQSxDQUF0QkQsUUFBc0I7VUFBdEJBLFFBQXNCLDhCQUFYLEdBQVcsR0FBQSxhQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLHdCQUFBLENBQUEsQ0FBQTs7TUFDcEYsS0FBTSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFBO0VBQUVtRSxNQUFBQSxNQUFNLEVBQU5BLE1BQUY7RUFBVWxFLE1BQUFBLEtBQUssRUFBTEEsS0FBVjtFQUFpQkQsTUFBQUEsUUFBUSxFQUFSQSxRQUFBQTtPQUF2QixDQUFBLENBQUE7TUFFQSxLQUFLbStCLENBQUFBLGNBQUwsR0FBc0JweUMsTUFBSSxDQUFDbkMsYUFBTCxDQUNwQiw0REFBQSxHQUNFLG9EQUZrQixDQUF0QixDQUFBO0VBSG9GLElBQUEsT0FBQSxLQUFBLENBQUE7RUFPckYsR0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7Ozs7O0VBQ0UsSUFBQSxLQUFBLEVBQUEsU0FBQSxJQUFBLENBQUswekMsU0FBTCxFQUFnQkMsU0FBaEIsRUFBMkJ0NkMsUUFBM0IsRUFBcUM7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDbkMsSUFBS2s3QyxDQUFBQSxjQUFMLENBQW9CdnVDLE1BQXBCLEVBQUEsQ0FBQTtRQUNBMnRDLFNBQVMsQ0FBQ3I2QyxVQUFWLENBQXFCdVYsWUFBckIsQ0FBa0MsSUFBSzBsQyxDQUFBQSxjQUF2QyxFQUF1RFosU0FBdkQsQ0FBQSxDQUFBOztRQUVBLElBQU1XLE9BQU8sR0FBZVosSUFBQUEsQ0FBQUEsZUFBQUEsQ0FBQUEsd0JBQUFBLENBQUFBLFNBQUFBLENBQUFBLEVBQUFBLE9BQUFBLEVBQUFBLElBQUFBLENBQUFBLENBQUFBLElBQUFBLENBQUFBLElBQUFBLEVBQUFBLFNBQWYsQ0FBYixDQUFBOztFQUVBeGdCLE1BQUFBLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FFRXNWLE1BQU0sQ0FBQ3dnQixTQUFELEVBQVksSUFBQSxDQUFLaGQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUseUJBQUE7RUFBYixPQUZKLEVBR0k7RUFBRUEsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO1NBSGpCLENBRkYsRUFRRTVFLE1BQU0sQ0FBQ3lnQixTQUFELEVBQVksSUFBQSxDQUFLamQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUsc0JBQWI7RUFBcUNGLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQTlDLE9BRkosRUFHSTtFQUFFRSxRQUFBQSxTQUFTLEVBQUUseUJBQWI7RUFBd0NGLFFBQUFBLE9BQU8sRUFBRSxFQUFBO0VBQWpELE9BSEosQ0FLR3JnQyxDQUFBQSxLQUxILENBS1MsVUFBQThrQixJQUFJLEVBQUk7VUFDYixNQUFJLENBQUNrNEIsY0FBTCxDQUFvQnZ1QyxNQUFwQixFQUFBLENBQUE7O1VBQ0FzdUMsT0FBTyxFQUFBLENBQUE7VUFDUGo3QyxRQUFRLEVBQUEsQ0FBQTtVQUNSZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsT0FWSCxDQVJGLENBQUEsQ0FBQTtFQW9CRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFJcTNCLFNBQUosRUFBZUMsU0FBZixFQUEwQnQ2QyxRQUExQixFQUFvQztFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNsQyxJQUFLazdDLENBQUFBLGNBQUwsQ0FBb0J2dUMsTUFBcEIsRUFBQSxDQUFBO1FBQ0EwdEMsU0FBUyxDQUFDcDZDLFVBQVYsQ0FBcUJ1VixZQUFyQixDQUFrQyxJQUFLMGxDLENBQUFBLGNBQXZDLEVBQXVEYixTQUF2RCxDQUFBLENBQUE7O1FBRUEsSUFBTVksT0FBTyxHQUFlWixJQUFBQSxDQUFBQSxlQUFBQSxDQUFBQSx3QkFBQUEsQ0FBQUEsU0FBQUEsQ0FBQUEsRUFBQUEsT0FBQUEsRUFBQUEsSUFBQUEsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsSUFBQUEsRUFBQUEsU0FBZixDQUFiLENBQUE7O0VBRUF4Z0IsTUFBQUEsTUFBTSxDQUFDdFYsTUFBUCxDQUVFc1YsTUFBTSxDQUFDd2dCLFNBQUQsRUFBWSxJQUFBLENBQUtoZCxHQUFqQixDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXViLFFBQUFBLFNBQVMsRUFBRSwwQkFBYjtFQUF5Q0YsUUFBQUEsT0FBTyxFQUFFLEVBQUE7RUFBbEQsT0FGSixFQUdJO0VBQUVFLFFBQUFBLFNBQVMsRUFBRSxzQkFBYjtFQUFxQ0YsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBOUMsT0FISixDQUtHcmdDLENBQUFBLEtBTEgsQ0FLUyxVQUFBOGtCLElBQUksRUFBSTtVQUNiLE1BQUksQ0FBQ2s0QixjQUFMLENBQW9CdnVDLE1BQXBCLEVBQUEsQ0FBQTs7VUFDQXN1QyxPQUFPLEVBQUEsQ0FBQTtVQUNQajdDLFFBQVEsRUFBQSxDQUFBO1VBQ1JnakIsSUFBSSxFQUFBLENBQUE7U0FUUixDQUZGLEVBY0U2VyxNQUFNLENBQUN5Z0IsU0FBRCxFQUFZLElBQUEsQ0FBS2pkLEdBQWpCLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO0VBQWIsT0FGSixFQUdJO0VBQUVBLFFBQUFBLFNBQVMsRUFBRSx5QkFBQTtFQUFiLE9BSEosQ0FkRixDQUFBLENBQUE7RUFvQkQsS0FBQTs7OztJQTNFbUQyYjs7RUNIdEQsSUFBTTNiLFNBQVMsR0FBRyxzQkFBbEIsQ0FBQTtFQUVBO0VBQ0E7RUFDQTs7TUFDcUIyZjs7Ozs7SUFFbkIsU0FBaUUsd0JBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxJQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUosRUFBSTtFQUFBLFFBQUEsV0FBQSxHQUFBLElBQUEsQ0FBcERsOUIsTUFBb0Q7VUFBcERBLE1BQW9ELDRCQUEzQyxRQUEyQyxHQUFBLFdBQUE7RUFBQSxRQUFBLFVBQUEsR0FBQSxJQUFBLENBQWpDbEUsS0FBaUM7VUFBakNBLEtBQWlDLDJCQUF6QixDQUF5QixHQUFBLFVBQUE7RUFBQSxRQUFBLGFBQUEsR0FBQSxJQUFBLENBQXRCRCxRQUFzQjtVQUF0QkEsUUFBc0IsOEJBQVgsR0FBVyxHQUFBLGFBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsd0JBQUEsQ0FBQSxDQUFBOztNQUFBLE9BQ3pELE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFBO0VBQUVtRSxNQUFBQSxNQUFNLEVBQU5BLE1BQUY7RUFBVWxFLE1BQUFBLEtBQUssRUFBTEEsS0FBVjtFQUFpQkQsTUFBQUEsUUFBUSxFQUFSQSxRQUFBQTtPQUR3QyxDQUFBLENBQUE7RUFFaEUsR0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7Ozs7O0VBQ0UsSUFBQSxLQUFBLEVBQUEsU0FBQSxJQUFBLENBQUtzOUIsU0FBTCxFQUFnQkMsU0FBaEIsRUFBMkJ0NkMsUUFBM0IsRUFBcUM7UUFDbkMsSUFBTWk3QyxPQUFPLEdBQWVaLElBQUFBLENBQUFBLGVBQUFBLENBQUFBLHdCQUFBQSxDQUFBQSxTQUFBQSxDQUFBQSxFQUFBQSxPQUFBQSxFQUFBQSxJQUFBQSxDQUFBQSxDQUFBQSxJQUFBQSxDQUFBQSxJQUFBQSxFQUFBQSxTQUFmLENBQWIsQ0FBQTs7RUFFQXhnQixNQUFBQSxNQUFNLENBQUN0VixNQUFQLENBRUVzVixNQUFNLENBQUN3Z0IsU0FBRCxFQUFZLElBQUEsQ0FBS2hkLEdBQWpCLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsUUFBQUEsU0FBUyxFQUFUQSxTQUFGO0VBQWFGLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQXRCLE9BRkosRUFHSTtFQUFFRSxRQUFBQSxTQUFTLEVBQVRBLFNBQUY7RUFBYUYsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBdEIsT0FISixDQUtHcmdDLENBQUFBLEtBTEgsQ0FLUyxVQUFBOGtCLElBQUksRUFBSTtVQUNiaTRCLE9BQU8sRUFBQSxDQUFBO1VBQ1BqN0MsUUFBUSxFQUFBLENBQUE7VUFDUmdqQixJQUFJLEVBQUEsQ0FBQTtFQUNMLE9BVEgsQ0FGRixDQUFBLENBQUE7RUFjRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFJcTNCLFNBQUosRUFBZUMsU0FBZixFQUEwQnQ2QyxRQUExQixFQUFvQztRQUNsQyxJQUFNaTdDLE9BQU8sR0FBZVosSUFBQUEsQ0FBQUEsZUFBQUEsQ0FBQUEsd0JBQUFBLENBQUFBLFNBQUFBLENBQUFBLEVBQUFBLE9BQUFBLEVBQUFBLElBQUFBLENBQUFBLENBQUFBLElBQUFBLENBQUFBLElBQUFBLEVBQUFBLFNBQWYsQ0FBYixDQUFBOztFQUVBeGdCLE1BQUFBLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FFRXNWLE1BQU0sQ0FBQ3lnQixTQUFELEVBQVksSUFBQSxDQUFLamQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixRQUFBQSxTQUFTLEVBQVRBLFNBQUY7RUFBYUYsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBdEIsT0FGSixFQUdJO0VBQUVFLFFBQUFBLFNBQVMsRUFBVEEsU0FBRjtFQUFhRixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUF0QixPQUhKLENBS0dyZ0MsQ0FBQUEsS0FMSCxDQUtTLFVBQUE4a0IsSUFBSSxFQUFJO1VBQ2JpNEIsT0FBTyxFQUFBLENBQUE7VUFDUGo3QyxRQUFRLEVBQUEsQ0FBQTtVQUNSZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsT0FUSCxDQUZGLENBQUEsQ0FBQTtFQWFELEtBQUE7Ozs7SUFuRG1EbzNCOztFQ0x0RDtFQUNBO0VBQ0E7O01BQ3FCaUU7Ozs7O0lBRW5CLFNBQXNGLHdCQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsSUFBQSxJQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUosRUFBSTtFQUFBLFFBQUEsV0FBQSxHQUFBLElBQUEsQ0FBekVuOUIsTUFBeUU7VUFBekVBLE1BQXlFLDRCQUFoRSw2QkFBZ0UsR0FBQSxXQUFBO0VBQUEsUUFBQSxVQUFBLEdBQUEsSUFBQSxDQUFqQ2xFLEtBQWlDO1VBQWpDQSxLQUFpQywyQkFBekIsQ0FBeUIsR0FBQSxVQUFBO0VBQUEsUUFBQSxhQUFBLEdBQUEsSUFBQSxDQUF0QkQsUUFBc0I7VUFBdEJBLFFBQXNCLDhCQUFYLEdBQVcsR0FBQSxhQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLHdCQUFBLENBQUEsQ0FBQTs7TUFDcEYsS0FBTSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFBO0VBQUNtRSxNQUFBQSxNQUFNLEVBQU5BLE1BQUQ7RUFBU2xFLE1BQUFBLEtBQUssRUFBTEEsS0FBVDtFQUFnQkQsTUFBQUEsUUFBUSxFQUFSQSxRQUFBQTtPQUF0QixDQUFBLENBQUE7TUFFQSxLQUFLdWhDLENBQUFBLGdCQUFMLEdBQXdCLEdBQXhCLENBQUE7TUFDQSxLQUFLcEQsQ0FBQUEsY0FBTCxHQUFzQnB5QyxNQUFJLENBQUNuQyxhQUFMLENBQ3BCLHdFQUFBLEdBQ0UsOENBRmtCLENBQXRCLENBQUE7RUFKb0YsSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQVFyRixHQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTs7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLElBQUEsQ0FBSzB6QyxTQUFMLEVBQWdCQyxTQUFoQixFQUEyQnQ2QyxRQUEzQixFQUFxQztFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNuQyxJQUFLazdDLENBQUFBLGNBQUwsQ0FBb0J2dUMsTUFBcEIsRUFBQSxDQUFBO1FBQ0EydEMsU0FBUyxDQUFDOWxDLGFBQVYsQ0FBd0JnQixZQUF4QixDQUFxQyxLQUFLMGxDLGNBQTFDLEVBQTBEWixTQUFTLENBQUN4NEMsV0FBcEUsQ0FBQSxDQUFBOztRQUVBLElBQU1tNUMsT0FBTyxHQUFlWixJQUFBQSxDQUFBQSxlQUFBQSxDQUFBQSx3QkFBQUEsQ0FBQUEsU0FBQUEsQ0FBQUEsRUFBQUEsT0FBQUEsRUFBQUEsSUFBQUEsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsSUFBQUEsRUFBQUEsU0FBZixDQUFiLENBQUE7O0VBRUF4Z0IsTUFBQUEsTUFBTSxDQUFDdFYsTUFBUCxDQUVFc1YsTUFBTSxDQUFDLElBQUEsQ0FBS3FoQixjQUFOLEVBQXNCLElBQUs3ZCxDQUFBQSxHQUEzQixDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXViLFFBQUFBLFNBQVMsRUFBRSxzQkFBYjtFQUFxQ0YsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBOUMsT0FGSixFQUdJO0VBQUVBLFFBQUFBLE9BQU8sRUFBRSxJQUFLK2YsQ0FBQUEsZ0JBQUFBO0VBQWhCLE9BSEosQ0FLR3BnRCxDQUFBQSxLQUxILENBS1MsVUFBQThrQixJQUFJLEVBQUk7VUFDYixNQUFJLENBQUNrNEIsY0FBTCxDQUFvQnZ1QyxNQUFwQixFQUFBLENBQUE7O1VBQ0FxVyxJQUFJLEVBQUEsQ0FBQTtTQVBSLENBRkYsRUFZRTZXLE1BQU0sQ0FBQ3dnQixTQUFELEVBQVksSUFBQSxDQUFLaGQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUseUJBQUE7RUFBYixPQUZKLEVBR0k7RUFBRUEsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO1NBSGpCLENBWkYsRUFrQkU1RSxNQUFNLENBQUN5Z0IsU0FBRCxFQUFZLElBQUEsQ0FBS2pkLEdBQWpCLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO0VBQWIsT0FGSixFQUdJO0VBQUVBLFFBQUFBLFNBQVMsRUFBRSx5QkFBQTtFQUFiLE9BSEosQ0FLR3ZnQyxDQUFBQSxLQUxILENBS1MsVUFBQThrQixJQUFJLEVBQUk7VUFDYmk0QixPQUFPLEVBQUEsQ0FBQTtVQUNQajdDLFFBQVEsRUFBQSxDQUFBO1VBQ1JnakIsSUFBSSxFQUFBLENBQUE7RUFDTCxPQVRILENBbEJGLENBQUEsQ0FBQTtFQTZCRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFJcTNCLFNBQUosRUFBZUMsU0FBZixFQUEwQnQ2QyxRQUExQixFQUFvQztFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNsQyxJQUFLazdDLENBQUFBLGNBQUwsQ0FBb0J2dUMsTUFBcEIsRUFBQSxDQUFBO1FBQ0EwdEMsU0FBUyxDQUFDcDZDLFVBQVYsQ0FBcUJ1VixZQUFyQixDQUFrQyxLQUFLMGxDLGNBQXZDLEVBQXVEYixTQUFTLENBQUN2NEMsV0FBakUsQ0FBQSxDQUFBOztRQUVBLElBQU1tNUMsT0FBTyxHQUFlWixJQUFBQSxDQUFBQSxlQUFBQSxDQUFBQSx3QkFBQUEsQ0FBQUEsU0FBQUEsQ0FBQUEsRUFBQUEsT0FBQUEsRUFBQUEsSUFBQUEsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsSUFBQUEsRUFBQUEsU0FBZixDQUFiLENBQUE7O0VBRUF4Z0IsTUFBQUEsTUFBTSxDQUFDdFYsTUFBUCxDQUVFc1YsTUFBTSxDQUFDLElBQUEsQ0FBS3FoQixjQUFOLEVBQXNCLElBQUs3ZCxDQUFBQSxHQUEzQixDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXViLFFBQUFBLFNBQVMsRUFBRSxzQkFBYjtFQUFxQ0YsUUFBQUEsT0FBTyxFQUFFLElBQUsrZixDQUFBQSxnQkFBQUE7RUFBbkQsT0FGSixFQUdJO0VBQUUvZixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFYLE9BSEosQ0FLR3JnQyxDQUFBQSxLQUxILENBS1MsVUFBQThrQixJQUFJLEVBQUk7VUFDYixNQUFJLENBQUNrNEIsY0FBTCxDQUFvQnZ1QyxNQUFwQixFQUFBLENBQUE7O1VBQ0FxVyxJQUFJLEVBQUEsQ0FBQTtTQVBSLENBRkYsRUFZRTZXLE1BQU0sQ0FBQ3dnQixTQUFELEVBQVksSUFBQSxDQUFLaGQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUseUJBQWI7RUFBd0NGLFFBQUFBLE9BQU8sRUFBRSxFQUFBO0VBQWpELE9BRkosRUFHSTtFQUFFRSxRQUFBQSxTQUFTLEVBQUUsc0JBQWI7RUFBcUNGLFFBQUFBLE9BQU8sRUFBRSxDQUFBO1NBSGxELENBWkYsRUFrQkUxRSxNQUFNLENBQUN5Z0IsU0FBRCxFQUFZLElBQUEsQ0FBS2pkLEdBQWpCLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO0VBQWIsT0FGSixFQUdJO0VBQUVBLFFBQUFBLFNBQVMsRUFBRSx5QkFBQTtFQUFiLE9BSEosQ0FLR3ZnQyxDQUFBQSxLQUxILENBS1MsVUFBQThrQixJQUFJLEVBQUk7VUFDYmk0QixPQUFPLEVBQUEsQ0FBQTtVQUNQajdDLFFBQVEsRUFBQSxDQUFBO1VBQ1JnakIsSUFBSSxFQUFBLENBQUE7RUFDTCxPQVRILENBbEJGLENBQUEsQ0FBQTtFQTZCRCxLQUFBOzs7O0lBOUZtRG8zQjs7RUNIdEQ7RUFDQTtFQUNBOztNQUNxQm1FOzs7OztJQUVuQixTQUF5Rix1QkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTs7RUFBQSxJQUFBLElBQUEsSUFBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFKLEVBQUk7RUFBQSxRQUFBLFdBQUEsR0FBQSxJQUFBLENBQTVFcjlCLE1BQTRFO1VBQTVFQSxNQUE0RSw0QkFBbkUsNkJBQW1FLEdBQUEsV0FBQTtFQUFBLFFBQUEsVUFBQSxHQUFBLElBQUEsQ0FBcENsRSxLQUFvQztVQUFwQ0EsS0FBb0MsMkJBQTVCLElBQTRCLEdBQUEsVUFBQTtFQUFBLFFBQUEsYUFBQSxHQUFBLElBQUEsQ0FBdEJELFFBQXNCO1VBQXRCQSxRQUFzQiw4QkFBWCxHQUFXLEdBQUEsYUFBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSx1QkFBQSxDQUFBLENBQUE7O01BQ3ZGLEtBQU0sR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBQTtFQUFFbUUsTUFBQUEsTUFBTSxFQUFOQSxNQUFGO0VBQVVsRSxNQUFBQSxLQUFLLEVBQUxBLEtBQVY7RUFBaUJELE1BQUFBLFFBQVEsRUFBUkEsUUFBQUE7T0FBdkIsQ0FBQSxDQUFBO01BRUEsS0FBS20rQixDQUFBQSxjQUFMLEdBQXNCcHlDLE1BQUksQ0FBQ25DLGFBQUwsQ0FDcEIsNERBQUEsR0FDRSxrQ0FGa0IsQ0FBdEIsQ0FBQTtFQUh1RixJQUFBLE9BQUEsS0FBQSxDQUFBO0VBT3hGLEdBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBOzs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsSUFBQSxDQUFLMHpDLFNBQUwsRUFBZ0JDLFNBQWhCLEVBQTJCdDZDLFFBQTNCLEVBQXFDO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ25DLElBQUtrN0MsQ0FBQUEsY0FBTCxDQUFvQnZ1QyxNQUFwQixFQUFBLENBQUE7UUFDQTJ0QyxTQUFTLENBQUNyNkMsVUFBVixDQUFxQnVWLFlBQXJCLENBQWtDLElBQUswbEMsQ0FBQUEsY0FBdkMsRUFBdURaLFNBQXZELENBQUEsQ0FBQTs7UUFFQSxJQUFNVyxPQUFPLEdBQWVaLElBQUFBLENBQUFBLGVBQUFBLENBQUFBLHVCQUFBQSxDQUFBQSxTQUFBQSxDQUFBQSxFQUFBQSxPQUFBQSxFQUFBQSxJQUFBQSxDQUFBQSxDQUFBQSxJQUFBQSxDQUFBQSxJQUFBQSxFQUFBQSxTQUFmLENBQWIsQ0FBQTs7UUFFQSxJQUFNbUUsU0FBUyxHQUFHM2tCLE1BQU0sQ0FBQyxLQUFLcWhCLGNBQU4sQ0FBTixDQUNmMzNCLElBRGUsQ0FDVixLQUFLdkcsS0FBTCxHQUFhLEtBQUtELFFBRFIsQ0FBQSxDQUVmN2UsS0FGZSxDQUVULFVBQUE4a0IsSUFBSSxFQUFJO1VBQ2IsTUFBSSxDQUFDazRCLGNBQUwsQ0FBb0J2dUMsTUFBcEIsRUFBQSxDQUFBOztVQUNBcVcsSUFBSSxFQUFBLENBQUE7RUFDTCxPQUxlLENBQWxCLENBQUE7RUFPQTZXLE1BQUFBLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FFRWk2QixTQUZGLEVBSUUza0IsTUFBTSxDQUFDd2dCLFNBQUQsRUFBWSxJQUFLaGQsQ0FBQUEsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUVJO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUseUJBQUE7RUFBYixPQUZKLEVBR0k7RUFBRUEsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO1NBSGpCLENBSkYsRUFVRTVFLE1BQU0sQ0FBQ3lnQixTQUFELEVBQVksSUFBQSxDQUFLamQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUNXO0VBQUVxYixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFYLE9BRFgsRUFDMkI7RUFBRUEsUUFBQUEsT0FBTyxFQUFFLEVBQUE7RUFBWCxPQUQzQixDQUVHcmdDLENBQUFBLEtBRkgsQ0FFUyxVQUFBOGtCLElBQUksRUFBSTtVQUNiaTRCLE9BQU8sRUFBQSxDQUFBO1VBQ1BqN0MsUUFBUSxFQUFBLENBQUE7VUFDUmdqQixJQUFJLEVBQUEsQ0FBQTtFQUNMLE9BTkgsQ0FWRixDQUFBLENBQUE7RUFrQkQsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBSXEzQixTQUFKLEVBQWVDLFNBQWYsRUFBMEJ0NkMsUUFBMUIsRUFBb0M7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDbEMsSUFBS2s3QyxDQUFBQSxjQUFMLENBQW9CdnVDLE1BQXBCLEVBQUEsQ0FBQTtRQUNBMHRDLFNBQVMsQ0FBQ3A2QyxVQUFWLENBQXFCdVYsWUFBckIsQ0FBa0MsSUFBSzBsQyxDQUFBQSxjQUF2QyxFQUF1RGIsU0FBdkQsQ0FBQSxDQUFBOztRQUVBLElBQU1ZLE9BQU8sR0FBZVosSUFBQUEsQ0FBQUEsZUFBQUEsQ0FBQUEsdUJBQUFBLENBQUFBLFNBQUFBLENBQUFBLEVBQUFBLE9BQUFBLEVBQUFBLElBQUFBLENBQUFBLENBQUFBLElBQUFBLENBQUFBLElBQUFBLEVBQUFBLFNBQWYsQ0FBYixDQUFBOztRQUVBeGdCLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FFRXNWLE1BQU0sQ0FBQyxJQUFLcWhCLENBQUFBLGNBQU4sQ0FBTixDQUNHMzNCLElBREgsQ0FDUSxJQUFLdkcsQ0FBQUEsS0FBTCxHQUFhLElBQUtELENBQUFBLFFBRDFCLEVBRUc3ZSxLQUZILENBRVMsVUFBQThrQixJQUFJLEVBQUk7VUFDYixNQUFJLENBQUNrNEIsY0FBTCxDQUFvQnZ1QyxNQUFwQixFQUFBLENBQUE7O1VBQ0FxVyxJQUFJLEVBQUEsQ0FBQTtTQUpSLENBRkYsRUFTRTZXLE1BQU0sQ0FBQ3dnQixTQUFELEVBQVksSUFBQSxDQUFLaGQsR0FBakIsQ0FBTixDQUNHbmEsT0FESCxDQUNXO0VBQUVxYixRQUFBQSxPQUFPLEVBQUUsRUFBQTtFQUFYLE9BRFgsRUFDNEI7RUFBRUEsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBWCxPQUQ1QixDQUVHcmdDLENBQUFBLEtBRkgsQ0FFUyxVQUFBOGtCLElBQUksRUFBSTtVQUNiaTRCLE9BQU8sRUFBQSxDQUFBO1VBQ1BqN0MsUUFBUSxFQUFBLENBQUE7VUFDUmdqQixJQUFJLEVBQUEsQ0FBQTtTQUxSLENBVEYsRUFpQkU2VyxNQUFNLENBQUN5Z0IsU0FBRCxFQUFZLElBQUEsQ0FBS2pkLEdBQWpCLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO0VBQWIsT0FGSixFQUdJO0VBQUVBLFFBQUFBLFNBQVMsRUFBRSx5QkFBQTtFQUFiLE9BSEosQ0FqQkYsQ0FBQSxDQUFBO0VBdUJELEtBQUE7Ozs7SUFuRmtEMmI7O0VDSHJEO0VBQ0E7RUFDQTs7TUFDcUJxRTs7Ozs7SUFFbkIsU0FBaUksdUJBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxJQUFBLElBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBSixFQUFJO0VBQUEsUUFBQSxXQUFBLEdBQUEsSUFBQSxDQUFwSHY5QixNQUFvSDtVQUFwSEEsTUFBb0gsNEJBQTNHLDhCQUEyRyxHQUFBLFdBQUE7RUFBQSxRQUFBLGNBQUEsR0FBQSxJQUFBLENBQTNFdzlCLFNBQTJFO1VBQTNFQSxTQUEyRSwrQkFBL0QsNEJBQStELEdBQUEsY0FBQTtFQUFBLFFBQUEsVUFBQSxHQUFBLElBQUEsQ0FBakMxaEMsS0FBaUM7VUFBakNBLEtBQWlDLDJCQUF6QixDQUF5QixHQUFBLFVBQUE7RUFBQSxRQUFBLGFBQUEsR0FBQSxJQUFBLENBQXRCRCxRQUFzQjtVQUF0QkEsUUFBc0IsOEJBQVgsR0FBVyxHQUFBLGFBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsdUJBQUEsQ0FBQSxDQUFBOztNQUMvSCxLQUFNLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQUE7RUFBQ21FLE1BQUFBLE1BQU0sRUFBTkEsTUFBRDtFQUFTbEUsTUFBQUEsS0FBSyxFQUFMQSxLQUFUO0VBQWdCRCxNQUFBQSxRQUFRLEVBQVJBLFFBQUFBO09BQXRCLENBQUEsQ0FBQTtNQUNBLEtBQUsyaEMsQ0FBQUEsU0FBTCxHQUFpQkEsU0FBakIsQ0FBQTtFQUYrSCxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBR2hJLEdBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBOzs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsSUFBQSxDQUFLckUsU0FBTCxFQUFnQkMsU0FBaEIsRUFBMkJ0NkMsUUFBM0IsRUFBcUM7UUFDbkMsSUFBTWk3QyxPQUFPLEdBQWVaLElBQUFBLENBQUFBLGVBQUFBLENBQUFBLHVCQUFBQSxDQUFBQSxTQUFBQSxDQUFBQSxFQUFBQSxPQUFBQSxFQUFBQSxJQUFBQSxDQUFBQSxDQUFBQSxJQUFBQSxDQUFBQSxJQUFBQSxFQUFBQSxTQUFmLENBQWIsQ0FBQTs7RUFFQXhnQixNQUFBQSxNQUFNLENBQUN0VixNQUFQLENBRUVzVixNQUFNLENBQUN3Z0IsU0FBRCxFQUFZLElBQUEsQ0FBS2hkLEdBQWpCLENBQU4sQ0FDR25hLE9BREgsQ0FFSTtFQUFFdWIsUUFBQUEsU0FBUyxFQUFFLHlCQUFiO0VBQXdDRixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFqRCxPQUZKLEVBR0k7RUFBRUUsUUFBQUEsU0FBUyxFQUFFLHNCQUFiO0VBQXFDRixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUE5QyxPQUhKLENBS0dyZ0MsQ0FBQUEsS0FMSCxDQUtTLFVBQUE4a0IsSUFBSSxFQUFJO1VBQ2JpNEIsT0FBTyxFQUFBLENBQUE7VUFDUGo3QyxRQUFRLEVBQUEsQ0FBQTtVQUNSZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsT0FUSCxDQUZGLENBQUEsQ0FBQTtFQWNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBOzs7O0VBQ0UsSUFBQSxLQUFBLEVBQUEsU0FBQSxHQUFBLENBQUlxM0IsU0FBSixFQUFlQyxTQUFmLEVBQTBCdDZDLFFBQTFCLEVBQW9DO1FBQ2xDLElBQU1pN0MsT0FBTyxHQUFlWixJQUFBQSxDQUFBQSxlQUFBQSxDQUFBQSx1QkFBQUEsQ0FBQUEsU0FBQUEsQ0FBQUEsRUFBQUEsT0FBQUEsRUFBQUEsSUFBQUEsQ0FBQUEsQ0FBQUEsSUFBQUEsQ0FBQUEsSUFBQUEsRUFBQUEsU0FBZixDQUFiLENBQUE7O0VBRUF4Z0IsTUFBQUEsTUFBTSxDQUFDdFYsTUFBUCxDQUVFc1YsTUFBTSxDQUFDeWdCLFNBQUQsRUFBWSxJQUFBLENBQUtqZCxHQUFqQixDQUFOLENBQ0duYSxPQURILENBRUk7RUFBRXViLFFBQUFBLFNBQVMsRUFBRSxzQkFBYjtFQUFxQ0YsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBOUMsT0FGSixFQUdJO0VBQUVsYixRQUFBQSxHQUFHLEVBQUU7RUFBRW9iLFVBQUFBLFNBQVMsRUFBRSx5QkFBYjtFQUF3Q0YsVUFBQUEsT0FBTyxFQUFFLENBQUE7V0FBeEQ7RUFBNkRyZCxRQUFBQSxNQUFNLEVBQUUsSUFBS3c5QixDQUFBQSxTQUFBQTtFQUExRSxPQUhKLENBS0d4Z0QsQ0FBQUEsS0FMSCxDQUtTLFVBQUE4a0IsSUFBSSxFQUFJO1VBQ2JpNEIsT0FBTyxFQUFBLENBQUE7VUFDUGo3QyxRQUFRLEVBQUEsQ0FBQTtVQUNSZ2pCLElBQUksRUFBQSxDQUFBO0VBQ0wsT0FUSCxDQUZGLENBQUEsQ0FBQTtFQWFELEtBQUE7Ozs7SUFwRGtEbzNCOztNQ0xoQ3VFOzs7OztFQUNuQixFQUFBLFNBQUEscUJBQUEsQ0FBWXgrQyxPQUFaLEVBQXFCO0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLHFCQUFBLENBQUEsQ0FBQTs7RUFBQSxJQUFBLE9BQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQ2JBLE9BRGEsQ0FBQSxDQUFBO0VBRXBCLEdBQUE7Ozs7RUFDRCxJQUFBLEtBQUEsRUFBQSxTQUFBLElBQUEsQ0FBS2s2QyxTQUFMLEVBQWdCQyxTQUFoQixFQUEyQnQ2QyxRQUEzQixFQUFxQztRQUNuQ0EsUUFBUSxFQUFBLENBQUE7RUFDVCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBSXE2QyxTQUFKLEVBQWVDLFNBQWYsRUFBMEJ0NkMsUUFBMUIsRUFBb0M7UUFDbENBLFFBQVEsRUFBQSxDQUFBO0VBQ1QsS0FBQTs7OztJQVZnRG82Qzs7RUNpQm5ELElBQU1oYSxlQUFhLEdBQUc7RUFDcEIsRUFBQSxTQUFBLEVBQVcsU0FBWSxRQUFBLEdBQUE7RUFBRSxJQUFBLE9BQU94bUMsUUFBUSxDQUFDZ0QsU0FBVCxFQUF1QjZoRCxHQUFBQSx1QkFBdkIsR0FBaURoQyx5QkFBeEQsQ0FBQTtLQURMO0VBRXBCLEVBQUEsT0FBQSxFQUFTLFNBQVksS0FBQSxHQUFBO0VBQUUsSUFBQSxPQUFPN2lELFFBQVEsQ0FBQ2dELFNBQVQsRUFBdUJ5aEQsR0FBQUEsd0JBQXZCLEdBQWtENUIseUJBQXpELENBQUE7S0FGSDtFQUdwQixFQUFBLE1BQUEsRUFBUSxTQUFZLElBQUEsR0FBQTtFQUFFLElBQUEsT0FBTzdpRCxRQUFRLENBQUNnRCxTQUFULEVBQXVCMmhELEdBQUFBLHVCQUF2QixHQUFpREosd0JBQXhELENBQUE7S0FIRjtFQUlwQixFQUFBLE1BQUEsRUFBUSxTQUFZLElBQUEsR0FBQTtFQUFFLElBQUEsT0FBT3ZrRCxRQUFRLENBQUNnRCxTQUFULEVBQXVCNmhELEdBQUFBLHVCQUF2QixHQUFpREwsd0JBQXhELENBQUE7S0FKRjtFQUtwQixFQUFBLFdBQUEsRUFBYTNCLHlCQUxPO0VBTXBCLEVBQUEsVUFBQSxFQUFZNEIsd0JBTlE7RUFPcEIsRUFBQSxVQUFBLEVBQVlGLHdCQVBRO0VBUXBCLEVBQUEsU0FBQSxFQUFXSSx1QkFSUztFQVNwQixFQUFBLFVBQUEsRUFBWUgsd0JBVFE7RUFVcEIsRUFBQSxTQUFBLEVBQVdLLHVCQVZTO0lBV3BCLE1BQVFFLEVBQUFBLHFCQUFBQTtFQVhZLENBQXRCLENBQUE7RUFjQSxJQUFNQyxhQUFXLEdBQUc7RUFDbEI7RUFDRjtFQUNBO0VBQ0E7RUFDRTcrQixFQUFBQSxLQUxrQixFQUtaOCtCLFNBQUFBLEtBQUFBLENBQUFBLGdCQUxZLEVBS003K0MsUUFMTixFQUtnQjtNQUNoQ0EsUUFBUSxFQUFBLENBQUE7RUFDVCxHQUFBO0VBUGlCLENBQXBCLENBQUE7O0VBVUEsSUFBTTgrQyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLENBQUFudkMsRUFBRSxFQUFBO0lBQUEsT0FBS0EsRUFBRSxDQUFDcUIsUUFBSCxLQUFnQixVQUFqQixJQUFnQ2xJLE1BQUksQ0FBQ21KLEtBQUwsQ0FBWSxpREFBWixDQUFwQyxDQUFBO0VBQUEsQ0FBNUIsQ0FBQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O01BQ3FCOHNDOzs7OztJQThKbkIsU0FBYyxnQkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsZ0JBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7TUFFQSxLQUFLQyxDQUFBQSxVQUFMLEdBQWtCLEtBQWxCLENBQUE7TUFDQSxLQUFLQyxDQUFBQSxZQUFMLEdBQW9CLEtBQXBCLENBQUE7TUFDQSxLQUFLQyxDQUFBQSxXQUFMLEdBQW1CdmxCLGlCQUFuQixDQUFBO0VBQ0EsSUFBQSxLQUFBLENBQUt3bEIsUUFBTCxHQUFnQixJQUFJNWhELE9BQUosRUFBaEIsQ0FBQTs7RUFFQSxJQUFBLEtBQUEsQ0FBSzZoQyxzQkFBTCxFQUFBLENBQUE7O0VBUlksSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQVNiLEdBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7Ozs7O0VBN0tFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtNQUVFLFNBQXNCLEdBQUEsR0FBQTtFQUNwQixNQUFBLE9BQU8sS0FBS0QsZ0JBQVosQ0FBQTtFQUNELEtBQUE7OztXQW9CRCxTQUFpQixHQUFBLEdBQUE7RUFDZixNQUFBLE9BQU8sS0FBSytmLFdBQVosQ0FBQTs7RUFHRixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBZUUsVUFBZixFQUEyQjtFQUN6QixNQUFBLElBQUksRUFBRUEsVUFBVSxZQUFZL2xCLFVBQXhCLENBQUosRUFBeUM7RUFDdkN2d0IsUUFBQUEsTUFBSSxDQUFDNk4sZUFBTCxFQUFBLENBQUE7RUFDRCxPQUFBOztRQUNELElBQUt1b0MsQ0FBQUEsV0FBTCxHQUFtQkUsVUFBbkIsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWlCLGNBQUEsR0FBQTtFQUNmLE1BQUEsT0FBTyxLQUFLQyxLQUFMLElBQWMsS0FBS3gxQyxZQUFMLENBQWtCLE1BQWxCLENBQXJCLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0FDRSxTQUFXLEdBQUEsR0FBQTtFQUNULE1BQUEsT0FBTyxLQUFLdzFDLEtBQVosQ0FBQTs7RUFHRixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBU25zQyxJQUFULEVBQWU7UUFDYixJQUFLbXNDLENBQUFBLEtBQUwsR0FBYW5zQyxJQUFiLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2xCLElBQUs2c0IsQ0FBQUEsa0JBQUwsR0FBMEIsSUFBS3VmLENBQUFBLG1CQUFMLENBQXlCdHFDLElBQXpCLENBQThCLElBQTlCLENBQTFCLENBQUE7O0VBRUEsTUFBQSxJQUFJLENBQUNwYixRQUFRLENBQUNnRCxTQUFULEVBQUQsSUFBeUIsSUFBS2lOLENBQUFBLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBbUMsS0FBQSxPQUFoRSxFQUF5RTtFQUN2RSxRQUFBLElBQUkwMUMsYUFBSixDQUFBO0VBRUEsUUFBQSxJQUFBLENBQUtDLE1BQUwsR0FBYyxJQUFJcEcsV0FBSixDQUFnQjtFQUM1Qm53QyxVQUFBQSxPQUFPLEVBQUUsSUFEbUI7RUFFNUJxd0MsVUFBQUEsWUFBWSxFQUFFLFNBQUEsWUFBQSxHQUFBO0VBQUEsWUFBQSxPQUFNejdDLElBQUksQ0FBQ3VxQixHQUFMLENBQVMsR0FBVCxFQUFjNFosVUFBVSxDQUFDLE1BQUksQ0FBQ240QixZQUFMLENBQWtCLGlCQUFsQixDQUFELENBQVYsSUFBb0QsQ0FBbEUsQ0FBTixDQUFBO2FBRmM7RUFJNUJxd0MsVUFBQUEsUUFBUSxFQUFFLFNBQU0sUUFBQSxHQUFBO2NBQ2QsSUFBTTdTLEtBQUssR0FBRyxDQUFkLENBQUE7RUFDQSxZQUFBLElBQU12cUIsZ0JBQWdCLEdBQUc7Z0JBQUVDLFFBQVEsRUFBRXdpQyxhQUFhLENBQUM5RSxhQUExQjtnQkFBeUN2NUIsTUFBTSxFQUFFcStCLGFBQWEsQ0FBQzdFLFdBQUFBO2VBQXhGLENBQUE7Y0FDQSxNQUFJLENBQUMrRSxRQUFMLElBQWlCLE1BQUksQ0FBQ0EsUUFBTCxDQUFjcFksS0FBZCxFQUFxQnZxQixnQkFBckIsQ0FBakIsQ0FBQTtFQUNBaFUsWUFBQUEsTUFBSSxDQUFDd0ssbUJBQUwsQ0FBeUIsTUFBekIsRUFBK0IsT0FBL0IsRUFBd0M7RUFBRSt6QixjQUFBQSxLQUFLLEVBQUxBLEtBQUY7RUFBU3ZxQixjQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUFBQTtlQUFqRCxDQUFBLENBQUE7O2NBQ0EsTUFBSSxDQUFDLE1BQUksQ0FBQ285QixRQUFMLEdBQWdCLFVBQWhCLEdBQTZCLFNBQTlCLENBQUosQ0FBNkM7RUFBRXg5QixjQUFBQSxRQUFRLEVBQUU2aUMsYUFBWjtFQUEyQkcsY0FBQUEsVUFBVSxFQUFFLElBQUE7ZUFBcEYsQ0FBQSxDQUFBOztFQUNBSCxZQUFBQSxhQUFhLEdBQUcsSUFBaEIsQ0FBQTthQVYwQjtFQVk1QnZGLFVBQUFBLFFBQVEsRUFBRSxTQUFBLFFBQUEsQ0FBQzNpQyxRQUFELEVBQVd6YyxLQUFYLEVBQXFCO0VBQzdCLFlBQUEsSUFBTXlzQyxLQUFLLEdBQUdod0IsUUFBUSxHQUFHemMsS0FBekIsQ0FBQTtjQUNBLE1BQUksQ0FBQzZrRCxRQUFMLElBQWlCLE1BQUksQ0FBQ0EsUUFBTCxDQUFjcFksS0FBZCxDQUFqQixDQUFBO0VBQ0F2K0IsWUFBQUEsTUFBSSxDQUFDd0ssbUJBQUwsQ0FBeUIsTUFBekIsRUFBK0IsT0FBL0IsRUFBd0M7RUFBRSt6QixjQUFBQSxLQUFLLEVBQUxBLEtBQUFBO2VBQTFDLENBQUEsQ0FBQTtFQUNBa1ksWUFBQUEsYUFBYSxDQUFDdFEsU0FBZCxDQUF3QjUzQixRQUF4QixFQUFrQ3pjLEtBQWxDLEVBQXlDLE1BQUksQ0FBQ29ZLE9BQUwsQ0FBYTJzQyxzQkFBdEQsRUFBOEUsTUFBSSxDQUFDM3NDLE9BQW5GLENBQUEsQ0FBQTthQWhCMEI7RUFrQjVCbW5DLFVBQUFBLFFBQVEsRUFBRSxTQUFNLFFBQUEsR0FBQTtjQUNkLElBQU05UyxLQUFLLEdBQUcsQ0FBZCxDQUFBO0VBQ0EsWUFBQSxJQUFNdnFCLGdCQUFnQixHQUFHO2dCQUFFQyxRQUFRLEVBQUV3aUMsYUFBYSxDQUFDL0UsZUFBMUI7Z0JBQTJDdDVCLE1BQU0sRUFBRXErQixhQUFhLENBQUM3RSxXQUFBQTtlQUExRixDQUFBO2NBQ0EsTUFBSSxDQUFDK0UsUUFBTCxJQUFpQixNQUFJLENBQUNBLFFBQUwsQ0FBY3BZLEtBQWQsRUFBcUJ2cUIsZ0JBQXJCLENBQWpCLENBQUE7RUFDQWhVLFlBQUFBLE1BQUksQ0FBQ3dLLG1CQUFMLENBQXlCLE1BQXpCLEVBQStCLE9BQS9CLEVBQXdDO0VBQUUrekIsY0FBQUEsS0FBSyxFQUFMQSxLQUFGO0VBQVN2cUIsY0FBQUEsZ0JBQWdCLEVBQWhCQSxnQkFBQUE7ZUFBakQsQ0FBQSxDQUFBO2NBQ0F5aUMsYUFBYSxDQUFDakQsT0FBZCxDQUFzQixNQUFJLENBQUN0cEMsT0FBTCxDQUFhMnNDLHNCQUFuQyxFQUEyRCxNQUFJLENBQUMzc0MsT0FBaEUsQ0FBQSxDQUFBO0VBQ0F1c0MsWUFBQUEsYUFBYSxHQUFHLElBQWhCLENBQUE7YUF4QjBCO0VBMkI1QjdGLFVBQUFBLFdBQVcsRUFBRSxTQUFBLFdBQUEsQ0FBQzN6QyxLQUFELEVBQVFzUixRQUFSLEVBQXFCO0VBQ2hDO0VBQ0EsWUFBQSxJQUFJLENBQUMsTUFBSSxDQUFDMm5DLFVBQU4sSUFBb0IsTUFBSSxDQUFDN3RDLFFBQUwsQ0FBYzVSLE1BQWQsR0FBdUIsQ0FBL0MsRUFBa0Q7RUFFaEQ7RUFDQSxjQUFBLElBQU1xZ0QsSUFBSSxHQUFHMWtELFFBQVEsQ0FBQyxNQUFJLENBQUMyTyxZQUFMLENBQWtCLG9CQUFsQixDQUFBLElBQTJDLEVBQTVDLEVBQWdELEVBQWhELENBQXJCLENBQUE7O2dCQUNBLElBQUk5RCxLQUFLLENBQUNxUixPQUFOLENBQWNxUyxTQUFkLEtBQTZCLE9BQTdCLElBQXdDbTJCLElBQUksR0FBR3ZvQyxRQUFuRCxFQUE2RDtFQUUzRDtFQUNBLGdCQUFBLElBQU13b0MsSUFBSSxHQUFHLFNBQVBBLElBQU8sQ0FBQWx3QyxFQUFFLEVBQUE7RUFBQSxrQkFBQSxPQUFJLG1CQUFtQnBWLElBQW5CLENBQXdCb1YsRUFBRSxDQUFDdkYsT0FBM0IsQ0FBSixDQUFBO21CQUFmLENBQUE7O2tCQUNBLElBQUksQ0FBQ3kxQyxJQUFJLENBQUM5NUMsS0FBSyxDQUFDaEcsTUFBUCxDQUFMLElBQXVCLENBQUMrSSxNQUFJLENBQUNtRSxVQUFMLENBQWdCbEgsS0FBSyxDQUFDaEcsTUFBdEIsRUFBOEI4L0MsSUFBOUIsRUFBb0MsVUFBQXRqRCxDQUFDLEVBQUE7RUFBQSxrQkFBQSxPQUFJLFlBQVloQyxJQUFaLENBQWlCZ0MsQ0FBQyxDQUFDNk4sT0FBbkIsQ0FBSixDQUFBO0VBQUEsaUJBQXJDLENBQTVCLEVBQW1HO0VBRWpHO0VBQ0Esa0JBQUEsSUFBTXVTLFNBQVMsR0FBRyxDQUFDLE1BQUksQ0FBQzNKLE9BQUwsQ0FBYThzQyxhQUFiLElBQThCLEVBQS9CLEVBQW1DbmpDLFNBQW5DLElBQWdELE1BQUksQ0FBQ29qQyxlQUFMLENBQXFCMWpDLFVBQXZGLENBQUE7b0JBQ0EsSUFBTU8sUUFBUSxHQUFHd2pCLGVBQWEsQ0FBQ3pqQixTQUFELENBQWIsWUFBb0M1WCxRQUFwQyxHQUNicTdCLGVBQWEsQ0FBQ3pqQixTQUFELENBQWIsQ0FBeUJyZ0IsSUFBekIsRUFEYSxHQUViOGpDLGVBQWEsQ0FBQ3pqQixTQUFELENBRmpCLENBQUE7O29CQUlBLElBQUksT0FBT0MsUUFBUCxLQUFvQixXQUFwQixJQUFtQ0EsUUFBUSxDQUFDZ3JCLFNBQWhELEVBQTJEO0VBQ3pEMlgsb0JBQUFBLGFBQWEsR0FBRyxJQUFJM2lDLFFBQUosRUFBaEIsQ0FEeUQ7O0VBRXpELG9CQUFBLE9BQU8sS0FBUCxDQUFBO0VBQ0QsbUJBQUE7RUFDRixpQkFBQTtFQUNGLGVBQUE7RUFDRixhQUFBOztjQUVELE9BQU8sSUFBUCxDQTFCZ0M7RUEyQmpDLFdBQUE7RUF0RDJCLFNBQWhCLENBQWQsQ0FBQTtVQXlEQSxJQUFLZ21CLENBQUFBLHdCQUFMLENBQThCLFdBQTlCLENBQUEsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBSSxJQUFBLENBQUtxYyxZQUFULEVBQXVCO0VBQ3JCLFFBQUEsT0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS0EsQ0FBQUEsWUFBTCxHQUFvQixJQUFwQixDQUFBO0VBRUEsTUFBQSxJQUFNbHBDLFFBQVEsR0FBR2pOLE1BQUksQ0FBQ2dOLEtBQUwsRUFBakIsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLa3FDLE1BQUwsR0FBY2pxQyxRQUFRLENBQUNDLE9BQXZCLENBQUE7RUFFQTRvQyxNQUFBQSxhQUFXLENBQUM3K0IsS0FBWixDQUFrQixJQUFsQixFQUF3QixZQUFNO1VBQzVCLElBQU1tVixJQUFJLEdBQUcsQ0FBQ3BzQixNQUFJLENBQUNpSSx1QkFBTCxDQUE2QixNQUE3QixDQUFkLENBQUE7RUFDQSxRQUFBLElBQU01USxPQUFPLEdBQUc7RUFBRXdjLFVBQUFBLFNBQVMsRUFBRSxNQUFiO0VBQXFCdVksVUFBQUEsSUFBSSxFQUFKQSxJQUFBQTtXQUFyQyxDQUFBOztFQUVBLFFBQUEsSUFBSSxNQUFJLENBQUN2WixLQUFMLENBQVdwYyxNQUFYLEtBQXNCLENBQXRCLElBQTJCLE1BQUksQ0FBQzBnRCxjQUFMLEVBQS9CLEVBQXNEO1lBQ3BELE1BQUksQ0FBQ0MsUUFBTCxDQUFjLE1BQUksQ0FBQ0QsY0FBTCxFQUFkLEVBQXFDOS9DLE9BQXJDLENBQThDK3lCLENBQUFBLElBQTlDLENBQW1ELFlBQUE7Y0FBQSxPQUFNbmQsUUFBUSxDQUFDRyxPQUFULEVBQU4sQ0FBQTthQUFuRCxDQUFBLENBQUE7V0FERixNQUVPLElBQUksTUFBSSxDQUFDeUYsS0FBTCxDQUFXcGMsTUFBWCxHQUFvQixDQUF4QixFQUEyQjtFQUNoQyxVQUFBLEtBQUssSUFBSTJCLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsTUFBSSxDQUFDeWEsS0FBTCxDQUFXcGMsTUFBL0IsRUFBdUMyQixDQUFDLEVBQXhDLEVBQTRDO0VBQzFDNDlDLFlBQUFBLGlCQUFpQixDQUFDLE1BQUksQ0FBQ25qQyxLQUFMLENBQVd6YSxDQUFYLENBQUQsQ0FBakIsQ0FBQTtFQUNELFdBQUE7O1lBRUQsSUFBSSxNQUFJLENBQUM4UixPQUFULEVBQWtCO0VBQ2hCK2YsWUFBQUEsWUFBWSxDQUFDLE1BQUksQ0FBQy9mLE9BQU4sRUFBZSxZQUFBO2dCQUFBLE9BQ3pCdlYsVUFBVSxDQUFDLFlBQU07RUFDZnNZLGdCQUFBQSxRQUFRLENBQUNHLE9BQVQsRUFBQSxDQUFBO0VBQ0FnZixnQkFBQUEsSUFBSSxJQUFJLE1BQUksQ0FBQ2xpQixPQUFMLENBQWE2N0IsS0FBYixFQUFSLENBQUE7O0VBQ0EsZ0JBQUEsTUFBSSxDQUFDc1IseUJBQUwsRUFBQSxDQUFBO2lCQUhRLEVBSVAsQ0FKTyxDQURlLENBQUE7RUFBQSxhQUFmLENBQVosQ0FBQTtFQU9ELFdBQUE7RUFDRixTQWRNLE1BY0E7WUFDTHB0QixZQUFZLENBQUMsTUFBRCxFQUFPLFlBQU07RUFDdkIsWUFBQSxJQUFJLE1BQUksQ0FBQ3BYLEtBQUwsQ0FBV3BjLE1BQVgsS0FBc0IsQ0FBdEIsSUFBMkIsTUFBSSxDQUFDMGdELGNBQUwsRUFBL0IsRUFBc0Q7Z0JBQ3BELE1BQUksQ0FBQ0MsUUFBTCxDQUFjLE1BQUksQ0FBQ0QsY0FBTCxFQUFkLEVBQXFDOS9DLE9BQXJDLENBQThDK3lCLENBQUFBLElBQTlDLENBQW1ELFlBQUE7a0JBQUEsT0FBTW5kLFFBQVEsQ0FBQ0csT0FBVCxFQUFOLENBQUE7aUJBQW5ELENBQUEsQ0FBQTtFQUNELGFBRkQsTUFFTztFQUNMSCxjQUFBQSxRQUFRLENBQUNHLE9BQVQsRUFBQSxDQUFBO0VBQ0QsYUFBQTtFQUNGLFdBTlcsQ0FBWixDQUFBO0VBT0QsU0FBQTtTQTVCSCxDQUFBLENBQUE7RUE4QkQsS0FBQTs7O2FBRUQsU0FBeUIsc0JBQUEsR0FBQTtFQUN2QixNQUFBLElBQUEsQ0FBS2lwQixnQkFBTCxHQUF3QixJQUFJcmpCLGVBQUosQ0FBb0I7RUFDMUNFLFFBQUFBLFNBQVMsRUFBRW9rQixlQUQrQjtFQUUxQ2xrQixRQUFBQSxTQUFTLEVBQUVrK0IsaUJBRitCO0VBRzFDaCtCLFFBQUFBLGFBQWEsRUFBRSxtQkFIMkI7RUFJMUNFLFFBQUFBLGdCQUFnQixFQUFFLElBQUEsQ0FBS3pTLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBQTtFQUp3QixPQUFwQixDQUF4QixDQUFBO0VBTUQsS0FBQTs7O2FBRUQsU0FBdUIsb0JBQUEsR0FBQTtRQUNyQixJQUFLeTFCLENBQUFBLGtCQUFMLENBQXdCaGhCLE9BQXhCLEVBQUEsQ0FBQTs7UUFDQSxJQUFLZ2hCLENBQUFBLGtCQUFMLEdBQTBCLElBQTFCLENBQUE7RUFFQSxNQUFBLElBQUEsQ0FBS2tnQixNQUFMLElBQWUsSUFBQSxDQUFLQSxNQUFMLENBQVlsd0IsT0FBWixFQUFmLENBQUE7UUFDQSxJQUFLa3dCLENBQUFBLE1BQUwsR0FBYyxJQUFkLENBQUE7RUFDRCxLQUFBOzs7RUFNRCxJQUFBLEtBQUEsRUFBQSxTQUFBLHdCQUFBLENBQXlCaDhDLElBQXpCLEVBQStCc0ksSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDO0VBQzVDLE1BQUEsUUFBUXZJLElBQVI7RUFDRSxRQUFBLEtBQUssV0FBTDtFQUNFLFVBQUEsSUFBQSxDQUFLNDdCLHNCQUFMLEVBQUEsQ0FBQTs7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLFdBQUw7RUFDRSxVQUFBLElBQUEsQ0FBS29nQixNQUFMLElBQWUsSUFBQSxDQUFLQSxNQUFMLENBQVlZLE1BQVosRUFBZixDQUFBO0VBQ0EsVUFBQSxNQUFBO0VBTkosT0FBQTtFQVFELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O2FBQ0UsU0FBc0IsT0FBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQUEsSUFBZGpnRCxPQUFjLHVFQUFKLEVBQUksQ0FBQTs7RUFBQSxNQUFBLElBQUEscUJBQUEsR0FDUCxLQUFLa2dELHNCQUFMLENBQTRCLElBQTVCLEVBQWtDbGdELE9BQWxDLENBRE8sQ0FBQTs7RUFDbEJBLE1BQUFBLE9BRGtCLHlCQUNsQkEsT0FEa0IsQ0FBQTs7RUFHcEIsTUFBQSxJQUFJMkksTUFBSSxDQUFDNk0sU0FBTCxDQUFleFYsT0FBTyxDQUFDbWdELEtBQXZCLENBQUEsSUFBaUNuZ0QsT0FBTyxDQUFDbWdELEtBQVIsR0FBZ0IsQ0FBckQsRUFBd0Q7RUFDdEQsUUFBQSxJQUFBLENBQUtDLFlBQUwsQ0FBa0JwZ0QsT0FBTyxDQUFDbWdELEtBQTFCLENBQUEsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBTUUsU0FBUyxHQUFHLFNBQVpBLFNBQVksR0FBQTtFQUFBLFFBQUEsT0FBTSxJQUFJdnFDLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQWE7RUFDL0MsVUFBQSxNQUFJLENBQUNncEMsV0FBTCxDQUFpQnVCLE1BQWpCLENBQXdCLE1BQUksQ0FBQzlrQyxLQUFMLENBQVcsTUFBSSxDQUFDQSxLQUFMLENBQVdwYyxNQUFYLEdBQW9CLENBQS9CLENBQXhCLENBQUEsQ0FBQTs7WUFDQTJXLE9BQU8sRUFBQSxDQUFBO0VBQ1IsU0FIdUIsQ0FBTixDQUFBO1NBQWxCLENBQUE7O0VBS0EsTUFBQSxPQUFPLEtBQUt3cUMsUUFBTCxDQUFjdmdELE9BQWQsRUFBdUJxZ0QsU0FBdkIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxRQUFBLENBQVNyZ0QsT0FBVCxFQUFvRDtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUFBLE1BQUEsSUFBbENpZ0QsTUFBa0MsR0FBekIsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsWUFBQTtVQUFBLE9BQU1ucUMsT0FBTyxDQUFDQyxPQUFSLEVBQU4sQ0FBQTtTQUF5QixDQUFBOztRQUNsRCxJQUFJLElBQUEsQ0FBSzhvQyxVQUFULEVBQXFCO0VBQ25CLFFBQUEsT0FBTy9vQyxPQUFPLENBQUNFLE1BQVIsQ0FBZSw2QkFBZixDQUFQLENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsSUFBSSxLQUFLd0YsS0FBTCxDQUFXcGMsTUFBWCxJQUFxQixDQUF6QixFQUE0QjtFQUMxQixRQUFBLE9BQU8wVyxPQUFPLENBQUNFLE1BQVIsQ0FBZSx1Q0FBZixDQUFQLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUksSUFBQSxDQUFLd3FDLGdCQUFMLEVBQUosRUFBNkI7RUFDM0IsUUFBQSxPQUFPMXFDLE9BQU8sQ0FBQ0UsTUFBUixDQUFlLDJCQUFmLENBQVAsQ0FBQTtFQUNELE9BQUE7O0VBRUQsTUFBQSxJQUFNNVcsTUFBTSxHQUFHLElBQUtvYyxDQUFBQSxLQUFMLENBQVdwYyxNQUExQixDQUFBO1FBRUEsSUFBS3kvQyxDQUFBQSxVQUFMLEdBQWtCLElBQWxCLENBQUE7RUFFQSxNQUFBLElBQUEsQ0FBS3JqQyxLQUFMLENBQVdwYyxNQUFNLEdBQUcsQ0FBcEIsQ0FBQSxDQUF1QnFoRCxnQkFBdkIsQ0FBeUNyaEQsTUFBTSxHQUFHLENBQVYsR0FBZSxDQUF2RCxDQUFBLENBQUE7RUFFQSxNQUFBLE9BQU8sSUFBSTBXLE9BQUosQ0FBWSxVQUFBQyxPQUFPLEVBQUk7VUFDNUIsSUFBTW9rQyxTQUFTLEdBQUcsTUFBSSxDQUFDMytCLEtBQUwsQ0FBV3BjLE1BQU0sR0FBRyxDQUFwQixDQUFsQixDQUFBO1VBQ0EsSUFBTTg2QyxTQUFTLEdBQUcsTUFBSSxDQUFDMStCLEtBQUwsQ0FBV3BjLE1BQU0sR0FBRyxDQUFwQixDQUFsQixDQUFBO0VBRUFZLFFBQUFBLE9BQU8sR0FBRzJJLE1BQUksQ0FBQ3NKLE1BQUwsQ0FBWSxFQUFaLEVBQWdCLE1BQUksQ0FBQ2pTLE9BQUwsSUFBZ0IsRUFBaEMsRUFBb0NBLE9BQXBDLENBQVYsQ0FBQTs7VUFFQSxJQUFJQSxPQUFPLENBQUNsQyxJQUFaLEVBQWtCO1lBQ2hCbzhDLFNBQVMsQ0FBQ3A4QyxJQUFWLEdBQWlCNkssTUFBSSxDQUFDc0osTUFBTCxDQUFZLEVBQVosRUFBZ0Jpb0MsU0FBUyxDQUFDcDhDLElBQVYsSUFBa0IsRUFBbEMsRUFBc0NrQyxPQUFPLENBQUNsQyxJQUFSLElBQWdCLEVBQXRELENBQWpCLENBQUE7RUFDRCxTQUFBOztFQUVELFFBQUEsSUFBTStrQixJQUFJLEdBQUcsU0FBUEEsSUFBTyxHQUFNO1lBQ2pCbzlCLE1BQU0sRUFBQSxDQUFHbHRCLElBQVQsQ0FBYyxZQUFNO2NBQ2xCLE1BQUksQ0FBQzhyQixVQUFMLEdBQWtCLEtBQWxCLENBQUE7O0VBRUEzRSxZQUFBQSxTQUFTLENBQUN4TCxLQUFWLEVBQUEsQ0FBQTs7RUFDQS9sQyxZQUFBQSxNQUFJLENBQUN3SyxtQkFBTCxDQUF5QixNQUF6QixFQUErQixTQUEvQixFQUEwQztFQUN4Q2duQyxjQUFBQSxTQUFTLEVBQVRBLFNBRHdDO0VBRXhDRCxjQUFBQSxTQUFTLEVBQVRBLFNBRndDO0VBR3hDNy9DLGNBQUFBLFNBQVMsRUFBRSxNQUg2QjtFQUl4Q2tsRCxjQUFBQSxVQUFVLEVBQUUsQ0FBQyxDQUFDdi9DLE9BQU8sQ0FBQ3UvQyxVQUprQjtFQUlDO0VBQ3pDM1osY0FBQUEsYUFBYSxFQUFFLENBQUMsQ0FBQzVsQyxPQUFPLENBQUM0bEMsYUFMZTs7ZUFBMUMsQ0FBQSxDQUFBO2NBUUE1bEMsT0FBTyxDQUFDSCxRQUFSLElBQW9CRyxPQUFPLENBQUNILFFBQVIsQ0FBaUJxNkMsU0FBakIsQ0FBcEIsQ0FBQTtjQUVBbmtDLE9BQU8sQ0FBQ21rQyxTQUFELENBQVAsQ0FBQTthQWRGLENBQUEsQ0FBQTtXQURGLENBQUE7O0VBbUJBQyxRQUFBQSxTQUFTLENBQUMxTCxLQUFWLEVBQUEsQ0FBQTs7RUFDQXlMLFFBQUFBLFNBQVMsQ0FBQ254QyxLQUFWLENBQWdCNFYsT0FBaEIsR0FBMEIsRUFBMUIsQ0FBQTs7RUFFQSxRQUFBLElBQU1wQyxRQUFRLEdBQUd2YyxPQUFPLENBQUN1YyxRQUFSLElBQW9CLE1BQUksQ0FBQ3lpQixnQkFBTCxDQUFzQjNCLFdBQXRCLENBQWtDcjlCLE9BQWxDLENBQXJDLENBQUE7O1VBQ0F1YyxRQUFRLENBQUNta0MsR0FBVCxDQUFhLE1BQUksQ0FBQ2xsQyxLQUFMLENBQVdwYyxNQUFNLEdBQUcsQ0FBcEIsQ0FBYixFQUFxQyxNQUFJLENBQUNvYyxLQUFMLENBQVdwYyxNQUFNLEdBQUcsQ0FBcEIsQ0FBckMsRUFBNkR5akIsSUFBN0QsQ0FBQSxDQUFBO1NBakNLLENBQUEsQ0FrQ0puSCxLQWxDSSxDQWtDRSxZQUFBO0VBQUEsUUFBQSxPQUFNLE1BQUksQ0FBQ21qQyxVQUFMLEdBQWtCLEtBQXhCLENBQUE7RUFBQSxPQWxDRixDQUFQLENBQUE7RUFtQ0QsS0FBQTtFQUdEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLFFBQUEsQ0FBUzlyQyxJQUFULEVBQTZCO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQUEsSUFBZC9TLE9BQWMsdUVBQUosRUFBSSxDQUFBOztFQUFBLE1BQUEsSUFBQSxzQkFBQSxHQUNSLEtBQUtrZ0Qsc0JBQUwsQ0FBNEJudEMsSUFBNUIsRUFBa0MvUyxPQUFsQyxDQURRLENBQUE7O0VBQ3pCK1MsTUFBQUEsSUFEeUIsMEJBQ3pCQSxJQUR5QixDQUFBO0VBQ25CL1MsTUFBQUEsT0FEbUIsMEJBQ25CQSxPQURtQixDQUFBOztFQUczQixNQUFBLElBQU1rTCxPQUFPLEdBQUcsU0FBVkEsT0FBVSxDQUFBNnRCLFdBQVcsRUFBSTtVQUM3QjRsQixpQkFBaUIsQ0FBQzVsQixXQUFELENBQWpCLENBQUE7O0VBQ0EsUUFBQSxNQUFJLENBQUNpbUIsUUFBTCxDQUFjbCtDLEdBQWQsQ0FBa0JpNEIsV0FBbEIsRUFBK0JobUIsSUFBL0IsQ0FBQSxDQUFBOztFQUNBZ21CLFFBQUFBLFdBQVcsR0FBR3B3QixNQUFJLENBQUNzSixNQUFMLENBQVk4bUIsV0FBWixFQUF5QjtZQUNyQ2o3QixJQUFJLEVBQUVrQyxPQUFPLENBQUNsQyxJQUFBQTtFQUR1QixTQUF6QixDQUFkLENBQUE7RUFHQWk3QixRQUFBQSxXQUFXLENBQUNod0IsS0FBWixDQUFrQmtwQyxVQUFsQixHQUErQixRQUEvQixDQUFBO1NBTkYsQ0FBQTs7UUFTQSxJQUFJanlDLE9BQU8sQ0FBQzJnRCxRQUFaLEVBQXNCO0VBQ3BCLFFBQUEsT0FBTyxJQUFLQyxDQUFBQSxTQUFMLENBQWU1Z0QsT0FBZixFQUF3QixZQUFBO0VBQUEsVUFBQSxPQUFNLElBQUk4VixPQUFKLENBQVksVUFBQUMsT0FBTyxFQUFJO2NBQzFEMGpCLGlCQUFpQixDQUFDb25CLElBQWxCLENBQXVCO2dCQUFDOXRDLElBQUksRUFBRS9TLE9BQU8sQ0FBQzJnRCxRQUFmO0VBQXlCNXpDLGNBQUFBLE1BQU0sRUFBRSxNQUFqQztnQkFBdUM4VCxNQUFNLEVBQUU3Z0IsT0FBTyxDQUFDbEMsSUFBQUE7ZUFBOUUsRUFBcUYsVUFBQWk3QixXQUFXLEVBQUk7Z0JBQ2xHN3RCLE9BQU8sQ0FBQzZ0QixXQUFELENBQVAsQ0FBQTtnQkFDQWhqQixPQUFPLEVBQUEsQ0FBQTtlQUZULENBQUEsQ0FBQTtFQUlELFdBTG9DLENBQU4sQ0FBQTtFQUFBLFNBQXhCLENBQVAsQ0FBQTtFQU1ELE9BQUE7O0VBRUQsTUFBQSxPQUFPLElBQUs2cUMsQ0FBQUEsU0FBTCxDQUFlNWdELE9BQWYsRUFBd0IsWUFBQTtFQUFBLFFBQUEsT0FBTSxJQUFJOFYsT0FBSixDQUFZLFVBQUFDLE9BQU8sRUFBSTtFQUMxRCxVQUFBLE1BQUksQ0FBQ2dwQyxXQUFMLENBQWlCOEIsSUFBakIsQ0FBc0I7RUFBQzl0QyxZQUFBQSxJQUFJLEVBQUpBLElBQUQ7RUFBT2hHLFlBQUFBLE1BQU0sRUFBRSxNQUFmO2NBQXFCOFQsTUFBTSxFQUFFN2dCLE9BQU8sQ0FBQ2xDLElBQUFBO2FBQTNELEVBQWtFLFVBQUFpN0IsV0FBVyxFQUFJO2NBQy9FN3RCLE9BQU8sQ0FBQzZ0QixXQUFELENBQVAsQ0FBQTtjQUNBaGpCLE9BQU8sRUFBQSxDQUFBO2FBRlQsRUFHRyxVQUFBakksS0FBSyxFQUFJO2NBQ1YsTUFBSSxDQUFDK3dDLFVBQUwsR0FBa0IsS0FBbEIsQ0FBQTtFQUNBLFlBQUEsTUFBTS93QyxLQUFOLENBQUE7YUFMRixDQUFBLENBQUE7RUFPRCxTQVJvQyxDQUFOLENBQUE7RUFBQSxPQUF4QixDQUFQLENBQUE7RUFTRCxLQUFBOzs7YUFFRCxTQUEwRCxTQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFBQSxJQUFoRDlOLE9BQWdELHVFQUF0QyxFQUFzQyxDQUFBO0VBQUEsTUFBQSxJQUFsQ2lnRCxNQUFrQyxHQUF6QixTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxZQUFBO1VBQUEsT0FBTW5xQyxPQUFPLENBQUNDLE9BQVIsRUFBTixDQUFBO1NBQXlCLENBQUE7O1FBQ3hELElBQUksSUFBQSxDQUFLOG9DLFVBQVQsRUFBcUI7RUFDbkIsUUFBQSxPQUFPL29DLE9BQU8sQ0FBQ0UsTUFBUixDQUFlLDhCQUFmLENBQVAsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBSSxJQUFBLENBQUs4cUMsaUJBQUwsRUFBSixFQUE4QjtFQUM1QixRQUFBLE9BQU9ockMsT0FBTyxDQUFDRSxNQUFSLENBQWUsNEJBQWYsQ0FBUCxDQUFBO0VBQ0QsT0FBQTs7UUFFRCxJQUFLNm9DLENBQUFBLFVBQUwsR0FBa0IsSUFBbEIsQ0FBQTtRQUVBLElBQU1saUMsZ0JBQWdCLEdBQUcsSUFBQSxDQUFLQSxnQkFBOUIsQ0FBQTtRQUNBM2MsT0FBTyxHQUFHMkksTUFBSSxDQUFDc0osTUFBTCxDQUFZLEVBQVosRUFBZ0IsSUFBS2pTLENBQUFBLE9BQUwsSUFBZ0IsRUFBaEMsRUFBb0M7RUFBQzJjLFFBQUFBLGdCQUFnQixFQUFoQkEsZ0JBQUFBO1NBQXJDLEVBQXdEM2MsT0FBeEQsQ0FBVixDQUFBOztRQUVBLElBQU11YyxRQUFRLEdBQUcsSUFBS3lpQixDQUFBQSxnQkFBTCxDQUFzQjNCLFdBQXRCLENBQWtDcjlCLE9BQWxDLENBQWpCLENBQUE7O0VBRUEsTUFBQSxPQUFPaWdELE1BQU0sRUFBQSxDQUFHbHRCLElBQVQsQ0FBYyxZQUFNO0VBQ3pCLFFBQUEsSUFBTWd1QixVQUFVLEdBQUcsTUFBSSxDQUFDdmxDLEtBQUwsQ0FBV3BjLE1BQTlCLENBQUE7VUFFQSxJQUFNODZDLFNBQVMsR0FBSSxNQUFJLENBQUMxK0IsS0FBTCxDQUFXdWxDLFVBQVUsR0FBRyxDQUF4QixDQUFuQixDQUFBO0VBQ0EsUUFBQSxJQUFNNUcsU0FBUyxHQUFHbjZDLE9BQU8sQ0FBQ202QyxTQUFSLElBQXFCLE1BQUksQ0FBQzMrQixLQUFMLENBQVd1bEMsVUFBVSxHQUFHLENBQXhCLENBQXZDLENBQUE7VUFFQXBDLGlCQUFpQixDQUFDekUsU0FBRCxDQUFqQixDQUFBO0VBRUFBLFFBQUFBLFNBQVMsQ0FBQ3VHLGdCQUFWLENBQTJCTSxVQUFVLElBQUkvZ0QsT0FBTyxDQUFDZ2hELFlBQVIsR0FBdUIsQ0FBdkIsR0FBMkIsQ0FBL0IsQ0FBckMsQ0FBQSxDQUFBO0VBRUE5RyxRQUFBQSxTQUFTLENBQUN5RixhQUFWLEdBQTBCaDNDLE1BQUksQ0FBQ3NKLE1BQUwsQ0FBWSxFQUFaLEVBQWdCaW9DLFNBQVMsQ0FBQ3lGLGFBQVYsSUFBMkIsRUFBM0MsRUFBK0MzL0MsT0FBTyxJQUFJLEVBQTFELENBQTFCLENBQUE7VUFDQWs2QyxTQUFTLENBQUNwOEMsSUFBVixHQUFpQjZLLE1BQUksQ0FBQ3NKLE1BQUwsQ0FBWSxFQUFaLEVBQWdCaW9DLFNBQVMsQ0FBQ3A4QyxJQUFWLElBQWtCLEVBQWxDLEVBQXNDa0MsT0FBTyxDQUFDbEMsSUFBUixJQUFnQixFQUF0RCxDQUFqQixDQUFBO1VBQ0FvOEMsU0FBUyxDQUFDb0csTUFBVixHQUFtQnBHLFNBQVMsQ0FBQ29HLE1BQVYsSUFBb0J0Z0QsT0FBTyxDQUFDc2dELE1BQS9DLENBQUE7RUFFQSxRQUFBLE9BQU8sSUFBSXhxQyxPQUFKLENBQVksVUFBQUMsT0FBTyxFQUFJO0VBQzVCLFVBQUEsSUFBTThNLElBQUksR0FBRyxTQUFQQSxJQUFPLEdBQU07Y0FDakIsTUFBSSxDQUFDZzhCLFVBQUwsR0FBa0IsS0FBbEIsQ0FBQTtFQUVBNytDLFlBQUFBLE9BQU8sQ0FBQyswQixJQUFSLEtBQWlCLEtBQWpCLElBQTBCMTNCLFlBQVksQ0FBQyxZQUFBO2dCQUFBLE9BQU02OEMsU0FBUyxDQUFDeEwsS0FBVixFQUFOLENBQUE7RUFBQSxhQUFELENBQXRDLENBQUE7RUFDQS9sQyxZQUFBQSxNQUFJLENBQUN3SyxtQkFBTCxDQUF5QixNQUF6QixFQUErQixVQUEvQixFQUEyQztFQUFDZ25DLGNBQUFBLFNBQVMsRUFBVEEsU0FBRDtFQUFZRCxjQUFBQSxTQUFTLEVBQVRBLFNBQVo7RUFBdUI3L0MsY0FBQUEsU0FBUyxFQUFFLE1BQUE7ZUFBN0UsQ0FBQSxDQUFBOztFQUVBLFlBQUEsSUFBSTgvQyxTQUFKLEVBQWU7RUFDYkEsY0FBQUEsU0FBUyxDQUFDcHhDLEtBQVYsQ0FBZ0I0VixPQUFoQixHQUEwQixNQUExQixDQUFBO0VBQ0QsYUFBQTs7Y0FFRDNlLE9BQU8sQ0FBQ0gsUUFBUixJQUFvQkcsT0FBTyxDQUFDSCxRQUFSLENBQWlCcTZDLFNBQWpCLENBQXBCLENBQUE7Y0FFQW5rQyxPQUFPLENBQUNta0MsU0FBRCxDQUFQLENBQUE7YUFaRixDQUFBOztFQWVBQSxVQUFBQSxTQUFTLENBQUNueEMsS0FBVixDQUFnQmtwQyxVQUFoQixHQUE2QixFQUE3QixDQUFBOztFQUNBLFVBQUEsSUFBSWtJLFNBQUosRUFBZTtFQUNiQSxZQUFBQSxTQUFTLENBQUMxTCxLQUFWLEVBQUEsQ0FBQTs7RUFDQWx5QixZQUFBQSxRQUFRLENBQUNyZSxJQUFULENBQWNnOEMsU0FBZCxFQUF5QkMsU0FBekIsRUFBb0N0M0IsSUFBcEMsQ0FBQSxDQUFBO0VBQ0QsV0FIRCxNQUdPO2NBQ0xBLElBQUksRUFBQSxDQUFBO0VBQ0wsV0FBQTtFQUNGLFNBdkJNLENBQVAsQ0FBQTtFQXdCRCxPQXRDTSxDQXNDSm5ILENBQUFBLEtBdENJLENBc0NFLFVBQUM1TixLQUFELEVBQVc7VUFDbEIsTUFBSSxDQUFDK3dDLFVBQUwsR0FBa0IsS0FBbEIsQ0FBQTtFQUNBLFFBQUEsTUFBTS93QyxLQUFOLENBQUE7RUFDRCxPQXpDTSxDQUFQLENBQUE7RUEwQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O0VBQ0UsSUFBQSxLQUFBLEVBQUEsU0FBQSxXQUFBLENBQVlpRixJQUFaLEVBQWdDO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQUEsSUFBZC9TLE9BQWMsdUVBQUosRUFBSSxDQUFBO1FBQzlCLE9BQU8sSUFBQSxDQUFLKy9DLFFBQUwsQ0FBY2h0QyxJQUFkLEVBQW9CL1MsT0FBcEIsQ0FBQSxDQUNKK3lCLElBREksQ0FDQyxVQUFBa3VCLGFBQWEsRUFBSTtFQUNyQixRQUFBLElBQUksTUFBSSxDQUFDemxDLEtBQUwsQ0FBV3BjLE1BQVgsR0FBb0IsQ0FBeEIsRUFBMkI7RUFDekIsVUFBQSxNQUFJLENBQUMyL0MsV0FBTCxDQUFpQnVCLE1BQWpCLENBQXdCLE1BQUksQ0FBQzlrQyxLQUFMLENBQVcsTUFBSSxDQUFDQSxLQUFMLENBQVdwYyxNQUFYLEdBQW9CLENBQS9CLENBQXhCLENBQUEsQ0FBQTtFQUNELFNBQUE7O0VBQ0QsUUFBQSxNQUFJLENBQUM0Z0QseUJBQUwsRUFBQSxDQUFBOztFQUVBLFFBQUEsT0FBT2xxQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JrckMsYUFBaEIsQ0FBUCxDQUFBO0VBQ0QsT0FSSSxDQUFQLENBQUE7RUFTRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUFXNXpDLFVBQUFBLENBQUFBLEtBQVgsRUFBa0IwRixJQUFsQixFQUFzQztFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUFBLElBQWQvUyxPQUFjLHVFQUFKLEVBQUksQ0FBQTs7RUFBQSxNQUFBLElBQUEsc0JBQUEsR0FDakIsS0FBS2tnRCxzQkFBTCxDQUE0Qm50QyxJQUE1QixFQUFrQy9TLE9BQWxDLENBRGlCLENBQUE7O0VBQ2xDK1MsTUFBQUEsSUFEa0MsMEJBQ2xDQSxJQURrQyxDQUFBO0VBQzVCL1MsTUFBQUEsT0FENEIsMEJBQzVCQSxPQUQ0QixDQUFBO0VBRXBDcU4sTUFBQUEsS0FBSyxHQUFHLElBQUEsQ0FBSzZ6QyxlQUFMLENBQXFCN3pDLEtBQXJCLENBQVIsQ0FBQTs7RUFFQSxNQUFBLElBQUlBLEtBQUssSUFBSSxJQUFBLENBQUttTyxLQUFMLENBQVdwYyxNQUF4QixFQUFnQztFQUM5QixRQUFBLE9BQU8sS0FBSzJnRCxRQUFMLENBQWNodEMsSUFBZCxFQUFvQi9TLE9BQXBCLENBQVAsQ0FBQTtFQUNELE9BQUE7O0VBRUQrUyxNQUFBQSxJQUFJLEdBQUcsT0FBTy9TLE9BQU8sQ0FBQzJnRCxRQUFmLEtBQTRCLFFBQTVCLEdBQXVDM2dELE9BQU8sQ0FBQzJnRCxRQUEvQyxHQUEwRDV0QyxJQUFqRSxDQUFBO0VBQ0EsTUFBQSxJQUFNb21CLE1BQU0sR0FBRyxPQUFPbjVCLE9BQU8sQ0FBQzJnRCxRQUFmLEtBQTRCLFFBQTVCLEdBQXVDbG5CLGlCQUF2QyxHQUEyRCxJQUFBLENBQUtzbEIsV0FBL0UsQ0FBQTtFQUVBLE1BQUEsT0FBTyxJQUFJanBDLE9BQUosQ0FBWSxVQUFBQyxPQUFPLEVBQUk7VUFDNUJvakIsTUFBTSxDQUFDMG5CLElBQVAsQ0FBWTtFQUFDOXRDLFVBQUFBLElBQUksRUFBSkEsSUFBRDtFQUFPaEcsVUFBQUEsTUFBTSxFQUFFLE1BQUE7V0FBM0IsRUFBa0MsVUFBQWdzQixXQUFXLEVBQUk7WUFDL0M0bEIsaUJBQWlCLENBQUM1bEIsV0FBRCxDQUFqQixDQUFBOztFQUNBLFVBQUEsTUFBSSxDQUFDaW1CLFFBQUwsQ0FBY2wrQyxHQUFkLENBQWtCaTRCLFdBQWxCLEVBQStCaG1CLElBQS9CLENBQUEsQ0FBQTs7RUFDQWdtQixVQUFBQSxXQUFXLEdBQUdwd0IsTUFBSSxDQUFDc0osTUFBTCxDQUFZOG1CLFdBQVosRUFBeUI7Y0FDckNqN0IsSUFBSSxFQUFFa0MsT0FBTyxDQUFDbEMsSUFEdUI7RUFFckM2aEQsWUFBQUEsYUFBYSxFQUFFMy9DLE9BQUFBO0VBRnNCLFdBQXpCLENBQWQsQ0FBQTtFQUtBQSxVQUFBQSxPQUFPLENBQUMyYyxnQkFBUixHQUEyQmhVLE1BQUksQ0FBQ3NKLE1BQUwsQ0FDekIsRUFEeUIsRUFFekIsTUFBSSxDQUFDMEssZ0JBRm9CLEVBR3pCM2MsT0FBTyxDQUFDMmMsZ0JBQVIsSUFBNEIsRUFISCxDQUEzQixDQUFBO0VBTUFvYyxVQUFBQSxXQUFXLENBQUNod0IsS0FBWixDQUFrQjRWLE9BQWxCLEdBQTRCLE1BQTVCLENBQUE7O1lBQ0EsTUFBSSxDQUFDdEosWUFBTCxDQUFrQjBqQixXQUFsQixFQUErQixNQUFJLENBQUN2ZCxLQUFMLENBQVduTyxLQUFYLENBQS9CLENBQUEsQ0FBQTs7RUFDQSxVQUFBLE1BQUksQ0FBQ3dGLE9BQUwsQ0FBYTR0QyxnQkFBYixDQUE4QixJQUE5QixDQUFBLENBQUE7O0VBRUFuakQsVUFBQUEsVUFBVSxDQUFDLFlBQU07RUFDZnk3QixZQUFBQSxXQUFXLEdBQUcsSUFBZCxDQUFBO0VBQ0FoakIsWUFBQUEsT0FBTyxDQUFDLE1BQUksQ0FBQ3lGLEtBQUwsQ0FBV25PLEtBQVgsQ0FBRCxDQUFQLENBQUE7YUFGUSxFQUdQLElBQU8sR0FBQSxFQUhBLENBQVYsQ0FBQTtXQWxCRixDQUFBLENBQUE7RUF1QkQsT0F4Qk0sQ0FBUCxDQUFBO0VBeUJELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsVUFBQSxDQUFXQSxLQUFYLEVBQWdDO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQUEsSUFBZHJOLE9BQWMsdUVBQUosRUFBSSxDQUFBO0VBQzlCcU4sTUFBQUEsS0FBSyxHQUFHLElBQUEsQ0FBSzZ6QyxlQUFMLENBQXFCN3pDLEtBQXJCLENBQVIsQ0FBQTs7UUFFQSxJQUFJQSxLQUFLLEdBQUcsSUFBS21PLENBQUFBLEtBQUwsQ0FBV3BjLE1BQVgsR0FBb0IsQ0FBaEMsRUFBbUM7RUFDakMsUUFBQSxPQUFPLElBQUkwVyxPQUFKLENBQVksVUFBQUMsT0FBTyxFQUFJO0VBQzVCLFVBQUEsSUFBTW9rQyxTQUFTLEdBQUcsTUFBSSxDQUFDMytCLEtBQUwsQ0FBV25PLEtBQVgsQ0FBbEIsQ0FBQTtFQUNBLFVBQUEsSUFBTTZzQyxTQUFTLEdBQUcsTUFBSSxDQUFDcm5DLE9BQXZCLENBQUE7O0VBRUEsVUFBQSxNQUFJLENBQUNtc0MsUUFBTCxDQUFjcnNCLE1BQWQsQ0FBcUJ3bkIsU0FBckIsQ0FBQSxDQUFBOztFQUNBLFVBQUEsTUFBSSxDQUFDNEUsV0FBTCxDQUFpQnVCLE1BQWpCLENBQXdCbkcsU0FBeEIsQ0FBQSxDQUFBOztFQUNBLFVBQUEsSUFBSSxNQUFJLENBQUMzK0IsS0FBTCxDQUFXcGMsTUFBWCxLQUFzQixDQUExQixFQUE2QjtFQUFFO0VBQzdCLFlBQUEsTUFBSSxDQUFDeVQsT0FBTCxDQUFhNHRDLGdCQUFiLENBQThCLEtBQTlCLENBQUEsQ0FBQTtFQUNELFdBQUE7O1lBRUQxcUMsT0FBTyxDQUFDbWtDLFNBQUQsQ0FBUCxDQUFBO0VBQ0QsU0FYTSxDQUFQLENBQUE7RUFZRCxPQWJELE1BYU87RUFDTCxRQUFBLE9BQU8sSUFBS3ZVLENBQUFBLE9BQUwsQ0FBYTNsQyxPQUFiLENBQVAsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLFdBQUEsQ0FBWStTLElBQVosRUFBZ0M7RUFBQSxNQUFBLElBQUEsT0FBQSxHQUFBLElBQUEsQ0FBQTs7UUFBQSxJQUFkL1MsT0FBYyx1RUFBSixFQUFJLENBQUE7O0VBQUEsTUFBQSxJQUFBLHNCQUFBLEdBQ1gsS0FBS2tnRCxzQkFBTCxDQUE0Qm50QyxJQUE1QixFQUFrQy9TLE9BQWxDLENBRFcsQ0FBQTs7RUFDNUIrUyxNQUFBQSxJQUQ0QiwwQkFDNUJBLElBRDRCLENBQUE7RUFDdEIvUyxNQUFBQSxPQURzQiwwQkFDdEJBLE9BRHNCLENBQUE7O0VBRzlCLE1BQUEsSUFBSSxDQUFDQSxPQUFPLENBQUN1YyxRQUFULElBQXFCLENBQUN2YyxPQUFPLENBQUN3YyxTQUE5QixJQUEyQyxDQUFDeGMsT0FBTyxDQUFDMGdELEdBQXhELEVBQTZEO1VBQzNEMWdELE9BQU8sQ0FBQ3djLFNBQVIsR0FBb0IsTUFBcEIsQ0FBQTtFQUNELE9BQUE7O0VBRUQsTUFBQSxJQUFJLENBQUN4YyxPQUFPLENBQUMrUyxJQUFULElBQWlCLENBQUMvUyxPQUFPLENBQUMyZ0QsUUFBMUIsSUFBc0MsSUFBS2IsQ0FBQUEsY0FBTCxFQUExQyxFQUFpRTtFQUMvRC9zQyxRQUFBQSxJQUFJLEdBQUcvUyxPQUFPLENBQUMrUyxJQUFSLEdBQWUsSUFBQSxDQUFLK3NDLGNBQUwsRUFBdEIsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBSTkvQyxPQUFPLENBQUMwZ0QsR0FBWixFQUFpQjtFQUNmLFFBQUEsSUFBQSxDQUFLTixZQUFMLEVBQUEsQ0FBQTs7RUFDQSxRQUFBLE9BQU8sS0FBS2UsVUFBTCxDQUFnQixDQUFoQixFQUFtQnB1QyxJQUFuQixFQUF5QjtZQUFFalYsSUFBSSxFQUFFa0MsT0FBTyxDQUFDbEMsSUFBQUE7V0FBekMsQ0FBQSxDQUNKaTFCLElBREksQ0FDQyxZQUFBO0VBQUEsVUFBQSxPQUFNLE9BQUksQ0FBQzRTLE9BQUwsQ0FBYTNsQyxPQUFiLENBQU4sQ0FBQTtFQUFBLFNBREQsQ0FBUCxDQUFBO0VBRUQsT0FmNkI7OztFQWtCOUIsTUFBQSxJQUFNSCxRQUFRLEdBQUdHLE9BQU8sQ0FBQ0gsUUFBekIsQ0FBQTs7RUFDQUcsTUFBQUEsT0FBTyxDQUFDSCxRQUFSLEdBQW1CLFVBQUF1aEQsT0FBTyxFQUFJO0VBQzVCLFFBQUEsT0FBSSxDQUFDaEIsWUFBTCxFQUFBLENBQUE7O1VBQ0FnQixPQUFPLENBQUNYLGdCQUFSLENBQXlCLEtBQXpCLENBQUEsQ0FBQTtFQUNBNWdELFFBQUFBLFFBQVEsSUFBSUEsUUFBUSxDQUFDdWhELE9BQUQsQ0FBcEIsQ0FBQTtTQUhGLENBQUE7O0VBTUEsTUFBQSxPQUFPLEtBQUtyQixRQUFMLENBQWNodEMsSUFBZCxFQUFvQi9TLE9BQXBCLENBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsWUFBQSxDQUFhbzJCLElBQWIsRUFBaUM7UUFBQSxJQUFkcDJCLE9BQWMsdUVBQUosRUFBSSxDQUFBOztRQUMvQixJQUFJLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FBQSxDQUFxQnhFLE9BQXJCLENBQUEsT0FBQSxDQUFvQzQ2QixJQUFwQyxDQUFBLENBQUEsS0FBOEMsQ0FBQyxDQUFuRCxFQUFzRDtFQUNwRHp0QixRQUFBQSxNQUFJLENBQUNtSixLQUFMLENBQVcsb0ZBQUEsR0FBdUZza0IsSUFBbEcsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFDRCxNQUFBLElBQU0vb0IsS0FBSyxHQUFHLE9BQU8rb0IsSUFBUCxLQUFnQixRQUFoQixHQUEyQixJQUFBLENBQUs4cUIsZUFBTCxDQUFxQjlxQixJQUFyQixDQUEzQixHQUF3RCxLQUFLaXJCLGdCQUFMLENBQXNCanJCLElBQXRCLENBQXRFLENBQUE7RUFDQSxNQUFBLElBQU1yakIsSUFBSSxHQUFHLElBQUEsQ0FBS3lJLEtBQUwsQ0FBV25PLEtBQVgsQ0FBYixDQUFBOztRQUVBLElBQUlBLEtBQUssR0FBRyxDQUFaLEVBQWU7RUFDYixRQUFBLE9BQU8sS0FBSzB5QyxRQUFMLENBQWMzcEIsSUFBZCxFQUFvQnAyQixPQUFwQixDQUFQLENBQUE7RUFDRCxPQUFBOztFQVQ4QixNQUFBLElBQUEsc0JBQUEsR0FVbEIsS0FBS2tnRCxzQkFBTCxDQUE0Qm50QyxJQUE1QixFQUFrQy9TLE9BQWxDLENBVmtCLENBQUE7O0VBVTdCQSxNQUFBQSxPQVY2QiwwQkFVN0JBLE9BVjZCLENBQUE7O1FBWS9CLElBQUlxTixLQUFLLEtBQUssSUFBS21PLENBQUFBLEtBQUwsQ0FBV3BjLE1BQVgsR0FBb0IsQ0FBbEMsRUFBcUM7RUFDbkMsUUFBQSxPQUFPMFcsT0FBTyxDQUFDQyxPQUFSLENBQWdCaEQsSUFBaEIsQ0FBUCxDQUFBO0VBQ0QsT0FBQTs7UUFDRCxJQUFJLENBQUNBLElBQUwsRUFBVztFQUNUcEssUUFBQUEsTUFBSSxDQUFDbUosS0FBTCxDQUFXLHNCQUFBLEdBQXlCc2tCLElBQXBDLENBQUEsQ0FBQTtFQUNELE9BQUE7O1FBQ0QsSUFBSSxJQUFBLENBQUt5b0IsVUFBVCxFQUFxQjtFQUNuQixRQUFBLE9BQU8vb0MsT0FBTyxDQUFDRSxNQUFSLENBQWUsOEJBQWYsQ0FBUCxDQUFBO0VBQ0QsT0FBQTs7UUFDRCxJQUFJLElBQUEsQ0FBSzhxQyxpQkFBTCxFQUFKLEVBQThCO0VBQzVCLFFBQUEsT0FBT2hyQyxPQUFPLENBQUNFLE1BQVIsQ0FBZSw0QkFBZixDQUFQLENBQUE7RUFDRCxPQUFBOztFQUVEakQsTUFBQUEsSUFBSSxDQUFDaEssS0FBTCxDQUFXNFYsT0FBWCxHQUFxQixFQUFyQixDQUFBO0VBQ0E1TCxNQUFBQSxJQUFJLENBQUNoSyxLQUFMLENBQVdrcEMsVUFBWCxHQUF3QixRQUF4QixDQUFBO0VBQ0FsL0IsTUFBQUEsSUFBSSxDQUFDalQsVUFBTCxDQUFnQjZHLFdBQWhCLENBQTRCb00sSUFBNUIsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxPQUFPLElBQUs2dEMsQ0FBQUEsU0FBTCxDQUFlNWdELE9BQWYsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxzQkFBQSxDQUF1QitTLElBQXZCLEVBQTJDO1FBQUEsSUFBZC9TLE9BQWMsdUVBQUosRUFBSSxDQUFBOztFQUN6QyxNQUFBLElBQUksT0FBT0EsQ0FBQUEsT0FBUCxDQUFrQixJQUFBLFFBQXRCLEVBQWdDO0VBQzlCMkksUUFBQUEsTUFBSSxDQUFDbUosS0FBTCxDQUFXLDBDQUFBLEdBQTZDOVIsT0FBeEQsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQUksQ0FBQytTLElBQUksS0FBSyxJQUFULElBQWlCQSxJQUFJLEtBQUt4USxTQUEzQixLQUF5Q3ZDLE9BQU8sQ0FBQytTLElBQXJELEVBQTJEO1VBQ3pEQSxJQUFJLEdBQUcvUyxPQUFPLENBQUMrUyxJQUFmLENBQUE7RUFDRCxPQUFBOztFQUVEL1MsTUFBQUEsT0FBTyxHQUFHMkksTUFBSSxDQUFDc0osTUFBTCxDQUFZLEVBQVosRUFBZ0IsSUFBQSxDQUFLalMsT0FBTCxJQUFnQixFQUFoQyxFQUFvQ0EsT0FBcEMsRUFBNkM7RUFBQytTLFFBQUFBLElBQUksRUFBSkEsSUFBQUE7RUFBRCxPQUE3QyxDQUFWLENBQUE7UUFFQSxPQUFPO0VBQUNBLFFBQUFBLElBQUksRUFBSkEsSUFBRDtFQUFPL1MsUUFBQUEsT0FBTyxFQUFQQSxPQUFBQTtTQUFkLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFlBQUEsQ0FBYW1nRCxLQUFiLEVBQW9CO1FBQ2xCLElBQU0za0MsS0FBSyxHQUFHLElBQUEsQ0FBS0EsS0FBbkIsQ0FBQTtFQUNBLE1BQUEsSUFBSWpMLEtBQUssR0FBRzR2QyxLQUFLLEtBQUs1OUMsU0FBVixHQUFzQixDQUF0QixHQUEwQmlaLEtBQUssQ0FBQ3BjLE1BQU4sR0FBZStnRCxLQUFyRCxDQUFBO0VBQ0E1dkMsTUFBQUEsS0FBSyxHQUFHQSxLQUFLLEdBQUcsQ0FBUixHQUFZLENBQVosR0FBZ0JBLEtBQXhCLENBQUE7O0VBRUEsTUFBQSxLQUFLLElBQUl4UCxDQUFDLEdBQUd5YSxLQUFLLENBQUNwYyxNQUFOLEdBQWUsQ0FBNUIsRUFBK0IyQixDQUFDLElBQUl3UCxLQUFwQyxFQUEyQ3hQLENBQUMsRUFBNUMsRUFBZ0Q7RUFDOUMsUUFBQSxJQUFBLENBQUtpK0MsUUFBTCxDQUFjcnNCLE1BQWQsQ0FBcUJuWCxLQUFLLENBQUN6YSxDQUFELENBQTFCLENBQUEsQ0FBQTs7RUFDQSxRQUFBLElBQUEsQ0FBS2crQyxXQUFMLENBQWlCdUIsTUFBakIsQ0FBd0I5a0MsS0FBSyxDQUFDemEsQ0FBRCxDQUE3QixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBNEIseUJBQUEsR0FBQTtFQUMxQixNQUFBLElBQU1zTSxLQUFLLEdBQUcsSUFBQSxDQUFLbU8sS0FBTCxDQUFXcGMsTUFBWCxHQUFvQixDQUFsQyxDQUFBOztRQUNBLElBQUlpTyxLQUFLLElBQUksQ0FBYixFQUFnQjtVQUNkLElBQUttTyxDQUFBQSxLQUFMLENBQVduTyxLQUFYLENBQUEsQ0FBa0JvekMsZ0JBQWxCLENBQW1DcHpDLEtBQUssR0FBRyxDQUEzQyxDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxlQUFBLENBQWdCQSxLQUFoQixFQUF1QjtRQUNyQixPQUFPQSxLQUFLLElBQUksQ0FBVCxHQUFhQSxLQUFiLEdBQXFCM1AsSUFBSSxDQUFDNnFCLEdBQUwsQ0FBUyxLQUFLL00sS0FBTCxDQUFXcGMsTUFBWCxHQUFvQmlPLEtBQTdCLElBQXNDLElBQUttTyxDQUFBQSxLQUFMLENBQVdwYyxNQUE3RSxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxtQkFBQSxDQUFvQndHLEtBQXBCLEVBQTJCO0VBQ3pCLE1BQUEsSUFBSSxLQUFLNFYsS0FBTCxDQUFXcGMsTUFBWCxHQUFvQixDQUF4QixFQUEyQjtFQUN6QixRQUFBLElBQUEsQ0FBS3VtQyxPQUFMLEVBQUEsQ0FBQTtFQUNELE9BRkQsTUFFTztFQUNMLy9CLFFBQUFBLEtBQUssQ0FBQzJZLGlCQUFOLEVBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLGdCQUFBLENBQWlCK2lDLFFBQWpCLEVBQTJCO0VBQ3pCLE1BQUEsSUFBSWowQyxLQUFKLENBQUE7O0VBQ0EsTUFBQSxLQUFLQSxLQUFLLEdBQUcsSUFBS21PLENBQUFBLEtBQUwsQ0FBV3BjLE1BQVgsR0FBb0IsQ0FBakMsRUFBb0NpTyxLQUFLLElBQUksQ0FBN0MsRUFBZ0RBLEtBQUssRUFBckQsRUFBeUQ7RUFDdkQsUUFBQSxJQUFJaTBDLFFBQVEsS0FBSyxJQUFLdEMsQ0FBQUEsUUFBTCxDQUFjeC9DLEdBQWQsQ0FBa0IsSUFBQSxDQUFLZ2MsS0FBTCxDQUFXbk8sS0FBWCxDQUFsQixDQUFqQixFQUF1RDtFQUNyRCxVQUFBLE1BQUE7RUFDRCxTQUFBO0VBQ0YsT0FBQTs7RUFDRCxNQUFBLE9BQU9BLEtBQVAsQ0FBQTtFQUNELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsYUFBQSxDQUFjaEssSUFBZCxFQUErQjtRQUFBLElBQVh2RixJQUFXLHVFQUFKLEVBQUksQ0FBQTtRQUM3QixJQUFJeWpELFVBQVUsR0FBRyxLQUFqQixDQUFBO1FBRUE1NEMsTUFBSSxDQUFDd0ssbUJBQUwsQ0FBeUIsSUFBekIsRUFBK0IsS0FBUTlQLEdBQUFBLElBQXZDLEVBQTZDc0YsTUFBSSxDQUFDc0osTUFBTCxDQUFZO0VBQ3ZENVgsUUFBQUEsU0FBUyxFQUFFLElBRDRDO1VBRXZEbW5ELFdBQVcsRUFBRSxJQUFLaG1DLENBQUFBLEtBQUwsQ0FBVyxJQUFBLENBQUtBLEtBQUwsQ0FBV3BjLE1BQVgsR0FBb0IsQ0FBL0IsQ0FGMEM7RUFHdkRxaUQsUUFBQUEsTUFBTSxFQUFFLFNBQUEsTUFBQSxHQUFBO1lBQUEsT0FBTUYsVUFBVSxHQUFHLElBQW5CLENBQUE7RUFBQSxTQUFBO1NBSG1DLEVBSTFDempELElBSjBDLENBQTdDLENBQUEsQ0FBQTtFQU1BLE1BQUEsT0FBT3lqRCxVQUFQLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO0VBQ2xCLE1BQUEsT0FBTyxJQUFLRyxDQUFBQSxhQUFMLENBQW1CLE1BQW5CLENBQVAsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQW1CLGdCQUFBLEdBQUE7RUFDakIsTUFBQSxJQUFNbndDLENBQUMsR0FBRyxJQUFLaUssQ0FBQUEsS0FBTCxDQUFXcGMsTUFBckIsQ0FBQTtFQUNBLE1BQUEsT0FBTyxJQUFLc2lELENBQUFBLGFBQUwsQ0FBbUIsS0FBbkIsRUFBMEI7RUFDL0J2SCxRQUFBQSxTQUFTLEVBQUUsSUFBSzMrQixDQUFBQSxLQUFMLENBQVdqSyxDQUFDLEdBQUcsQ0FBZixDQURvQjtFQUUvQjJvQyxRQUFBQSxTQUFTLEVBQUUsSUFBSzErQixDQUFBQSxLQUFMLENBQVdqSyxDQUFDLEdBQUcsQ0FBZixDQUFBO0VBRm9CLE9BQTFCLENBQVAsQ0FBQTtFQUlEOzs7O0VBR0QsSUFBQSxLQUFBLEVBQUEsU0FBQSxrQkFBQSxDQUFtQm93QyxZQUFuQixFQUFpQztFQUMvQixNQUFBLElBQU01b0IsV0FBVyxHQUFHcHdCLE1BQUksQ0FBQ25DLGFBQUwsQ0FBbUJ5UCxVQUFRLENBQUM0RCxpQkFBVCxDQUEyQjhuQyxZQUEzQixDQUFuQixDQUFwQixDQUFBO1FBQ0FoRCxpQkFBaUIsQ0FBQzVsQixXQUFELENBQWpCLENBQUE7RUFDQSxNQUFBLE9BQU9BLFdBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQXlCLEdBQUEsR0FBQTtFQUN2QixNQUFBLE9BQU8sS0FBS29HLGtCQUFaLENBQUE7O0VBR0YsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQXVCdC9CLFFBQXZCLEVBQWlDO1FBQy9CLElBQUksSUFBQSxDQUFLcy9CLGtCQUFULEVBQTZCO1VBQzNCLElBQUtBLENBQUFBLGtCQUFMLENBQXdCaGhCLE9BQXhCLEVBQUEsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS2doQixDQUFBQSxrQkFBTCxHQUEwQjdmLDBCQUEwQixDQUFDVSxhQUEzQixDQUF5QyxJQUF6QyxFQUErQ25nQixRQUEvQyxDQUExQixDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0FDRSxTQUFjLEdBQUEsR0FBQTtRQUNaLElBQUk4TCxJQUFJLEdBQUcsSUFBQSxDQUFLaTJDLGdCQUFoQixDQUFBOztFQUNBLE1BQUEsT0FBT2oyQyxJQUFJLElBQUlBLElBQUksQ0FBQzFCLE9BQUwsS0FBaUIsVUFBaEMsRUFBNEM7VUFBRTBCLElBQUksR0FBR0EsSUFBSSxDQUFDNnpDLHNCQUFaLENBQUE7RUFBcUMsT0FBQTs7RUFDbkYsTUFBQSxPQUFPN3pDLElBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBQ0UsU0FBWSxHQUFBLEdBQUE7UUFDVixPQUFPaEQsTUFBSSxDQUFDd0osU0FBTCxDQUFlLElBQUEsQ0FBS25CLFFBQXBCLENBQ0pqSixDQUFBQSxNQURJLENBQ0csVUFBQWUsT0FBTyxFQUFBO0VBQUEsUUFBQSxPQUFJQSxPQUFPLENBQUNtQixPQUFSLEtBQW9CLFVBQXhCLENBQUE7RUFBQSxPQURWLENBQVAsQ0FBQTtFQUVELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQWMsR0FBQSxHQUFBO0VBQ1osTUFBQSxPQUFPLEtBQUtxMUMsUUFBWixDQUFBOztFQUdGLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFZN3FDLEtBQVosRUFBbUI7RUFDakIsTUFBQSxJQUFJQSxLQUFLLElBQUksRUFBRUEsS0FBSyxZQUFZN1AsUUFBbkIsQ0FBYixFQUEyQztVQUN6QytELE1BQUksQ0FBQ21KLEtBQUwsQ0FBVyw4QkFBWCxDQUFBLENBQUE7RUFDRCxPQUFBOztRQUNELElBQUt3dEMsQ0FBQUEsUUFBTCxHQUFnQjdxQyxLQUFoQixDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBRUUsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU8sS0FBSzR3QixRQUFaLENBQUE7O0VBRUYsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQVkzMkIsTUFBWixFQUFvQjtRQUNsQixJQUFLMjJCLENBQUFBLFFBQUwsR0FBZ0IzMkIsTUFBaEIsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQXVCLEdBQUEsR0FBQTtFQUNyQixNQUFBLE9BQU8sS0FBS3BILFlBQUwsQ0FBa0IsbUJBQWxCLENBQUEsR0FDTHFVLGVBQWUsQ0FBQzhqQiwyQkFBaEIsQ0FBNEMsSUFBQSxDQUFLLzFCLFlBQUwsQ0FBa0IsbUJBQWxCLENBQTVDLENBREssR0FDaUYsRUFEeEYsQ0FBQTs7RUFJRixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBcUIrSyxLQUFyQixFQUE0QjtFQUMxQixNQUFBLElBQUlBLEtBQUssS0FBS2xTLFNBQVYsSUFBdUJrUyxLQUFLLEtBQUssSUFBckMsRUFBMkM7VUFDekMsSUFBSzlLLENBQUFBLGVBQUwsQ0FBcUIsbUJBQXJCLENBQUEsQ0FBQTtFQUNELE9BRkQsTUFFTztVQUNMLElBQUtwQyxDQUFBQSxZQUFMLENBQWtCLG1CQUFsQixFQUF1Q2lMLElBQUksQ0FBQ2t0QixTQUFMLENBQWVqckIsS0FBZixDQUF2QyxDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O1dBS0QsU0FBaUIsR0FBQSxHQUFBO1FBQ2hCLE9BQU9qQyxJQUFJLENBQUMxRCxLQUFMLENBQVcsS0FBS3BGLFlBQUwsQ0FBa0IsYUFBbEIsQ0FBWCxDQUFQLENBQUE7O0VBSkQsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQWUrSyxLQUFmLEVBQXNCO1FBQ3BCLElBQUtsTixDQUFBQSxZQUFMLENBQWtCLGFBQWxCLEVBQWlDa04sS0FBSyxHQUFHLE1BQUgsR0FBWSxPQUFsRCxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFLRCxTQUFRLEtBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxPQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNOLElBQUtvckMsQ0FBQUEsTUFBTCxDQUFZOXNCLElBQVosQ0FBaUIsWUFBQTtVQUFBLE9BQU0sT0FBSSxDQUFDbGdCLE9BQUwsSUFBZ0IsT0FBSSxDQUFDQSxPQUFMLENBQWE2N0IsS0FBYixFQUF0QixDQUFBO1NBQWpCLENBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQVEsS0FBQSxHQUFBO0VBQ04sTUFBQSxJQUFBLENBQUs3N0IsT0FBTCxJQUFnQixJQUFBLENBQUtBLE9BQUwsQ0FBYTQ3QixLQUFiLEVBQWhCLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFXLFFBQUEsR0FBQTtFQUNULE1BQUEsS0FBSyxJQUFJMXRDLENBQUMsR0FBRyxJQUFLeWEsQ0FBQUEsS0FBTCxDQUFXcGMsTUFBWCxHQUFvQixDQUFqQyxFQUFvQzJCLENBQUMsSUFBSSxDQUF6QyxFQUE0Q0EsQ0FBQyxFQUE3QyxFQUFpRDtVQUMvQyxJQUFLZytDLENBQUFBLFdBQUwsQ0FBaUJ1QixNQUFqQixDQUF3QixLQUFLOWtDLEtBQUwsQ0FBV3phLENBQVgsQ0FBeEIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQUEsQ0FBS3lMLE1BQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBOzs7O1dBL3BCRSxTQUFnQyxHQUFBLEdBQUE7RUFDOUIsTUFBQSxPQUFPLENBQUMsV0FBRCxFQUFjLFdBQWQsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O2FBOHBCRCxTQUF3Qm5KLGdCQUFBQSxDQUFBQSxJQUF4QixFQUE4Qm9aLFFBQTlCLEVBQXdDO0VBQ3RDLE1BQUEsSUFBSSxFQUFFQSxRQUFRLENBQUN4Z0IsU0FBVCxZQUE4QmcrQyxpQkFBaEMsQ0FBSixFQUF3RDtVQUN0RHR4QyxNQUFJLENBQUM4TixhQUFMLENBQW1CLFdBQW5CLENBQUEsQ0FBQTtFQUNELE9BQUE7O0VBRUR3cEIsTUFBQUEsZUFBYSxDQUFDNThCLElBQUQsQ0FBYixHQUFzQm9aLFFBQXRCLENBQUE7RUFDRCxLQUFBOzs7V0FFRCxTQUF1QixHQUFBLEdBQUE7RUFDckIsTUFBQSxPQUFPd2pCLGVBQVAsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQStCLEdBQUEsR0FBQTtFQUM3QixNQUFBLE9BQU9nYSxpQkFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBb0IsR0FBQSxHQUFBO1FBQ2xCLE9BQU8sQ0FBQyxTQUFELEVBQVksVUFBWixFQUF3QixRQUF4QixFQUFrQyxTQUFsQyxFQUE2QyxPQUE3QyxDQUFQLENBQUE7RUFDRCxLQUFBOzs7V0FFRCxTQUF5QixHQUFBLEdBQUE7RUFDdkIsTUFBQSxPQUFPd0UsYUFBUCxDQUFBO0VBQ0QsS0FBQTs7OztJQWhnQzJDL2hCO0VBbWdDOUNwbEIsV0FBVyxDQUFDdXFDLFNBQVosR0FBd0JqRCxnQkFBeEIsQ0FBQTtFQUNBL2hELGNBQWMsQ0FBQ21nQyxNQUFmLENBQXNCLGVBQXRCLEVBQXVDNGhCLGdCQUF2QyxDQUFBOztFQzVsQ0EsSUFBTTFjLGtCQUFnQixHQUFHLFNBQXpCLENBQUE7RUFFQSxJQUFNejFCLFFBQU0sR0FBRztFQUNiLEVBQUEsRUFBQSxFQUFJLFlBRFM7RUFFYixFQUFBLGdCQUFBLEVBQWtCLGtCQUZMO0VBR2IsRUFBQSxrQkFBQSxFQUFvQixvQkFIUDtJQUliLGlCQUFtQixFQUFBLG1CQUFBO0VBSk4sQ0FBZixDQUFBO0VBT0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BRXFCcTFDOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUVFLFNBQWMsY0FBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsY0FBQSxDQUFBLENBQUE7O0VBQ1osSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTtNQUVBLEtBQUtwcUIsQ0FBQUEsUUFBTCxHQUFnQixJQUFoQixDQUFBO0VBRUE5RSxJQUFBQSxZQUFZLGdDQUFPLFlBQU07RUFDdkIsTUFBQSxLQUFBLENBQUt1TixRQUFMLEVBQUEsQ0FBQTtFQUNELEtBRlcsQ0FBWixDQUFBO0VBTFksSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQVFiLEdBQUE7Ozs7RUFNRCxJQUFBLEtBQUEsRUFBQSxTQUFBLHdCQUFBLENBQXlCOThCLElBQXpCLEVBQStCc0ksSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDO0VBQzVDLE1BQUEsUUFBUXZJLElBQVI7RUFDRSxRQUFBLEtBQUssT0FBTDtFQUNFc0YsVUFBQUEsTUFBSSxDQUFDcUwsWUFBTCxDQUFrQixJQUFsQixFQUF3Qmt1QixrQkFBeEIsRUFBMEN6MUIsUUFBMUMsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxVQUFMO1lBQ0VmLFlBQVksQ0FBQ20wQixpQkFBYixDQUErQmwwQixJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEMsSUFBOUMsRUFBb0RhLFFBQXBELENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTtFQU5KLE9BQUE7RUFRRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLGFBQUEsQ0FBY3dyQixPQUFkLEVBQXVCO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ3JCckYsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO1VBQ3ZCLE1BQUksQ0FBQzhFLFFBQUwsR0FBZ0JPLE9BQWhCLENBQUE7VUFFQSxNQUFJLENBQUNsdkIsS0FBTCxDQUFXNFYsT0FBWCxHQUFxQnNaLE9BQU8sR0FBRyxFQUFILEdBQVEsTUFBcEMsQ0FBQTs7VUFFQSxJQUFJLE1BQUksQ0FBQ240QixVQUFULEVBQXFCO1lBQ25CLElBQU1paUQsaUJBQWlCLEdBQUdwNUMsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLE1BQUksQ0FBQ3BRLFVBQXBCLEVBQWdDLG1CQUFoQyxDQUExQixDQUFBOztFQUNBLFVBQUEsSUFBSWlpRCxpQkFBSixFQUF1QjtjQUNyQkEsaUJBQWlCLENBQUNoNUMsS0FBbEIsQ0FBd0I0MEIsR0FBeEIsR0FBOEIxRixPQUFPLEdBQUcsSUFBSCxHQUFVLENBQS9DLENBQUE7RUFDRCxXQUFBOztZQUVELElBQU0rcEIsY0FBYyxHQUFHcjVDLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxNQUFJLENBQUNwUSxVQUFwQixFQUFnQyxnQkFBaEMsQ0FBdkIsQ0FBQTs7RUFDQSxVQUFBLElBQUlraUQsY0FBSixFQUFvQjtjQUNsQkEsY0FBYyxDQUFDajVDLEtBQWYsQ0FBcUI0MEIsR0FBckIsR0FBMkIxRixPQUFPLEdBQUcsSUFBSCxHQUFVLENBQTVDLENBQUE7RUFDRCxXQUFBO0VBQ0YsU0FBQTtFQUNGLE9BaEJXLENBQVosQ0FBQTtFQWlCRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUFPLElBQUEsR0FBQTtRQUNMLElBQUtncUIsQ0FBQUEsYUFBTCxDQUFtQixJQUFuQixDQUFBLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUFPLElBQUEsR0FBQTtRQUNMLElBQUtBLENBQUFBLGFBQUwsQ0FBbUIsS0FBbkIsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU8sS0FBS3ZxQixRQUFaLENBQUE7O0VBR0YsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQVlqakIsS0FBWixFQUFtQjtRQUNqQixJQUFLd3RDLENBQUFBLGFBQUwsQ0FBbUJ4dEMsS0FBbkIsQ0FBQSxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTs7OzthQUNFLFNBQThCLDJCQUFBLEdBQUE7RUFDNUIsTUFBQSxPQUFPLEtBQUt0TixhQUFMLENBQW1CLE9BQW5CLENBQStCOE8sSUFBQUEsVUFBUSxDQUFDMEQsV0FBL0MsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7Ozs7YUFDRSxTQUFnQyw2QkFBQSxHQUFBO0VBQzlCLE1BQUEsT0FBTyxLQUFLeFMsYUFBTCxDQUFtQixTQUFuQixDQUFpQzhPLElBQUFBLFVBQVEsQ0FBQzBELFdBQWpELENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBOzs7O2FBQ0UsU0FBK0IsNEJBQUEsR0FBQTtFQUM3QixNQUFBLE9BQU8sS0FBS3hTLGFBQUwsQ0FBbUIsUUFBbkIsQ0FBZ0M4TyxJQUFBQSxVQUFRLENBQUMwRCxXQUFoRCxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTs7OzthQUNFLFNBQW9DLGlDQUFBLEdBQUE7RUFDbEMsTUFBQSxPQUFPLEtBQUt4UyxhQUFMLENBQW1CLHFDQUFuQixDQUE2RDhPLElBQUFBLFVBQVEsQ0FBQzBELFdBQTdFLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBOzs7O2FBQ0UsU0FBbUMsZ0NBQUEsR0FBQTtFQUNqQyxNQUFBLE9BQU8sS0FBS3hTLGFBQUwsQ0FBbUIsb0NBQW5CLENBQTREOE8sSUFBQUEsVUFBUSxDQUFDMEQsV0FBNUUsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQVcsUUFBQSxHQUFBO1FBQ1R6TSxTQUFTLENBQUNoQyxPQUFWLENBQWtCLElBQWxCLENBQUEsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLaUIsU0FBTCxDQUFlSSxHQUFmLENBQW1CMjFCLGtCQUFuQixDQUFBLENBQUE7O0VBQ0EsTUFBQSxJQUFBLENBQUtnZ0IsMEJBQUwsRUFBQSxDQUFBOztFQUNBeDJDLE1BQUFBLFlBQVksQ0FBQzgwQixZQUFiLENBQTBCLElBQTFCLEVBQWdDL3pCLFFBQWhDLENBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQTZCLDBCQUFBLEdBQUE7RUFDM0IsTUFBQSxLQUFLLElBQUkxTCxDQUFDLEdBQUcsSUFBS29QLENBQUFBLFVBQUwsQ0FBZ0IvUSxNQUFoQixHQUF5QixDQUF0QyxFQUF5QzJCLENBQUMsSUFBSSxDQUE5QyxFQUFrREEsQ0FBQyxFQUFuRCxFQUF1RDtFQUNyRDtVQUNBLElBQUksSUFBQSxDQUFLb1AsVUFBTCxDQUFnQnBQLENBQWhCLEVBQW1CcVAsUUFBbkIsSUFBK0IsQ0FBbkMsRUFBc0M7RUFDcEMsVUFBQSxJQUFBLENBQUsxSixXQUFMLENBQWlCLElBQUEsQ0FBS3lKLFVBQUwsQ0FBZ0JwUCxDQUFoQixDQUFqQixDQUFBLENBQUE7RUFDRCxTQUFBO0VBQ0YsT0FBQTs7RUFFRCxNQUFBLElBQU02cUIsTUFBTSxHQUFHLElBQUEsQ0FBS3UyQixxQkFBTCxDQUEyQixRQUEzQixDQUFmLENBQUE7O0VBQ0F2MkIsTUFBQUEsTUFBTSxDQUFDemYsU0FBUCxDQUFpQkksR0FBakIsQ0FBcUIsZ0JBQXJCLENBQUEsQ0FBQTs7RUFFQSxNQUFBLElBQUksS0FBS3lFLFFBQUwsQ0FBYzVSLE1BQWQsS0FBeUIsQ0FBekIsSUFBOEIsQ0FBQyxJQUFBLENBQUs0UixRQUFMLENBQWMsQ0FBZCxFQUFpQjdFLFNBQWpCLENBQTJCd0UsUUFBM0IsQ0FBb0MsUUFBcEMsQ0FBbkMsRUFBa0Y7RUFDaEYsUUFBQSxJQUFNcU8sSUFBSSxHQUFHLElBQUEsQ0FBS21qQyxxQkFBTCxDQUEyQixNQUEzQixDQUFiLENBQUE7O0VBQ0EsUUFBQSxJQUFNbGpDLEtBQUssR0FBRyxJQUFBLENBQUtrakMscUJBQUwsQ0FBMkIsT0FBM0IsQ0FBZCxDQUFBOztVQUVBLElBQUksSUFBQSxDQUFLbnhDLFFBQUwsQ0FBYyxDQUFkLE1BQXFCZ08sSUFBckIsSUFBNkIsS0FBS2hPLFFBQUwsQ0FBYyxDQUFkLENBQXFCNGEsS0FBQUEsTUFBbEQsSUFBNEQsSUFBSzVhLENBQUFBLFFBQUwsQ0FBYyxDQUFkLENBQUEsS0FBcUJpTyxLQUFyRixFQUE0RjtZQUMxRixJQUFLdFksQ0FBQUEsV0FBTCxDQUFpQnFZLElBQWpCLENBQUEsQ0FBQTtZQUNBLElBQUtyWSxDQUFBQSxXQUFMLENBQWlCaWxCLE1BQWpCLENBQUEsQ0FBQTtZQUNBLElBQUtqbEIsQ0FBQUEsV0FBTCxDQUFpQnNZLEtBQWpCLENBQUEsQ0FBQTtFQUNELFNBQUE7RUFDRixPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxxQkFBQSxDQUFzQjViLElBQXRCLEVBQTRCO1FBQzFCLElBQUlzRixNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixZQUFBLEdBQWU3TSxJQUFwQyxDQUFKLEVBQStDO1VBQzdDLElBQU15RixRQUFPLEdBQUdILE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFmLEVBQXFCLFlBQWU3TSxHQUFBQSxJQUFwQyxDQUFoQixDQUFBOztFQUNBeUYsUUFBQUEsUUFBTyxDQUFDcUQsU0FBUixDQUFrQkksR0FBbEIsQ0FBc0JsSixJQUF0QixDQUFBLENBQUE7O0VBQ0EsUUFBQSxPQUFPeUYsUUFBUCxDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQU1BLE9BQU8sR0FBR0gsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsR0FBTTdNLEdBQUFBLElBQTNCLEtBQW9Dc0YsTUFBSSxDQUFDOEksTUFBTCxDQUFZLEdBQUEsR0FBTXBPLElBQWxCLENBQXBELENBQUE7RUFDQXlGLE1BQUFBLE9BQU8sQ0FBQ3FELFNBQVIsQ0FBa0JJLEdBQWxCLENBQXNCLGNBQWNsSixJQUFwQyxDQUFBLENBQUE7RUFFQSxNQUFBLE9BQU95RixPQUFQLENBQUE7RUFDRCxLQUFBOzs7V0F2SkQsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBTyxDQUFDLFVBQUQsRUFBYSxPQUFiLENBQVAsQ0FBQTtFQUNELEtBQUE7Ozs7SUFuRHlDNHpCO0FBMk01Qy96QixRQUFJLENBQUM0Tyx1QkFBTCxDQUE2QnVxQyxjQUE3QixFQUE2QyxDQUFDLFFBQUQsQ0FBN0MsQ0FBQSxDQUFBO0VBRUF4cUMsV0FBVyxDQUFDOHFDLE9BQVosR0FBc0JOLGNBQXRCLENBQUE7RUFDQWpsRCxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixhQUF0QixFQUFxQzhrQixjQUFyQyxDQUFBOztFQzVRQSxJQUFNNWYsa0JBQWdCLEdBQUcsTUFBekIsQ0FBQTtFQUNBLElBQU16MUIsUUFBTSxHQUFHO0VBQ2IsRUFBQSxFQUFBLEVBQUksU0FEUztFQUViLEVBQUEsZ0JBQUEsRUFBa0Isa0JBRkw7SUFHYixtQkFBcUIsRUFBQSxxQkFBQTtFQUhSLENBQWYsQ0FBQTtFQU1BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztNQUNxQjQxQzs7Ozs7RUFFbkI7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFFRSxTQUFjLFdBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLFdBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7O0VBRUEsSUFBQSxLQUFBLENBQUtDLFlBQUwsRUFBQSxDQUFBOztNQUVBLEtBQUtwZSxDQUFBQSxpQkFBTCxHQUF5QmhDLGtCQUF6QixDQUFBOztFQUNBLElBQUEsS0FBQSxDQUFLLzFCLFNBQUwsQ0FBZUksR0FBZixDQUFtQjIxQixrQkFBbkIsQ0FBQSxDQUFBOztNQUVBLEtBQUs0YyxDQUFBQSxZQUFMLEdBQW9CLEtBQXBCLENBQUE7RUFFQWxzQixJQUFBQSxZQUFZLGdDQUFPLFlBQU07RUFDdkIsTUFBQSxLQUFBLENBQUt1TixRQUFMLEVBQUEsQ0FBQTs7UUFFQSxLQUFLdmhCLENBQUFBLFFBQUwsR0FBZ0IsS0FBaEIsQ0FBQTtFQUNBLE1BQUEsS0FBQSxDQUFLM0wsZUFBTCxHQUF1QixLQUFLOHBDLENBQUFBLGtCQUFMLEVBQXZCLENBQUE7RUFDQSxNQUFBLEtBQUEsQ0FBS3dGLGtCQUFMLEdBQTBCLEtBQUt2RixDQUFBQSxxQkFBTCxFQUExQixDQUFBO0VBQ0QsS0FOVyxDQUFaLENBQUE7RUFWWSxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBaUJiLEdBQUE7Ozs7YUFFRCxTQUFXLFFBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNUOXZDLFNBQVMsQ0FBQ2hDLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBO1FBRUEsSUFBTXF3QyxPQUFPLEdBQUc1eUMsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsYUFBckIsQ0FBaEIsQ0FBQTtRQUVBLElBQU02ekIsVUFBVSxHQUFHcDdCLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFmLEVBQXFCLG1CQUFyQixDQUFBLElBQTZDdkgsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsYUFBckIsQ0FBN0MsSUFBb0ZwVyxRQUFRLENBQUMwTSxhQUFULENBQXVCLEtBQXZCLENBQXZHLENBQUE7RUFDQXU5QixNQUFBQSxVQUFVLENBQUM1M0IsU0FBWCxDQUFxQkksR0FBckIsQ0FBeUIsa0JBQXpCLENBQUEsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLOEksWUFBTCxDQUFrQjB1QixVQUFsQixFQUE4QixDQUFDd1gsT0FBRCxJQUFZLElBQUtqbUMsQ0FBQUEsVUFBakIsSUFBK0JpbUMsT0FBTyxJQUFJQSxPQUFPLENBQUM1NUMsV0FBaEYsQ0FBQSxDQUFBO1FBRUEsSUFBTXFRLE9BQU8sR0FBR3JKLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFmLEVBQXFCLGdCQUFyQixDQUFBLElBQTBDdkgsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsVUFBckIsQ0FBMUMsSUFBOEVwVyxRQUFRLENBQUMwTSxhQUFULENBQXVCLEtBQXZCLENBQTlGLENBQUE7RUFDQXdMLE1BQUFBLE9BQU8sQ0FBQzdGLFNBQVIsQ0FBa0JJLEdBQWxCLENBQXNCLGVBQXRCLENBQUEsQ0FBQTs7RUFDQSxNQUFBLElBQUksQ0FBQ3lGLE9BQU8sQ0FBQ3FDLGFBQWIsRUFBNEI7VUFDMUIxTCxNQUFJLENBQUN3SixTQUFMLENBQWUsSUFBS2hDLENBQUFBLFVBQXBCLEVBQWdDblMsT0FBaEMsQ0FBd0MsVUFBQVUsSUFBSSxFQUFJO0VBQzlDLFVBQUEsSUFBSUEsSUFBSSxDQUFDMFIsUUFBTCxLQUFrQixDQUFsQixJQUF1QixNQUFJLENBQUNveUMscUJBQUwsQ0FBMkI5akQsSUFBM0IsQ0FBM0IsRUFBNkQ7RUFDM0RzVCxZQUFBQSxPQUFPLENBQUNyTCxXQUFSLENBQW9CakksSUFBcEIsRUFEMkQ7RUFFNUQsV0FBQTtXQUhILENBQUEsQ0FBQTtFQUtELE9BQUE7O0VBRUQsTUFBQSxJQUFBLENBQUsrakQsbUJBQUwsQ0FBeUJ6d0MsT0FBekIsQ0FBQSxDQW5CUzs7O1FBb0JULElBQUtxRCxDQUFBQSxZQUFMLENBQWtCckQsT0FBbEIsRUFBMkIreEIsVUFBVSxDQUFDcGlDLFdBQXRDLEVBcEJTOztFQXNCVCxNQUFBLElBQUksQ0FBQyxDQUFDNDVDLE9BQUQsSUFBWSxDQUFDNXlDLE1BQUksQ0FBQ3VCLFdBQUwsQ0FBaUJxeEMsT0FBakIsRUFBMEIsYUFBMUIsQ0FBZCxLQUNDdnBDLE9BQU8sQ0FBQ2hCLFFBQVIsQ0FBaUI1UixNQUFqQixLQUE0QixDQUQ3QixJQUVDdUosTUFBSSxDQUFDdUksYUFBTCxDQUFtQmMsT0FBTyxDQUFDaEIsUUFBUixDQUFpQixDQUFqQixDQUFuQixDQUZMLEVBR0U7VUFDQSxJQUFLa3pCLENBQUFBLGlCQUFMLElBQTBCLGdCQUExQixDQUFBO1VBQ0EsSUFBS3pCLENBQUFBLHdCQUFMLENBQThCLE9BQTlCLENBQUEsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBTW9aLGFBQWEsR0FBR2x6QyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixvQkFBckIsQ0FBdEIsQ0FBQTs7RUFDQSxNQUFBLElBQUkyckMsYUFBSixFQUFtQjtVQUNqQixJQUFLM1gsQ0FBQUEsaUJBQUwsSUFBMEIsMkJBQTFCLENBQUE7VUFDQSxJQUFLekIsQ0FBQUEsd0JBQUwsQ0FBOEIsT0FBOUIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRC8yQixNQUFBQSxZQUFZLENBQUM4MEIsWUFBYixDQUEwQixJQUExQixFQUFnQy96QixRQUFoQyxDQUFBLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLHFCQUFBLENBQXNCK0MsRUFBdEIsRUFBMEI7UUFDeEIsSUFBSUEsRUFBRSxDQUFDckQsU0FBSCxDQUFhd0UsUUFBYixDQUFzQixrQkFBdEIsQ0FBSixFQUErQztFQUM3QyxRQUFBLE9BQU8sS0FBUCxDQUFBO0VBQ0QsT0FBQTs7RUFDRCxNQUFBLElBQU0xRyxPQUFPLEdBQUd1RixFQUFFLENBQUN2RixPQUFILENBQVd0USxXQUFYLEVBQWhCLENBQUE7O1FBQ0EsSUFBSXNRLE9BQU8sS0FBSyxTQUFoQixFQUEyQjtFQUN6QixRQUFBLE9BQU8sQ0FBQ3VGLEVBQUUsQ0FBQ2xJLFlBQUgsQ0FBZ0IsVUFBaEIsQ0FBUixDQUFBO0VBQ0QsT0FBQTs7UUFDRCxJQUFNbzdDLGFBQWEsR0FBRyxDQUFDLFFBQUQsRUFBVyxhQUFYLEVBQTBCLG9CQUExQixFQUFnRCxXQUFoRCxFQUE2RCxnQkFBN0QsRUFBK0UsWUFBL0UsRUFBNkYsa0JBQTdGLEVBQWlILGFBQWpILEVBQWdJLGtCQUFoSSxDQUF0QixDQUFBO0VBQ0EsTUFBQSxPQUFPbHpDLEVBQUUsQ0FBQ2xJLFlBQUgsQ0FBZ0IsUUFBaEIsQ0FBQSxJQUE2Qm83QyxhQUFhLENBQUNsbkQsT0FBZCxDQUFzQnlPLE9BQXRCLENBQUEsS0FBbUMsQ0FBQyxDQUF4RSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBb0QsbUJBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUFBLElBQWhDK0gsT0FBZ0MsR0FBdEIsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsSUFBQSxDQUFLaUIsZUFBaUIsQ0FBQTtRQUNsRGdELFVBQVEsQ0FBQ3dELGlCQUFULENBQTJCLFlBQU07RUFDL0I5USxRQUFBQSxNQUFJLENBQUM2TCxlQUFMLENBQXFCLE1BQXJCLEVBQTJCLGlCQUEzQixFQUNFLENBQUM3TCxNQUFJLENBQUNtRSxVQUFMLENBQWdCLE1BQWhCLEVBQXNCLFVBQUFqUCxDQUFDLEVBQUE7RUFBQSxVQUFBLE9BQUlBLENBQUMsQ0FBQ3lKLFlBQUYsQ0FBZSxpQkFBZixDQUFKLENBQUE7RUFBQSxTQUF2QixDQUFEO0VBQUEsWUFDSSxNQUFJLENBQUMwTCxrQkFBTCxDQUF3QmhCLE9BQXhCLENBQUEsSUFBb0MsQ0FBQ3JKLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZThCLE9BQWYsRUFBd0JySixNQUFJLENBQUN1SSxhQUE3QixDQUR6QyxDQURGO0VBQUEsU0FBQSxDQUFBO1NBREYsQ0FBQSxDQUFBO0VBTUQsS0FBQTs7O2FBRUQsU0FBbUQsa0JBQUEsR0FBQTtRQUFBLElBQWhDYyxPQUFnQyxHQUF0QixTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBQSxJQUFBLENBQUtpQixlQUFpQixDQUFBOztRQUNqRCxJQUFJdEssTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsYUFBckIsQ0FBSixFQUF5QztFQUN2QyxRQUFBLE9BQU8sSUFBUCxDQUFBO0VBQ0QsT0FBQTs7UUFFRCxPQUFPLENBQUMsQ0FBQ3ZILE1BQUksQ0FBQ3VILFNBQUwsQ0FBZThCLE9BQWYsRUFBd0IsVUFBQXhDLEVBQUUsRUFBSTtFQUNyQyxRQUFBLE9BQU83RyxNQUFJLENBQUN4TixLQUFMLENBQVdxVSxFQUFYLEVBQWUsYUFBZixDQUFpQyxJQUFBLENBQUNBLEVBQUUsQ0FBQ2xJLFlBQUgsQ0FBZ0IsUUFBaEIsQ0FBekMsQ0FBQTtFQUNELE9BRlEsQ0FBVCxDQUFBO0VBR0QsS0FBQTs7O2FBRUQsU0FBb0IsaUJBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNsQixNQUFBLElBQUksQ0FBQ3FCLE1BQUksQ0FBQzhILFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBTCxFQUE0QjtFQUFFO0VBQzVCLFFBQUEsT0FBQTtFQUNELE9BQUE7O1FBRURtaUIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO1VBQ3ZCLE1BQUksQ0FBQzZ2QixtQkFBTCxFQUFBLENBRHVCOzs7RUFHdkIsUUFBQSxJQUFJLE1BQUksQ0FBQ243QyxZQUFMLENBQWtCLG9CQUFsQixDQUFKLEVBQTZDO0VBQzNDLFVBQUEsTUFBSSxDQUFDbTdCLHdCQUFMLENBQThCLG9CQUE5QixFQUFvRCxJQUFwRCxFQUEwRCxNQUFJLENBQUMvNEIsWUFBTCxDQUFrQixvQkFBbEIsQ0FBMUQsQ0FBQSxDQUFBO0VBQ0QsU0FBQTs7RUFFRCxRQUFBLElBQUksQ0FBQyxNQUFJLENBQUNvMUMsWUFBVixFQUF3QjtZQUN0QixNQUFJLENBQUNBLFlBQUwsR0FBb0IsSUFBcEIsQ0FBQTtFQUVBemhELFVBQUFBLFlBQVksQ0FBQyxZQUFNO0VBQ2pCLFlBQUEsTUFBSSxDQUFDc2xELE1BQUwsSUFBZSxNQUFJLENBQUNBLE1BQUwsRUFBZixDQUFBO0VBQ0FoNkMsWUFBQUEsTUFBSSxDQUFDd0ssbUJBQUwsQ0FBeUIsTUFBekIsRUFBK0IsTUFBL0IsQ0FBQSxDQUFBO0VBQ0QsV0FIVyxDQUFaLENBQUE7O0VBS0EsVUFBQSxJQUFJLENBQUN4SyxNQUFJLENBQUNpSSx1QkFBTCxDQUE2QixNQUE3QixDQUFMLEVBQXlDO0VBQ3ZDdlQsWUFBQUEsWUFBWSxDQUFDLFlBQUE7Z0JBQUEsT0FBTSxNQUFJLENBQUNxeEMsS0FBTCxFQUFOLENBQUE7RUFBQSxhQUFELENBQVosQ0FBQTtFQUNELFdBQUE7RUFDRixTQUFBO0VBQ0YsT0FuQlcsQ0FBWixDQUFBO0VBb0JELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsZ0JBQUEsQ0FBaUIzWixJQUFqQixFQUF1QjtRQUNyQixJQUFJLElBQUEsQ0FBSzZ0QixVQUFULEVBQXFCO1VBQ25CN3RCLElBQUksR0FBRyxJQUFLNnRCLENBQUFBLFVBQUwsQ0FBZ0I3dEIsSUFBaEIsRUFBSCxHQUE0QixJQUFLNnRCLENBQUFBLFVBQUwsQ0FBZ0JsdUIsSUFBaEIsRUFBaEMsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7V0FNRCxTQUFXLEdBQUEsR0FBQTtFQUNULE1BQUEsT0FBTyxJQUFLaHJCLENBQUFBLFlBQUwsQ0FBa0IsTUFBbEIsQ0FBUCxDQUFBOztFQUxGLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFTaVgsR0FBVCxFQUFjO0VBQ1osTUFBQSxJQUFBLENBQUtwWixZQUFMLENBQWtCLE1BQWxCLEVBQTBCb1osR0FBMUIsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBTUQsU0FBaUIsR0FBQSxHQUFBO0VBQ2YsTUFBQSxPQUFPLElBQUt4WixDQUFBQSxhQUFMLENBQW1CLGlCQUFuQixDQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBa0JFLFNBQXVCLEdBQUEsR0FBQTtFQUNyQixNQUFBLE9BQU8sS0FBSzA3QyxpQkFBWixDQUFBOztFQWxCRixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBcUJwdUMsS0FBckIsRUFBNEI7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDMUIsTUFBQSxJQUFJQSxLQUFLLElBQUksRUFBRUEsS0FBSyxZQUFZN1AsUUFBbkIsQ0FBYixFQUEyQztVQUN6QytELE1BQUksQ0FBQ21KLEtBQUwsQ0FBVyw2Q0FBWCxDQUFBLENBQUE7RUFDRCxPQUFBOztRQUVEOGdCLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBTTtVQUN2QixJQUFJLENBQUNuZSxLQUFMLEVBQVk7WUFDVixNQUFJLENBQUN4QixlQUFMLENBQXFCaFEsbUJBQXJCLENBQXlDLFFBQXpDLEVBQW1ELE1BQUksQ0FBQzYvQyxjQUF4RCxDQUFBLENBQUE7RUFDRCxTQUZELE1BRU8sSUFBSSxDQUFDLE1BQUksQ0FBQ0QsaUJBQVYsRUFBNkI7WUFDbEMsTUFBSSxDQUFDRSxvQkFBTCxHQUE0QixHQUE1QixDQUFBO1lBQ0EsTUFBSSxDQUFDRCxjQUFMLEdBQXNCLE1BQUksQ0FBQ0UsU0FBTCxDQUFlbnVDLElBQWYsQ0FBb0IsTUFBcEIsQ0FBdEIsQ0FBQTtFQUNBeFgsVUFBQUEsWUFBWSxDQUFDLFlBQUE7Y0FBQSxPQUFNLE1BQUksQ0FBQzRWLGVBQUwsQ0FBcUJyVixnQkFBckIsQ0FBc0MsUUFBdEMsRUFBZ0QsTUFBSSxDQUFDa2xELGNBQXJELENBQU4sQ0FBQTtFQUFBLFdBQUQsQ0FBWixDQUFBO0VBQ0QsU0FBQTs7VUFDRCxNQUFJLENBQUNELGlCQUFMLEdBQXlCcHVDLEtBQXpCLENBQUE7RUFDRCxPQVRXLENBQVosQ0FBQTtFQVVELEtBQUE7OzthQU1ELFNBQVksU0FBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ1YsSUFBTWxILENBQUMsR0FBRyxJQUFBLENBQUswRixlQUFmO0VBQUEsVUFDRWd3QyxTQUFTLEdBQUcsQ0FBQzExQyxDQUFDLENBQUMrakMsU0FBRixHQUFjL2pDLENBQUMsQ0FBQ2t4QixZQUFqQixJQUFpQ2x4QixDQUFDLENBQUMyMUMsWUFBbkMsSUFBbUQsS0FBS0gsb0JBRHRFLENBQUE7O1FBR0EsSUFBSSxJQUFBLENBQUtGLGlCQUFMLElBQTBCLENBQUMsS0FBS00sZUFBaEMsSUFBbURGLFNBQXZELEVBQWtFO1VBQ2hFLElBQUtFLENBQUFBLGVBQUwsR0FBdUIsSUFBdkIsQ0FBQTs7RUFDQSxRQUFBLElBQUEsQ0FBS04saUJBQUwsQ0FBdUIsWUFBQTtFQUFBLFVBQUEsT0FBTSxNQUFJLENBQUNNLGVBQUwsR0FBdUIsS0FBN0IsQ0FBQTtXQUF2QixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBQ0UsU0FBeUIsR0FBQSxHQUFBO0VBQ3ZCLE1BQUEsT0FBTyxLQUFLaGtCLGtCQUFaLENBQUE7O0VBR0YsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQXVCdC9CLFFBQXZCLEVBQWlDO1FBQy9CLElBQUksSUFBQSxDQUFLcy9CLGtCQUFULEVBQTZCO1VBQzNCLElBQUtBLENBQUFBLGtCQUFMLENBQXdCaGhCLE9BQXhCLEVBQUEsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS2doQixDQUFBQSxrQkFBTCxHQUEwQjdmLDBCQUEwQixDQUFDVSxhQUEzQixDQUF5QyxJQUF6QyxFQUErQ25nQixRQUEvQyxDQUExQixDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBZ0IsR0FBQSxHQUFBO1FBQ2QsT0FBTyxJQUFBLENBQUtvVCxlQUFMLENBQXFCcStCLFNBQTVCLENBQUE7O0VBR0YsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQWNRLFFBQWQsRUFBd0I7RUFDdEIsTUFBQSxJQUFBLENBQUs3K0IsZUFBTCxDQUFxQnErQixTQUFyQixHQUFpQ1EsUUFBakMsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQXFCLGtCQUFBLEdBQUE7UUFDbkIsSUFBTWo0QyxNQUFNLEdBQUc4TyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixnQkFBckIsQ0FBZixDQUFBOztFQUNBLE1BQUEsSUFBSXJXLE1BQUosRUFBWTtFQUNWLFFBQUEsT0FBT0EsTUFBUCxDQUFBO0VBQ0QsT0FBQTs7UUFDRDhPLE1BQUksQ0FBQ21KLEtBQUwsQ0FBVyxzQ0FBWCxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF3QixxQkFBQSxHQUFBO1FBQ3RCLElBQU1qWSxNQUFNLEdBQUc4TyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixtQkFBckIsQ0FBZixDQUFBOztFQUNBLE1BQUEsSUFBSXJXLE1BQUosRUFBWTtFQUNWLFFBQUEsT0FBT0EsTUFBUCxDQUFBO0VBQ0QsT0FBQTs7UUFDRDhPLE1BQUksQ0FBQ21KLEtBQUwsQ0FBVyx5Q0FBWCxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUEyQix3QkFBQSxHQUFBO1FBQ3pCLE9BQU9uSixNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixvQkFBckIsQ0FBQSxJQUE4QytGLFVBQVEsQ0FBQzBELFdBQTlELENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFxQixrQkFBQSxHQUFBO0VBQ25CLE1BQUEsT0FBT2hSLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFmLEVBQXFCLGFBQXJCLENBQUEsSUFBdUNwVyxRQUFRLENBQUMwTSxhQUFULENBQXVCLGFBQXZCLENBQTlDLENBQUE7RUFDRCxLQUFBOzs7RUFNRCxJQUFBLEtBQUEsRUFBQSxTQUFBLHdCQUFBLENBQXlCbkQsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDNUMsTUFBQSxRQUFRdkksSUFBUjtFQUNFLFFBQUEsS0FBSyxPQUFMO1lBQ0VzRixNQUFJLENBQUNxTCxZQUFMLENBQWtCLElBQWxCLEVBQXdCLElBQUtrd0IsQ0FBQUEsaUJBQTdCLEVBQWdEejNCLFFBQWhELENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTs7RUFDRixRQUFBLEtBQUssVUFBTDtZQUNFZixZQUFZLENBQUNtMEIsaUJBQWIsQ0FBK0JsMEIsSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDLElBQTlDLEVBQW9EYSxRQUFwRCxDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLG9CQUFMO1lBQ0UsSUFBSWIsT0FBTyxLQUFLLElBQWhCLEVBQXNCO2NBQ3BCLElBQUt3M0MsQ0FBQUEsZ0JBQUwsR0FBd0IsSUFBeEIsQ0FBQTtFQUNELFdBRkQsTUFFTztFQUNMLFlBQUEsSUFBQSxDQUFLQSxnQkFBTCxHQUF3QixVQUFDdmdDLElBQUQsRUFBVTtFQUNoQyxjQUFBLElBQU03TixDQUFDLEdBQUdyTSxNQUFJLENBQUM4SixZQUFMLENBQWtCN0csT0FBbEIsQ0FBVixDQUFBO2dCQUNBLE1BQUksQ0FBQ3czQyxnQkFBTCxHQUF3QnB1QyxDQUF4QixDQUFBO2dCQUNBQSxDQUFDLENBQUM2TixJQUFELENBQUQsQ0FBQTtlQUhGLENBQUE7RUFLRCxXQUFBOztFQUNELFVBQUEsTUFBQTtFQWpCSixPQUFBO0VBbUJELEtBQUE7OzthQUVELFNBQVEsS0FBQSxHQUFBO1FBQ04sSUFBSSxDQUFDLElBQUtqRSxDQUFBQSxRQUFOLElBQWtCalcsTUFBSSxDQUFDOEgsVUFBTCxDQUFnQixJQUFoQixDQUF0QixFQUE2QztVQUMzQyxJQUFLbU8sQ0FBQUEsUUFBTCxHQUFnQixJQUFoQixDQUFBO0VBQ0EsUUFBQSxJQUFBLENBQUtyWCxZQUFMLENBQWtCLE9BQWxCLEVBQTJCLEVBQTNCLENBQUEsQ0FBQTtFQUNBLFFBQUEsSUFBQSxDQUFLb3dCLE1BQUwsSUFBZSxJQUFLQSxDQUFBQSxNQUFMLEVBQWYsQ0FBQTtFQUNBaHZCLFFBQUFBLE1BQUksQ0FBQ3dLLG1CQUFMLENBQXlCLElBQXpCLEVBQStCLE1BQS9CLENBQUEsQ0FBQTtFQUNBeEssUUFBQUEsTUFBSSxDQUFDd0ksZUFBTCxDQUFxQixJQUFyQixFQUEyQixPQUEzQixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBUSxLQUFBLEdBQUE7UUFDTixJQUFJLElBQUEsQ0FBS3lOLFFBQVQsRUFBbUI7VUFDakIsSUFBS0EsQ0FBQUEsUUFBTCxHQUFnQixLQUFoQixDQUFBO1VBQ0EsSUFBS2pWLENBQUFBLGVBQUwsQ0FBcUIsT0FBckIsQ0FBQSxDQUFBO0VBQ0EsUUFBQSxJQUFBLENBQUtpdUIsTUFBTCxJQUFlLElBQUtBLENBQUFBLE1BQUwsRUFBZixDQUFBO0VBQ0FqdkIsUUFBQUEsTUFBSSxDQUFDd0ssbUJBQUwsQ0FBeUIsSUFBekIsRUFBK0IsTUFBL0IsQ0FBQSxDQUFBO0VBQ0F4SyxRQUFBQSxNQUFJLENBQUN3SSxlQUFMLENBQXFCLElBQXJCLEVBQTJCLE9BQTNCLENBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFXLFFBQUEsR0FBQTtFQUNULE1BQUEsSUFBQSxDQUFLczlCLEtBQUwsRUFBQSxDQUFBOztFQUVBLE1BQUEsSUFBQSxDQUFLNFUsU0FBTCxJQUFrQixJQUFLQSxDQUFBQSxTQUFMLEVBQWxCLENBQUE7RUFDQTE2QyxNQUFBQSxNQUFJLENBQUN3SyxtQkFBTCxDQUF5QixJQUF6QixFQUErQixTQUEvQixDQUFBLENBQUE7O1FBRUEsSUFBSSxJQUFBLENBQUt5c0Isa0JBQVQsRUFBNkI7VUFDM0IsSUFBS0EsQ0FBQUEsa0JBQUwsQ0FBd0J6aEIsT0FBeEIsRUFBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRHhWLE1BQUFBLE1BQUksQ0FBQ3dJLGVBQUwsQ0FBcUIsSUFBckIsRUFBMkIsVUFBM0IsQ0FBQSxDQUFBO0VBRUEsTUFBQSxJQUFBLENBQUszRSxNQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWUsWUFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2IsSUFBS215QixDQUFBQSxXQUFMLENBQWlCMmtCLE1BQWpCLENBQXdCdGxELE9BQXhCLENBQWdDLFVBQUE0SCxLQUFLLEVBQUk7RUFDdkMsUUFBQSxJQUFNcUQsR0FBRyxHQUFHLElBQUEsR0FBT3JELEtBQUssQ0FBQ2tTLE1BQU4sQ0FBYSxDQUFiLENBQWdCdEcsQ0FBQUEsV0FBaEIsRUFBUCxHQUF1QzVMLEtBQUssQ0FBQzNELEtBQU4sQ0FBWSxDQUFaLENBQW5ELENBQUE7RUFDQWpHLFFBQUFBLE1BQU0sQ0FBQ3VULGNBQVAsQ0FBc0IsTUFBdEIsRUFBNEJ0RyxHQUE1QixFQUFpQztFQUMvQnlPLFVBQUFBLFlBQVksRUFBRSxJQURpQjtFQUUvQjZyQyxVQUFBQSxVQUFVLEVBQUUsSUFGbUI7RUFHL0IvakQsVUFBQUEsR0FBRyxFQUFFLFNBQUEsR0FBQSxHQUFBO2NBQUEsT0FBTSxNQUFJLENBQUt5SixHQUFBQSxDQUFBQSxNQUFBQSxDQUFBQSxHQUFMLENBQVYsQ0FBQSxDQUFBO2FBSDBCO1lBSS9CbkksR0FBRyxFQUFFLFNBQUEyVCxHQUFBQSxDQUFBQSxLQUFLLEVBQUk7RUFDWixZQUFBLElBQUksRUFBRUEsS0FBSyxZQUFZN1AsUUFBbkIsQ0FBSixFQUFrQztnQkFDaEMrRCxNQUFJLENBQUNtSixLQUFMLENBQUEsSUFBQSxDQUFBLE1BQUEsQ0FBZTdJLEdBQWYsRUFBQSw0QkFBQSxDQUFBLENBQUEsQ0FBQTtFQUNELGFBQUE7O2NBQ0QsTUFBSSxDQUFBLEdBQUEsQ0FBQSxNQUFBLENBQUtBLEdBQUwsQ0FBSixDQUFBLEdBQWtCd0wsS0FBSyxDQUFDSSxJQUFOLENBQVcsTUFBWCxDQUFsQixDQUFBO0VBQ0QsV0FBQTtXQVRILENBQUEsQ0FBQTtTQUZGLENBQUEsQ0FBQTtFQWNELEtBQUE7OztXQTVFRCxTQUFnQyxHQUFBLEdBQUE7RUFDOUIsTUFBQSxPQUFPLENBQUMsVUFBRCxFQUFhLG9CQUFiLEVBQW1DLE9BQW5DLENBQVAsQ0FBQTtFQUNELEtBQUE7OztXQTRFRCxTQUFvQixHQUFBLEdBQUE7UUFDbEIsT0FBTyxDQUFDLE1BQUQsRUFBUyxNQUFULEVBQWlCLE1BQWpCLEVBQXlCLFNBQXpCLENBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7Ozs7SUF4V3lDNm5CO0VBMld6Q3BsQixXQUFXLENBQUNrc0MsSUFBWixHQUFtQm5CLFdBQW5CLENBQUE7RUFDQXhsRCxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixVQUF0QixFQUFrQ3FsQixXQUFsQyxDQUFBOztFQ3hiQSxJQUFhb0IsZUFBYixnQkFBQSxVQUFBLGFBQUEsRUFBQTtFQUFBLEVBQUEsU0FBQSxDQUFBLGVBQUEsRUFBQSxhQUFBLENBQUEsQ0FBQTs7RUFBQSxFQUFBLElBQUEsTUFBQSxHQUFBLFlBQUEsQ0FBQSxlQUFBLENBQUEsQ0FBQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFDRSxTQUFzRixlQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsSUFBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFKLEVBQUk7RUFBQSxRQUFBLFdBQUEsR0FBQSxJQUFBLENBQXpFMWlDLE1BQXlFO1VBQXpFQSxNQUF5RSw0QkFBaEUsNkJBQWdFLEdBQUEsV0FBQTtFQUFBLFFBQUEsVUFBQSxHQUFBLElBQUEsQ0FBakNsRSxLQUFpQztVQUFqQ0EsS0FBaUMsMkJBQXpCLENBQXlCLEdBQUEsVUFBQTtFQUFBLFFBQUEsYUFBQSxHQUFBLElBQUEsQ0FBdEJELFFBQXNCO1VBQXRCQSxRQUFzQiw4QkFBWCxHQUFXLEdBQUEsYUFBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxlQUFBLENBQUEsQ0FBQTs7TUFBQSxPQUM5RSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBQTtFQUFFbUUsTUFBQUEsTUFBTSxFQUFOQSxNQUFGO0VBQVVsRSxNQUFBQSxLQUFLLEVBQUxBLEtBQVY7RUFBaUJELE1BQUFBLFFBQVEsRUFBUkEsUUFBQUE7T0FENkQsQ0FBQSxDQUFBO0VBRXJGLEdBQUE7O0VBVkgsRUFBQSxZQUFBLENBQUEsZUFBQSxFQUFBLENBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxNQUFBO0VBQUEsSUFBQSxLQUFBLEVBWUUsU0FBSzhtQyxJQUFBQSxDQUFBQSxPQUFMLEVBQWM3akQsUUFBZCxFQUF3QjtRQUN0QkEsUUFBUSxFQUFBLENBQUE7RUFDVCxLQUFBO0VBZEgsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsTUFBQTtFQUFBLElBQUEsS0FBQSxFQWdCRSxTQUFLNmpELElBQUFBLENBQUFBLE9BQUwsRUFBYzdqRCxRQUFkLEVBQXdCO1FBQ3RCQSxRQUFRLEVBQUEsQ0FBQTtFQUNULEtBQUE7RUFsQkgsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsVUFBQTtNQUFBLEtBb0JFLEVBQUEsU0FBQSxRQUFBLENBQVNpSixPQUFULEVBQTZFLEtBQUEsRUFBQTtRQUFBLElBQTFEaUksSUFBMEQsU0FBMURBLElBQTBEO1lBQXBEaVMsRUFBb0QsU0FBcERBLEVBQW9EO1lBQWhEaGpCLE9BQWdELFNBQWhEQSxPQUFnRDtZQUF2Q0gsUUFBdUMsU0FBdkNBLFFBQXVDO0VBQUEsVUFBQSxhQUFBLEdBQUEsS0FBQSxDQUE3QnM4QyxPQUE2QjtZQUE3QkEsT0FBNkIsOEJBQW5CLEtBQW1CLEdBQUEsYUFBQTtZQUFaMy9CLFNBQVksU0FBWkEsU0FBWSxDQUFBO1FBQzNFeGMsT0FBTyxHQUFHMkksTUFBSSxDQUFDc0osTUFBTCxDQUFZLEVBQVosRUFBZ0IsSUFBS2pTLENBQUFBLE9BQXJCLEVBQThCQSxPQUE5QixDQUFWLENBQUE7O0VBRUEsTUFBQSxJQUFJd2MsU0FBSixFQUFlO1VBQ2J6TCxJQUFJLEdBQUd5TCxTQUFTLENBQUN6TCxJQUFqQixDQUFBO1VBQ0FpUyxFQUFFLEdBQUd4RyxTQUFTLENBQUN3RyxFQUFmLENBQUE7RUFDRCxPQUFBOztFQUVEeEcsTUFBQUEsU0FBUyxHQUFHa2QsTUFBTSxDQUFDNXdCLE9BQUQsQ0FBbEIsQ0FBQTs7RUFDQSxNQUFBLElBQUlxekMsT0FBSixFQUFhO0VBQ1gzL0IsUUFBQUEsU0FBUyxHQUFHQSxTQUFTLENBQUMyRyxTQUFWLEVBQVosQ0FBQTtFQUNELE9BQUE7O0VBQ0QzRyxNQUFBQSxTQUFTLEdBQUdBLFNBQVMsQ0FBQ3plLEtBQVYsQ0FBZ0JnVCxJQUFoQixDQUFzQnFTLENBQUFBLElBQXRCLENBQTJCLElBQUEsQ0FBS3ZHLEtBQWhDLENBQUEsQ0FBdUM5ZSxLQUF2QyxDQUE2QztFQUN2RG1sQixRQUFBQSxHQUFHLEVBQUVGLEVBRGtEO1VBRXZEcEcsUUFBUSxFQUFFLEtBQUtBLFFBRndDO0VBR3ZEbUUsUUFBQUEsTUFBTSxFQUFFLElBQUtBLENBQUFBLE1BQUFBO0VBSDBDLE9BQTdDLENBQVosQ0FBQTs7RUFLQSxNQUFBLElBQUlvN0IsT0FBSixFQUFhO0VBQ1gzL0IsUUFBQUEsU0FBUyxHQUFHQSxTQUFTLENBQUM2RyxZQUFWLEVBQVosQ0FBQTtFQUNELE9BQUE7O0VBQ0QsTUFBQSxJQUFJeGpCLFFBQUosRUFBYztFQUNaMmMsUUFBQUEsU0FBUyxHQUFHQSxTQUFTLENBQUN6ZSxLQUFWLENBQWdCLFVBQUM4a0IsSUFBRCxFQUFVO1lBQ3BDaGpCLFFBQVEsRUFBQSxDQUFBO1lBQ1JnakIsSUFBSSxFQUFBLENBQUE7RUFDTCxTQUhXLENBQVosQ0FBQTtFQUlELE9BQUE7O0VBQ0QsTUFBQSxPQUFPckcsU0FBUCxDQUFBO0VBQ0QsS0FBQTtFQS9DSCxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxhQUFBO0VBQUEsSUFBQSxLQUFBLEVBaURFLFNBQVkxVCxXQUFBQSxDQUFBQSxPQUFaLEVBQXFCNjZDLFVBQXJCLEVBQWlDO0VBQUEsTUFBQSxJQUFBLEtBQUEsR0FBQSxJQUFBLENBQUE7O1FBQy9CM25ELE1BQU0sQ0FBQ2dOLElBQVAsQ0FBWTI2QyxVQUFaLEVBQXdCM2xELE9BQXhCLENBQWdDLFVBQUFpTCxHQUFHLEVBQUE7RUFBQSxRQUFBLE9BQUksS0FBSSxDQUFDMjZDLFFBQUwsQ0FBYzk2QyxPQUFPLENBQUNHLEdBQUQsQ0FBckIsRUFBNEIwNkMsVUFBVSxDQUFDMTZDLEdBQUQsQ0FBdEMsQ0FBQSxDQUE2QzJaLElBQTdDLEVBQUosQ0FBQTtTQUFuQyxDQUFBLENBQUE7RUFDRCxLQUFBO0VBbkRILEdBQUEsQ0FBQSxDQUFBLENBQUE7O0VBQUEsRUFBQSxPQUFBLGVBQUEsQ0FBQTtFQUFBLENBQUEsQ0FBcUNxYSxZQUFyQyxDQUFBLENBQUE7RUF1REEsSUFBTTBHLElBQUksR0FBRztFQUNYa2dCLEVBQUFBLEdBQUcsRUFBRTtFQUNIOXlDLElBQUFBLElBQUksRUFBRTtFQUFDcXRCLE1BQUFBLE9BQU8sRUFBRSxHQUFBO09BRGI7RUFFSHBiLElBQUFBLEVBQUUsRUFBRTtFQUFDb2IsTUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBVixLQUFBO0tBSEs7RUFLWDBsQixFQUFBQSxFQUFFLEVBQUU7RUFDRi95QyxJQUFBQSxJQUFJLEVBQUU7RUFBQ3F0QixNQUFBQSxPQUFPLEVBQUUsQ0FBQTtPQURkO0VBRUZwYixJQUFBQSxFQUFFLEVBQUU7RUFBQ29iLE1BQUFBLE9BQU8sRUFBRSxHQUFBO0VBQVYsS0FBQTtFQUZGLEdBQUE7RUFMTyxDQUFiLENBQUE7RUFXQSxJQUFhMmxCLHFCQUFiLGdCQUFBLFVBQUEsZ0JBQUEsRUFBQTtFQUFBLEVBQUEsU0FBQSxDQUFBLHFCQUFBLEVBQUEsZ0JBQUEsQ0FBQSxDQUFBOztFQUFBLEVBQUEsSUFBQSxPQUFBLEdBQUEsWUFBQSxDQUFBLHFCQUFBLENBQUEsQ0FBQTs7RUFBQSxFQUFBLFNBQUEscUJBQUEsR0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxxQkFBQSxDQUFBLENBQUE7O0VBQUEsSUFBQSxPQUFBLE9BQUEsQ0FBQSxLQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsQ0FBQSxDQUFBO0VBQUEsR0FBQTs7RUFBQSxFQUFBLFlBQUEsQ0FBQSxxQkFBQSxFQUFBLENBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxNQUFBO0VBQUEsSUFBQSxLQUFBLEVBQ0UsU0FBS0wsSUFBQUEsQ0FBQUEsT0FBTCxFQUFjN2pELFFBQWQsRUFBd0I7UUFDdEIsSUFBS21rRCxDQUFBQSxXQUFMLENBQWlCTixPQUFqQixFQUEwQjtVQUN4QnZsQixLQUFLLEVBQUV3RixJQUFJLENBQUNtZ0IsRUFEWTtFQUV4QkcsUUFBQUEsUUFBUSxFQUFFO1lBQUN6bkMsU0FBUyxFQUFFbW5CLElBQUksQ0FBQ21nQixFQUFqQjtFQUFxQjNILFVBQUFBLE9BQU8sRUFBRSxJQUE5QjtFQUFvQ3Q4QyxVQUFBQSxRQUFRLEVBQVJBLFFBQUFBO0VBQXBDLFNBQUE7U0FGWixDQUFBLENBQUE7RUFJRCxLQUFBO0VBTkgsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsTUFBQTtFQUFBLElBQUEsS0FBQSxFQVFFLFNBQUs2akQsSUFBQUEsQ0FBQUEsT0FBTCxFQUFjN2pELFFBQWQsRUFBd0I7UUFDdEIsSUFBS21rRCxDQUFBQSxXQUFMLENBQWlCTixPQUFqQixFQUEwQjtVQUN4QnZsQixLQUFLLEVBQUV3RixJQUFJLENBQUNrZ0IsR0FEWTtFQUV4QkksUUFBQUEsUUFBUSxFQUFFO1lBQUN6bkMsU0FBUyxFQUFFbW5CLElBQUksQ0FBQ2tnQixHQUFqQjtFQUFzQjFILFVBQUFBLE9BQU8sRUFBRSxJQUEvQjtFQUFxQ3Q4QyxVQUFBQSxRQUFRLEVBQVJBLFFBQUFBO0VBQXJDLFNBQUE7U0FGWixDQUFBLENBQUE7RUFJRCxLQUFBO0VBYkgsR0FBQSxDQUFBLENBQUEsQ0FBQTs7RUFBQSxFQUFBLE9BQUEscUJBQUEsQ0FBQTtFQUFBLENBQUEsQ0FBMkM0akQsZUFBM0MsQ0FBQSxDQUFBO0VBZ0JBLElBQWFTLHNCQUFiLGdCQUFBLFVBQUEscUJBQUEsRUFBQTtFQUFBLEVBQUEsU0FBQSxDQUFBLHNCQUFBLEVBQUEscUJBQUEsQ0FBQSxDQUFBOztFQUFBLEVBQUEsSUFBQSxPQUFBLEdBQUEsWUFBQSxDQUFBLHNCQUFBLENBQUEsQ0FBQTs7RUFBQSxFQUFBLFNBQUEsc0JBQUEsR0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxzQkFBQSxDQUFBLENBQUE7O0VBQUEsSUFBQSxPQUFBLE9BQUEsQ0FBQSxLQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsQ0FBQSxDQUFBO0VBQUEsR0FBQTs7RUFBQSxFQUFBLFlBQUEsQ0FBQSxzQkFBQSxFQUFBLENBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxNQUFBO0VBQUEsSUFBQSxLQUFBLEVBQ0UsU0FBS1IsSUFBQUEsQ0FBQUEsT0FBTCxFQUFjN2pELFFBQWQsRUFBd0I7UUFDdEIsSUFBS21rRCxDQUFBQSxXQUFMLENBQWlCTixPQUFqQixFQUEwQjtVQUN4QnZsQixLQUFLLEVBQUV3RixJQUFJLENBQUNtZ0IsRUFEWTtFQUV4QkcsUUFBQUEsUUFBUSxFQUFFO0VBQ1JsekMsVUFBQUEsSUFBSSxFQUFFO0VBQ0p1dEIsWUFBQUEsU0FBUyxFQUFFLHdCQURQO0VBRUpGLFlBQUFBLE9BQU8sRUFBRSxDQUFBO2FBSEg7RUFLUnBiLFVBQUFBLEVBQUUsRUFBRTtFQUNGc2IsWUFBQUEsU0FBUyxFQUFFLHlCQURUO0VBRUZGLFlBQUFBLE9BQU8sRUFBRSxHQUFBO2FBUEg7RUFTUitkLFVBQUFBLE9BQU8sRUFBRSxJQVREO0VBVVJ0OEMsVUFBQUEsUUFBUSxFQUFSQSxRQUFBQTtFQVZRLFNBQUE7U0FGWixDQUFBLENBQUE7RUFlRCxLQUFBO0VBakJILEdBQUEsQ0FBQSxDQUFBLENBQUE7O0VBQUEsRUFBQSxPQUFBLHNCQUFBLENBQUE7RUFBQSxDQUFBLENBQTRDa2tELHFCQUE1QyxDQUFBOztFQzFFQSxJQUFNdDNDLFFBQU0sR0FBRztFQUNiLEVBQUEsVUFBQSxFQUFZLFlBREM7RUFFYixFQUFBLGVBQUEsRUFBaUIsaUJBRko7RUFHYixFQUFBLG1CQUFBLEVBQXFCLHFCQUhSO0lBSWIsaUJBQW1CLEVBQUEsbUJBQUE7RUFKTixDQUFmLENBQUE7RUFPQSxJQUFNd3pCLGVBQWEsR0FBRztFQUNwQixFQUFBLFNBQUEsRUFBVyxTQUFXLFFBQUEsR0FBQTtFQUFFLElBQUEsT0FBT3htQyxRQUFRLENBQUNnRCxTQUFULEVBQXVCc25ELEdBQUFBLHFCQUF2QixHQUErQ0csc0JBQXRELENBQUE7S0FESjtFQUVwQixFQUFBLE1BQUEsRUFBUVQsZUFGWTtFQUdwQixFQUFBLFVBQUEsRUFBWVMsc0JBSFE7SUFJcEIsU0FBV0gsRUFBQUEscUJBQUFBO0VBSlMsQ0FBdEIsQ0FBQTtFQU9BLElBQU1JLFNBQVMsR0FBRztFQUNoQkMsRUFBQUEsRUFBRSxFQUFFLFFBRFk7RUFFaEJwbEMsRUFBQUEsSUFBSSxFQUFFLE9BRlU7RUFHaEJxbEMsRUFBQUEsSUFBSSxFQUFFLEtBSFU7RUFJaEJwbEMsRUFBQUEsS0FBSyxFQUFFLE1BQUE7RUFKUyxDQUFsQixDQUFBO0VBUUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BQ3FCcWxDOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUVFLFNBQWMsY0FBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsY0FBQSxDQUFBLENBQUE7O0VBQ1osSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTtFQUVBLElBQUEsS0FBQSxDQUFLelEsY0FBTCxHQUFzQixLQUFBLENBQUtqQyxTQUFMLENBQWUvOEIsSUFBZixDQUF0QixzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFFQStkLElBQUFBLFlBQVksZ0NBQU8sWUFBTTtFQUN2QixNQUFBLEtBQUEsQ0FBS3VOLFFBQUwsRUFBQSxDQUFBOztFQUNBLE1BQUEsS0FBQSxDQUFLcDNCLEtBQUwsQ0FBVzRWLE9BQVgsR0FBcUIsTUFBckIsQ0FBQTtFQUNELEtBSFcsQ0FBWixDQUFBO0VBTFksSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQVNiLEdBQUE7Ozs7V0FFRCxTQUFjLEdBQUEsR0FBQTtFQUNaLE1BQUEsT0FBT2xTLFFBQVAsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQVksR0FBQSxHQUFBO0VBQ1YsTUFBQSxPQUFPOUQsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsZUFBckIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBZSxHQUFBLEdBQUE7RUFDYixNQUFBLE9BQU92SCxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixVQUFyQixDQUFQLENBQUE7RUFDRCxLQUFBOzs7V0FFRCxTQUFlLEdBQUEsR0FBQTtRQUNiLE9BQU92SCxNQUFJLENBQUN1SCxTQUFMLENBQWUsS0FBSyt6QyxRQUFwQixFQUE4QixtQkFBOUIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBYSxHQUFBLEdBQUE7UUFDWCxPQUFPdDdDLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxLQUFLK3pDLFFBQXBCLEVBQThCLGlCQUE5QixDQUFQLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF5QixzQkFBQSxHQUFBO1FBQ3ZCLE9BQU8sSUFBSXRvQyxlQUFKLENBQW9CO0VBQ3pCRSxRQUFBQSxTQUFTLEVBQUVva0IsZUFEYztFQUV6QmxrQixRQUFBQSxTQUFTLEVBQUUwbkMsZUFGYztFQUd6QnhuQyxRQUFBQSxhQUFhLEVBQUUsaUJBSFU7RUFJekJFLFFBQUFBLGdCQUFnQixFQUFFLElBQUEsQ0FBS3pTLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBa0MsSUFBQSxTQUFBO0VBSjNCLE9BQXBCLENBQVAsQ0FBQTtFQU1ELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsWUFBQSxDQUFhdzFCLFVBQWIsRUFBdUM7UUFBQSxJQUFkbC9CLE9BQWMsdUVBQUosRUFBSSxDQUFBOztFQUNyQyxNQUFBLElBQUlrL0IsVUFBSixFQUFnQjtFQUNkLFFBQUEsSUFBQSxDQUFLbjJCLEtBQUwsQ0FBVzRWLE9BQVgsR0FBcUIsT0FBckIsQ0FBQTtFQUNBLFFBQUEsSUFBQSxDQUFLNGxDLGNBQUwsR0FBc0J2a0QsT0FBTyxDQUFDSixNQUE5QixDQUFBOztFQUNBLFFBQUEsSUFBQSxDQUFLNGtELGdCQUFMLENBQXNCeGtELE9BQU8sQ0FBQ0osTUFBOUIsQ0FBQSxDQUFBO0VBQ0QsT0FKRCxNQUlPO0VBQ0wsUUFBQSxJQUFBLENBQUttSixLQUFMLENBQVc0VixPQUFYLEdBQXFCLE1BQXJCLENBQUE7O0VBQ0EsUUFBQSxJQUFBLENBQUs4bEMsWUFBTCxFQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxnQkFBQSxDQUFpQjdrRCxNQUFqQixFQUF5QjtFQUN2QixNQUFBLElBQWdCOGtELE1BQWhCLEdBQXFFLElBQXJFLENBQU9DLE9BQVA7RUFBQSxVQUFrQ0MsY0FBbEMsR0FBcUUsSUFBckUsQ0FBd0JDLFFBQXhCO0VBQUEsVUFBMkRDLE1BQTNELEdBQXFFLElBQXJFLENBQWtEQyxPQUFsRCxDQUFBO0VBQ0EsTUFBQSxJQUFNcm5CLGVBQWUsR0FBR0osWUFBWSxDQUFDRyxrQkFBYixFQUF4QixDQUFBO0VBQ0EsTUFBQSxJQUFNSyxZQUFZLEdBQUdSLFlBQVksQ0FBQ08sa0JBQWIsRUFBckIsQ0FBQTtFQUNBLE1BQUEsSUFBTW1uQixVQUFVLEdBQUdwbEQsTUFBTSxDQUFDbWpDLHFCQUFQLEVBQW5CLENBQUE7UUFDQSxJQUFNa2lCLElBQUksR0FBR3Q4QyxNQUFJLENBQUN1QixXQUFMLENBQWlCLElBQWpCLEVBQXVCLFVBQXZCLENBQWIsQ0FBQTtRQUNBLElBQU1nN0MsS0FBSyxHQUFHRCxJQUFJLElBQUksS0FBSzM5QyxZQUFMLENBQWtCLGNBQWxCLENBQXRCLENBQUE7RUFDQSxNQUFBLElBQU15RixNQUFNLEdBQUdwRSxNQUFJLENBQUNtRSxVQUFMLENBQWdCLElBQWhCLEVBQXNCLFVBQXRCLENBQUEsSUFBcUNoVCxRQUFRLENBQUM0VyxJQUE3RCxDQUFBO0VBQ0EsTUFBQSxJQUFNeTBDLGdCQUFnQixHQUFHcDRDLE1BQU0sQ0FBQ2cyQixxQkFBUCxFQUF6QixDQUFBO0VBQ0EsTUFBQSxJQUFNcWlCLFlBQVksR0FBRztFQUNuQnpuQixRQUFBQSxHQUFHLEVBQUVqZ0MsSUFBSSxDQUFDdXFCLEdBQUwsQ0FBU2s5QixnQkFBZ0IsQ0FBQ3huQixHQUExQixFQUErQkcsWUFBWSxDQUFDSCxHQUE1QyxDQURjO0VBRW5CM2UsUUFBQUEsSUFBSSxFQUFFdGhCLElBQUksQ0FBQ3VxQixHQUFMLENBQVNrOUIsZ0JBQWdCLENBQUNubUMsSUFBMUIsRUFBZ0M4ZSxZQUFZLENBQUM5ZSxJQUE3QyxDQUZhO0VBR25CNGUsUUFBQUEsTUFBTSxFQUFFbGdDLElBQUksQ0FBQ3NxQixHQUFMLENBQVNtOUIsZ0JBQWdCLENBQUN2bkIsTUFBMUIsRUFBa0NFLFlBQVksQ0FBQ0YsTUFBL0MsQ0FIVztVQUluQjNlLEtBQUssRUFBRXZoQixJQUFJLENBQUNzcUIsR0FBTCxDQUFTbTlCLGdCQUFnQixDQUFDbG1DLEtBQTFCLEVBQWlDNmUsWUFBWSxDQUFDN2UsS0FBOUMsQ0FBQTtFQUpZLE9BQXJCLENBVHVCOztFQWlCdkIsTUFBQSxJQUFNb21DLGNBQWMsR0FBRztVQUNyQjFuQixHQUFHLEVBQUVxbkIsVUFBVSxDQUFDcm5CLEdBQVgsSUFBa0J5bkIsWUFBWSxDQUFDem5CLEdBQWIsR0FBbUJtbkIsTUFBckMsQ0FEZ0I7VUFFckI5bEMsSUFBSSxFQUFFZ21DLFVBQVUsQ0FBQ2htQyxJQUFYLElBQW1Cb21DLFlBQVksQ0FBQ3BtQyxJQUFiLEdBQW9COGxDLE1BQXZDLENBRmU7VUFHckJsbkIsTUFBTSxFQUFHd25CLFlBQVksQ0FBQ3huQixNQUFiLEdBQXNCa25CLE1BQXZCLEdBQWlDRSxVQUFVLENBQUNwbkIsTUFIL0I7VUFJckIzZSxLQUFLLEVBQUdtbUMsWUFBWSxDQUFDbm1DLEtBQWIsR0FBcUI2bEMsTUFBdEIsR0FBZ0NFLFVBQVUsQ0FBQy9sQyxLQUFBQTtFQUo3QixPQUF2QixDQWpCdUI7O0VBeUJ2QixNQUFBLElBQU1xbUMsd0JBQXdCLEdBQUc7VUFDL0IzbkIsR0FBRyxFQUFFcW5CLFVBQVUsQ0FBQ3JuQixHQUFYLEdBQWlCamdDLElBQUksQ0FBQ3dsQyxLQUFMLENBQVc4aEIsVUFBVSxDQUFDdHFELE1BQVgsR0FBb0IsQ0FBL0IsQ0FBakIsSUFBc0QwcUQsWUFBWSxDQUFDem5CLEdBQWIsR0FBbUJtbkIsTUFBekUsQ0FEMEI7VUFFL0I5bEMsSUFBSSxFQUFFZ21DLFVBQVUsQ0FBQ2htQyxJQUFYLEdBQWtCdGhCLElBQUksQ0FBQ3dsQyxLQUFMLENBQVc4aEIsVUFBVSxDQUFDdnFELEtBQVgsR0FBbUIsQ0FBOUIsQ0FBbEIsSUFBc0QycUQsWUFBWSxDQUFDcG1DLElBQWIsR0FBb0I4bEMsTUFBMUUsQ0FGeUI7VUFHL0JsbkIsTUFBTSxFQUFHd25CLFlBQVksQ0FBQ3huQixNQUFiLEdBQXNCa25CLE1BQXZCLEdBQWlDRSxVQUFVLENBQUNwbkIsTUFBNUMsR0FBcURsZ0MsSUFBSSxDQUFDd2xDLEtBQUwsQ0FBVzhoQixVQUFVLENBQUN0cUQsTUFBWCxHQUFvQixDQUEvQixDQUg5QjtFQUkvQnVrQixRQUFBQSxLQUFLLEVBQUdtbUMsWUFBWSxDQUFDbm1DLEtBQWIsR0FBcUI2bEMsTUFBdEIsR0FBZ0NFLFVBQVUsQ0FBQy9sQyxLQUEzQyxHQUFtRHZoQixJQUFJLENBQUN3bEMsS0FBTCxDQUFXOGhCLFVBQVUsQ0FBQ3ZxRCxLQUFYLEdBQW1CLENBQTlCLENBQUE7U0FKNUQsQ0FBQTs7RUFPQSxNQUFBLElBQUEscUJBQUEsR0FBNkUsSUFBSzhxRCxDQUFBQSxvQkFBTCxDQUEwQkYsY0FBMUIsQ0FBN0U7WUFBTzllLFFBQVAseUJBQU9BLFFBQVA7WUFBMEJpZixnQkFBMUIseUJBQWlCQyxPQUFqQjtZQUF1REMsa0JBQXZELHlCQUE0Q0MsU0FBNUMsQ0FBQTs7UUFDQSxJQUFLQyxDQUFBQSxpQkFBTCxHQUF5QkosZ0JBQXpCLENBQUE7RUFDQTc4QyxNQUFBQSxNQUFJLENBQUNnQyxXQUFMLENBQWlCLElBQWpCLEVBQXVCNjZDLGdCQUF2QixDQUFBLENBQUE7UUFFQSxJQUFNSyxRQUFRLEdBQUd0ZixRQUFRLEdBQUcsT0FBSCxHQUFhLFFBQXRDLENBcEN1Qjs7UUFzQ3ZCLElBQU11ZixXQUFXLEdBQUksVUFBQS84QyxLQUFLLEVBQUE7VUFBQSxPQUFLO1lBQzdCdE8sS0FBSyxFQUFFTSxRQUFRLENBQUNnTyxLQUFLLENBQUN1TCxnQkFBTixDQUF1QixPQUF2QixDQUFELEVBQWtDLEVBQWxDLENBRGM7WUFFN0I1WixNQUFNLEVBQUVLLFFBQVEsQ0FBQ2dPLEtBQUssQ0FBQ3VMLGdCQUFOLENBQXVCLFFBQXZCLENBQUQsRUFBbUMsRUFBbkMsQ0FBQTtXQUZRLENBQUE7U0FBTixDQUdoQmxiLE1BQU0sQ0FBQ29QLGdCQUFQLENBQXdCbzhDLGNBQXhCLENBSGdCLENBQXBCLENBdEN1Qjs7O1FBNEN2QixJQUFNbUIsb0JBQW9CLEdBQUdiLEtBQUssR0FBRyxDQUFILEdBQU8sQ0FBQzNlLFFBQVEsR0FBR3llLFVBQVUsQ0FBQ3RxRCxNQUFkLEdBQXVCc3FELFVBQVUsQ0FBQ3ZxRCxLQUEzQyxLQUFxRHdxRCxJQUFJLEdBQUcsQ0FBSCxHQUFPLEVBQWhFLENBQXpDLENBQUE7UUFDQSxJQUFNZSxhQUFhLEdBQUd0b0QsSUFBSSxDQUFDdXFCLEdBQUwsQ0FDcEJ5VixlQUFlLENBQUM4bkIsZ0JBQUQsQ0FBZixHQUFvQ1YsTUFEaEIsRUFFcEJwbkIsZUFBZSxDQUFDOG5CLGdCQUFELENBQWYsR0FBb0NWLE1BQXBDLEdBQTZDTyxjQUFjLENBQUNHLGdCQUFELENBQTNELEdBQWdGTyxvQkFGNUQsQ0FBdEIsQ0FBQTtFQUlBLE1BQUEsSUFBTUUsZUFBZSxHQUFHdm9ELElBQUksQ0FBQ3VxQixHQUFMLENBQ3RCeVYsZUFBZSxDQUFDZ29CLGtCQUFELENBQWYsR0FBc0NaLE1BRGhCLEVBRXRCcG5CLGVBQWUsQ0FBQ2dvQixrQkFBRCxDQUFmLEdBQXNDWixNQUF0QyxHQUErQ1Esd0JBQXdCLENBQUNJLGtCQUFELENBQXZFLEdBQStGSSxXQUFXLENBQUNELFFBQUQsQ0FBWCxHQUF3QixDQUZqRyxDQUF4QixDQUFBO1FBSUEsSUFBSzVCLENBQUFBLFFBQUwsQ0FBY2w3QyxLQUFkLENBQW9CeThDLGdCQUFwQixDQUF3Q1EsR0FBQUEsYUFBYSxHQUFHLElBQXhELENBQUE7UUFDQSxJQUFLL0IsQ0FBQUEsUUFBTCxDQUFjbDdDLEtBQWQsQ0FBb0IyOEMsa0JBQXBCLElBQTBDTyxlQUFlLEdBQUcsSUFBNUQsQ0F0RHVCOztRQXlEdkIsSUFBS0MsQ0FBQUEsTUFBTCxDQUFZbjlDLEtBQVosQ0FBa0IyOEMsa0JBQWxCLENBQXdDaG9ELEdBQUFBLElBQUksQ0FBQ3VxQixHQUFMLENBQ3RDeThCLE1BRHNDLEVBRXJDaG5CLGVBQWUsQ0FBQ2dvQixrQkFBRCxDQUFmLEdBQXNDWixNQUF2QyxHQUFpRFEsd0JBQXdCLENBQUNJLGtCQUFELENBQXpFLEdBQWdHTyxlQUYxRCxDQUFBLEdBR3BDLElBSEosQ0FBQTtFQUlELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsb0JBQUEsQ0FBcUIvdUMsUUFBckIsRUFBK0I7RUFDN0IsTUFBQSxJQUFNbFgsT0FBTyxHQUFHLENBQUMsSUFBSzBKLENBQUFBLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBQSxJQUFrQyxvQkFBbkMsRUFBeUR6TyxLQUF6RCxDQUErRCxLQUEvRCxFQUFzRW9QLEdBQXRFLENBQTBFLFVBQUF4TSxDQUFDLEVBQUE7VUFBQSxPQUFJc21ELFNBQVMsQ0FBQ3RtRCxDQUFELENBQWIsQ0FBQTtFQUFBLE9BQTNFLENBQWhCLENBQUE7UUFDQSxJQUFNNG5ELE9BQU8sR0FBR3psRCxPQUFPLENBQUNuQixJQUFSLENBQWEsVUFBQ3lpQixDQUFELEVBQUlxTixDQUFKLEVBQUE7VUFBQSxPQUFVelgsUUFBUSxDQUFDb0ssQ0FBRCxDQUFSLEdBQWNwSyxRQUFRLENBQUN5WCxDQUFELENBQWhDLENBQUE7U0FBYixDQUFBLENBQWtELENBQWxELENBQWhCLENBQUE7RUFDQSxNQUFBLElBQU00WCxRQUFRLEdBQUcsS0FBQSxJQUFTa2YsT0FBVCxJQUFvQixZQUFZQSxPQUFqRCxDQUFBO0VBQ0EsTUFBQSxJQUFJRSxTQUFKLENBQUE7O0VBRUEsTUFBQSxJQUFJcGYsUUFBSixFQUFjO1VBQ1pvZixTQUFTLEdBQUd6dUMsUUFBUSxDQUFDOEgsSUFBVCxHQUFnQjlILFFBQVEsQ0FBQytILEtBQXpCLEdBQWlDLE1BQWpDLEdBQTBDLE9BQXRELENBQUE7RUFDRCxPQUZELE1BRU87VUFDTDBtQyxTQUFTLEdBQUd6dUMsUUFBUSxDQUFDeW1CLEdBQVQsR0FBZXptQixRQUFRLENBQUMwbUIsTUFBeEIsR0FBaUMsS0FBakMsR0FBeUMsUUFBckQsQ0FBQTtFQUNELE9BQUE7O1FBRUQsT0FBTztFQUFDMkksUUFBQUEsUUFBUSxFQUFSQSxRQUFEO0VBQVdrZixRQUFBQSxPQUFPLEVBQVBBLE9BQVg7RUFBb0JFLFFBQUFBLFNBQVMsRUFBVEEsU0FBQUE7U0FBM0IsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWUsWUFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2IsSUFBS0MsQ0FBQUEsaUJBQUwsR0FBeUIsSUFBekIsQ0FBQTtFQUNBLE1BQUEsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixPQUExQixDQUFBLENBQW1DNW5ELE9BQW5DLENBQTJDLFVBQUFILENBQUMsRUFBSTtVQUM5QyxNQUFJLENBQUNxb0QsTUFBTCxDQUFZbjlDLEtBQVosQ0FBa0JsTCxDQUFsQixDQUFBLEdBQXVCLE1BQUksQ0FBQ2duRCxRQUFMLENBQWM5N0MsS0FBZCxDQUFvQmxMLENBQXBCLENBQXlCLEdBQUEsTUFBSSxDQUFDb21ELFFBQUwsQ0FBY2w3QyxLQUFkLENBQW9CbEwsQ0FBcEIsQ0FBQSxHQUF5QixFQUF6RSxDQUFBO0VBQ0E4SyxRQUFBQSxNQUFJLENBQUMrQixjQUFMLENBQW9CLE1BQXBCLEVBQTBCN00sQ0FBMUIsQ0FBQSxDQUFBO1NBRkYsQ0FBQSxDQUFBO0VBSUQsS0FBQTs7O2FBRUQsU0FBWSxTQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDVlIsTUFBQUEsWUFBWSxDQUFDLFlBQU07VUFDakIsSUFBSSxNQUFJLENBQUNrbkQsY0FBVCxFQUF5QjtFQUN2QixVQUFBLE1BQUksQ0FBQ0MsZ0JBQUwsQ0FBc0IsTUFBSSxDQUFDRCxjQUEzQixDQUFBLENBQUE7RUFDRCxTQUFBO0VBQ0YsT0FKVyxDQUFaLENBQUE7RUFLRCxLQUFBOzs7YUFFRCxTQUFXLFFBQUEsR0FBQTtRQUNUcjNDLFNBQVMsQ0FBQ2hDLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBOztFQUVBLE1BQUEsSUFBSSxJQUFLKzRDLENBQUFBLFFBQUwsSUFBaUIsSUFBQSxDQUFLOWxCLEtBQTFCLEVBQWlDO0VBQy9CLFFBQUEsT0FBQTtFQUNELE9BQUE7O0VBRUQsTUFBQSxJQUFNZ29CLG1CQUFtQixHQUFHLElBQUEsQ0FBS2xDLFFBQUwsSUFBaUIsS0FBS1ksUUFBbEQsQ0FBQTs7RUFFQSxNQUFBLElBQUlzQixtQkFBSixFQUF5QjtVQUV2QixJQUFJLENBQUMsSUFBS2hvQixDQUFBQSxLQUFWLEVBQWlCO0VBQ2YsVUFBQSxJQUFNb0MsSUFBSSxHQUFHem1DLFFBQVEsQ0FBQzBNLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBYixDQUFBO0VBQ0ErNUIsVUFBQUEsSUFBSSxDQUFDcDBCLFNBQUwsQ0FBZUksR0FBZixDQUFtQixjQUFuQixDQUFBLENBQUE7RUFDQSxVQUFBLElBQUEsQ0FBSzhJLFlBQUwsQ0FBa0JrckIsSUFBbEIsRUFBd0IsS0FBS2pyQixVQUE3QixDQUFBLENBQUE7RUFDRCxTQUFBOztVQUVELElBQUksQ0FBQyxJQUFLNHdDLENBQUFBLE1BQVYsRUFBa0I7RUFDaEIsVUFBQSxJQUFNRSxLQUFLLEdBQUd0c0QsUUFBUSxDQUFDME0sYUFBVCxDQUF1QixLQUF2QixDQUFkLENBQUE7RUFDQTQvQyxVQUFBQSxLQUFLLENBQUNqNkMsU0FBTixDQUFnQkksR0FBaEIsQ0FBb0IsZ0JBQXBCLENBQUEsQ0FBQTs7RUFDQSxVQUFBLElBQUEsQ0FBSzAzQyxRQUFMLENBQWN0OUMsV0FBZCxDQUEwQnkvQyxLQUExQixDQUFBLENBQUE7RUFDRCxTQUFBO0VBRUYsT0FkRCxNQWNPO0VBRUwsUUFBQSxJQUFNaDZDLFFBQVEsR0FBR3pELE1BQUksQ0FBQ29KLGNBQUwsQ0FBakIseU1BQUEsQ0FBQSxDQUFBO0VBT0EsUUFBQSxJQUFNQyxPQUFPLEdBQUc1RixRQUFRLENBQUNqRixhQUFULENBQXVCLG1CQUF2QixDQUFoQixDQUFBOztFQUVBLFFBQUEsT0FBTyxJQUFLZ0osQ0FBQUEsVUFBTCxDQUFnQixDQUFoQixDQUFQLEVBQTJCO0VBQ3pCNkIsVUFBQUEsT0FBTyxDQUFDckwsV0FBUixDQUFvQixLQUFLd0osVUFBTCxDQUFnQixDQUFoQixDQUFwQixDQUFBLENBQUE7RUFDRCxTQUFBOztVQUVELElBQUt4SixDQUFBQSxXQUFMLENBQWlCeUYsUUFBakIsQ0FBQSxDQUFBO0VBQ0QsT0F2Q1E7OztFQTBDVCxNQUFBLElBQUksSUFBSzlFLENBQUFBLFlBQUwsQ0FBa0IsT0FBbEIsQ0FBSixFQUFnQztVQUM5QixJQUFLMjhDLENBQUFBLFFBQUwsQ0FBYzE4QyxZQUFkLENBQTJCLE9BQTNCLEVBQW9DLElBQUttQyxDQUFBQSxZQUFMLENBQWtCLE9BQWxCLENBQXBDLENBQUEsQ0FBQTs7VUFDQSxJQUFLQyxDQUFBQSxlQUFMLENBQXFCLE9BQXJCLENBQUEsQ0FBQTtFQUNELE9BQUE7O0VBRUQrQixNQUFBQSxZQUFZLENBQUM4MEIsWUFBYixDQUEwQixJQUExQixFQUFnQyxLQUFLVixPQUFyQyxDQUFBLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLElBQUEsQ0FBS2xnQyxNQUFMLEVBQTJCO1FBQUEsSUFBZEksT0FBYyx1RUFBSixFQUFJLENBQUE7O0VBQ3pCO0VBQ0EsTUFBQSxJQUFJSixNQUFNLElBQUksT0FBQSxDQUFPQSxNQUFQLENBQWtCLEtBQUEsUUFBNUIsSUFBd0MsRUFBRUEsTUFBTSxZQUFZNGtCLEtBQXBCLENBQXhDLElBQXNFLEVBQUU1a0IsTUFBTSxZQUFZdkcsV0FBcEIsQ0FBMUUsRUFBNEc7VUFDMUcyRyxPQUFPLEdBQUFrekIsY0FBQSxDQUFBLEVBQUEsRUFBUXR6QixNQUFSLENBQVAsQ0FBQTtFQUNELE9BRkQsTUFFTztFQUNMSSxRQUFBQSxPQUFPLHFDQUFRQSxPQUFSLENBQUEsRUFBQSxFQUFBLEVBQUE7RUFBaUJKLFVBQUFBLE1BQU0sRUFBTkEsTUFBQUE7V0FBeEIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQUksT0FBT0ksT0FBTyxDQUFDSixNQUFmLEtBQTBCLFFBQTlCLEVBQXdDO1VBQ3RDSSxPQUFPLENBQUNKLE1BQVIsR0FBaUI5RixRQUFRLENBQUNxTixhQUFULENBQXVCbkgsT0FBTyxDQUFDSixNQUEvQixDQUFqQixDQUFBO0VBQ0QsT0FGRCxNQUVPLElBQUlJLE9BQU8sQ0FBQ0osTUFBUixZQUEwQjRrQixLQUE5QixFQUFxQztFQUMxQ3hrQixRQUFBQSxPQUFPLENBQUNKLE1BQVIsR0FBaUJJLE9BQU8sQ0FBQ0osTUFBUixDQUFlQSxNQUFoQyxDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQUksRUFBRUksT0FBTyxDQUFDSixNQUFSLFlBQTBCdkcsV0FBNUIsQ0FBSixFQUE4QztVQUM3Q3NQLE1BQUksQ0FBQ21KLEtBQUwsQ0FBVyxrQ0FBWCxDQUFBLENBQUE7RUFDQSxPQUFBOztFQUVELE1BQUEsT0FBQSxJQUFBLENBQUEsZUFBQSxDQUFBLGNBQUEsQ0FBQSxTQUFBLENBQUEsRUFBQSxNQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBa0I5UixPQUFsQixDQUFBLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O2FBRUUsU0FBb0IsaUJBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNsQixNQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsY0FBQSxDQUFBLFNBQUEsQ0FBQSxFQUFBLG1CQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBOztRQUVBNUcsTUFBTSxDQUFDd0UsZ0JBQVAsQ0FBd0IsUUFBeEIsRUFBa0MsSUFBS2kyQyxDQUFBQSxjQUF2QyxFQUF1RCxLQUF2RCxDQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS2tSLE9BQUwsR0FBZSxJQUFBLENBQUtBLE9BQUwsSUFBZ0JocUQsUUFBUSxDQUFDM0IsTUFBTSxDQUFDb1AsZ0JBQVAsQ0FBd0IsSUFBeEIsQ0FBQSxDQUE4QjhMLGdCQUE5QixDQUErQyxLQUEvQyxDQUFELENBQXZDLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS3l3QyxPQUFMLEdBQWUsSUFBQSxDQUFLQSxPQUFMLElBQWdCLENBQS9CLENBTGtCOztRQU9sQm55QixZQUFZLENBQUMsSUFBRCxFQUFPLFlBQU07RUFDdkIsUUFBQSxNQUFJLENBQUMreEIsT0FBTCxHQUFlNXBELFFBQVEsQ0FBQzNCLE1BQU0sQ0FBQ29QLGdCQUFQLENBQXdCLE1BQUksQ0FBQ3E4QyxRQUE3QixDQUFBLENBQXVDdndDLGdCQUF2QyxDQUF3RCx3QkFBeEQsQ0FBRCxDQUF2QixDQUFBO0VBQ0QsT0FGVyxDQUFaLENBQUE7RUFHRCxLQUFBOzs7YUFFRCxTQUF1QixvQkFBQSxHQUFBO0VBQ3JCLE1BQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxjQUFBLENBQUEsU0FBQSxDQUFBLEVBQUEsc0JBQUEsRUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7O1FBQ0FsYixNQUFNLENBQUM2SixtQkFBUCxDQUEyQixRQUEzQixFQUFxQyxJQUFLNHdDLENBQUFBLGNBQTFDLEVBQTBELEtBQTFELENBQUEsQ0FBQTtFQUNELEtBQUE7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUJ4d0MsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7UUFDNUMsSUFBSXZJLElBQUksS0FBSyxXQUFiLEVBQTBCO1VBQ3hCLE9BQU8sSUFBQSxDQUFLd3dDLGNBQUwsRUFBUCxDQUFBO0VBQ0QsT0FGRCxNQUVPLElBQUl4d0MsSUFBSSxLQUFLLFVBQWIsRUFBeUI7VUFDOUIsSUFBS3VpRCxDQUFBQSxpQkFBTCxJQUEwQmo5QyxNQUFJLENBQUNnQyxXQUFMLENBQWlCLElBQWpCLEVBQXVCLElBQUtpN0MsQ0FBQUEsaUJBQTVCLENBQTFCLENBQUE7RUFDRCxPQUFBOztFQUNELE1BQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxjQUFBLENBQUEsU0FBQSxDQUFBLEVBQUEsMEJBQUEsRUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUErQnZpRCxJQUEvQixFQUFxQ3NJLElBQXJDLEVBQTJDQyxPQUEzQyxDQUFBLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7Ozs7V0FoQkUsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBQSxFQUFBLENBQUEsTUFBQSxDQUFBLGtCQUFBLENBQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxjQUFBLENBQUEsRUFBQSxvQkFBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBcUMsV0FBckMsQ0FBQSxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFlRCxTQUF3QnZJLGdCQUFBQSxDQUFBQSxJQUF4QixFQUE4Qm9aLFFBQTlCLEVBQXdDO0VBQ3RDLE1BQUEsSUFBSSxFQUFFQSxRQUFRLENBQUN4Z0IsU0FBVCxZQUE4QnduRCxlQUFoQyxDQUFKLEVBQXNEO1VBQ3BEOTZDLE1BQUksQ0FBQzhOLGFBQUwsQ0FBbUIsU0FBbkIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFDRHdwQixNQUFBQSxlQUFhLENBQUM1OEIsSUFBRCxDQUFiLEdBQXNCb1osUUFBdEIsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQXVCLEdBQUEsR0FBQTtFQUNyQixNQUFBLE9BQU93akIsZUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBNkIsR0FBQSxHQUFBO0VBQzNCLE1BQUEsT0FBT3dqQixlQUFQLENBQUE7RUFDRCxLQUFBOzs7O0lBM2V5Qy9rQjtBQThlNUMvMUIsUUFBSSxDQUFDNE8sdUJBQUwsQ0FBNkIrc0MsY0FBN0IsRUFBNkMsQ0FBQyxjQUFELENBQTdDLENBQUEsQ0FBQTtFQUVBaHRDLFdBQVcsQ0FBQyt1QyxPQUFaLEdBQXNCL0IsY0FBdEIsQ0FBQTtFQUNBem5ELGNBQWMsQ0FBQ21nQyxNQUFmLENBQXNCLGFBQXRCLEVBQXFDc25CLGNBQXJDLENBQUE7O0VDMWlCQSxJQUFNNzNDLFFBQU0sR0FBRztFQUNiLEVBQUEsZUFBQSxFQUFpQixpQkFESjtFQUViLEVBQUEsd0JBQUEsRUFBMEIsMEJBRmI7SUFHYiwwQkFBNEIsRUFBQSw0QkFBQTtFQUhmLENBQWYsQ0FBQTtFQU1BLElBQU1MLFVBQVEsR0FBR3pELE1BQUksQ0FBQ25DLGFBQUwsQ0FBakIsa0pBQUEsQ0FBQSxDQUFBO0VBT0EsSUFBTTgvQyxPQUFLLEdBQUcsZUFBZCxDQUFBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFDcUJDOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFFRSxTQUFjLGtCQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxrQkFBQSxDQUFBLENBQUE7O0VBQ1osSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTtFQUVBM3pCLElBQUFBLFlBQVksQ0FBTyxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFlBQUE7UUFBQSxPQUFNLEtBQUEsQ0FBS3VOLFFBQUwsRUFBTixDQUFBO0VBQUEsS0FBUCxDQUFaLENBQUE7RUFIWSxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBSWIsR0FBQTs7OzthQUVELFNBQVcsUUFBQSxHQUFBO0VBQ1QsTUFBQSxJQUFJLENBQUMsSUFBQSxDQUFLcW1CLFdBQUwsRUFBTCxFQUF5QjtFQUN2QixRQUFBLElBQUEsQ0FBS3ZQLFNBQUwsR0FBaUI3cUMsVUFBUSxDQUFDcTZDLFNBQVQsQ0FBbUIsSUFBbkIsQ0FBakIsQ0FBQTtFQUNELE9BRkQsTUFFTztVQUNMLElBQUt4UCxDQUFBQSxTQUFMLEdBQWlCdHVDLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFmLEVBQXFCLGVBQXJCLENBQWpCLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUt3MkMsQ0FBQUEsUUFBTCxHQUFnQi85QyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBSyttQyxDQUFBQSxTQUFwQixFQUErQix3QkFBL0IsQ0FBaEIsQ0FBQTtRQUNBLElBQUswUCxDQUFBQSxVQUFMLEdBQWtCaCtDLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFLK21DLENBQUFBLFNBQXBCLEVBQStCLDBCQUEvQixDQUFsQixDQUFBOztFQUVBLE1BQUEsSUFBQSxDQUFLMlAsa0JBQUwsRUFBQSxDQUFBOztFQUNBLE1BQUEsSUFBQSxDQUFLQyxZQUFMLEVBQUEsQ0FBQTs7UUFFQSxJQUFLbGdELENBQUFBLFdBQUwsQ0FBaUIsSUFBQSxDQUFLc3dDLFNBQXRCLENBQUEsQ0FBQTtRQUVBL3BDLFNBQVMsQ0FBQ2hDLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBO0VBQ0FRLE1BQUFBLFlBQVksQ0FBQzgwQixZQUFiLENBQTBCLElBQTFCLEVBQWdDL3pCLFFBQWhDLENBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWMsV0FBQSxHQUFBO1FBQ1osSUFBSSxDQUFDOUQsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsZUFBckIsQ0FBTCxFQUE0QztFQUMxQyxRQUFBLE9BQU8sS0FBUCxDQUFBO0VBQ0QsT0FBQTs7UUFFRCxJQUFNNDJDLFVBQVUsR0FBR24rQyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixlQUFyQixDQUFuQixDQUFBOztRQUVBLElBQUksQ0FBQ3ZILE1BQUksQ0FBQ3VILFNBQUwsQ0FBZTQyQyxVQUFmLEVBQTJCLDBCQUEzQixDQUFMLEVBQTZEO0VBQzNELFFBQUEsT0FBTyxLQUFQLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUksQ0FBQ24rQyxNQUFJLENBQUN1SCxTQUFMLENBQWU0MkMsVUFBZixFQUEyQix3QkFBM0IsQ0FBTCxFQUEyRDtFQUN6RCxRQUFBLE9BQU8sS0FBUCxDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLE9BQU8sSUFBUCxDQUFBO0VBQ0QsS0FBQTs7O0VBTUQsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5QnpqRCxJQUF6QixFQUErQnNJLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QztRQUM1QyxJQUFJdkksSUFBSSxLQUFLLFVBQWIsRUFBeUI7VUFDdkJxSSxZQUFZLENBQUNtMEIsaUJBQWIsQ0FBK0JsMEIsSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDLElBQTlDLEVBQW9EYSxRQUFwRCxDQUFBLENBQUE7RUFDQSxRQUFBLElBQUEsQ0FBS25GLFlBQUwsQ0FBa0JnL0MsT0FBbEIsQ0FBNEIsSUFBQSxJQUFBLENBQUtNLGtCQUFMLEVBQTVCLENBQUE7U0FGRixNQUdPLElBQUl2akQsSUFBSSxLQUFLLE9BQVQsSUFBb0JBLElBQUksS0FBSyxpQkFBakMsRUFBb0Q7RUFDekQsUUFBQSxJQUFBLENBQUt3akQsWUFBTCxFQUFBLENBQUE7RUFDRCxPQUZNLE1BRUEsSUFBSXhqRCxJQUFJLEtBQUtpakQsT0FBYixFQUFvQjtFQUN6QixRQUFBLElBQUEsQ0FBS00sa0JBQUwsRUFBQSxDQUFBO0VBQ0QsT0FBQTtFQUNGLEtBQUE7OzthQUVELFNBQXFCLGtCQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDbkJoMEIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFBO0VBQUEsUUFBQSxPQUFNanFCLE1BQUksQ0FBQ21MLGNBQUwsQ0FBb0IsTUFBcEIsRUFBMEJ3eUMsT0FBMUIsRUFBaUM7RUFBRXg3QyxVQUFBQSxLQUFLLEVBQUUsTUFBSSxDQUFDeEQsWUFBTCxDQUFrQmcvQyxPQUFsQixDQUFBO0VBQVQsU0FBakMsQ0FBTixDQUFBO0VBQUEsT0FBUCxDQUFaLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFlLFlBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNiMXpCLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBTTtVQUN2QixNQUFJLENBQUM4ekIsUUFBTCxDQUFjMzlDLEtBQWQsQ0FBb0J0TyxLQUFwQixHQUE2QixNQUFJLENBQUM2TSxZQUFMLENBQWtCLE9BQWxCLENBQUQsR0FBK0IsTUFBSSxDQUFDb0MsWUFBTCxDQUFrQixPQUFsQixDQUFBLEdBQTZCLEdBQTVELEdBQWtFLElBQTlGLENBQUE7VUFDQSxNQUFJLENBQUNpOUMsVUFBTCxDQUFnQjU5QyxLQUFoQixDQUFzQnRPLEtBQXRCLEdBQThCLE1BQUksQ0FBQzZNLFlBQUwsQ0FBa0IsaUJBQWxCLENBQUEsR0FBdUMsTUFBSSxDQUFDb0MsWUFBTCxDQUFrQixpQkFBbEIsQ0FBQSxHQUF1QyxHQUE5RSxHQUFvRixJQUFsSCxDQUFBO0VBQ0QsT0FIVyxDQUFaLENBQUE7RUFJRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0FTRSxTQUFZLEdBQUEsR0FBQTtRQUNWLE9BQU8zTyxRQUFRLENBQUMsSUFBSzJPLENBQUFBLFlBQUwsQ0FBa0IsT0FBbEIsQ0FBQSxJQUE4QixHQUEvQixDQUFmLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBbEJFLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFVK0ssS0FBVixFQUFpQjtFQUNmLE1BQUEsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQWpCLElBQTZCQSxLQUFLLEdBQUcsQ0FBckMsSUFBMENBLEtBQUssR0FBRyxHQUF0RCxFQUEyRDtVQUN6RDlMLE1BQUksQ0FBQ21KLEtBQUwsQ0FBVyxlQUFYLENBQUEsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS3ZLLENBQUFBLFlBQUwsQ0FBa0IsT0FBbEIsRUFBMkI3SixJQUFJLENBQUNnWSxLQUFMLENBQVdqQixLQUFYLENBQTNCLENBQUEsQ0FBQTtFQUNELEtBQUE7OztXQXFCRCxTQUFxQixHQUFBLEdBQUE7UUFDbkIsT0FBTzFaLFFBQVEsQ0FBQyxJQUFLMk8sQ0FBQUEsWUFBTCxDQUFrQixpQkFBbEIsQ0FBQSxJQUF3QyxHQUF6QyxDQUFmLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBbEJFLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFtQitLLEtBQW5CLEVBQTBCO0VBQ3hCLE1BQUEsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQWpCLElBQTZCQSxLQUFLLEdBQUcsQ0FBckMsSUFBMENBLEtBQUssR0FBRyxHQUF0RCxFQUEyRDtVQUN6RDlMLE1BQUksQ0FBQ21KLEtBQUwsQ0FBVyxlQUFYLENBQUEsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS3ZLLENBQUFBLFlBQUwsQ0FBa0IsaUJBQWxCLEVBQXFDN0osSUFBSSxDQUFDZ1ksS0FBTCxDQUFXakIsS0FBWCxDQUFyQyxDQUFBLENBQUE7RUFDRCxLQUFBOzs7V0FzQkQsU0FBb0IsR0FBQSxHQUFBO0VBQ2xCLE1BQUEsT0FBTyxJQUFLbk4sQ0FBQUEsWUFBTCxDQUFrQmcvQyxPQUFsQixDQUFQLENBQUE7O0VBVkYsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQWtCN3hDLEtBQWxCLEVBQXlCO0VBQ3ZCLE1BQUEsSUFBSUEsS0FBSixFQUFXO0VBQ1QsUUFBQSxJQUFBLENBQUtsTixZQUFMLENBQWtCKytDLE9BQWxCLEVBQXlCLEVBQXpCLENBQUEsQ0FBQTtFQUNELE9BRkQsTUFHSztVQUNILElBQUszOEMsQ0FBQUEsZUFBTCxDQUFxQjI4QyxPQUFyQixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O1dBOUVELFNBQWdDLEdBQUEsR0FBQTtRQUM5QixPQUFPLENBQUMsVUFBRCxFQUFhLE9BQWIsRUFBc0IsaUJBQXRCLEVBQXlDQSxPQUF6QyxDQUFQLENBQUE7RUFDRCxLQUFBOzs7O0lBOUU2QzVwQjtFQWlLaERwbEIsV0FBVyxDQUFDeXZDLFdBQVosR0FBMEJSLGtCQUExQixDQUFBO0VBQ0ExcEQsY0FBYyxDQUFDbWdDLE1BQWYsQ0FBc0Isa0JBQXRCLEVBQTBDdXBCLGtCQUExQyxDQUFBOztFQzNNQSxJQUFNOTVDLFFBQU0sR0FBRztFQUNiLEVBQUEsb0JBQUEsRUFBc0Isc0JBRFQ7RUFFYixFQUFBLGdDQUFBLEVBQWtDLGtDQUZyQjtFQUdiLEVBQUEsNkJBQUEsRUFBK0IsK0JBSGxCO0lBSWIsK0JBQWlDLEVBQUEsaUNBQUE7RUFKcEIsQ0FBZixDQUFBO0VBT0EsSUFBTUwsUUFBUSxHQUFHekQsTUFBSSxDQUFDbkMsYUFBTCxDQUFqQix1UkFBQSxDQUFBLENBQUE7RUFRQSxJQUFNOC9DLEtBQUssR0FBRyxlQUFkLENBQUE7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztNQUNxQlU7Ozs7O0VBRW5CO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUVFLFNBQWMsdUJBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLHVCQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUFwMEIsSUFBQUEsWUFBWSxDQUFPLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsWUFBQTtRQUFBLE9BQU0sS0FBQSxDQUFLdU4sUUFBTCxFQUFOLENBQUE7RUFBQSxLQUFQLENBQVosQ0FBQTtFQUhZLElBQUEsT0FBQSxLQUFBLENBQUE7RUFJYixHQUFBOzs7O0VBTUQsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5Qjk4QixJQUF6QixFQUErQnNJLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QztRQUM1QyxJQUFJdkksSUFBSSxLQUFLLFVBQWIsRUFBeUI7VUFDdkJxSSxZQUFZLENBQUNtMEIsaUJBQWIsQ0FBK0JsMEIsSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDLElBQTlDLEVBQW9EYSxRQUFwRCxDQUFBLENBQUE7RUFDQSxRQUFBLElBQUEsQ0FBS25GLFlBQUwsQ0FBa0JnL0MsS0FBbEIsQ0FBNEIsSUFBQSxJQUFBLENBQUtNLGtCQUFMLEVBQTVCLENBQUE7U0FGRixNQUdPLElBQUl2akQsSUFBSSxLQUFLLE9BQVQsSUFBb0JBLElBQUksS0FBSyxpQkFBakMsRUFBb0Q7RUFDekQsUUFBQSxJQUFBLENBQUt3akQsWUFBTCxFQUFBLENBQUE7RUFDRCxPQUZNLE1BRUEsSUFBSXhqRCxJQUFJLEtBQUtpakQsS0FBYixFQUFvQjtFQUN6QixRQUFBLElBQUEsQ0FBS00sa0JBQUwsRUFBQSxDQUFBO0VBQ0QsT0FBQTtFQUNGLEtBQUE7OzthQUVELFNBQXFCLGtCQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDbkJoMEIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFBO0VBQUEsUUFBQSxPQUFNanFCLE1BQUksQ0FBQ21MLGNBQUwsQ0FBb0IsTUFBcEIsRUFBMEJ3eUMsS0FBMUIsRUFBaUM7RUFBRXg3QyxVQUFBQSxLQUFLLEVBQUUsTUFBSSxDQUFDeEQsWUFBTCxDQUFrQmcvQyxLQUFsQixDQUFBO0VBQVQsU0FBakMsQ0FBTixDQUFBO0VBQUEsT0FBUCxDQUFaLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFlLFlBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNiLE1BQUEsSUFBSSxJQUFLaC9DLENBQUFBLFlBQUwsQ0FBa0IsT0FBbEIsQ0FBSixFQUFnQztVQUM5QnNyQixZQUFZLENBQUMsSUFBRCxFQUFPLFlBQU07RUFDdkIsVUFBQSxJQUFNcTBCLEdBQUcsR0FBR3ZwRCxJQUFJLENBQUNtckMsSUFBTCxDQUFVLE1BQUksQ0FBQ24vQixZQUFMLENBQWtCLE9BQWxCLENBQUEsR0FBNkIsTUFBN0IsR0FBc0MsSUFBaEQsQ0FBWixDQUFBO1lBQ0EsTUFBSSxDQUFDZzlDLFFBQUwsQ0FBYzM5QyxLQUFkLENBQW9CLGtCQUFwQixDQUFBLEdBQTBDaytDLEdBQUcsR0FBRyxZQUFoRCxDQUFBO0VBQ0QsU0FIVyxDQUFaLENBQUE7RUFJRCxPQUFBOztFQUNELE1BQUEsSUFBSSxJQUFLMy9DLENBQUFBLFlBQUwsQ0FBa0IsaUJBQWxCLENBQUosRUFBMEM7VUFDeENzckIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO0VBQ3ZCLFVBQUEsSUFBTXEwQixHQUFHLEdBQUl2cEQsSUFBSSxDQUFDbXJDLElBQUwsQ0FBVSxNQUFJLENBQUNuL0IsWUFBTCxDQUFrQixpQkFBbEIsQ0FBQSxHQUF1QyxNQUF2QyxHQUFnRCxJQUExRCxDQUFiLENBQUE7RUFDQSxVQUFBLE1BQUksQ0FBQ2k5QyxVQUFMLENBQWdCNTlDLEtBQWhCLENBQXNCNFYsT0FBdEIsR0FBZ0MsSUFBaEMsQ0FBQTtZQUNBLE1BQUksQ0FBQ2dvQyxVQUFMLENBQWdCNTlDLEtBQWhCLENBQXNCLGtCQUF0QixDQUFBLEdBQTRDaytDLEdBQUcsR0FBRyxZQUFsRCxDQUFBO0VBQ0QsU0FKVyxDQUFaLENBQUE7RUFLRCxPQU5ELE1BTU87VUFDTHIwQixZQUFZLENBQUMsSUFBRCxFQUFPLFlBQU07RUFDdkIsVUFBQSxNQUFJLENBQUMrekIsVUFBTCxDQUFnQjU5QyxLQUFoQixDQUFzQjRWLE9BQXRCLEdBQWdDLE1BQWhDLENBQUE7RUFDRCxTQUZXLENBQVosQ0FBQTtFQUdELE9BQUE7RUFDRixLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0FTRSxTQUFZLEdBQUEsR0FBQTtRQUNWLE9BQU81akIsUUFBUSxDQUFDLElBQUsyTyxDQUFBQSxZQUFMLENBQWtCLE9BQWxCLENBQUEsSUFBOEIsR0FBL0IsQ0FBZixDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQWxCRSxJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBVStLLEtBQVYsRUFBaUI7RUFDZixNQUFBLElBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFqQixJQUE2QkEsS0FBSyxHQUFHLENBQXJDLElBQTBDQSxLQUFLLEdBQUcsR0FBdEQsRUFBMkQ7VUFDekQ5TCxNQUFJLENBQUNtSixLQUFMLENBQVcsZUFBWCxDQUFBLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUt2SyxDQUFBQSxZQUFMLENBQWtCLE9BQWxCLEVBQTJCN0osSUFBSSxDQUFDZ1ksS0FBTCxDQUFXakIsS0FBWCxDQUEzQixDQUFBLENBQUE7RUFDRCxLQUFBOzs7V0FxQkQsU0FBcUIsR0FBQSxHQUFBO1FBQ25CLE9BQU8xWixRQUFRLENBQUMsSUFBSzJPLENBQUFBLFlBQUwsQ0FBa0IsaUJBQWxCLENBQUEsSUFBd0MsR0FBekMsQ0FBZixDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQWxCRSxJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBbUIrSyxLQUFuQixFQUEwQjtFQUN4QixNQUFBLElBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFqQixJQUE2QkEsS0FBSyxHQUFHLENBQXJDLElBQTBDQSxLQUFLLEdBQUcsR0FBdEQsRUFBMkQ7VUFDekQ5TCxNQUFJLENBQUNtSixLQUFMLENBQVcsZUFBWCxDQUFBLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUt2SyxDQUFBQSxZQUFMLENBQWtCLGlCQUFsQixFQUFxQzdKLElBQUksQ0FBQ2dZLEtBQUwsQ0FBV2pCLEtBQVgsQ0FBckMsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBc0JELFNBQW9CLEdBQUEsR0FBQTtFQUNsQixNQUFBLE9BQU8sSUFBS25OLENBQUFBLFlBQUwsQ0FBa0JnL0MsS0FBbEIsQ0FBUCxDQUFBOztFQVZGLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFrQjd4QyxLQUFsQixFQUF5QjtFQUN2QixNQUFBLElBQUlBLEtBQUosRUFBVztFQUNULFFBQUEsSUFBQSxDQUFLbE4sWUFBTCxDQUFrQisrQyxLQUFsQixFQUF5QixFQUF6QixDQUFBLENBQUE7RUFDRCxPQUZELE1BR0s7VUFDSCxJQUFLMzhDLENBQUFBLGVBQUwsQ0FBcUIyOEMsS0FBckIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTtFQUNGLEtBQUE7OzthQU1ELFNBQVcsUUFBQSxHQUFBO1FBQ1QsSUFBSSxJQUFBLENBQUtFLFdBQUwsRUFBSixFQUF3QjtVQUN0QixJQUFLdlAsQ0FBQUEsU0FBTCxHQUFpQnR1QyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixvQkFBckIsQ0FBakIsQ0FBQTtFQUNELE9BRkQsTUFFTztFQUNMLFFBQUEsSUFBQSxDQUFLK21DLFNBQUwsR0FBaUI3cUMsUUFBUSxDQUFDcTZDLFNBQVQsQ0FBbUIsSUFBbkIsQ0FBakIsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS0MsQ0FBQUEsUUFBTCxHQUFnQi85QyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBSyttQyxDQUFBQSxTQUFwQixFQUErQiw2QkFBL0IsQ0FBaEIsQ0FBQTtRQUNBLElBQUswUCxDQUFBQSxVQUFMLEdBQWtCaCtDLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFLK21DLENBQUFBLFNBQXBCLEVBQStCLCtCQUEvQixDQUFsQixDQUFBOztFQUVBLE1BQUEsSUFBQSxDQUFLMlAsa0JBQUwsRUFBQSxDQUFBOztFQUNBLE1BQUEsSUFBQSxDQUFLQyxZQUFMLEVBQUEsQ0FBQTs7UUFFQSxJQUFLbGdELENBQUFBLFdBQUwsQ0FBaUIsSUFBQSxDQUFLc3dDLFNBQXRCLENBQUEsQ0FBQTtRQUVBL3BDLFNBQVMsQ0FBQ2hDLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBO0VBQ0FRLE1BQUFBLFlBQVksQ0FBQzgwQixZQUFiLENBQTBCLElBQTFCLEVBQWdDL3pCLFFBQWhDLENBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWMsV0FBQSxHQUFBO1FBQ1osSUFBSSxDQUFDOUQsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsb0JBQXJCLENBQUwsRUFBaUQ7RUFDL0MsUUFBQSxPQUFPLEtBQVAsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBTWczQyxHQUFHLEdBQUd2K0MsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsb0JBQXJCLENBQVosQ0FBQTs7UUFFQSxJQUFJLENBQUN2SCxNQUFJLENBQUN1SCxTQUFMLENBQWVnM0MsR0FBZixFQUFvQiwrQkFBcEIsQ0FBTCxFQUEyRDtFQUN6RCxRQUFBLE9BQU8sS0FBUCxDQUFBO0VBQ0QsT0FBQTs7UUFFRCxJQUFJLENBQUN2K0MsTUFBSSxDQUFDdUgsU0FBTCxDQUFlZzNDLEdBQWYsRUFBb0IsNkJBQXBCLENBQUwsRUFBeUQ7RUFDdkQsUUFBQSxPQUFPLEtBQVAsQ0FBQTtFQUNELE9BQUE7O0VBRUQsTUFBQSxPQUFPLElBQVAsQ0FBQTtFQUNELEtBQUE7OztXQXBJRCxTQUFnQyxHQUFBLEdBQUE7UUFDOUIsT0FBTyxDQUFDLFVBQUQsRUFBYSxPQUFiLEVBQXNCLGlCQUF0QixFQUF5Q1osS0FBekMsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7OztJQXpDa0Q1cEI7RUE4S3JEcGxCLFdBQVcsQ0FBQzZ2QyxnQkFBWixHQUErQkgsdUJBQS9CLENBQUE7RUFDQW5xRCxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQix1QkFBdEIsRUFBK0NncUIsdUJBQS9DLENBQUE7O0VDdE5BLElBQU1JLGFBQWEsR0FBRyxTQUF0QixDQUFBO0VBQ0EsSUFBTUMsZUFBZSxHQUFHLFdBQXhCLENBQUE7RUFDQSxJQUFNQyxZQUFZLEdBQUcsUUFBckIsQ0FBQTs7RUFFQSxJQUFNQyxTQUFTLEdBQUcsU0FBWkEsU0FBWSxDQUFDLzNDLEVBQUQsRUFBS2pPLElBQUwsRUFBQTtFQUFBLEVBQUEsT0FBY29ILE1BQUksQ0FBQ21KLEtBQUwsYUFBZXRDLEVBQWYsRUFBQSxhQUFBLENBQUEsQ0FBQSxNQUFBLENBQThCak8sSUFBOUIsQ0FBZCxDQUFBLENBQUE7RUFBQSxDQUFsQixDQUFBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztNQUNxQmltRDs7Ozs7RUFFbkI7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0lBRUUsU0FBYyxlQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxlQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUEsSUFBQSxLQUFBLENBQUtuUixPQUFMLEdBQWUsS0FBQSxDQUFLQSxPQUFMLENBQWF4aEMsSUFBYixDQUFmLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBLElBQUEsS0FBQSxDQUFLeXRCLFlBQUwsR0FBb0IsS0FBQSxDQUFLQSxZQUFMLENBQWtCenRCLElBQWxCLENBQXBCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBLElBQUEsS0FBQSxDQUFLNHlDLFVBQUwsR0FBa0IsS0FBQSxDQUFLQSxVQUFMLENBQWdCNXlDLElBQWhCLENBQWxCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBLElBQUEsS0FBQSxDQUFLbXVDLFNBQUwsR0FBaUIsS0FBQSxDQUFLQSxTQUFMLENBQWVudUMsSUFBZixDQUFqQixzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7O0VBRUEsSUFBQSxLQUFBLENBQUs2eUMsU0FBTCxDQUFlTixhQUFmLEVBQThCLElBQTlCLENBQUEsQ0FBQTs7TUFDQSxLQUFLM1ksQ0FBQUEsS0FBTCxHQVRZOzs7RUFXWixJQUFBLElBQUEscUJBQUEsR0FBc0M5bEMsTUFBSSxDQUFDaVAsc0JBQUwsQ0FBQSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFrQyxNQUFsQyxDQUF0QztVQUFPSyxXQUFQLHlCQUFPQSxXQUFQO1VBQW9CQyxjQUFwQix5QkFBb0JBLGNBQXBCLENBQUE7O01BQ0EsS0FBS3l2QyxDQUFBQSxjQUFMLEdBQXNCMXZDLFdBQXRCLENBQUE7TUFDQSxLQUFLMnZDLENBQUFBLGlCQUFMLEdBQXlCMXZDLGNBQXpCLENBQUE7RUFiWSxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBY2IsR0FBQTs7OzthQUVELFNBQVksU0FBQSxHQUFBO0VBQ1YsTUFBQSxJQUFNeGQsTUFBTSxHQUFHLElBQUtBLENBQUFBLE1BQUwsR0FBYyxJQUE3QixDQUFBO1FBQ0FtTyxNQUFNLENBQUMsSUFBRCxFQUFPO0VBQUVuTyxRQUFBQSxNQUFNLEVBQU5BLE1BQUY7RUFBVW10RCxRQUFBQSxVQUFVLEVBQUVudEQsTUFBQUE7RUFBdEIsT0FBUCxDQUFOLENBQUE7UUFDQSxJQUFLcU8sQ0FBQUEsS0FBTCxDQUFXNFYsT0FBWCxLQUF1QixFQUF2QixJQUE2QixJQUFBLENBQUsrdkIsS0FBTCxFQUE3QixDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxTQUFBLENBQVU5b0MsS0FBVixFQUFpQjtRQUNmLElBQU1rRCxPQUFPLEdBQUcsSUFBQSxDQUFLZy9DLFlBQXJCLENBQUE7O0VBRUEsTUFBQSxJQUFJaC9DLE9BQU8sQ0FBQ3dvQyxTQUFSLEdBQW9CLENBQXhCLEVBQTJCO1VBQ3pCeG9DLE9BQU8sQ0FBQ3dvQyxTQUFSLEdBQW9CLENBQXBCLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxrQkFBQSxDQUFtQnI2QixPQUFuQixFQUE0QjtRQUMxQixPQUFPQSxPQUFPLENBQUNxUyxTQUFSLEtBQXNCLElBQXRCLElBQThCclMsT0FBTyxDQUFDcVMsU0FBUixLQUFzQixNQUEzRCxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxZQUFBLENBQWExakIsS0FBYixFQUFvQjtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNsQixNQUFBLElBQUksQ0FBQ0EsS0FBSyxDQUFDcVIsT0FBUCxJQUFrQixJQUFBLENBQUtzc0IsUUFBM0IsRUFBcUM7RUFDbkMsUUFBQSxPQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQU13a0IsSUFBSSxHQUFHbmlELEtBQUssQ0FBQ3FSLE9BQU4sQ0FBYzJVLE1BQWQsQ0FBcUI3RCxPQUFyQixHQUErQixJQUFLKy9CLENBQUFBLFlBQUwsQ0FBa0J4VyxTQUE5RCxDQUFBO0VBQ0EsTUFBQSxJQUFNMFcsSUFBSSxHQUFHNXVELE1BQU0sQ0FBQzA5QixXQUFwQixDQU5rQjs7UUFRbEIsSUFBTW14QixrQkFBa0IsR0FBRyxDQUEzQixDQUFBO1FBRUEsSUFBS25lLENBQUFBLFdBQUwsR0FBbUJsa0MsS0FBSyxDQUFDbWtDLFFBQU4sSUFBbUJnZSxJQUFJLEdBQUdDLElBQUksR0FBR0Msa0JBQXBELENBQUE7O1FBRUEsSUFBSSxDQUFDLElBQUtuZSxDQUFBQSxXQUFWLEVBQXVCO0VBQ3JCLFFBQUEsSUFBTUUsT0FBTyxHQUFHcGtDLEtBQUssQ0FBQ29rQyxPQUF0QixDQUFBOztVQUNBcGtDLEtBQUssQ0FBQ29rQyxPQUFOLEdBQWdCLFlBQU07WUFDcEJBLE9BQU8sSUFBSUEsT0FBTyxFQUFsQixDQUFBO0VBQ0EsVUFBQSxNQUFJLENBQUNGLFdBQUwsR0FBbUIsSUFBbkIsQ0FGb0I7RUFJcEI7O0VBQ0EsVUFBQSxNQUFJLENBQUMyRSxLQUFMLEVBQUEsQ0FBQTtXQUxGLENBQUE7O0VBUUEsUUFBQSxJQUFJLEtBQUt4RSxrQkFBTCxDQUF3QnJrQyxLQUFLLENBQUNxUixPQUE5QixDQUFKLEVBQTRDO1lBQzFDK3lCLE9BQU8sSUFBSUEsT0FBTyxFQUFsQixDQUFBO1lBQ0Fwa0MsS0FBSyxDQUFDbWtDLFFBQU4sR0FBaUIsSUFBakIsQ0FBQTs7WUFDQSxJQUFLMkUsQ0FBQUEsS0FBTCxHQUgwQzs7RUFJM0MsU0FBQTtFQUNGLE9BQUE7O0VBRUQsTUFBQSxJQUFBLENBQUt3WixZQUFMLEdBQW9CLElBQUtKLENBQUFBLFlBQUwsQ0FBa0J4VyxTQUF0QyxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxPQUFBLENBQVExckMsS0FBUixFQUFlO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ2IsTUFBQSxJQUFJLENBQUNBLEtBQUssQ0FBQ3FSLE9BQVAsSUFBa0IsSUFBQSxDQUFLc3NCLFFBQXZCLElBQW1DLElBQUEsQ0FBS3VHLFdBQXhDLElBQXVELENBQUMsS0FBS0csa0JBQUwsQ0FBd0Jya0MsS0FBSyxDQUFDcVIsT0FBOUIsQ0FBNUQsRUFBb0c7RUFDbEcsUUFBQSxPQUFBO0VBQ0QsT0FIWTs7O0VBTWIsTUFBQSxJQUFJLEtBQUtsTyxLQUFMLENBQVc0VixPQUFYLEtBQXVCLE1BQTNCLEVBQW1DO0VBQ2pDLFFBQUEsSUFBQSxDQUFLK3ZCLEtBQUwsRUFBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRDlvQyxNQUFBQSxLQUFLLENBQUN1YixlQUFOLEVBQUEsQ0FBQTtFQUVBLE1BQWF2YixLQUFLLENBQUNxUixPQUFOLENBQWMyVSxNQUFkLENBQXFCN0QsT0FBckIsR0FBK0IsSUFBSysvQixDQUFBQSxZQUFMLENBQWtCeFcsVUFBOUQ7RUFHQSxNQUFBLElBQU1wSSxNQUFNLEdBQUd4ckMsSUFBSSxDQUFDdXFCLEdBQUwsQ0FBU3JpQixLQUFLLENBQUNxUixPQUFOLENBQWNvUixNQUFkLEdBQXVCLElBQUEsQ0FBSzYvQixZQUFyQyxFQUFtRCxDQUFuRCxDQUFmLENBQUE7O0VBQ0EsTUFBQSxJQUFJaGYsTUFBTSxLQUFLLElBQUtpZixDQUFBQSxtQkFBcEIsRUFBeUM7VUFFdkMsSUFBTUMsRUFBRSxHQUFHLElBQUEsQ0FBS0MsZUFBaEIsQ0FBQTs7RUFDQSxRQUFBLElBQUlELEVBQUUsR0FBRyxDQUFMLElBQVVsZixNQUFNLElBQUlrZixFQUF4QixFQUE0QjtZQUMxQnhpRCxLQUFLLENBQUNxUixPQUFOLENBQWNpVixVQUFkLEVBQUEsQ0FBQTtFQUNBN3VCLFVBQUFBLFlBQVksQ0FBQyxZQUFBO2NBQUEsT0FBTSxNQUFJLENBQUNpckQsT0FBTCxFQUFOLENBQUE7RUFBQSxXQUFELENBQVosQ0FBQTtFQUVELFNBSkQsTUFJTyxJQUFJcGYsTUFBTSxJQUFJLElBQUEsQ0FBS3h1QyxNQUFuQixFQUEyQjtZQUNoQyxJQUFLZ3RELENBQUFBLFNBQUwsQ0FBZUwsZUFBZixDQUFBLENBQUE7RUFFRCxTQUhNLE1BR0E7WUFDTCxJQUFLSyxDQUFBQSxTQUFMLENBQWVOLGFBQWYsQ0FBQSxDQUFBO0VBQ0QsU0FBQTs7VUFFRCxJQUFLbUIsQ0FBQUEsWUFBTCxDQUFrQnJmLE1BQWxCLENBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFVBQUEsQ0FBV3RqQyxLQUFYLEVBQWtCO1FBQ2hCLElBQUksQ0FBQ0EsS0FBSyxDQUFDcVIsT0FBUCxJQUFrQixLQUFLc3NCLFFBQXZCLElBQW1DLElBQUt1RyxDQUFBQSxXQUE1QyxFQUF5RDtFQUN2RCxRQUFBLE9BQUE7RUFDRCxPQUFBOztFQUVEbGtDLE1BQUFBLEtBQUssQ0FBQ3ViLGVBQU4sRUFBQSxDQUFBOztFQUVBLE1BQUEsSUFBSSxJQUFLZ25DLENBQUFBLG1CQUFMLEdBQTJCLENBQS9CLEVBQWtDO1VBQ2hDLElBQU1qZixNQUFNLEdBQUcsSUFBQSxDQUFLaWYsbUJBQXBCLENBQUE7O0VBRUEsUUFBQSxJQUFJamYsTUFBTSxHQUFHLElBQUt4dUMsQ0FBQUEsTUFBbEIsRUFBMEI7RUFDeEIsVUFBQSxJQUFBLENBQUs0dEQsT0FBTCxFQUFBLENBQUE7RUFDRCxTQUZELE1BRU87WUFDTCxJQUFLQyxDQUFBQSxZQUFMLENBQWtCLENBQWxCLEVBQXFCO0VBQUN0bUIsWUFBQUEsT0FBTyxFQUFFLElBQUE7YUFBL0IsQ0FBQSxDQUFBO0VBQ0QsU0FBQTtFQUNGLE9BQUE7RUFDRixLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0FDRSxTQUFlLEdBQUEsR0FBQTtFQUNiLE1BQUEsT0FBTyxLQUFLdW1CLFNBQVosQ0FBQTs7RUFHRixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBYS96QyxLQUFiLEVBQW9CO0VBQ2xCLE1BQUEsSUFBSUEsS0FBSyxJQUFJLEVBQUVBLEtBQUssWUFBWTdQLFFBQW5CLENBQWIsRUFBMkM7RUFDekMyaUQsUUFBQUEsU0FBUyxDQUFDLFVBQUQsRUFBYSxrQkFBYixDQUFULENBQUE7RUFDRCxPQUFBOztRQUNELElBQUtpQixDQUFBQSxTQUFMLEdBQWlCL3pDLEtBQWpCLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFFRSxTQUFVLE9BQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNSLElBQUtpekMsQ0FBQUEsU0FBTCxDQUFlSixZQUFmLENBQUEsQ0FBQTs7RUFDQSxNQUFBLElBQUEsQ0FBS2lCLFlBQUwsQ0FBa0IsSUFBSzd0RCxDQUFBQSxNQUF2QixFQUErQjtFQUFDdW5DLFFBQUFBLE9BQU8sRUFBRSxJQUFBO1NBQXpDLENBQUEsQ0FBQTs7RUFDQSxNQUFBLElBQU03d0IsTUFBTSxHQUFHLElBQUEsQ0FBS3EzQyxRQUFMLElBQWtCLFVBQUE1bEMsSUFBSSxFQUFBO0VBQUEsUUFBQSxPQUFJQSxJQUFJLEVBQVIsQ0FBQTtTQUFyQyxDQUFBOztFQUNBelIsTUFBQUEsTUFBTSxDQUFDLFlBQU07RUFDWCxRQUFBLE1BQUksQ0FBQ20zQyxZQUFMLENBQWtCLENBQWxCLEVBQXFCO0VBQUN0bUIsVUFBQUEsT0FBTyxFQUFFLElBQUE7V0FBL0IsQ0FBQSxDQUFBOztVQUNBLE1BQUksQ0FBQ3lsQixTQUFMLENBQWVOLGFBQWYsQ0FBQSxDQUFBO0VBQ0QsT0FISyxDQUFOLENBQUE7RUFJRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0FTRSxTQUFhLEdBQUEsR0FBQTtRQUNYLE9BQU9yc0QsUUFBUSxDQUFDLElBQUEsQ0FBSzJPLFlBQUwsQ0FBa0IsUUFBbEIsQ0FBK0IsSUFBQSxJQUFoQyxFQUFzQyxFQUF0QyxDQUFmLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBbEJFLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFXK0ssS0FBWCxFQUFrQjtFQUNoQixNQUFBLElBQUksQ0FBQzlMLE1BQUksQ0FBQzZNLFNBQUwsQ0FBZWYsS0FBZixDQUFMLEVBQTRCO0VBQzFCOHlDLFFBQUFBLFNBQVMsQ0FBQyxRQUFELEVBQVcsU0FBWCxDQUFULENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsSUFBQSxDQUFLaGdELFlBQUwsQ0FBa0IsUUFBbEIsRUFBQSxFQUFBLENBQUEsTUFBQSxDQUErQmtOLEtBQS9CLEVBQUEsSUFBQSxDQUFBLENBQUEsQ0FBQTtFQUNELEtBQUE7OztXQXFCRCxTQUFzQixHQUFBLEdBQUE7UUFDcEIsT0FBTzFaLFFBQVEsQ0FBQyxJQUFBLENBQUsyTyxZQUFMLENBQWtCLGtCQUFsQixDQUF5QyxJQUFBLElBQTFDLEVBQWdELEVBQWhELENBQWYsQ0FBQTs7RUFURixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBb0IrSyxLQUFwQixFQUEyQjtFQUN6QixNQUFBLElBQUksQ0FBQzlMLE1BQUksQ0FBQzZNLFNBQUwsQ0FBZWYsS0FBZixDQUFMLEVBQTRCO0VBQzFCOHlDLFFBQUFBLFNBQVMsQ0FBQyxpQkFBRCxFQUFvQixTQUFwQixDQUFULENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsSUFBQSxDQUFLaGdELFlBQUwsQ0FBa0Isa0JBQWxCLEVBQUEsRUFBQSxDQUFBLE1BQUEsQ0FBeUNrTixLQUF6QyxFQUFBLElBQUEsQ0FBQSxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFNRCxTQUFVeWEsU0FBQUEsQ0FBQUEsS0FBVixFQUFpQnc1QixPQUFqQixFQUEwQjtRQUN4QixJQUFNQyxTQUFTLEdBQUcsSUFBQSxDQUFLejVCLEtBQXZCLENBQUE7RUFFQSxNQUFBLElBQUEsQ0FBSzNuQixZQUFMLENBQWtCLE9BQWxCLEVBQTJCMm5CLEtBQTNCLENBQUEsQ0FBQTs7RUFFQSxNQUFBLElBQUksQ0FBQ3c1QixPQUFELElBQVlDLFNBQVMsS0FBSyxJQUFBLENBQUt6NUIsS0FBbkMsRUFBMEM7RUFDeEN2bUIsUUFBQUEsTUFBSSxDQUFDd0ssbUJBQUwsQ0FBeUIsSUFBekIsRUFBK0IsYUFBL0IsRUFBOEM7RUFDNUN5MUMsVUFBQUEsUUFBUSxFQUFFLElBRGtDO0VBRTVDMTVCLFVBQUFBLEtBQUssRUFBRUEsS0FGcUM7RUFHNUN5NUIsVUFBQUEsU0FBUyxFQUFFQSxTQUFBQTtXQUhiLENBQUEsQ0FBQTtFQUtELE9BQUE7RUFDRixLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQVksR0FBQSxHQUFBO0VBQ1YsTUFBQSxPQUFPLElBQUtqL0MsQ0FBQUEsWUFBTCxDQUFrQixPQUFsQixDQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQW1CLEdBQUEsR0FBQTtFQUNqQixNQUFBLE9BQU8sS0FBS3krQyxtQkFBWixDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O2FBRUUsU0FBUSxLQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDTjtFQUNBOXFELE1BQUFBLFlBQVksQ0FBQyxZQUFNO0VBQ2pCLFFBQUEsTUFBSSxDQUFDMEwsS0FBTCxDQUFXNFYsT0FBWCxHQUFxQixFQUFyQixDQUFBOztVQUNBLElBQUksTUFBSSxDQUFDbXBDLFlBQVQsRUFBdUI7WUFDckIsTUFBSSxDQUFDQSxZQUFMLENBQWtCLytDLEtBQWxCLENBQXdCOC9DLFNBQXhCLEdBQUEsR0FBQSxDQUFBLE1BQUEsQ0FBd0MsTUFBSSxDQUFDbnVELE1BQTdDLEVBQUEsSUFBQSxDQUFBLENBQUE7RUFDRCxTQUFBO0VBQ0YsT0FMVyxDQUFaLENBQUE7RUFNRCxLQUFBOzs7YUFFRCxTQUFRLEtBQUEsR0FBQTtFQUNOLE1BQUEsSUFBQSxDQUFLcU8sS0FBTCxDQUFXNFYsT0FBWCxHQUFxQixNQUFyQixDQUFBOztRQUNBLElBQUksSUFBQSxDQUFLbXBDLFlBQVQsRUFBdUI7RUFDckIsUUFBQSxJQUFBLENBQUtBLFlBQUwsQ0FBa0IvK0MsS0FBbEIsQ0FBd0I4L0MsU0FBeEIsR0FBb0MsRUFBcEMsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsWUFBQSxDQUFhM2YsTUFBYixFQUFtQztRQUFBLElBQWRscEMsT0FBYyx1RUFBSixFQUFJLENBQUE7O1FBQ2pDLElBQUksSUFBQSxDQUFLbW9ELG1CQUFMLElBQTRCLENBQTVCLElBQWlDamYsTUFBTSxJQUFJLENBQS9DLEVBQWtEO0VBQ2hELFFBQUEsT0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBS2lmLENBQUFBLG1CQUFMLEdBQTJCamYsTUFBM0IsQ0FBQTtFQUNBLE1BQUEsSUFBTXo1QixHQUFHLEdBQUd6UCxPQUFPLENBQUNpaUMsT0FBUixHQUFrQjtFQUFFcmxCLFFBQUFBLFFBQVEsRUFBRSxFQUFaO0VBQWdCbUUsUUFBQUEsTUFBTSxFQUFFLDZCQUFBO0VBQXhCLE9BQWxCLEdBQTRFLEVBQXhGLENBQUE7RUFDQXBZLE1BQUFBLE1BQUksQ0FBQ3dLLG1CQUFMLENBQXlCLElBQXpCLEVBQStCLE1BQS9CLEVBQXVDO1VBQUUrekIsS0FBSyxFQUFFLENBQUNnQyxNQUFNLEdBQUcsSUFBQSxDQUFLeHVDLE1BQWYsRUFBdUJreEMsT0FBdkIsQ0FBK0IsQ0FBL0IsQ0FBVDtFQUE0Q2p2QixRQUFBQSxnQkFBZ0IsRUFBRWxOLEdBQUFBO1NBQXJHLENBQUEsQ0FBQTtRQUNBLElBQU1xNUMsYUFBYSxHQUFJLElBQUEsQ0FBS3hoRCxZQUFMLENBQWtCLGVBQWxCLENBQXFDLEdBQUEsSUFBckMsR0FBNEMsSUFBQSxDQUFLd2dELFlBQXhFLENBQUE7RUFFQXB1QixNQUFBQSxNQUFNLENBQUNvdkIsYUFBRCxDQUFOLENBQ0cvcUQsS0FESCxDQUNTO0VBQUV1Z0MsUUFBQUEsU0FBUyw2QkFBc0I0SyxNQUF0QixFQUFBLFVBQUEsQ0FBQTtFQUFYLE9BRFQsRUFDOER6NUIsR0FEOUQsQ0FFR21ULENBQUFBLElBRkgsQ0FFUSxZQUFNO1VBQ1ZzbUIsTUFBTSxLQUFLLENBQVgsSUFBZ0JyZ0MsTUFBTSxDQUFDTSxLQUFQLENBQWEyL0MsYUFBYixFQUE0QixzQkFBNUIsQ0FBaEIsQ0FBQTtVQUNBOW9ELE9BQU8sQ0FBQ0gsUUFBUixZQUE0QitFLFFBQTVCLElBQXdDNUUsT0FBTyxDQUFDSCxRQUFSLEVBQXhDLENBQUE7U0FKSixDQUFBLENBQUE7RUFNRCxLQUFBOzs7YUFFRCxTQUFtQixnQkFBQSxHQUFBO0VBQUU7UUFDbkIsSUFBS2twRCxDQUFBQSxpQkFBTCxHQUF5QixJQUF6QixDQUFBOztRQUNBLElBQUs5UyxDQUFBQSxlQUFMLENBQXFCLElBQXJCLENBQUEsQ0FBQTtFQUNELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsZUFBQSxDQUFnQjFwQyxHQUFoQixFQUFxQjtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNuQixNQUFBLElBQU15OEMsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQTUzQyxNQUFNLEVBQUE7RUFBQSxRQUFBLE9BQUksTUFBSSxDQUFDMDJDLFlBQUwsQ0FBQSxFQUFBLENBQUEsTUFBQSxDQUFxQjEyQyxNQUFyQixFQUFBLGVBQUEsQ0FBQSxDQUFBLENBQTRDLFFBQTVDLEVBQXNELE1BQUksQ0FBQzR4QyxTQUEzRCxFQUFzRSxLQUF0RSxDQUFKLENBQUE7U0FBM0IsQ0FBQTs7RUFDQSxNQUFBLElBQU1pRyxRQUFRLEdBQUcsU0FBWEEsUUFBVyxDQUFBNzNDLE1BQU0sRUFBSTtFQUN6QixRQUFBLElBQU1pUCxPQUFPLEdBQUc7RUFBRUEsVUFBQUEsT0FBTyxFQUFFLElBQUE7V0FBM0IsQ0FBQTs7VUFDQSxNQUFJLENBQUNGLGdCQUFMLENBQXNCL08sTUFBdEIsQ0FBQSxDQUE4QixNQUE5QixFQUFzQyxNQUFJLENBQUNpbEMsT0FBM0MsRUFBb0RoMkIsT0FBcEQsQ0FBQSxDQUFBOztVQUNBLE1BQUksQ0FBQ0YsZ0JBQUwsQ0FBc0IvTyxNQUF0QixDQUFBLENBQThCLFdBQTlCLEVBQTJDLE1BQUksQ0FBQ2t4QixZQUFoRCxFQUE4RGppQixPQUE5RCxDQUFBLENBQUE7O1VBQ0EsTUFBSSxDQUFDRixnQkFBTCxDQUFzQi9PLE1BQXRCLENBQUEsQ0FBOEIsU0FBOUIsRUFBeUMsTUFBSSxDQUFDcTJDLFVBQTlDLEVBQTBEcG5DLE9BQTFELENBQUEsQ0FBQTtTQUpGLENBQUE7O1FBT0EsSUFBSSxJQUFBLENBQUtGLGdCQUFULEVBQTJCO1VBQ3pCOG9DLFFBQVEsQ0FBQyxLQUFELENBQVIsQ0FBQTs7VUFDQSxJQUFLOW9DLENBQUFBLGdCQUFMLENBQXNCZ1AsT0FBdEIsRUFBQSxDQUFBOztVQUNBLElBQUtoUCxDQUFBQSxnQkFBTCxHQUF3QixJQUF4QixDQUFBO0VBQ0QsT0FBQTs7UUFDRDZvQyxZQUFZLENBQUMsUUFBRCxDQUFaLENBQUE7O0VBRUEsTUFBQSxJQUFJejhDLEdBQUosRUFBUztFQUNQLFFBQUEsSUFBQSxDQUFLNFQsZ0JBQUwsR0FBd0IsSUFBSUMsZUFBSixDQUFvQixJQUFBLENBQUswbkMsWUFBekIsRUFBdUM7RUFDN0R0NEIsVUFBQUEsZUFBZSxFQUFFLENBRDRDO0VBRTdERSxVQUFBQSxzQkFBc0IsRUFBRSxLQUZxQztZQUc3REUsY0FBYyxFQUFFLENBQUMsSUFBQSxDQUFLbTVCLGlCQUh1QztFQUk3RDFvQyxVQUFBQSxPQUFPLEVBQUUsSUFBQTtFQUpvRCxTQUF2QyxDQUF4QixDQUFBO1VBT0E0b0MsUUFBUSxDQUFDLElBQUQsQ0FBUixDQUFBO1VBQ0FELFlBQVksQ0FBQyxLQUFELENBQVosQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO1FBQ2xCLElBQUtiLENBQUFBLG1CQUFMLEdBQTJCLENBQTNCLENBQUE7UUFDQSxJQUFLTCxDQUFBQSxZQUFMLEdBQW9CLElBQUEsQ0FBS2hvRCxVQUF6QixDQUFBOztRQUVBLElBQUttMkMsQ0FBQUEsZUFBTCxDQUFxQixJQUFyQixDQUFBLENBQUE7O0VBQ0EsTUFBQSxJQUFBLENBQUtpVCxTQUFMLEVBQUEsQ0FBQTs7RUFFQSxNQUFBLElBQUEsQ0FBS3ZCLGNBQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBdUIsb0JBQUEsR0FBQTtFQUNyQixNQUFBLElBQUEsQ0FBS2xaLEtBQUwsRUFBQSxDQUFBOztRQUNBLElBQUt3SCxDQUFBQSxlQUFMLENBQXFCLEtBQXJCLENBQUEsQ0FBQTs7RUFFQSxNQUFBLElBQUEsQ0FBSzJSLGlCQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUJ2a0QsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7RUFDNUMsTUFBQSxJQUFJdkksSUFBSSxLQUFLLFFBQVQsSUFBcUIsSUFBQSxDQUFLeWtELFlBQTlCLEVBQTRDO0VBQzFDLFFBQUEsSUFBQSxDQUFLb0IsU0FBTCxFQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O1dBUkQsU0FBZ0MsR0FBQSxHQUFBO1FBQzlCLE9BQU8sQ0FBQyxRQUFELENBQVAsQ0FBQTtFQUNELEtBQUE7OztXQVFELFNBQW9CLEdBQUEsR0FBQTtFQUNsQixNQUFBLE9BQU8sQ0FBQyxhQUFELEVBQWdCLE1BQWhCLENBQVAsQ0FBQTtFQUNELEtBQUE7Ozs7SUE3WjBDeHNCO0FBZ2E3Qy96QixRQUFJLENBQUM0Tyx1QkFBTCxDQUE2Qml3QyxlQUE3QixFQUE4QyxDQUFDLFVBQUQsRUFBYSxlQUFiLENBQTlDLENBQUEsQ0FBQTtFQUVBbHdDLFdBQVcsQ0FBQzZ4QyxRQUFaLEdBQXVCM0IsZUFBdkIsQ0FBQTtFQUNBM3FELGNBQWMsQ0FBQ21nQyxNQUFmLENBQXNCLGVBQXRCLEVBQXVDd3FCLGVBQXZDLENBQUE7O0VDMWNBLElBQU0vNkMsUUFBTSxHQUFHO0VBQ2IsRUFBQSxFQUFBLEVBQUksVUFEUztFQUViLEVBQUEsZUFBQSxFQUFpQixpQkFGSjtJQUdiLG9CQUFzQixFQUFBLHNCQUFBO0VBSFQsQ0FBZixDQUFBO0VBTUEsSUFBTTI4QyxnQkFBZ0IsR0FBRyxzQkFBekIsQ0FBQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BRXFCQzs7Ozs7SUFFbkIsU0FBYyxZQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxZQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUEsSUFBQSxLQUFBLENBQUtDLFlBQUwsR0FBb0IsS0FBQSxDQUFLQSxZQUFMLENBQWtCejBDLElBQWxCLENBQXBCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBLElBQUEsS0FBQSxDQUFLMDBDLFVBQUwsR0FBa0IsS0FBQSxDQUFLQSxVQUFMLENBQWdCMTBDLElBQWhCLENBQWxCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBLElBQUEsS0FBQSxDQUFLMjBDLGFBQUwsR0FBcUIsS0FBQSxDQUFLQSxhQUFMLENBQW1CMzBDLElBQW5CLENBQXJCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBLElBQUEsS0FBQSxDQUFLNDBDLFdBQUwsR0FBbUIsS0FBQSxDQUFLQSxXQUFMLENBQWlCNTBDLElBQWpCLENBQW5CLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBLElBQUEsS0FBQSxDQUFLNjBDLFFBQUwsR0FBZ0IsS0FBQSxDQUFLdGEsT0FBTCxDQUFhdjZCLElBQWIsQ0FBaEIsc0JBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO0VBQ0EsSUFBQSxLQUFBLENBQUs4MEMsWUFBTCxHQUFvQixLQUFBLENBQUtBLFlBQUwsQ0FBa0I5MEMsSUFBbEIsQ0FBcEIsc0JBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO0VBQ0EsSUFBQSxLQUFBLENBQUsrMEMsVUFBTCxHQUFrQixLQUFBLENBQUtBLFVBQUwsQ0FBZ0IvMEMsSUFBaEIsQ0FBbEIsc0JBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO0VBVFksSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQVViLEdBQUE7Ozs7YUFFRCxTQUFXLFFBQUEsR0FBQTtFQUNULE1BQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQUEsVUFBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTs7RUFDQSxNQUFBLElBQUEsQ0FBS2cxQyxlQUFMLENBQXFCLElBQUEsQ0FBS3ZpRCxZQUFMLENBQWtCLFVBQWxCLENBQXJCLENBQUEsQ0FBQTtFQUNELEtBQUE7RUFFRDs7OzthQUVBLFNBQVUsT0FBQSxHQUFBO1FBQ1IsSUFBTWl0QixLQUFLLEdBQUcsSUFBQSxDQUFLNmlCLE1BQW5CLENBQUE7UUFDQSxJQUFNMFMsU0FBUyxHQUFHLElBQUEsQ0FBS0MsVUFBdkIsQ0FBQTtFQUVBeDFCLE1BQUFBLEtBQUssQ0FBQ3hyQixLQUFOLENBQVlpaEQsY0FBWixHQUFnQyxFQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsR0FBTSxLQUFLQyxNQUEzQyxFQUFBLE9BQUEsQ0FBQSxDQUFBO0VBQ0FILE1BQUFBLFNBQVMsQ0FBQ3IxQyxLQUFWLEdBQWtCLElBQUtBLENBQUFBLEtBQXZCLENBTFE7O0VBUVIsTUFBQSxJQUFLOGYsS0FBSyxDQUFDdk0sR0FBTixLQUFjLEVBQWQsSUFBb0J1TSxLQUFLLENBQUM5ZixLQUFOLEtBQWdCLEdBQXJDLElBQTZDOGYsS0FBSyxDQUFDdk0sR0FBTixLQUFjdU0sS0FBSyxDQUFDOWYsS0FBckUsRUFBNEU7RUFDMUU4ZixRQUFBQSxLQUFLLENBQUNodEIsWUFBTixDQUFtQixPQUFuQixFQUE0QixFQUE1QixDQUFBLENBQUE7RUFDRCxPQUZELE1BRU87VUFDTGd0QixLQUFLLENBQUM1cUIsZUFBTixDQUFzQixPQUF0QixDQUFBLENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsQ0FBQyxLQUFELEVBQVEsS0FBUixFQUFlM0wsT0FBZixDQUF1QixVQUFBMHZDLElBQUksRUFBQTtVQUFBLE9BQUlvYyxTQUFTLENBQUNwYyxJQUFELENBQVQsR0FBa0JuWixLQUFLLENBQUNtWixJQUFELENBQTNCLENBQUE7U0FBM0IsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU9qaEMsUUFBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBZ0IsR0FBQSxHQUFBO0VBQ2QsTUFBQSxPQUFBLHdCQUFBLENBQUEsTUFBQSxDQUNpQixJQUFLbEwsQ0FBQUEsSUFEdEIsRUFDc0MsYUFBQSxDQUFBLENBQUEsTUFBQSxDQUFBLElBQUEsQ0FBSzJpQyxpQkFEM0MsRUFBQSw0RkFBQSxDQUFBLENBQUE7RUFJRCxLQUFBOzs7V0FFRCxTQUF3QixHQUFBLEdBQUE7RUFDdEIsTUFBQSxPQUFPLE9BQVAsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQVcsR0FBQSxHQUFBO0VBQ1QsTUFBQSxPQUFPLE9BQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDs7OztFQUVBLElBQUEsS0FBQSxFQUFBLFNBQUEsWUFBQSxDQUFhcm1DLENBQWIsRUFBZ0I7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDZCxNQUFBLElBQUEsQ0FBS3U1QyxNQUFMLENBQVlqckMsU0FBWixDQUFzQkksR0FBdEIsQ0FBMEI2OEMsZ0JBQTFCLENBQUEsQ0FBQTs7RUFDQS9yRCxNQUFBQSxZQUFZLENBQUMsWUFBQTtFQUFBLFFBQUEsT0FBTSxNQUFJLENBQUMrNUMsTUFBTCxDQUFZbGlCLEtBQVosRUFBTixDQUFBO0VBQUEsT0FBRCxDQUFaLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLGFBQUEsQ0FBY3IzQixDQUFkLEVBQWlCO0VBQ2YsTUFBQSxJQUFBLENBQUt5ckQsWUFBTCxFQUFBLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFVBQUEsQ0FBV3pyRCxDQUFYLEVBQWM7RUFDWixNQUFBLElBQUEsQ0FBS3U1QyxNQUFMLENBQVlqckMsU0FBWixDQUFzQkssTUFBdEIsQ0FBNkI0OEMsZ0JBQTdCLENBQUEsQ0FBQTtFQUNELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsV0FBQSxDQUFZdnJELENBQVosRUFBZTtRQUNiLElBQUswckQsQ0FBQUEsVUFBTCxDQUFnQjFyRCxDQUFoQixDQUFBLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFlBQUEsQ0FBYUEsQ0FBYixFQUFnQjtRQUNkQSxDQUFDLENBQUNrc0MsUUFBRixHQUFhLElBQWIsQ0FBQTtRQUNBbHNDLENBQUMsQ0FBQ29aLE9BQUYsQ0FBVWtLLGVBQVYsRUFBQSxDQUFBOztFQUNBLE1BQUEsSUFBQSxDQUFLaTJCLE1BQUwsQ0FBWWpyQyxTQUFaLENBQXNCSSxHQUF0QixDQUEwQjY4QyxnQkFBMUIsQ0FBQSxDQUFBOztFQUNBLE1BQUEsSUFBQSxDQUFLeHJELGdCQUFMLENBQXNCLE1BQXRCLEVBQThCLEtBQUt5NEMsT0FBbkMsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxPQUFBLENBQVF4NEMsQ0FBUixFQUFXO0VBQ1RBLE1BQUFBLENBQUMsQ0FBQ3NqQixlQUFGLEVBQUEsQ0FBQTtFQUNELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsVUFBQSxDQUFXdGpCLENBQVgsRUFBYztFQUNaLE1BQUEsSUFBQSxDQUFLdTVDLE1BQUwsQ0FBWWpyQyxTQUFaLENBQXNCSyxNQUF0QixDQUE2QjQ4QyxnQkFBN0IsQ0FBQSxDQUFBOztFQUNBLE1BQUEsSUFBQSxDQUFLbm1ELG1CQUFMLENBQXlCLE1BQXpCLEVBQWlDLEtBQUtvekMsT0FBdEMsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBaUIsR0FBQSxHQUFBO0VBQ2YsTUFBQSxPQUFPLElBQUtybEMsQ0FBQUEsUUFBTCxDQUFjLENBQWQsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBYSxHQUFBLEdBQUE7RUFDWDtFQUNBLE1BQUEsSUFBTWdYLEdBQUcsR0FBRyxJQUFBLENBQUtvdkIsTUFBTCxDQUFZcHZCLEdBQVosS0FBb0IsRUFBcEIsR0FBeUIsQ0FBekIsR0FBNkJqdEIsUUFBUSxDQUFDLEtBQUtxOEMsTUFBTCxDQUFZcHZCLEdBQWIsQ0FBakQsQ0FBQTtFQUNBLE1BQUEsSUFBTUMsR0FBRyxHQUFHLElBQUEsQ0FBS212QixNQUFMLENBQVludkIsR0FBWixLQUFvQixFQUFwQixHQUF5QixHQUF6QixHQUErQmx0QixRQUFRLENBQUMsS0FBS3E4QyxNQUFMLENBQVludkIsR0FBYixDQUFuRCxDQUFBO1FBRUEsT0FBTyxDQUFDLEtBQUt4VCxLQUFMLEdBQWF1VCxHQUFkLEtBQXNCQyxHQUFHLEdBQUdELEdBQTVCLENBQVAsQ0FBQTtFQUNELEtBQUE7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUIza0IsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7UUFDNUMsSUFBSXZJLElBQUksS0FBSyxVQUFiLEVBQXlCO1VBQ3ZCLElBQUt3bUQsQ0FBQUEsZUFBTCxDQUFxQmorQyxPQUFyQixDQUFBLENBQUE7RUFDRCxPQUFBOztFQUNELE1BQUEsSUFBQSxDQUFBLGVBQUEsQ0FBQSxZQUFBLENBQUEsU0FBQSxDQUFBLEVBQUEsMEJBQUEsRUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUErQnZJLElBQS9CLEVBQXFDc0ksSUFBckMsRUFBMkNDLE9BQTNDLENBQUEsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLGVBQUEsQ0FBZ0IyM0IsUUFBaEIsRUFBMEI7RUFDeEIsTUFBQSxJQUFJQSxRQUFKLEVBQWM7RUFDWixRQUFBLElBQUEsQ0FBS3AzQixTQUFMLENBQWVJLEdBQWYsQ0FBbUIsaUJBQW5CLENBQUEsQ0FBQTtFQUNELE9BRkQsTUFFTztFQUNMLFFBQUEsSUFBQSxDQUFLSixTQUFMLENBQWVLLE1BQWYsQ0FBc0IsaUJBQXRCLENBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO1FBQ2xCLElBQUt5cEMsQ0FBQUEsZUFBTCxDQUFxQixJQUFyQixDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF1QixvQkFBQSxHQUFBO1FBQ3JCLElBQUtBLENBQUFBLGVBQUwsQ0FBcUIsS0FBckIsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxlQUFBLENBQWdCMXBDLEdBQWhCLEVBQXFCO1FBQ25CLElBQU02RSxNQUFNLEdBQUcsQ0FBQzdFLEdBQUcsR0FBRyxLQUFILEdBQVcsUUFBZixJQUEyQixlQUExQyxDQUFBO1FBQ0E1RCxNQUFJLENBQUN5SSxNQUFELENBQUosQ0FBYSxJQUFiLEVBQW1CLFlBQW5CLEVBQWlDLElBQUtvNEMsQ0FBQUEsYUFBdEMsRUFBcUQ7RUFBRW5wQyxRQUFBQSxPQUFPLEVBQUUsSUFBQTtTQUFoRSxDQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS2pQLE1BQUwsQ0FBQSxDQUFhLFdBQWIsRUFBMEIsS0FBS2s0QyxZQUEvQixDQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS2w0QyxNQUFMLENBQUEsQ0FBYSxTQUFiLEVBQXdCLEtBQUttNEMsVUFBN0IsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtuNEMsTUFBTCxDQUFBLENBQWEsVUFBYixFQUF5QixLQUFLcTRDLFdBQTlCLENBQUEsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLcjRDLE1BQUwsQ0FBQSxDQUFhLFdBQWIsRUFBMEIsS0FBS3U0QyxZQUEvQixDQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS3Y0QyxNQUFMLENBQUEsQ0FBYSxTQUFiLEVBQXdCLEtBQUt3NEMsVUFBN0IsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUt4NEMsTUFBTCxDQUFBLENBQWEsT0FBYixFQUFzQixLQUFLczRDLFFBQTNCLENBQUEsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0E5RUUsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBQSxDQUFRLFVBQVIsQ0FBQSxDQUFBLE1BQUEsQ0FBQSxrQkFBQSxDQUF1QjVTLGdCQUFnQixDQUFDb1Qsa0JBQXhDLENBQUEsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7OztJQTFHdUNwVDtFQXlMMUN4L0IsV0FBVyxDQUFDNnlDLEtBQVosR0FBb0JkLFlBQXBCLENBQUE7RUFDQXhzRCxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixXQUF0QixFQUFtQ3FzQixZQUFuQyxDQUFBOztFQ3ZOQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFFcUJlOzs7Ozs7Ozs7Ozs7SUFBbUIxdEI7RUFHeENwbEIsV0FBVyxDQUFDK3lDLEdBQVosR0FBa0JELFVBQWxCLENBQUE7RUFDQXZ0RCxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixTQUF0QixFQUFpQ290QixVQUFqQyxDQUFBOztFQy9CQSxJQUFNbG9CLGtCQUFnQixHQUFHLFNBQXpCLENBQUE7RUFDQSxJQUFNejFCLFFBQU0sR0FBRztFQUNiLEVBQUEsRUFBQSxFQUFJLFlBRFM7RUFFYixFQUFBLGdCQUFBLEVBQWtCLGtCQUZMO0VBR2IsRUFBQSxpQkFBQSxFQUFtQixtQkFITjtJQUliLGtCQUFvQixFQUFBLG9CQUFBO0VBSlAsQ0FBZixDQUFBOztFQU9BLElBQU0yckIsVUFBVSxHQUFJLFlBQU07SUFDeEIsSUFBSXIzQixDQUFDLEdBQUcsQ0FBUixDQUFBO0lBQ0EsT0FBTyxZQUFBO01BQUEsT0FBTSxrQkFBQSxHQUFzQkEsQ0FBQyxFQUE3QixDQUFBO0tBQVAsQ0FBQTtFQUNELENBSGtCLEVBQW5CLENBQUE7RUFLQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztNQUVxQnVwRDs7Ozs7RUFFbkI7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUdFLFNBQWMsY0FBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsY0FBQSxDQUFBLENBQUE7O0VBQ1osSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTtNQUVBLEtBQUtDLENBQUFBLFVBQUwsR0FBa0JueUIsVUFBVSxFQUE1QixDQUFBO01BQ0EsS0FBS295QixDQUFBQSxPQUFMLEdBQWUsSUFBZixDQUFBO0VBQ0EsSUFBQSxLQUFBLENBQUs1WSxTQUFMLEdBQWlCLEtBQUEsQ0FBS0EsU0FBTCxDQUFlLzhCLElBQWYsQ0FBakIsc0JBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO0VBQ0EsSUFBQSxLQUFBLENBQUs0MUMsa0JBQUwsR0FBMEIsS0FBQSxDQUFLQSxrQkFBTCxDQUF3QjUxQyxJQUF4QixDQUExQixzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFFQStkLElBQUFBLFlBQVksZ0NBQU8sWUFBTTtFQUN2QixNQUFBLEtBQUEsQ0FBS3VOLFFBQUwsRUFBQSxDQUFBOztFQUNBOWlDLE1BQUFBLFlBQVksQ0FBQyxZQUFBO0VBQUEsUUFBQSxPQUFNLEtBQUs2cUMsQ0FBQUEsZ0JBQUwsR0FBd0IsS0FBQSxDQUFLc2lCLE9BQUwsR0FBZSxLQUFBLENBQUtBLE9BQUwsQ0FBYUUsaUJBQWIsRUFBZixHQUFrRCxLQUFBLENBQUtDLG9CQUFMLEVBQWhGLENBQUE7RUFBQSxPQUFELENBQVosQ0FBQTtFQUNELEtBSFcsQ0FBWixDQUFBO0VBUlksSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQVliLEdBQUE7Ozs7YUFFRCxTQUFXLFFBQUEsR0FBQTtRQUNUejlDLFNBQVMsQ0FBQ2hDLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUtpQixTQUFMLENBQWVJLEdBQWYsQ0FBbUIyMUIsa0JBQW5CLENBQUEsQ0FBQTs7RUFFQSxNQUFBLEtBQUssSUFBSTcwQixLQUFLLEdBQUcsSUFBSzJELENBQUFBLFFBQUwsQ0FBYzVSLE1BQWQsR0FBdUIsQ0FBeEMsRUFBMkNpTyxLQUFLLElBQUksQ0FBcEQsRUFBdURBLEtBQUssRUFBNUQsRUFBZ0U7RUFDOUQsUUFBQSxJQUFNK29CLElBQUksR0FBRyxJQUFBLENBQUtwbEIsUUFBTCxDQUFjM0QsS0FBZCxDQUFiLENBQUE7RUFDQStvQixRQUFBQSxJQUFJLENBQUNqcUIsU0FBTCxDQUFlSSxHQUFmLENBQW1CLGVBQW5CLENBQUEsQ0FBQTtFQUVBLFFBQUEsSUFBTWdvQixLQUFLLEdBQUc1ckIsTUFBSSxDQUFDdUgsU0FBTCxDQUFla21CLElBQWYsRUFBcUIsaUJBQXJCLEtBQTJDenRCLE1BQUksQ0FBQzhJLE1BQUwsQ0FBWSxzQkFBWixDQUF6RCxDQUFBO1VBQ0E4aUIsS0FBSyxDQUFDaHpCLElBQU4sR0FBYSxPQUFiLENBQUE7VUFDQWd6QixLQUFLLENBQUM5ZixLQUFOLEdBQWNwSCxLQUFkLENBQUE7VUFDQWtuQixLQUFLLENBQUNseEIsSUFBTixHQUFha3hCLEtBQUssQ0FBQ2x4QixJQUFOLElBQWMsS0FBS2tuRCxVQUFoQyxDQUFBO0VBQ0FoMkIsUUFBQUEsS0FBSyxDQUFDMGpCLE9BQU4sR0FBZ0IsQ0FBQyxJQUFBLENBQUszd0MsWUFBTCxDQUFrQixXQUFsQixDQUFELElBQW1DK0YsS0FBSyxNQUFNLElBQUEsQ0FBS2krQixXQUFMLElBQW9CLENBQTFCLENBQXhELENBQUE7RUFFQSxRQUFBLElBQU0zZ0IsTUFBTSxHQUFHaGlCLE1BQUksQ0FBQ3VILFNBQUwsQ0FBZWttQixJQUFmLEVBQXFCLGtCQUFyQixLQUE0Q3p0QixNQUFJLENBQUM4SSxNQUFMLENBQVksa0JBQVosQ0FBM0QsQ0FBQTs7RUFDQSxRQUFBLElBQUlrWixNQUFNLENBQUN0VyxhQUFQLEtBQXlCK2hCLElBQTdCLEVBQW1DO1lBQ2pDLE9BQU9BLElBQUksQ0FBQzlnQixVQUFaLEVBQXdCO0VBQ3RCcVYsWUFBQUEsTUFBTSxDQUFDaGtCLFdBQVAsQ0FBbUJ5dkIsSUFBSSxDQUFDOWdCLFVBQXhCLENBQUEsQ0FBQTtFQUNELFdBQUE7RUFDRixTQUFBOztVQUVEOGdCLElBQUksQ0FBQ3p2QixXQUFMLENBQWlCNHRCLEtBQWpCLENBQUEsQ0FBQTtVQUNBNkIsSUFBSSxDQUFDenZCLFdBQUwsQ0FBaUJna0IsTUFBakIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRGpmLE1BQUFBLFlBQVksQ0FBQzgwQixZQUFiLENBQTBCLElBQTFCLEVBQWdDL3pCLFFBQWhDLENBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQW9CLGlCQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDbEJtbUIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO0VBQ3ZCLFFBQUEsSUFBSSxNQUFJLENBQUN0ckIsWUFBTCxDQUFrQixXQUFsQixDQUFKLEVBQW9DO1lBQ2xDLElBQU15TCxJQUFJLEdBQUdwSyxNQUFJLENBQUNtRSxVQUFMLENBQWdCLE1BQWhCLEVBQXNCLFVBQXRCLENBQWIsQ0FBQTtFQUNBLFVBQUEsTUFBSSxDQUFDMDlDLE9BQUwsR0FBZXozQyxJQUFJLElBQUlBLElBQUksQ0FBQzVMLGFBQUwsQ0FBbUIsR0FBQSxHQUFNLE1BQUksQ0FBQ3VDLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBekIsQ0FBdkIsQ0FBQTs7RUFDQSxVQUFBLElBQUksQ0FBQyxNQUFJLENBQUM4Z0QsT0FBTixJQUFpQixNQUFJLENBQUNBLE9BQUwsQ0FBYXZnRCxPQUFiLEtBQXlCLFlBQTlDLEVBQTREO2NBQzFEdEIsTUFBSSxDQUFDbUosS0FBTCxDQUFnQyxvQkFBQSxDQUFBLE1BQUEsQ0FBQSxNQUFJLENBQUNwSSxZQUFMLENBQWtCLFdBQWxCLENBQWhDLEVBQUEsYUFBQSxDQUFBLENBQUEsQ0FBQTtFQUNELFdBQUE7O0VBRUQsVUFBQSxNQUFJLENBQUM4Z0QsT0FBTCxDQUFhampELFlBQWIsQ0FBMEIsV0FBMUIsRUFBdUMsRUFBdkMsQ0FBQSxDQUFBOztFQUNBbEssVUFBQUEsWUFBWSxDQUFDLFlBQU07RUFDakIsWUFBQSxJQUFNZ1EsS0FBSyxHQUFHLE1BQUksQ0FBQ205QyxPQUFMLENBQWFFLGlCQUFiLEVBQWQsQ0FBQTs7Y0FDQSxNQUFJLENBQUNFLFdBQUwsQ0FBaUJ2OUMsS0FBakIsQ0FBQSxDQUFBOztjQUNBLE1BQUksQ0FBQ2krQixXQUFMLEdBQW1CaitCLEtBQW5CLENBQUE7RUFDRCxXQUpXLENBQVosQ0FBQTs7WUFNQSxNQUFJLENBQUNtOUMsT0FBTCxDQUFhNXNELGdCQUFiLENBQThCLFdBQTlCLEVBQTJDLE1BQUksQ0FBQzZzRCxrQkFBaEQsQ0FBQSxDQUFBO0VBQ0QsU0FBQTtFQUNGLE9BakJXLENBQVosQ0FBQTtFQW1CQSxNQUFBLElBQUEsQ0FBSzdzRCxnQkFBTCxDQUFzQixRQUF0QixFQUFnQyxLQUFLZzBDLFNBQXJDLENBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQXVCLG9CQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDckJoZixZQUFZLENBQUMsSUFBRCxFQUFPLFlBQU07VUFDdkIsSUFBSSxNQUFJLENBQUM0M0IsT0FBVCxFQUFrQjtZQUNoQixNQUFJLENBQUNBLE9BQUwsQ0FBYXZuRCxtQkFBYixDQUFpQyxXQUFqQyxFQUE4QyxNQUFJLENBQUN3bkQsa0JBQW5ELENBQUEsQ0FBQTs7WUFDQSxNQUFJLENBQUNELE9BQUwsR0FBZSxJQUFmLENBQUE7RUFDRCxTQUFBO0VBQ0YsT0FMVyxDQUFaLENBQUE7RUFNQSxNQUFBLElBQUEsQ0FBS3ZuRCxtQkFBTCxDQUF5QixRQUF6QixFQUFtQyxLQUFLMnVDLFNBQXhDLENBQUEsQ0FBQTtFQUNELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsV0FBQSxDQUFZdmtDLEtBQVosRUFBbUI7UUFDakIsSUFBSzJELENBQUFBLFFBQUwsQ0FBYzNELEtBQWQsQ0FBQSxDQUFxQnc5QyxpQkFBckIsQ0FBdUM1UyxPQUF2QyxHQUFpRCxJQUFqRCxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O2FBQ0UsU0FBZ0I1cUMsZUFBQUEsQ0FBQUEsS0FBaEIsRUFBdUJyTixPQUF2QixFQUFnQztRQUM5QixJQUFJLElBQUEsQ0FBS3dxRCxPQUFULEVBQWtCO1VBQ2hCLE9BQU8sSUFBQSxDQUFLQSxPQUFMLENBQWFNLFlBQWIsQ0FBMEJ6OUMsS0FBMUIsRUFBaUNyTixPQUFqQyxDQUFQLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUs0cUQsQ0FBQUEsV0FBTCxDQUFpQnY5QyxLQUFqQixDQUFBLENBQUE7O1FBQ0EsSUFBSzA5QyxDQUFBQSxXQUFMLENBQWlCMTlDLEtBQWpCLENBQUEsQ0FBQTs7RUFDQSxNQUFBLE9BQU95SSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IxSSxLQUFoQixDQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUF1QixvQkFBQSxHQUFBO0VBQ3JCLE1BQUEsS0FBSyxJQUFJdE0sQ0FBQyxHQUFHLElBQUtpUSxDQUFBQSxRQUFMLENBQWM1UixNQUFkLEdBQXVCLENBQXBDLEVBQXVDMkIsQ0FBQyxJQUFJLENBQTVDLEVBQStDQSxDQUFDLEVBQWhELEVBQW9EO0VBQUU7VUFDcEQsSUFBSSxJQUFBLENBQUtpUSxRQUFMLENBQWNqUSxDQUFkLEVBQWlCOHBELGlCQUFqQixDQUFtQzVTLE9BQXZDLEVBQWdEO0VBQzlDLFVBQUEsT0FBT2wzQyxDQUFQLENBQUE7RUFDRCxTQUFBO0VBQ0YsT0FBQTs7RUFDRCxNQUFBLE9BQU8sQ0FBQyxDQUFSLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFNBQUEsQ0FBVTZFLEtBQVYsRUFBaUI7RUFDZkEsTUFBQUEsS0FBSyxDQUFDdWIsZUFBTixFQUFBLENBQUE7UUFDQSxJQUFLcXBDLENBQUFBLE9BQUwsR0FDSSxJQUFBLENBQUtBLE9BQUwsQ0FBYU0sWUFBYixDQUEwQixJQUFBLENBQUtILG9CQUFMLEVBQTFCLEVBQXVEO0VBQUUzMEMsUUFBQUEsTUFBTSxFQUFFLEtBQUE7U0FBakUsQ0FESixHQUVJLElBQUsrMEMsQ0FBQUEsV0FBTCxDQUFpQixJQUFLSixDQUFBQSxvQkFBTCxFQUFqQixDQUZKLENBQUE7RUFHRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLGtCQUFBLENBQW1CL2tELEtBQW5CLEVBQTBCO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ3hCdkksTUFBQUEsWUFBWSxDQUFDLFlBQU07RUFDakIsUUFBQSxJQUFJLENBQUN1SSxLQUFLLENBQUN5TixNQUFOLENBQWFrc0IsUUFBbEIsRUFBNEI7RUFDMUIsVUFBQSxNQUFJLENBQUNxckIsV0FBTCxDQUFpQmhsRCxLQUFLLENBQUN5SCxLQUF2QixDQUFBLENBQUE7O0VBQ0EsVUFBQSxNQUFJLENBQUMwOUMsV0FBTCxDQUFpQm5sRCxLQUFLLENBQUN5SCxLQUF2QixDQUFBLENBQUE7RUFDRCxTQUFBO0VBQ0YsT0FMVyxDQUFaLENBQUE7RUFNRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFdBQUEsQ0FBWUEsS0FBWixFQUFtQjtFQUNqQjFFLE1BQUFBLE1BQUksQ0FBQ3dLLG1CQUFMLENBQXlCLElBQXpCLEVBQStCLFlBQS9CLEVBQTZDO0VBQzNDOUYsUUFBQUEsS0FBSyxFQUFMQSxLQUQyQztFQUUzQ2krQixRQUFBQSxXQUFXLEVBQUVqK0IsS0FGOEI7VUFHM0NtK0IsZUFBZSxFQUFFLEtBQUt0RCxnQkFIcUI7RUFJM0M4aUIsUUFBQUEsV0FBVyxFQUFFLElBQUEsQ0FBS2g2QyxRQUFMLENBQWMzRCxLQUFkLENBQUE7U0FKZixDQUFBLENBQUE7UUFNQSxJQUFLNjZCLENBQUFBLGdCQUFMLEdBQXdCNzZCLEtBQXhCLENBQUE7UUFDQSxJQUFLaStCLENBQUFBLFdBQUwsR0FBbUJqK0IsS0FBbkIsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUVFLFNBQWtCLEdBQUEsR0FBQTtFQUNoQixNQUFBLE9BQU90UyxRQUFRLENBQUMsSUFBQSxDQUFLMk8sWUFBTCxDQUFrQixjQUFsQixDQUFELENBQWYsQ0FBQTs7RUFHRixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBZ0IrSyxLQUFoQixFQUF1QjtFQUNyQixNQUFBLElBQUlBLEtBQUssS0FBSyxJQUFWLElBQWtCQSxLQUFLLEtBQUtsUyxTQUFoQyxFQUEyQztFQUN6QyxRQUFBLElBQUEsQ0FBS2dGLFlBQUwsQ0FBa0IsY0FBbEIsRUFBa0NrTixLQUFsQyxDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBTUQsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5QnBSLElBQXpCLEVBQStCc0ksSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQzVDLE1BQUEsUUFBUXZJLElBQVI7RUFDRSxRQUFBLEtBQUssT0FBTDtFQUNFc0YsVUFBQUEsTUFBSSxDQUFDcUwsWUFBTCxDQUFrQixJQUFsQixFQUF3Qmt1QixrQkFBeEIsRUFBMEN6MUIsUUFBMUMsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxVQUFMO1lBQ0VmLFlBQVksQ0FBQ20wQixpQkFBYixDQUErQmwwQixJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEMsSUFBOUMsRUFBb0RhLFFBQXBELENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTs7RUFDRixRQUFBLEtBQUssY0FBTDtZQUNFbW1CLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBTTtFQUN2QixZQUFBLElBQUksTUFBSSxDQUFDKzNCLG9CQUFMLE9BQWdDLE1BQUksQ0FBQ3JmLFdBQXpDLEVBQXNEO0VBQ3BELGNBQUEsTUFBSSxDQUFDMmYsZUFBTCxDQUFxQixNQUFJLENBQUMzZixXQUExQixDQUFBLENBQUE7RUFDRCxhQUFBO0VBQ0YsV0FKVyxDQUFaLENBQUE7RUFLQSxVQUFBLE1BQUE7RUFiSixPQUFBO0VBZUQsS0FBQTs7O1dBcEJELFNBQWdDLEdBQUEsR0FBQTtFQUM5QixNQUFBLE9BQU8sQ0FBQyxPQUFELEVBQVUsVUFBVixFQUFzQixjQUF0QixDQUFQLENBQUE7RUFDRCxLQUFBOzs7V0FvQkQsU0FBb0IsR0FBQSxHQUFBO1FBQ2xCLE9BQU8sQ0FBQyxZQUFELENBQVAsQ0FBQTtFQUNELEtBQUE7Ozs7SUE5UHlDNU87QUFpUTVDL3pCLFFBQUksQ0FBQzRPLHVCQUFMLENBQTZCK3lDLGNBQTdCLEVBQTZDLENBQUMsVUFBRCxDQUE3QyxDQUFBLENBQUE7RUFFQWh6QyxXQUFXLENBQUM0ekMsT0FBWixHQUFzQlosY0FBdEIsQ0FBQTtFQUNBenRELGNBQWMsQ0FBQ21nQyxNQUFmLENBQXNCLGFBQXRCLEVBQXFDc3RCLGNBQXJDLENBQUE7O0VDMVNBLElBQU03OUMsUUFBTSxHQUFHO0VBQ2IsRUFBQSxFQUFBLEVBQUksb0JBRFM7SUFFYixlQUFpQixFQUFBLGlCQUFBO0VBRkosQ0FBZixDQUFBO0VBS0EsSUFBTXkxQixrQkFBZ0IsR0FBRyxRQUF6QixDQUFBO0VBRUEsSUFBTTJVLGdCQUFnQixHQUFHLENBQ3ZCLFdBRHVCLEVBRXZCLFVBRnVCLEVBR3ZCLE1BSHVCLEVBSXZCLFVBSnVCLEVBS3ZCLE1BTHVCLEVBTXZCLFVBTnVCLEVBT3ZCLE1BUHVCLENBQXpCLENBQUE7RUFVQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztNQUVxQnNVOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0lBRUUsU0FBYyxhQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxhQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUF2NEIsSUFBQUEsWUFBWSxDQUFPLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQUEsWUFBQTtRQUFBLE9BQU0sS0FBQSxDQUFLdU4sUUFBTCxFQUFOLENBQUE7RUFBQSxLQUFQLENBQVosQ0FBQTs7RUFFQSxJQUFBLEtBQUEsQ0FBS2lyQixjQUFMLEVBQUEsQ0FBQTs7RUFMWSxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBTWIsR0FBQTs7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUIvbkQsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDNUMsTUFBQSxRQUFRdkksSUFBUjtFQUNFLFFBQUEsS0FBSyxPQUFMO0VBQ0VzRixVQUFBQSxNQUFJLENBQUNxTCxZQUFMLENBQWtCLElBQWxCLEVBQXdCa3VCLGtCQUF4QixFQUEwQ3oxQixRQUExQyxDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLFVBQUw7WUFDRWYsWUFBWSxDQUFDbTBCLGlCQUFiLENBQStCbDBCLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QyxJQUE5QyxFQUFvRGEsUUFBcEQsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBO0VBTkosT0FBQTs7RUFTQSxNQUFBLElBQUlvcUMsZ0JBQWdCLENBQUNyN0MsT0FBakIsQ0FBeUI2SCxJQUF6QixDQUFBLElBQWtDLENBQXRDLEVBQXlDO1VBQ3ZDdXZCLFlBQVksQ0FBQyxJQUFELEVBQU8sWUFBQTtZQUFBLE9BQU0sTUFBSSxDQUFDdWtCLHNCQUFMLEVBQU4sQ0FBQTtFQUFBLFNBQVAsQ0FBWixDQUFBO0VBQ0QsT0FBQTtFQUNGLEtBQUE7OztXQUVELFNBQWMsR0FBQSxHQUFBO0VBQ1osTUFBQSxPQUFPLElBQUtod0MsQ0FBQUEsYUFBTCxDQUFtQixRQUFuQixDQUFQLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF5QixzQkFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ3ZCMHZDLE1BQUFBLGdCQUFnQixDQUFDNzRDLE9BQWpCLENBQXlCLFVBQUMwdkMsSUFBRCxFQUFVO0VBQ2pDLFFBQUEsSUFBSSxNQUFJLENBQUNwbUMsWUFBTCxDQUFrQm9tQyxJQUFsQixDQUFKLEVBQTZCO0VBQzNCLFVBQUEsTUFBSSxDQUFDMmQsT0FBTCxDQUFhOWpELFlBQWIsQ0FBMEJtbUMsSUFBMUIsRUFBZ0MsTUFBSSxDQUFDaGtDLFlBQUwsQ0FBa0Jna0MsSUFBbEIsQ0FBaEMsQ0FBQSxDQUFBO0VBQ0QsU0FGRCxNQUdLO0VBQ0gsVUFBQSxNQUFJLENBQUMyZCxPQUFMLENBQWExaEQsZUFBYixDQUE2QitqQyxJQUE3QixDQUFBLENBQUE7RUFDRCxTQUFBO1NBTkgsQ0FBQSxDQUFBO0VBUUQsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OzthQUNFLFNBQVcsUUFBQSxHQUFBO1FBQ1R4Z0MsU0FBUyxDQUFDaEMsT0FBVixDQUFrQixJQUFsQixDQUFBLENBQUE7RUFFQSxNQUFBLElBQUEsQ0FBS2lCLFNBQUwsQ0FBZUksR0FBZixDQUFtQjIxQixrQkFBbkIsQ0FBQSxDQUFBO1FBQ0EsSUFBTW9wQixHQUFHLEdBQUcsSUFBQSxDQUFLRCxPQUFMLElBQWdCdnhELFFBQVEsQ0FBQzBNLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBNUIsQ0FBQTs7UUFDQSxJQUFJLENBQUM4a0QsR0FBRyxDQUFDOXRDLEVBQUwsSUFBVyxLQUFLbFcsWUFBTCxDQUFrQixXQUFsQixDQUFmLEVBQStDO0VBQzdDZ2tELFFBQUFBLEdBQUcsQ0FBQzl0QyxFQUFKLEdBQVMsS0FBSzlULFlBQUwsQ0FBa0IsV0FBbEIsQ0FBVCxDQUFBO0VBQ0QsT0FBQTs7RUFDRDRoRCxNQUFBQSxHQUFHLENBQUNuL0MsU0FBSixDQUFjSSxHQUFkLENBQWtCLGNBQWxCLENBQUEsQ0FBQTs7UUFDQSxJQUFJLENBQUMsSUFBSzgrQyxDQUFBQSxPQUFWLEVBQW1CO1VBQ2pCMWlELE1BQUksQ0FBQ3dKLFNBQUwsQ0FBZSxJQUFBLENBQUtoQyxVQUFwQixDQUFnQ25TLENBQUFBLE9BQWhDLENBQXdDLFVBQUE4SyxPQUFPLEVBQUE7RUFBQSxVQUFBLE9BQUl3aUQsR0FBRyxDQUFDM2tELFdBQUosQ0FBZ0JtQyxPQUFoQixDQUFKLENBQUE7V0FBL0MsQ0FBQSxDQUFBO1VBQ0EsSUFBS25DLENBQUFBLFdBQUwsQ0FBaUIya0QsR0FBakIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRDUvQyxNQUFBQSxZQUFZLENBQUM4MEIsWUFBYixDQUEwQixJQUExQixFQUFnQy96QixRQUFoQyxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFpQixjQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFDZixDQUFDLFVBQUQsRUFBYSxRQUFiLEVBQXVCLFVBQXZCLEVBQW1DLE1BQW5DLEVBQTJDLFNBQTNDLEVBQXNELGVBQXRELEVBQXVFLE1BQXZFLEVBQStFLE9BQS9FLEVBQXdGLE1BQXhGLEVBQWdHLE1BQWhHLEVBQ0d6TyxPQURILENBQ1csVUFBQWlMLEdBQUcsRUFBSTtFQUNkak4sUUFBQUEsTUFBTSxDQUFDdVQsY0FBUCxDQUFzQixNQUF0QixFQUE0QnRHLEdBQTVCLEVBQWlDO0VBQy9CeU8sVUFBQUEsWUFBWSxFQUFFLElBRGlCO0VBRS9CNnJDLFVBQUFBLFVBQVUsRUFBRSxJQUZtQjtFQUcvQi9qRCxVQUFBQSxHQUFHLEVBQUUsU0FBQSxHQUFBLEdBQUE7RUFBQSxZQUFBLE9BQU0sTUFBSSxDQUFDNnJELE9BQUwsQ0FBYXBpRCxHQUFiLENBQU4sQ0FBQTthQUgwQjtFQUkvQm5JLFVBQUFBLEdBQUcsRUFBRSxDQUFDLE1BQUQsRUFBUyxNQUFULENBQWlCdEYsQ0FBQUEsT0FBakIsQ0FBeUJ5TixHQUF6QixDQUFrQyxLQUFBLENBQUMsQ0FBbkMsR0FDRCxVQUFBd0wsS0FBSyxFQUFBO2NBQUEsT0FBSW1lLFlBQVksQ0FBQyxNQUFELEVBQU8sWUFBQTtFQUFBLGNBQUEsT0FBTSxNQUFJLENBQUN5NEIsT0FBTCxDQUFhcGlELEdBQWIsSUFBb0J3TCxLQUExQixDQUFBO0VBQUEsYUFBUCxDQUFoQixDQUFBO0VBQUEsV0FESixHQUVEbFMsU0FBQUE7V0FOTixDQUFBLENBQUE7U0FGSixDQUFBLENBQUE7RUFXRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBSWdwRCxNQUFKLEVBQTBCO1FBQUEsSUFBZGwrQyxLQUFjLHVFQUFOLElBQU0sQ0FBQTs7RUFDeEIsTUFBQSxJQUFBLENBQUtnK0MsT0FBTCxDQUFhOStDLEdBQWIsQ0FBaUJnL0MsTUFBakIsRUFBeUJsK0MsS0FBekIsQ0FBQSxDQUFBO0VBQ0Q7RUFHRDtFQUNBO0VBQ0E7Ozs7RUFDQSxJQUFBLEtBQUEsRUFBQSxTQUFBLE1BQUEsQ0FBT0EsS0FBUCxFQUFjO1FBQ1osSUFBSUEsS0FBSyxLQUFLOUssU0FBZCxFQUF5QjtFQUN2QmczQixRQUFBQSxPQUFPLENBQUN0OUIsU0FBUixDQUFrQnVRLE1BQWxCLENBQXlCclEsSUFBekIsQ0FBOEIsSUFBOUIsQ0FBQSxDQUFBO0VBQ0QsT0FGRCxNQUVPO0VBQ0wsUUFBQSxJQUFBLENBQUtrdkQsT0FBTCxDQUFhNytDLE1BQWIsQ0FBb0JhLEtBQXBCLENBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7V0ExR0QsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBQSxDQUFRLFVBQVIsRUFBb0IsT0FBcEIsQ0FBQSxDQUFBLE1BQUEsQ0FBZ0N3cEMsZ0JBQWhDLENBQUEsQ0FBQTtFQUNELEtBQUE7Ozs7SUFoRndDbmE7RUEyTDNDcGxCLFdBQVcsQ0FBQ2swQyxNQUFaLEdBQXFCTCxhQUFyQixDQUFBO0VBQ0F0dUQsY0FBYyxDQUFDbWdDLE1BQWYsQ0FBc0IsWUFBdEIsRUFBb0NtdUIsYUFBcEMsQ0FBQTs7RUNoUEEsSUFBTWpwQixrQkFBZ0IsR0FBRyxnQ0FBekIsQ0FBQTtFQUVBLElBQU16MUIsUUFBTSxHQUFHO0lBQ2IsRUFBSSxFQUFBLDRCQUFBO0VBRFMsQ0FBZixDQUFBO0VBSUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BQ3FCZy9DOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFFRSxTQUFjLG9CQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxvQkFBQSxDQUFBLENBQUE7O0VBQ1osSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTs7RUFFQSxJQUFBLEtBQUEsQ0FBS3RyQixRQUFMLEVBQUEsQ0FBQTs7RUFDQSxJQUFBLEtBQUEsQ0FBS21GLGFBQUwsR0FBcUIsS0FBQSxDQUFLQyxRQUFMLENBQWMxd0IsSUFBZCxDQUFyQixzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFKWSxJQUFBLE9BQUEsS0FBQSxDQUFBO0VBS2IsR0FBQTs7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUJ4UixJQUF6QixFQUErQnNJLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QztFQUM1QyxNQUFBLFFBQVF2SSxJQUFSO0VBQ0UsUUFBQSxLQUFLLE9BQUw7RUFDRXNGLFVBQUFBLE1BQUksQ0FBQ3FMLFlBQUwsQ0FBa0IsSUFBbEIsRUFBd0JrdUIsa0JBQXhCLEVBQTBDejFCLFFBQTFDLENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTs7RUFDRixRQUFBLEtBQUssVUFBTDtZQUNFZixZQUFZLENBQUNtMEIsaUJBQWIsQ0FBK0JsMEIsSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDLElBQTlDLEVBQW9EYSxRQUFwRCxDQUFBLENBQUE7RUFDQTlELFVBQUFBLE1BQUksQ0FBQ2dDLFdBQUwsQ0FBaUIsSUFBakIsRUFBdUIsTUFBdkIsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxRQUFMO0VBQ0UsVUFBQSxJQUFBLENBQUswNUIsYUFBTCxFQUFBLENBQUE7O0VBVEosT0FBQTtFQVdELEtBQUE7OzthQUVELFNBQW9CLGlCQUFBLEdBQUE7RUFDbEIsTUFBQSxJQUFBLENBQUt6bUMsZ0JBQUwsQ0FBc0IsT0FBdEIsRUFBK0IsSUFBSzBuQyxDQUFBQSxhQUFwQyxFQUFtRCxLQUFuRCxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF1QixvQkFBQSxHQUFBO0VBQ3JCLE1BQUEsSUFBQSxDQUFLcmlDLG1CQUFMLENBQXlCLE9BQXpCLEVBQWtDLElBQUtxaUMsQ0FBQUEsYUFBdkMsRUFBc0QsS0FBdEQsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBZ0IsYUFBQSxHQUFBO1FBQ2QzOEIsTUFBSSxDQUFDc00sWUFBTCxDQUFrQixJQUFsQixDQUFBLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFFBQUEsQ0FBU3BYLENBQVQsRUFBWTtFQUNWQSxNQUFBQSxDQUFDLENBQUNzakIsZUFBRixFQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUFXLFFBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztRQUNUalUsU0FBUyxDQUFDaEMsT0FBVixDQUFrQixJQUFsQixDQUFBLENBQUE7UUFFQWczQixrQkFBZ0IsQ0FBQ2puQyxLQUFqQixDQUF1QixLQUF2QixFQUE4QitDLE9BQTlCLENBQXNDLFVBQUErTixLQUFLLEVBQUE7RUFBQSxRQUFBLE9BQUksTUFBSSxDQUFDSSxTQUFMLENBQWVJLEdBQWYsQ0FBbUJSLEtBQW5CLENBQUosQ0FBQTtTQUEzQyxDQUFBLENBQUE7RUFFQXBELE1BQUFBLE1BQUksQ0FBQ2dDLFdBQUwsQ0FBaUIsSUFBakIsRUFBdUIsTUFBdkIsQ0FBQSxDQUFBOztFQUNBLE1BQUEsSUFBQSxDQUFLMDVCLGFBQUwsRUFBQSxDQUFBOztFQUVBMzRCLE1BQUFBLFlBQVksQ0FBQzgwQixZQUFiLENBQTBCLElBQTFCLEVBQWdDL3pCLFFBQWhDLENBQUEsQ0FBQTtFQUNELEtBQUE7OztXQTNDRCxTQUFnQyxHQUFBLEdBQUE7RUFDOUIsTUFBQSxPQUFPLENBQUMsVUFBRCxFQUFhLFFBQWIsRUFBdUIsT0FBdkIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7OztJQWxDK0Npd0I7QUE4RWxEL3pCLFFBQUksQ0FBQzRPLHVCQUFMLENBQTZCazBDLG9CQUE3QixFQUFtRCxDQUFDLFFBQUQsQ0FBbkQsQ0FBQSxDQUFBO0VBRUFuMEMsV0FBVyxDQUFDbzBDLGFBQVosR0FBNEJELG9CQUE1QixDQUFBO0VBQ0E1dUQsY0FBYyxDQUFDbWdDLE1BQWYsQ0FBc0IscUJBQXRCLEVBQTZDeXVCLG9CQUE3QyxDQUFBOztFQ2pIQSxJQUFNdnBCLGtCQUFnQixHQUFHLFlBQXpCLENBQUE7RUFDQSxJQUFNejFCLFFBQU0sR0FBRztJQUNiLEVBQUksRUFBQSxlQUFBO0VBRFMsQ0FBZixDQUFBO0VBSUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BQ3FCay9DOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUVFLFNBQWMsZ0JBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGdCQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUEvNEIsSUFBQUEsWUFBWSxnQ0FBTyxZQUFNO0VBQ3ZCLE1BQUEsS0FBQSxDQUFLdU4sUUFBTCxFQUFBLENBQUE7RUFDRCxLQUZXLENBQVosQ0FBQTtFQUlBLElBQUEsS0FBQSxDQUFLbUYsYUFBTCxHQUFxQixLQUFBLENBQUtDLFFBQUwsQ0FBYzF3QixJQUFkLENBQXJCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7RUFFQSxJQUFBLElBQUEscUJBQUEsR0FBc0NsTSxNQUFJLENBQUNpUCxzQkFBTCxDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQWtDLE9BQWxDLENBQXRDO1VBQU9LLFdBQVAseUJBQU9BLFdBQVA7VUFBb0JDLGNBQXBCLHlCQUFvQkEsY0FBcEIsQ0FBQTs7TUFDQSxLQUFLc3RCLENBQUFBLGVBQUwsR0FBdUJ2dEIsV0FBdkIsQ0FBQTtNQUNBLEtBQUt3dEIsQ0FBQUEsa0JBQUwsR0FBMEJ2dEIsY0FBMUIsQ0FBQTtFQVhZLElBQUEsT0FBQSxLQUFBLENBQUE7RUFZYixHQUFBOzs7O2FBRUQsU0FBVyxRQUFBLEdBQUE7RUFDVCxNQUFBLElBQUEsQ0FBSy9MLFNBQUwsQ0FBZUksR0FBZixDQUFtQjIxQixrQkFBbkIsQ0FBQSxDQUFBO1FBQ0FoMUIsU0FBUyxDQUFDaEMsT0FBVixDQUFrQixJQUFsQixDQUFBLENBQUE7O0VBQ0EsTUFBQSxJQUFBLENBQUttNUIsYUFBTCxFQUFBLENBQUE7O0VBQ0EzNEIsTUFBQUEsWUFBWSxDQUFDODBCLFlBQWIsQ0FBMEIsSUFBMUIsRUFBZ0MvekIsUUFBaEMsQ0FBQSxDQUFBOztFQUVBLE1BQUEsSUFBSSxJQUFLbkYsQ0FBQUEsWUFBTCxDQUFrQixXQUFsQixDQUFKLEVBQW9DO0VBQ2xDLFFBQUEsSUFBQSxDQUFLc2tELGdCQUFMLENBQXNCLElBQUEsQ0FBS2xpRCxZQUFMLENBQWtCLFdBQWxCLENBQXRCLENBQUEsQ0FBQTtFQUNELE9BRkQsTUFFTztVQUNMLElBQUtraUQsQ0FBQUEsZ0JBQUwsQ0FBc0IsSUFBdEIsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFFRCxNQUFBLElBQUEsQ0FBS3B3QixlQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OztFQU1ELElBQUEsS0FBQSxFQUFBLFNBQUEsd0JBQUEsQ0FBeUJuNEIsSUFBekIsRUFBK0JzSSxJQUEvQixFQUFxQ0MsT0FBckMsRUFBOEM7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDNUMsTUFBQSxRQUFRdkksSUFBUjtFQUNFLFFBQUEsS0FBSyxPQUFMO0VBQ0VzRixVQUFBQSxNQUFJLENBQUNxTCxZQUFMLENBQWtCLElBQWxCLEVBQXdCa3VCLGtCQUF4QixFQUEwQ3oxQixRQUExQyxDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLFVBQUw7WUFDRWYsWUFBWSxDQUFDbTBCLGlCQUFiLENBQStCbDBCLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QyxJQUE5QyxFQUFvRGEsUUFBcEQsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxRQUFMO1lBQ0VtbUIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFBO2NBQUEsT0FBTSxNQUFJLENBQUN5UixhQUFMLEVBQU4sQ0FBQTtFQUFBLFdBQVAsQ0FBWixDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxXQUFMO1lBQ0V6UixZQUFZLENBQUMsSUFBRCxFQUFPLFlBQUE7RUFBQSxZQUFBLE9BQU0sTUFBSSxDQUFDZzVCLGdCQUFMLENBQXNCaGdELE9BQXRCLENBQU4sQ0FBQTtFQUFBLFdBQVAsQ0FBWixDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxVQUFMO1lBQ0VnbkIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFBO2NBQUEsT0FBTSxNQUFJLENBQUM0SSxlQUFMLEVBQU4sQ0FBQTtFQUFBLFdBQVAsQ0FBWixDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxNQUFMO1lBQ0UsSUFBSSxDQUFDLElBQUtxd0IsQ0FBQUEscUJBQVYsRUFBaUM7Y0FDL0JqNUIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFBO0VBQUEsY0FBQSxPQUFNLE1BQUksQ0FBQ2s1QixXQUFMLENBQWlCbmdELElBQWpCLENBQU4sQ0FBQTtFQUFBLGFBQVAsQ0FBWixDQUFBO0VBQ0QsV0FBQTs7RUFDRCxVQUFBLE1BQUE7RUFwQkosT0FBQTtFQXNCRCxLQUFBOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO0VBQ2xCLE1BQUEsSUFBQSxDQUFLL04sZ0JBQUwsQ0FBc0IsT0FBdEIsRUFBK0IsSUFBSzBuQyxDQUFBQSxhQUFwQyxFQUFtRCxLQUFuRCxDQUFBLENBQUE7O0VBQ0EsTUFBQSxJQUFBLENBQUtFLGVBQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBdUIsb0JBQUEsR0FBQTtFQUNyQixNQUFBLElBQUEsQ0FBS3ZpQyxtQkFBTCxDQUF5QixPQUF6QixFQUFrQyxJQUFLcWlDLENBQUFBLGFBQXZDLEVBQXNELEtBQXRELENBQUEsQ0FBQTs7RUFDQSxNQUFBLElBQUEsQ0FBS0csa0JBQUwsRUFBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBWSxHQUFBLEdBQUE7UUFDVixPQUFPOThCLE1BQUksQ0FBQ3dKLFNBQUwsQ0FBZSxLQUFLdkYsZ0JBQUwsQ0FBc0IscUJBQXRCLENBQWYsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBVyxHQUFBLEdBQUE7RUFDVCxNQUFBLE9BQU9qRSxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixTQUFyQixDQUFQLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFFBQUEsQ0FBU3RLLEtBQVQsRUFBZ0I7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDZHRJLE1BQUFBLFVBQVUsQ0FBQyxZQUFNO0VBQ2YsUUFBQSxJQUFJLENBQUNzSSxLQUFLLENBQUM4L0IsZ0JBQVAsSUFBMkIsQ0FBQyxNQUFJLENBQUNuQyxRQUFqQyxJQUE2QyxNQUFJLENBQUN0TCxPQUF0RCxFQUErRDtZQUM3RCxPQUFPLE1BQUksQ0FBQzh6QixXQUFMLEVBQVAsQ0FBQTtFQUNELFNBQUE7RUFDRixPQUpTLENBQVYsQ0FBQTtFQUtELEtBQUE7OzthQUVELFNBQVEsS0FBQSxHQUFBO1FBQ04sSUFBSSxDQUFDLElBQUtDLENBQUFBLE1BQVYsRUFBa0I7VUFDaEIsT0FBTyxJQUFBLENBQUtqM0IsSUFBTCxFQUFQLENBQUE7RUFDRCxPQUFBOztRQUNELE9BQU9qZixPQUFPLENBQUNDLE9BQVIsRUFBUCxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBUSxLQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDTixNQUFBLE9BQU8sSUFBSUQsT0FBSixDQUFZLFVBQUFDLE9BQU8sRUFBSTtFQUM1QixRQUFBLElBQUksQ0FBQyxNQUFJLENBQUNpMkMsTUFBVixFQUFrQjtFQUNoQjN1RCxVQUFBQSxZQUFZLENBQUMsWUFBQTtFQUFBLFlBQUEsT0FBTSxNQUFJLENBQUNxM0IsSUFBTCxHQUFZM0IsSUFBWixDQUFpQmhkLE9BQWpCLENBQU4sQ0FBQTtFQUFBLFdBQUQsQ0FBWixDQUFBO0VBQ0QsU0FGRCxNQUVPO1lBQ0xBLE9BQU8sRUFBQSxDQUFBO0VBQ1IsU0FBQTtFQUNGLE9BTk0sQ0FBUCxDQUFBO0VBT0QsS0FBQTs7O2FBRUQsU0FBZ0IsYUFBQSxHQUFBO1FBQ2QsSUFBSSxJQUFBLENBQUtrMkMsSUFBVCxFQUFlO1VBQ2IsSUFBSzNrRCxDQUFBQSxZQUFMLENBQWtCLFFBQWxCLENBQUEsR0FBOEIsS0FBSzJrRCxJQUFMLENBQVUxa0QsWUFBVixDQUF1QixRQUF2QixFQUFpQyxFQUFqQyxDQUE5QixHQUFxRSxJQUFLMGtELENBQUFBLElBQUwsQ0FBVXRpRCxlQUFWLENBQTBCLFFBQTFCLENBQXJFLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxnQkFBQSxDQUFpQjJmLFNBQWpCLEVBQTRCO1FBQzFCLElBQU10WSxRQUFRLEdBQUcsSUFBQSxDQUFLazdDLEtBQXRCLENBQUE7O0VBQ0EsTUFBQSxLQUFLLElBQUluckQsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2lRLFFBQVEsQ0FBQzVSLE1BQTdCLEVBQXFDMkIsQ0FBQyxFQUF0QyxFQUEwQztFQUN4QzhILFFBQUFBLE1BQU0sQ0FBQ21JLFFBQVEsQ0FBQ2pRLENBQUQsQ0FBVCxFQUFjO0VBQ2xCb3JELFVBQUFBLGVBQWUsRUFBRSxFQUFBLEdBQUtwckQsQ0FBTCxHQUFTLElBRFI7RUFFbEI2OEIsVUFBQUEsTUFBTSxFQUFFLE1BRlU7RUFHbEIzZSxVQUFBQSxLQUFLLEVBQUUsTUFIVztFQUlsQjBlLFVBQUFBLEdBQUcsRUFBRSxNQUphO0VBS2xCM2UsVUFBQUEsSUFBSSxFQUFFLE1BQUE7RUFMWSxTQUFkLENBQU4sQ0FBQTtFQU9ELE9BQUE7O0VBQ0QsTUFBQSxRQUFRc0ssU0FBUjtFQUNFLFFBQUEsS0FBSyxJQUFMO0VBQ0UsVUFBQSxLQUFLLElBQUl2b0IsRUFBQyxHQUFHLENBQWIsRUFBZ0JBLEVBQUMsR0FBR2lRLFFBQVEsQ0FBQzVSLE1BQTdCLEVBQXFDMkIsRUFBQyxFQUF0QyxFQUEwQztFQUN4Q2lRLFlBQUFBLFFBQVEsQ0FBQ2pRLEVBQUQsQ0FBUixDQUFZZ0ksS0FBWixDQUFrQjYwQixNQUFsQixHQUEyQixFQUFLLEdBQUEsRUFBQSxHQUFLNzhCLEVBQVYsR0FBYyxJQUF6QyxDQUFBO2NBQ0FpUSxRQUFRLENBQUNqUSxFQUFELENBQVIsQ0FBWWdJLEtBQVosQ0FBa0JrVyxLQUFsQixHQUEwQixLQUExQixDQUFBO0VBQ0QsV0FBQTs7RUFDRCxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLE1BQUw7RUFDRSxVQUFBLEtBQUssSUFBSWxlLEdBQUMsR0FBRyxDQUFiLEVBQWdCQSxHQUFDLEdBQUdpUSxRQUFRLENBQUM1UixNQUE3QixFQUFxQzJCLEdBQUMsRUFBdEMsRUFBMEM7RUFDeENpUSxZQUFBQSxRQUFRLENBQUNqUSxHQUFELENBQVIsQ0FBWWdJLEtBQVosQ0FBa0I0MEIsR0FBbEIsR0FBd0IsRUFBSyxHQUFBLEVBQUEsR0FBSzU4QixHQUFWLEdBQWMsSUFBdEMsQ0FBQTtjQUNBaVEsUUFBUSxDQUFDalEsR0FBRCxDQUFSLENBQVlnSSxLQUFaLENBQWtCaVcsSUFBbEIsR0FBeUIsS0FBekIsQ0FBQTtFQUNELFdBQUE7O0VBQ0QsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxNQUFMO0VBQ0UsVUFBQSxLQUFLLElBQUlqZSxHQUFDLEdBQUcsQ0FBYixFQUFnQkEsR0FBQyxHQUFHaVEsUUFBUSxDQUFDNVIsTUFBN0IsRUFBcUMyQixHQUFDLEVBQXRDLEVBQTBDO2NBQ3hDaVEsUUFBUSxDQUFDalEsR0FBRCxDQUFSLENBQVlnSSxLQUFaLENBQWtCNDBCLEdBQWxCLEdBQXdCLEtBQXhCLENBQUE7RUFDQTNzQixZQUFBQSxRQUFRLENBQUNqUSxHQUFELENBQVIsQ0FBWWdJLEtBQVosQ0FBa0JrVyxLQUFsQixHQUEwQixFQUFLLEdBQUEsRUFBQSxHQUFLbGUsR0FBVixHQUFjLElBQXhDLENBQUE7RUFDRCxXQUFBOztFQUNELFVBQUEsTUFBQTs7RUFDRixRQUFBLEtBQUssT0FBTDtFQUNFLFVBQUEsS0FBSyxJQUFJQSxHQUFDLEdBQUcsQ0FBYixFQUFnQkEsR0FBQyxHQUFHaVEsUUFBUSxDQUFDNVIsTUFBN0IsRUFBcUMyQixHQUFDLEVBQXRDLEVBQTBDO2NBQ3hDaVEsUUFBUSxDQUFDalEsR0FBRCxDQUFSLENBQVlnSSxLQUFaLENBQWtCNDBCLEdBQWxCLEdBQXdCLEtBQXhCLENBQUE7RUFDQTNzQixZQUFBQSxRQUFRLENBQUNqUSxHQUFELENBQVIsQ0FBWWdJLEtBQVosQ0FBa0JpVyxJQUFsQixHQUF5QixFQUFLLEdBQUEsRUFBQSxHQUFLamUsR0FBVixHQUFjLElBQXZDLENBQUE7RUFDRCxXQUFBOztFQUNELFVBQUEsTUFBQTs7RUFDRixRQUFBO1lBQ0U0SCxNQUFJLENBQUNtSixLQUFMLENBQVcsa0RBQVgsQ0FBQSxDQUFBO0VBMUJKLE9BQUE7RUE0QkQsS0FBQTs7O2FBRUQsU0FBa0IsZUFBQSxHQUFBO0VBQ2hCLE1BQUEsSUFBTXlDLFFBQVEsR0FBRyxJQUFBLENBQUs3SyxZQUFMLENBQWtCLFVBQWxCLENBQWpCLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS3lDLFNBQUwsQ0FBZUssTUFBZixDQUNFLGdCQURGLEVBRUUsb0JBRkYsRUFHRSxtQkFIRixFQUlFLGlCQUpGLEVBS0Usa0JBTEYsRUFNRSxxQkFORixDQUFBLENBQUE7O0VBT0EsTUFBQSxRQUFRK0gsUUFBUjtFQUNFLFFBQUEsS0FBSyxXQUFMLENBQUE7RUFDQSxRQUFBLEtBQUssV0FBTDtFQUNFLFVBQUEsSUFBQSxDQUFLcEksU0FBTCxDQUFlSSxHQUFmLENBQW1CLGlCQUFuQixDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLFVBQUwsQ0FBQTtFQUNBLFFBQUEsS0FBSyxVQUFMO0VBQ0UsVUFBQSxJQUFBLENBQUtKLFNBQUwsQ0FBZUksR0FBZixDQUFtQixnQkFBbkIsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxjQUFMLENBQUE7RUFDQSxRQUFBLEtBQUssY0FBTDtFQUNFLFVBQUEsSUFBQSxDQUFLSixTQUFMLENBQWVJLEdBQWYsQ0FBbUIsb0JBQW5CLENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTs7RUFDRixRQUFBLEtBQUssYUFBTCxDQUFBO0VBQ0EsUUFBQSxLQUFLLGFBQUw7RUFDRSxVQUFBLElBQUEsQ0FBS0osU0FBTCxDQUFlSSxHQUFmLENBQW1CLG1CQUFuQixDQUFBLENBQUE7RUFDQSxVQUFBLE1BQUE7O0VBQ0YsUUFBQSxLQUFLLFlBQUwsQ0FBQTtFQUNBLFFBQUEsS0FBSyxZQUFMO0VBQ0UsVUFBQSxJQUFBLENBQUtKLFNBQUwsQ0FBZUksR0FBZixDQUFtQixrQkFBbkIsQ0FBQSxDQUFBO0VBQ0EsVUFBQSxNQUFBOztFQUNGLFFBQUEsS0FBSyxlQUFMLENBQUE7RUFDQSxRQUFBLEtBQUssZUFBTDtFQUNFLFVBQUEsSUFBQSxDQUFLSixTQUFMLENBQWVJLEdBQWYsQ0FBbUIscUJBQW5CLENBQUEsQ0FBQTtFQUNBLFVBQUEsTUFBQTtFQXhCSixPQUFBO0VBNEJELEtBQUE7OzthQUVELFNBQWdCLGFBQUEsR0FBQTtFQUNkLE1BQUEsSUFBTXNpQyxRQUFRLEdBQUcsQ0FBQyxJQUFBLENBQUtubEMsWUFBTCxDQUFrQixVQUFsQixDQUFpQyxJQUFBLEVBQWxDLEVBQXNDbE8sT0FBdEMsQ0FBOEMsUUFBOUMsS0FBMkQsQ0FBNUUsQ0FBQTtFQUNBLE1BQUEsSUFBTXN6QyxTQUFTLEdBQUdELFFBQVEsR0FBQSxvQkFBQSxDQUFBLE1BQUEsQ0FBd0JsbUMsTUFBSSxDQUFDcUcsT0FBTCxDQUFhQyxTQUFiLElBQTBCLENBQWxELEVBQUEsV0FBQSxDQUFBLEdBQWlFLEVBQTNGLENBQUE7RUFDQSxNQUFBLE9BQU82L0IsU0FBUCxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O2FBQ0UsU0FBTyxJQUFBLEdBQUE7UUFDTCxJQUFLbWQsQ0FBQUEsSUFBTCxDQUFVbDNCLElBQVYsRUFBQSxDQUFBOztRQUNBbHNCLE1BQU0sQ0FBQyxJQUFELEVBQU87RUFBRXkxQixRQUFBQSxTQUFTLEVBQUUsSUFBSzh0QixDQUFBQSxhQUFBQTtFQUFsQixPQUFQLENBQU4sQ0FBQTtRQUNBLE9BQU90MkMsT0FBTyxDQUFDQyxPQUFSLEVBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OzthQUNFLFNBQU8sSUFBQSxHQUFBO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ0wsTUFBQSxPQUFPLElBQUtzMkMsQ0FBQUEsU0FBTCxFQUFpQnQ1QixDQUFBQSxJQUFqQixDQUFzQixZQUFBO0VBQUEsUUFBQSxPQUFLLE1BQUksQ0FBQ2s1QixJQUFMLENBQVV2M0IsSUFBVixFQUFMLENBQUE7RUFBQSxPQUF0QixDQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUFZLFNBQUEsR0FBQTtRQUNWLElBQU0vb0IsSUFBSSxHQUFHLElBQUEsQ0FBS2tQLElBQWxCLENBQUE7UUFDQSxJQUFLZ3hDLENBQUFBLHFCQUFMLEdBQTZCLElBQTdCLENBQUE7UUFDQSxJQUFLaHhDLENBQUFBLElBQUwsR0FBWSxJQUFaLENBQUE7UUFDQSxJQUFLZ3hDLENBQUFBLHFCQUFMLEdBQTZCLEtBQTdCLENBQUE7RUFFQSxNQUFBLE9BQU8sSUFBS0MsQ0FBQUEsV0FBTCxDQUFpQm5nRCxJQUFqQixDQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7YUFDRSxTQUFZLFNBQUEsR0FBQTtRQUNWLElBQU1BLElBQUksR0FBRyxJQUFBLENBQUtrUCxJQUFsQixDQUFBO1FBQ0EsSUFBS2d4QyxDQUFBQSxxQkFBTCxHQUE2QixJQUE3QixDQUFBO1FBQ0EsSUFBS2h4QyxDQUFBQSxJQUFMLEdBQVksS0FBWixDQUFBO1FBQ0EsSUFBS2d4QyxDQUFBQSxxQkFBTCxHQUE2QixLQUE3QixDQUFBO0VBRUEsTUFBQSxPQUFPLElBQUtDLENBQUFBLFdBQUwsQ0FBaUJuZ0QsSUFBakIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxXQUFBLENBQVlBLElBQVosRUFBa0I7RUFDaEI7UUFDQSxJQUFJLElBQUEsQ0FBS2tQLElBQVQsRUFBZTtFQUNiLFFBQUEsSUFBSSxJQUFLdlQsQ0FBQUEsWUFBTCxDQUFrQixXQUFsQixDQUFKLEVBQW9DO0VBQ2xDLFVBQUEsSUFBQSxDQUFLc2tELGdCQUFMLENBQXNCLElBQUEsQ0FBS2xpRCxZQUFMLENBQWtCLFdBQWxCLENBQXRCLENBQUEsQ0FBQTtFQUNELFNBRkQsTUFFTztZQUNMLElBQUtraUQsQ0FBQUEsZ0JBQUwsQ0FBc0IsSUFBdEIsQ0FBQSxDQUFBO0VBQ0QsU0FBQTtFQUNGLE9BQUE7O1FBRUQsSUFBSVUsVUFBVSxHQUFHLENBQWpCLENBQUE7O0VBQ0EsTUFBQSxJQUFJM2dELElBQUksS0FBSyxJQUFLa1AsQ0FBQUEsSUFBbEIsRUFBd0I7RUFBRTtVQUN4QixJQUFNN0osUUFBUSxHQUFHLElBQUEsQ0FBS2s3QyxLQUF0QixDQUFBOztFQUNBLFFBQUEsS0FBSyxJQUFJbnJELENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdpUSxRQUFRLENBQUM1UixNQUE3QixFQUFxQzJCLENBQUMsRUFBdEMsRUFBMEM7RUFDeEMsVUFBQSxJQUFNOGIsS0FBSyxHQUFHLEVBQU0sSUFBQSxJQUFBLENBQUtoQyxJQUFMLEdBQVk5WixDQUFaLEdBQWdCaVEsUUFBUSxDQUFDNVIsTUFBVCxHQUFrQjJCLENBQXhDLENBQWQsQ0FBQTtFQUNBdXJELFVBQUFBLFVBQVUsSUFBSXp2QyxLQUFkLENBQUE7RUFDQWhVLFVBQUFBLE1BQU0sQ0FBQ21JLFFBQVEsQ0FBQ2pRLENBQUQsQ0FBVCxFQUFjO0VBQ2xCdTlCLFlBQUFBLFNBQVMsa0JBQVcsSUFBS3pqQixDQUFBQSxJQUFMLEdBQVksQ0FBWixHQUFnQixDQUEzQixFQURTLEdBQUEsQ0FBQTtjQUVsQnN4QyxlQUFlLEVBQUV0dkMsS0FBSyxHQUFHLElBQUE7RUFGUCxXQUFkLENBQU4sQ0FBQTtFQUlELFNBQUE7O0VBQ0R5dkMsUUFBQUEsVUFBVSxJQUFJLEVBQWQsQ0FBQTtVQUVBM2pELE1BQUksQ0FBQ3dLLG1CQUFMLENBQXlCLElBQXpCLEVBQStCLEtBQUswSCxJQUFMLEdBQVksTUFBWixHQUFxQixPQUFwRCxDQUFBLENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsSUFBTWpGLFFBQVEsR0FBR2pOLE1BQUksQ0FBQ2dOLEtBQUwsRUFBakIsQ0FBQTtFQUNBclksTUFBQUEsVUFBVSxDQUFDc1ksUUFBUSxDQUFDRyxPQUFWLEVBQW1CdTJDLFVBQW5CLENBQVYsQ0FBQTtRQUNBLE9BQU8xMkMsUUFBUSxDQUFDQyxPQUFoQixDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBWUUsU0FBZSxHQUFBLEdBQUE7RUFDYixNQUFBLE9BQU8sSUFBS3ZPLENBQUFBLFlBQUwsQ0FBa0IsVUFBbEIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBdEJFLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUFhbU4sS0FBYixFQUFvQjtFQUNsQixNQUFBLElBQUlBLEtBQUosRUFBVztFQUNULFFBQUEsSUFBQSxDQUFLNDNDLFNBQUwsRUFBQSxDQUFBO0VBQ0QsT0FBQTs7UUFDRDFqRCxNQUFJLENBQUN3SixTQUFMLENBQWUsSUFBS25CLENBQUFBLFFBQXBCLEVBQThCaFQsT0FBOUIsQ0FBc0MsVUFBQUgsQ0FBQyxFQUFJO0VBQ3pDOEssUUFBQUEsTUFBSSxDQUFDeE4sS0FBTCxDQUFXMEMsQ0FBWCxFQUFjLE1BQWQsQ0FBeUI4SyxJQUFBQSxNQUFJLENBQUM2TCxlQUFMLENBQXFCM1csQ0FBckIsRUFBd0IsVUFBeEIsRUFBb0M0VyxLQUFwQyxDQUF6QixDQUFBO1NBREYsQ0FBQSxDQUFBO0VBSUE5TCxNQUFBQSxNQUFJLENBQUM2TCxlQUFMLENBQXFCLElBQXJCLEVBQTJCLFVBQTNCLEVBQXVDQyxLQUF2QyxDQUFBLENBQUE7RUFDRCxLQUFBOzs7V0FjRCxTQUFhLEdBQUEsR0FBQTtFQUNYLE1BQUEsT0FBTyxJQUFLbk4sQ0FBQUEsWUFBTCxDQUFrQixRQUFsQixDQUFQLENBQUE7RUFDRCxLQUFBO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQWMsR0FBQSxHQUFBO0VBQ1osTUFBQSxPQUFPLElBQUsya0QsQ0FBQUEsSUFBTCxJQUFhLElBQUEsQ0FBS0EsSUFBTCxDQUFVaDBCLE9BQXZCLElBQWtDLElBQUtsdkIsQ0FBQUEsS0FBTCxDQUFXNFYsT0FBWCxLQUF1QixNQUFoRSxDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O2FBQ0UsU0FBUyxNQUFBLEdBQUE7RUFDUCxNQUFBLE9BQU8sS0FBSzlELElBQVosQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OzthQUNFLFNBQVMsTUFBQSxHQUFBO1FBQ1AsT0FBTyxJQUFBLENBQUtvZCxPQUFMLEdBQWUsSUFBQSxDQUFLdkQsSUFBTCxFQUFmLEdBQTZCLElBQUtLLENBQUFBLElBQUwsRUFBcEMsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OzthQUNFLFNBQWMsV0FBQSxHQUFBO1FBQ1osT0FBTyxJQUFBLENBQUtsYSxJQUFMLEdBQVksSUFBQSxDQUFLd3hDLFNBQUwsRUFBWixHQUErQixJQUFLRSxDQUFBQSxTQUFMLEVBQXRDLENBQUE7RUFDRCxLQUFBOzs7V0F4VkQsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBTyxDQUFDLE9BQUQsRUFBVSxVQUFWLEVBQXNCLFFBQXRCLEVBQWdDLFdBQWhDLEVBQTZDLFVBQTdDLEVBQXlELE1BQXpELENBQVAsQ0FBQTtFQUNELEtBQUE7OztXQXdWRCxTQUFvQixHQUFBLEdBQUE7RUFDbEIsTUFBQSxPQUFPLENBQUMsTUFBRCxFQUFTLE9BQVQsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7OztJQWpjMkM3dkI7QUFvYzlDL3pCLFFBQUksQ0FBQzRPLHVCQUFMLENBQTZCbzBDLGdCQUE3QixFQUErQyxDQUFDLE1BQUQsRUFBUyxRQUFULENBQS9DLENBQUEsQ0FBQTtFQUVBcjBDLFdBQVcsQ0FBQ2sxQyxTQUFaLEdBQXdCYixnQkFBeEIsQ0FBQTtFQUNBOXVELGNBQWMsQ0FBQ21nQyxNQUFmLENBQXNCLGdCQUF0QixFQUF3QzJ1QixnQkFBeEMsQ0FBQTs7RUNwZUEsSUFBTWxOLGFBQVcsR0FBRztFQUNsQjtFQUNGO0VBQ0E7RUFDQTtFQUNFNytCLEVBQUFBLEtBTGtCLEVBS1o5VyxTQUFBQSxLQUFBQSxDQUFBQSxPQUxZLEVBS0hqSixRQUxHLEVBS087TUFDdkJ4QyxZQUFZLENBQUN3QyxRQUFELENBQVosQ0FBQTtFQUNELEdBQUE7RUFQaUIsQ0FBcEIsQ0FBQTtFQVVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O01BQ3FCNHNEOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0lBRUUsU0FBYyxzQkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTs7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsc0JBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7TUFFQSxLQUFLdk4sQ0FBQUEsS0FBTCxHQUFhLElBQWIsQ0FBQTtNQUNBLEtBQUtILENBQUFBLFdBQUwsR0FBbUJ2bEIsaUJBQW5CLENBQUE7RUFFQTVHLElBQUFBLFlBQVksZ0NBQU8sWUFBTTtRQUN2QjZyQixhQUFXLENBQUM3K0IsS0FBWixDQUFBLHNCQUFBLENBQUEsS0FBQSxDQUFBLEVBQXdCLFlBQU07RUFDNUIsUUFBQSxJQUFNN00sSUFBSSxHQUFHLEtBQUsrc0MsQ0FBQUEsY0FBTCxFQUFiLENBQUE7O0VBRUEsUUFBQSxJQUFJL3NDLElBQUosRUFBVTtZQUNSLEtBQUs4dEMsQ0FBQUEsSUFBTCxDQUFVOXRDLElBQVYsQ0FBQSxDQUFBO0VBQ0QsU0FBQTtTQUxILENBQUEsQ0FBQTtFQU9ELEtBUlcsQ0FBWixDQUFBO0VBTlksSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQWViLEdBQUE7Ozs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO1FBQ2xCLElBQUksQ0FBQ3BLLE1BQUksQ0FBQ3hOLEtBQUwsQ0FBVyxLQUFLMkUsVUFBaEIsRUFBNEIsY0FBNUIsQ0FBTCxFQUFrRDtVQUNoRDZJLE1BQUksQ0FBQ21KLEtBQUwsQ0FBVywyREFBWCxDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBaUIsY0FBQSxHQUFBO0VBQ2YsTUFBQSxPQUFPLEtBQUtvdEMsS0FBTCxJQUFjLEtBQUt4MUMsWUFBTCxDQUFrQixNQUFsQixDQUFyQixDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxvQkFBQSxHQUF1QixFQUFFOzs7RUFNekIsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5QnJHLElBQXpCLEVBQStCc0ksSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDLEVBQzdDO0VBRUQ7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Ozs7V0FDRSxTQUFXLEdBQUEsR0FBQTtFQUNULE1BQUEsT0FBTyxLQUFLc3pDLEtBQVosQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7O0VBQ0UsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLENBQVNuc0MsSUFBVCxFQUFlO1FBQ2IsSUFBS21zQyxDQUFBQSxLQUFMLEdBQWFuc0MsSUFBYixDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBZSxHQUFBLEdBQUE7RUFDYixNQUFBLE9BQU8sSUFBSy9CLENBQUFBLFFBQUwsQ0FBYyxDQUFkLENBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQWlCLEdBQUEsR0FBQTtFQUNmLE1BQUEsT0FBTyxLQUFLK3RDLFdBQVosQ0FBQTs7RUFHRixJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsQ0FBZTVsQixNQUFmLEVBQXVCO0VBQ3JCLE1BQUEsSUFBSSxFQUFFQSxNQUFNLFlBQVlELFVBQXBCLENBQUosRUFBcUM7RUFDbkN2d0IsUUFBQUEsTUFBSSxDQUFDNk4sZUFBTCxFQUFBLENBQUE7RUFDRCxPQUFBOztRQUNELElBQUt1b0MsQ0FBQUEsV0FBTCxHQUFtQjVsQixNQUFuQixDQUFBO0VBQ0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsSUFBQSxDQUFLcG1CLElBQUwsRUFBeUI7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7UUFBQSxJQUFkL1MsT0FBYyx1RUFBSixFQUFJLENBQUE7UUFDdkIsSUFBS2svQyxDQUFBQSxLQUFMLEdBQWFuc0MsSUFBYixDQUFBOztRQUNBLElBQU1sVCxRQUFRLEdBQUdHLE9BQU8sQ0FBQ0gsUUFBUixJQUFvQixZQUFXLEVBQWhELENBQUE7O0VBRUEsTUFBQSxPQUFPLElBQUlpVyxPQUFKLENBQVksVUFBQUMsT0FBTyxFQUFJO0VBQzVCLFFBQUEsSUFBSTIyQyxVQUFVLEdBQUcsTUFBSSxDQUFDN0gsUUFBTCxJQUFpQixJQUFsQyxDQUFBOztFQUVBLFFBQUEsTUFBSSxDQUFDOUYsV0FBTCxDQUFpQjhCLElBQWpCLENBQXNCO0VBQUM5dEMsVUFBQUEsSUFBSSxFQUFKQSxJQUFEO0VBQU9oRyxVQUFBQSxNQUFNLEVBQUUsTUFBQTtXQUFyQyxFQUE0QyxVQUFBZ3NCLFdBQVcsRUFBSTtFQUN6RCxVQUFBLElBQUkyekIsVUFBSixFQUFnQjtFQUNkLFlBQUEsTUFBSSxDQUFDM04sV0FBTCxDQUFpQnVCLE1BQWpCLENBQXdCb00sVUFBeEIsQ0FBQSxDQUFBOztFQUNBQSxZQUFBQSxVQUFVLEdBQUcsSUFBYixDQUFBO0VBQ0QsV0FBQTs7RUFFRHJ2RCxVQUFBQSxZQUFZLENBQUMsWUFBQTtjQUFBLE9BQU0sTUFBSSxDQUFDcXhDLEtBQUwsRUFBTixDQUFBO0VBQUEsV0FBRCxDQUFaLENBQUE7WUFFQTd1QyxRQUFRLENBQUNrNUIsV0FBRCxDQUFSLENBQUE7WUFDQWhqQixPQUFPLENBQUNnakIsV0FBRCxDQUFQLENBQUE7V0FURixDQUFBLENBQUE7RUFXRCxPQWRNLENBQVAsQ0FBQTtFQWVELEtBQUE7OzthQUVELFNBQVEsS0FBQSxHQUFBO1FBQ04sSUFBSSxJQUFBLENBQUs4ckIsUUFBVCxFQUFtQjtVQUNqQixJQUFLQSxDQUFBQSxRQUFMLENBQWNuVyxLQUFkLEVBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFRLEtBQUEsR0FBQTtRQUNOLElBQUksSUFBQSxDQUFLbVcsUUFBVCxFQUFtQjtVQUNqQixJQUFLQSxDQUFBQSxRQUFMLENBQWNwVyxLQUFkLEVBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBOzs7YUFFRCxTQUFXLFFBQUEsR0FBQTtRQUNULElBQUksSUFBQSxDQUFLb1csUUFBVCxFQUFtQjtFQUNqQixRQUFBLElBQUEsQ0FBSzlGLFdBQUwsQ0FBaUJ1QixNQUFqQixDQUF3QixLQUFLdUUsUUFBN0IsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFDRCxNQUFBLElBQUEsQ0FBS3I0QyxNQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OztXQXBHRCxTQUFnQyxHQUFBLEdBQUE7RUFDOUIsTUFBQSxPQUFPLEVBQVAsQ0FBQTtFQUNELEtBQUE7OztXQW9HRCxTQUF5QixHQUFBLEdBQUE7RUFDdkIsTUFBQSxPQUFPaXlDLGFBQVAsQ0FBQTtFQUNELEtBQUE7Ozs7SUFuSmlEL2hCO0VBc0pwRHBsQixXQUFXLENBQUNxMUMsZUFBWixHQUE4QkYsc0JBQTlCLENBQUE7RUFDQTV2RCxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixzQkFBdEIsRUFBOEN5dkIsc0JBQTlDLENBQUE7O01DcE1xQkc7Ozs7O0lBRW5CLFNBQWMsbUJBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLG1CQUFBLENBQUEsQ0FBQTs7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUEsSUFBQSxLQUFBLENBQUt0bkIsYUFBTCxHQUFxQixLQUFBLENBQUtDLFFBQUwsQ0FBYzF3QixJQUFkLENBQXJCLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUNBK2QsSUFBQUEsWUFBWSxnQ0FBTyxZQUFNO1FBQ3ZCLElBQUksS0FBQSxDQUFLOXlCLFVBQUwsQ0FBZ0Irc0QsTUFBaEIsQ0FBdUJ0bEMsS0FBdkIsQ0FBNkIsVUFBQXVsQyxJQUFJLEVBQUE7RUFBQSxRQUFBLE9BQUlBLElBQUksQ0FBQ0MsSUFBTCxLQUFjLE9BQWxCLENBQUE7RUFBQSxPQUFqQyxDQUFKLEVBQWlFO0VBQy9ELFFBQUEsS0FBQSxDQUFLeGxELFlBQUwsQ0FBa0IsT0FBbEIsRUFBMkIsMEJBQTNCLENBQUEsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUpXLENBQVosQ0FBQTtFQUpZLElBQUEsT0FBQSxLQUFBLENBQUE7RUFTYixHQUFBOzs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxRQUFBLENBQVMzQixLQUFULEVBQWdCO0VBQ2QsTUFBQSxJQUFJLElBQUtvbkQsQ0FBQUEsT0FBTCxZQUF3QnBvRCxRQUE1QixFQUFzQztFQUNwQyxRQUFBLElBQUEsQ0FBS29vRCxPQUFMLEVBQUEsQ0FBQTtTQURGLE1BRU8sSUFBSXJrRCxNQUFJLENBQUN4TixLQUFMLENBQVcsSUFBQSxDQUFLMkUsVUFBaEIsRUFBNEIsY0FBNUIsQ0FBSixFQUFpRDtFQUN0RCxRQUFBLElBQUEsQ0FBS0EsVUFBTCxDQUFnQitzRCxNQUFoQixDQUF1Qjd1RCxPQUF2QixDQUErQixVQUFBOHVELElBQUksRUFBQTtZQUFBLE9BQUlBLElBQUksQ0FBQ0csS0FBTCxDQUFXLE1BQVgsQ0FBbUJ2eEMsQ0FBQUEsS0FBbkIsQ0FBeUIsWUFBTSxFQUEvQixDQUFKLENBQUE7V0FBbkMsQ0FBQSxDQUFBO0VBQ0QsT0FBQTs7RUFDRDlWLE1BQUFBLEtBQUssQ0FBQ3ViLGVBQU4sRUFBQSxDQUFBO0VBQ0QsS0FBQTs7O0VBTUQsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5QjlkLElBQXpCLEVBQStCc0ksSUFBL0IsRUFBcUNDLE9BQXJDLEVBQThDLEVBQzdDOzs7YUFFRCxTQUFvQixpQkFBQSxHQUFBO0VBQ2xCLE1BQUEsSUFBQSxDQUFLaE8sZ0JBQUwsQ0FBc0IsT0FBdEIsRUFBK0IsS0FBSzBuQyxhQUFwQyxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF1QixvQkFBQSxHQUFBO0VBQ3JCLE1BQUEsSUFBQSxDQUFLcmlDLG1CQUFMLENBQXlCLE9BQXpCLEVBQWtDLEtBQUtxaUMsYUFBdkMsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O1dBYkQsU0FBZ0MsR0FBQSxHQUFBO0VBQzlCLE1BQUEsT0FBTyxFQUFQLENBQUE7RUFDRCxLQUFBOzs7O0lBeEI4QzVJO0VBc0NqRHBsQixXQUFXLENBQUM0MUMsWUFBWixHQUEyQk4sbUJBQTNCLENBQUE7RUFDQS92RCxjQUFjLENBQUNtZ0MsTUFBZixDQUFzQixtQkFBdEIsRUFBMkM0dkIsbUJBQTNDLENBQUE7O01DdkNxQk87Ozs7O0lBRW5CLFNBQXNGLGdCQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsSUFBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFKLEVBQUk7RUFBQSxRQUFBLFdBQUEsR0FBQSxJQUFBLENBQXpFcHNDLE1BQXlFO1VBQXpFQSxNQUF5RSw0QkFBaEUsNkJBQWdFLEdBQUEsV0FBQTtFQUFBLFFBQUEsYUFBQSxHQUFBLElBQUEsQ0FBakNuRSxRQUFpQztVQUFqQ0EsUUFBaUMsOEJBQXRCLEdBQXNCLEdBQUEsYUFBQTtFQUFBLFFBQUEsVUFBQSxHQUFBLElBQUEsQ0FBakJDLEtBQWlCO1VBQWpCQSxLQUFpQiwyQkFBVCxDQUFTLEdBQUEsVUFBQSxDQUFBOztFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxnQkFBQSxDQUFBLENBQUE7O01BQUEsT0FDOUUsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQUE7RUFBRWtFLE1BQUFBLE1BQU0sRUFBTkEsTUFBRjtFQUFVbkUsTUFBQUEsUUFBUSxFQUFSQSxRQUFWO0VBQW9CQyxNQUFBQSxLQUFLLEVBQUxBLEtBQUFBO09BRDBELENBQUEsQ0FBQTtFQUVyRixHQUFBOzs7O2FBRUQsU0FBNEIsYUFBQSxHQUFBO1FBQUEsSUFBZDdjLE9BQWMsdUVBQUosRUFBSSxDQUFBO0VBQzFCMkksTUFBQUEsTUFBSSxDQUFDc0osTUFBTCxDQUFZLElBQVosRUFBa0I7VUFDaEI4TyxNQUFNLEVBQUUsS0FBS0EsTUFERztVQUNLbkUsUUFBUSxFQUFFLEtBQUtBLFFBRHBCO0VBQzhCQyxRQUFBQSxLQUFLLEVBQUUsSUFBS0EsQ0FBQUEsS0FBQUE7RUFEMUMsT0FBbEIsRUFFRzdjLE9BRkgsQ0FBQSxDQUFBO0VBR0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsUUFBQSxDQUFTb3RELFdBQVQsRUFBc0I7RUFBQSxNQUFBLElBQUEsS0FBQSxHQUFBLElBQUEsQ0FBQTs7RUFDcEIsTUFBQSxJQUFNQyxRQUFRLEdBQUdELFdBQVcsQ0FBQ3R0RCxVQUE3QixDQUFBO1FBRUE4eUIsWUFBWSxDQUFDeTZCLFFBQUQsRUFBVyxZQUFNO1VBQzNCLEtBQUksQ0FBQ0MsS0FBTCxHQUFhRixXQUFiLENBQUE7VUFDQSxLQUFJLENBQUNHLGFBQUwsR0FBcUJGLFFBQVEsQ0FBQ3B1QyxLQUFULEtBQW1CbXVDLFdBQW5CLElBQWtDQyxRQUFRLENBQUNwdUMsS0FBM0MsSUFBb0RvdUMsUUFBUSxDQUFDcnVDLElBQVQsS0FBa0JvdUMsV0FBbEIsSUFBaUNDLFFBQVEsQ0FBQ3J1QyxJQUFuSCxDQUFBO0VBQ0EsUUFBQSxLQUFJLENBQUM2bEMsUUFBTCxHQUFnQndJLFFBQVEsQ0FBQ3I3QyxPQUF6QixDQUFBO0VBQ0EsUUFBQSxLQUFJLENBQUNtc0IsS0FBTCxHQUFha3ZCLFFBQVEsQ0FBQzlzQixJQUF0QixDQUFBO0VBQ0QsT0FMVyxDQUFaLENBQUE7RUFNRCxLQUFBOzs7YUFFRCxTQUFhLFVBQUEsR0FBQTtFQUNYLE1BQUEsSUFBQSxDQUFLMWMsZUFBTCxFQUFBLENBQUE7RUFDQSxNQUFBLElBQUEsQ0FBS3NhLEtBQUwsSUFBYyxJQUFLcXZCLENBQUFBLFNBQUwsRUFBZCxDQUFBO1FBQ0EsSUFBSzNJLENBQUFBLFFBQUwsR0FBZ0IsSUFBQSxDQUFLeUksS0FBTCxHQUFhLElBQUtDLENBQUFBLGFBQUwsR0FBcUIsSUFBQSxDQUFLcHZCLEtBQUwsR0FBYSxJQUEvRCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBWSxHQUFBLEdBQUE7UUFDVixPQUFPLElBQUEsQ0FBS212QixLQUFMLENBQVdSLElBQVgsS0FBb0IsT0FBcEIsR0FBOEIsR0FBOUIsR0FBb0MsRUFBM0MsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQWtCLGVBQUEsR0FBQTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNoQixNQUFBLG1CQUFBLENBQW9CN3hELEtBQXBCLENBQTBCLEtBQTFCLEVBQ0crQyxPQURILENBQ1csVUFBQUgsQ0FBQyxFQUFBO0VBQUEsUUFBQSxPQUFJLE1BQUksQ0FBQyxHQUFBLEdBQU1BLENBQVAsQ0FBSixJQUFpQmdMLE1BQU0sQ0FBQ00sS0FBUCxDQUFhLE1BQUksQ0FBQyxHQUFBLEdBQU10TCxDQUFQLENBQWpCLEVBQTRCLHNCQUE1QixDQUFyQixDQUFBO1NBRFosQ0FBQSxDQUFBO0VBRUQsS0FBQTs7O2FBRUQsU0FBWSxTQUFBLEdBQUE7RUFDVjtFQUNBLE1BQUEsSUFBSSxDQUFDLElBQUswdkQsQ0FBQUEsYUFBTixJQUF1QixJQUFBLENBQUtBLGFBQUwsQ0FBbUJSLElBQW5CLEtBQTRCLE9BQW5ELElBQThELENBQUMsSUFBQSxDQUFLUSxhQUFMLENBQW1CRSxNQUF0RixFQUE4RjtFQUM1RixRQUFBLElBQUEsQ0FBS3R2QixLQUFMLENBQVdwMUIsS0FBWCxDQUFpQnExQixPQUFqQixHQUEyQixFQUEzQixDQUFBO0VBQ0EsUUFBQSxJQUFBLENBQUtELEtBQUwsQ0FBV3AxQixLQUFYLENBQWlCNFYsT0FBakIsR0FBMkIsTUFBM0IsQ0FBQTtFQUNELE9BQUE7RUFDRixLQUFBO0VBRUQ7RUFDRjtFQUNBOzs7O2FBQ0UsU0FBVXpILFNBQUFBLENBQUFBLFFBQVYsRUFBb0IsRUFFbkI7RUFFRDtFQUNGO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLElBQUEsQ0FBSzJMLElBQUwsRUFBVztRQUNUQSxJQUFJLEVBQUEsQ0FBQTtFQUNMLEtBQUE7RUFFRDtFQUNGO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLEtBQUEsQ0FBTUEsSUFBTixFQUFZO1FBQ1ZBLElBQUksRUFBQSxDQUFBO0VBQ0wsS0FBQTs7OztJQXBFMkNvYTs7TUNGekJ5d0I7Ozs7Ozs7Ozs7Ozs7RUFFbkIsSUFBQSxLQUFBLEVBQUEsU0FBQSxTQUFBLENBQVV4MkMsUUFBVixFQUFvQjtRQUNsQixJQUFLaW5CLENBQUFBLEtBQUwsQ0FBV3AxQixLQUFYLENBQWlCNFYsT0FBakIsR0FBMkIsT0FBM0IsQ0FEa0I7O0VBR2xCK2EsTUFBQUEsTUFBTSxDQUFDLElBQUs0ekIsQ0FBQUEsS0FBTixDQUFOLENBQ0d2dkQsS0FESCxDQUNTO0VBQ0x1Z0MsUUFBQUEsU0FBUyxFQUFpQixjQUFBLENBQUEsTUFBQSxDQUFBLElBQUEsQ0FBS3F2QixLQUFMLEdBQWF6MkMsUUFBOUIsRUFBQSxXQUFBLENBQUE7RUFESixPQURULEVBSUcwTCxJQUpILEVBQUEsQ0FBQTtFQUtELEtBQUE7RUFFRDtFQUNGO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLElBQUEsQ0FBS0MsSUFBTCxFQUFXO0VBQ1Q2VyxNQUFBQSxNQUFNLENBQUN0VixNQUFQLENBQ0VzVixNQUFNLENBQUMsSUFBSzR6QixDQUFBQSxLQUFOLENBQU4sQ0FDR2xxQyxJQURILENBQ1EsSUFBQSxDQUFLdkcsS0FEYixDQUFBLENBRUc5ZSxLQUZILENBRVM7VUFDTHVnQyxTQUFTLEVBQUEsY0FBQSxDQUFBLE1BQUEsQ0FBaUIsS0FBS3F2QixLQUF0QixFQUFBLGFBQUEsQ0FBQTtTQUhiLEVBSUssS0FBS3p3QixHQUpWLENBQUEsQ0FLR24vQixLQUxILENBS1MsVUFBQThCLFFBQVEsRUFBSTtVQUNqQkEsUUFBUSxFQUFBLENBQUE7VUFDUmdqQixJQUFJLElBQUlBLElBQUksRUFBWixDQUFBO0VBQ0QsT0FSSCxDQURGLEVBV0U2VyxNQUFNLENBQUMsS0FBS3lFLEtBQU4sQ0FBTixDQUNHL2EsSUFESCxDQUNRLElBQUEsQ0FBS3ZHLEtBRGIsQ0FBQSxDQUVHOWUsS0FGSCxDQUVTO0VBQ0w0Z0IsUUFBQUEsT0FBTyxFQUFFLE9BQUE7U0FIYixDQUFBLENBS0c1Z0IsS0FMSCxDQUtTO0VBQ0xxZ0MsUUFBQUEsT0FBTyxFQUFFLEdBQUE7RUFESixPQUxULEVBT0s7VUFDRHhoQixRQUFRLEVBQUUsS0FBS0EsUUFEZDtFQUVEbUUsUUFBQUEsTUFBTSxFQUFFLFFBQUE7RUFGUCxPQVBMLENBWEYsQ0FBQSxDQUFBO0VBdUJELEtBQUE7RUFFRDtFQUNGO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLEtBQUEsQ0FBTThCLElBQU4sRUFBWTtFQUVWNlcsTUFBQUEsTUFBTSxDQUFDdFYsTUFBUCxDQUNFc1YsTUFBTSxDQUFDLElBQUs0ekIsQ0FBQUEsS0FBTixDQUFOLENBQ0dscUMsSUFESCxDQUNRLElBQUEsQ0FBS3ZHLEtBRGIsQ0FBQSxDQUVHOWUsS0FGSCxDQUVTO0VBQ0x1Z0MsUUFBQUEsU0FBUyxFQUFFLHNCQUFBO1NBSGYsRUFJSyxLQUFLcEIsR0FKVixDQUFBLENBS0duL0IsS0FMSCxDQUtTLFVBQUE4QixRQUFRLEVBQUk7VUFDakJnakIsSUFBSSxJQUFJQSxJQUFJLEVBQVosQ0FBQTtVQUNBaGpCLFFBQVEsRUFBQSxDQUFBO0VBQ1QsT0FSSCxDQURGLEVBV0U2NUIsTUFBTSxDQUFDLEtBQUt5RSxLQUFOLENBQU4sQ0FDRy9hLElBREgsQ0FDUSxJQUFBLENBQUt2RyxLQURiLENBQUEsQ0FFRzllLEtBRkgsQ0FFUztFQUNMcWdDLFFBQUFBLE9BQU8sRUFBRSxHQUFBO0VBREosT0FGVCxFQUlLO1VBQ0R4aEIsUUFBUSxFQUFFLEtBQUtBLFFBRGQ7RUFFRG1FLFFBQUFBLE1BQU0sRUFBRSxRQUFBO1NBTlosQ0FBQSxDQVFHaGpCLEtBUkgsQ0FRUztFQUNMNGdCLFFBQUFBLE9BQU8sRUFBRSxNQUFBO0VBREosT0FSVCxDQVhGLENBQUEsQ0FBQTtFQXVCRCxLQUFBOzs7O0lBckVrRHd1Qzs7TUNBaENTOzs7Ozs7Ozs7Ozs7O2FBRW5CLFNBQXNCLG1CQUFBLEdBQUE7UUFDcEIsSUFBTUMsZUFBZSxHQUFHLENBQUMsSUFBQSxDQUFLUCxLQUFOLEVBQWEsSUFBQSxDQUFLekksUUFBbEIsQ0FBeEIsQ0FBQTs7UUFDQSxJQUFJLElBQUEsQ0FBSzBJLGFBQUwsSUFBc0IsSUFBQSxDQUFLQSxhQUFMLENBQW1CUixJQUFuQixLQUE0QixPQUF0RCxFQUErRDtFQUM3RGMsUUFBQUEsZUFBZSxDQUFDM3ZELElBQWhCLENBQXFCLElBQUEsQ0FBS3F2RCxhQUExQixDQUFBLENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsT0FBT00sZUFBUCxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxTQUFBLENBQVUzMkMsUUFBVixFQUFvQjtRQUNsQixJQUFJLENBQUMsSUFBSzQyQyxDQUFBQSxnQkFBVixFQUE0QjtFQUMxQixRQUFBLElBQUEsQ0FBS0EsZ0JBQUwsR0FBd0IsSUFBS0MsQ0FBQUEsbUJBQUwsRUFBeEIsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBSzV2QixDQUFBQSxLQUFMLENBQVdwMUIsS0FBWCxDQUFpQjRWLE9BQWpCLEdBQTJCLE9BQTNCLENBTGtCOztFQU9sQithLE1BQUFBLE1BQU0sQ0FBQyxJQUFLbzBCLENBQUFBLGdCQUFOLENBQU4sQ0FDRy92RCxLQURILENBQ1M7RUFDTHVnQyxRQUFBQSxTQUFTLEVBQWlCLGNBQUEsQ0FBQSxNQUFBLENBQUEsSUFBQSxDQUFLcXZCLEtBQUwsR0FBYXoyQyxRQUE5QixFQUFBLFdBQUEsQ0FBQTtFQURKLE9BRFQsRUFJRzBMLElBSkgsRUFBQSxDQUFBO0VBS0QsS0FBQTtFQUVEO0VBQ0Y7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsSUFBQSxDQUFLQyxJQUFMLEVBQVc7RUFBQSxNQUFBLElBQUEsS0FBQSxHQUFBLElBQUEsQ0FBQTs7RUFDVCxNQUFBLElBQU1vRixHQUFHLEdBQUcsSUFBS3FsQyxDQUFBQSxLQUFMLENBQVd0VSxXQUF2QixDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUs4VSxnQkFBTCxHQUF3QixJQUFLQyxDQUFBQSxtQkFBTCxFQUF4QixDQUFBO0VBRUFyMEIsTUFBQUEsTUFBTSxDQUFDdFYsTUFBUCxDQUNFc1YsTUFBTSxDQUFDLElBQUtvMEIsQ0FBQUEsZ0JBQU4sQ0FBTixDQUNHMXFDLElBREgsQ0FDUSxJQUFBLENBQUt2RyxLQURiLENBQUEsQ0FFRzllLEtBRkgsQ0FFUztFQUNMdWdDLFFBQUFBLFNBQVMsRUFBaUIsY0FBQSxDQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUtxdkIsS0FBTCxHQUFhMWxDLEdBQTlCLEVBQUEsV0FBQSxDQUFBO1NBSGIsRUFJSyxLQUFLaVYsR0FKVixDQUFBLENBS0duL0IsS0FMSCxDQUtTLFVBQUE4QixRQUFRLEVBQUk7VUFDakIsS0FBSSxDQUFDaXVELGdCQUFMLEdBQXdCLElBQXhCLENBQUE7VUFDQWp1RCxRQUFRLEVBQUEsQ0FBQTtVQUNSZ2pCLElBQUksSUFBSUEsSUFBSSxFQUFaLENBQUE7RUFDRCxPQVRILENBREYsRUFZRTZXLE1BQU0sQ0FBQyxLQUFLeUUsS0FBTixDQUFOLENBQ0cvYSxJQURILENBQ1EsSUFBQSxDQUFLdkcsS0FEYixDQUFBLENBRUc5ZSxLQUZILENBRVM7RUFDTDRnQixRQUFBQSxPQUFPLEVBQUUsT0FBQTtFQURKLE9BRlQsQ0FaRixDQUFBLENBQUE7RUFrQkQsS0FBQTtFQUVEO0VBQ0Y7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsS0FBQSxDQUFNa0UsSUFBTixFQUFZO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ1YsTUFBQSxJQUFBLENBQUtpckMsZ0JBQUwsR0FBd0IsSUFBS0MsQ0FBQUEsbUJBQUwsRUFBeEIsQ0FBQTtFQUVBcjBCLE1BQUFBLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FDRXNWLE1BQU0sQ0FBQyxJQUFLbzBCLENBQUFBLGdCQUFOLENBQU4sQ0FDRzFxQyxJQURILENBQ1EsSUFBQSxDQUFLdkcsS0FEYixDQUFBLENBRUc5ZSxLQUZILENBRVM7RUFDTHVnQyxRQUFBQSxTQUFTLEVBQUUsc0JBQUE7U0FIZixFQUlLLEtBQUtwQixHQUpWLENBQUEsQ0FLR24vQixLQUxILENBS1MsVUFBQThCLFFBQVEsRUFBSTtVQUNqQixNQUFJLENBQUNpdUQsZ0JBQUwsR0FBd0IsSUFBeEIsQ0FBQTs7RUFDQSxRQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsb0JBQUEsQ0FBQSxTQUFBLENBQUEsRUFBQSxpQkFBQSxFQUFBLE1BQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxNQUFBLENBQUEsQ0FBQTs7VUFDQWpyQyxJQUFJLElBQUlBLElBQUksRUFBWixDQUFBO1VBQ0FoakIsUUFBUSxFQUFBLENBQUE7RUFDVCxPQVZILENBREYsRUFhRTY1QixNQUFNLENBQUMsS0FBS3lFLEtBQU4sQ0FBTixDQUNHL2EsSUFESCxDQUNRLElBQUEsQ0FBS3ZHLEtBRGIsQ0FBQSxDQUVHOWUsS0FGSCxDQUVTO0VBQ0w0Z0IsUUFBQUEsT0FBTyxFQUFFLE1BQUE7RUFESixPQUZULENBYkYsQ0FBQSxDQUFBO0VBbUJELEtBQUE7Ozs7SUE3RStDd3VDOztNQ0U3QmE7Ozs7Ozs7Ozs7Ozs7YUFFbkIsU0FBc0IsbUJBQUEsR0FBQTtRQUNwQixJQUFNSCxlQUFlLEdBQUcsQ0FBQyxJQUFBLENBQUtoSixRQUFOLEVBQWdCLElBQUEsQ0FBSzFtQixLQUFyQixDQUF4QixDQUFBOztRQUNBLElBQUksSUFBQSxDQUFLb3ZCLGFBQUwsSUFBc0IsSUFBQSxDQUFLQSxhQUFMLENBQW1CUixJQUFuQixLQUE0QixPQUF0RCxFQUErRDtFQUM3RGMsUUFBQUEsZUFBZSxDQUFDM3ZELElBQWhCLENBQXFCLElBQUEsQ0FBS3F2RCxhQUExQixDQUFBLENBQUE7RUFDRCxPQUFBOztFQUVELE1BQUEsT0FBT00sZUFBUCxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxRQUFBLENBQVNULFdBQVQsRUFBc0I7RUFDcEIsTUFBQSxJQUFBLENBQUEsZUFBQSxDQUFBLHNCQUFBLENBQUEsU0FBQSxDQUFBLEVBQUEsVUFBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQWVBLFdBQWYsQ0FBQSxDQUFBOztFQUNBLE1BQUEsSUFBSUEsV0FBVyxDQUFDTCxJQUFaLEtBQXFCLFVBQXpCLEVBQXFDO1VBQ25DLElBQUtrQixDQUFBQSxVQUFMLENBQWdCYixXQUFoQixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBYSxVQUFBLEdBQUE7RUFDWCxNQUFBLElBQUEsQ0FBS0UsS0FBTCxJQUFjLElBQUEsQ0FBS1ksWUFBTCxDQUFrQixJQUFBLENBQUtaLEtBQXZCLENBQWQsQ0FBQTs7RUFDQSxNQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsc0JBQUEsQ0FBQSxTQUFBLENBQUEsRUFBQSxZQUFBLEVBQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxVQUFBLENBQVdGLFdBQVgsRUFBd0I7UUFDdEJ2a0QsTUFBTSxDQUFDdWtELFdBQUQsRUFBYztVQUNsQnB1QyxJQUFJLEVBQUVvdUMsV0FBVyxDQUFDTixJQUFaLEtBQXFCLE9BQXJCLEdBQStCLE1BQS9CLEdBQXdDLENBRDVCO1VBRWxCN3RDLEtBQUssRUFBRW11QyxXQUFXLENBQUNOLElBQVosS0FBcUIsT0FBckIsR0FBZ0MsQ0FBaEMsR0FBb0MsTUFGekI7RUFHbEIzdEMsUUFBQUEsTUFBTSxFQUFFLENBSFU7RUFJbEJ3Z0IsUUFBQUEsZUFBZSxFQUFFLE9BSkM7VUFLbEJyQixTQUFTLEVBQUUsS0FBSzZ2Qix3QkFBTCxDQUE4QixDQUE5QixDQUFpQ3Y3QyxDQUFBQSxTQUFqQyxDQUEyQzByQixTQUxwQztFQU1sQjNmLFFBQUFBLE9BQU8sRUFBRSxNQUFBO0VBTlMsT0FBZCxDQUFOLENBQUE7RUFTQSxNQUFBLElBQU0wdUMsUUFBUSxHQUFHRCxXQUFXLENBQUMvNEMsYUFBN0IsQ0FBQTtRQUNBdWUsWUFBWSxDQUFDeTZCLFFBQUQsRUFBVyxZQUFBO1VBQUEsT0FBTUEsUUFBUSxDQUFDcjdDLE9BQVQsSUFBb0JuSixNQUFNLENBQUN3a0QsUUFBUSxDQUFDcjdDLE9BQVYsRUFBbUI7RUFBRXlrQyxVQUFBQSxTQUFTLEVBQUUsK0JBQUE7RUFBYixTQUFuQixDQUFoQyxDQUFBO0VBQUEsT0FBWCxDQUFaLENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLFlBQUEsQ0FBYTJXLFdBQWIsRUFBMEI7RUFDeEJ2a0QsTUFBQUEsTUFBTSxDQUFDTSxLQUFQLENBQWFpa0QsV0FBYixFQUEwQiwyQ0FBMUIsQ0FBQSxDQUFBOztRQUNBLElBQUlBLFdBQVcsQ0FBQ3ZJLFFBQWhCLEVBQTBCO0VBQ3hCdUksUUFBQUEsV0FBVyxDQUFDdkksUUFBWixDQUFxQjk3QyxLQUFyQixDQUEyQnExQixPQUEzQixHQUFxQyxFQUFyQyxDQUFBO0VBQ0QsT0FKdUI7OztRQU94QixJQUFJLENBQUMsSUFBS212QixDQUFBQSxhQUFOLElBQXVCLElBQUEsQ0FBS0EsYUFBTCxDQUFtQlIsSUFBbkIsS0FBNEIsT0FBdkQsRUFBZ0U7RUFDOURLLFFBQUFBLFdBQVcsQ0FBQy80QyxhQUFaLENBQTBCckMsT0FBMUIsSUFBcUNuSixNQUFNLENBQUNNLEtBQVAsQ0FBYWlrRCxXQUFXLENBQUMvNEMsYUFBWixDQUEwQnJDLE9BQXZDLEVBQWdELFdBQWhELENBQXJDLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5QmtGLFFBQXpCLEVBQW1DO1FBQ2pDLElBQU0rUSxHQUFHLEdBQUcsSUFBQSxDQUFLOGxCLFFBQWpCLENBQUE7UUFFQSxJQUFJcWdCLGNBQWMsR0FBRyxDQUFDbDNDLFFBQVEsR0FBRytRLEdBQVosSUFBbUJBLEdBQW5CLEdBQXlCLEVBQTlDLENBQUE7UUFDQW1tQyxjQUFjLEdBQUdsZ0QsS0FBSyxDQUFDa2dELGNBQUQsQ0FBTCxHQUF3QixDQUF4QixHQUE0QjF3RCxJQUFJLENBQUN1cUIsR0FBTCxDQUFTdnFCLElBQUksQ0FBQ3NxQixHQUFMLENBQVNvbUMsY0FBVCxFQUF5QixDQUF6QixDQUFULEVBQXNDLENBQUMsRUFBdkMsQ0FBN0MsQ0FBQTtFQUVBLE1BQUEsSUFBTUMsZUFBZSxHQUFBLGNBQUEsQ0FBQSxNQUFBLENBQWtCLENBQUMsSUFBQSxDQUFLVixLQUFMLEdBQWEsQ0FBQyxDQUFkLEdBQWtCLENBQW5CLElBQXdCUyxjQUExQyxFQUFyQixVQUFBLENBQUEsQ0FBQTtFQUNBLE1BQUEsSUFBTWh3QixPQUFPLEdBQUcsQ0FBSWd3QixHQUFBQSxjQUFjLEdBQUcsR0FBckMsQ0FBQTtRQUVBLE9BQU87RUFDTHA4QyxRQUFBQSxPQUFPLEVBQUU7RUFDUG9zQixVQUFBQSxPQUFPLEVBQVBBLE9BQUFBO1dBRkc7RUFJTHhyQixRQUFBQSxTQUFTLEVBQUU7RUFDVDByQixVQUFBQSxTQUFTLEVBQUUrdkIsZUFBQUE7RUFERixTQUFBO1NBSmIsQ0FBQTtFQVFELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsU0FBQSxDQUFVbjNDLFFBQVYsRUFBb0I7RUFDbEIsTUFBQSxJQUFBLENBQUtvMkMsS0FBTCxDQUFXdmtELEtBQVgsQ0FBaUI0VixPQUFqQixHQUEyQixFQUEzQixDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUsydUMsS0FBTCxDQUFXdmtELEtBQVgsQ0FBaUJvVyxNQUFqQixHQUEwQixDQUExQixDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUs0dUIsUUFBTCxHQUFnQixJQUFBLENBQUtBLFFBQUwsSUFBaUIsSUFBQSxDQUFLdWdCLFlBQUwsRUFBakMsQ0FBQTs7RUFDQSxNQUFBLElBQU1DLFNBQVMsR0FBRyxJQUFLSixDQUFBQSx3QkFBTCxDQUE4Qnp3RCxJQUFJLENBQUNzcUIsR0FBTCxDQUFTOVEsUUFBVCxFQUFtQixJQUFLNjJCLENBQUFBLFFBQXhCLENBQTlCLENBQWxCLENBQUE7O1FBRUEsSUFBSSxDQUFDLElBQUsrZixDQUFBQSxnQkFBVixFQUE0QjtFQUMxQixRQUFBLElBQUEsQ0FBS0EsZ0JBQUwsR0FBd0IsSUFBS0MsQ0FBQUEsbUJBQUwsRUFBeEIsQ0FBQTtFQUNELE9BQUE7O1FBRUQsSUFBSzV2QixDQUFBQSxLQUFMLENBQVdwMUIsS0FBWCxDQUFpQjRWLE9BQWpCLEdBQTJCLE9BQTNCLENBVmtCOztRQVlsQithLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FDRXNWLE1BQU0sQ0FBQyxLQUFLbzBCLGdCQUFOLENBQU4sQ0FDRy92RCxLQURILENBQ1M7RUFDTHVnQyxRQUFBQSxTQUFTLEVBQWlCLGNBQUEsQ0FBQSxNQUFBLENBQUEsSUFBQSxDQUFLcXZCLEtBQUwsR0FBYXoyQyxRQUE5QixFQUFBLFdBQUEsQ0FBQTtFQURKLE9BRFQsQ0FERixFQUtFd2lCLE1BQU0sQ0FBQyxJQUFLNHpCLENBQUFBLEtBQUwsQ0FBV3pJLFFBQVosQ0FBTixDQUNHOW1ELEtBREgsQ0FDU3d3RCxTQUFTLENBQUN2OEMsT0FEbkIsQ0FMRixFQU9FMG5CLE1BQU0sQ0FBQyxJQUFBLENBQUs0ekIsS0FBTixDQUFOLENBQ0d2dkQsS0FESCxDQUNTd3dELFNBQVMsQ0FBQzM3QyxTQURuQixDQVBGLENBQUEsQ0FBQTtFQVVELEtBQUE7RUFFRDtFQUNGO0VBQ0E7Ozs7RUFDRSxJQUFBLEtBQUEsRUFBQSxTQUFBLElBQUEsQ0FBS2lRLElBQUwsRUFBVztFQUFBLE1BQUEsSUFBQSxLQUFBLEdBQUEsSUFBQSxDQUFBOztFQUNULE1BQUEsSUFBQSxDQUFLeXFDLEtBQUwsQ0FBV3ZrRCxLQUFYLENBQWlCNFYsT0FBakIsR0FBMkIsRUFBM0IsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLMnVDLEtBQUwsQ0FBV3ZrRCxLQUFYLENBQWlCb1csTUFBakIsR0FBMEIsQ0FBMUIsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLNHVCLFFBQUwsR0FBZ0IsSUFBQSxDQUFLQSxRQUFMLElBQWlCLElBQUEsQ0FBS3VnQixZQUFMLEVBQWpDLENBQUE7O0VBQ0EsTUFBQSxJQUFNQyxTQUFTLEdBQUcsSUFBQSxDQUFLSix3QkFBTCxDQUE4QixJQUFBLENBQUtwZ0IsUUFBbkMsQ0FBbEIsQ0FBQTs7RUFDQSxNQUFBLElBQUEsQ0FBSytmLGdCQUFMLEdBQXdCLElBQUtDLENBQUFBLG1CQUFMLEVBQXhCLENBQUE7RUFFQXp3RCxNQUFBQSxVQUFVLENBQUMsWUFBTTtFQUFFO0VBQ2pCbzhCLFFBQUFBLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FDRXNWLE1BQU0sQ0FBQyxLQUFJLENBQUNvMEIsZ0JBQU4sQ0FBTixDQUNHMXFDLElBREgsQ0FDUSxLQUFJLENBQUN2RyxLQURiLENBQUEsQ0FFRzllLEtBRkgsQ0FFUztFQUNMdWdDLFVBQUFBLFNBQVMsd0JBQWlCLEtBQUksQ0FBQ3F2QixLQUFMLEdBQWEsS0FBSSxDQUFDNWYsUUFBbkMsRUFBQSxXQUFBLENBQUE7V0FIYixFQUlLLEtBQUksQ0FBQzdRLEdBSlYsQ0FERixFQU9FeEQsTUFBTSxDQUFDLEtBQUksQ0FBQ3lFLEtBQU4sQ0FBTixDQUNHL2EsSUFESCxDQUNRLEtBQUksQ0FBQ3ZHLEtBRGIsQ0FBQSxDQUVHOWUsS0FGSCxDQUVTO0VBQ0w0Z0IsVUFBQUEsT0FBTyxFQUFFLE9BQUE7V0FIYixDQVBGLEVBYUUrYSxNQUFNLENBQUMsS0FBSSxDQUFDNHpCLEtBQUwsQ0FBV3pJLFFBQVosQ0FBTixDQUNHemhDLElBREgsQ0FDUSxLQUFJLENBQUN2RyxLQURiLENBQUEsQ0FFRzllLEtBRkgsQ0FFU3d3RCxTQUFTLENBQUN2OEMsT0FGbkIsRUFFNEIsS0FBSSxDQUFDa3JCLEdBRmpDLENBYkYsRUFpQkV4RCxNQUFNLENBQUMsS0FBSSxDQUFDNHpCLEtBQU4sQ0FBTixDQUNHbHFDLElBREgsQ0FDUSxLQUFJLENBQUN2RyxLQURiLENBRUc5ZSxDQUFBQSxLQUZILENBRVN3d0QsU0FBUyxDQUFDMzdDLFNBRm5CLEVBRThCLEtBQUksQ0FBQ3NxQixHQUZuQyxDQUFBLENBR0duL0IsS0FISCxDQUdTLFVBQUE4QixRQUFRLEVBQUk7WUFDakIsS0FBSSxDQUFDaXVELGdCQUFMLEdBQXdCLElBQXhCLENBQUE7WUFDQWp1RCxRQUFRLEVBQUEsQ0FBQTtZQUNSZ2pCLElBQUksSUFBSUEsSUFBSSxFQUFaLENBQUE7RUFDRCxTQVBILENBakJGLENBQUEsQ0FBQTtTQURRLEVBMkJQLElBQUssR0FBQSxFQTNCRSxDQUFWLENBQUE7RUE0QkQsS0FBQTtFQUVEO0VBQ0Y7RUFDQTs7OztFQUNFLElBQUEsS0FBQSxFQUFBLFNBQUEsS0FBQSxDQUFNQSxJQUFOLEVBQVk7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDVixNQUFBLElBQU0wckMsU0FBUyxHQUFHLElBQUEsQ0FBS0osd0JBQUwsQ0FBOEIsQ0FBOUIsQ0FBbEIsQ0FBQTs7RUFDQSxNQUFBLElBQUEsQ0FBS0wsZ0JBQUwsR0FBd0IsSUFBS0MsQ0FBQUEsbUJBQUwsRUFBeEIsQ0FBQTtFQUVBcjBCLE1BQUFBLE1BQU0sQ0FBQ3RWLE1BQVAsQ0FDRXNWLE1BQU0sQ0FBQyxJQUFLbzBCLENBQUFBLGdCQUFOLENBQU4sQ0FDRzFxQyxJQURILENBQ1EsSUFBQSxDQUFLdkcsS0FEYixDQUFBLENBRUc5ZSxLQUZILENBRVM7RUFDTHVnQyxRQUFBQSxTQUFTLEVBQUUsc0JBQUE7RUFETixPQUZULEVBSUssSUFBS3BCLENBQUFBLEdBSlYsQ0FERixFQU9FeEQsTUFBTSxDQUFDLElBQUEsQ0FBS3lFLEtBQU4sQ0FBTixDQUNHL2EsSUFESCxDQUNRLEtBQUt2RyxLQURiLENBQUEsQ0FFRzllLEtBRkgsQ0FFUztFQUNMNGdCLFFBQUFBLE9BQU8sRUFBRSxNQUFBO1NBSGIsQ0FQRixFQWFFK2EsTUFBTSxDQUFDLEtBQUs0ekIsS0FBTCxDQUFXekksUUFBWixDQUFOLENBQ0d6aEMsSUFESCxDQUNRLElBQUt2RyxDQUFBQSxLQURiLEVBRUc5ZSxLQUZILENBRVN3d0QsU0FBUyxDQUFDdjhDLE9BRm5CLEVBRTRCLElBQUEsQ0FBS2tyQixHQUZqQyxDQWJGLEVBaUJFeEQsTUFBTSxDQUFDLEtBQUs0ekIsS0FBTixDQUFOLENBQ0dscUMsSUFESCxDQUNRLElBQUt2RyxDQUFBQSxLQURiLENBRUc5ZSxDQUFBQSxLQUZILENBRVN3d0QsU0FBUyxDQUFDMzdDLFNBRm5CLEVBRThCLElBQUtzcUIsQ0FBQUEsR0FGbkMsRUFHR24vQixLQUhILENBR1MsVUFBQThCLFFBQVEsRUFBSTtVQUNqQixNQUFJLENBQUNpdUQsZ0JBQUwsR0FBd0IsSUFBeEIsQ0FBQTtFQUNBLFFBQUEsTUFBSSxDQUFDUixLQUFMLENBQVd2a0QsS0FBWCxDQUFpQm9XLE1BQWpCLEdBQTBCLENBQTFCLENBQUE7RUFDQSxRQUFBLE1BQUksQ0FBQ211QyxLQUFMLENBQVd2a0QsS0FBWCxDQUFpQjRWLE9BQWpCLEdBQTJCLE1BQTNCLENBQUE7VUFDQSxNQUFJLENBQUMydUMsS0FBTCxDQUFXekksUUFBWCxDQUFvQjk3QyxLQUFwQixDQUEwQnExQixPQUExQixHQUFvQyxFQUFwQyxDQUFBO1VBQ0F2YixJQUFJLElBQUlBLElBQUksRUFBWixDQUFBO1VBQ0FoakIsUUFBUSxFQUFBLENBQUE7RUFDVCxPQVZILENBakJGLENBQUEsQ0FBQTtFQTZCRCxLQUFBOzs7YUFFRCxTQUFlLFlBQUEsR0FBQTtRQUNiLE9BQU8sSUFBQSxDQUFLeXRELEtBQUwsQ0FBV3RVLFdBQWxCLENBQUE7RUFDRCxLQUFBOzs7O0lBNUtpRG1VOztFQ01wRCxJQUFNbHRCLGVBQWEsR0FBRztFQUNwQmxkLEVBQUFBLE9BQU8sRUFBRTJxQyx1QkFEVztFQUVwQmMsRUFBQUEsT0FBTyxFQUFFZCx1QkFGVztFQUdwQnh2RCxFQUFBQSxJQUFJLEVBQUUwdkQsb0JBSGM7RUFJcEJhLEVBQUFBLE1BQU0sRUFBRVQsc0JBQUFBO0VBSlksQ0FBdEIsQ0FBQTtFQU9BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztNQUNxQlU7Ozs7O0lBMEduQixTQUFjLGVBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGVBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQSxJQUFBLEtBQUEsQ0FBS0MsYUFBTCxHQUFxQixLQUFBLENBQUtBLGFBQUwsQ0FBbUI5NUMsSUFBbkIsQ0FBckIsc0JBQUEsQ0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO0VBRUErZCxJQUFBQSxZQUFZLGdDQUFPLFlBQU07RUFDdkIsTUFBQSxDQUFDLEtBQUsyTixDQUFBQSxJQUFOLElBQWMsS0FBQSxDQUFLNTVCLFdBQUwsQ0FBaUI3TSxRQUFRLENBQUMwTSxhQUFULENBQXVCLG1CQUF2QixDQUFqQixDQUFkLENBQUE7O0VBQ0EsTUFBQSxLQUFBLENBQUtvb0QsT0FBTCxFQUFBLENBQUE7RUFDRCxLQUhXLENBQVosQ0FBQTtFQUxZLElBQUEsT0FBQSxLQUFBLENBQUE7RUFTYixHQUFBOzs7O0VBakhELElBQUEsS0FBQSxFQUFBLFNBQUEsUUFBQSxDQUFTOUIsSUFBVCxFQUFlO1FBQ2IsSUFBTWhrRCxPQUFPLEdBQUdILE1BQUksQ0FBQ3VILFNBQUwsQ0FBZSxJQUFmLEVBQXFCLFVBQUFyUyxDQUFDLEVBQUk7RUFDeEMsUUFBQSxPQUFPOEssTUFBSSxDQUFDeE4sS0FBTCxDQUFXMEMsQ0FBWCxFQUFjLG1CQUFkLENBQXNDQSxJQUFBQSxDQUFDLENBQUM2TCxZQUFGLENBQWUsTUFBZixNQUEyQm9qRCxJQUF4RSxDQUFBO0VBQ0QsT0FGZSxDQUFoQixDQUFBO0VBR0EsTUFBQSxPQUFPaGtELE9BQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBQ0UsU0FBVyxHQUFBLEdBQUE7RUFDVCxNQUFBLE9BQU8sSUFBSytsRCxDQUFBQSxRQUFMLENBQWMsTUFBZCxDQUFQLENBQUE7RUFDRCxLQUFBO0VBQ0Q7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQVksR0FBQSxHQUFBO0VBQ1YsTUFBQSxPQUFPLElBQUtBLENBQUFBLFFBQUwsQ0FBYyxPQUFkLENBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBQ0UsU0FBVyxHQUFBLEdBQUE7RUFDVCxNQUFBLE9BQU9sbUQsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsbUJBQXJCLENBQVAsQ0FBQTtFQUNELEtBQUE7OztXQUVELFNBQWEsR0FBQSxHQUFBO1FBQ1gsT0FBTyxDQUFDLElBQUs4TyxDQUFBQSxJQUFOLEVBQVksSUFBQSxDQUFLQyxLQUFqQixDQUF3QmxYLENBQUFBLE1BQXhCLENBQStCLFVBQUFsSyxDQUFDLEVBQUE7RUFBQSxRQUFBLE9BQUlBLENBQUosQ0FBQTtFQUFBLE9BQWhDLENBQVAsQ0FBQTtFQUNELEtBQUE7RUFDRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7O1dBQ0UsU0FBYyxHQUFBLEdBQUE7RUFDWixNQUFBLE9BQU84SyxNQUFJLENBQUN1SCxTQUFMLENBQWUsSUFBZixFQUFxQixzQkFBckIsQ0FBUCxDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBYyxHQUFBLEdBQUE7UUFDWixPQUFPLElBQUEsQ0FBSzhCLE9BQUwsQ0FBYTZ5QyxRQUFwQixDQUFBO0VBQ0QsS0FBQTs7O1dBRUQsU0FBVyxHQUFBLEdBQUE7RUFDVCxNQUFBLE9BQU9sOEMsTUFBSSxDQUFDdUgsU0FBTCxDQUFlLElBQWYsRUFBcUIsbUJBQXJCLENBQVAsQ0FBQTtFQUNELEtBQUE7RUFFRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7OztXQUNFLFNBQXlCLEdBQUEsR0FBQTtFQUN2QixNQUFBLE9BQU8sS0FBS2l2QixrQkFBWixDQUFBOztFQUdGLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxDQUF1QnQvQixRQUF2QixFQUFpQztRQUMvQixJQUFJLElBQUEsQ0FBS3MvQixrQkFBVCxFQUE2QjtVQUMzQixJQUFLQSxDQUFBQSxrQkFBTCxDQUF3QmhoQixPQUF4QixFQUFBLENBQUE7RUFDRCxPQUFBOztRQUVELElBQUtnaEIsQ0FBQUEsa0JBQUwsR0FBMEI3ZiwwQkFBMEIsQ0FBQ1UsYUFBM0IsQ0FBeUMsSUFBekMsRUFBK0NuZ0IsUUFBL0MsQ0FBMUIsQ0FBQTtFQUNELEtBQUE7OztFQUVELElBQUEsS0FBQSxFQUFBLFNBQUEsbUJBQUEsQ0FBb0IrRixLQUFwQixFQUEyQjtFQUN6QixNQUFBLElBQUEsQ0FBS2luRCxNQUFMLENBQVlwakQsSUFBWixDQUFpQixVQUFBRixDQUFDLEVBQUE7VUFBQSxPQUFJQSxDQUFDLENBQUNra0QsTUFBRixHQUFXbGtELENBQUMsQ0FBQzBqRCxLQUFGLEVBQVgsR0FBdUIsS0FBM0IsQ0FBQTtFQUFBLE9BQWxCLENBQXVEcm5ELElBQUFBLEtBQUssQ0FBQzJZLGlCQUFOLEVBQXZELENBQUE7RUFDRCxLQUFBOzs7RUFFRCxJQUFBLEtBQUEsRUFBQSxTQUFBLGFBQUEsQ0FBYzFnQixDQUFkLEVBQWlCO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7O0VBQ2YsTUFBQSxJQUFJQSxDQUFDLENBQUMrQixNQUFGLENBQVNFLFVBQWIsRUFBeUI7VUFDdkI4eUIsWUFBWSxDQUFDLElBQUQsRUFBTyxZQUFNO0VBQ3ZCLFVBQUEsTUFBSSxDQUFDZzhCLE9BQUwsRUFBQSxDQUFBO0VBQ0QsU0FGVyxDQUFaLENBQUE7RUFHRCxPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBVSxPQUFBLEdBQUE7RUFBQSxNQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7RUFDUixNQUFBLElBQUEsQ0FBSy9CLE1BQUwsQ0FBWTd1RCxPQUFaLENBQW9CLFVBQUE4dUQsSUFBSSxFQUFJO1VBQzFCLElBQUksTUFBSSxDQUFDOTZDLE9BQVQsRUFBa0I7WUFDaEIsTUFBSSxDQUFDQSxPQUFMLENBQWFqSixLQUFiLENBQW1CK2pELElBQUksQ0FBQ0EsSUFBeEIsQ0FBZ0NBLEdBQUFBLElBQUksQ0FBQ0MsSUFBTCxLQUFjLE9BQWQsR0FBd0JELElBQUksQ0FBQy9qRCxLQUFMLENBQVd0TyxLQUFuQyxHQUEyQyxDQUEzRSxDQUFBO0VBQ0QsU0FBQTtTQUhILENBQUEsQ0FBQTtFQUtELEtBQUE7OzthQWFELFNBQW9CLGlCQUFBLEdBQUE7UUFDbEIsSUFBS21sQyxDQUFBQSxrQkFBTCxHQUEwQixJQUFLdWYsQ0FBQUEsbUJBQUwsQ0FBeUJ0cUMsSUFBekIsQ0FBOEIsSUFBOUIsQ0FBMUIsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLalgsZ0JBQUwsQ0FBc0IsWUFBdEIsRUFBb0MsSUFBSyt3RCxDQUFBQSxhQUF6QyxFQUF3RCxLQUF4RCxDQUFBLENBQUE7RUFDRCxLQUFBOzs7YUFFRCxTQUF1QixvQkFBQSxHQUFBO1FBQ3JCLElBQUt4dkIsQ0FBQUEsa0JBQUwsQ0FBd0JoaEIsT0FBeEIsRUFBQSxDQUFBOztRQUNBLElBQUtnaEIsQ0FBQUEsa0JBQUwsR0FBMEIsSUFBMUIsQ0FBQTtFQUNBLE1BQUEsSUFBQSxDQUFLbDhCLG1CQUFMLENBQXlCLFlBQXpCLEVBQXVDLElBQUswckQsQ0FBQUEsYUFBNUMsRUFBMkQsS0FBM0QsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSx3QkFBQSxDQUF5QnRyRCxJQUF6QixFQUErQnNJLElBQS9CLEVBQXFDQyxPQUFyQyxFQUE4QyxFQUFFOzs7YUFFaEQsU0FBUSxLQUFBLEdBQUE7RUFDTmpELE1BQUFBLE1BQUksQ0FBQ3dJLGVBQUwsQ0FBcUIsSUFBckIsRUFBMkIsT0FBM0IsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBUSxLQUFBLEdBQUE7RUFDTnhJLE1BQUFBLE1BQUksQ0FBQ3dJLGVBQUwsQ0FBcUIsSUFBckIsRUFBMkIsT0FBM0IsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBVyxRQUFBLEdBQUE7RUFDVHhJLE1BQUFBLE1BQUksQ0FBQ3dJLGVBQUwsQ0FBcUIsSUFBckIsRUFBMkIsVUFBM0IsQ0FBQSxDQUFBO0VBQ0EsTUFBQSxJQUFBLENBQUszRSxNQUFMLEVBQUEsQ0FBQTtFQUNELEtBQUE7OzthQUVELFNBQXdCbkosZ0JBQUFBLENBQUFBLElBQXhCLEVBQThCb1osUUFBOUIsRUFBd0M7RUFDdEMsTUFBQSxJQUFJLEVBQUVBLFFBQVEsWUFBWTB3QyxnQkFBdEIsQ0FBSixFQUE2QztVQUMzQ3hrRCxNQUFJLENBQUM4TixhQUFMLENBQW1CLFVBQW5CLENBQUEsQ0FBQTtFQUNELE9BQUE7O0VBQ0R3cEIsTUFBQUEsZUFBYSxDQUFDNThCLElBQUQsQ0FBYixHQUFzQm9aLFFBQXRCLENBQUE7RUFDRCxLQUFBOzs7V0FFRCxTQUE4QixHQUFBLEdBQUE7RUFDNUIsTUFBQSxPQUFPMHdDLGdCQUFQLENBQUE7RUFDRCxLQUFBOzs7V0FFRCxTQUF1QixHQUFBLEdBQUE7RUFDckIsTUFBQSxPQUFPbHRCLGVBQVAsQ0FBQTtFQUNELEtBQUE7Ozs7SUE1SjBDdkQ7RUErSjdDcGxCLFdBQVcsQ0FBQ3czQyxRQUFaLEdBQXVCSixlQUF2QixDQUFBO0VBQ0E3eEQsY0FBYyxDQUFDbWdDLE1BQWYsQ0FBc0IsY0FBdEIsRUFBc0MweEIsZUFBdEMsQ0FBQTs7RUN6TUEsSUFBTUssVUFBVSxHQUFHLE9BQW5CLENBQUE7RUFDQSxJQUFNQyxhQUFhLEdBQUcsVUFBdEIsQ0FBQTtFQUNBLElBQU1DLFlBQVksR0FBRyxRQUFyQixDQUFBO0VBQ0EsSUFBTUMsVUFBVSxHQUFHLE1BQW5CLENBQUE7RUFDQSxJQUFNQyxjQUFjLEdBQUcsVUFBdkIsQ0FBQTtFQUVBLElBQU0xUSxhQUFXLEdBQUc7RUFDbEI7RUFDRjtFQUNBO0VBQ0E7RUFDRTcrQixFQUFBQSxLQUxrQixFQUtad3ZDLFNBQUFBLEtBQUFBLENBQUFBLG1CQUxZLEVBS1N2dkQsUUFMVCxFQUttQjtNQUNuQ3hDLFlBQVksQ0FBQ3dDLFFBQUQsQ0FBWixDQUFBO0VBQ0QsR0FBQTtFQVBpQixDQUFwQixDQUFBOztNQVVNd3ZEO0lBQ0osU0FBWXZtRCxpQkFBQUEsQ0FBQUEsT0FBWixFQUFxQmxKLE1BQXJCLEVBQTZCO0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGlCQUFBLENBQUEsQ0FBQTs7TUFDM0IsSUFBS3FlLENBQUFBLFFBQUwsR0FBZ0JuVixPQUFoQixDQUFBO01BQ0EsSUFBSzhvQyxDQUFBQSxTQUFMLEdBQWlCLElBQUtBLENBQUFBLFNBQUwsQ0FBZS84QixJQUFmLENBQW9CLElBQXBCLENBQWpCLENBQUE7RUFDQWpWLElBQUFBLE1BQU0sSUFBSSxJQUFBLENBQUswdkQsWUFBTCxDQUFrQjF2RCxNQUFsQixDQUFWLENBQUE7RUFDRCxHQUFBOzs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxZQUFBLENBQWFBLE1BQWIsRUFBcUI7RUFDbkIsTUFBQSxJQUFBLENBQUs2TCxPQUFMLEVBQUEsQ0FBQTtRQUNBLElBQUs4akQsQ0FBQUEsT0FBTCxHQUFlM3ZELE1BQWYsQ0FBQTs7RUFDQSxNQUFBLElBQUlBLE1BQUosRUFBWTtFQUNWLFFBQUEsSUFBQSxDQUFLNHZELFlBQUwsR0FBb0IsQ0FBQyxVQUFELEVBQWEsV0FBYixDQUEwQmgwRCxDQUFBQSxPQUExQixDQUFrQ29FLE1BQWxDLENBQThDLEtBQUEsQ0FBQyxDQUFuRSxDQUFBO0VBQ0EsUUFBQSxJQUFBLENBQUs2dkQsUUFBTCxFQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxNQUFBLENBQU9oN0MsS0FBUCxFQUFjO1FBQ1osSUFBSSxJQUFBLENBQUsrNkMsWUFBVCxFQUF1QjtVQUNyQixPQUFPLElBQUEsQ0FBS0QsT0FBTCxNQUFrQjk2QyxLQUFLLENBQUNnaUIsVUFBTixHQUFtQixVQUFuQixHQUFnQyxXQUFsRCxDQUFQLENBQUE7RUFDRCxPQUFBOztRQUNELE9BQU9oaUIsS0FBSyxDQUFDM0UsT0FBYixDQUFBO0VBQ0QsS0FBQTs7O0VBRUQsSUFBQSxLQUFBLEVBQUEsU0FBQSxTQUFBLENBQVUyRSxLQUFWLEVBQWlCO1FBQ2YsSUFBS3dKLENBQUFBLFFBQUwsQ0FBY3l4QyxXQUFkLENBQTBCLElBQUEsQ0FBS0MsTUFBTCxDQUFZbDdDLEtBQVosQ0FBQSxHQUFxQnU2QyxhQUFyQixHQUFxQ0QsVUFBL0QsQ0FBQSxDQUFBO0VBQ0QsS0FBQTs7O2FBRUQsU0FBVyxRQUFBLEdBQUE7UUFDVCxJQUFJLElBQUEsQ0FBS1MsWUFBVCxFQUF1QjtFQUNyQnY0QixRQUFBQSxXQUFXLENBQUN4dkIsRUFBWixDQUFlLFFBQWYsRUFBeUIsS0FBS21xQyxTQUE5QixDQUFBLENBQUE7O0VBQ0EsUUFBQSxJQUFBLENBQUtBLFNBQUwsQ0FBZTtZQUFDbmIsVUFBVSxFQUFFUSxXQUFXLENBQUNSLFVBQVosRUFBQTtXQUE1QixDQUFBLENBQUE7RUFDRCxPQUhELE1BR087VUFDTCxJQUFLbTVCLENBQUFBLFlBQUwsR0FBb0J4MkQsTUFBTSxDQUFDeTJELFVBQVAsQ0FBa0IsSUFBQSxDQUFLTixPQUF2QixDQUFwQixDQUFBOztFQUNBLFFBQUEsSUFBQSxDQUFLSyxZQUFMLENBQWtCRSxXQUFsQixDQUE4QixLQUFLbGUsU0FBbkMsQ0FBQSxDQUFBOztVQUNBLElBQUtBLENBQUFBLFNBQUwsQ0FBZSxJQUFBLENBQUtnZSxZQUFwQixDQUFBLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7O2FBRUQsU0FBVSxPQUFBLEdBQUE7UUFDUixJQUFJLElBQUEsQ0FBS0osWUFBVCxFQUF1QjtFQUNyQnY0QixRQUFBQSxXQUFXLENBQUNudkIsR0FBWixDQUFnQixRQUFoQixFQUEwQixLQUFLOHBDLFNBQS9CLENBQUEsQ0FBQTtFQUNELE9BRkQsTUFFTyxJQUFJLElBQUtnZSxDQUFBQSxZQUFULEVBQXVCO0VBQzVCLFFBQUEsSUFBQSxDQUFLQSxZQUFMLENBQWtCRyxjQUFsQixDQUFpQyxLQUFLbmUsU0FBdEMsQ0FBQSxDQUFBOztVQUNBLElBQUtnZSxDQUFBQSxZQUFMLEdBQW9CLElBQXBCLENBQUE7RUFDRCxPQUFBO0VBQ0YsS0FBQTs7Ozs7RUFRSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O01BQ3FCSTs7Ozs7RUFFbkI7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VB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