UNPKG

3.04 MBJavaScriptView Raw
1/* onsenui v2.12.8 - 2022-12-27 */
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 if (Object.getOwnPropertySymbols) {
12 var symbols = Object.getOwnPropertySymbols(object);
13 enumerableOnly && (symbols = symbols.filter(function (sym) {
14 return Object.getOwnPropertyDescriptor(object, sym).enumerable;
15 })), keys.push.apply(keys, symbols);
16 }
17 return keys;
18 }
19 function _objectSpread2(target) {
20 for (var i = 1; i < arguments.length; i++) {
21 var source = null != arguments[i] ? arguments[i] : {};
22 i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
23 _defineProperty(target, key, source[key]);
24 }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
25 Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
26 });
27 }
28 return target;
29 }
30 function _typeof(obj) {
31 "@babel/helpers - typeof";
32
33 return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
34 return typeof obj;
35 } : function (obj) {
36 return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
37 }, _typeof(obj);
38 }
39 function _classCallCheck(instance, Constructor) {
40 if (!(instance instanceof Constructor)) {
41 throw new TypeError("Cannot call a class as a function");
42 }
43 }
44 function _defineProperties(target, props) {
45 for (var i = 0; i < props.length; i++) {
46 var descriptor = props[i];
47 descriptor.enumerable = descriptor.enumerable || false;
48 descriptor.configurable = true;
49 if ("value" in descriptor) descriptor.writable = true;
50 Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
51 }
52 }
53 function _createClass(Constructor, protoProps, staticProps) {
54 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
55 if (staticProps) _defineProperties(Constructor, staticProps);
56 Object.defineProperty(Constructor, "prototype", {
57 writable: false
58 });
59 return Constructor;
60 }
61 function _defineProperty(obj, key, value) {
62 key = _toPropertyKey(key);
63 if (key in obj) {
64 Object.defineProperty(obj, key, {
65 value: value,
66 enumerable: true,
67 configurable: true,
68 writable: true
69 });
70 } else {
71 obj[key] = value;
72 }
73 return obj;
74 }
75 function _inherits(subClass, superClass) {
76 if (typeof superClass !== "function" && superClass !== null) {
77 throw new TypeError("Super expression must either be null or a function");
78 }
79 subClass.prototype = Object.create(superClass && superClass.prototype, {
80 constructor: {
81 value: subClass,
82 writable: true,
83 configurable: true
84 }
85 });
86 Object.defineProperty(subClass, "prototype", {
87 writable: false
88 });
89 if (superClass) _setPrototypeOf(subClass, superClass);
90 }
91 function _getPrototypeOf(o) {
92 _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
93 return o.__proto__ || Object.getPrototypeOf(o);
94 };
95 return _getPrototypeOf(o);
96 }
97 function _setPrototypeOf(o, p) {
98 _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
99 o.__proto__ = p;
100 return o;
101 };
102 return _setPrototypeOf(o, p);
103 }
104 function _isNativeReflectConstruct() {
105 if (typeof Reflect === "undefined" || !Reflect.construct) return false;
106 if (Reflect.construct.sham) return false;
107 if (typeof Proxy === "function") return true;
108 try {
109 Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
110 return true;
111 } catch (e) {
112 return false;
113 }
114 }
115 function _objectWithoutPropertiesLoose(source, excluded) {
116 if (source == null) return {};
117 var target = {};
118 var sourceKeys = Object.keys(source);
119 var key, i;
120 for (i = 0; i < sourceKeys.length; i++) {
121 key = sourceKeys[i];
122 if (excluded.indexOf(key) >= 0) continue;
123 target[key] = source[key];
124 }
125 return target;
126 }
127 function _objectWithoutProperties(source, excluded) {
128 if (source == null) return {};
129 var target = _objectWithoutPropertiesLoose(source, excluded);
130 var key, i;
131 if (Object.getOwnPropertySymbols) {
132 var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
133 for (i = 0; i < sourceSymbolKeys.length; i++) {
134 key = sourceSymbolKeys[i];
135 if (excluded.indexOf(key) >= 0) continue;
136 if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
137 target[key] = source[key];
138 }
139 }
140 return target;
141 }
142 function _assertThisInitialized(self) {
143 if (self === void 0) {
144 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
145 }
146 return self;
147 }
148 function _possibleConstructorReturn(self, call) {
149 if (call && (typeof call === "object" || typeof call === "function")) {
150 return call;
151 } else if (call !== void 0) {
152 throw new TypeError("Derived constructors may only return object or undefined");
153 }
154 return _assertThisInitialized(self);
155 }
156 function _createSuper(Derived) {
157 var hasNativeReflectConstruct = _isNativeReflectConstruct();
158 return function _createSuperInternal() {
159 var Super = _getPrototypeOf(Derived),
160 result;
161 if (hasNativeReflectConstruct) {
162 var NewTarget = _getPrototypeOf(this).constructor;
163 result = Reflect.construct(Super, arguments, NewTarget);
164 } else {
165 result = Super.apply(this, arguments);
166 }
167 return _possibleConstructorReturn(this, result);
168 };
169 }
170 function _superPropBase(object, property) {
171 while (!Object.prototype.hasOwnProperty.call(object, property)) {
172 object = _getPrototypeOf(object);
173 if (object === null) break;
174 }
175 return object;
176 }
177 function _get() {
178 if (typeof Reflect !== "undefined" && Reflect.get) {
179 _get = Reflect.get.bind();
180 } else {
181 _get = function _get(target, property, receiver) {
182 var base = _superPropBase(target, property);
183 if (!base) return;
184 var desc = Object.getOwnPropertyDescriptor(base, property);
185 if (desc.get) {
186 return desc.get.call(arguments.length < 3 ? target : receiver);
187 }
188 return desc.value;
189 };
190 }
191 return _get.apply(this, arguments);
192 }
193 function _toConsumableArray(arr) {
194 return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
195 }
196 function _arrayWithoutHoles(arr) {
197 if (Array.isArray(arr)) return _arrayLikeToArray(arr);
198 }
199 function _iterableToArray(iter) {
200 if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
201 }
202 function _unsupportedIterableToArray(o, minLen) {
203 if (!o) return;
204 if (typeof o === "string") return _arrayLikeToArray(o, minLen);
205 var n = Object.prototype.toString.call(o).slice(8, -1);
206 if (n === "Object" && o.constructor) n = o.constructor.name;
207 if (n === "Map" || n === "Set") return Array.from(o);
208 if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
209 }
210 function _arrayLikeToArray(arr, len) {
211 if (len == null || len > arr.length) len = arr.length;
212 for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
213 return arr2;
214 }
215 function _nonIterableSpread() {
216 throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
217 }
218 function _toPrimitive(input, hint) {
219 if (typeof input !== "object" || input === null) return input;
220 var prim = input[Symbol.toPrimitive];
221 if (prim !== undefined) {
222 var res = prim.call(input, hint || "default");
223 if (typeof res !== "object") return res;
224 throw new TypeError("@@toPrimitive must return a primitive value.");
225 }
226 return (hint === "string" ? String : Number)(input);
227 }
228 function _toPropertyKey(arg) {
229 var key = _toPrimitive(arg, "string");
230 return typeof key === "symbol" ? key : String(key);
231 }
232
233 /*
234 Copyright 2013-2015 ASIAL CORPORATION
235
236 Licensed under the Apache License, Version 2.0 (the "License");
237 you may not use this file except in compliance with the License.
238 You may obtain a copy of the License at
239
240 http://www.apache.org/licenses/LICENSE-2.0
241
242 Unless required by applicable law or agreed to in writing, software
243 distributed under the License is distributed on an "AS IS" BASIS,
244 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
245 See the License for the specific language governing permissions and
246 limitations under the License.
247
248 */
249
250 // Save HTMLElement object before Custom Elements polyfill patch global HTMLElement.
251 var NativeHTMLElement = window.HTMLElement;
252
253 /**
254 * @object ons.platform
255 * @category util
256 * @description
257 * [en]Utility methods to detect current platform.[/en]
258 * [ja]現在実行されているプラットフォームを検知するためのユーティリティメソッドを収めたオブジェクトです。[/ja]
259 */
260 var Platform = /*#__PURE__*/function () {
261 /**
262 * All elements will be rendered as if the app was running on this platform.
263 * @type {String}
264 */
265 function Platform() {
266 _classCallCheck(this, Platform);
267 this._selectedPlatform = null;
268 this._ignorePlatformSelect = false;
269 }
270
271 /**
272 * @method select
273 * @signature select(platform)
274 * @param {string} platform Name of the platform.
275 * [en]Possible values are: "opera", "firefox", "safari", "chrome", "ie", "android", "blackberry", "ios" or "wp".[/en]
276 * [ja]"opera", "firefox", "safari", "chrome", "ie", "android", "blackberry", "ios", "wp"のいずれかを指定します。[/ja]
277 * @description
278 * [en]Sets the platform used to render the elements. Useful for testing.[/en]
279 * [ja]要素を描画するために利用するプラットフォーム名を設定します。テストに便利です。[/ja]
280 */
281 _createClass(Platform, [{
282 key: "select",
283 value: function select(platform) {
284 if (typeof platform === 'string') {
285 this._selectedPlatform = platform.trim().toLowerCase();
286 }
287 }
288 }, {
289 key: "_getSelectedPlatform",
290 value: function _getSelectedPlatform() {
291 return this._ignorePlatformSelect ? null : this._selectedPlatform;
292 }
293 }, {
294 key: "_runOnActualPlatform",
295 value: function _runOnActualPlatform(fn) {
296 this._ignorePlatformSelect = true;
297 var result = fn();
298 this._ignorePlatformSelect = false;
299 return result;
300 }
301
302 //----------------
303 // General
304 //----------------
305 /**
306 * @method isWebView
307 * @signature isWebView()
308 * @description
309 * [en]Returns whether app is running in Cordova.[/en]
310 * [ja]Cordova内で実行されているかどうかを返します。[/ja]
311 * @return {Boolean}
312 */
313 }, {
314 key: "isWebView",
315 value: function isWebView() {
316 if (document.readyState === 'loading' || document.readyState == 'uninitialized') {
317 throw new Error('isWebView() method is available after dom contents loaded.');
318 }
319 return !!(window.cordova || window.phonegap || window.PhoneGap);
320 }
321
322 //----------------
323 // iOS devices
324 //----------------
325 /**
326 * @method isIPhone
327 * @signature isIPhone()
328 * @description
329 * [en]Returns whether the device is iPhone.[/en]
330 * [ja]iPhone上で実行されているかどうかを返します。[/ja]
331 * @return {Boolean}
332 */
333 }, {
334 key: "isIPhone",
335 value: function isIPhone() {
336 return /iPhone/i.test(navigator.userAgent);
337 }
338
339 /**
340 * @method isIPhoneX
341 * @signature isIPhoneX()
342 * @description
343 * [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, 13 Mini, 13, 13 Pro, 13 Pro Max, 14, 14 Plus, 14 Pro, 14 Pro Max.[/en]
344 * [ja]iPhone X や XS、XS Max、XR、11、11 Pro、11 Pro Max、12 Mini、12、12 Pro、12 Pro Max、13 Mini、13、13 Pro、13 Pro Max、14、14 Plus、14 Pro、または14 Pro Max上で実行されているかどうかを返します。[/ja]
345 * @return {Boolean}
346 */
347 }, {
348 key: "isIPhoneX",
349 value: function isIPhoneX() {
350 // iOS WebViews on the same iOS version have the same user agent.
351 // We cannot avoid using window.screen.
352 // We also cannot use cordova-plugin-device since its behavior is different between simulators and real devices.
353 // This works well both in iOS Safari and (UI|WK)WebView of iPhone X.
354 return this.isIPhone() && (
355 // X, XS, 11 Pro, 12 Mini, 13 Mini
356 window.screen.width === 375 && window.screen.height === 812 ||
357 // portrait
358 window.screen.width === 812 && window.screen.height === 375 ||
359 // landscape
360
361 // XS Max, XR, 11, 11 Pro Max
362 window.screen.width === 414 && window.screen.height === 896 ||
363 // portrait
364 window.screen.width === 896 && window.screen.height === 414 ||
365 // landscape
366
367 // 12, 12 Pro, 13, 13 Pro, 14
368 window.screen.width === 390 && window.screen.height === 844 ||
369 // portrait
370 window.screen.width === 844 && window.screen.height === 390 ||
371 // landscape
372
373 // 12 Pro Max, 13 Pro Max, 14 Plus
374 window.screen.width === 428 && window.screen.height === 926 ||
375 // portrait
376 window.screen.width === 926 && window.screen.height === 428 ||
377 // landscape
378
379 // 14 Pro Max
380 window.screen.width === 430 && window.screen.height === 932 ||
381 // portrait
382 window.screen.width === 932 && window.screen.height === 430 ||
383 // landscape
384
385 // 14 Pro
386 window.screen.width === 393 && window.screen.height === 852 ||
387 // portrait
388 window.screen.width === 852 && window.screen.height === 393 // landscape
389 );
390 }
391
392 /**
393 * @method isIPad
394 * @signature isIPad()
395 * @description
396 * [en]Returns whether the device is iPad.[/en]
397 * [ja]iPad上で実行されているかどうかを返します。[/ja]
398 * @return {Boolean}
399 */
400 }, {
401 key: "isIPad",
402 value: function isIPad() {
403 return /iPad/i.test(navigator.userAgent) || this.isIPadOS();
404 }
405
406 /**
407 * @return {Boolean}
408 */
409 }, {
410 key: "isIPod",
411 value: function isIPod() {
412 return /iPod/i.test(navigator.userAgent);
413 }
414
415 //----------------
416 // iOS versions
417 //----------------
418 /**
419 * @method isIOS
420 * @signature isIOS([forceActualPlatform])
421 * @param {Boolean} forceActualPlatform
422 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
423 * [ja][/ja]
424 * @description
425 * [en]Returns whether the OS is iOS. By default will return manually selected platform if it is set.[/en]
426 * [ja]iOS上で実行されているかどうかを返します。[/ja]
427 * @return {Boolean}
428 */
429 }, {
430 key: "isIOS",
431 value: function isIOS(forceActualPlatform) {
432 if (!forceActualPlatform && this._getSelectedPlatform()) {
433 return this._getSelectedPlatform() === 'ios';
434 }
435 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
436 return /iOS/i.test(device.platform);
437 } else {
438 return /iPhone|iPad|iPod/i.test(navigator.userAgent) || this.isIPadOS();
439 }
440 }
441
442 /**
443 * @method isIOS7above
444 * @signature isIOS7above()
445 * @description
446 * [en]Returns whether the iOS version is 7 or above.[/en]
447 * [ja]iOS7以上で実行されているかどうかを返します。[/ja]
448 * @return {Boolean}
449 */
450 }, {
451 key: "isIOS7above",
452 value: function isIOS7above() {
453 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
454 return /iOS/i.test(device.platform) && parseInt(device.version.split('.')[0]) >= 7;
455 } else if (/iPhone|iPad|iPod/i.test(navigator.userAgent)) {
456 var ver = (navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/) || [''])[0].replace(/_/g, '.');
457 return parseInt(ver.split('.')[0]) >= 7;
458 }
459 return false;
460 }
461
462 /**
463 * @method isIPadOS
464 * @signature isIPadOS()
465 * @description
466 * [en]Returns whether the OS is iPadOS.[/en]
467 * [ja][/ja]
468 * @return {Boolean}
469 */
470 }, {
471 key: "isIPadOS",
472 value: function isIPadOS() {
473 // The iPadOS User Agent string is the same as MacOS so as a
474 // workaround we test the max touch points, which is 5 for
475 // iPads and 0 for desktop browsers.
476 return !!(/Macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints === 5);
477 }
478
479 //----------------
480 // iOS browsers
481 //----------------
482 /**
483 * @method isIOSSafari
484 * @signature isIOSSafari()
485 * @description
486 * [en]Returns whether app is running in iOS Safari.[/en]
487 * [ja]iOS Safariで実行されているかどうかを返します。[/ja]
488 * @return {Boolean}
489 */
490 }, {
491 key: "isIOSSafari",
492 value: function isIOSSafari() {
493 var navigator = window.navigator;
494 var ua = navigator.userAgent;
495 return !!(this.isIOS() && ua.indexOf('Safari') !== -1 && ua.indexOf('Version') !== -1 && !navigator.standalone);
496 }
497
498 /**
499 * @method isWKWebView
500 * @signature isWKWebView()
501 * @description
502 * [en]Returns whether app is running in WKWebView.[/en]
503 * [ja]WKWebViewで実行されているかどうかを返します。[/ja]
504 * @return {Boolean}
505 */
506 }, {
507 key: "isWKWebView",
508 value: function isWKWebView() {
509 var lte9 = /constructor/i.test(NativeHTMLElement);
510 return !!(this.isIOS() && window.webkit && window.webkit.messageHandlers && window.indexedDB && !lte9);
511 }
512
513 //----------------
514 // Android devices
515 //----------------
516 /**
517 * @method isAndroidPhone
518 * @signature isAndroidPhone()
519 * @description
520 * [en]Returns whether the device is Android phone.[/en]
521 * [ja]Android携帯上で実行されているかどうかを返します。[/ja]
522 * @return {Boolean}
523 */
524 }, {
525 key: "isAndroidPhone",
526 value: function isAndroidPhone() {
527 return /Android/i.test(navigator.userAgent) && /Mobile/i.test(navigator.userAgent);
528 }
529
530 /**
531 * @method isAndroidTablet
532 * @signature isAndroidTablet()
533 * @description
534 * [en]Returns whether the device is Android tablet.[/en]
535 * [ja]Androidタブレット上で実行されているかどうかを返します。[/ja]
536 * @return {Boolean}
537 */
538 }, {
539 key: "isAndroidTablet",
540 value: function isAndroidTablet() {
541 return /Android/i.test(navigator.userAgent) && !/Mobile/i.test(navigator.userAgent);
542 }
543
544 //----------------
545 // Android versions
546 //----------------
547 /**
548 * @method isAndroid
549 * @signature isAndroid([forceActualPlatform])
550 * @param {Boolean} forceActualPlatform
551 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
552 * [ja][/ja]
553 * @description
554 * [en]Returns whether the OS is Android. By default will return manually selected platform if it is set.[/en]
555 * [ja]Android上で実行されているかどうかを返します。[/ja]
556 * @return {Boolean}
557 */
558 }, {
559 key: "isAndroid",
560 value: function isAndroid(forceActualPlatform) {
561 if (!forceActualPlatform && this._getSelectedPlatform()) {
562 return this._getSelectedPlatform() === 'android';
563 }
564 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
565 return /Android/i.test(device.platform);
566 } else {
567 return /Android/i.test(navigator.userAgent);
568 }
569 }
570
571 //----------------
572 // Other devices
573 //----------------
574 /**
575 * @method isWP
576 * @signature isWP([forceActualPlatform])
577 * @param {Boolean} forceActualPlatform
578 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
579 * [ja][/ja]
580 * @description
581 * [en]Returns whether the OS is Windows phone. By default will return manually selected platform if it is set.[/en]
582 * [ja][/ja]
583 * @return {Boolean}
584 */
585 }, {
586 key: "isWP",
587 value: function isWP(forceActualPlatform) {
588 if (!forceActualPlatform && this._getSelectedPlatform()) {
589 return this._getSelectedPlatform() === 'wp';
590 }
591 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
592 return /Win32NT|WinCE/i.test(device.platform);
593 } else {
594 return /Windows Phone|IEMobile|WPDesktop/i.test(navigator.userAgent);
595 }
596 }
597
598 /**
599 * @method isBlackBerry
600 * @signature isBlackBerry([forceActualPlatform])
601 * @param {Boolean} forceActualPlatform
602 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
603 * [ja][/ja]
604 * @description
605 * [en]Returns whether the device is BlackBerry. By default will return manually selected platform if it is set.[/en]
606 * [ja]BlackBerry上で実行されているかどうかを返します。[/ja]
607 * @return {Boolean}
608 */
609 }, {
610 key: "isBlackBerry",
611 value: function isBlackBerry(forceActualPlatform) {
612 if (!forceActualPlatform && this._getSelectedPlatform()) {
613 return this._getSelectedPlatform() === 'blackberry';
614 }
615 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
616 return /BlackBerry/i.test(device.platform);
617 } else {
618 return /BlackBerry|RIM Tablet OS|BB10/i.test(navigator.userAgent);
619 }
620 }
621
622 //----------------
623 // Other browsers
624 //----------------
625 /**
626 * @method isOpera
627 * @signature isOpera([forceActualPlatform])
628 * @param {Boolean} forceActualPlatform
629 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
630 * [ja][/ja]
631 * @description
632 * [en]Returns whether the browser is Opera. By default will return manually selected platform if it is set.[/en]
633 * [ja]Opera上で実行されているかどうかを返します。[/ja]
634 * @return {Boolean}
635 */
636 }, {
637 key: "isOpera",
638 value: function isOpera(forceActualPlatform) {
639 if (!forceActualPlatform && this._getSelectedPlatform()) {
640 return this._getSelectedPlatform() === 'opera';
641 }
642 return !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
643 }
644
645 /**
646 * @method isFirefox
647 * @signature isFirefox([forceActualPlatform])
648 * @param {Boolean} forceActualPlatform
649 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
650 * [ja][/ja]
651 * @description
652 * [en]Returns whether the browser is Firefox. By default will return manually selected platform if it is set.[/en]
653 * [ja]Firefox上で実行されているかどうかを返します。[/ja]
654 * @return {Boolean}
655 */
656 }, {
657 key: "isFirefox",
658 value: function isFirefox(forceActualPlatform) {
659 if (!forceActualPlatform && this._getSelectedPlatform()) {
660 return this._getSelectedPlatform() === 'firefox';
661 }
662 return typeof InstallTrigger !== 'undefined';
663 }
664
665 /**
666 * @method isSafari
667 * @signature isSafari([forceActualPlatform])
668 * @param {Boolean} forceActualPlatform
669 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
670 * [ja][/ja]
671 * @description
672 * [en]Returns whether the browser is Safari. By default will return manually selected platform if it is set.[/en]
673 * [ja]Safari上で実行されているかどうかを返します。[/ja]
674 * @return {Boolean}
675 */
676 }, {
677 key: "isSafari",
678 value: function isSafari(forceActualPlatform) {
679 if (!forceActualPlatform && this._getSelectedPlatform()) {
680 return this._getSelectedPlatform() === 'safari';
681 }
682 return Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || function (p) {
683 return p.toString() === '[object SafariRemoteNotification]';
684 }(!window['safari'] || safari.pushNotification);
685 }
686
687 /**
688 * @method isChrome
689 * @signature isChrome([forceActualPlatform])
690 * @param {Boolean} forceActualPlatform
691 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
692 * [ja][/ja]
693 * @description
694 * [en]Returns whether the browser is Chrome. By default will return manually selected platform if it is set.[/en]
695 * [ja]Chrome上で実行されているかどうかを返します。[/ja]
696 * @return {Boolean}
697 */
698 }, {
699 key: "isChrome",
700 value: function isChrome(forceActualPlatform) {
701 if (!forceActualPlatform && this._getSelectedPlatform()) {
702 return this._getSelectedPlatform() === 'chrome';
703 }
704 return !!window.chrome && !(!!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0) && !(navigator.userAgent.indexOf(' Edge/') >= 0);
705 }
706
707 /**
708 * @method isIE
709 * @signature isIE([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 Internet Explorer. By default will return manually selected platform if it is set.[/en]
715 * [ja]Internet Explorer上で実行されているかどうかを返します。[/ja]
716 * @return {Boolean}
717 */
718 }, {
719 key: "isIE",
720 value: function isIE(forceActualPlatform) {
721 if (!forceActualPlatform && this._getSelectedPlatform()) {
722 return this._getSelectedPlatform() === 'ie';
723 }
724 return !!document.documentMode;
725 }
726
727 /**
728 * @method isEdge
729 * @signature isEdge([forceActualPlatform])
730 * @param {Boolean} forceActualPlatform
731 * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
732 * [ja][/ja]
733 * @description
734 * [en]Returns whether the browser is Edge. By default will return manually selected platform if it is set.[/en]
735 * [ja]Edge上で実行されているかどうかを返します。[/ja]
736 * @return {Boolean}
737 */
738 }, {
739 key: "isEdge",
740 value: function isEdge(forceActualPlatform) {
741 if (!forceActualPlatform && this._getSelectedPlatform()) {
742 return this._getSelectedPlatform() === 'edge';
743 }
744 return navigator.userAgent.indexOf(' Edge/') >= 0;
745 }
746
747 //----------------
748 // Utility functions
749 //----------------
750 /**
751 * @return {String}
752 */
753 }, {
754 key: "getMobileOS",
755 value: function getMobileOS() {
756 if (this.isAndroid()) {
757 return 'android';
758 } else if (this.isIOS()) {
759 return 'ios';
760 } else if (this.isWP()) {
761 return 'wp';
762 } else {
763 return 'other';
764 }
765 }
766
767 /**
768 * @return {String}
769 */
770 }, {
771 key: "getIOSDevice",
772 value: function getIOSDevice() {
773 if (this.isIPhone()) {
774 return 'iphone';
775 } else if (this.isIPad()) {
776 return 'ipad';
777 } else if (this.isIPod()) {
778 return 'ipod';
779 } else {
780 return 'na';
781 }
782 }
783 }]);
784 return Platform;
785 }();
786 var platform = new Platform();
787
788 // For @onsenui/custom-elements
789 if (window.customElements) {
790 // even if native CE1 impl exists, use polyfill
791 window.customElements.forcePolyfill = true;
792 }
793
794 (function () {
795
796 var g = new function () {}();
797 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(" "));
798 function k(b) {
799 var a = aa.has(b);
800 b = /^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(b);
801 return !a && b;
802 }
803 function l(b) {
804 var a = b.isConnected;
805 if (void 0 !== a) return a;
806 for (; b && !(b.__CE_isImportDocument || b instanceof Document);) b = b.parentNode || (window.ShadowRoot && b instanceof ShadowRoot ? b.host : void 0);
807 return !(!b || !(b.__CE_isImportDocument || b instanceof Document));
808 }
809 function m(b, a) {
810 for (; a && a !== b && !a.nextSibling;) a = a.parentNode;
811 return a && a !== b ? a.nextSibling : null;
812 }
813 function n(b, a, e) {
814 e = e ? e : new Set();
815 for (var c = b; c;) {
816 if (c.nodeType === Node.ELEMENT_NODE) {
817 var d = c;
818 a(d);
819 var h = d.localName;
820 if ("link" === h && "import" === d.getAttribute("rel")) {
821 c = d.import;
822 if (c instanceof Node && !e.has(c)) for (e.add(c), c = c.firstChild; c; c = c.nextSibling) n(c, a, e);
823 c = m(b, d);
824 continue;
825 } else if ("template" === h) {
826 c = m(b, d);
827 continue;
828 }
829 if (d = d.__CE_shadowRoot) for (d = d.firstChild; d; d = d.nextSibling) n(d, a, e);
830 }
831 c = c.firstChild ? c.firstChild : m(b, c);
832 }
833 }
834 function q(b, a, e) {
835 b[a] = e;
836 }
837 function r() {
838 this.a = new Map();
839 this.f = new Map();
840 this.c = [];
841 this.b = !1;
842 }
843 function ba(b, a, e) {
844 b.a.set(a, e);
845 b.f.set(e.constructor, e);
846 }
847 function t(b, a) {
848 b.b = !0;
849 b.c.push(a);
850 }
851 function v(b, a) {
852 b.b && n(a, function (a) {
853 return w(b, a);
854 });
855 }
856 function w(b, a) {
857 if (b.b && !a.__CE_patched) {
858 a.__CE_patched = !0;
859 for (var e = 0; e < b.c.length; e++) b.c[e](a);
860 }
861 }
862 function x(b, a) {
863 var e = [];
864 n(a, function (b) {
865 return e.push(b);
866 });
867 for (a = 0; a < e.length; a++) {
868 var c = e[a];
869 1 === c.__CE_state ? l(c) && b.connectedCallback(c) : y(b, c);
870 }
871 }
872 function z(b, a) {
873 var e = [];
874 n(a, function (b) {
875 return e.push(b);
876 });
877 for (a = 0; a < e.length; a++) {
878 var c = e[a];
879 1 === c.__CE_state && b.disconnectedCallback(c);
880 }
881 }
882 function A(b, a, e) {
883 e = e ? e : new Set();
884 var c = [];
885 n(a, function (d) {
886 if ("link" === d.localName && "import" === d.getAttribute("rel")) {
887 var a = d.import;
888 a instanceof Node && "complete" === a.readyState ? (a.__CE_isImportDocument = !0, a.__CE_hasRegistry = !0) : d.addEventListener("load", function () {
889 var a = d.import;
890 a.__CE_documentLoadHandled || (a.__CE_documentLoadHandled = !0, a.__CE_isImportDocument = !0, a.__CE_hasRegistry = !0, e.delete(a), A(b, a, e));
891 });
892 } else c.push(d);
893 }, e);
894 if (b.b) for (a = 0; a < c.length; a++) w(b, c[a]);
895 for (a = 0; a < c.length; a++) y(b, c[a]);
896 }
897 function y(b, a) {
898 if (void 0 === a.__CE_state) {
899 var e = b.a.get(a.localName);
900 if (e) {
901 e.constructionStack.push(a);
902 var c = e.constructor;
903 try {
904 try {
905 if (new c() !== a) throw Error("The custom element constructor did not produce the element being upgraded.");
906 } finally {
907 e.constructionStack.pop();
908 }
909 } catch (f) {
910 throw a.__CE_state = 2, f;
911 }
912 a.__CE_state = 1;
913 a.__CE_definition = e;
914 if (e.attributeChangedCallback) for (e = e.observedAttributes, c = 0; c < e.length; c++) {
915 var d = e[c],
916 h = a.getAttribute(d);
917 null !== h && b.attributeChangedCallback(a, d, null, h, null);
918 }
919 l(a) && b.connectedCallback(a);
920 }
921 }
922 }
923 r.prototype.connectedCallback = function (b) {
924 var a = b.__CE_definition;
925 a.connectedCallback && a.connectedCallback.call(b);
926 b.i = !0;
927 };
928 r.prototype.disconnectedCallback = function (b) {
929 b.i || this.connectedCallback(b);
930 var a = b.__CE_definition;
931 a.disconnectedCallback && a.disconnectedCallback.call(b);
932 b.i = void 0;
933 };
934 r.prototype.attributeChangedCallback = function (b, a, e, c, d) {
935 var h = b.__CE_definition;
936 h.attributeChangedCallback && -1 < h.observedAttributes.indexOf(a) && h.attributeChangedCallback.call(b, a, e, c, d);
937 };
938 function B(b, a) {
939 this.c = b;
940 this.a = a;
941 this.b = void 0;
942 A(this.c, this.a);
943 "loading" === this.a.readyState && (this.b = new MutationObserver(this.f.bind(this)), this.b.observe(this.a, {
944 childList: !0,
945 subtree: !0
946 }));
947 }
948 function C(b) {
949 b.b && b.b.disconnect();
950 }
951 B.prototype.f = function (b) {
952 var a = this.a.readyState;
953 "interactive" !== a && "complete" !== a || C(this);
954 for (a = 0; a < b.length; a++) for (var e = b[a].addedNodes, c = 0; c < e.length; c++) A(this.c, e[c]);
955 };
956 function ca() {
957 var b = this;
958 this.b = this.a = void 0;
959 this.c = new Promise(function (a) {
960 b.b = a;
961 b.a && a(b.a);
962 });
963 }
964 function D(b) {
965 if (b.a) throw Error("Already resolved.");
966 b.a = void 0;
967 b.b && b.b(void 0);
968 }
969 function E(b) {
970 this.f = !1;
971 this.a = b;
972 this.h = new Map();
973 this.g = function (b) {
974 return b();
975 };
976 this.b = !1;
977 this.c = [];
978 this.l = new B(b, document);
979 }
980 E.prototype.m = function (b, a) {
981 var e = this;
982 if (!(a instanceof Function)) throw new TypeError("Custom element constructors must be functions.");
983 if (!k(b)) throw new SyntaxError("The element name '" + b + "' is not valid.");
984 if (this.a.a.get(b)) throw Error("A custom element with name '" + b + "' has already been defined.");
985 if (this.f) throw Error("A custom element is already being defined.");
986 this.f = !0;
987 var c, d, h, f, u;
988 try {
989 var p = function p(b) {
990 var a = P[b];
991 if (void 0 !== a && !(a instanceof Function)) throw Error("The '" + b + "' callback must be a function.");
992 return a;
993 },
994 P = a.prototype;
995 if (!(P instanceof Object)) throw new TypeError("The custom element constructor's prototype is not an object.");
996 c = p("connectedCallback");
997 d = p("disconnectedCallback");
998 h = p("adoptedCallback");
999 f = p("attributeChangedCallback");
1000 u = a.observedAttributes || [];
1001 } catch (va) {
1002 return;
1003 } finally {
1004 this.f = !1;
1005 }
1006 ba(this.a, b, {
1007 localName: b,
1008 constructor: a,
1009 connectedCallback: c,
1010 disconnectedCallback: d,
1011 adoptedCallback: h,
1012 attributeChangedCallback: f,
1013 observedAttributes: u,
1014 constructionStack: []
1015 });
1016 this.c.push(b);
1017 this.b || (this.b = !0, this.g(function () {
1018 if (!1 !== e.b) for (e.b = !1, A(e.a, document); 0 < e.c.length;) {
1019 var b = e.c.shift();
1020 (b = e.h.get(b)) && D(b);
1021 }
1022 }));
1023 };
1024 E.prototype.get = function (b) {
1025 if (b = this.a.a.get(b)) return b.constructor;
1026 };
1027 E.prototype.s = function (b) {
1028 if (!k(b)) return Promise.reject(new SyntaxError("'" + b + "' is not a valid custom element name."));
1029 var a = this.h.get(b);
1030 if (a) return a.c;
1031 a = new ca();
1032 this.h.set(b, a);
1033 this.a.a.get(b) && -1 === this.c.indexOf(b) && D(a);
1034 return a.c;
1035 };
1036 E.prototype.o = function (b) {
1037 C(this.l);
1038 var a = this.g;
1039 this.g = function (e) {
1040 return b(function () {
1041 return a(e);
1042 });
1043 };
1044 };
1045 window.CustomElementRegistry = E;
1046 E.prototype.define = E.prototype.m;
1047 E.prototype.get = E.prototype.get;
1048 E.prototype.whenDefined = E.prototype.s;
1049 E.prototype.polyfillWrapFlushCallback = E.prototype.o;
1050 var F = window.Document.prototype.createElement,
1051 da = window.Document.prototype.createElementNS,
1052 ea = window.Document.prototype.importNode,
1053 fa = window.Document.prototype.prepend,
1054 ga = window.Document.prototype.append,
1055 G = window.Node.prototype.cloneNode,
1056 H = window.Node.prototype.appendChild,
1057 I = window.Node.prototype.insertBefore,
1058 J = window.Node.prototype.removeChild,
1059 K = window.Node.prototype.replaceChild,
1060 L = Object.getOwnPropertyDescriptor(window.Node.prototype, "textContent"),
1061 M = window.Element.prototype.attachShadow,
1062 N = Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML"),
1063 O = window.Element.prototype.getAttribute,
1064 Q = window.Element.prototype.setAttribute,
1065 R = window.Element.prototype.removeAttribute,
1066 S = window.Element.prototype.getAttributeNS,
1067 T = window.Element.prototype.setAttributeNS,
1068 U = window.Element.prototype.removeAttributeNS,
1069 V = window.Element.prototype.insertAdjacentElement,
1070 ha = window.Element.prototype.prepend,
1071 ia = window.Element.prototype.append,
1072 ja = window.Element.prototype.before,
1073 ka = window.Element.prototype.after,
1074 la = window.Element.prototype.replaceWith,
1075 ma = window.Element.prototype.remove,
1076 na = window.HTMLElement,
1077 W = Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, "innerHTML"),
1078 X = window.HTMLElement.prototype.insertAdjacentElement;
1079 function oa() {
1080 var b = Y;
1081 window.HTMLElement = function () {
1082 function a() {
1083 var a = this.constructor,
1084 c = b.f.get(a);
1085 if (!c) throw Error("The custom element being constructed was not registered with `customElements`.");
1086 var d = c.constructionStack;
1087 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;
1088 var c = d.length - 1,
1089 h = d[c];
1090 if (h === g) throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
1091 d[c] = g;
1092 Object.setPrototypeOf(h, a.prototype);
1093 w(b, h);
1094 return h;
1095 }
1096 a.prototype = na.prototype;
1097 return a;
1098 }();
1099 }
1100 function pa(b, a, e) {
1101 a.prepend = function (a) {
1102 for (var d = [], c = 0; c < arguments.length; ++c) d[c - 0] = arguments[c];
1103 c = d.filter(function (b) {
1104 return b instanceof Node && l(b);
1105 });
1106 e.j.apply(this, d);
1107 for (var f = 0; f < c.length; f++) z(b, c[f]);
1108 if (l(this)) for (c = 0; c < d.length; c++) f = d[c], f instanceof Element && x(b, f);
1109 };
1110 a.append = function (a) {
1111 for (var d = [], c = 0; c < arguments.length; ++c) d[c - 0] = arguments[c];
1112 c = d.filter(function (b) {
1113 return b instanceof Node && l(b);
1114 });
1115 e.append.apply(this, d);
1116 for (var f = 0; f < c.length; f++) z(b, c[f]);
1117 if (l(this)) for (c = 0; c < d.length; c++) f = d[c], f instanceof Element && x(b, f);
1118 };
1119 }
1120 function qa() {
1121 var b = Y;
1122 q(Document.prototype, "createElement", function (a) {
1123 if (this.__CE_hasRegistry) {
1124 var e = b.a.get(a);
1125 if (e) return new e.constructor();
1126 }
1127 a = F.call(this, a);
1128 w(b, a);
1129 return a;
1130 });
1131 q(Document.prototype, "importNode", function (a, e) {
1132 a = ea.call(this, a, e);
1133 this.__CE_hasRegistry ? A(b, a) : v(b, a);
1134 return a;
1135 });
1136 q(Document.prototype, "createElementNS", function (a, e) {
1137 if (this.__CE_hasRegistry && (null === a || "http://www.w3.org/1999/xhtml" === a)) {
1138 var c = b.a.get(e);
1139 if (c) return new c.constructor();
1140 }
1141 a = da.call(this, a, e);
1142 w(b, a);
1143 return a;
1144 });
1145 pa(b, Document.prototype, {
1146 j: fa,
1147 append: ga
1148 });
1149 }
1150 function ra() {
1151 var b = Y;
1152 function a(a, c) {
1153 Object.defineProperty(a, "textContent", {
1154 enumerable: c.enumerable,
1155 configurable: !0,
1156 get: c.get,
1157 set: function set(a) {
1158 if (this.nodeType === Node.TEXT_NODE) c.set.call(this, a);else {
1159 var d = void 0;
1160 if (this.firstChild) {
1161 var e = this.childNodes,
1162 u = e.length;
1163 if (0 < u && l(this)) for (var d = Array(u), p = 0; p < u; p++) d[p] = e[p];
1164 }
1165 c.set.call(this, a);
1166 if (d) for (a = 0; a < d.length; a++) z(b, d[a]);
1167 }
1168 }
1169 });
1170 }
1171 q(Node.prototype, "insertBefore", function (a, c) {
1172 if (a instanceof DocumentFragment) {
1173 var d = Array.prototype.slice.apply(a.childNodes);
1174 a = I.call(this, a, c);
1175 if (l(this)) for (c = 0; c < d.length; c++) x(b, d[c]);
1176 return a;
1177 }
1178 d = l(a);
1179 c = I.call(this, a, c);
1180 d && z(b, a);
1181 l(this) && x(b, a);
1182 return c;
1183 });
1184 q(Node.prototype, "appendChild", function (a) {
1185 if (a instanceof DocumentFragment) {
1186 var c = Array.prototype.slice.apply(a.childNodes);
1187 a = H.call(this, a);
1188 if (l(this)) for (var d = 0; d < c.length; d++) x(b, c[d]);
1189 return a;
1190 }
1191 c = l(a);
1192 d = H.call(this, a);
1193 c && z(b, a);
1194 l(this) && x(b, a);
1195 return d;
1196 });
1197 q(Node.prototype, "cloneNode", function (a) {
1198 a = G.call(this, a);
1199 this.ownerDocument.__CE_hasRegistry ? A(b, a) : v(b, a);
1200 return a;
1201 });
1202 q(Node.prototype, "removeChild", function (a) {
1203 var c = l(a),
1204 d = J.call(this, a);
1205 c && z(b, a);
1206 return d;
1207 });
1208 q(Node.prototype, "replaceChild", function (a, c) {
1209 if (a instanceof DocumentFragment) {
1210 var d = Array.prototype.slice.apply(a.childNodes);
1211 a = K.call(this, a, c);
1212 if (l(this)) for (z(b, c), c = 0; c < d.length; c++) x(b, d[c]);
1213 return a;
1214 }
1215 var d = l(a),
1216 e = K.call(this, a, c),
1217 f = l(this);
1218 f && z(b, c);
1219 d && z(b, a);
1220 f && x(b, a);
1221 return e;
1222 });
1223 L && L.get ? a(Node.prototype, L) : t(b, function (b) {
1224 a(b, {
1225 enumerable: !0,
1226 configurable: !0,
1227 get: function get() {
1228 for (var a = [], b = 0; b < this.childNodes.length; b++) a.push(this.childNodes[b].textContent);
1229 return a.join("");
1230 },
1231 set: function set(a) {
1232 for (; this.firstChild;) J.call(this, this.firstChild);
1233 H.call(this, document.createTextNode(a));
1234 }
1235 });
1236 });
1237 }
1238 function sa(b) {
1239 var a = Element.prototype;
1240 a.before = function (a) {
1241 for (var c = [], d = 0; d < arguments.length; ++d) c[d - 0] = arguments[d];
1242 d = c.filter(function (a) {
1243 return a instanceof Node && l(a);
1244 });
1245 ja.apply(this, c);
1246 for (var e = 0; e < d.length; e++) z(b, d[e]);
1247 if (l(this)) for (d = 0; d < c.length; d++) e = c[d], e instanceof Element && x(b, e);
1248 };
1249 a.after = function (a) {
1250 for (var c = [], d = 0; d < arguments.length; ++d) c[d - 0] = arguments[d];
1251 d = c.filter(function (a) {
1252 return a instanceof Node && l(a);
1253 });
1254 ka.apply(this, c);
1255 for (var e = 0; e < d.length; e++) z(b, d[e]);
1256 if (l(this)) for (d = 0; d < c.length; d++) e = c[d], e instanceof Element && x(b, e);
1257 };
1258 a.replaceWith = function (a) {
1259 for (var c = [], d = 0; d < arguments.length; ++d) c[d - 0] = arguments[d];
1260 var d = c.filter(function (a) {
1261 return a instanceof Node && l(a);
1262 }),
1263 e = l(this);
1264 la.apply(this, c);
1265 for (var f = 0; f < d.length; f++) z(b, d[f]);
1266 if (e) for (z(b, this), d = 0; d < c.length; d++) e = c[d], e instanceof Element && x(b, e);
1267 };
1268 a.remove = function () {
1269 var a = l(this);
1270 ma.call(this);
1271 a && z(b, this);
1272 };
1273 }
1274 function ta() {
1275 var b = Y;
1276 function a(a, c) {
1277 Object.defineProperty(a, "innerHTML", {
1278 enumerable: c.enumerable,
1279 configurable: !0,
1280 get: c.get,
1281 set: function set(a) {
1282 var d = this,
1283 e = void 0;
1284 l(this) && (e = [], n(this, function (a) {
1285 a !== d && e.push(a);
1286 }));
1287 c.set.call(this, a);
1288 if (e) for (var f = 0; f < e.length; f++) {
1289 var h = e[f];
1290 1 === h.__CE_state && b.disconnectedCallback(h);
1291 }
1292 this.ownerDocument.__CE_hasRegistry ? A(b, this) : v(b, this);
1293 return a;
1294 }
1295 });
1296 }
1297 function e(a, c) {
1298 q(a, "insertAdjacentElement", function (a, d) {
1299 var e = l(d);
1300 a = c.call(this, a, d);
1301 e && z(b, d);
1302 l(a) && x(b, d);
1303 return a;
1304 });
1305 }
1306 M ? q(Element.prototype, "attachShadow", function (a) {
1307 return this.__CE_shadowRoot = a = M.call(this, a);
1308 }) : console.warn("Custom Elements: `Element#attachShadow` was not patched.");
1309 if (N && N.get) a(Element.prototype, N);else if (W && W.get) a(HTMLElement.prototype, W);else {
1310 var c = F.call(document, "div");
1311 t(b, function (b) {
1312 a(b, {
1313 enumerable: !0,
1314 configurable: !0,
1315 get: function get() {
1316 return G.call(this, !0).innerHTML;
1317 },
1318 set: function set(a) {
1319 var b = "template" === this.localName ? this.content : this;
1320 for (c.innerHTML = a; 0 < b.childNodes.length;) J.call(b, b.childNodes[0]);
1321 for (; 0 < c.childNodes.length;) H.call(b, c.childNodes[0]);
1322 }
1323 });
1324 });
1325 }
1326 q(Element.prototype, "setAttribute", function (a, c) {
1327 if (1 !== this.__CE_state) return Q.call(this, a, c);
1328 var d = O.call(this, a);
1329 Q.call(this, a, c);
1330 c = O.call(this, a);
1331 b.attributeChangedCallback(this, a, d, c, null);
1332 });
1333 q(Element.prototype, "setAttributeNS", function (a, c, e) {
1334 if (1 !== this.__CE_state) return T.call(this, a, c, e);
1335 var d = S.call(this, a, c);
1336 T.call(this, a, c, e);
1337 e = S.call(this, a, c);
1338 b.attributeChangedCallback(this, c, d, e, a);
1339 });
1340 q(Element.prototype, "removeAttribute", function (a) {
1341 if (1 !== this.__CE_state) return R.call(this, a);
1342 var c = O.call(this, a);
1343 R.call(this, a);
1344 null !== c && b.attributeChangedCallback(this, a, c, null, null);
1345 });
1346 q(Element.prototype, "removeAttributeNS", function (a, c) {
1347 if (1 !== this.__CE_state) return U.call(this, a, c);
1348 var d = S.call(this, a, c);
1349 U.call(this, a, c);
1350 var e = S.call(this, a, c);
1351 d !== e && b.attributeChangedCallback(this, c, d, e, a);
1352 });
1353 X ? e(HTMLElement.prototype, X) : V ? e(Element.prototype, V) : console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");
1354 pa(b, Element.prototype, {
1355 j: ha,
1356 append: ia
1357 });
1358 sa(b);
1359 }
1360 var Z = window.customElements;
1361 if (!Z || Z.forcePolyfill || "function" != typeof Z.define || "function" != typeof Z.get) {
1362 var Y = new r();
1363 oa();
1364 qa();
1365 ra();
1366 ta();
1367 document.__CE_hasRegistry = !0;
1368 var ua = new E(Y);
1369 Object.defineProperty(window, "customElements", {
1370 configurable: !0,
1371 enumerable: !0,
1372 value: ua
1373 });
1374 }
1375 }).call(self);
1376
1377 /**
1378 * @license
1379 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
1380 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
1381 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
1382 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
1383 * Code distributed by Google as part of the polymer project is also
1384 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
1385 */
1386 // @version 0.7.22
1387
1388 (function (global) {
1389 if (global.JsMutationObserver) {
1390 return;
1391 }
1392 var registrationsTable = new WeakMap();
1393 var setImmediate;
1394 if (/Trident|Edge/.test(navigator.userAgent)) {
1395 setImmediate = setTimeout;
1396 } else if (window.setImmediate) {
1397 setImmediate = window.setImmediate;
1398 } else {
1399 var setImmediateQueue = [];
1400 var sentinel = String(Math.random());
1401 window.addEventListener("message", function (e) {
1402 if (e.data === sentinel) {
1403 var queue = setImmediateQueue;
1404 setImmediateQueue = [];
1405 queue.forEach(function (func) {
1406 func();
1407 });
1408 }
1409 });
1410 setImmediate = function setImmediate(func) {
1411 setImmediateQueue.push(func);
1412 window.postMessage(sentinel, "*");
1413 };
1414 }
1415 var isScheduled = false;
1416 var scheduledObservers = [];
1417 function scheduleCallback(observer) {
1418 scheduledObservers.push(observer);
1419 if (!isScheduled) {
1420 isScheduled = true;
1421 setImmediate(dispatchCallbacks);
1422 }
1423 }
1424 function wrapIfNeeded(node) {
1425 return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
1426 }
1427 function dispatchCallbacks() {
1428 isScheduled = false;
1429 var observers = scheduledObservers;
1430 scheduledObservers = [];
1431 observers.sort(function (o1, o2) {
1432 return o1.uid_ - o2.uid_;
1433 });
1434 var anyNonEmpty = false;
1435 observers.forEach(function (observer) {
1436 var queue = observer.takeRecords();
1437 removeTransientObserversFor(observer);
1438 if (queue.length) {
1439 observer.callback_(queue, observer);
1440 anyNonEmpty = true;
1441 }
1442 });
1443 if (anyNonEmpty) dispatchCallbacks();
1444 }
1445 function removeTransientObserversFor(observer) {
1446 observer.nodes_.forEach(function (node) {
1447 var registrations = registrationsTable.get(node);
1448 if (!registrations) return;
1449 registrations.forEach(function (registration) {
1450 if (registration.observer === observer) registration.removeTransientObservers();
1451 });
1452 });
1453 }
1454 function forEachAncestorAndObserverEnqueueRecord(target, callback) {
1455 for (var node = target; node; node = node.parentNode) {
1456 var registrations = registrationsTable.get(node);
1457 if (registrations) {
1458 for (var j = 0; j < registrations.length; j++) {
1459 var registration = registrations[j];
1460 var options = registration.options;
1461 if (node !== target && !options.subtree) continue;
1462 var record = callback(options);
1463 if (record) registration.enqueue(record);
1464 }
1465 }
1466 }
1467 }
1468 var uidCounter = 0;
1469 function JsMutationObserver(callback) {
1470 this.callback_ = callback;
1471 this.nodes_ = [];
1472 this.records_ = [];
1473 this.uid_ = ++uidCounter;
1474 }
1475 JsMutationObserver.prototype = {
1476 observe: function observe(target, options) {
1477 target = wrapIfNeeded(target);
1478 if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
1479 throw new SyntaxError();
1480 }
1481 var registrations = registrationsTable.get(target);
1482 if (!registrations) registrationsTable.set(target, registrations = []);
1483 var registration;
1484 for (var i = 0; i < registrations.length; i++) {
1485 if (registrations[i].observer === this) {
1486 registration = registrations[i];
1487 registration.removeListeners();
1488 registration.options = options;
1489 break;
1490 }
1491 }
1492 if (!registration) {
1493 registration = new Registration(this, target, options);
1494 registrations.push(registration);
1495 this.nodes_.push(target);
1496 }
1497 registration.addListeners();
1498 },
1499 disconnect: function disconnect() {
1500 this.nodes_.forEach(function (node) {
1501 var registrations = registrationsTable.get(node);
1502 for (var i = 0; i < registrations.length; i++) {
1503 var registration = registrations[i];
1504 if (registration.observer === this) {
1505 registration.removeListeners();
1506 registrations.splice(i, 1);
1507 break;
1508 }
1509 }
1510 }, this);
1511 this.records_ = [];
1512 },
1513 takeRecords: function takeRecords() {
1514 var copyOfRecords = this.records_;
1515 this.records_ = [];
1516 return copyOfRecords;
1517 }
1518 };
1519 function MutationRecord(type, target) {
1520 this.type = type;
1521 this.target = target;
1522 this.addedNodes = [];
1523 this.removedNodes = [];
1524 this.previousSibling = null;
1525 this.nextSibling = null;
1526 this.attributeName = null;
1527 this.attributeNamespace = null;
1528 this.oldValue = null;
1529 }
1530 function copyMutationRecord(original) {
1531 var record = new MutationRecord(original.type, original.target);
1532 record.addedNodes = original.addedNodes.slice();
1533 record.removedNodes = original.removedNodes.slice();
1534 record.previousSibling = original.previousSibling;
1535 record.nextSibling = original.nextSibling;
1536 record.attributeName = original.attributeName;
1537 record.attributeNamespace = original.attributeNamespace;
1538 record.oldValue = original.oldValue;
1539 return record;
1540 }
1541 var currentRecord, recordWithOldValue;
1542 function getRecord(type, target) {
1543 return currentRecord = new MutationRecord(type, target);
1544 }
1545 function getRecordWithOldValue(oldValue) {
1546 if (recordWithOldValue) return recordWithOldValue;
1547 recordWithOldValue = copyMutationRecord(currentRecord);
1548 recordWithOldValue.oldValue = oldValue;
1549 return recordWithOldValue;
1550 }
1551 function clearRecords() {
1552 currentRecord = recordWithOldValue = undefined;
1553 }
1554 function recordRepresentsCurrentMutation(record) {
1555 return record === recordWithOldValue || record === currentRecord;
1556 }
1557 function selectRecord(lastRecord, newRecord) {
1558 if (lastRecord === newRecord) return lastRecord;
1559 if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
1560 return null;
1561 }
1562 function Registration(observer, target, options) {
1563 this.observer = observer;
1564 this.target = target;
1565 this.options = options;
1566 this.transientObservedNodes = [];
1567 }
1568 Registration.prototype = {
1569 enqueue: function enqueue(record) {
1570 var records = this.observer.records_;
1571 var length = records.length;
1572 if (records.length > 0) {
1573 var lastRecord = records[length - 1];
1574 var recordToReplaceLast = selectRecord(lastRecord, record);
1575 if (recordToReplaceLast) {
1576 records[length - 1] = recordToReplaceLast;
1577 return;
1578 }
1579 } else {
1580 scheduleCallback(this.observer);
1581 }
1582 records[length] = record;
1583 },
1584 addListeners: function addListeners() {
1585 this.addListeners_(this.target);
1586 },
1587 addListeners_: function addListeners_(node) {
1588 var options = this.options;
1589 if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
1590 if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
1591 if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
1592 if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
1593 },
1594 removeListeners: function removeListeners() {
1595 this.removeListeners_(this.target);
1596 },
1597 removeListeners_: function removeListeners_(node) {
1598 var options = this.options;
1599 if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
1600 if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
1601 if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
1602 if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
1603 },
1604 addTransientObserver: function addTransientObserver(node) {
1605 if (node === this.target) return;
1606 this.addListeners_(node);
1607 this.transientObservedNodes.push(node);
1608 var registrations = registrationsTable.get(node);
1609 if (!registrations) registrationsTable.set(node, registrations = []);
1610 registrations.push(this);
1611 },
1612 removeTransientObservers: function removeTransientObservers() {
1613 var transientObservedNodes = this.transientObservedNodes;
1614 this.transientObservedNodes = [];
1615 transientObservedNodes.forEach(function (node) {
1616 this.removeListeners_(node);
1617 var registrations = registrationsTable.get(node);
1618 for (var i = 0; i < registrations.length; i++) {
1619 if (registrations[i] === this) {
1620 registrations.splice(i, 1);
1621 break;
1622 }
1623 }
1624 }, this);
1625 },
1626 handleEvent: function handleEvent(e) {
1627 e.stopImmediatePropagation();
1628 switch (e.type) {
1629 case "DOMAttrModified":
1630 var name = e.attrName;
1631 var namespace = e.relatedNode.namespaceURI;
1632 var target = e.target;
1633 var record = new getRecord("attributes", target);
1634 record.attributeName = name;
1635 record.attributeNamespace = namespace;
1636 var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
1637 forEachAncestorAndObserverEnqueueRecord(target, function (options) {
1638 if (!options.attributes) return;
1639 if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
1640 return;
1641 }
1642 if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
1643 return record;
1644 });
1645 break;
1646 case "DOMCharacterDataModified":
1647 var target = e.target;
1648 var record = getRecord("characterData", target);
1649 var oldValue = e.prevValue;
1650 forEachAncestorAndObserverEnqueueRecord(target, function (options) {
1651 if (!options.characterData) return;
1652 if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
1653 return record;
1654 });
1655 break;
1656 case "DOMNodeRemoved":
1657 this.addTransientObserver(e.target);
1658 case "DOMNodeInserted":
1659 var changedNode = e.target;
1660 var addedNodes, removedNodes;
1661 if (e.type === "DOMNodeInserted") {
1662 addedNodes = [changedNode];
1663 removedNodes = [];
1664 } else {
1665 addedNodes = [];
1666 removedNodes = [changedNode];
1667 }
1668 var previousSibling = changedNode.previousSibling;
1669 var nextSibling = changedNode.nextSibling;
1670 var record = getRecord("childList", e.target.parentNode);
1671 record.addedNodes = addedNodes;
1672 record.removedNodes = removedNodes;
1673 record.previousSibling = previousSibling;
1674 record.nextSibling = nextSibling;
1675 forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function (options) {
1676 if (!options.childList) return;
1677 return record;
1678 });
1679 }
1680 clearRecords();
1681 }
1682 };
1683 global.JsMutationObserver = JsMutationObserver;
1684 if (!global.MutationObserver) {
1685 global.MutationObserver = JsMutationObserver;
1686 JsMutationObserver._isPolyfilled = true;
1687 }
1688 })(self);
1689
1690 /*
1691 Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola
1692
1693 Permission is hereby granted, free of charge, to any person obtaining
1694 a copy of this software and associated documentation files (the
1695 "Software"), to deal in the Software without restriction, including
1696 without limitation the rights to use, copy, modify, merge, publish,
1697 distribute, sublicense, and/or sell copies of the Software, and to
1698 permit persons to whom the Software is furnished to do so, subject to
1699 the following conditions:
1700
1701 The above copyright notice and this permission notice shall be
1702 included in all copies or substantial portions of the Software.
1703
1704 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1705 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1706 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1707 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1708 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1709 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1710 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1711
1712 */
1713 (function (global, undefined$1) {
1714
1715 if (global.setImmediate) {
1716 return;
1717 }
1718 var nextHandle = 1; // Spec says greater than zero
1719 var tasksByHandle = {};
1720 var currentlyRunningATask = false;
1721 var doc = global.document;
1722 var setImmediate;
1723 function addFromSetImmediateArguments(args) {
1724 tasksByHandle[nextHandle] = partiallyApplied.apply(undefined$1, args);
1725 return nextHandle++;
1726 }
1727
1728 // This function accepts the same arguments as setImmediate, but
1729 // returns a function that requires no arguments.
1730 function partiallyApplied(handler) {
1731 var args = [].slice.call(arguments, 1);
1732 return function () {
1733 if (typeof handler === "function") {
1734 handler.apply(undefined$1, args);
1735 } else {
1736 new Function("" + handler)();
1737 }
1738 };
1739 }
1740 function runIfPresent(handle) {
1741 // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
1742 // So if we're currently running a task, we'll need to delay this invocation.
1743 if (currentlyRunningATask) {
1744 // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
1745 // "too much recursion" error.
1746 setTimeout(partiallyApplied(runIfPresent, handle), 0);
1747 } else {
1748 var task = tasksByHandle[handle];
1749 if (task) {
1750 currentlyRunningATask = true;
1751 try {
1752 task();
1753 } finally {
1754 clearImmediate(handle);
1755 currentlyRunningATask = false;
1756 }
1757 }
1758 }
1759 }
1760 function clearImmediate(handle) {
1761 delete tasksByHandle[handle];
1762 }
1763 function installNextTickImplementation() {
1764 setImmediate = function setImmediate() {
1765 var handle = addFromSetImmediateArguments(arguments);
1766 process.nextTick(partiallyApplied(runIfPresent, handle));
1767 return handle;
1768 };
1769 }
1770 function canUsePostMessage() {
1771 // The test against `importScripts` prevents this implementation from being installed inside a web worker,
1772 // where `global.postMessage` means something completely different and can't be used for this purpose.
1773 if (global.postMessage && !global.importScripts) {
1774 var postMessageIsAsynchronous = true;
1775 var oldOnMessage = global.onmessage;
1776 global.onmessage = function () {
1777 postMessageIsAsynchronous = false;
1778 };
1779 global.postMessage("", "*");
1780 global.onmessage = oldOnMessage;
1781 return postMessageIsAsynchronous;
1782 }
1783 }
1784 function installPostMessageImplementation() {
1785 // Installs an event handler on `global` for the `message` event: see
1786 // * https://developer.mozilla.org/en/DOM/window.postMessage
1787 // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
1788
1789 var messagePrefix = "setImmediate$" + Math.random() + "$";
1790 var onGlobalMessage = function onGlobalMessage(event) {
1791 if (event.source === global && typeof event.data === "string" && event.data.indexOf(messagePrefix) === 0) {
1792 runIfPresent(+event.data.slice(messagePrefix.length));
1793 }
1794 };
1795 if (global.addEventListener) {
1796 global.addEventListener("message", onGlobalMessage, false);
1797 } else {
1798 global.attachEvent("onmessage", onGlobalMessage);
1799 }
1800 setImmediate = function setImmediate() {
1801 var handle = addFromSetImmediateArguments(arguments);
1802 global.postMessage(messagePrefix + handle, "*");
1803 return handle;
1804 };
1805 }
1806 function installMessageChannelImplementation() {
1807 var channel = new MessageChannel();
1808 channel.port1.onmessage = function (event) {
1809 var handle = event.data;
1810 runIfPresent(handle);
1811 };
1812 setImmediate = function setImmediate() {
1813 var handle = addFromSetImmediateArguments(arguments);
1814 channel.port2.postMessage(handle);
1815 return handle;
1816 };
1817 }
1818 function installReadyStateChangeImplementation() {
1819 var html = doc.documentElement;
1820 setImmediate = function setImmediate() {
1821 var handle = addFromSetImmediateArguments(arguments);
1822 // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
1823 // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
1824 var script = doc.createElement("script");
1825 script.onreadystatechange = function () {
1826 runIfPresent(handle);
1827 script.onreadystatechange = null;
1828 html.removeChild(script);
1829 script = null;
1830 };
1831 html.appendChild(script);
1832 return handle;
1833 };
1834 }
1835 function installSetTimeoutImplementation() {
1836 setImmediate = function setImmediate() {
1837 var handle = addFromSetImmediateArguments(arguments);
1838 setTimeout(partiallyApplied(runIfPresent, handle), 0);
1839 return handle;
1840 };
1841 }
1842
1843 // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
1844 var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
1845 attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
1846
1847 // Don't get fooled by e.g. browserify environments.
1848 if ({}.toString.call(global.process) === "[object process]") {
1849 // For Node.js before 0.9
1850 installNextTickImplementation();
1851 } else if (canUsePostMessage()) {
1852 // For non-IE10 modern browsers
1853 installPostMessageImplementation();
1854 } else if (global.MessageChannel) {
1855 // For web workers, where supported
1856 installMessageChannelImplementation();
1857 } else if (doc && "onreadystatechange" in doc.createElement("script")) {
1858 // For IE 6–8
1859 installReadyStateChangeImplementation();
1860 } else {
1861 // For older browsers
1862 installSetTimeoutImplementation();
1863 }
1864 attachTo.setImmediate = setImmediate;
1865 attachTo.clearImmediate = clearImmediate;
1866 })(self);
1867
1868 (function () {
1869 var DEFAULT_VIEWPORT = 'width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no';
1870 var Viewport = {
1871 ensureViewportElement: function ensureViewportElement() {
1872 var viewportElement = document.querySelector('meta[name=viewport]');
1873 if (!viewportElement) {
1874 viewportElement = document.createElement('meta');
1875 viewportElement.name = 'viewport';
1876 document.head.appendChild(viewportElement);
1877 }
1878 return viewportElement;
1879 },
1880 setup: function setup() {
1881 var viewportElement = Viewport.ensureViewportElement();
1882 if (!viewportElement) {
1883 return;
1884 }
1885 if (!viewportElement.hasAttribute('content')) {
1886 viewportElement.setAttribute('content', DEFAULT_VIEWPORT);
1887 }
1888 }
1889 };
1890 window.Viewport = Viewport;
1891 })();
1892
1893 /**
1894 * MicroEvent - to make any js object an event emitter (server or browser)
1895 *
1896 * - pure javascript - server compatible, browser compatible
1897 * - dont rely on the browser doms
1898 * - super simple - you get it immediately, no mystery, no magic involved
1899 *
1900 * - create a MicroEventDebug with goodies to debug
1901 * - make it safer to use
1902 */
1903
1904 /** NOTE: This library is customized for Onsen UI. */
1905
1906 var MicroEvent = function MicroEvent() {};
1907 MicroEvent.prototype = {
1908 on: function on(event, fct) {
1909 this._events = this._events || {};
1910 this._events[event] = this._events[event] || [];
1911 this._events[event].push(fct);
1912 },
1913 once: function once(event, fct) {
1914 var self = this;
1915 var wrapper = function wrapper() {
1916 self.off(event, wrapper);
1917 return fct.apply(null, arguments);
1918 };
1919 this.on(event, wrapper);
1920 },
1921 off: function off(event, fct) {
1922 this._events = this._events || {};
1923 if (event in this._events === false) {
1924 return;
1925 }
1926 this._events[event] = this._events[event].filter(function (_fct) {
1927 if (fct) {
1928 return fct !== _fct;
1929 } else {
1930 return false;
1931 }
1932 });
1933 },
1934 emit: function emit(event /* , args... */) {
1935 this._events = this._events || {};
1936 if (event in this._events === false) {
1937 return;
1938 }
1939 for (var i = 0; i < this._events[event].length; i++) {
1940 this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
1941 }
1942 }
1943 };
1944
1945 /**
1946 * mixin will delegate all MicroEvent.js function in the destination object
1947 *
1948 * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent
1949 *
1950 * @param {Object} the object which will support MicroEvent
1951 */
1952 MicroEvent.mixin = function (destObject) {
1953 var props = ['on', 'once', 'off', 'emit'];
1954 for (var i = 0; i < props.length; i++) {
1955 if (typeof destObject === 'function') {
1956 destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
1957 } else {
1958 destObject[props[i]] = MicroEvent.prototype[props[i]];
1959 }
1960 }
1961 };
1962 window.MicroEvent = MicroEvent;
1963
1964 var onsElements = {};
1965
1966 /*
1967 Copyright 2013-2015 ASIAL CORPORATION
1968
1969 Licensed under the Apache License, Version 2.0 (the "License");
1970 you may not use this file except in compliance with the License.
1971 You may obtain a copy of the License at
1972
1973 http://www.apache.org/licenses/LICENSE-2.0
1974
1975 Unless required by applicable law or agreed to in writing, software
1976 distributed under the License is distributed on an "AS IS" BASIS,
1977 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1978 See the License for the specific language governing permissions and
1979 limitations under the License.
1980
1981 */
1982
1983 /**
1984 * Add vendor prefix.
1985 *
1986 * @param {String} name
1987 * @return {String}
1988 */
1989 var prefix = function () {
1990 var styles = window.getComputedStyle(document.documentElement, '');
1991 var prefix = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1];
1992 return function (name) {
1993 return '-' + prefix + '-' + util$4.hyphenate(name);
1994 };
1995 }();
1996
1997 /**
1998 * Minimal utility library for manipulating element's style.
1999 * Set element's style.
2000 *
2001 * @param {Element} element
2002 * @param {Object} styles
2003 * @return {Element}
2004 */
2005 var styler = function styler(element, style) {
2006 Object.keys(style).forEach(function (key) {
2007 if (key in element.style) {
2008 element.style[key] = style[key];
2009 } else if (prefix(key) in element.style) {
2010 element.style[prefix(key)] = style[key];
2011 } else {
2012 util$4.warn('No such style property: ' + key);
2013 }
2014 });
2015 return element;
2016 };
2017
2018 /**
2019 * @param {Element} element
2020 * @param {String} styles Space-separated CSS properties to remove
2021 */
2022 styler.clear = function (element) {
2023 var styles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2024 var clearlist = styles.split(/\s+/).reduce(function (r, s) {
2025 return r.concat([util$4.hyphenate(s), prefix(s)]);
2026 }, []),
2027 keys = [];
2028 var _loop = function _loop() {
2029 var key = element.style[i];
2030 if (clearlist.length === 0 || clearlist.some(function (s) {
2031 return key.indexOf(s) === 0;
2032 })) {
2033 keys.push(key); // Store the key to fix Safari style indexes
2034 }
2035 };
2036 for (var i = element.style.length - 1; i >= 0; i--) {
2037 _loop();
2038 }
2039 keys.forEach(function (key) {
2040 return element.style[key] = '';
2041 });
2042 element.getAttribute('style') === '' && element.removeAttribute('style');
2043 };
2044
2045 /*
2046 Copyright 2013-2015 ASIAL CORPORATION
2047
2048 Licensed under the Apache License, Version 2.0 (the "License");
2049 you may not use this file except in compliance with the License.
2050 You may obtain a copy of the License at
2051
2052 http://www.apache.org/licenses/LICENSE-2.0
2053
2054 Unless required by applicable law or agreed to in writing, software
2055 distributed under the License is distributed on an "AS IS" BASIS,
2056 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2057 See the License for the specific language governing permissions and
2058 limitations under the License.
2059
2060 */
2061 var autoStyleEnabled = true;
2062
2063 // Modifiers
2064 var modifiersMap = {
2065 'quiet': 'material--flat',
2066 'light': 'material--flat',
2067 'outline': 'material--flat',
2068 'cta': '',
2069 'large--quiet': 'material--flat large',
2070 'large--cta': 'large',
2071 'noborder': '',
2072 'tappable': ''
2073 };
2074 var platforms = {};
2075 platforms.android = function (element) {
2076 var elementName = element.tagName.toLowerCase();
2077 if (!util$4.hasModifier(element, 'material')) {
2078 var oldModifier = element.getAttribute('modifier') || '';
2079 var newModifier = oldModifier.trim().split(/\s+/).map(function (e) {
2080 return Object.prototype.hasOwnProperty.call(modifiersMap, e) ? modifiersMap[e] : e;
2081 });
2082 newModifier.unshift('material');
2083 element.setAttribute('modifier', newModifier.join(' ').trim());
2084 }
2085 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'];
2086
2087 // Effects
2088 if (elements.indexOf(elementName) !== -1 && !element.hasAttribute('ripple') && !element.querySelector('ons-ripple')) {
2089 if (elementName === 'ons-list-item') {
2090 if (element.hasAttribute('tappable')) {
2091 element.setAttribute('ripple', '');
2092 element.removeAttribute('tappable');
2093 }
2094 } else {
2095 element.setAttribute('ripple', '');
2096 }
2097 }
2098 };
2099 platforms.ios = function (element) {
2100 // Modifiers
2101 if (util$4.removeModifier(element, 'material')) {
2102 if (util$4.removeModifier(element, 'material--flat')) {
2103 util$4.addModifier(element, util$4.removeModifier(element, 'large') ? 'large--quiet' : 'quiet');
2104 }
2105 if (!element.getAttribute('modifier')) {
2106 element.removeAttribute('modifier');
2107 }
2108 }
2109
2110 // Effects
2111 if (element.hasAttribute('ripple')) {
2112 if (element.tagName.toLowerCase() === 'ons-list-item') {
2113 element.setAttribute('tappable', '');
2114 }
2115 element.removeAttribute('ripple');
2116 }
2117 };
2118 var unlocked = {
2119 android: true
2120 };
2121 var getPlatform = function getPlatform(element, force) {
2122 if (autoStyleEnabled && !element.hasAttribute('disable-auto-styling')) {
2123 var mobileOS = platform.getMobileOS();
2124 if (Object.prototype.hasOwnProperty.call(platforms, mobileOS) && (Object.prototype.hasOwnProperty.call(unlocked, mobileOS) || force)) {
2125 return mobileOS;
2126 }
2127 }
2128 return null;
2129 };
2130 var prepare = function prepare(element, force) {
2131 var p = getPlatform(element, force);
2132 p && platforms[p](element);
2133 };
2134 var mapModifier = function mapModifier(modifier, element, force) {
2135 if (getPlatform(element, force)) {
2136 return modifier.split(/\s+/).map(function (m) {
2137 return Object.prototype.hasOwnProperty.call(modifiersMap, m) ? modifiersMap[m] : m;
2138 }).join(' ');
2139 }
2140 return modifier;
2141 };
2142 var restoreModifier = function restoreModifier(element) {
2143 if (getPlatform(element) === 'android') {
2144 var modifier = element.getAttribute('modifier') || '';
2145 var newModifier = mapModifier(modifier, element);
2146 if (!/(^|\s+)material($|\s+)/i.test(modifier)) {
2147 newModifier = 'material ' + newModifier;
2148 }
2149 if (newModifier !== modifier) {
2150 element.setAttribute('modifier', newModifier.trim());
2151 return true;
2152 }
2153 }
2154 return false;
2155 };
2156 var autoStyle = {
2157 isEnabled: function isEnabled() {
2158 return autoStyleEnabled;
2159 },
2160 enable: function enable() {
2161 return autoStyleEnabled = true;
2162 },
2163 disable: function disable() {
2164 return autoStyleEnabled = false;
2165 },
2166 prepare: prepare,
2167 mapModifier: mapModifier,
2168 getPlatform: getPlatform,
2169 restoreModifier: restoreModifier
2170 };
2171
2172 var ModifierUtil = /*#__PURE__*/function () {
2173 function ModifierUtil() {
2174 _classCallCheck(this, ModifierUtil);
2175 }
2176 _createClass(ModifierUtil, null, [{
2177 key: "diff",
2178 value:
2179 /**
2180 * @param {String} last
2181 * @param {String} current
2182 */
2183 function diff(last, current) {
2184 last = makeDict(('' + last).trim());
2185 current = makeDict(('' + current).trim());
2186 var removed = Object.keys(last).reduce(function (result, token) {
2187 if (!current[token]) {
2188 result.push(token);
2189 }
2190 return result;
2191 }, []);
2192 var added = Object.keys(current).reduce(function (result, token) {
2193 if (!last[token]) {
2194 result.push(token);
2195 }
2196 return result;
2197 }, []);
2198 return {
2199 added: added,
2200 removed: removed
2201 };
2202 function makeDict(modifier) {
2203 var dict = {};
2204 ModifierUtil.split(modifier).forEach(function (token) {
2205 return dict[token] = token;
2206 });
2207 return dict;
2208 }
2209 }
2210
2211 /**
2212 * @param {Object} diff
2213 * @param {Array} diff.removed
2214 * @param {Array} diff.added
2215 * @param {Object} classList
2216 * @param {String} template
2217 */
2218 }, {
2219 key: "applyDiffToClassList",
2220 value: function applyDiffToClassList(diff, classList, template) {
2221 diff.added.map(function (modifier) {
2222 return template.replace(/\*/g, modifier);
2223 }).forEach(function (klass) {
2224 return klass.split(/\s+/).forEach(function (k) {
2225 return classList.add(k);
2226 });
2227 });
2228 diff.removed.map(function (modifier) {
2229 return template.replace(/\*/g, modifier);
2230 }).forEach(function (klass) {
2231 return klass.split(/\s+/).forEach(function (k) {
2232 return classList.remove(k);
2233 });
2234 });
2235 }
2236
2237 /**
2238 * @param {Object} diff
2239 * @param {Array} diff.removed
2240 * @param {Array} diff.added
2241 * @param {HTMLElement} element
2242 * @param {Object} scheme
2243 */
2244 }, {
2245 key: "applyDiffToElement",
2246 value: function applyDiffToElement(diff, element, scheme) {
2247 Object.keys(scheme).forEach(function (selector) {
2248 var targetElements = !selector || util$4.match(element, selector) ? [element] : Array.prototype.filter.call(element.querySelectorAll(selector), function (targetElement) {
2249 return !util$4.findParent(targetElement, element.tagName, function (parent) {
2250 return parent === element;
2251 });
2252 });
2253 for (var i = 0; i < targetElements.length; i++) {
2254 ModifierUtil.applyDiffToClassList(diff, targetElements[i].classList, scheme[selector]);
2255 }
2256 });
2257 }
2258
2259 /**
2260 * @param {String} last
2261 * @param {String} current
2262 * @param {HTMLElement} element
2263 * @param {Object} scheme
2264 */
2265 }, {
2266 key: "onModifierChanged",
2267 value: function onModifierChanged(last, current, element, scheme) {
2268 ModifierUtil.applyDiffToElement(ModifierUtil.diff(last, current), element, scheme);
2269 autoStyle.restoreModifier(element);
2270 }
2271 }, {
2272 key: "refresh",
2273 value: function refresh(element, scheme) {
2274 ModifierUtil.applyDiffToElement(ModifierUtil.diff('', element.getAttribute('modifier') || ''), element, scheme);
2275 }
2276
2277 /**
2278 * @param {HTMLElement} element
2279 * @param {Object} scheme
2280 */
2281 }, {
2282 key: "initModifier",
2283 value: function initModifier(element, scheme) {
2284 var modifier = element.getAttribute('modifier');
2285 if (typeof modifier !== 'string') {
2286 return;
2287 }
2288 ModifierUtil.applyDiffToElement({
2289 removed: [],
2290 added: ModifierUtil.split(modifier)
2291 }, element, scheme);
2292 }
2293 }, {
2294 key: "split",
2295 value: function split(modifier) {
2296 if (typeof modifier !== 'string') {
2297 return [];
2298 }
2299 return modifier.trim().split(/ +/).filter(function (token) {
2300 return token !== '';
2301 });
2302 }
2303
2304 /**
2305 * Add modifier token to an element.
2306 */
2307 }, {
2308 key: "addModifier",
2309 value: function addModifier(element, modifierToken) {
2310 if (!element.hasAttribute('modifier')) {
2311 element.setAttribute('modifier', modifierToken);
2312 } else {
2313 var tokens = ModifierUtil.split(element.getAttribute('modifier'));
2314 if (tokens.indexOf(modifierToken) == -1) {
2315 tokens.push(modifierToken);
2316 element.setAttribute('modifier', tokens.join(' '));
2317 }
2318 }
2319 }
2320
2321 /**
2322 * Remove modifier token from an element.
2323 */
2324 }, {
2325 key: "removeModifier",
2326 value: function removeModifier(element, modifierToken) {
2327 if (element.hasAttribute('modifier')) {
2328 var tokens = ModifierUtil.split(element.getAttribute('modifier'));
2329 var index = tokens.indexOf(modifierToken);
2330 if (index !== -1) {
2331 tokens.splice(index, 1);
2332 element.setAttribute('modifier', tokens.join(' '));
2333 }
2334 }
2335 }
2336 }]);
2337 return ModifierUtil;
2338 }();
2339
2340 /*
2341 Copyright 2013-2015 ASIAL CORPORATION
2342
2343 Licensed under the Apache License, Version 2.0 (the "License");
2344 you may not use this file except in compliance with the License.
2345 You may obtain a copy of the License at
2346
2347 http://www.apache.org/licenses/LICENSE-2.0
2348
2349 Unless required by applicable law or agreed to in writing, software
2350 distributed under the License is distributed on an "AS IS" BASIS,
2351 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2352 See the License for the specific language governing permissions and
2353 limitations under the License.
2354
2355 */
2356
2357 var startsWith = function startsWith(s, c) {
2358 return s.substr(0, c.length) === c;
2359 };
2360 var endsWith = function endsWith(s, c) {
2361 return s.substr(s.length - c.length, c.length) === c;
2362 };
2363 var unwrap = function unwrap(s) {
2364 return s.slice(1, -1);
2365 };
2366 var isObjectString = function isObjectString(s) {
2367 return startsWith(s, '{') && endsWith(s, '}');
2368 };
2369 var isArrayString = function isArrayString(s) {
2370 return startsWith(s, '[') && endsWith(s, ']');
2371 };
2372 var isQuotedString = function isQuotedString(s) {
2373 return startsWith(s, '\'') && endsWith(s, '\'') || startsWith(s, '"') && endsWith(s, '"');
2374 };
2375 var error$1 = function error(token, string, originalString) {
2376 throw new Error('Unexpected token \'' + token + '\' at position ' + (originalString.length - string.length - 1) + ' in string: \'' + originalString + '\'');
2377 };
2378 var processToken = function processToken(token, string, originalString) {
2379 if (token === 'true' || token === 'false') {
2380 return token === 'true';
2381 } else if (isQuotedString(token)) {
2382 return unwrap(token);
2383 } else if (!isNaN(token)) {
2384 return +token;
2385 } else if (isObjectString(token)) {
2386 return parseObject(unwrap(token));
2387 } else if (isArrayString(token)) {
2388 return parseArray(unwrap(token));
2389 } else {
2390 error$1(token, string, originalString);
2391 }
2392 };
2393 var nextToken = function nextToken(string) {
2394 string = string.trim();
2395 var limit = string.length;
2396 if (string[0] === ':' || string[0] === ',') {
2397 limit = 1;
2398 } else if (string[0] === '{' || string[0] === '[') {
2399 var c = string.charCodeAt(0);
2400 var nestedObject = 1;
2401 for (var i = 1; i < string.length; i++) {
2402 if (string.charCodeAt(i) === c) {
2403 nestedObject++;
2404 } else if (string.charCodeAt(i) === c + 2) {
2405 nestedObject--;
2406 if (nestedObject === 0) {
2407 limit = i + 1;
2408 break;
2409 }
2410 }
2411 }
2412 } else if (string[0] === '\'' || string[0] === '"') {
2413 for (var _i = 1; _i < string.length; _i++) {
2414 if (string[_i] === string[0]) {
2415 limit = _i + 1;
2416 break;
2417 }
2418 }
2419 } else {
2420 for (var _i2 = 1; _i2 < string.length; _i2++) {
2421 if ([' ', ',', ':'].indexOf(string[_i2]) !== -1) {
2422 limit = _i2;
2423 break;
2424 }
2425 }
2426 }
2427 return string.slice(0, limit);
2428 };
2429 var parseObject = function parseObject(string) {
2430 var isValidKey = function isValidKey(key) {
2431 return /^[A-Z_$][A-Z0-9_$]*$/i.test(key);
2432 };
2433 string = string.trim();
2434 var originalString = string;
2435 var object = {};
2436 var readingKey = true,
2437 key,
2438 previousToken,
2439 token;
2440 while (string.length > 0) {
2441 previousToken = token;
2442 token = nextToken(string);
2443 string = string.slice(token.length, string.length).trim();
2444 if (token === ':' && (!readingKey || !previousToken || previousToken === ',') || token === ',' && readingKey || token !== ':' && token !== ',' && previousToken && previousToken !== ',' && previousToken !== ':') {
2445 error$1(token, string, originalString);
2446 } else if (token === ':' && readingKey && previousToken) {
2447 previousToken = isQuotedString(previousToken) ? unwrap(previousToken) : previousToken;
2448 if (isValidKey(previousToken)) {
2449 key = previousToken;
2450 readingKey = false;
2451 } else {
2452 throw new Error('Invalid key token \'' + previousToken + '\' at position 0 in string: \'' + originalString + '\'');
2453 }
2454 } else if (token === ',' && !readingKey && previousToken) {
2455 object[key] = processToken(previousToken, string, originalString);
2456 readingKey = true;
2457 }
2458 }
2459 if (token) {
2460 object[key] = processToken(token, string, originalString);
2461 }
2462 return object;
2463 };
2464 var parseArray = function parseArray(string) {
2465 string = string.trim();
2466 var originalString = string;
2467 var array = [];
2468 var previousToken, token;
2469 while (string.length > 0) {
2470 previousToken = token;
2471 token = nextToken(string);
2472 string = string.slice(token.length, string.length).trim();
2473 if (token === ',' && (!previousToken || previousToken === ',')) {
2474 error$1(token, string, originalString);
2475 } else if (token === ',') {
2476 array.push(processToken(previousToken, string, originalString));
2477 }
2478 }
2479 if (token) {
2480 if (token !== ',') {
2481 array.push(processToken(token, string, originalString));
2482 } else {
2483 error$1(token, string, originalString);
2484 }
2485 }
2486 return array;
2487 };
2488 var parse = function parse(string) {
2489 string = string.trim();
2490 if (isObjectString(string)) {
2491 return parseObject(unwrap(string));
2492 } else if (isArrayString(string)) {
2493 return parseArray(unwrap(string));
2494 } else {
2495 throw new Error('Provided string must be object or array like: ' + string);
2496 }
2497 };
2498
2499 var util$3 = {};
2500 var errorPrefix = '[Onsen UI]';
2501 util$3.globals = {
2502 fabOffset: 0,
2503 errorPrefix: errorPrefix,
2504 supportsPassive: false
2505 };
2506 platform._runOnActualPlatform(function () {
2507 util$3.globals.actualMobileOS = platform.getMobileOS();
2508 util$3.globals.isWKWebView = platform.isWKWebView();
2509 });
2510 try {
2511 var opts = Object.defineProperty({}, 'passive', {
2512 get: function get() {
2513 util$3.globals.supportsPassive = true;
2514 } // eslint-disable-line getter-return
2515 });
2516 window.addEventListener('testPassive', null, opts);
2517 window.removeEventListener('testPassive', null, opts);
2518 } catch (e) {
2519 }
2520
2521 /**
2522 * @param {Element} el Target
2523 * @param {String} name Event name
2524 * @param {Function} handler Event handler
2525 * @param {Object} [opt] Event options (passive, capture...)
2526 * @param {Boolean} [isGD] If comes from GestureDetector. Just for testing.
2527 */
2528 util$3.addEventListener = function (el, name, handler, opt, isGD) {
2529 el.addEventListener(name, handler, util$3.globals.supportsPassive ? opt : (opt || {}).capture);
2530 };
2531 util$3.removeEventListener = function (el, name, handler, opt, isGD) {
2532 el.removeEventListener(name, handler, util$3.globals.supportsPassive ? opt : (opt || {}).capture);
2533 };
2534
2535 /**
2536 * @param {String/Function} query dot class name or node name or matcher function.
2537 * @return {Function}
2538 */
2539 util$3.prepareQuery = function (query) {
2540 return query instanceof Function ? query : function (element) {
2541 return util$3.match(element, query);
2542 };
2543 };
2544
2545 /**
2546 * @param {Element} e
2547 * @param {String/Function} s CSS Selector.
2548 * @return {Boolean}
2549 */
2550 util$3.match = function (e, s) {
2551 return (e.matches || e.webkitMatchesSelector || e.mozMatchesSelector || e.msMatchesSelector).call(e, s);
2552 };
2553
2554 /**
2555 * @param {Element} element
2556 * @param {String/Function} query dot class name or node name or matcher function.
2557 * @return {HTMLElement/null}
2558 */
2559 util$3.findChild = function (element, query) {
2560 var match = util$3.prepareQuery(query);
2561
2562 // Caution: `element.children` is `undefined` in some environments if `element` is `svg`
2563 for (var i = 0; i < element.childNodes.length; i++) {
2564 var node = element.childNodes[i];
2565 if (node.nodeType !== Node.ELEMENT_NODE) {
2566 // process only element nodes
2567 continue;
2568 }
2569 if (match(node)) {
2570 return node;
2571 }
2572 }
2573 return null;
2574 };
2575
2576 /**
2577 * @param {Element} element
2578 * @param {String/Function} query dot class name or node name or matcher function.
2579 * @return {HTMLElement/null}
2580 */
2581 util$3.findParent = function (element, query, until) {
2582 var match = util$3.prepareQuery(query);
2583 var parent = element.parentNode;
2584 for (;;) {
2585 if (!parent || parent === document || parent instanceof DocumentFragment || until && until(parent)) {
2586 return null;
2587 } else if (match(parent)) {
2588 return parent;
2589 }
2590 parent = parent.parentNode;
2591 }
2592 };
2593
2594 /**
2595 * @param {Element} element
2596 * @return {boolean}
2597 */
2598 util$3.isAttached = function (element) {
2599 return document.body.contains(element);
2600 };
2601
2602 /**
2603 * @param {Element} element
2604 * @return {boolean}
2605 */
2606 util$3.hasAnyComponentAsParent = function (element) {
2607 while (element && document.documentElement !== element) {
2608 element = element.parentNode;
2609 if (element && element.nodeName.toLowerCase().match(/(ons-navigator|ons-tabbar|ons-modal)/)) {
2610 return true;
2611 }
2612 }
2613 return false;
2614 };
2615
2616 /**
2617 * @param {Object} element
2618 * @return {Array}
2619 */
2620 util$3.getAllChildNodes = function (element) {
2621 var _ref;
2622 return (_ref = [element]).concat.apply(_ref, _toConsumableArray(Array.from(element.children).map(function (childEl) {
2623 return util$3.getAllChildNodes(childEl);
2624 })));
2625 };
2626
2627 /**
2628 * @param {Element} element
2629 * @return {boolean}
2630 */
2631 util$3.isPageControl = function (element) {
2632 return element.nodeName.match(/^ons-(navigator|splitter|tabbar|page)$/i);
2633 };
2634
2635 /**
2636 * @param {Element} element
2637 * @param {String} action to propagate
2638 */
2639 util$3.propagateAction = function (element, action) {
2640 for (var i = 0; i < element.childNodes.length; i++) {
2641 var child = element.childNodes[i];
2642 if (child[action] instanceof Function) {
2643 child[action]();
2644 } else {
2645 util$3.propagateAction(child, action);
2646 }
2647 }
2648 };
2649
2650 /**
2651 * @param {String} string - string to be camelized
2652 * @return {String} Camelized string
2653 */
2654 util$3.camelize = function (string) {
2655 return string.toLowerCase().replace(/-([a-z])/g, function (m, l) {
2656 return l.toUpperCase();
2657 });
2658 };
2659
2660 /**
2661 * @param {String} string - string to be hyphenated
2662 * @return {String} Hyphenated string
2663 */
2664 util$3.hyphenate = function (string) {
2665 return string.replace(/([a-zA-Z])([A-Z])/g, '$1-$2').toLowerCase();
2666 };
2667
2668 /**
2669 * @param {String} selector - tag and class only
2670 * @param {Object} style
2671 * @param {Element}
2672 */
2673 util$3.create = function () {
2674 var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
2675 var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2676 var classList = selector.split('.');
2677 var element = document.createElement(classList.shift() || 'div');
2678 if (classList.length) {
2679 element.className = classList.join(' ');
2680 }
2681 styler(element, style);
2682 return element;
2683 };
2684
2685 /**
2686 * @param {String} html
2687 * @return {Element}
2688 */
2689 util$3.createElement = function (html) {
2690 var wrapper = document.createElement('div');
2691 if (html instanceof DocumentFragment) {
2692 wrapper.appendChild(document.importNode(html, true));
2693 } else {
2694 wrapper.innerHTML = html.trim();
2695 }
2696 if (wrapper.children.length > 1) {
2697 util$3.throw('HTML template must contain a single root element');
2698 }
2699 var element = wrapper.children[0];
2700 wrapper.children[0].remove();
2701 return element;
2702 };
2703
2704 /**
2705 * @param {String} html
2706 * @return {HTMLFragment}
2707 */
2708 util$3.createFragment = function (html) {
2709 var template = document.createElement('template');
2710 template.innerHTML = html;
2711 return document.importNode(template.content, true);
2712 };
2713
2714 /*
2715 * @param {Object} dst Destination object.
2716 * @param {...Object} src Source object(s).
2717 * @returns {Object} Reference to `dst`.
2718 */
2719 util$3.extend = function (dst) {
2720 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
2721 args[_key - 1] = arguments[_key];
2722 }
2723 for (var i = 0; i < args.length; i++) {
2724 if (args[i]) {
2725 var keys = Object.keys(args[i]);
2726 for (var j = 0; j < keys.length; j++) {
2727 var key = keys[j];
2728 dst[key] = args[i][key];
2729 }
2730 }
2731 }
2732 return dst;
2733 };
2734
2735 /**
2736 * @param {Object} arrayLike
2737 * @return {Array}
2738 */
2739 util$3.arrayFrom = function (arrayLike) {
2740 return Array.prototype.slice.apply(arrayLike);
2741 };
2742
2743 /**
2744 * @param {String} jsonString
2745 * @param {Object} [failSafe]
2746 * @return {Object}
2747 */
2748 util$3.parseJSONObjectSafely = function (jsonString) {
2749 var failSafe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
2750 try {
2751 var result = JSON.parse('' + jsonString);
2752 if (_typeof(result) === 'object' && result !== null) {
2753 return result;
2754 }
2755 } catch (e) {
2756 return failSafe;
2757 }
2758 return failSafe;
2759 };
2760
2761 /**
2762 * @param {String} path - path such as 'myApp.controllers.data.loadData'
2763 * @return {Any} - whatever is located at that path
2764 */
2765 util$3.findFromPath = function (path) {
2766 path = path.split('.');
2767 var el = window,
2768 key;
2769 while (key = path.shift()) {
2770 // eslint-disable-line no-cond-assign
2771 el = el[key];
2772 }
2773 return el;
2774 };
2775
2776 /**
2777 * @param {HTMLElement} container - Page or page-container that implements 'topPage'
2778 * @return {HTMLElement|null} - Visible page element or null if not found.
2779 */
2780 util$3.getTopPage = function (container) {
2781 return container && (container.tagName.toLowerCase() === 'ons-page' ? container : container.topPage) || null;
2782 };
2783
2784 /**
2785 * @param {HTMLElement} container - Element where the search begins
2786 * @return {HTMLElement|null} - Page element that contains the visible toolbar or null.
2787 */
2788 util$3.findToolbarPage = function (container) {
2789 var page = util$3.getTopPage(container);
2790 if (page) {
2791 if (page._canAnimateToolbar()) {
2792 return page;
2793 }
2794 for (var i = 0; i < page._contentElement.children.length; i++) {
2795 var nextPage = util$3.getTopPage(page._contentElement.children[i]);
2796 if (nextPage && !/ons-tabbar/i.test(page._contentElement.children[i].tagName)) {
2797 return util$3.findToolbarPage(nextPage);
2798 }
2799 }
2800 }
2801 return null;
2802 };
2803
2804 /**
2805 * @param {Element} element
2806 * @param {String} eventName
2807 * @param {Object} [detail]
2808 * @return {CustomEvent}
2809 */
2810 util$3.triggerElementEvent = function (target, eventName) {
2811 var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
2812 var event = new CustomEvent(eventName, {
2813 bubbles: true,
2814 cancelable: true,
2815 detail: detail
2816 });
2817 Object.keys(detail).forEach(function (key) {
2818 event[key] = detail[key];
2819 });
2820 target.dispatchEvent(event);
2821 return event;
2822 };
2823
2824 /**
2825 * @param {Element} target
2826 * @param {String} modifierName
2827 * @return {Boolean}
2828 */
2829 util$3.hasModifier = function (target, modifierName) {
2830 if (!target.hasAttribute('modifier')) {
2831 return false;
2832 }
2833 return RegExp("(^|\\s+)".concat(modifierName, "($|\\s+)"), 'i').test(target.getAttribute('modifier'));
2834 };
2835
2836 /**
2837 * @param {Element} target
2838 * @param {String} modifierName
2839 * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
2840 * @param {Object} options.forceAutoStyle Ignores platform limitation.
2841 * @return {Boolean} Whether it was added or not.
2842 */
2843 util$3.addModifier = function (target, modifierName) {
2844 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
2845 if (options.autoStyle) {
2846 modifierName = autoStyle.mapModifier(modifierName, target, options.forceAutoStyle);
2847 }
2848 if (util$3.hasModifier(target, modifierName)) {
2849 return false;
2850 }
2851 target.setAttribute('modifier', ((target.getAttribute('modifier') || '') + ' ' + modifierName).trim());
2852 return true;
2853 };
2854
2855 /**
2856 * @param {Element} target
2857 * @param {String} modifierName
2858 * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
2859 * @param {Object} options.forceAutoStyle Ignores platform limitation.
2860 * @return {Boolean} Whether it was found or not.
2861 */
2862 util$3.removeModifier = function (target, modifierName) {
2863 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
2864 if (options.autoStyle) {
2865 modifierName = autoStyle.mapModifier(modifierName, target, options.forceAutoStyle);
2866 }
2867 if (!target.getAttribute('modifier') || !util$3.hasModifier(target, modifierName)) {
2868 return false;
2869 }
2870 var newModifiers = target.getAttribute('modifier').split(/\s+/).filter(function (m) {
2871 return m && m !== modifierName;
2872 });
2873 newModifiers.length ? target.setAttribute('modifier', newModifiers.join(' ')) : target.removeAttribute('modifier');
2874 return true;
2875 };
2876
2877 /**
2878 * @param {Element} target
2879 * @param {String} modifierName
2880 * @param {Boolean} options.force Forces modifier to be added or removed.
2881 * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
2882 * @param {Boolean} options.forceAutoStyle Ignores platform limitation.
2883 * @return {Boolean} Whether it was found or not.
2884 */
2885 util$3.toggleModifier = function () {
2886 var options = arguments.length > 2 ? arguments.length <= 2 ? undefined : arguments[2] : {};
2887 var force = typeof options === 'boolean' ? options : options.force;
2888 var toggle = typeof force === 'boolean' ? force : !util$3.hasModifier.apply(util$3, arguments);
2889 toggle ? util$3.addModifier.apply(util$3, arguments) : util$3.removeModifier.apply(util$3, arguments);
2890 };
2891
2892 /**
2893 * @param {Element} el
2894 * @param {String} defaultClass
2895 * @param {Object} scheme
2896 */
2897 util$3.restoreClass = function (el, defaultClass, scheme) {
2898 defaultClass.split(/\s+/).forEach(function (c) {
2899 return c !== '' && !el.classList.contains(c) && el.classList.add(c);
2900 });
2901 el.hasAttribute('modifier') && ModifierUtil.refresh(el, scheme);
2902 };
2903
2904 // TODO: FIX
2905 util$3.updateParentPosition = function (el) {
2906 if (!el._parentUpdated && el.parentElement) {
2907 if (window.getComputedStyle(el.parentElement).getPropertyValue('position') === 'static') {
2908 el.parentElement.style.position = 'relative';
2909 }
2910 el._parentUpdated = true;
2911 }
2912 };
2913 util$3.toggleAttribute = function (element, name, value) {
2914 if (value) {
2915 element.setAttribute(name, typeof value === 'boolean' ? '' : value);
2916 } else {
2917 element.removeAttribute(name);
2918 }
2919 };
2920 util$3.bindListeners = function (element, listenerNames) {
2921 listenerNames.forEach(function (name) {
2922 var boundName = name.replace(/^_[a-z]/, '_bound' + name[1].toUpperCase());
2923 element[boundName] = element[boundName] || element[name].bind(element);
2924 });
2925 };
2926 util$3.each = function (obj, f) {
2927 return Object.keys(obj).forEach(function (key) {
2928 return f(key, obj[key]);
2929 });
2930 };
2931
2932 /**
2933 * @param {Element} target
2934 * @param {boolean} hasRipple
2935 * @param {Object} attrs
2936 */
2937 util$3.updateRipple = function (target, hasRipple) {
2938 var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
2939 if (hasRipple === undefined) {
2940 hasRipple = target.hasAttribute('ripple');
2941 }
2942 var rippleElement = util$3.findChild(target, 'ons-ripple');
2943 if (hasRipple) {
2944 if (!rippleElement) {
2945 var element = document.createElement('ons-ripple');
2946 Object.keys(attrs).forEach(function (key) {
2947 return element.setAttribute(key, attrs[key]);
2948 });
2949 target.insertBefore(element, target.firstChild);
2950 }
2951 } else if (rippleElement) {
2952 rippleElement.remove();
2953 }
2954 };
2955
2956 /**
2957 * @param {String}
2958 * @return {Object}
2959 */
2960 util$3.animationOptionsParse = parse;
2961
2962 /**
2963 * @param {*} value
2964 */
2965 util$3.isInteger = function (value) {
2966 return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
2967 };
2968
2969 /**
2970 * @return {Object} Deferred promise.
2971 */
2972 util$3.defer = function () {
2973 var deferred = {};
2974 deferred.promise = new Promise(function (resolve, reject) {
2975 deferred.resolve = resolve;
2976 deferred.reject = reject;
2977 });
2978 return deferred;
2979 };
2980
2981 /**
2982 * Show warnings when they are enabled.
2983 *
2984 * @param {*} arguments to console.warn
2985 */
2986 util$3.warn = function () {
2987 if (!internal$1.config.warningsDisabled) {
2988 var _console;
2989 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2990 args[_key2] = arguments[_key2];
2991 }
2992 (_console = console).warn.apply(_console, [errorPrefix].concat(args));
2993 }
2994 };
2995 util$3.throw = function (message) {
2996 throw new Error("".concat(errorPrefix, " ").concat(message));
2997 };
2998 util$3.throwAbstract = function () {
2999 return util$3.throw('Cannot instantiate abstract class');
3000 };
3001 util$3.throwMember = function () {
3002 return util$3.throw('Class member must be implemented');
3003 };
3004 util$3.throwPageLoader = function () {
3005 return util$3.throw('First parameter should be an instance of PageLoader');
3006 };
3007 util$3.throwAnimator = function (el) {
3008 return util$3.throw("\"Animator\" param must inherit ".concat(el, "Animator"));
3009 };
3010 var prevent = function prevent(e) {
3011 return e.cancelable && e.preventDefault();
3012 };
3013
3014 /**
3015 * Prevent scrolling while draging horizontally on iOS.
3016 *
3017 * @param {gd} GestureDetector instance
3018 */
3019 util$3.iosPreventScroll = function (gd) {
3020 if (util$3.globals.actualMobileOS === 'ios') {
3021 var clean = function clean(e) {
3022 gd.off('touchmove', prevent);
3023 gd.off('dragend', clean);
3024 };
3025 gd.on('touchmove', prevent);
3026 gd.on('dragend', clean);
3027 }
3028 };
3029
3030 /**
3031 * Prevents scroll in underlying pages on iOS. See #2220 #2274 #1949
3032 *
3033 * @param {el} HTMLElement that prevents the events
3034 * @param {add} Boolean Add or remove event listeners
3035 */
3036 util$3.iosPageScrollFix = function (add) {
3037 // Full fix - May cause issues with UIWebView's momentum scroll
3038 if (util$3.globals.actualMobileOS === 'ios') {
3039 document.body.classList.toggle('ons-ios-scroll', add); // Allows custom and localized fixes (#2274)
3040 document.body.classList.toggle('ons-ios-scroll-fix', add);
3041 }
3042 };
3043
3044 /**
3045 * Distance and deltaTime filter some weird dragstart events that are not fired immediately.
3046 *
3047 * @param {event}
3048 */
3049 util$3.isValidGesture = function (event) {
3050 return event.gesture !== undefined && (event.gesture.distance <= 15 || event.gesture.deltaTime <= 100);
3051 };
3052 util$3.checkMissingImport = function () {
3053 for (var _len3 = arguments.length, elementNames = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
3054 elementNames[_key3] = arguments[_key3];
3055 }
3056 elementNames.forEach(function (name) {
3057 if (!onsElements[name]) {
3058 util$3.throw("Ons".concat(name, " is required but was not imported (Custom Elements)"));
3059 }
3060 });
3061 };
3062
3063 /**
3064 * Defines a boolean property that reflects an attribute of the same name for a
3065 * given list of attributes.
3066 */
3067 util$3.defineBooleanProperties = function (object, attributeList) {
3068 attributeList.forEach(function (attributeName) {
3069 var propertyName = util$3.camelize(attributeName);
3070 Object.defineProperty(object.prototype, propertyName, {
3071 get: function get() {
3072 return this.hasAttribute(attributeName);
3073 },
3074 set: function set(value) {
3075 if (value) {
3076 this.setAttribute(attributeName, '');
3077 } else {
3078 this.removeAttribute(attributeName);
3079 }
3080 },
3081 configurable: true
3082 });
3083 });
3084 };
3085
3086 /**
3087 * Defines a string property that reflects an attribute of the same name for a
3088 * given list of attributes.
3089 */
3090 util$3.defineStringProperties = function (object, attributeList) {
3091 attributeList.forEach(function (attributeName) {
3092 var propertyName = util$3.camelize(attributeName);
3093 Object.defineProperty(object.prototype, propertyName, {
3094 get: function get() {
3095 return this.getAttribute(attributeName);
3096 },
3097 set: function set(value) {
3098 if (value === null || value === undefined) {
3099 this.removeAttribute(attributeName);
3100 } else {
3101 this.setAttribute(attributeName, value);
3102 }
3103 },
3104 configurable: true
3105 });
3106 });
3107 };
3108 /**
3109 * Makes a property for a listener e.g. onClick.
3110 *
3111 * Returns `onConnected` function which should be called in the element's
3112 * connectedCallback, and `onDisconnected` function which should be called in
3113 * the element's disconnectedCallback.
3114 */
3115 util$3.defineListenerProperty = function (element, eventName) {
3116 var camelized = util$3.camelize(eventName);
3117 var propertyName = 'on' + camelized.charAt(0).toUpperCase() + camelized.slice(1);
3118 var handler;
3119 Object.defineProperty(element, propertyName, {
3120 get: function get() {
3121 return handler;
3122 },
3123 set: function set(newHandler) {
3124 if (element.isConnected) {
3125 if (handler) {
3126 element.removeEventListener(eventName, handler);
3127 }
3128 element.addEventListener(eventName, newHandler);
3129 }
3130 handler = newHandler;
3131 },
3132 configurable: true
3133 });
3134 return {
3135 onConnected: function onConnected() {
3136 if (element[propertyName]) {
3137 element.addEventListener(eventName, element[propertyName]);
3138 }
3139 },
3140 onDisconnected: function onDisconnected() {
3141 if (element[propertyName]) {
3142 element.removeEventListener(eventName, element[propertyName]);
3143 }
3144 }
3145 };
3146 };
3147 var util$4 = util$3;
3148
3149 /*
3150 Copyright 2013-2015 ASIAL CORPORATION
3151
3152 Licensed under the Apache License, Version 2.0 (the "License");
3153 you may not use this file except in compliance with the License.
3154 You may obtain a copy of the License at
3155
3156 http://www.apache.org/licenses/LICENSE-2.0
3157
3158 Unless required by applicable law or agreed to in writing, software
3159 distributed under the License is distributed on an "AS IS" BASIS,
3160 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3161 See the License for the specific language governing permissions and
3162 limitations under the License.
3163
3164 */
3165 var error = function error(message) {
3166 return util$4.throw("In PageAttributeExpression: ".concat(message));
3167 };
3168 var pageAttributeExpression = {
3169 _variables: {},
3170 /**
3171 * Define a variable.
3172 *
3173 * @param {String} name Name of the variable
3174 * @param {String|Function} value Value of the variable. Can be a string or a function. The function must return a string.
3175 * @param {Boolean} overwrite If this value is false, an error will be thrown when trying to define a variable that has already been defined.
3176 */
3177 defineVariable: function defineVariable(name, value) {
3178 var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
3179 if (typeof name !== 'string') {
3180 error('Variable name must be a string');
3181 } else if (typeof value !== 'string' && typeof value !== 'function') {
3182 error('Variable value must be a string or a function');
3183 } else if (Object.prototype.hasOwnProperty.call(this._variables, name) && !overwrite) {
3184 error("\"".concat(name, "\" is already defined"));
3185 }
3186 this._variables[name] = value;
3187 },
3188 /**
3189 * Get a variable.
3190 *
3191 * @param {String} name Name of the variable.
3192 * @return {String|Function|null}
3193 */
3194 getVariable: function getVariable(name) {
3195 if (!Object.prototype.hasOwnProperty.call(this._variables, name)) {
3196 return null;
3197 }
3198 return this._variables[name];
3199 },
3200 /**
3201 * Remove a variable.
3202 *
3203 * @param {String} name Name of the varaible.
3204 */
3205 removeVariable: function removeVariable(name) {
3206 delete this._variables[name];
3207 },
3208 /**
3209 * Get all variables.
3210 *
3211 * @return {Object}
3212 */
3213 getAllVariables: function getAllVariables() {
3214 return this._variables;
3215 },
3216 _parsePart: function _parsePart(part) {
3217 var c,
3218 inInterpolation = false,
3219 currentIndex = 0;
3220 var tokens = [];
3221 if (part.length === 0) {
3222 error('Unable to parse empty string');
3223 }
3224 for (var i = 0; i < part.length; i++) {
3225 c = part.charAt(i);
3226 if (c === '$' && part.charAt(i + 1) === '{') {
3227 if (inInterpolation) {
3228 error('Nested interpolation not supported');
3229 }
3230 var token = part.substring(currentIndex, i);
3231 if (token.length > 0) {
3232 tokens.push(part.substring(currentIndex, i));
3233 }
3234 currentIndex = i;
3235 inInterpolation = true;
3236 } else if (c === '}') {
3237 if (!inInterpolation) {
3238 error('} must be preceeded by ${');
3239 }
3240 var _token = part.substring(currentIndex, i + 1);
3241 if (_token.length > 0) {
3242 tokens.push(part.substring(currentIndex, i + 1));
3243 }
3244 currentIndex = i + 1;
3245 inInterpolation = false;
3246 }
3247 }
3248 if (inInterpolation) {
3249 error('Unterminated interpolation');
3250 }
3251 tokens.push(part.substring(currentIndex, part.length));
3252 return tokens;
3253 },
3254 _replaceToken: function _replaceToken(token) {
3255 var re = /^\${(.*?)}$/,
3256 match = token.match(re);
3257 if (match) {
3258 var name = match[1].trim();
3259 var variable = this.getVariable(name);
3260 if (variable === null) {
3261 error("Variable \"".concat(name, "\" does not exist"));
3262 } else if (typeof variable === 'string') {
3263 return variable;
3264 } else {
3265 var rv = variable();
3266 if (typeof rv !== 'string') {
3267 error('Must return a string');
3268 }
3269 return rv;
3270 }
3271 } else {
3272 return token;
3273 }
3274 },
3275 _replaceTokens: function _replaceTokens(tokens) {
3276 return tokens.map(this._replaceToken.bind(this));
3277 },
3278 _parseExpression: function _parseExpression(expression) {
3279 return expression.split(',').map(function (part) {
3280 return part.trim();
3281 }).map(this._parsePart.bind(this)).map(this._replaceTokens.bind(this)).map(function (part) {
3282 return part.join('');
3283 });
3284 },
3285 /**
3286 * Evaluate an expression.
3287 *
3288 * @param {String} expression An page attribute expression.
3289 * @return {Array}
3290 */
3291 evaluate: function evaluate(expression) {
3292 if (!expression) {
3293 return [];
3294 }
3295 return this._parseExpression(expression);
3296 }
3297 };
3298
3299 // Define default variables.
3300 pageAttributeExpression.defineVariable('mobileOS', platform.getMobileOS());
3301 pageAttributeExpression.defineVariable('iOSDevice', platform.getIOSDevice());
3302 pageAttributeExpression.defineVariable('runtime', function () {
3303 return platform.isWebView() ? 'cordova' : 'browser';
3304 });
3305
3306 var internal = {};
3307 internal.config = {
3308 autoStatusBarFill: true,
3309 animationsDisabled: false,
3310 warningsDisabled: false
3311 };
3312 internal.nullElement = window.document.createElement('div');
3313
3314 /**
3315 * @return {Boolean}
3316 */
3317 internal.isEnabledAutoStatusBarFill = function () {
3318 return !!internal.config.autoStatusBarFill;
3319 };
3320
3321 /**
3322 * @param {String} html
3323 * @return {String}
3324 */
3325 internal.normalizePageHTML = function (html) {
3326 return ('' + html).trim();
3327 };
3328 internal.waitDOMContentLoaded = function (callback) {
3329 if (window.document.readyState === 'loading' || window.document.readyState == 'uninitialized') {
3330 var wrappedCallback = function wrappedCallback() {
3331 callback();
3332 window.document.removeEventListener('DOMContentLoaded', wrappedCallback);
3333 };
3334 window.document.addEventListener('DOMContentLoaded', wrappedCallback);
3335 } else {
3336 setImmediate(callback);
3337 }
3338 };
3339 internal.autoStatusBarFill = function (action) {
3340 var onReady = function onReady() {
3341 if (internal.shouldFillStatusBar()) {
3342 action();
3343 }
3344 document.removeEventListener('deviceready', onReady);
3345 };
3346 if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object') {
3347 document.addEventListener('deviceready', onReady);
3348 } else if (['complete', 'interactive'].indexOf(document.readyState) === -1) {
3349 internal.waitDOMContentLoaded(onReady);
3350 } else {
3351 onReady();
3352 }
3353 };
3354 internal.shouldFillStatusBar = function () {
3355 return internal.isEnabledAutoStatusBarFill() && (platform.isWebView() && (platform.isIOS7above() || platform.isIPadOS()) && !platform.isIPhoneX() || document.body.querySelector('.ons-status-bar-mock.ios'));
3356 };
3357 internal.templateStore = {
3358 _storage: {},
3359 /**
3360 * @param {String} key
3361 * @return {String/null} template
3362 */
3363 get: function get(key) {
3364 return internal.templateStore._storage[key] || null;
3365 },
3366 /**
3367 * @param {String} key
3368 * @param {String} template
3369 */
3370 set: function set(key, template) {
3371 internal.templateStore._storage[key] = template;
3372 }
3373 };
3374
3375 /**
3376 * @param {String} page
3377 * @return {Promise}
3378 */
3379 internal.getTemplateHTMLAsync = function (page) {
3380 return new Promise(function (resolve, reject) {
3381 internal.waitDOMContentLoaded(function () {
3382 var cache = internal.templateStore.get(page);
3383 if (cache) {
3384 if (cache instanceof DocumentFragment) {
3385 return resolve(cache);
3386 }
3387 var html = typeof cache === 'string' ? cache : cache[1];
3388 return resolve(internal.normalizePageHTML(html));
3389 }
3390 var local = window.document.getElementById(page);
3391 if (local) {
3392 var _html = local.textContent || local.content;
3393 return resolve(_html);
3394 }
3395 var xhr = new XMLHttpRequest();
3396 xhr.open('GET', page, true);
3397 xhr.onload = function () {
3398 var html = xhr.responseText;
3399 if (xhr.status >= 400 && xhr.status < 600) {
3400 if (xhr.status === 404) {
3401 reject(404);
3402 } else {
3403 reject(html);
3404 }
3405 } else {
3406 // Refresh script tags
3407 var fragment = util$4.createFragment(html);
3408 util$4.arrayFrom(fragment.querySelectorAll('script')).forEach(function (el) {
3409 var script = document.createElement('script');
3410 script.type = el.type || 'text/javascript';
3411 script.appendChild(document.createTextNode(el.text || el.textContent || el.innerHTML));
3412 el.parentNode.replaceChild(script, el);
3413 });
3414 internal.templateStore.set(page, fragment);
3415 resolve(fragment);
3416 }
3417 };
3418 xhr.onerror = function () {
3419 util$4.throw("Page template not found: ".concat(page));
3420 };
3421 xhr.send(null);
3422 });
3423 });
3424 };
3425
3426 /**
3427 * @param {String} page
3428 * @return {Promise}
3429 */
3430 internal.getPageHTMLAsync = function (page) {
3431 var pages = pageAttributeExpression.evaluate(page);
3432 var getPage = function getPage(page) {
3433 if (typeof page !== 'string') {
3434 return Promise.reject('Must specify a page.');
3435 }
3436 return internal.getTemplateHTMLAsync(page).catch(function (error) {
3437 if (pages.length === 0) {
3438 return Promise.reject(error);
3439 }
3440 return getPage(pages.shift());
3441 });
3442 };
3443 return getPage(pages.shift());
3444 };
3445 var internal$1 = internal;
3446
3447 var AnimatorFactory = /*#__PURE__*/function () {
3448 /**
3449 * @param {Object} opts
3450 * @param {Object} opts.animators The dictionary for animator classes
3451 * @param {Function} opts.baseClass The base class of animators
3452 * @param {String} [opts.baseClassName] The name of the base class of animators
3453 * @param {String} [opts.defaultAnimation] The default animation name
3454 * @param {Object} [opts.defaultAnimationOptions] The default animation options
3455 */
3456 function AnimatorFactory(opts) {
3457 _classCallCheck(this, AnimatorFactory);
3458 this._animators = opts.animators;
3459 this._baseClass = opts.baseClass;
3460 this._baseClassName = opts.baseClassName || opts.baseClass.name;
3461 this._animation = opts.defaultAnimation || 'default';
3462 this._animationOptions = opts.defaultAnimationOptions || {};
3463 if (!this._animators[this._animation]) {
3464 util$4.throw('No such animation: ' + this._animation);
3465 }
3466 }
3467
3468 /**
3469 * @param {String} jsonString
3470 * @return {Object/null}
3471 */
3472 _createClass(AnimatorFactory, [{
3473 key: "setAnimationOptions",
3474 value:
3475 /**
3476 * @param {Object} options
3477 */
3478 function setAnimationOptions(options) {
3479 this._animationOptions = options;
3480 }
3481
3482 /**
3483 * @param {Object} options
3484 * @param {String} [options.animation] The animation name
3485 * @param {Object} [options.animationOptions] The animation options
3486 * @param {Object} defaultAnimator The default animator instance
3487 * @return {Object} An animator instance
3488 */
3489 }, {
3490 key: "newAnimator",
3491 value: function newAnimator() {
3492 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
3493 var defaultAnimator = arguments.length > 1 ? arguments[1] : undefined;
3494 var animator = null;
3495 if (options.animation instanceof this._baseClass) {
3496 return options.animation;
3497 }
3498 var Animator = null;
3499 if (typeof options.animation === 'string') {
3500 Animator = this._animators[options.animation];
3501 }
3502 if (!Animator && defaultAnimator) {
3503 animator = defaultAnimator;
3504 } else {
3505 Animator = Animator || this._animators[this._animation];
3506 var animationOpts = util$4.extend({}, this._animationOptions, options.animationOptions || {}, internal$1.config.animationsDisabled ? {
3507 duration: 0,
3508 delay: 0
3509 } : {});
3510 animator = new Animator(animationOpts);
3511 if (typeof animator === 'function') {
3512 animator = new animator(animationOpts); // eslint-disable-line new-cap
3513 }
3514 }
3515
3516 if (!(animator instanceof this._baseClass)) {
3517 util$4.throw("\"animator\" is not an instance of ".concat(this._baseClassName));
3518 }
3519 return animator;
3520 }
3521 }], [{
3522 key: "parseAnimationOptionsString",
3523 value: function parseAnimationOptionsString(jsonString) {
3524 try {
3525 if (typeof jsonString === 'string') {
3526 var result = util$4.animationOptionsParse(jsonString);
3527 if (_typeof(result) === 'object' && result !== null) {
3528 return result;
3529 } else {
3530 console.error('"animation-options" attribute must be a JSON object string: ' + jsonString);
3531 }
3532 }
3533 return {};
3534 } catch (e) {
3535 console.error('"animation-options" attribute must be a JSON object string: ' + jsonString);
3536 return {};
3537 }
3538 }
3539 }]);
3540 return AnimatorFactory;
3541 }();
3542
3543 var util$2 = {
3544 _ready: false,
3545 _domContentLoaded: false,
3546 _onDOMContentLoaded: function _onDOMContentLoaded() {
3547 util$2._domContentLoaded = true;
3548 if (platform.isWebView()) {
3549 window.document.addEventListener('deviceready', function () {
3550 util$2._ready = true;
3551 }, false);
3552 } else {
3553 util$2._ready = true;
3554 }
3555 },
3556 addBackButtonListener: function addBackButtonListener(fn) {
3557 if (!this._domContentLoaded) {
3558 throw new Error('This method is available after DOMContentLoaded');
3559 }
3560 if (this._ready) {
3561 window.document.addEventListener('backbutton', fn, false);
3562 } else {
3563 window.document.addEventListener('deviceready', function () {
3564 window.document.addEventListener('backbutton', fn, false);
3565 });
3566 }
3567 },
3568 removeBackButtonListener: function removeBackButtonListener(fn) {
3569 if (!this._domContentLoaded) {
3570 throw new Error('This method is available after DOMContentLoaded');
3571 }
3572 if (this._ready) {
3573 window.document.removeEventListener('backbutton', fn, false);
3574 } else {
3575 window.document.addEventListener('deviceready', function () {
3576 window.document.removeEventListener('backbutton', fn, false);
3577 });
3578 }
3579 }
3580 };
3581 window.addEventListener('DOMContentLoaded', function () {
3582 return util$2._onDOMContentLoaded();
3583 }, false);
3584 var HandlerRepository = {
3585 _store: {},
3586 _genId: function () {
3587 var i = 0;
3588 return function () {
3589 return i++;
3590 };
3591 }(),
3592 set: function set(element, handler) {
3593 if (element.dataset.deviceBackButtonHandlerId) {
3594 this.remove(element);
3595 }
3596 var id = element.dataset.deviceBackButtonHandlerId = HandlerRepository._genId();
3597 this._store[id] = handler;
3598 },
3599 remove: function remove(element) {
3600 if (element.dataset.deviceBackButtonHandlerId) {
3601 delete this._store[element.dataset.deviceBackButtonHandlerId];
3602 delete element.dataset.deviceBackButtonHandlerId;
3603 }
3604 },
3605 get: function get(element) {
3606 if (!element.dataset.deviceBackButtonHandlerId) {
3607 return undefined;
3608 }
3609 var id = element.dataset.deviceBackButtonHandlerId;
3610 if (!this._store[id]) {
3611 throw new Error();
3612 }
3613 return this._store[id];
3614 },
3615 has: function has(element) {
3616 if (!element.dataset) {
3617 return false;
3618 }
3619 var id = element.dataset.deviceBackButtonHandlerId;
3620 return !!this._store[id];
3621 }
3622 };
3623 var DeviceBackButtonDispatcher = /*#__PURE__*/function () {
3624 function DeviceBackButtonDispatcher() {
3625 _classCallCheck(this, DeviceBackButtonDispatcher);
3626 this._isEnabled = false;
3627 this._boundCallback = this._callback.bind(this);
3628 }
3629
3630 /**
3631 * Enable to handle 'backbutton' events.
3632 */
3633 _createClass(DeviceBackButtonDispatcher, [{
3634 key: "enable",
3635 value: function enable() {
3636 if (!this._isEnabled) {
3637 util$2.addBackButtonListener(this._boundCallback);
3638 this._isEnabled = true;
3639 }
3640 }
3641
3642 /**
3643 * Disable to handle 'backbutton' events.
3644 */
3645 }, {
3646 key: "disable",
3647 value: function disable() {
3648 if (this._isEnabled) {
3649 util$2.removeBackButtonListener(this._boundCallback);
3650 this._isEnabled = false;
3651 }
3652 }
3653
3654 /**
3655 * Fire a 'backbutton' event manually.
3656 */
3657 }, {
3658 key: "fireDeviceBackButtonEvent",
3659 value: function fireDeviceBackButtonEvent() {
3660 var event = document.createEvent('Event');
3661 event.initEvent('backbutton', true, true);
3662 document.dispatchEvent(event);
3663 }
3664 }, {
3665 key: "_callback",
3666 value: function _callback() {
3667 this._dispatchDeviceBackButtonEvent();
3668 }
3669
3670 /**
3671 * @param {HTMLElement} element
3672 * @param {Function} callback
3673 */
3674 }, {
3675 key: "createHandler",
3676 value: function createHandler(element, callback) {
3677 if (!(element instanceof HTMLElement)) {
3678 throw new Error('element must be an instance of HTMLElement');
3679 }
3680 if (!(callback instanceof Function)) {
3681 throw new Error('callback must be an instance of Function');
3682 }
3683 var handler = {
3684 _callback: callback,
3685 _element: element,
3686 disable: function disable() {
3687 HandlerRepository.remove(element);
3688 },
3689 setListener: function setListener(callback) {
3690 this._callback = callback;
3691 },
3692 enable: function enable() {
3693 HandlerRepository.set(element, this);
3694 },
3695 isEnabled: function isEnabled() {
3696 return HandlerRepository.get(element) === this;
3697 },
3698 destroy: function destroy() {
3699 HandlerRepository.remove(element);
3700 this._callback = this._element = null;
3701 }
3702 };
3703 handler.enable();
3704 return handler;
3705 }
3706 }, {
3707 key: "_dispatchDeviceBackButtonEvent",
3708 value: function _dispatchDeviceBackButtonEvent() {
3709 var tree = this._captureTree();
3710 var element = this._findHandlerLeafElement(tree);
3711 var handler = HandlerRepository.get(element);
3712 handler._callback(createEvent(element));
3713 function createEvent(element) {
3714 return {
3715 _element: element,
3716 callParentHandler: function callParentHandler() {
3717 var parent = this._element.parentNode;
3718 while (parent) {
3719 handler = HandlerRepository.get(parent);
3720 if (handler) {
3721 return handler._callback(createEvent(parent));
3722 }
3723 parent = parent.parentNode;
3724 }
3725 }
3726 };
3727 }
3728 }
3729
3730 /**
3731 * @return {Object}
3732 */
3733 }, {
3734 key: "_captureTree",
3735 value: function _captureTree() {
3736 return createTree(document.body);
3737 function createTree(element) {
3738 var tree = {
3739 element: element,
3740 children: Array.prototype.concat.apply([], arrayOf(element.children).map(function (childElement) {
3741 if (childElement.style.display === 'none' || childElement._isShown === false) {
3742 return [];
3743 }
3744 if (childElement.children.length === 0 && !HandlerRepository.has(childElement)) {
3745 return [];
3746 }
3747 var result = createTree(childElement);
3748 if (result.children.length === 0 && !HandlerRepository.has(result.element)) {
3749 return [];
3750 }
3751 return [result];
3752 }))
3753 };
3754 if (!HandlerRepository.has(tree.element)) {
3755 for (var i = 0; i < tree.children.length; i++) {
3756 var subTree = tree.children[i];
3757 if (HandlerRepository.has(subTree.element)) {
3758 return subTree;
3759 }
3760 }
3761 }
3762 return tree;
3763 }
3764 function arrayOf(target) {
3765 var result = [];
3766 for (var i = 0; i < target.length; i++) {
3767 result.push(target[i]);
3768 }
3769 return result;
3770 }
3771 }
3772
3773 /**
3774 * @param {Object} tree
3775 * @return {HTMLElement}
3776 */
3777 }, {
3778 key: "_findHandlerLeafElement",
3779 value: function _findHandlerLeafElement(tree) {
3780 return find(tree);
3781 function find(node) {
3782 if (node.children.length === 0) {
3783 return node.element;
3784 }
3785 if (node.children.length === 1) {
3786 return find(node.children[0]);
3787 }
3788 return node.children.map(function (childNode) {
3789 return childNode.element;
3790 }).reduce(function (left, right) {
3791 if (!left) {
3792 return right;
3793 }
3794 var leftZ = parseInt(window.getComputedStyle(left, '').zIndex, 10);
3795 var rightZ = parseInt(window.getComputedStyle(right, '').zIndex, 10);
3796 if (!isNaN(leftZ) && !isNaN(rightZ)) {
3797 return leftZ > rightZ ? left : right;
3798 }
3799 throw new Error('Capturing backbutton-handler is failure.');
3800 }, null);
3801 }
3802 }
3803 }]);
3804 return DeviceBackButtonDispatcher;
3805 }();
3806 var deviceBackButtonDispatcher = new DeviceBackButtonDispatcher();
3807
3808 /*
3809 Copyright 2013-2015 ASIAL CORPORATION
3810
3811 Licensed under the Apache License, Version 2.0 (the "License");
3812 you may not use this file except in compliance with the License.
3813 You may obtain a copy of the License at
3814
3815 http://www.apache.org/licenses/LICENSE-2.0
3816
3817 Unless required by applicable law or agreed to in writing, software
3818 distributed under the License is distributed on an "AS IS" BASIS,
3819 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3820 See the License for the specific language governing permissions and
3821 limitations under the License.
3822
3823 */
3824 internal$1.AnimatorFactory = AnimatorFactory;
3825 internal$1.ModifierUtil = ModifierUtil;
3826 internal$1.dbbDispatcher = deviceBackButtonDispatcher;
3827
3828 function setup$1(ons) {
3829 internal$1.waitDOMContentLoaded(function () {
3830 register('script[type="text/template"]');
3831 register('script[type="text/ng-template"]');
3832 register('template');
3833 function register(query) {
3834 var templates = window.document.querySelectorAll(query);
3835 for (var i = 0; i < templates.length; i++) {
3836 internal$1.templateStore.set(templates[i].getAttribute('id'), templates[i].textContent || templates[i].content);
3837 }
3838 }
3839 });
3840 if (window._onsLoaded) {
3841 ons._util.warn('Onsen UI is loaded more than once.');
3842 }
3843 window._onsLoaded = true;
3844 ons.ready(function () {
3845 ons.enableDeviceBackButtonHandler();
3846 ons._defaultDeviceBackButtonHandler = ons._internal.dbbDispatcher.createHandler(window.document.body, function () {
3847 if (Object.hasOwnProperty.call(navigator, 'app')) {
3848 navigator.app.exitApp();
3849 } else {
3850 console.warn('Could not close the app. Is \'cordova.js\' included?\nError: \'window.navigator.app\' is undefined.');
3851 }
3852 });
3853 document.body._gestureDetector = new ons.GestureDetector(document.body, {
3854 passive: true
3855 });
3856
3857 // Simulate Device Back Button on ESC press
3858 if (!ons.platform.isWebView()) {
3859 document.body.addEventListener('keydown', function (event) {
3860 if (event.keyCode === 27) {
3861 ons.fireDeviceBackButtonEvent();
3862 }
3863 });
3864 }
3865
3866 // setup loading placeholder
3867 ons._setupLoadingPlaceHolders();
3868 });
3869
3870 // viewport.js
3871 Viewport.setup();
3872 }
3873
3874 /*
3875 Copyright 2013-2015 ASIAL CORPORATION
3876
3877 Licensed under the Apache License, Version 2.0 (the "License");
3878 you may not use this file except in compliance with the License.
3879 You may obtain a copy of the License at
3880
3881 http://www.apache.org/licenses/LICENSE-2.0
3882
3883 Unless required by applicable law or agreed to in writing, software
3884 distributed under the License is distributed on an "AS IS" BASIS,
3885 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3886 See the License for the specific language governing permissions and
3887 limitations under the License.
3888
3889 */
3890
3891 var TIMEOUT_RATIO = 1.4;
3892 var util$1 = {};
3893
3894 // capitalize string
3895 util$1.capitalize = function (str) {
3896 return str.charAt(0).toUpperCase() + str.slice(1);
3897 };
3898
3899 /**
3900 * @param {Object} params
3901 * @param {String} params.property
3902 * @param {Float} params.duration
3903 * @param {String} params.timing
3904 */
3905 util$1.buildTransitionValue = function (params) {
3906 params.property = params.property || 'all';
3907 params.duration = params.duration || 0.4;
3908 params.timing = params.timing || 'linear';
3909 var props = params.property.split(/ +/);
3910 return props.map(function (prop) {
3911 return prop + ' ' + params.duration + 's ' + params.timing;
3912 }).join(', ');
3913 };
3914
3915 /**
3916 * Add an event handler on "transitionend" event.
3917 */
3918 util$1.onceOnTransitionEnd = function (element, callback) {
3919 if (!element) {
3920 return function () {};
3921 }
3922 var removeListeners = function removeListeners() {
3923 util$1._transitionEndEvents.forEach(function (eventName) {
3924 element.removeEventListener(eventName, fn, false);
3925 });
3926 };
3927 var fn = function fn(event) {
3928 if (element == event.target) {
3929 event.stopPropagation();
3930 removeListeners();
3931 callback();
3932 }
3933 };
3934 util$1._transitionEndEvents.forEach(function (eventName) {
3935 element.addEventListener(eventName, fn, false);
3936 });
3937 return removeListeners;
3938 };
3939 util$1._transitionEndEvents = function () {
3940 if ('ontransitionend' in window) {
3941 return ['transitionend'];
3942 }
3943 if ('onwebkittransitionend' in window) {
3944 return ['webkitTransitionEnd'];
3945 }
3946 if (util$1.vendorPrefix === 'webkit' || util$1.vendorPrefix === 'o' || util$1.vendorPrefix === 'moz' || util$1.vendorPrefix === 'ms') {
3947 return [util$1.vendorPrefix + 'TransitionEnd', 'transitionend'];
3948 }
3949 return [];
3950 }();
3951 util$1._cssPropertyDict = function () {
3952 var styles = window.getComputedStyle(document.documentElement, '');
3953 var dict = {};
3954 var a = 'A'.charCodeAt(0);
3955 var z = 'z'.charCodeAt(0);
3956 var upper = function upper(s) {
3957 return s.substr(1).toUpperCase();
3958 };
3959 for (var i = 0; i < styles.length; i++) {
3960 var key = styles[i].replace(/^[-]+/, '').replace(/[-][a-z]/g, upper).replace(/^moz/, 'Moz');
3961 if (a <= key.charCodeAt(0) && z >= key.charCodeAt(0)) {
3962 if (key !== 'cssText' && key !== 'parentText') {
3963 dict[key] = true;
3964 }
3965 }
3966 }
3967 return dict;
3968 }();
3969 util$1.hasCssProperty = function (name) {
3970 return name in util$1._cssPropertyDict;
3971 };
3972
3973 /**
3974 * Vendor prefix for css property.
3975 */
3976 util$1.vendorPrefix = function () {
3977 var styles = window.getComputedStyle(document.documentElement, ''),
3978 pre = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1];
3979 return pre;
3980 }();
3981 util$1.forceLayoutAtOnce = function (elements, callback) {
3982 this.batchImmediate(function () {
3983 elements.forEach(function (element) {
3984 // force layout
3985 element.offsetHeight;
3986 });
3987 callback();
3988 });
3989 };
3990 util$1.batchImmediate = function () {
3991 var callbacks = [];
3992 return function (callback) {
3993 if (callbacks.length === 0) {
3994 setImmediate(function () {
3995 var concreateCallbacks = callbacks.slice(0);
3996 callbacks = [];
3997 concreateCallbacks.forEach(function (callback) {
3998 callback();
3999 });
4000 });
4001 }
4002 callbacks.push(callback);
4003 };
4004 }();
4005 util$1.batchAnimationFrame = function () {
4006 var callbacks = [];
4007 var raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {
4008 setTimeout(callback, 1000 / 60);
4009 };
4010 return function (callback) {
4011 if (callbacks.length === 0) {
4012 raf(function () {
4013 var concreateCallbacks = callbacks.slice(0);
4014 callbacks = [];
4015 concreateCallbacks.forEach(function (callback) {
4016 callback();
4017 });
4018 });
4019 }
4020 callbacks.push(callback);
4021 };
4022 }();
4023 util$1.transitionPropertyName = function () {
4024 if (util$1.hasCssProperty('transitionDuration')) {
4025 return 'transition';
4026 }
4027 if (util$1.hasCssProperty(util$1.vendorPrefix + 'TransitionDuration')) {
4028 return util$1.vendorPrefix + 'Transition';
4029 }
4030 throw new Error('Invalid state');
4031 }();
4032
4033 /**
4034 * @param {HTMLElement} element
4035 */
4036 var Animit = function Animit(element, defaults) {
4037 if (!(this instanceof Animit)) {
4038 return new Animit(element, defaults);
4039 }
4040 if (element instanceof HTMLElement) {
4041 this.elements = [element];
4042 } else if (Object.prototype.toString.call(element) === '[object Array]') {
4043 this.elements = element;
4044 } else {
4045 throw new Error('First argument must be an array or an instance of HTMLElement.');
4046 }
4047 this.defaults = defaults;
4048 this.transitionQueue = [];
4049 this.lastStyleAttributeDict = [];
4050 };
4051 Animit.prototype = {
4052 /**
4053 * @property {Array}
4054 */
4055 transitionQueue: undefined,
4056 /**
4057 * @property {Array}
4058 */
4059 elements: undefined,
4060 /**
4061 * @property {Object}
4062 */
4063 defaults: undefined,
4064 /**
4065 * Start animation sequence with passed animations.
4066 *
4067 * @param {Function} callback
4068 */
4069 play: function play(callback) {
4070 if (typeof callback === 'function') {
4071 this.transitionQueue.push(function (done) {
4072 callback();
4073 done();
4074 });
4075 }
4076 this.startAnimation();
4077 return this;
4078 },
4079 /**
4080 * Most of the animations follow this default process.
4081 *
4082 * @param {from} css or options object containing css
4083 * @param {to} css or options object containing css
4084 * @param {delay} delay to wait
4085 */
4086 default: function _default(from, to, delay) {
4087 function step(params, duration, timing) {
4088 if (params.duration !== undefined) {
4089 duration = params.duration;
4090 }
4091 if (params.timing !== undefined) {
4092 timing = params.timing;
4093 }
4094 return {
4095 css: params.css || params,
4096 duration: duration,
4097 timing: timing
4098 };
4099 }
4100 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();
4101 },
4102 /**
4103 * Queue transition animations or other function.
4104 *
4105 * e.g. animit(elt).queue({color: 'red'})
4106 * e.g. animit(elt).queue({color: 'red'}, {duration: 0.4})
4107 * e.g. animit(elt).queue({css: {color: 'red'}, duration: 0.2})
4108 *
4109 * @param {Object|Animit.Transition|Function} transition
4110 * @param {Object} [options]
4111 */
4112 queue: function queue(transition, options) {
4113 var queue = this.transitionQueue;
4114 if (transition && options) {
4115 options.css = transition;
4116 transition = new Animit.Transition(options);
4117 }
4118 if (!(transition instanceof Function || transition instanceof Animit.Transition)) {
4119 if (transition.css) {
4120 transition = new Animit.Transition(transition);
4121 } else {
4122 transition = new Animit.Transition({
4123 css: transition
4124 });
4125 }
4126 }
4127 if (transition instanceof Function) {
4128 queue.push(transition);
4129 } else if (transition instanceof Animit.Transition) {
4130 queue.push(transition.build());
4131 } else {
4132 throw new Error('Invalid arguments');
4133 }
4134 return this;
4135 },
4136 /**
4137 * Queue transition animations.
4138 *
4139 * @param {Float} seconds
4140 */
4141 wait: function wait(seconds) {
4142 if (seconds > 0) {
4143 this.transitionQueue.push(function (done) {
4144 setTimeout(done, 1000 * seconds);
4145 });
4146 }
4147 return this;
4148 },
4149 saveStyle: function saveStyle() {
4150 this.transitionQueue.push(function (done) {
4151 this.elements.forEach(function (element, index) {
4152 var css = this.lastStyleAttributeDict[index] = {};
4153 for (var i = 0; i < element.style.length; i++) {
4154 css[element.style[i]] = element.style[element.style[i]];
4155 }
4156 }.bind(this));
4157 done();
4158 }.bind(this));
4159 return this;
4160 },
4161 /**
4162 * Restore element's style.
4163 *
4164 * @param {Object} [options]
4165 * @param {Float} [options.duration]
4166 * @param {String} [options.timing]
4167 * @param {String} [options.transition]
4168 */
4169 restoreStyle: function restoreStyle(options) {
4170 options = options || {};
4171 var self = this;
4172 if (options.transition && !options.duration) {
4173 throw new Error('"options.duration" is required when "options.transition" is enabled.');
4174 }
4175 var transitionName = util$1.transitionPropertyName;
4176 if (options.transition || options.duration && options.duration > 0) {
4177 var transitionValue = options.transition || 'all ' + options.duration + 's ' + (options.timing || 'linear');
4178 this.transitionQueue.push(function (done) {
4179 var elements = this.elements;
4180 var timeoutId;
4181 var clearTransition = function clearTransition() {
4182 elements.forEach(function (element) {
4183 element.style[transitionName] = '';
4184 });
4185 };
4186
4187 // add "transitionend" event handler
4188 var removeListeners = util$1.onceOnTransitionEnd(elements[0], function () {
4189 clearTimeout(timeoutId);
4190 clearTransition();
4191 done();
4192 });
4193
4194 // for fail safe.
4195 timeoutId = setTimeout(function () {
4196 removeListeners();
4197 clearTransition();
4198 done();
4199 }, options.duration * 1000 * TIMEOUT_RATIO);
4200
4201 // transition and style settings
4202 elements.forEach(function (element, index) {
4203 var css = self.lastStyleAttributeDict[index];
4204 if (!css) {
4205 throw new Error('restoreStyle(): The style is not saved. Invoke saveStyle() before.');
4206 }
4207 self.lastStyleAttributeDict[index] = undefined;
4208 var name;
4209 for (var i = 0, len = element.style.length; i < len; i++) {
4210 name = element.style[i];
4211 if (css[name] === undefined) {
4212 css[name] = '';
4213 }
4214 }
4215 element.style[transitionName] = transitionValue;
4216 Object.keys(css).forEach(function (key) {
4217 if (key !== transitionName) {
4218 element.style[key] = css[key];
4219 }
4220 });
4221 element.style[transitionName] = transitionValue;
4222 });
4223 });
4224 } else {
4225 this.transitionQueue.push(function (done) {
4226 reset();
4227 done();
4228 });
4229 }
4230 return this;
4231 function reset() {
4232 // Clear transition animation settings.
4233 self.elements.forEach(function (element, index) {
4234 element.style[transitionName] = 'none';
4235 var css = self.lastStyleAttributeDict[index];
4236 if (!css) {
4237 throw new Error('restoreStyle(): The style is not saved. Invoke saveStyle() before.');
4238 }
4239 self.lastStyleAttributeDict[index] = undefined;
4240 for (var i = 0, name = ''; i < element.style.length; i++) {
4241 name = element.style[i];
4242 if (typeof css[element.style[i]] === 'undefined') {
4243 css[element.style[i]] = '';
4244 }
4245 }
4246 Object.keys(css).forEach(function (key) {
4247 element.style[key] = css[key];
4248 });
4249 });
4250 }
4251 },
4252 /**
4253 * Start animation sequence.
4254 */
4255 startAnimation: function startAnimation() {
4256 this._dequeueTransition();
4257 return this;
4258 },
4259 _dequeueTransition: function _dequeueTransition() {
4260 var transition = this.transitionQueue.shift();
4261 if (this._currentTransition) {
4262 throw new Error('Current transition exists.');
4263 }
4264 this._currentTransition = transition;
4265 var self = this;
4266 var called = false;
4267 var done = function done() {
4268 if (!called) {
4269 called = true;
4270 self._currentTransition = undefined;
4271 self._dequeueTransition();
4272 } else {
4273 throw new Error('Invalid state: This callback is called twice.');
4274 }
4275 };
4276 if (transition) {
4277 transition.call(this, done);
4278 }
4279 }
4280 };
4281
4282 /**
4283 * @param {Animit} arguments
4284 */
4285 Animit.runAll = function /* arguments... */
4286 () {
4287 for (var i = 0; i < arguments.length; i++) {
4288 arguments[i].play();
4289 }
4290 };
4291
4292 /**
4293 * @param {Object} options
4294 * @param {Float} [options.duration]
4295 * @param {String} [options.property]
4296 * @param {String} [options.timing]
4297 */
4298 Animit.Transition = function (options) {
4299 this.options = options || {};
4300 this.options.duration = this.options.duration || 0;
4301 this.options.timing = this.options.timing || 'linear';
4302 this.options.css = this.options.css || {};
4303 this.options.property = this.options.property || 'all';
4304 };
4305 Animit.Transition.prototype = {
4306 /**
4307 * @param {HTMLElement} element
4308 * @return {Function}
4309 */
4310 build: function build() {
4311 if (Object.keys(this.options.css).length === 0) {
4312 throw new Error('options.css is required.');
4313 }
4314 var css = createActualCssProps(this.options.css);
4315 if (this.options.duration > 0) {
4316 var transitionValue = util$1.buildTransitionValue(this.options);
4317 var self = this;
4318 return function (callback) {
4319 var elements = this.elements;
4320 var timeout = self.options.duration * 1000 * TIMEOUT_RATIO;
4321 var timeoutId;
4322 var removeListeners = util$1.onceOnTransitionEnd(elements[0], function () {
4323 clearTimeout(timeoutId);
4324 callback();
4325 });
4326 timeoutId = setTimeout(function () {
4327 removeListeners();
4328 callback();
4329 }, timeout);
4330 elements.forEach(function (element) {
4331 element.style[util$1.transitionPropertyName] = transitionValue;
4332 Object.keys(css).forEach(function (name) {
4333 element.style[name] = css[name];
4334 });
4335 });
4336 };
4337 }
4338 if (this.options.duration <= 0) {
4339 return function (callback) {
4340 var elements = this.elements;
4341 elements.forEach(function (element) {
4342 element.style[util$1.transitionPropertyName] = '';
4343 Object.keys(css).forEach(function (name) {
4344 element.style[name] = css[name];
4345 });
4346 });
4347 if (elements.length > 0) {
4348 util$1.forceLayoutAtOnce(elements, function () {
4349 util$1.batchAnimationFrame(callback);
4350 });
4351 } else {
4352 util$1.batchAnimationFrame(callback);
4353 }
4354 };
4355 }
4356 function createActualCssProps(css) {
4357 var result = {};
4358 Object.keys(css).forEach(function (name) {
4359 var value = css[name];
4360 if (util$1.hasCssProperty(name)) {
4361 result[name] = value;
4362 return;
4363 }
4364 var prefixed = util$1.vendorPrefix + util$1.capitalize(name);
4365 if (util$1.hasCssProperty(prefixed)) {
4366 result[prefixed] = value;
4367 } else {
4368 result[prefixed] = value;
4369 result[name] = value;
4370 }
4371 });
4372 return result;
4373 }
4374 }
4375 };
4376
4377 /*
4378 * Gesture detector library that forked from github.com/EightMedia/hammer.js.
4379 */
4380 var Event$1, Utils, Detection, PointerEvent;
4381
4382 /**
4383 * @object ons.GestureDetector
4384 * @category gesture
4385 * @description
4386 * [en]Utility class for gesture detection.[/en]
4387 * [ja]ジェスチャを検知するためのユーティリティクラスです。[/ja]
4388 */
4389
4390 /**
4391 * @method constructor
4392 * @signature constructor(element[, options])
4393 * @description
4394 * [en]Create a new GestureDetector instance.[/en]
4395 * [ja]GestureDetectorのインスタンスを生成します。[/ja]
4396 * @param {Element} element
4397 * [en]Name of the event.[/en]
4398 * [ja]ジェスチャを検知するDOM要素を指定します。[/ja]
4399 * @param {Object} [options]
4400 * [en]Options object.[/en]
4401 * [ja]オプションを指定します。[/ja]
4402 * @return {ons.GestureDetector.Instance}
4403 */
4404 var GestureDetector = function GestureDetector(element, options) {
4405 return new GestureDetector.Instance(element, options || {});
4406 };
4407
4408 /**
4409 * default settings.
4410 * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled
4411 * by setting it's name (like `swipe`) to false.
4412 * You can set the defaults for all instances by changing this object before creating an instance.
4413 * @example
4414 * ````
4415 * GestureDetector.defaults.drag = false;
4416 * GestureDetector.defaults.behavior.touchAction = 'pan-y';
4417 * delete GestureDetector.defaults.behavior.userSelect;
4418 * ````
4419 * @property defaults
4420 * @type {Object}
4421 */
4422 GestureDetector.defaults = {
4423 behavior: {
4424 // userSelect: 'none', // Also disables selection in `input` children
4425 touchAction: 'pan-y',
4426 touchCallout: 'none',
4427 contentZooming: 'none',
4428 userDrag: 'none',
4429 tapHighlightColor: 'rgba(0,0,0,0)'
4430 }
4431 };
4432
4433 /**
4434 * GestureDetector document where the base events are added at
4435 * @property DOCUMENT
4436 * @type {HTMLElement}
4437 * @default window.document
4438 */
4439 GestureDetector.DOCUMENT = document;
4440
4441 /**
4442 * detect support for pointer events
4443 * @property HAS_POINTEREVENTS
4444 * @type {Boolean}
4445 */
4446 GestureDetector.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled;
4447
4448 /**
4449 * detect support for touch events
4450 * @property HAS_TOUCHEVENTS
4451 * @type {Boolean}
4452 */
4453 GestureDetector.HAS_TOUCHEVENTS = 'ontouchstart' in window;
4454
4455 /**
4456 * detect mobile browsers
4457 * @property IS_MOBILE
4458 * @type {Boolean}
4459 */
4460 GestureDetector.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent);
4461
4462 /**
4463 * detect if we want to support mouseevents at all
4464 * @property NO_MOUSEEVENTS
4465 * @type {Boolean}
4466 */
4467 GestureDetector.NO_MOUSEEVENTS = GestureDetector.HAS_TOUCHEVENTS && GestureDetector.IS_MOBILE || GestureDetector.HAS_POINTEREVENTS;
4468
4469 /**
4470 * interval in which GestureDetector recalculates current velocity/direction/angle in ms
4471 * @property CALCULATE_INTERVAL
4472 * @type {Number}
4473 * @default 25
4474 */
4475 GestureDetector.CALCULATE_INTERVAL = 25;
4476
4477 /**
4478 * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup`
4479 * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`)
4480 * @property EVENT_TYPES
4481 * @private
4482 * @writeOnce
4483 * @type {Object}
4484 */
4485 var EVENT_TYPES = {};
4486
4487 /**
4488 * direction strings, for safe comparisons
4489 * @property DIRECTION_DOWN|LEFT|UP|RIGHT
4490 * @final
4491 * @type {String}
4492 * @default 'down' 'left' 'up' 'right'
4493 */
4494 var DIRECTION_DOWN = GestureDetector.DIRECTION_DOWN = 'down';
4495 var DIRECTION_LEFT = GestureDetector.DIRECTION_LEFT = 'left';
4496 var DIRECTION_UP = GestureDetector.DIRECTION_UP = 'up';
4497 var DIRECTION_RIGHT = GestureDetector.DIRECTION_RIGHT = 'right';
4498
4499 /**
4500 * pointertype strings, for safe comparisons
4501 * @property POINTER_MOUSE|TOUCH|PEN
4502 * @final
4503 * @type {String}
4504 * @default 'mouse' 'touch' 'pen'
4505 */
4506 var POINTER_MOUSE = GestureDetector.POINTER_MOUSE = 'mouse';
4507 var POINTER_TOUCH = GestureDetector.POINTER_TOUCH = 'touch';
4508 var POINTER_PEN = GestureDetector.POINTER_PEN = 'pen';
4509
4510 /**
4511 * eventtypes
4512 * @property EVENT_START|MOVE|END|RELEASE|TOUCH
4513 * @final
4514 * @type {String}
4515 * @default 'start' 'change' 'move' 'end' 'release' 'touch'
4516 */
4517 var EVENT_START = GestureDetector.EVENT_START = 'start';
4518 var EVENT_MOVE = GestureDetector.EVENT_MOVE = 'move';
4519 var EVENT_END = GestureDetector.EVENT_END = 'end';
4520 var EVENT_RELEASE = GestureDetector.EVENT_RELEASE = 'release';
4521 var EVENT_TOUCH = GestureDetector.EVENT_TOUCH = 'touch';
4522
4523 /**
4524 * if the window events are set...
4525 * @property READY
4526 * @writeOnce
4527 * @type {Boolean}
4528 * @default false
4529 */
4530 GestureDetector.READY = false;
4531
4532 /**
4533 * plugins namespace
4534 * @property plugins
4535 * @type {Object}
4536 */
4537 GestureDetector.plugins = GestureDetector.plugins || {};
4538
4539 /**
4540 * gestures namespace
4541 * see `/gestures` for the definitions
4542 * @property gestures
4543 * @type {Object}
4544 */
4545 GestureDetector.gestures = GestureDetector.gestures || {};
4546
4547 /**
4548 * setup events to detect gestures on the document
4549 * this function is called when creating an new instance
4550 * @private
4551 */
4552 function setup(opts) {
4553 if (GestureDetector.READY) {
4554 return;
4555 }
4556
4557 // find what eventtypes we add listeners to
4558 Event$1.determineEventTypes();
4559
4560 // Register all gestures inside GestureDetector.gestures
4561 Utils.each(GestureDetector.gestures, function (gesture) {
4562 Detection.register(gesture);
4563 });
4564
4565 // Add touch events on the document
4566 Event$1.onTouch(GestureDetector.DOCUMENT, EVENT_MOVE, Detection.detect, opts);
4567 Event$1.onTouch(GestureDetector.DOCUMENT, EVENT_END, Detection.detect, opts);
4568
4569 // GestureDetector is ready...!
4570 GestureDetector.READY = true;
4571 }
4572
4573 /**
4574 * @module GestureDetector
4575 *
4576 * @class Utils
4577 * @static
4578 */
4579 Utils = GestureDetector.utils = {
4580 /**
4581 * extend method, could also be used for cloning when `dest` is an empty object.
4582 * changes the dest object
4583 * @param {Object} dest
4584 * @param {Object} src
4585 * @param {Boolean} [merge=false] do a merge
4586 * @return {Object} dest
4587 */
4588 extend: function extend(dest, src, merge) {
4589 for (var key in src) {
4590 if (Object.prototype.hasOwnProperty.call(src, key) && (dest[key] === undefined || !merge)) {
4591 dest[key] = src[key];
4592 }
4593 }
4594 return dest;
4595 },
4596 /**
4597 * simple addEventListener wrapper
4598 * @param {HTMLElement} element
4599 * @param {String} type
4600 * @param {Function} handler
4601 */
4602 on: function on(element, type, handler, opt) {
4603 util$4.addEventListener(element, type, handler, opt, true);
4604 },
4605 /**
4606 * simple removeEventListener wrapper
4607 * @param {HTMLElement} element
4608 * @param {String} type
4609 * @param {Function} handler
4610 */
4611 off: function off(element, type, handler, opt) {
4612 util$4.removeEventListener(element, type, handler, opt, true);
4613 },
4614 /**
4615 * forEach over arrays and objects
4616 * @param {Object|Array} obj
4617 * @param {Function} iterator
4618 * @param {any} iterator.item
4619 * @param {Number} iterator.index
4620 * @param {Object|Array} iterator.obj the source object
4621 * @param {Object} context value to use as `this` in the iterator
4622 */
4623 each: function each(obj, iterator, context) {
4624 var i, len;
4625
4626 // native forEach on arrays
4627 if ('forEach' in obj) {
4628 obj.forEach(iterator, context);
4629 // arrays
4630 } else if (obj.length !== undefined) {
4631 for (i = 0, len = obj.length; i < len; i++) {
4632 if (iterator.call(context, obj[i], i, obj) === false) {
4633 return;
4634 }
4635 }
4636 // objects
4637 } else {
4638 for (i in obj) {
4639 if (Object.prototype.hasOwnProperty.call(obj, i) && iterator.call(context, obj[i], i, obj) === false) {
4640 return;
4641 }
4642 }
4643 }
4644 },
4645 /**
4646 * find if a string contains the string using indexOf
4647 * @param {String} src
4648 * @param {String} find
4649 * @return {Boolean} found
4650 */
4651 inStr: function inStr(src, find) {
4652 return src.indexOf(find) > -1;
4653 },
4654 /**
4655 * find if a array contains the object using indexOf or a simple polyfill
4656 * @param {String} src
4657 * @param {String} find
4658 * @return {Boolean|Number} false when not found, or the index
4659 */
4660 inArray: function inArray(src, find, deep) {
4661 if (deep) {
4662 for (var i = 0, len = src.length; i < len; i++) {
4663 // Array.findIndex
4664 if (Object.keys(find).every(function (key) {
4665 return src[i][key] === find[key];
4666 })) {
4667 return i;
4668 }
4669 }
4670 return -1;
4671 }
4672 if (src.indexOf) {
4673 return src.indexOf(find);
4674 } else {
4675 for (var i = 0, len = src.length; i < len; i++) {
4676 if (src[i] === find) {
4677 return i;
4678 }
4679 }
4680 return -1;
4681 }
4682 },
4683 /**
4684 * convert an array-like object (`arguments`, `touchlist`) to an array
4685 * @param {Object} obj
4686 * @return {Array}
4687 */
4688 toArray: function toArray(obj) {
4689 return Array.prototype.slice.call(obj, 0);
4690 },
4691 /**
4692 * find if a node is in the given parent
4693 * @param {HTMLElement} node
4694 * @param {HTMLElement} parent
4695 * @return {Boolean} found
4696 */
4697 hasParent: function hasParent(node, parent) {
4698 while (node) {
4699 if (node == parent) {
4700 return true;
4701 }
4702 node = node.parentNode;
4703 }
4704 return false;
4705 },
4706 /**
4707 * get the center of all the touches
4708 * @param {Array} touches
4709 * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties
4710 */
4711 getCenter: function getCenter(touches) {
4712 var pageX = [],
4713 pageY = [],
4714 clientX = [],
4715 clientY = [],
4716 min = Math.min,
4717 max = Math.max;
4718
4719 // no need to loop when only one touch
4720 if (touches.length === 1) {
4721 return {
4722 pageX: touches[0].pageX,
4723 pageY: touches[0].pageY,
4724 clientX: touches[0].clientX,
4725 clientY: touches[0].clientY
4726 };
4727 }
4728 Utils.each(touches, function (touch) {
4729 pageX.push(touch.pageX);
4730 pageY.push(touch.pageY);
4731 clientX.push(touch.clientX);
4732 clientY.push(touch.clientY);
4733 });
4734 return {
4735 pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2,
4736 pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2,
4737 clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2,
4738 clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2
4739 };
4740 },
4741 /**
4742 * calculate the velocity between two points. unit is in px per ms.
4743 * @param {Number} deltaTime
4744 * @param {Number} deltaX
4745 * @param {Number} deltaY
4746 * @return {Object} velocity `x` and `y`
4747 */
4748 getVelocity: function getVelocity(deltaTime, deltaX, deltaY) {
4749 return {
4750 x: Math.abs(deltaX / deltaTime) || 0,
4751 y: Math.abs(deltaY / deltaTime) || 0
4752 };
4753 },
4754 /**
4755 * calculate the angle between two coordinates
4756 * @param {Touch} touch1
4757 * @param {Touch} touch2
4758 * @return {Number} angle
4759 */
4760 getAngle: function getAngle(touch1, touch2) {
4761 var x = touch2.clientX - touch1.clientX,
4762 y = touch2.clientY - touch1.clientY;
4763 return Math.atan2(y, x) * 180 / Math.PI;
4764 },
4765 /**
4766 * do a small comparison to get the direction between two touches.
4767 * @param {Touch} touch1
4768 * @param {Touch} touch2
4769 * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN`
4770 */
4771 getDirection: function getDirection(touch1, touch2) {
4772 var x = Math.abs(touch1.clientX - touch2.clientX),
4773 y = Math.abs(touch1.clientY - touch2.clientY);
4774 if (x >= y) {
4775 return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
4776 }
4777 return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN;
4778 },
4779 /**
4780 * calculate the distance between two touches
4781 * @param {Touch}touch1
4782 * @param {Touch} touch2
4783 * @return {Number} distance
4784 */
4785 getDistance: function getDistance(touch1, touch2) {
4786 var x = touch2.clientX - touch1.clientX,
4787 y = touch2.clientY - touch1.clientY;
4788 return Math.sqrt(x * x + y * y);
4789 },
4790 /**
4791 * calculate the scale factor between two touchLists
4792 * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out
4793 * @param {Array} start array of touches
4794 * @param {Array} end array of touches
4795 * @return {Number} scale
4796 */
4797 getScale: function getScale(start, end) {
4798 // need two fingers...
4799 if (start.length >= 2 && end.length >= 2) {
4800 return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]);
4801 }
4802 return 1;
4803 },
4804 /**
4805 * calculate the rotation degrees between two touchLists
4806 * @param {Array} start array of touches
4807 * @param {Array} end array of touches
4808 * @return {Number} rotation
4809 */
4810 getRotation: function getRotation(start, end) {
4811 // need two fingers
4812 if (start.length >= 2 && end.length >= 2) {
4813 return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]);
4814 }
4815 return 0;
4816 },
4817 /**
4818 * find out if the direction is vertical *
4819 * @param {String} direction matches `DIRECTION_UP|DOWN`
4820 * @return {Boolean} is_vertical
4821 */
4822 isVertical: function isVertical(direction) {
4823 return direction == DIRECTION_UP || direction == DIRECTION_DOWN;
4824 },
4825 /**
4826 * set css properties with their prefixes
4827 * @param {HTMLElement} element
4828 * @param {String} prop
4829 * @param {String} value
4830 * @param {Boolean} [toggle=true]
4831 * @return {Boolean}
4832 */
4833 setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) {
4834 var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms'];
4835 prop = Utils.toCamelCase(prop);
4836 for (var i = 0; i < prefixes.length; i++) {
4837 var p = prop;
4838 // prefixes
4839 if (prefixes[i]) {
4840 p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1);
4841 }
4842
4843 // test the style
4844 if (p in element.style) {
4845 element.style[p] = (toggle === null || toggle) && value || '';
4846 break;
4847 }
4848 }
4849 },
4850 /**
4851 * toggle browser default behavior by setting css properties.
4852 * `userSelect='none'` also sets `element.onselectstart` to false
4853 * `userDrag='none'` also sets `element.ondragstart` to false
4854 *
4855 * @param {HtmlElement} element
4856 * @param {Object} props
4857 * @param {Boolean} [toggle=true]
4858 */
4859 toggleBehavior: function toggleBehavior(element, props, toggle) {
4860 if (!props || !element || !element.style) {
4861 return;
4862 }
4863
4864 // set the css properties
4865 Utils.each(props, function (value, prop) {
4866 Utils.setPrefixedCss(element, prop, value, toggle);
4867 });
4868 var falseFn = toggle && function () {
4869 return false;
4870 };
4871
4872 // also the disable onselectstart
4873 if (props.userSelect == 'none') {
4874 element.onselectstart = falseFn;
4875 }
4876 // and disable ondragstart
4877 if (props.userDrag == 'none') {
4878 element.ondragstart = falseFn;
4879 }
4880 },
4881 /**
4882 * convert a string with underscores to camelCase
4883 * so prevent_default becomes preventDefault
4884 * @param {String} str
4885 * @return {String} camelCaseStr
4886 */
4887 toCamelCase: function toCamelCase(str) {
4888 return str.replace(/[_-]([a-z])/g, function (s) {
4889 return s[1].toUpperCase();
4890 });
4891 }
4892 };
4893
4894 /**
4895 * @module GestureDetector
4896 */
4897 /**
4898 * @class Event
4899 * @static
4900 */
4901 Event$1 = GestureDetector.event = {
4902 /**
4903 * when touch events have been fired, this is true
4904 * this is used to stop mouse events
4905 * @property prevent_mouseevents
4906 * @private
4907 * @type {Boolean}
4908 */
4909 preventMouseEvents: false,
4910 /**
4911 * if EVENT_START has been fired
4912 * @property started
4913 * @private
4914 * @type {Boolean}
4915 */
4916 started: false,
4917 /**
4918 * when the mouse is hold down, this is true
4919 * @property should_detect
4920 * @private
4921 * @type {Boolean}
4922 */
4923 shouldDetect: false,
4924 /**
4925 * simple event binder with a hook and support for multiple types
4926 * @param {HTMLElement} element
4927 * @param {String} type
4928 * @param {Function} handler
4929 * @param {Object} [opt]
4930 * @param {Function} [hook]
4931 * @param {Object} hook.type
4932 */
4933 on: function on(element, type, handler, opt, hook) {
4934 var types = type.split(' ');
4935 Utils.each(types, function (type) {
4936 Utils.on(element, type, handler, opt);
4937 hook && hook(type);
4938 });
4939 },
4940 /**
4941 * simple event unbinder with a hook and support for multiple types
4942 * @param {HTMLElement} element
4943 * @param {String} type
4944 * @param {Function} handler
4945 * @param {Object} [opt]
4946 * @param {Function} [hook]
4947 * @param {Object} hook.type
4948 */
4949 off: function off(element, type, handler, opt, hook) {
4950 var types = type.split(' ');
4951 Utils.each(types, function (type) {
4952 Utils.off(element, type, handler, opt);
4953 hook && hook(type);
4954 });
4955 },
4956 /**
4957 * the core touch event handler.
4958 * this finds out if we should to detect gestures
4959 * @param {HTMLElement} element
4960 * @param {String} eventType matches `EVENT_START|MOVE|END`
4961 * @param {Function} handler
4962 * @return onTouchHandler {Function} the core event handler
4963 */
4964 onTouch: function onTouch(element, eventType, handler, opt) {
4965 var self = this;
4966 var onTouchHandler = function onTouchHandler(ev) {
4967 var srcType = ev.type.toLowerCase(),
4968 isPointer = GestureDetector.HAS_POINTEREVENTS,
4969 isMouse = Utils.inStr(srcType, 'mouse'),
4970 triggerType;
4971
4972 // if we are in a mouseevent, but there has been a touchevent triggered in this session
4973 // we want to do nothing. simply break out of the event.
4974 if (isMouse && self.preventMouseEvents) {
4975 return;
4976
4977 // mousebutton must be down
4978 } else if (isMouse && eventType == EVENT_START && ev.button === 0) {
4979 self.preventMouseEvents = false;
4980 self.shouldDetect = true;
4981 } else if (isPointer && eventType == EVENT_START) {
4982 self.shouldDetect = ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev);
4983 // just a valid start event, but no mouse
4984 } else if (!isMouse && eventType == EVENT_START) {
4985 self.preventMouseEvents = true;
4986 self.shouldDetect = true;
4987 }
4988
4989 // update the pointer event before entering the detection
4990 if (isPointer && eventType != EVENT_END) {
4991 PointerEvent.updatePointer(eventType, ev);
4992 }
4993
4994 // we are in a touch/down state, so allowed detection of gestures
4995 if (self.shouldDetect) {
4996 triggerType = self.doDetect.call(self, ev, eventType, element, handler);
4997 }
4998
4999 // ...and we are done with the detection
5000 // so reset everything to start each detection totally fresh
5001 if (triggerType == EVENT_END) {
5002 self.preventMouseEvents = false;
5003 self.shouldDetect = false;
5004 PointerEvent.reset();
5005 // update the pointerevent object after the detection
5006 }
5007
5008 if (isPointer && eventType == EVENT_END) {
5009 PointerEvent.updatePointer(eventType, ev);
5010 }
5011 };
5012 this.on(element, EVENT_TYPES[eventType], onTouchHandler, opt);
5013 return onTouchHandler;
5014 },
5015 /**
5016 * the core detection method
5017 * this finds out what GestureDetector-touch-events to trigger
5018 * @param {Object} ev
5019 * @param {String} eventType matches `EVENT_START|MOVE|END`
5020 * @param {HTMLElement} element
5021 * @param {Function} handler
5022 * @return {String} triggerType matches `EVENT_START|MOVE|END`
5023 */
5024 doDetect: function doDetect(ev, eventType, element, handler) {
5025 var touchList = this.getTouchList(ev, eventType);
5026 var touchListLength = touchList.length;
5027 var triggerType = eventType;
5028 var triggerChange = touchList.trigger; // used by fakeMultitouch plugin
5029 var changedLength = touchListLength;
5030
5031 // at each touchstart-like event we want also want to trigger a TOUCH event...
5032 if (eventType == EVENT_START) {
5033 triggerChange = EVENT_TOUCH;
5034 // ...the same for a touchend-like event
5035 } else if (eventType == EVENT_END) {
5036 triggerChange = EVENT_RELEASE;
5037
5038 // keep track of how many touches have been removed
5039 changedLength = touchList.length - (ev.changedTouches ? ev.changedTouches.length : 1);
5040 }
5041
5042 // after there are still touches on the screen,
5043 // we just want to trigger a MOVE event. so change the START or END to a MOVE
5044 // but only after detection has been started, the first time we actually want a START
5045 if (changedLength > 0 && this.started) {
5046 triggerType = EVENT_MOVE;
5047 }
5048
5049 // detection has been started, we keep track of this, see above
5050 this.started = true;
5051
5052 // generate some event data, some basic information
5053 var evData = this.collectEventData(element, triggerType, touchList, ev);
5054
5055 // trigger the triggerType event before the change (TOUCH, RELEASE) events
5056 // but the END event should be at last
5057 if (eventType != EVENT_END) {
5058 handler.call(Detection, evData);
5059 }
5060
5061 // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed
5062 if (triggerChange) {
5063 evData.changedLength = changedLength;
5064 evData.eventType = triggerChange;
5065 handler.call(Detection, evData);
5066 evData.eventType = triggerType;
5067 delete evData.changedLength;
5068 }
5069
5070 // trigger the END event
5071 if (triggerType == EVENT_END) {
5072 handler.call(Detection, evData);
5073
5074 // ...and we are done with the detection
5075 // so reset everything to start each detection totally fresh
5076 this.started = false;
5077 }
5078 return triggerType;
5079 },
5080 /**
5081 * we have different events for each device/browser
5082 * determine what we need and set them in the EVENT_TYPES constant
5083 * the `onTouch` method is bind to these properties.
5084 * @return {Object} events
5085 */
5086 determineEventTypes: function determineEventTypes() {
5087 var types;
5088 if (GestureDetector.HAS_POINTEREVENTS) {
5089 if (window.PointerEvent) {
5090 types = ['pointerdown', 'pointermove', 'pointerup pointercancel lostpointercapture'];
5091 } else {
5092 types = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp MSPointerCancel MSLostPointerCapture'];
5093 }
5094 } else if (GestureDetector.NO_MOUSEEVENTS) {
5095 types = ['touchstart', 'touchmove', 'touchend touchcancel'];
5096 } else {
5097 types = ['touchstart mousedown', 'touchmove mousemove', 'touchend touchcancel mouseup'];
5098 }
5099 EVENT_TYPES[EVENT_START] = types[0];
5100 EVENT_TYPES[EVENT_MOVE] = types[1];
5101 EVENT_TYPES[EVENT_END] = types[2];
5102 return EVENT_TYPES;
5103 },
5104 /**
5105 * create touchList depending on the event
5106 * @param {Object} ev
5107 * @param {String} eventType
5108 * @return {Array} touches
5109 */
5110 getTouchList: function getTouchList(ev, eventType) {
5111 // get the fake pointerEvent touchlist
5112 if (GestureDetector.HAS_POINTEREVENTS) {
5113 return PointerEvent.getTouchList();
5114 }
5115
5116 // get the touchlist
5117 if (ev.touches) {
5118 if (eventType == EVENT_MOVE) {
5119 return ev.touches;
5120 }
5121 var identifiers = [];
5122 var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches));
5123 var touchList = [];
5124 Utils.each(concat, function (touch) {
5125 if (Utils.inArray(identifiers, touch.identifier) === -1) {
5126 touchList.push(touch);
5127 }
5128 identifiers.push(touch.identifier);
5129 });
5130 return touchList;
5131 }
5132
5133 // make fake touchList from mouse position
5134 ev.identifier = 1;
5135 return [ev];
5136 },
5137 /**
5138 * collect basic event data
5139 * @param {HTMLElement} element
5140 * @param {String} eventType matches `EVENT_START|MOVE|END`
5141 * @param {Array} touches
5142 * @param {Object} ev
5143 * @return {Object} ev
5144 */
5145 collectEventData: function collectEventData(element, eventType, touches, ev) {
5146 // find out pointerType
5147 var pointerType = POINTER_TOUCH;
5148 if (Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) {
5149 pointerType = POINTER_MOUSE;
5150 } else if (PointerEvent.matchType(POINTER_PEN, ev)) {
5151 pointerType = POINTER_PEN;
5152 }
5153 return {
5154 center: Utils.getCenter(touches),
5155 timeStamp: Date.now(),
5156 target: ev.target,
5157 touches: touches,
5158 eventType: eventType,
5159 pointerType: pointerType,
5160 srcEvent: ev,
5161 /**
5162 * prevent the browser default actions
5163 * mostly used to disable scrolling of the browser
5164 */
5165 preventDefault: function preventDefault() {
5166 var srcEvent = this.srcEvent;
5167 srcEvent.preventManipulation && srcEvent.preventManipulation();
5168 srcEvent.preventDefault && srcEvent.preventDefault();
5169 },
5170 /**
5171 * stop bubbling the event up to its parents
5172 */
5173 stopPropagation: function stopPropagation() {
5174 this.srcEvent.stopPropagation();
5175 },
5176 /**
5177 * immediately stop gesture detection
5178 * might be useful after a swipe was detected
5179 * @return {*}
5180 */
5181 stopDetect: function stopDetect() {
5182 return Detection.stopDetect();
5183 }
5184 };
5185 }
5186 };
5187
5188 /**
5189 * @module GestureDetector
5190 *
5191 * @class PointerEvent
5192 * @static
5193 */
5194 PointerEvent = GestureDetector.PointerEvent = {
5195 /**
5196 * holds all pointers, by `identifier`
5197 * @property pointers
5198 * @type {Object}
5199 */
5200 pointers: {},
5201 /**
5202 * get the pointers as an array
5203 * @return {Array} touchlist
5204 */
5205 getTouchList: function getTouchList() {
5206 var touchlist = [];
5207 // we can use forEach since pointerEvents only is in IE10
5208 Utils.each(this.pointers, function (pointer) {
5209 touchlist.push(pointer);
5210 });
5211 return touchlist;
5212 },
5213 /**
5214 * update the position of a pointer
5215 * @param {String} eventType matches `EVENT_START|MOVE|END`
5216 * @param {Object} pointerEvent
5217 */
5218 updatePointer: function updatePointer(eventType, pointerEvent) {
5219 if (eventType == EVENT_END || eventType != EVENT_END && pointerEvent.buttons !== 1) {
5220 delete this.pointers[pointerEvent.pointerId];
5221 } else {
5222 pointerEvent.identifier = pointerEvent.pointerId;
5223 this.pointers[pointerEvent.pointerId] = pointerEvent;
5224 }
5225 },
5226 /**
5227 * check if ev matches pointertype
5228 * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN`
5229 * @param {PointerEvent} ev
5230 */
5231 matchType: function matchType(pointerType, ev) {
5232 if (!ev.pointerType) {
5233 return false;
5234 }
5235 var pt = ev.pointerType,
5236 types = {};
5237 types[POINTER_MOUSE] = pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE);
5238 types[POINTER_TOUCH] = pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH);
5239 types[POINTER_PEN] = pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN);
5240 return types[pointerType];
5241 },
5242 /**
5243 * reset the stored pointers
5244 */
5245 reset: function resetList() {
5246 this.pointers = {};
5247 }
5248 };
5249
5250 /**
5251 * @module GestureDetector
5252 *
5253 * @class Detection
5254 * @static
5255 */
5256 Detection = GestureDetector.detection = {
5257 // contains all registered GestureDetector.gestures in the correct order
5258 gestures: [],
5259 // data of the current GestureDetector.gesture detection session
5260 current: null,
5261 // the previous GestureDetector.gesture session data
5262 // is a full clone of the previous gesture.current object
5263 previous: null,
5264 // when this becomes true, no gestures are fired
5265 stopped: false,
5266 /**
5267 * start GestureDetector.gesture detection
5268 * @param {GestureDetector.Instance} inst
5269 * @param {Object} eventData
5270 */
5271 startDetect: function startDetect(inst, eventData) {
5272 // already busy with a GestureDetector.gesture detection on an element
5273 if (this.current) {
5274 return;
5275 }
5276 this.stopped = false;
5277
5278 // holds current session
5279 this.current = {
5280 inst: inst,
5281 // reference to GestureDetectorInstance we're working for
5282 startEvent: Utils.extend({}, eventData),
5283 // start eventData for distances, timing etc
5284 lastEvent: false,
5285 // last eventData
5286 lastCalcEvent: false,
5287 // last eventData for calculations.
5288 futureCalcEvent: false,
5289 // last eventData for calculations.
5290 lastCalcData: {},
5291 // last lastCalcData
5292 name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc
5293 };
5294
5295 this.detect(eventData);
5296 },
5297 /**
5298 * GestureDetector.gesture detection
5299 * @param {Object} eventData
5300 * @return {any}
5301 */
5302 detect: function detect(eventData) {
5303 if (!this.current || this.stopped) {
5304 return;
5305 }
5306
5307 // extend event data with calculations about scale, distance etc
5308 eventData = this.extendEventData(eventData);
5309
5310 // GestureDetector instance and instance options
5311 var inst = this.current.inst,
5312 instOptions = inst.options;
5313
5314 // call GestureDetector.gesture handlers
5315 Utils.each(this.gestures, function triggerGesture(gesture) {
5316 // only when the instance options have enabled this gesture
5317 if (!this.stopped && inst.enabled && instOptions[gesture.name]) {
5318 gesture.handler.call(gesture, eventData, inst);
5319 }
5320 }, this);
5321
5322 // store as previous event event
5323 if (this.current) {
5324 this.current.lastEvent = eventData;
5325 }
5326 if (eventData.eventType == EVENT_END) {
5327 this.stopDetect();
5328 }
5329 return eventData; // eslint-disable-line consistent-return
5330 },
5331
5332 /**
5333 * clear the GestureDetector.gesture vars
5334 * this is called on endDetect, but can also be used when a final GestureDetector.gesture has been detected
5335 * to stop other GestureDetector.gestures from being fired
5336 */
5337 stopDetect: function stopDetect() {
5338 // clone current data to the store as the previous gesture
5339 // used for the double tap gesture, since this is an other gesture detect session
5340 this.previous = Utils.extend({}, this.current);
5341
5342 // reset the current
5343 this.current = null;
5344 this.stopped = true;
5345 },
5346 /**
5347 * calculate velocity, angle and direction
5348 * @param {Object} ev
5349 * @param {Object} center
5350 * @param {Number} deltaTime
5351 * @param {Number} deltaX
5352 * @param {Number} deltaY
5353 */
5354 getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) {
5355 var cur = this.current,
5356 recalc = false,
5357 calcEv = cur.lastCalcEvent,
5358 calcData = cur.lastCalcData;
5359 if (calcEv && ev.timeStamp - calcEv.timeStamp > GestureDetector.CALCULATE_INTERVAL) {
5360 center = calcEv.center;
5361 deltaTime = ev.timeStamp - calcEv.timeStamp;
5362 deltaX = ev.center.clientX - calcEv.center.clientX;
5363 deltaY = ev.center.clientY - calcEv.center.clientY;
5364 recalc = true;
5365 }
5366 if (ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) {
5367 cur.futureCalcEvent = ev;
5368 }
5369 if (!cur.lastCalcEvent || recalc) {
5370 calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY);
5371 calcData.angle = Utils.getAngle(center, ev.center);
5372 calcData.direction = Utils.getDirection(center, ev.center);
5373 cur.lastCalcEvent = cur.futureCalcEvent || ev;
5374 cur.futureCalcEvent = ev;
5375 }
5376 ev.velocityX = calcData.velocity.x;
5377 ev.velocityY = calcData.velocity.y;
5378 ev.interimAngle = calcData.angle;
5379 ev.interimDirection = calcData.direction;
5380 },
5381 /**
5382 * extend eventData for GestureDetector.gestures
5383 * @param {Object} ev
5384 * @return {Object} ev
5385 */
5386 extendEventData: function extendEventData(ev) {
5387 var cur = this.current,
5388 startEv = cur.startEvent,
5389 lastEv = cur.lastEvent || startEv;
5390
5391 // update the start touchlist to calculate the scale/rotation
5392 if (ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) {
5393 startEv.touches = [];
5394 Utils.each(ev.touches, function (touch) {
5395 startEv.touches.push({
5396 clientX: touch.clientX,
5397 clientY: touch.clientY
5398 });
5399 });
5400 }
5401 var deltaTime = ev.timeStamp - startEv.timeStamp,
5402 deltaX = ev.center.clientX - startEv.center.clientX,
5403 deltaY = ev.center.clientY - startEv.center.clientY;
5404 this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY);
5405 Utils.extend(ev, {
5406 startEvent: startEv,
5407 deltaTime: deltaTime,
5408 deltaX: deltaX,
5409 deltaY: deltaY,
5410 distance: Utils.getDistance(startEv.center, ev.center),
5411 angle: Utils.getAngle(startEv.center, ev.center),
5412 direction: Utils.getDirection(startEv.center, ev.center),
5413 scale: Utils.getScale(startEv.touches, ev.touches),
5414 rotation: Utils.getRotation(startEv.touches, ev.touches)
5415 });
5416 return ev;
5417 },
5418 /**
5419 * register new gesture
5420 * @param {Object} gesture object, see `gestures/` for documentation
5421 * @return {Array} gestures
5422 */
5423 register: function register(gesture) {
5424 // add an enable gesture options if there is no given
5425 var options = gesture.defaults || {};
5426 if (options[gesture.name] === undefined) {
5427 options[gesture.name] = true;
5428 }
5429
5430 // extend GestureDetector default options with the GestureDetector.gesture options
5431 Utils.extend(GestureDetector.defaults, options, true);
5432
5433 // set its index
5434 gesture.index = gesture.index || 1000;
5435
5436 // add GestureDetector.gesture to the list
5437 this.gestures.push(gesture);
5438
5439 // sort the list by index
5440 this.gestures.sort(function (a, b) {
5441 if (a.index < b.index) {
5442 return -1;
5443 }
5444 if (a.index > b.index) {
5445 return 1;
5446 }
5447 return 0;
5448 });
5449 return this.gestures;
5450 }
5451 };
5452
5453 /**
5454 * @module GestureDetector
5455 */
5456
5457 /**
5458 * create new GestureDetector instance
5459 * all methods should return the instance itself, so it is chainable.
5460 *
5461 * @class Instance
5462 * @constructor
5463 * @param {HTMLElement} element
5464 * @param {Object} [options={}] options are merged with `GestureDetector.defaults`
5465 * @return {GestureDetector.Instance}
5466 */
5467 GestureDetector.Instance = function (element, options) {
5468 var self = this;
5469 var listenerOptions = options && options.passive ? {
5470 passive: true
5471 } : undefined;
5472
5473 // setup GestureDetectorJS window events and register all gestures
5474 // this also sets up the default options
5475 setup(listenerOptions);
5476
5477 /**
5478 * @property element
5479 * @type {HTMLElement}
5480 */
5481 this.element = element;
5482
5483 /**
5484 * @property enabled
5485 * @type {Boolean}
5486 * @protected
5487 */
5488 this.enabled = true;
5489
5490 /**
5491 * options, merged with the defaults
5492 * options with an _ are converted to camelCase
5493 * @property options
5494 * @type {Object}
5495 */
5496 Utils.each(options, function (value, name) {
5497 delete options[name];
5498 options[Utils.toCamelCase(name)] = value;
5499 });
5500 this.options = Utils.extend(Utils.extend({}, GestureDetector.defaults), options || {});
5501 this.options.listenerOptions = listenerOptions;
5502
5503 // add some css to the element to prevent the browser from doing its native behavior
5504 if (this.options.behavior) {
5505 Utils.toggleBehavior(this.element, this.options.behavior, true);
5506 }
5507
5508 /**
5509 * event start handler on the element to start the detection
5510 * @property eventStartHandler
5511 * @type {Object}
5512 */
5513 this.eventStartHandler = Event$1.onTouch(element, EVENT_START, function (ev) {
5514 if (self.enabled && ev.eventType == EVENT_START) {
5515 Detection.startDetect(self, ev);
5516 } else if (ev.eventType == EVENT_TOUCH) {
5517 Detection.detect(ev);
5518 }
5519 }, listenerOptions);
5520
5521 /**
5522 * keep a list of user event handlers which needs to be removed when calling 'dispose'
5523 * @property eventHandlers
5524 * @type {Array}
5525 */
5526 this.eventHandlers = [];
5527 };
5528 GestureDetector.Instance.prototype = {
5529 /**
5530 * @method on
5531 * @signature on(gestures, handler)
5532 * @description
5533 * [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]
5534 * [ja]ジェスチャに対するイベントハンドラを追加します。指定できるジェスチャ名は、drag dragleft dragright dragup dragdown hold release swipe swipeleft swiperight swipeup swipedown tap doubletap touch transform pinch pinchin pinchout rotate です。[/ja]
5535 * @param {String} gestures
5536 * [en]A space separated list of gestures.[/en]
5537 * [ja]検知するジェスチャ名を指定します。スペースで複数指定することができます。[/ja]
5538 * @param {Function} handler
5539 * [en]An event handling function.[/en]
5540 * [ja]イベントハンドラとなる関数オブジェクトを指定します。[/ja]
5541 */
5542 on: function onEvent(gestures, handler, opt) {
5543 var self = this;
5544 Event$1.on(self.element, gestures, handler, util$4.extend({}, self.options.listenerOptions, opt), function (type) {
5545 self.eventHandlers.push({
5546 gesture: type,
5547 handler: handler
5548 });
5549 });
5550 return self;
5551 },
5552 /**
5553 * @method off
5554 * @signature off(gestures, handler)
5555 * @description
5556 * [en]Remove an event listener.[/en]
5557 * [ja]イベントリスナーを削除します。[/ja]
5558 * @param {String} gestures
5559 * [en]A space separated list of gestures.[/en]
5560 * [ja]ジェスチャ名を指定します。スペースで複数指定することができます。[/ja]
5561 * @param {Function} handler
5562 * [en]An event handling function.[/en]
5563 * [ja]イベントハンドラとなる関数オブジェクトを指定します。[/ja]
5564 */
5565 off: function offEvent(gestures, handler, opt) {
5566 var self = this;
5567 Event$1.off(self.element, gestures, handler, util$4.extend({}, self.options.listenerOptions, opt), function (type) {
5568 var index = Utils.inArray(self.eventHandlers, {
5569 gesture: type,
5570 handler: handler
5571 }, true);
5572 if (index >= 0) {
5573 self.eventHandlers.splice(index, 1);
5574 }
5575 });
5576 return self;
5577 },
5578 /**
5579 * trigger gesture event
5580 * @method trigger
5581 * @signature trigger(gesture, eventData)
5582 * @param {String} gesture
5583 * @param {Object} [eventData]
5584 */
5585 trigger: function triggerEvent(gesture, eventData) {
5586 // optional
5587 if (!eventData) {
5588 eventData = {};
5589 }
5590
5591 // create DOM event
5592 var event = GestureDetector.DOCUMENT.createEvent('Event');
5593 event.initEvent(gesture, true, true);
5594 event.gesture = eventData;
5595
5596 // trigger on the target if it is in the instance element,
5597 // this is for event delegation tricks
5598 var element = this.element;
5599 if (Utils.hasParent(eventData.target, element)) {
5600 element = eventData.target;
5601 }
5602 element.dispatchEvent(event);
5603 return this;
5604 },
5605 /**
5606 * @method enable
5607 * @signature enable(state)
5608 * @description
5609 * [en]Enable or disable gesture detection.[/en]
5610 * [ja]ジェスチャ検知を有効化/無効化します。[/ja]
5611 * @param {Boolean} state
5612 * [en]Specify if it should be enabled or not.[/en]
5613 * [ja]有効にするかどうかを指定します。[/ja]
5614 */
5615 enable: function enable(state) {
5616 this.enabled = state;
5617 return this;
5618 },
5619 /**
5620 * @method dispose
5621 * @signature dispose()
5622 * @description
5623 * [en]Remove and destroy all event handlers for this instance.[/en]
5624 * [ja]このインスタンスでのジェスチャの検知や、イベントハンドラを全て解除して廃棄します。[/ja]
5625 */
5626 dispose: function dispose() {
5627 var i, eh;
5628
5629 // undo all changes made by stop_browser_behavior
5630 Utils.toggleBehavior(this.element, this.options.behavior, false);
5631
5632 // unbind all custom event handlers
5633 for (i = -1; eh = this.eventHandlers[++i];) {
5634 // eslint-disable-line no-cond-assign
5635 Utils.off(this.element, eh.gesture, eh.handler);
5636 }
5637 this.eventHandlers = [];
5638
5639 // unbind the start event listener
5640 Event$1.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler);
5641 return null;
5642 }
5643 };
5644
5645 /**
5646 * @module gestures
5647 */
5648 /**
5649 * Move with x fingers (default 1) around on the page.
5650 * Preventing the default browser behavior is a good way to improve feel and working.
5651 * ````
5652 * GestureDetectortime.on("drag", function(ev) {
5653 * console.log(ev);
5654 * ev.gesture.preventDefault();
5655 * });
5656 * ````
5657 *
5658 * @class Drag
5659 * @static
5660 */
5661 /**
5662 * @event drag
5663 * @param {Object} ev
5664 */
5665 /**
5666 * @event dragstart
5667 * @param {Object} ev
5668 */
5669 /**
5670 * @event dragend
5671 * @param {Object} ev
5672 */
5673 /**
5674 * @event drapleft
5675 * @param {Object} ev
5676 */
5677 /**
5678 * @event dragright
5679 * @param {Object} ev
5680 */
5681 /**
5682 * @event dragup
5683 * @param {Object} ev
5684 */
5685 /**
5686 * @event dragdown
5687 * @param {Object} ev
5688 */
5689
5690 /**
5691 * @param {String} name
5692 */
5693 (function (name) {
5694 var triggered = false;
5695 function dragGesture(ev, inst) {
5696 var cur = Detection.current;
5697
5698 // max touches
5699 if (inst.options.dragMaxTouches > 0 && ev.touches.length > inst.options.dragMaxTouches) {
5700 return;
5701 }
5702 switch (ev.eventType) {
5703 case EVENT_START:
5704 triggered = false;
5705 break;
5706 case EVENT_MOVE:
5707 // when the distance we moved is too small we skip this gesture
5708 // or we can be already in dragging
5709 if (ev.distance < inst.options.dragMinDistance && cur.name != name) {
5710 return;
5711 }
5712 var startCenter = cur.startEvent.center;
5713
5714 // we are dragging!
5715 if (cur.name != name) {
5716 cur.name = name;
5717 if (inst.options.dragDistanceCorrection && ev.distance > 0) {
5718 // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center.
5719 // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0.
5720 // It might be useful to save the original start point somewhere
5721 var factor = Math.abs(inst.options.dragMinDistance / ev.distance);
5722 startCenter.pageX += ev.deltaX * factor;
5723 startCenter.pageY += ev.deltaY * factor;
5724 startCenter.clientX += ev.deltaX * factor;
5725 startCenter.clientY += ev.deltaY * factor;
5726
5727 // recalculate event data using new start point
5728 ev = Detection.extendEventData(ev);
5729 }
5730 }
5731
5732 // lock drag to axis?
5733 if (cur.lastEvent.dragLockToAxis || inst.options.dragLockToAxis && inst.options.dragLockMinDistance <= ev.distance) {
5734 ev.dragLockToAxis = true;
5735 }
5736
5737 // keep direction on the axis that the drag gesture started on
5738 var lastDirection = cur.lastEvent.direction;
5739 if (ev.dragLockToAxis && lastDirection !== ev.direction) {
5740 if (Utils.isVertical(lastDirection)) {
5741 ev.direction = ev.deltaY < 0 ? DIRECTION_UP : DIRECTION_DOWN;
5742 } else {
5743 ev.direction = ev.deltaX < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
5744 }
5745 }
5746
5747 // first time, trigger dragstart event
5748 if (!triggered) {
5749 inst.trigger(name + 'start', ev);
5750 triggered = true;
5751 }
5752
5753 // trigger events
5754 inst.trigger(name, ev);
5755 inst.trigger(name + ev.direction, ev);
5756 var isVertical = Utils.isVertical(ev.direction);
5757
5758 // block the browser events
5759 if (inst.options.dragBlockVertical && isVertical || inst.options.dragBlockHorizontal && !isVertical) {
5760 ev.preventDefault();
5761 }
5762 break;
5763 case EVENT_RELEASE:
5764 if (triggered && ev.changedLength <= inst.options.dragMaxTouches) {
5765 inst.trigger(name + 'end', ev);
5766 triggered = false;
5767 }
5768 break;
5769 case EVENT_END:
5770 triggered = false;
5771 break;
5772 }
5773 }
5774 GestureDetector.gestures.Drag = {
5775 name: name,
5776 index: 50,
5777 handler: dragGesture,
5778 defaults: {
5779 /**
5780 * minimal movement that have to be made before the drag event gets triggered
5781 * @property dragMinDistance
5782 * @type {Number}
5783 * @default 10
5784 */
5785 dragMinDistance: 10,
5786 /**
5787 * Set dragDistanceCorrection to true to make the starting point of the drag
5788 * be calculated from where the drag was triggered, not from where the touch started.
5789 * Useful to avoid a jerk-starting drag, which can make fine-adjustments
5790 * through dragging difficult, and be visually unappealing.
5791 * @property dragDistanceCorrection
5792 * @type {Boolean}
5793 * @default true
5794 */
5795 dragDistanceCorrection: true,
5796 /**
5797 * set 0 for unlimited, but this can conflict with transform
5798 * @property dragMaxTouches
5799 * @type {Number}
5800 * @default 1
5801 */
5802 dragMaxTouches: 1,
5803 /**
5804 * prevent default browser behavior when dragging occurs
5805 * be careful with it, it makes the element a blocking element
5806 * when you are using the drag gesture, it is a good practice to set this true
5807 * @property dragBlockHorizontal
5808 * @type {Boolean}
5809 * @default false
5810 */
5811 dragBlockHorizontal: false,
5812 /**
5813 * same as `dragBlockHorizontal`, but for vertical movement
5814 * @property dragBlockVertical
5815 * @type {Boolean}
5816 * @default false
5817 */
5818 dragBlockVertical: false,
5819 /**
5820 * dragLockToAxis keeps the drag gesture on the axis that it started on,
5821 * It disallows vertical directions if the initial direction was horizontal, and vice versa.
5822 * @property dragLockToAxis
5823 * @type {Boolean}
5824 * @default false
5825 */
5826 dragLockToAxis: false,
5827 /**
5828 * drag lock only kicks in when distance > dragLockMinDistance
5829 * This way, locking occurs only when the distance has become large enough to reliably determine the direction
5830 * @property dragLockMinDistance
5831 * @type {Number}
5832 * @default 25
5833 */
5834 dragLockMinDistance: 25
5835 }
5836 };
5837 })('drag');
5838
5839 /**
5840 * @module gestures
5841 */
5842 /**
5843 * trigger a simple gesture event, so you can do anything in your handler.
5844 * only usable if you know what your doing...
5845 *
5846 * @class Gesture
5847 * @static
5848 */
5849 /**
5850 * @event gesture
5851 * @param {Object} ev
5852 */
5853 GestureDetector.gestures.Gesture = {
5854 name: 'gesture',
5855 index: 1337,
5856 handler: function releaseGesture(ev, inst) {
5857 inst.trigger(this.name, ev);
5858 }
5859 };
5860
5861 /**
5862 * @module gestures
5863 */
5864 /**
5865 * Touch stays at the same place for x time
5866 *
5867 * @class Hold
5868 * @static
5869 */
5870 /**
5871 * @event hold
5872 * @param {Object} ev
5873 */
5874
5875 /**
5876 * @param {String} name
5877 */
5878 (function (name) {
5879 var timer;
5880 function holdGesture(ev, inst) {
5881 var options = inst.options,
5882 current = Detection.current;
5883 switch (ev.eventType) {
5884 case EVENT_START:
5885 clearTimeout(timer);
5886
5887 // set the gesture so we can check in the timeout if it still is
5888 current.name = name;
5889
5890 // set timer and if after the timeout it still is hold,
5891 // we trigger the hold event
5892 timer = setTimeout(function () {
5893 if (current && current.name == name) {
5894 inst.trigger(name, ev);
5895 }
5896 }, options.holdTimeout);
5897 break;
5898 case EVENT_MOVE:
5899 if (ev.distance > options.holdThreshold) {
5900 clearTimeout(timer);
5901 }
5902 break;
5903 case EVENT_RELEASE:
5904 clearTimeout(timer);
5905 break;
5906 }
5907 }
5908 GestureDetector.gestures.Hold = {
5909 name: name,
5910 index: 10,
5911 defaults: {
5912 /**
5913 * @property holdTimeout
5914 * @type {Number}
5915 * @default 500
5916 */
5917 holdTimeout: 500,
5918 /**
5919 * movement allowed while holding
5920 * @property holdThreshold
5921 * @type {Number}
5922 * @default 2
5923 */
5924 holdThreshold: 2
5925 },
5926 handler: holdGesture
5927 };
5928 })('hold');
5929
5930 /**
5931 * @module gestures
5932 */
5933 /**
5934 * when a touch is being released from the page
5935 *
5936 * @class Release
5937 * @static
5938 */
5939 /**
5940 * @event release
5941 * @param {Object} ev
5942 */
5943 GestureDetector.gestures.Release = {
5944 name: 'release',
5945 index: Infinity,
5946 handler: function releaseGesture(ev, inst) {
5947 if (ev.eventType == EVENT_RELEASE) {
5948 inst.trigger(this.name, ev);
5949 }
5950 }
5951 };
5952
5953 /**
5954 * @module gestures
5955 */
5956 /**
5957 * triggers swipe events when the end velocity is above the threshold
5958 * for best usage, set `preventDefault` (on the drag gesture) to `true`
5959 * ````
5960 * GestureDetectortime.on("dragleft swipeleft", function(ev) {
5961 * console.log(ev);
5962 * ev.gesture.preventDefault();
5963 * });
5964 * ````
5965 *
5966 * @class Swipe
5967 * @static
5968 */
5969 /**
5970 * @event swipe
5971 * @param {Object} ev
5972 */
5973 /**
5974 * @event swipeleft
5975 * @param {Object} ev
5976 */
5977 /**
5978 * @event swiperight
5979 * @param {Object} ev
5980 */
5981 /**
5982 * @event swipeup
5983 * @param {Object} ev
5984 */
5985 /**
5986 * @event swipedown
5987 * @param {Object} ev
5988 */
5989 GestureDetector.gestures.Swipe = {
5990 name: 'swipe',
5991 index: 40,
5992 defaults: {
5993 /**
5994 * @property swipeMinTouches
5995 * @type {Number}
5996 * @default 1
5997 */
5998 swipeMinTouches: 1,
5999 /**
6000 * @property swipeMaxTouches
6001 * @type {Number}
6002 * @default 1
6003 */
6004 swipeMaxTouches: 1,
6005 /**
6006 * horizontal swipe velocity
6007 * @property swipeVelocityX
6008 * @type {Number}
6009 * @default 0.6
6010 */
6011 swipeVelocityX: 0.6,
6012 /**
6013 * vertical swipe velocity
6014 * @property swipeVelocityY
6015 * @type {Number}
6016 * @default 0.6
6017 */
6018 swipeVelocityY: 0.6
6019 },
6020 handler: function swipeGesture(ev, inst) {
6021 if (ev.eventType == EVENT_RELEASE) {
6022 var touches = ev.touches.length,
6023 options = inst.options;
6024
6025 // max touches
6026 if (touches < options.swipeMinTouches || touches > options.swipeMaxTouches) {
6027 return;
6028 }
6029
6030 // when the distance we moved is too small we skip this gesture
6031 // or we can be already in dragging
6032 if (ev.velocityX > options.swipeVelocityX || ev.velocityY > options.swipeVelocityY) {
6033 // trigger swipe events
6034 inst.trigger(this.name, ev);
6035 inst.trigger(this.name + ev.direction, ev);
6036 }
6037 }
6038 }
6039 };
6040
6041 /**
6042 * @module gestures
6043 */
6044 /**
6045 * Single tap and a double tap on a place
6046 *
6047 * @class Tap
6048 * @static
6049 */
6050 /**
6051 * @event tap
6052 * @param {Object} ev
6053 */
6054 /**
6055 * @event doubletap
6056 * @param {Object} ev
6057 */
6058
6059 /**
6060 * @param {String} name
6061 */
6062 (function (name) {
6063 var hasMoved = false;
6064 function tapGesture(ev, inst) {
6065 var options = inst.options,
6066 current = Detection.current,
6067 prev = Detection.previous,
6068 sincePrev,
6069 didDoubleTap;
6070 switch (ev.eventType) {
6071 case EVENT_START:
6072 hasMoved = false;
6073 break;
6074 case EVENT_MOVE:
6075 hasMoved = hasMoved || ev.distance > options.tapMaxDistance;
6076 break;
6077 case EVENT_END:
6078 if (!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) {
6079 // previous gesture, for the double tap since these are two different gesture detections
6080 sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp;
6081 didDoubleTap = false;
6082
6083 // check if double tap
6084 if (prev && prev.name == name && sincePrev && sincePrev < options.doubleTapInterval && ev.distance < options.doubleTapDistance) {
6085 inst.trigger('doubletap', ev);
6086 didDoubleTap = true;
6087 }
6088
6089 // do a single tap
6090 if (!didDoubleTap || options.tapAlways) {
6091 current.name = name;
6092 inst.trigger(current.name, ev);
6093 }
6094 }
6095 break;
6096 }
6097 }
6098 GestureDetector.gestures.Tap = {
6099 name: name,
6100 index: 100,
6101 handler: tapGesture,
6102 defaults: {
6103 /**
6104 * max time of a tap, this is for the slow tappers
6105 * @property tapMaxTime
6106 * @type {Number}
6107 * @default 250
6108 */
6109 tapMaxTime: 250,
6110 /**
6111 * max distance of movement of a tap, this is for the slow tappers
6112 * @property tapMaxDistance
6113 * @type {Number}
6114 * @default 10
6115 */
6116 tapMaxDistance: 10,
6117 /**
6118 * always trigger the `tap` event, even while double-tapping
6119 * @property tapAlways
6120 * @type {Boolean}
6121 * @default true
6122 */
6123 tapAlways: true,
6124 /**
6125 * max distance between two taps
6126 * @property doubleTapDistance
6127 * @type {Number}
6128 * @default 20
6129 */
6130 doubleTapDistance: 20,
6131 /**
6132 * max time between two taps
6133 * @property doubleTapInterval
6134 * @type {Number}
6135 * @default 300
6136 */
6137 doubleTapInterval: 300
6138 }
6139 };
6140 })('tap');
6141
6142 /**
6143 * @module gestures
6144 */
6145 /**
6146 * when a touch is being touched at the page
6147 *
6148 * @class Touch
6149 * @static
6150 */
6151 /**
6152 * @event touch
6153 * @param {Object} ev
6154 */
6155 GestureDetector.gestures.Touch = {
6156 name: 'touch',
6157 index: -Infinity,
6158 defaults: {
6159 /**
6160 * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page,
6161 * but it improves gestures like transforming and dragging.
6162 * be careful with using this, it can be very annoying for users to be stuck on the page
6163 * @property preventDefault
6164 * @type {Boolean}
6165 * @default false
6166 */
6167 preventDefault: false,
6168 /**
6169 * disable mouse events, so only touch (or pen!) input triggers events
6170 * @property preventMouse
6171 * @type {Boolean}
6172 * @default false
6173 */
6174 preventMouse: false
6175 },
6176 handler: function touchGesture(ev, inst) {
6177 if (inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) {
6178 ev.stopDetect();
6179 return;
6180 }
6181 if (inst.options.preventDefault) {
6182 ev.preventDefault();
6183 }
6184 if (ev.eventType == EVENT_TOUCH) {
6185 inst.trigger('touch', ev);
6186 }
6187 }
6188 };
6189
6190 /**
6191 * @module gestures
6192 */
6193 /**
6194 * User want to scale or rotate with 2 fingers
6195 * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the
6196 * `preventDefault` option.
6197 *
6198 * @class Transform
6199 * @static
6200 */
6201 /**
6202 * @event transform
6203 * @param {Object} ev
6204 */
6205 /**
6206 * @event transformstart
6207 * @param {Object} ev
6208 */
6209 /**
6210 * @event transformend
6211 * @param {Object} ev
6212 */
6213 /**
6214 * @event pinchin
6215 * @param {Object} ev
6216 */
6217 /**
6218 * @event pinchout
6219 * @param {Object} ev
6220 */
6221 /**
6222 * @event rotate
6223 * @param {Object} ev
6224 */
6225
6226 /**
6227 * @param {String} name
6228 */
6229 (function (name) {
6230 var triggered = false;
6231 function transformGesture(ev, inst) {
6232 switch (ev.eventType) {
6233 case EVENT_START:
6234 triggered = false;
6235 break;
6236 case EVENT_MOVE:
6237 // at least multitouch
6238 if (ev.touches.length < 2) {
6239 return;
6240 }
6241 var scaleThreshold = Math.abs(1 - ev.scale);
6242 var rotationThreshold = Math.abs(ev.rotation);
6243
6244 // when the distance we moved is too small we skip this gesture
6245 // or we can be already in dragging
6246 if (scaleThreshold < inst.options.transformMinScale && rotationThreshold < inst.options.transformMinRotation) {
6247 return;
6248 }
6249
6250 // we are transforming!
6251 Detection.current.name = name;
6252
6253 // first time, trigger dragstart event
6254 if (!triggered) {
6255 inst.trigger(name + 'start', ev);
6256 triggered = true;
6257 }
6258 inst.trigger(name, ev); // basic transform event
6259
6260 // trigger rotate event
6261 if (rotationThreshold > inst.options.transformMinRotation) {
6262 inst.trigger('rotate', ev);
6263 }
6264
6265 // trigger pinch event
6266 if (scaleThreshold > inst.options.transformMinScale) {
6267 inst.trigger('pinch', ev);
6268 inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev);
6269 }
6270 break;
6271 case EVENT_RELEASE:
6272 if (triggered && ev.changedLength < 2) {
6273 inst.trigger(name + 'end', ev);
6274 triggered = false;
6275 }
6276 break;
6277 }
6278 }
6279 GestureDetector.gestures.Transform = {
6280 name: name,
6281 index: 45,
6282 defaults: {
6283 /**
6284 * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1
6285 * @property transformMinScale
6286 * @type {Number}
6287 * @default 0.01
6288 */
6289 transformMinScale: 0.01,
6290 /**
6291 * rotation in degrees
6292 * @property transformMinRotation
6293 * @type {Number}
6294 * @default 1
6295 */
6296 transformMinRotation: 1
6297 },
6298 handler: transformGesture
6299 };
6300 })('transform');
6301
6302 /*
6303 Copyright 2013-2015 ASIAL CORPORATION
6304
6305 Licensed under the Apache License, Version 2.0 (the "License");
6306 you may not use this file except in compliance with the License.
6307 You may obtain a copy of the License at
6308
6309 http://www.apache.org/licenses/LICENSE-2.0
6310
6311 Unless required by applicable law or agreed to in writing, software
6312 distributed under the License is distributed on an "AS IS" BASIS,
6313 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6314 See the License for the specific language governing permissions and
6315 limitations under the License.
6316
6317 */
6318
6319 var readyMap, queueMap;
6320 function isContentReady(element) {
6321 if (element.childNodes.length > 0) {
6322 setContentReady(element);
6323 }
6324 return readyMap.has(element);
6325 }
6326 function setContentReady(element) {
6327 readyMap.set(element, true);
6328 }
6329 function addCallback(element, fn) {
6330 if (!queueMap.has(element)) {
6331 queueMap.set(element, []);
6332 }
6333 queueMap.get(element).push(fn);
6334 }
6335 function consumeQueue(element) {
6336 var callbacks = queueMap.get(element, []) || [];
6337 queueMap.delete(element);
6338 callbacks.forEach(function (callback) {
6339 return callback();
6340 });
6341 }
6342 function contentReady(element) {
6343 var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
6344 if (readyMap === undefined) {
6345 readyMap = new WeakMap();
6346 queueMap = new WeakMap();
6347 }
6348 addCallback(element, fn);
6349 if (isContentReady(element)) {
6350 consumeQueue(element);
6351 return;
6352 }
6353 var observer = new MutationObserver(function (changes) {
6354 setContentReady(element);
6355 consumeQueue(element);
6356 });
6357 observer.observe(element, {
6358 childList: true,
6359 characterData: true
6360 });
6361
6362 // failback for elements has empty content.
6363 setImmediate(function () {
6364 setContentReady(element);
6365 consumeQueue(element);
6366 });
6367 }
6368
6369 /*
6370 Copyright 2013-2015 ASIAL CORPORATION
6371
6372 Licensed under the Apache License, Version 2.0 (the "License");
6373 you may not use this file except in compliance with the License.
6374 You may obtain a copy of the License at
6375
6376 http://www.apache.org/licenses/LICENSE-2.0
6377
6378 Unless required by applicable law or agreed to in writing, software
6379 distributed under the License is distributed on an "AS IS" BASIS,
6380 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6381 See the License for the specific language governing permissions and
6382 limitations under the License.
6383
6384 */
6385 var ToastQueue = /*#__PURE__*/function () {
6386 function ToastQueue() {
6387 _classCallCheck(this, ToastQueue);
6388 this.queue = [];
6389 }
6390 _createClass(ToastQueue, [{
6391 key: "add",
6392 value: function add(fn, promise) {
6393 var _this = this;
6394 this.queue.push(fn);
6395 if (this.queue.length === 1) {
6396 setImmediate(this.queue[0]);
6397 }
6398 promise.then(function () {
6399 _this.queue.shift();
6400 if (_this.queue.length > 0) {
6401 setTimeout(_this.queue[0], 1000 / 30); // Apply some visual delay
6402 }
6403 });
6404 }
6405 }]);
6406 return ToastQueue;
6407 }();
6408 var ToastQueue$1 = new ToastQueue();
6409
6410 var _setAttributes = function _setAttributes(element, options) {
6411 ['id', 'class', 'animation'].forEach(function (a) {
6412 return Object.prototype.hasOwnProperty.call(options, a) && element.setAttribute(a, options[a]);
6413 });
6414 if (options.modifier) {
6415 util$4.addModifier(element, options.modifier);
6416 }
6417 };
6418 var _normalizeArguments = function _normalizeArguments(message) {
6419 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
6420 var defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
6421 options = _objectSpread2({}, options);
6422 typeof message === 'string' ? options.message = message : options = message;
6423 if (!options || !options.message && !options.messageHTML) {
6424 util$4.throw('Notifications must contain a message');
6425 }
6426 if (Object.prototype.hasOwnProperty.call(options, 'buttonLabels') || Object.prototype.hasOwnProperty.call(options, 'buttonLabel')) {
6427 options.buttonLabels = options.buttonLabels || options.buttonLabel;
6428 if (!Array.isArray(options.buttonLabels)) {
6429 options.buttonLabels = [options.buttonLabels || ''];
6430 }
6431 }
6432 return util$4.extend({
6433 compile: function compile(param) {
6434 return param;
6435 },
6436 callback: function callback(param) {
6437 return param;
6438 },
6439 animation: 'default',
6440 cancelable: false,
6441 primaryButtonIndex: (options.buttonLabels || defaults.buttonLabels || []).length - 1
6442 }, defaults, options);
6443 };
6444
6445 /**
6446 * @object ons.notification
6447 * @category dialog
6448 * @tutorial vanilla/Reference/notification
6449 * @description
6450 * [en]
6451 * Utility methods to create different kinds of notifications. There are three methods available:
6452 *
6453 * * `ons.notification.alert()`
6454 * * `ons.notification.confirm()`
6455 * * `ons.notification.prompt()`
6456 * * `ons.notification.toast()`
6457 *
6458 * It will automatically display a Material Design dialog on Android devices.
6459 * [/en]
6460 * [ja]いくつかの種類のアラートダイアログを作成するためのユーティリティメソッドを収めたオブジェクトです。[/ja]
6461 * @example
6462 * ons.notification.alert('Hello, world!');
6463 *
6464 * ons.notification.confirm('Are you ready?')
6465 * .then(
6466 * function(answer) {
6467 * if (answer === 1) {
6468 * ons.notification.alert('Let\'s go!');
6469 * }
6470 * }
6471 * );
6472 *
6473 * ons.notification.prompt('How old are ?')
6474 * .then(
6475 * function(age) {
6476 * ons.notification.alert('You are ' + age + ' years old.');
6477 * }
6478 * );
6479 */
6480 var notification = {};
6481 notification._createAlertDialog = function () {
6482 for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
6483 params[_key] = arguments[_key];
6484 }
6485 return new Promise(function (resolve) {
6486 var options = _normalizeArguments.apply(void 0, params);
6487 util$4.checkMissingImport('AlertDialog', 'AlertDialogButton');
6488
6489 // Prompt input string
6490 var inputString = '';
6491 if (options.isPrompt) {
6492 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 ");
6493 }
6494
6495 // Buttons string
6496 var buttons = '';
6497 options.buttonLabels.forEach(function (label, index) {
6498 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 ");
6499 });
6500
6501 // Dialog Element
6502 var el = {};
6503 var _destroyDialog = function _destroyDialog() {
6504 if (el.dialog.onDialogCancel) {
6505 el.dialog.removeEventListener('dialogcancel', el.dialog.onDialogCancel);
6506 }
6507 Object.keys(el).forEach(function (key) {
6508 return delete el[key];
6509 });
6510 el = null;
6511 if (options.destroy instanceof Function) {
6512 options.destroy();
6513 }
6514 };
6515 el.dialog = document.createElement('ons-alert-dialog');
6516 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 ");
6517 contentReady(el.dialog);
6518
6519 // Set attributes
6520 _setAttributes(el.dialog, options);
6521
6522 // Prompt events
6523 if (options.isPrompt) {
6524 el.input = el.dialog.querySelector('.text-input');
6525 if (options.submitOnEnter) {
6526 el.input.onkeypress = function (event) {
6527 if (event.keyCode === 13) {
6528 el.dialog.hide().then(function () {
6529 if (el) {
6530 var resolveValue = el.input.value;
6531 _destroyDialog();
6532 options.callback(resolveValue);
6533 resolve(resolveValue);
6534 }
6535 });
6536 }
6537 };
6538 }
6539 }
6540
6541 // Button events
6542 el.footer = el.dialog.querySelector('.alert-dialog-footer');
6543 util$4.arrayFrom(el.dialog.querySelectorAll('.alert-dialog-button')).forEach(function (buttonElement, index) {
6544 buttonElement.onclick = function () {
6545 el.dialog.hide().then(function () {
6546 if (el) {
6547 var resolveValue = index;
6548 if (options.isPrompt) {
6549 resolveValue = index === options.primaryButtonIndex ? el.input.value : null;
6550 }
6551 el.dialog.remove();
6552 _destroyDialog();
6553 options.callback(resolveValue);
6554 resolve(resolveValue);
6555 }
6556 });
6557 };
6558 el.footer.appendChild(buttonElement);
6559 });
6560
6561 // Cancel events
6562 if (options.cancelable) {
6563 el.dialog.cancelable = true;
6564 el.dialog.onDialogCancel = function () {
6565 setImmediate(function () {
6566 el.dialog.remove();
6567 _destroyDialog();
6568 });
6569 var resolveValue = options.isPrompt ? null : -1;
6570 options.callback(resolveValue);
6571 resolve(resolveValue);
6572 };
6573 el.dialog.addEventListener('dialogcancel', el.dialog.onDialogCancel, false);
6574 }
6575
6576 // Show dialog
6577 document.body.appendChild(el.dialog);
6578 options.compile(el.dialog);
6579 setImmediate(function () {
6580 el.dialog.show().then(function () {
6581 if (el.input && options.isPrompt && options.autofocus) {
6582 var strLength = el.input.value.length;
6583 el.input.focus();
6584 if (el.input.type && ['text', 'search', 'url', 'tel', 'password'].includes(el.input.type)) {
6585 el.input.setSelectionRange(strLength, strLength);
6586 }
6587 }
6588 });
6589 });
6590 });
6591 };
6592
6593 /**
6594 * @method alert
6595 * @signature alert(message [, options] | options)
6596 * @return {Promise}
6597 * [en]Will resolve to the index of the button that was pressed or `-1` when canceled.[/en]
6598 * [ja][/ja]
6599 * @param {String} message
6600 * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
6601 * [ja][/ja]
6602 * @param {Object} options
6603 * [en]Parameter object.[/en]
6604 * [ja]オプションを指定するオブジェクトです。[/ja]
6605 * @param {String} [options.message]
6606 * [en]Notification message.[/en]
6607 * [ja]アラートダイアログに表示する文字列を指定します。[/ja]
6608 * @param {String} [options.messageHTML]
6609 * [en]Notification message in HTML.[/en]
6610 * [ja]アラートダイアログに表示するHTMLを指定します。[/ja]
6611 * @param {String | Array} [options.buttonLabels]
6612 * [en]Labels for the buttons. Default is `"OK"`.[/en]
6613 * [ja]確認ボタンのラベルを指定します。"OK"がデフォルトです。[/ja]
6614 * @param {Number} [options.primaryButtonIndex]
6615 * [en]Index of primary button. Default is the last one.[/en]
6616 * [ja]プライマリボタンのインデックスを指定します。デフォルトは 0 です。[/ja]
6617 * @param {Boolean} [options.cancelable]
6618 * [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]
6619 * [ja]ダイアログがキャンセル可能かどうかを指定します。[/ja]
6620 * @param {String} [options.animation]
6621 * [en]Animation name. Available animations are `none` and `fade`. Default is `fade`.[/en]
6622 * [ja]アラートダイアログを表示する際のアニメーション名を指定します。"none", "fade"のいずれかを指定できます。[/ja]
6623 * @param {String} [options.id]
6624 * [en]The `<ons-alert-dialog>` element's ID.[/en]
6625 * [ja]ons-alert-dialog要素のID。[/ja]
6626 * @param {String} [options.class]
6627 * [en]The `<ons-alert-dialog>` element's class.[/en]
6628 * [ja]ons-alert-dialog要素のclass。[/ja]
6629 * @param {String} [options.title]
6630 * [en]Dialog title. Default is `"Alert"`.[/en]
6631 * [ja]アラートダイアログの上部に表示するタイトルを指定します。"Alert"がデフォルトです。[/ja]
6632 * @param {String} [options.modifier]
6633 * [en]Modifier for the dialog.[/en]
6634 * [ja]アラートダイアログのmodifier属性の値を指定します。[/ja]
6635 * @param {String} [options.maskColor]
6636 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)" ("rgba(0, 0, 0, 0.3)" for Material).[/en]
6637 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
6638 * @param {Function} [options.callback]
6639 * [en]Function that executes after dialog has been closed.[/en]
6640 * [ja]アラートダイアログが閉じられた時に呼び出される関数オブジェクトを指定します。[/ja]
6641 * @description
6642 * [en]
6643 * Display an alert dialog to show the user a message.
6644 *
6645 * The content of the message can be either simple text or HTML.
6646 *
6647 * It can be called in the following ways:
6648 *
6649 * ```
6650 * ons.notification.alert(message, options);
6651 * ons.notification.alert(options);
6652 * ```
6653 *
6654 * Must specify either `message` or `messageHTML`.
6655 * [/en]
6656 * [ja]
6657 * ユーザーへメッセージを見せるためのアラートダイアログを表示します。
6658 * 表示するメッセージは、テキストかもしくはHTMLを指定できます。
6659 * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
6660 * [/ja]
6661 */
6662 notification.alert = function (message, options) {
6663 return notification._createAlertDialog(message, options, {
6664 buttonLabels: ['OK'],
6665 title: 'Alert'
6666 });
6667 };
6668
6669 /**
6670 * @method confirm
6671 * @signature confirm(message [, options] | options)
6672 * @return {Promise}
6673 * [en]Will resolve to the index of the button that was pressed or `-1` when canceled.[/en]
6674 * [ja][/ja]
6675 * @param {String} message
6676 * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
6677 * [ja][/ja]
6678 * @param {Object} options
6679 * [en]Parameter object.[/en]
6680 * @param {Array} [options.buttonLabels]
6681 * [en]Labels for the buttons. Default is `["Cancel", "OK"]`.[/en]
6682 * [ja]ボタンのラベルの配列を指定します。["Cancel", "OK"]がデフォルトです。[/ja]
6683 * @param {Number} [options.primaryButtonIndex]
6684 * [en]Index of primary button. Default is the last one.[/en]
6685 * [ja]プライマリボタンのインデックスを指定します。デフォルトは 1 です。[/ja]
6686 * @description
6687 * [en]
6688 * Display a dialog to ask the user for confirmation. Extends `alert()` parameters.
6689 * The default button labels are `"Cancel"` and `"OK"` but they can be customized.
6690 *
6691 * It can be called in the following ways:
6692 *
6693 * ```
6694 * ons.notification.confirm(message, options);
6695 * ons.notification.confirm(options);
6696 * ```
6697 *
6698 * Must specify either `message` or `messageHTML`.
6699 * [/en]
6700 * [ja]
6701 * ユーザに確認を促すダイアログを表示します。
6702 * デオルとのボタンラベルは、"Cancel"と"OK"ですが、これはこのメソッドの引数でカスタマイズできます。
6703 * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
6704 * [/ja]
6705 */
6706 notification.confirm = function (message, options) {
6707 return notification._createAlertDialog(message, options, {
6708 buttonLabels: ['Cancel', 'OK'],
6709 title: 'Confirm'
6710 });
6711 };
6712
6713 /**
6714 * @method prompt
6715 * @signature prompt(message [, options] | options)
6716 * @param {String} message
6717 * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
6718 * [ja][/ja]
6719 * @return {Promise}
6720 * [en]Will resolve to the input value when the dialog is closed or `null` when canceled.[/en]
6721 * [ja][/ja]
6722 * @param {Object} options
6723 * [en]Parameter object.[/en]
6724 * [ja]オプションを指定するオブジェクトです。[/ja]
6725 * @param {String | Array} [options.buttonLabels]
6726 * [en]Labels for the buttons. Default is `"OK"`.[/en]
6727 * [ja]確認ボタンのラベルを指定します。"OK"がデフォルトです。[/ja]
6728 * @param {Number} [options.primaryButtonIndex]
6729 * [en]Index of primary button. Default is the last one.[/en]
6730 * [ja]プライマリボタンのインデックスを指定します。デフォルトは 0 です。[/ja]
6731 * @param {String} [options.placeholder]
6732 * [en]Placeholder for the text input.[/en]
6733 * [ja]テキスト欄のプレースホルダに表示するテキストを指定します。[/ja]
6734 * @param {String} [options.defaultValue]
6735 * [en]Default value for the text input.[/en]
6736 * [ja]テキスト欄のデフォルトの値を指定します。[/ja]
6737 * @param {String} [options.inputType]
6738 * [en]Type of the input element (`password`, `date`...). Default is `text`.[/en]
6739 * [ja][/ja]
6740 * @param {Boolean} [options.autofocus]
6741 * [en]Autofocus the input element. Default is `true`. In Cordova, `KeyboardDisplayRequiresUserAction` in `config.xml` must be `false` to activate this feature.[/en]
6742 * [ja]input要素に自動的にフォーカスするかどうかを指定します。デフォルトはtrueです。Cordova環境では、この機能を有効にするためには `config.xml` で `KeyboardDisplayRequiresUserAction` を `false` に設定する必要があります。[/ja]
6743 * @param {Boolean} [options.submitOnEnter]
6744 * [en]Submit automatically when enter is pressed. Default is `true`.[/en]
6745 * [ja]Enterが押された際にそのformをsubmitするかどうかを指定します。デフォルトはtrueです。[/ja]
6746 * @description
6747 * [en]
6748 * Display a dialog with a prompt to ask the user a question. Extends `alert()` parameters.
6749 *
6750 * It can be called in the following ways:
6751 *
6752 * ```
6753 * ons.notification.prompt(message, options);
6754 * ons.notification.prompt(options);
6755 * ```
6756 *
6757 * Must specify either `message` or `messageHTML`.
6758 * [/en]
6759 * [ja]
6760 * ユーザーに入力を促すダイアログを表示します。
6761 * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
6762 * [/ja]
6763 */
6764 notification.prompt = function (message, options) {
6765 return notification._createAlertDialog(message, options, {
6766 buttonLabels: ['OK'],
6767 title: 'Alert',
6768 isPrompt: true,
6769 autofocus: true,
6770 submitOnEnter: true
6771 });
6772 };
6773
6774 /**
6775 * @method toast
6776 * @signature toast(message [, options] | options)
6777 * @return {Promise}
6778 * [en]Will resolve when the toast is hidden.[/en]
6779 * [ja][/ja]
6780 * @param {String} message
6781 * [en]Toast message. This argument is optional but if it's not defined then `options.message` must be defined instead.[/en]
6782 * [ja][/ja]
6783 * @param {Object} options
6784 * [en]Parameter object.[/en]
6785 * [ja]オプションを指定するオブジェクトです。[/ja]
6786 * @param {String} [options.message]
6787 * [en]Notification message.[/en]
6788 * [ja]トーストに表示する文字列を指定します。[/ja]
6789 * @param {String} [options.buttonLabel]
6790 * [en]Label for the button.[/en]
6791 * [ja]確認ボタンのラベルを指定します。[/ja]
6792 * @param {String} [options.animation]
6793 * [en]Animation name. Available animations are `none`, `fade`, `ascend`, `lift` and `fall`. Default is `ascend` for Android and `lift` for iOS.[/en]
6794 * [ja]トーストを表示する際のアニメーション名を指定します。"none", "fade", "ascend", "lift", "fall"のいずれかを指定できます。[/ja]
6795 * @param {Number} [options.timeout]
6796 * [en]Number of miliseconds where the toast is visible before hiding automatically.[/en]
6797 * [ja][/ja]
6798 * @param {Boolean} [options.force]
6799 * [en]If `true`, the toast skips the notification queue and is shown immediately. Defaults to `false`.[/en]
6800 * [ja][/ja]
6801 * @param {String} [options.id]
6802 * [en]The `<ons-toast>` element's ID.[/en]
6803 * [ja]ons-toast要素のID。[/ja]
6804 * @param {String} [options.class]
6805 * [en]The `<ons-toast>` element's class.[/en]
6806 * [ja]ons-toast要素のclass。[/ja]
6807 * @param {String} [options.modifier]
6808 * [en]Modifier for the element.[/en]
6809 * [ja]トーストのmodifier属性の値を指定します。[/ja]
6810 * @param {Function} [options.callback]
6811 * [en]Function that executes after toast has been hidden.[/en]
6812 * [ja]トーストが閉じられた時に呼び出される関数オブジェクトを指定します。[/ja]
6813 * @description
6814 * [en]
6815 * Display a simple notification toast with an optional button that can be used for simple actions.
6816 *
6817 * It can be called in the following ways:
6818 *
6819 * ```
6820 * ons.notification.toast(message, options);
6821 * ons.notification.toast(options);
6822 * ```
6823 * [/en]
6824 * [ja][/ja]
6825 */
6826 notification.toast = function (message, options) {
6827 var promise = new Promise(function (resolve) {
6828 util$4.checkMissingImport('Toast'); // Throws error, must be inside promise
6829
6830 options = _normalizeArguments(message, options, {
6831 timeout: 0,
6832 force: false
6833 });
6834 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 "));
6835 _setAttributes(toast, options);
6836 var originalHide = toast.hide.bind(toast);
6837 var finish = function finish(value) {
6838 if (toast) {
6839 originalHide().then(function () {
6840 if (toast) {
6841 toast.remove();
6842 toast = null;
6843 options.callback(value);
6844 resolve(value);
6845 }
6846 });
6847 }
6848 };
6849 if (options.buttonLabels) {
6850 util$4.findChild(toast._toast, 'button').onclick = function () {
6851 return finish(0);
6852 };
6853 }
6854
6855 // overwrite so that ons.notification.hide resolves when toast.hide is called
6856 toast.hide = function () {
6857 return finish(-1);
6858 };
6859 document.body.appendChild(toast);
6860 options.compile(toast);
6861 var show = function show() {
6862 toast.parentElement && toast.show(options).then(function () {
6863 if (options.timeout) {
6864 setTimeout(function () {
6865 return finish(-1);
6866 }, options.timeout);
6867 }
6868 });
6869 };
6870 setImmediate(function () {
6871 return options.force ? show() : ToastQueue$1.add(show, promise);
6872 });
6873 });
6874 return promise;
6875 };
6876
6877 // Validate parameters
6878 var checkOptions = function checkOptions(options) {
6879 var err = function err(prop) {
6880 var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Function';
6881 return util$4.throw("\"options.".concat(prop, "\" must be an instance of ").concat(type));
6882 };
6883 var hasOwnProperty = function hasOwnProperty(prop) {
6884 return Object.hasOwnProperty.call(options, prop);
6885 };
6886 var instanceOf = function instanceOf(prop) {
6887 var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Function;
6888 return options[prop] instanceof type;
6889 };
6890 var b = 'buttons',
6891 cb = 'callback',
6892 c = 'compile',
6893 d = 'destroy';
6894 (!hasOwnProperty(b) || !instanceOf(b, Array)) && err(b, 'Array');
6895 hasOwnProperty(cb) && !instanceOf(cb) && err(cb);
6896 hasOwnProperty(c) && !instanceOf(c) && err(c);
6897 hasOwnProperty(d) && !instanceOf(d) && err(d);
6898 };
6899
6900 // Action Sheet
6901 var actionSheet = (function () {
6902 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
6903 return new Promise(function (resolve) {
6904 util$4.checkMissingImport('ActionSheet');
6905 checkOptions(options);
6906
6907 // Main component
6908 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 "));
6909
6910 // Resolve action and clean up
6911 var finish = function finish(event) {
6912 var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
6913 if (actionSheet) {
6914 options.destroy && options.destroy(actionSheet);
6915 actionSheet.removeEventListener('dialogcancel', finish, false);
6916 actionSheet.remove();
6917 actionSheet = null;
6918 options.callback && options.callback(index);
6919 resolve(index);
6920 }
6921 };
6922
6923 // Link cancel handler
6924 actionSheet.addEventListener('dialogcancel', finish, false);
6925
6926 // Create buttons and link action handler
6927 var buttons = document.createDocumentFragment();
6928 options.buttons.forEach(function (item, index) {
6929 var buttonOptions = typeof item === 'string' ? {
6930 label: item
6931 } : _objectSpread2({}, item);
6932 if (options.destructive === index) {
6933 buttonOptions.modifier = (buttonOptions.modifier || '') + ' destructive';
6934 }
6935 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 "));
6936 button.onclick = function (event) {
6937 return actionSheet.hide().then(function () {
6938 return finish(event, index);
6939 });
6940 };
6941 buttons.appendChild(button);
6942 });
6943
6944 // Finish component and attach
6945 util$4.findChild(actionSheet, '.action-sheet').appendChild(buttons);
6946 document.body.appendChild(actionSheet);
6947 options.compile && options.compile(el.dialog);
6948
6949 // Show
6950 setImmediate(function () {
6951 return actionSheet.show({
6952 animation: options.animation,
6953 animationOptions: options.animationOptions
6954 });
6955 });
6956 });
6957 });
6958
6959 /*
6960 Copyright 2013-2015 ASIAL CORPORATION
6961
6962 Licensed under the Apache License, Version 2.0 (the "License");
6963 you may not use this file except in compliance with the License.
6964 You may obtain a copy of the License at
6965
6966 http://www.apache.org/licenses/LICENSE-2.0
6967
6968 Unless required by applicable law or agreed to in writing, software
6969 distributed under the License is distributed on an "AS IS" BASIS,
6970 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6971 See the License for the specific language governing permissions and
6972 limitations under the License.
6973
6974 */
6975 var create = function create() {
6976 /**
6977 * @object ons.orientation
6978 * @category util
6979 * @description
6980 * [en]Utility methods for orientation detection.[/en]
6981 * [ja]画面のオリエンテーション検知のためのユーティリティメソッドを収めているオブジェクトです。[/ja]
6982 */
6983 var obj = {
6984 /**
6985 * @event change
6986 * @description
6987 * [en]Fired when the device orientation changes.[/en]
6988 * [ja]デバイスのオリエンテーションが変化した際に発火します。[/ja]
6989 * @param {Object} event
6990 * [en]Event object.[/en]
6991 * [ja]イベントオブジェクトです。[/ja]
6992 * @param {Boolean} event.isPortrait
6993 * [en]Will be true if the current orientation is portrait mode.[/en]
6994 * [ja]現在のオリエンテーションがportraitの場合にtrueを返します。[/ja]
6995 */
6996
6997 /**
6998 * @method on
6999 * @signature on(eventName, listener)
7000 * @description
7001 * [en]Add an event listener.[/en]
7002 * [ja]イベントリスナーを追加します。[/ja]
7003 * @param {String} eventName
7004 * [en]Name of the event.[/en]
7005 * [ja]イベント名を指定します。[/ja]
7006 * @param {Function} listener
7007 * [en]Function to execute when the event is triggered.[/en]
7008 * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
7009 */
7010
7011 /**
7012 * @method once
7013 * @signature once(eventName, listener)
7014 * @description
7015 * [en]Add an event listener that's only triggered once.[/en]
7016 * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
7017 * @param {String} eventName
7018 * [en]Name of the event.[/en]
7019 * [ja]イベント名を指定します。[/ja]
7020 * @param {Function} listener
7021 * [en]Function to execute when the event is triggered.[/en]
7022 * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
7023 */
7024
7025 /**
7026 * @method off
7027 * @signature off(eventName, [listener])
7028 * @description
7029 * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
7030 * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
7031 * @param {String} eventName
7032 * [en]Name of the event.[/en]
7033 * [ja]イベント名を指定します。[/ja]
7034 * @param {Function} listener
7035 * [en]Function to execute when the event is triggered.[/en]
7036 * [ja]削除するイベントリスナーを指定します。[/ja]
7037 */
7038
7039 // actual implementation to detect if whether current screen is portrait or not
7040 _isPortrait: false,
7041 /**
7042 * @method isPortrait
7043 * @signature isPortrait()
7044 * @return {Boolean}
7045 * [en]Will be true if the current orientation is portrait mode.[/en]
7046 * [ja]オリエンテーションがportraitモードの場合にtrueになります。[/ja]
7047 * @description
7048 * [en]Returns whether the current screen orientation is portrait or not.[/en]
7049 * [ja]オリエンテーションがportraitモードかどうかを返します。[/ja]
7050 */
7051 isPortrait: function isPortrait() {
7052 return this._isPortrait();
7053 },
7054 /**
7055 * @method isLandscape
7056 * @signature isLandscape()
7057 * @return {Boolean}
7058 * [en]Will be true if the current orientation is landscape mode.[/en]
7059 * [ja]オリエンテーションがlandscapeモードの場合にtrueになります。[/ja]
7060 * @description
7061 * [en]Returns whether the current screen orientation is landscape or not.[/en]
7062 * [ja]オリエンテーションがlandscapeモードかどうかを返します。[/ja]
7063 */
7064 isLandscape: function isLandscape() {
7065 return !this.isPortrait();
7066 },
7067 _init: function _init() {
7068 document.addEventListener('DOMContentLoaded', this._onDOMContentLoaded.bind(this), false);
7069 if ('orientation' in window) {
7070 window.addEventListener('orientationchange', this._onOrientationChange.bind(this), false);
7071 } else {
7072 window.addEventListener('resize', this._onResize.bind(this), false);
7073 }
7074 this._isPortrait = function () {
7075 return window.innerHeight > window.innerWidth;
7076 };
7077 return this;
7078 },
7079 _onDOMContentLoaded: function _onDOMContentLoaded() {
7080 this._installIsPortraitImplementation();
7081 this.emit('change', {
7082 isPortrait: this.isPortrait()
7083 });
7084 },
7085 _installIsPortraitImplementation: function _installIsPortraitImplementation() {
7086 var isPortrait = window.innerWidth < window.innerHeight;
7087 if (!('orientation' in window)) {
7088 this._isPortrait = function () {
7089 return window.innerHeight > window.innerWidth;
7090 };
7091 } else if (window.orientation % 180 === 0) {
7092 this._isPortrait = function () {
7093 return Math.abs(window.orientation % 180) === 0 ? isPortrait : !isPortrait;
7094 };
7095 } else {
7096 this._isPortrait = function () {
7097 return Math.abs(window.orientation % 180) === 90 ? isPortrait : !isPortrait;
7098 };
7099 }
7100 },
7101 _onOrientationChange: function _onOrientationChange() {
7102 var _this = this;
7103 var isPortrait = this._isPortrait();
7104
7105 // Wait for the dimensions to change because
7106 // of Android inconsistency.
7107 var nIter = 0;
7108 var interval = setInterval(function () {
7109 nIter++;
7110 var w = window.innerWidth;
7111 var h = window.innerHeight;
7112 if (isPortrait && w <= h || !isPortrait && w >= h) {
7113 _this.emit('change', {
7114 isPortrait: isPortrait
7115 });
7116 clearInterval(interval);
7117 } else if (nIter === 50) {
7118 _this.emit('change', {
7119 isPortrait: isPortrait
7120 });
7121 clearInterval(interval);
7122 }
7123 }, 20);
7124 },
7125 // Run on not mobile browser.
7126 _onResize: function _onResize() {
7127 this.emit('change', {
7128 isPortrait: this.isPortrait()
7129 });
7130 }
7131 };
7132 MicroEvent.mixin(obj);
7133 return obj;
7134 };
7135 var orientation = create()._init();
7136
7137 /*
7138 Copyright 2013-2015 ASIAL CORPORATION
7139
7140 Licensed under the Apache License, Version 2.0 (the "License");
7141 you may not use this file except in compliance with the License.
7142 You may obtain a copy of the License at
7143
7144 http://www.apache.org/licenses/LICENSE-2.0
7145
7146 Unless required by applicable law or agreed to in writing, software
7147 distributed under the License is distributed on an "AS IS" BASIS,
7148 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7149 See the License for the specific language governing permissions and
7150 limitations under the License.
7151
7152 */
7153
7154 /**
7155 * @object ons.modifier
7156 * @category visual
7157 * @description
7158 * [en]
7159 * Utility methods to change modifier attributes of Onsen UI elements..
7160 * [/en]
7161 * [ja][/ja]
7162 * @example
7163 * ons.modifier.add(myOnsInputElement, 'underbar');
7164 * ons.modifier.toggle(myOnsToastElement, 'custom-modifier');
7165 *
7166 */
7167 var modifier = {
7168 /**
7169 * @method add
7170 * @signature add(element, modifier [, modifier])
7171 * @description
7172 * [en]Add the specified modifiers to the element if they are not already included.[/en]
7173 * [ja][/ja]
7174 * @param {HTMLElement} element
7175 * [en]Target element.[/en]
7176 * [ja][/ja]
7177 * @param {String} modifier
7178 * [en]Name of the modifier.[/en]
7179 * [ja][/ja]
7180 */
7181 add: function add(element) {
7182 for (var _len = arguments.length, modifiers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
7183 modifiers[_key - 1] = arguments[_key];
7184 }
7185 return modifiers.forEach(function (modifier) {
7186 return util$4.addModifier(element, modifier);
7187 });
7188 },
7189 /**
7190 * @method remove
7191 * @signature remove(element, modifier [, modifier])
7192 * @description
7193 * [en]Remove the specified modifiers from the element if they are included.[/en]
7194 * [ja][/ja]
7195 * @param {HTMLElement} element
7196 * [en]Target element.[/en]
7197 * [ja][/ja]
7198 * @param {String} modifier
7199 * [en]Name of the modifier.[/en]
7200 * [ja][/ja]
7201 */
7202 remove: function remove(element) {
7203 for (var _len2 = arguments.length, modifiers = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
7204 modifiers[_key2 - 1] = arguments[_key2];
7205 }
7206 return modifiers.forEach(function (modifier) {
7207 return util$4.removeModifier(element, modifier);
7208 });
7209 },
7210 /**
7211 * @method contains
7212 * @signature contains(element, modifier)
7213 * @description
7214 * [en]Check whether the specified modifier is included in the element.[/en]
7215 * [ja][/ja]
7216 * @param {HTMLElement} element
7217 * [en]Target element.[/en]
7218 * [ja][/ja]
7219 * @param {String} modifier
7220 * [en]Name of the modifier.[/en]
7221 * [ja][/ja]
7222 * @return {Boolean}
7223 * [en]`true` when the specified modifier is found in the element's `modifier` attribute. `false` otherwise.[/en]
7224 * [ja][/ja]
7225 */
7226 contains: util$4.hasModifier,
7227 /**
7228 * @method toggle
7229 * @signature toggle(element, modifier [, force])
7230 * @description
7231 * [en]Toggle the specified modifier.[/en]
7232 * [ja][/ja]
7233 * @param {HTMLElement} element
7234 * [en]Target element.[/en]
7235 * [ja][/ja]
7236 * @param {String} modifier
7237 * [en]Name of the modifier.[/en]
7238 * [ja][/ja]
7239 * @param {String} force
7240 * [en]If it evaluates to true, add specified modifier value, and if it evaluates to false, remove it.[/en]
7241 * [ja][/ja]
7242 */
7243 toggle: util$4.toggleModifier
7244 };
7245
7246 /*
7247 Copyright 2013-2015 ASIAL CORPORATION
7248
7249 Licensed under the Apache License, Version 2.0 (the "License");
7250 you may not use this file except in compliance with the License.
7251 You may obtain a copy of the License at
7252
7253 http://www.apache.org/licenses/LICENSE-2.0
7254
7255 Unless required by applicable law or agreed to in writing, software
7256 distributed under the License is distributed on an "AS IS" BASIS,
7257 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7258 See the License for the specific language governing permissions and
7259 limitations under the License.
7260
7261 */
7262 var softwareKeyboard = new MicroEvent();
7263 softwareKeyboard._visible = false;
7264 var onShow = function onShow() {
7265 softwareKeyboard._visible = true;
7266 softwareKeyboard.emit('show');
7267 };
7268 var onHide = function onHide() {
7269 softwareKeyboard._visible = false;
7270 softwareKeyboard.emit('hide');
7271 };
7272 var bindEvents = function bindEvents() {
7273 if (typeof Keyboard !== 'undefined') {
7274 // https://github.com/martinmose/cordova-keyboard/blob/95f3da3a38d8f8e1fa41fbf40145352c13535a00/README.md
7275 Keyboard.onshow = onShow;
7276 Keyboard.onhide = onHide;
7277 softwareKeyboard.emit('init', {
7278 visible: Keyboard.isVisible
7279 });
7280 return true;
7281 } else if (typeof cordova.plugins !== 'undefined' && typeof cordova.plugins.Keyboard !== 'undefined') {
7282 // https://github.com/driftyco/ionic-plugins-keyboard/blob/ca27ecf/README.md
7283 window.addEventListener('native.keyboardshow', onShow);
7284 window.addEventListener('native.keyboardhide', onHide);
7285 softwareKeyboard.emit('init', {
7286 visible: cordova.plugins.Keyboard.isVisible
7287 });
7288 return true;
7289 }
7290 return false;
7291 };
7292 var noPluginError = function noPluginError() {
7293 util$4.warn('ons-keyboard: Cordova Keyboard plugin is not present.');
7294 };
7295 document.addEventListener('deviceready', function () {
7296 if (!bindEvents()) {
7297 if (document.querySelector('[ons-keyboard-active]') || document.querySelector('[ons-keyboard-inactive]')) {
7298 noPluginError();
7299 }
7300 softwareKeyboard.on = noPluginError;
7301 }
7302 });
7303
7304 /*
7305 Copyright 2013-2015 ASIAL CORPORATION
7306
7307 Licensed under the Apache License, Version 2.0 (the "License");
7308 you may not use this file except in compliance with the License.
7309 You may obtain a copy of the License at
7310
7311 http://www.apache.org/licenses/LICENSE-2.0
7312
7313 Unless required by applicable law or agreed to in writing, software
7314 distributed under the License is distributed on an "AS IS" BASIS,
7315 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7316 See the License for the specific language governing permissions and
7317 limitations under the License.
7318
7319 */
7320
7321 var generateId$1 = function () {
7322 var i = 0;
7323 return function () {
7324 return i++;
7325 };
7326 }();
7327
7328 /**
7329 * Door locking system.
7330 *
7331 * @param {Object} [options]
7332 * @param {Function} [options.log]
7333 */
7334 var DoorLock = /*#__PURE__*/function () {
7335 function DoorLock() {
7336 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
7337 _classCallCheck(this, DoorLock);
7338 this._lockList = [];
7339 this._waitList = [];
7340 this._log = options.log || function () {};
7341 }
7342
7343 /**
7344 * Register a lock.
7345 *
7346 * @return {Function} Callback for unlocking.
7347 */
7348 _createClass(DoorLock, [{
7349 key: "lock",
7350 value: function lock() {
7351 var _this = this;
7352 var unlock = function unlock() {
7353 _this._unlock(unlock);
7354 };
7355 unlock.id = generateId$1();
7356 this._lockList.push(unlock);
7357 this._log('lock: ' + unlock.id);
7358 return unlock;
7359 }
7360 }, {
7361 key: "_unlock",
7362 value: function _unlock(fn) {
7363 var index = this._lockList.indexOf(fn);
7364 if (index === -1) {
7365 throw new Error('This function is not registered in the lock list.');
7366 }
7367 this._lockList.splice(index, 1);
7368 this._log('unlock: ' + fn.id);
7369 this._tryToFreeWaitList();
7370 }
7371 }, {
7372 key: "_tryToFreeWaitList",
7373 value: function _tryToFreeWaitList() {
7374 while (!this.isLocked() && this._waitList.length > 0) {
7375 this._waitList.shift()();
7376 }
7377 }
7378
7379 /**
7380 * Register a callback for waiting unlocked door.
7381 *
7382 * @params {Function} callback Callback on unlocking the door completely.
7383 */
7384 }, {
7385 key: "waitUnlock",
7386 value: function waitUnlock(callback) {
7387 if (!(callback instanceof Function)) {
7388 throw new Error('The callback param must be a function.');
7389 }
7390 if (this.isLocked()) {
7391 this._waitList.push(callback);
7392 } else {
7393 callback();
7394 }
7395 }
7396
7397 /**
7398 * @return {Boolean}
7399 */
7400 }, {
7401 key: "isLocked",
7402 value: function isLocked() {
7403 return this._lockList.length > 0;
7404 }
7405 }]);
7406 return DoorLock;
7407 }();
7408
7409 // Default implementation for global PageLoader.
7410 function loadPage(_ref, done, error) {
7411 var page = _ref.page,
7412 parent = _ref.parent;
7413 _ref.params;
7414 internal$1.getPageHTMLAsync(page).then(function (html) {
7415 var pageElement = util$4.createElement(html);
7416 parent.appendChild(pageElement);
7417 done(pageElement);
7418 }).catch(function (e) {
7419 return error(e);
7420 });
7421 }
7422 function unloadPage(element) {
7423 if (element._destroy instanceof Function) {
7424 element._destroy();
7425 } else {
7426 element.remove();
7427 }
7428 }
7429 var PageLoader = /*#__PURE__*/function () {
7430 /**
7431 * @param {Function} [fn] Returns an object that has "element" property and "unload" function.
7432 */
7433 function PageLoader(loader, unloader) {
7434 _classCallCheck(this, PageLoader);
7435 this._loader = loader instanceof Function ? loader : loadPage;
7436 this._unloader = unloader instanceof Function ? unloader : unloadPage;
7437 }
7438
7439 /**
7440 * Set internal loader implementation.
7441 */
7442 _createClass(PageLoader, [{
7443 key: "internalLoader",
7444 get: function get() {
7445 return this._loader;
7446 }
7447
7448 /**
7449 * @param {any} options.page
7450 * @param {Element} options.parent A location to load page.
7451 * @param {Object} [options.params] Extra parameters for ons-page.
7452 * @param {Function} done Take an object that has "element" property and "unload" function.
7453 * @param {Function} error Function called when there is an error.
7454 */,
7455 set: function set(fn) {
7456 if (!(fn instanceof Function)) {
7457 throw Error('First parameter must be an instance of Function');
7458 }
7459 this._loader = fn;
7460 }
7461 }, {
7462 key: "load",
7463 value: function load(_ref2, done, error) {
7464 var page = _ref2.page,
7465 parent = _ref2.parent,
7466 _ref2$params = _ref2.params,
7467 params = _ref2$params === void 0 ? {} : _ref2$params;
7468 this._loader({
7469 page: page,
7470 parent: parent,
7471 params: params
7472 }, function (pageElement) {
7473 if (!(pageElement instanceof Element)) {
7474 throw Error('pageElement must be an instance of Element.');
7475 }
7476 done(pageElement);
7477 }, error);
7478 }
7479 }, {
7480 key: "unload",
7481 value: function unload(pageElement) {
7482 if (!(pageElement instanceof Element)) {
7483 throw Error('pageElement must be an instance of Element.');
7484 }
7485 this._unloader(pageElement);
7486 }
7487 }]);
7488 return PageLoader;
7489 }();
7490 var defaultPageLoader = new PageLoader();
7491 var instantPageLoader = new PageLoader(function (_ref3, done) {
7492 var page = _ref3.page,
7493 parent = _ref3.parent;
7494 _ref3.params;
7495 var element = util$4.createElement(page.trim());
7496 parent.appendChild(element);
7497 done(element);
7498 }, unloadPage);
7499
7500 /**
7501 * @object ons
7502 * @category util
7503 * @description
7504 * [ja]Onsen UIで利用できるグローバルなオブジェクトです。[/ja]
7505 * [en]A global object that's used in Onsen UI. [/en]
7506 */
7507 var ons = {
7508 animit: Animit,
7509 defaultPageLoader: defaultPageLoader,
7510 elements: onsElements,
7511 GestureDetector: GestureDetector,
7512 modifier: modifier,
7513 notification: notification,
7514 orientation: orientation,
7515 pageAttributeExpression: pageAttributeExpression,
7516 PageLoader: PageLoader,
7517 platform: platform,
7518 softwareKeyboard: softwareKeyboard,
7519 _autoStyle: autoStyle,
7520 _internal: internal$1,
7521 _readyLock: new DoorLock(),
7522 _util: util$4
7523 };
7524 ons.platform.select((window.location.search.match(/platform=([\w-]+)/) || [])[1]);
7525 waitDeviceReady();
7526 var readyError = function readyError(after) {
7527 return util$4.throw("This method must be called ".concat(after ? 'after' : 'before', " ons.isReady() is true"));
7528 };
7529
7530 /**
7531 * @method isReady
7532 * @signature isReady()
7533 * @return {Boolean}
7534 * [en]Will be true if Onsen UI is initialized.[/en]
7535 * [ja]初期化されているかどうかを返します。[/ja]
7536 * @description
7537 * [en]Returns true if Onsen UI is initialized.[/en]
7538 * [ja]Onsen UIがすでに初期化されているかどうかを返すメソッドです。[/ja]
7539 */
7540 ons.isReady = function () {
7541 return !ons._readyLock.isLocked();
7542 };
7543
7544 /**
7545 * @method isWebView
7546 * @signature isWebView()
7547 * @return {Boolean}
7548 * [en]Will be true if the app is running in Cordova.[/en]
7549 * [ja]Cordovaで実行されている場合にtrueになります。[/ja]
7550 * @description
7551 * [en]Returns true if running inside Cordova.[/en]
7552 * [ja]Cordovaで実行されているかどうかを返すメソッドです。[/ja]
7553 */
7554 ons.isWebView = ons.platform.isWebView;
7555
7556 /**
7557 * @method ready
7558 * @signature ready(callback)
7559 * @description
7560 * [ja]アプリの初期化に利用するメソッドです。渡された関数は、Onsen UIの初期化が終了している時点で必ず呼ばれます。[/ja]
7561 * [en]Method used to wait for app initialization. Waits for `DOMContentLoaded` and `deviceready`, when necessary, before executing the callback.[/en]
7562 * @param {Function} callback
7563 * [en]Function that executes after Onsen UI has been initialized.[/en]
7564 * [ja]Onsen UIが初期化が完了した後に呼び出される関数オブジェクトを指定します。[/ja]
7565 */
7566 ons.ready = function (callback) {
7567 if (ons.isReady()) {
7568 callback();
7569 } else {
7570 ons._readyLock.waitUnlock(callback);
7571 }
7572 };
7573
7574 /**
7575 * @method setDefaultDeviceBackButtonListener
7576 * @signature setDefaultDeviceBackButtonListener(listener)
7577 * @param {Function} listener
7578 * [en]Function that executes when device back button is pressed. Must be called on `ons.ready`.[/en]
7579 * [ja]デバイスのバックボタンが押された時に実行される関数オブジェクトを指定します。[/ja]
7580 * @description
7581 * [en]Set default handler for device back button.[/en]
7582 * [ja]デバイスのバックボタンのためのデフォルトのハンドラを設定します。[/ja]
7583 */
7584 ons.setDefaultDeviceBackButtonListener = function (listener) {
7585 if (!ons.isReady()) {
7586 readyError(true);
7587 }
7588 ons._defaultDeviceBackButtonHandler.setListener(listener);
7589 };
7590
7591 /**
7592 * @method disableDeviceBackButtonHandler
7593 * @signature disableDeviceBackButtonHandler()
7594 * @description
7595 * [en]Disable device back button event handler. Must be called on `ons.ready`.[/en]
7596 * [ja]デバイスのバックボタンのイベントを受け付けないようにします。[/ja]
7597 */
7598 ons.disableDeviceBackButtonHandler = function () {
7599 if (!ons.isReady()) {
7600 readyError(true);
7601 }
7602 internal$1.dbbDispatcher.disable();
7603 };
7604
7605 /**
7606 * @method enableDeviceBackButtonHandler
7607 * @signature enableDeviceBackButtonHandler()
7608 * @description
7609 * [en]Enable device back button event handler. Must be called on `ons.ready`.[/en]
7610 * [ja]デバイスのバックボタンのイベントを受け付けるようにします。[/ja]
7611 */
7612 ons.enableDeviceBackButtonHandler = function () {
7613 if (!ons.isReady()) {
7614 readyError(true);
7615 }
7616 internal$1.dbbDispatcher.enable();
7617 };
7618 ons.fireDeviceBackButtonEvent = function () {
7619 internal$1.dbbDispatcher.fireDeviceBackButtonEvent();
7620 };
7621
7622 /**
7623 * @method enableAutoStatusBarFill
7624 * @signature enableAutoStatusBarFill()
7625 * @description
7626 * [en]Enable status bar fill feature on iOS7 and above (except for iPhone X). Must be called before `ons.ready`.[/en]
7627 * [ja]iOS7以上(iPhone Xは除く)で、ステータスバー部分の高さを自動的に埋める処理を有効にします。[/ja]
7628 */
7629 ons.enableAutoStatusBarFill = function () {
7630 if (ons.isReady()) {
7631 readyError(false);
7632 }
7633 internal$1.config.autoStatusBarFill = true;
7634 };
7635
7636 /**
7637 * @method disableAutoStatusBarFill
7638 * @signature disableAutoStatusBarFill()
7639 * @description
7640 * [en]Disable status bar fill feature on iOS7 and above (except for iPhone X). Must be called before `ons.ready`.[/en]
7641 * [ja]iOS7以上(iPhone Xは除く)で、ステータスバー部分の高さを自動的に埋める処理を無効にします。[/ja]
7642 */
7643 ons.disableAutoStatusBarFill = function () {
7644 if (ons.isReady()) {
7645 readyError(false);
7646 }
7647 internal$1.config.autoStatusBarFill = false;
7648 };
7649
7650 /**
7651 * @method mockStatusBar
7652 * @signature mockStatusBar()
7653 * @description
7654 * [en]Creates a static element similar to iOS status bar. Only useful for browser testing. Must be called before `ons.ready`.[/en]
7655 * [ja][/ja]
7656 */
7657 ons.mockStatusBar = function () {
7658 if (ons.isReady()) {
7659 readyError(false);
7660 }
7661 var mock = function mock() {
7662 if (!document.body.children[0] || !document.body.children[0].classList.contains('ons-status-bar-mock')) {
7663 var android = platform.isAndroid(),
7664 i = function i(_i) {
7665 return "<i class=\"".concat(_i.split('-')[0], " ").concat(_i, "\"></i>");
7666 };
7667 var left = android ? "".concat(i('zmdi-twitter'), " ").concat(i('zmdi-google-play')) : "No SIM ".concat(i('fa-wifi')),
7668 center = android ? '' : '12:28 PM',
7669 right = android ? "".concat(i('zmdi-network'), " ").concat(i('zmdi-wifi'), " ").concat(i('zmdi-battery'), " 12:28 PM") : "80% ".concat(i('fa-battery-three-quarters'));
7670 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);
7671 }
7672 };
7673 document.body ? mock() : internal$1.waitDOMContentLoaded(mock);
7674 };
7675
7676 /**
7677 * @method disableAnimations
7678 * @signature disableAnimations()
7679 * @description
7680 * [en]Disable all animations. Could be handy for testing and older devices.[/en]
7681 * [ja]アニメーションを全て無効にします。テストの際に便利です。[/ja]
7682 */
7683 ons.disableAnimations = function () {
7684 internal$1.config.animationsDisabled = true;
7685 };
7686
7687 /**
7688 * @method enableAnimations
7689 * @signature enableAnimations()
7690 * @description
7691 * [en]Enable animations (default).[/en]
7692 * [ja]アニメーションを有効にします。[/ja]
7693 */
7694 ons.enableAnimations = function () {
7695 internal$1.config.animationsDisabled = false;
7696 };
7697 ons._disableWarnings = function () {
7698 internal$1.config.warningsDisabled = true;
7699 };
7700 ons._enableWarnings = function () {
7701 internal$1.config.warningsDisabled = false;
7702 };
7703
7704 /**
7705 * @method disableAutoStyling
7706 * @signature disableAutoStyling()
7707 * @description
7708 * [en]Disable automatic styling.[/en]
7709 * [ja][/ja]
7710 */
7711 ons.disableAutoStyling = autoStyle.disable;
7712
7713 /**
7714 * @method enableAutoStyling
7715 * @signature enableAutoStyling()
7716 * @description
7717 * [en]Enable automatic styling based on OS (default).[/en]
7718 * [ja][/ja]
7719 */
7720 ons.enableAutoStyling = autoStyle.enable;
7721
7722 /**
7723 * @method disableIconAutoPrefix
7724 * @signature disableIconAutoPrefix()
7725 * @description
7726 * [en]Disable adding `fa-` prefix automatically to `ons-icon` classes. Useful when including custom icon packs.[/en]
7727 * [ja][/ja]
7728 */
7729 ons.disableIconAutoPrefix = function () {
7730 util$4.checkMissingImport('Icon');
7731 onsElements.Icon.setAutoPrefix(false);
7732 };
7733
7734 /**
7735 * @method forcePlatformStyling
7736 * @signature forcePlatformStyling(platform)
7737 * @description
7738 * [en]Refresh styling for the given platform. Only useful for demos. Use `ons.platform.select(...)` instead for development and production.[/en]
7739 * [ja][/ja]
7740 * @param {string} platform New platform to style the elements.
7741 */
7742 ons.forcePlatformStyling = function (newPlatform) {
7743 ons.enableAutoStyling();
7744 ons.platform.select(newPlatform || 'ios');
7745 ons._util.arrayFrom(document.querySelectorAll('*')).forEach(function (element) {
7746 if (element.tagName.toLowerCase() === 'ons-if') {
7747 element._platformUpdate();
7748 } else if (element.tagName.match(/^ons-/i)) {
7749 autoStyle.prepare(element, true);
7750 if (element.tagName.toLowerCase() === 'ons-tabbar') {
7751 element._updatePosition();
7752 }
7753 }
7754 });
7755 };
7756
7757 /**
7758 * @method preload
7759 * @signature preload(templatePaths)
7760 * @param {String|Array} templatePaths
7761 * [en]Set of HTML file paths containing 'ons-page' elements.[/en]
7762 * [ja][/ja]
7763 * @return {Promise}
7764 * [en]Promise that resolves when all the templates are cached.[/en]
7765 * [ja][/ja]
7766 * @description
7767 * [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]
7768 * [ja][/ja]
7769 */
7770 ons.preload = function () {
7771 var templates = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
7772 return Promise.all((templates instanceof Array ? templates : [templates]).map(function (template) {
7773 if (typeof template !== 'string') {
7774 util$4.throw('Expected string arguments but got ' + _typeof(template));
7775 }
7776 return internal$1.getTemplateHTMLAsync(template);
7777 }));
7778 };
7779
7780 /**
7781 * @method createElement
7782 * @signature createElement(template, options)
7783 * @param {String} template
7784 * [en]Either an HTML file path, a `<template>` id or an HTML string such as `'<div id="foo">hoge</div>'`.[/en]
7785 * [ja][/ja]
7786 * @param {Object} [options]
7787 * [en]Parameter object.[/en]
7788 * [ja]オプションを指定するオブジェクト。[/ja]
7789 * @param {Boolean|HTMLElement} [options.append]
7790 * [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]
7791 * [ja][/ja]
7792 * @param {HTMLElement} [options.insertBefore]
7793 * [en]Reference node that becomes the next sibling of the new node (`options.append` element).[/en]
7794 * [ja][/ja]
7795 * @return {HTMLElement|Promise}
7796 * [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]
7797 * [ja][/ja]
7798 * @description
7799 * [en]Create a new element from a template. Both inline HTML and external files are supported although the return value differs.[/en]
7800 * [ja][/ja]
7801 */
7802 ons.createElement = function (template) {
7803 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7804 template = template.trim();
7805 var create = function create(html) {
7806 var element = ons._util.createElement(html);
7807 element.remove();
7808 if (options.append) {
7809 var target = options.append instanceof HTMLElement ? options.append : document.body;
7810 target.insertBefore(element, options.insertBefore || null);
7811 options.link instanceof Function && options.link(element);
7812 }
7813 return element;
7814 };
7815 return template.charAt(0) === '<' ? create(template) : internal$1.getPageHTMLAsync(template).then(create);
7816 };
7817
7818 /**
7819 * @method createPopover
7820 * @signature createPopover(page, [options])
7821 * @param {String} page
7822 * [en]Page name. Can be either an HTML file or a <template> containing a <ons-dialog> component.[/en]
7823 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
7824 * @param {Object} [options]
7825 * [en]Parameter object.[/en]
7826 * [ja]オプションを指定するオブジェクト。[/ja]
7827 * @param {Object} [options.parentScope]
7828 * [en]Parent scope of the dialog. Used to bind models and access scope methods from the dialog.[/en]
7829 * [ja]ダイアログ内で利用する親スコープを指定します。ダイアログからモデルやスコープのメソッドにアクセスするのに使います。このパラメータはAngularJSバインディングでのみ利用できます。[/ja]
7830 * @return {Promise}
7831 * [en]Promise object that resolves to the popover component object.[/en]
7832 * [ja]ポップオーバーのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
7833 * @description
7834 * [en]Create a popover instance from a template.[/en]
7835 * [ja]テンプレートからポップオーバーのインスタンスを生成します。[/ja]
7836 */
7837 /**
7838 * @method createDialog
7839 * @signature createDialog(page, [options])
7840 * @param {String} page
7841 * [en]Page name. Can be either an HTML file or an `<template>` containing a <ons-dialog> component.[/en]
7842 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
7843 * @param {Object} [options]
7844 * [en]Parameter object.[/en]
7845 * [ja]オプションを指定するオブジェクト。[/ja]
7846 * @return {Promise}
7847 * [en]Promise object that resolves to the dialog component object.[/en]
7848 * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
7849 * @description
7850 * [en]Create a dialog instance from a template.[/en]
7851 * [ja]テンプレートからダイアログのインスタンスを生成します。[/ja]
7852 */
7853 /**
7854 * @method createAlertDialog
7855 * @signature createAlertDialog(page, [options])
7856 * @param {String} page
7857 * [en]Page name. Can be either an HTML file or an `<template>` containing a <ons-alert-dialog> component.[/en]
7858 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
7859 * @param {Object} [options]
7860 * [en]Parameter object.[/en]
7861 * [ja]オプションを指定するオブジェクト。[/ja]
7862 * @return {Promise}
7863 * [en]Promise object that resolves to the alert dialog component object.[/en]
7864 * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
7865 * @description
7866 * [en]Create a alert dialog instance from a template.[/en]
7867 * [ja]テンプレートからアラートダイアログのインスタンスを生成します。[/ja]
7868 */
7869 ons.createPopover = ons.createDialog = ons.createAlertDialog = function (template) {
7870 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7871 return ons.createElement(template, _objectSpread2({
7872 append: true
7873 }, options));
7874 };
7875
7876 /**
7877 * @method openActionSheet
7878 * @signature openActionSheet(options)
7879 * @description
7880 * [en]Shows an instant Action Sheet and lets the user choose an action.[/en]
7881 * [ja][/ja]
7882 * @param {Object} [options]
7883 * [en]Parameter object.[/en]
7884 * [ja]オプションを指定するオブジェクト。[/ja]
7885 * @param {Array} [options.buttons]
7886 * [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]
7887 * [ja][/ja]
7888 * @param {String} [options.title]
7889 * [en]Optional title for the action sheet.[/en]
7890 * [ja][/ja]
7891 * @param {Number} [options.destructive]
7892 * [en]Optional index of the "destructive" button (only for iOS). It can be specified in the button array as well.[/en]
7893 * [ja][/ja]
7894 * @param {Boolean} [options.cancelable]
7895 * [en]Whether the action sheet can be canceled by tapping on the background mask or not.[/en]
7896 * [ja][/ja]
7897 * @param {String} [options.modifier]
7898 * [en]Modifier attribute of the action sheet. E.g. `'destructive'`.[/en]
7899 * [ja][/ja]
7900 * @param {String} [options.maskColor]
7901 * [en]Optionally change the background mask color.[/en]
7902 * [ja][/ja]
7903 * @param {String} [options.id]
7904 * [en]The element's id attribute.[/en]
7905 * [ja][/ja]
7906 * @param {String} [options.class]
7907 * [en]The element's class attribute.[/en]
7908 * [ja][/ja]
7909 * @return {Promise}
7910 * [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]
7911 * [ja][/ja]
7912 */
7913 ons.openActionSheet = actionSheet;
7914
7915 /**
7916 * @method resolveLoadingPlaceholder
7917 * @signature resolveLoadingPlaceholder(page)
7918 * @param {String} page
7919 * [en]Page name. Can be either an HTML file or a `<template>` id.[/en]
7920 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
7921 * @description
7922 * [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]
7923 * [ja]ons-loading-placeholderの属性値としてページが指定されていない場合は、ページロード前に呼ばれるons.resolveLoadingPlaceholder処理が行われるまで表示されません。[/ja]
7924 */
7925 ons.resolveLoadingPlaceholder = function (page, link) {
7926 var elements = ons._util.arrayFrom(window.document.querySelectorAll('[ons-loading-placeholder]'));
7927 if (elements.length === 0) {
7928 util$4.throw('No ons-loading-placeholder exists');
7929 }
7930 elements.filter(function (element) {
7931 return !element.getAttribute('page');
7932 }).forEach(function (element) {
7933 element.setAttribute('ons-loading-placeholder', page);
7934 ons._resolveLoadingPlaceholder(element, page, link);
7935 });
7936 };
7937 ons._setupLoadingPlaceHolders = function () {
7938 ons.ready(function () {
7939 var elements = ons._util.arrayFrom(window.document.querySelectorAll('[ons-loading-placeholder]'));
7940 elements.forEach(function (element) {
7941 var page = element.getAttribute('ons-loading-placeholder');
7942 if (typeof page === 'string') {
7943 ons._resolveLoadingPlaceholder(element, page);
7944 }
7945 });
7946 });
7947 };
7948 ons._resolveLoadingPlaceholder = function (parent, page) {
7949 var link = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (el, done) {
7950 return done();
7951 };
7952 page && ons.createElement(page).then(function (element) {
7953 element.style.display = 'none';
7954 parent.appendChild(element);
7955 link(element, function () {
7956 while (parent.firstChild && parent.firstChild !== element) {
7957 parent.removeChild(parent.firstChild);
7958 }
7959 element.style.display = '';
7960 });
7961 }).catch(function (error) {
7962 return Promise.reject('Unabled to resolve placeholder: ' + error);
7963 });
7964 };
7965 function waitDeviceReady() {
7966 var unlockDeviceReady = ons._readyLock.lock();
7967 window.addEventListener('DOMContentLoaded', function () {
7968 if (ons.isWebView()) {
7969 window.document.addEventListener('deviceready', unlockDeviceReady, {
7970 once: true
7971 });
7972 } else {
7973 unlockDeviceReady();
7974 }
7975 }, {
7976 once: true
7977 });
7978 }
7979
7980 /**
7981 * @method getScriptPage
7982 * @signature getScriptPage()
7983 * @description
7984 * [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]
7985 * [ja][/ja]
7986 * @return {HTMLElement}
7987 * [en]Returns the corresponding page element.[/en]
7988 * [ja][/ja]
7989 */
7990 var getCS = 'currentScript' in document ? function () {
7991 return document.currentScript;
7992 } : function () {
7993 return document.scripts[document.scripts.length - 1];
7994 };
7995 ons.getScriptPage = function () {
7996 return getCS() && /ons-page/i.test(getCS().parentElement.tagName) && getCS().parentElement || null;
7997 };
7998
7999 /*
8000 Copyright 2013-2015 ASIAL CORPORATION
8001
8002 Licensed under the Apache License, Version 2.0 (the "License");
8003 you may not use this file except in compliance with the License.
8004 You may obtain a copy of the License at
8005
8006 http://www.apache.org/licenses/LICENSE-2.0
8007
8008 Unless required by applicable law or agreed to in writing, software
8009 distributed under the License is distributed on an "AS IS" BASIS,
8010 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8011 See the License for the specific language governing permissions and
8012 limitations under the License.
8013
8014 */
8015
8016 function getElementClass() {
8017 if (typeof HTMLElement !== 'function') {
8018 // case of Safari
8019 var _BaseElement = function _BaseElement() {};
8020 _BaseElement.prototype = document.createElement('div');
8021 return _BaseElement;
8022 } else {
8023 return HTMLElement;
8024 }
8025 }
8026 var BaseElement = /*#__PURE__*/function (_getElementClass) {
8027 _inherits(BaseElement, _getElementClass);
8028 var _super = _createSuper(BaseElement);
8029 function BaseElement() {
8030 _classCallCheck(this, BaseElement);
8031 return _super.call(this);
8032 }
8033 return _createClass(BaseElement);
8034 }(getElementClass());
8035
8036 /**
8037 * @element ons-if
8038 * @category conditional
8039 * @tutorial vanilla/Reference/if
8040 * @description
8041 * [en]
8042 * Conditionally display content depending on the platform, device orientation or both.
8043 *
8044 * 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.
8045 * [/en]
8046 * [ja][/ja]
8047 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
8048 * @example
8049 * <ons-page>
8050 * <ons-if orientation="landscape">
8051 * Landscape view!
8052 * </ons-if>
8053 * <ons-if platform="android">
8054 * This is Android.
8055 * </ons-if>
8056 * <ons-if platform="ios other">
8057 * This is not Android.
8058 * </ons-if>
8059 * </ons-page>
8060 */
8061 var IfElement = /*#__PURE__*/function (_BaseElement) {
8062 _inherits(IfElement, _BaseElement);
8063 var _super = _createSuper(IfElement);
8064 /**
8065 * @attribute platform
8066 * @initonly
8067 * @type {string}
8068 * @description
8069 * [en]Space-separated platform names. Possible values are `"ios"`, `"android"`, `"windows"` and `"other"`.[/en]
8070 * [ja][/ja]
8071 */
8072
8073 /**
8074 * @attribute orientation
8075 * @type {string}
8076 * @description
8077 * [en]Either `"portrait"` or `"landscape"`.[/en]
8078 * [ja]portraitもしくはlandscapeを指定します[/ja]
8079 */
8080
8081 function IfElement() {
8082 var _this;
8083 _classCallCheck(this, IfElement);
8084 _this = _super.call(this);
8085 contentReady(_assertThisInitialized(_this), function () {
8086 if (platform._getSelectedPlatform() !== null) {
8087 _this._platformUpdate();
8088 } else if (!_this._isAllowedPlatform()) {
8089 while (_this.childNodes[0]) {
8090 _this.childNodes[0].remove();
8091 }
8092 _this._platformUpdate();
8093 }
8094 });
8095 _this._onOrientationChange();
8096 return _this;
8097 }
8098 _createClass(IfElement, [{
8099 key: "connectedCallback",
8100 value: function connectedCallback() {
8101 orientation.on('change', this._onOrientationChange.bind(this));
8102 }
8103 }, {
8104 key: "attributeChangedCallback",
8105 value: function attributeChangedCallback(name) {
8106 if (name === 'orientation') {
8107 this._onOrientationChange();
8108 }
8109 }
8110 }, {
8111 key: "disconnectedCallback",
8112 value: function disconnectedCallback() {
8113 orientation.off('change', this._onOrientationChange);
8114 }
8115 }, {
8116 key: "_platformUpdate",
8117 value: function _platformUpdate() {
8118 this.style.display = this._isAllowedPlatform() ? '' : 'none';
8119 }
8120 }, {
8121 key: "_isAllowedPlatform",
8122 value: function _isAllowedPlatform() {
8123 return !this.getAttribute('platform') || this.getAttribute('platform').split(/\s+/).indexOf(platform.getMobileOS()) >= 0;
8124 }
8125 }, {
8126 key: "_onOrientationChange",
8127 value: function _onOrientationChange() {
8128 if (this.hasAttribute('orientation') && this._isAllowedPlatform()) {
8129 var conditionalOrientation = this.getAttribute('orientation').toLowerCase();
8130 var currentOrientation = orientation.isPortrait() ? 'portrait' : 'landscape';
8131 this.style.display = conditionalOrientation === currentOrientation ? '' : 'none';
8132 }
8133 }
8134 }], [{
8135 key: "observedAttributes",
8136 get: function get() {
8137 return ['orientation'];
8138 }
8139 }]);
8140 return IfElement;
8141 }(BaseElement);
8142 onsElements.If = IfElement;
8143 customElements.define('ons-if', IfElement);
8144
8145 var BaseAnimator = /*#__PURE__*/function () {
8146 /**
8147 * @param {Object} options
8148 * @param {String} options.timing
8149 * @param {Number} options.duration
8150 * @param {Number} options.delay
8151 */
8152 function BaseAnimator() {
8153 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8154 _classCallCheck(this, BaseAnimator);
8155 this.timing = options.timing || 'linear';
8156 this.duration = options.duration || 0;
8157 this.delay = options.delay || 0;
8158 this.def = {
8159 timing: this.timing,
8160 duration: this.duration,
8161 delay: this.delay
8162 };
8163 }
8164 _createClass(BaseAnimator, null, [{
8165 key: "extend",
8166 value: function extend() {
8167 var properties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8168 var extendedAnimator = this;
8169 var newAnimator = function newAnimator() {
8170 extendedAnimator.apply(this, arguments);
8171 util$4.extend(this, properties);
8172 };
8173 newAnimator.prototype = this.prototype;
8174 return newAnimator;
8175 }
8176 }]);
8177 return BaseAnimator;
8178 }();
8179
8180 /*
8181 Copyright 2013-2015 ASIAL CORPORATION
8182
8183 Licensed under the Apache License, Version 2.0 (the "License");
8184 you may not use this file except in compliance with the License.
8185 You may obtain a copy of the License at
8186
8187 http://www.apache.org/licenses/LICENSE-2.0
8188
8189 Unless required by applicable law or agreed to in writing, software
8190 distributed under the License is distributed on an "AS IS" BASIS,
8191 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8192 See the License for the specific language governing permissions and
8193 limitations under the License.
8194
8195 */
8196
8197 // This object should not be exposed to users. Please keep this private.
8198 var iPhoneXPatch = {};
8199 iPhoneXPatch.isIPhoneXPortraitPatchActive = function () {
8200 return document.documentElement.getAttribute('onsflag-iphonex-portrait') != null && window.innerWidth < window.innerHeight;
8201 };
8202 iPhoneXPatch.isIPhoneXLandscapePatchActive = function () {
8203 // If width === height, treat it as landscape
8204 return document.documentElement.getAttribute('onsflag-iphonex-landscape') != null && window.innerWidth >= window.innerHeight;
8205 };
8206
8207 /**
8208 * Returns the safe area lengths based on the current state of the safe areas.
8209 */
8210 iPhoneXPatch.getSafeAreaLengths = function () {
8211 var safeAreaLengths;
8212 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
8213 safeAreaLengths = {
8214 top: 44,
8215 right: 0,
8216 bottom: 34,
8217 left: 0
8218 };
8219 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
8220 safeAreaLengths = {
8221 top: 0,
8222 right: 44,
8223 bottom: 21,
8224 left: 44
8225 };
8226 } else {
8227 safeAreaLengths = {
8228 top: 0,
8229 right: 0,
8230 bottom: 0,
8231 left: 0
8232 };
8233 }
8234 return safeAreaLengths;
8235 };
8236
8237 /**
8238 * Returns the safe area rect based on the current state of the safe areas.
8239 */
8240 iPhoneXPatch.getSafeAreaDOMRect = function () {
8241 var safeAreaRect;
8242 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
8243 safeAreaRect = {
8244 x: 0,
8245 y: 44,
8246 /* 0 + 44 (top safe area) */
8247 width: window.innerWidth,
8248 height: window.innerHeight - 78 /* height - 44 (top safe area) - 34 (bottom safe area) */
8249 };
8250 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
8251 safeAreaRect = {
8252 x: 44,
8253 /* 0 + 44 (left safe area) */
8254 y: 0,
8255 width: window.innerWidth - 88,
8256 /* width - 44 (left safe area) - 34 (right safe area) */
8257 height: window.innerHeight - 21 /* height - 21 (bottom safe area) */
8258 };
8259 } else {
8260 safeAreaRect = {
8261 x: 0,
8262 y: 0,
8263 width: window.innerWidth,
8264 height: window.innerHeight
8265 };
8266 }
8267 return _objectSpread2(_objectSpread2({}, safeAreaRect), {}, {
8268 left: safeAreaRect.x,
8269 top: safeAreaRect.y,
8270 right: safeAreaRect.x + safeAreaRect.width,
8271 bottom: safeAreaRect.y + safeAreaRect.height
8272 });
8273 };
8274
8275 var ActionSheetAnimator = /*#__PURE__*/function (_BaseAnimator) {
8276 _inherits(ActionSheetAnimator, _BaseAnimator);
8277 var _super = _createSuper(ActionSheetAnimator);
8278 function ActionSheetAnimator() {
8279 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
8280 _ref$timing = _ref.timing,
8281 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
8282 _ref$delay = _ref.delay,
8283 delay = _ref$delay === void 0 ? 0 : _ref$delay,
8284 _ref$duration = _ref.duration,
8285 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
8286 _classCallCheck(this, ActionSheetAnimator);
8287 return _super.call(this, {
8288 timing: timing,
8289 delay: delay,
8290 duration: duration
8291 });
8292 }
8293
8294 /**
8295 * @param {HTMLElement} dialog
8296 * @param {Function} done
8297 */
8298 _createClass(ActionSheetAnimator, [{
8299 key: "show",
8300 value: function show(dialog, done) {
8301 done();
8302 }
8303
8304 /**
8305 * @param {HTMLElement} dialog
8306 * @param {Function} done
8307 */
8308 }, {
8309 key: "hide",
8310 value: function hide(dialog, done) {
8311 done();
8312 }
8313 }]);
8314 return ActionSheetAnimator;
8315 }(BaseAnimator);
8316
8317 /**
8318 * Android style animator for Action Sheet.
8319 */
8320 var MDActionSheetAnimator = /*#__PURE__*/function (_ActionSheetAnimator) {
8321 _inherits(MDActionSheetAnimator, _ActionSheetAnimator);
8322 var _super2 = _createSuper(MDActionSheetAnimator);
8323 function MDActionSheetAnimator() {
8324 var _this;
8325 var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
8326 _ref2$timing = _ref2.timing,
8327 timing = _ref2$timing === void 0 ? 'ease' : _ref2$timing,
8328 _ref2$delay = _ref2.delay,
8329 delay = _ref2$delay === void 0 ? 0 : _ref2$delay,
8330 _ref2$duration = _ref2.duration,
8331 duration = _ref2$duration === void 0 ? 0.4 : _ref2$duration;
8332 _classCallCheck(this, MDActionSheetAnimator);
8333 _this = _super2.call(this, {
8334 timing: timing,
8335 delay: delay,
8336 duration: duration
8337 });
8338 _this.maskTiming = 'linear';
8339 _this.maskDuration = 0.2;
8340 return _this;
8341 }
8342
8343 /**
8344 * @param {Object} dialog
8345 * @param {Function} callback
8346 */
8347 _createClass(MDActionSheetAnimator, [{
8348 key: "show",
8349 value: function show(dialog, callback) {
8350 Animit.runAll(Animit(dialog._mask).queue({
8351 opacity: 0
8352 }).wait(this.delay).queue({
8353 opacity: 1.0
8354 }, {
8355 duration: this.maskDuration,
8356 timing: this.maskTiming
8357 }), Animit(dialog._sheet, this.def).default({
8358 transform: "translate3d(0, 80%, 0)",
8359 opacity: 0
8360 }, {
8361 transform: 'translate3d(0, 0, 0)',
8362 opacity: 1
8363 }).queue(function (done) {
8364 callback && callback();
8365 done();
8366 }));
8367 }
8368
8369 /**
8370 * @param {Object} dialog
8371 * @param {Function} callback
8372 */
8373 }, {
8374 key: "hide",
8375 value: function hide(dialog, callback) {
8376 Animit.runAll(Animit(dialog._mask).queue({
8377 opacity: 1
8378 }).wait(this.delay).queue({
8379 opacity: 0
8380 }, {
8381 duration: this.maskDuration,
8382 timing: this.maskTiming
8383 }), Animit(dialog._sheet, this.def).default({
8384 transform: 'translate3d(0, 0, 0)',
8385 opacity: 1
8386 }, {
8387 transform: "translate3d(0, 80%, 0)",
8388 opacity: 0
8389 }).queue(function (done) {
8390 callback && callback();
8391 done();
8392 }));
8393 }
8394 }]);
8395 return MDActionSheetAnimator;
8396 }(ActionSheetAnimator);
8397
8398 /**
8399 * iOS style animator for dialog.
8400 */
8401 var IOSActionSheetAnimator = /*#__PURE__*/function (_ActionSheetAnimator2) {
8402 _inherits(IOSActionSheetAnimator, _ActionSheetAnimator2);
8403 var _super3 = _createSuper(IOSActionSheetAnimator);
8404 function IOSActionSheetAnimator() {
8405 var _this2;
8406 var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
8407 _ref3$timing = _ref3.timing,
8408 timing = _ref3$timing === void 0 ? 'ease' : _ref3$timing,
8409 _ref3$delay = _ref3.delay,
8410 delay = _ref3$delay === void 0 ? 0 : _ref3$delay,
8411 _ref3$duration = _ref3.duration,
8412 duration = _ref3$duration === void 0 ? 0.3 : _ref3$duration;
8413 _classCallCheck(this, IOSActionSheetAnimator);
8414 _this2 = _super3.call(this, {
8415 timing: timing,
8416 delay: delay,
8417 duration: duration
8418 });
8419 _this2.maskTiming = 'linear';
8420 _this2.maskDuration = 0.2;
8421 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
8422 _this2.liftAmount = 'calc(100% + 48px)';
8423 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
8424 _this2.liftAmount = 'calc(100% + 33px)';
8425 } else {
8426 _this2.liftAmount = document.body.clientHeight / 2.0 - 1 + 'px'; // avoid Forced Synchronous Layout
8427 }
8428 return _this2;
8429 }
8430
8431 /**
8432 * @param {Object} dialog
8433 * @param {Function} callback
8434 */
8435 _createClass(IOSActionSheetAnimator, [{
8436 key: "show",
8437 value: function show(dialog, callback) {
8438 Animit.runAll(Animit(dialog._mask).queue({
8439 opacity: 0
8440 }).wait(this.delay).queue({
8441 opacity: 1
8442 }, {
8443 duration: this.maskDuration,
8444 timing: this.maskTiming
8445 }), Animit(dialog._sheet, this.def).default({
8446 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)")
8447 }, {
8448 transform: 'translate3d(0, 0, 0)'
8449 }).queue(function (done) {
8450 callback && callback();
8451 done();
8452 }));
8453 }
8454
8455 /**
8456 * @param {Object} dialog
8457 * @param {Function} callback
8458 */
8459 }, {
8460 key: "hide",
8461 value: function hide(dialog, callback) {
8462 Animit.runAll(Animit(dialog._mask).queue({
8463 opacity: 1
8464 }).wait(this.delay).queue({
8465 opacity: 0
8466 }, {
8467 duration: this.maskDuration,
8468 timing: this.maskTiming
8469 }), Animit(dialog._sheet, this.def).default({
8470 transform: 'translate3d(0, 0, 0)'
8471 }, {
8472 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)")
8473 }).queue(function (done) {
8474 callback && callback();
8475 done();
8476 }));
8477 }
8478 }]);
8479 return IOSActionSheetAnimator;
8480 }(ActionSheetAnimator);
8481
8482 var BaseDialogElement = /*#__PURE__*/function (_BaseElement) {
8483 _inherits(BaseDialogElement, _BaseElement);
8484 var _super = _createSuper(BaseDialogElement);
8485 function BaseDialogElement() {
8486 var _this;
8487 _classCallCheck(this, BaseDialogElement);
8488 _this = _super.call(this);
8489 if (_this.constructor === BaseDialogElement) {
8490 util$4.throwAbstract();
8491 }
8492 _this._visible = false;
8493 _this._doorLock = new DoorLock();
8494 _this._cancel = _this._cancel.bind(_assertThisInitialized(_this));
8495 _this._selfCamelName = util$4.camelize(_this.tagName.slice(4));
8496 _this._defaultDBB = function (e) {
8497 return _this.cancelable ? _this._cancel() : e.callParentHandler();
8498 };
8499 _this._animatorFactory = _this._updateAnimatorFactory();
8500 return _this;
8501 }
8502 _createClass(BaseDialogElement, [{
8503 key: "_scheme",
8504 get: function get() {
8505 // eslint-disable-line getter-return
8506 util$4.throwMember();
8507 }
8508 }, {
8509 key: "_updateAnimatorFactory",
8510 value: function _updateAnimatorFactory() {
8511 util$4.throwMember();
8512 }
8513 }, {
8514 key: "_toggleStyle",
8515 value: function _toggleStyle(shouldShow) {
8516 this.style.display = shouldShow ? 'block' : 'none';
8517 }
8518 }, {
8519 key: "onDeviceBackButton",
8520 get: function get() {
8521 return this._backButtonHandler;
8522 },
8523 set: function set(callback) {
8524 if (this._backButtonHandler) {
8525 this._backButtonHandler.destroy();
8526 }
8527 this._backButtonCallback = callback;
8528 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
8529 }
8530 }, {
8531 key: "_cancel",
8532 value: function _cancel() {
8533 var _this2 = this;
8534 if (this.cancelable && !this._running) {
8535 this._running = true;
8536 this.hide().then(function () {
8537 _this2._running = false;
8538 util$4.triggerElementEvent(_this2, 'dialogcancel');
8539 util$4.triggerElementEvent(_this2, 'dialog-cancel'); // dialog-cancel is deprecated but still emit to avoid breaking user code
8540 }, function () {
8541 return _this2._running = false;
8542 });
8543 }
8544 }
8545 }, {
8546 key: "show",
8547 value: function show() {
8548 var _this3 = this;
8549 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
8550 args[_key] = arguments[_key];
8551 }
8552 return this._setVisible.apply(this, [true].concat(args)).then(function (dialog) {
8553 _this3.visible = true;
8554 return dialog;
8555 });
8556 }
8557 }, {
8558 key: "hide",
8559 value: function hide() {
8560 var _this4 = this;
8561 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
8562 args[_key2] = arguments[_key2];
8563 }
8564 return this._setVisible.apply(this, [false].concat(args)).then(function (dialog) {
8565 _this4.visible = false;
8566 return dialog;
8567 });
8568 }
8569 }, {
8570 key: "toggle",
8571 value: function toggle() {
8572 var _this5 = this;
8573 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
8574 args[_key3] = arguments[_key3];
8575 }
8576 return this._setVisible.apply(this, [!this.visible].concat(args)).then(function (dialog) {
8577 _this5.visible = _this5._visible;
8578 return dialog;
8579 });
8580 }
8581 }, {
8582 key: "_setVisible",
8583 value: function _setVisible(shouldShow) {
8584 var _util$triggerElementE,
8585 _this6 = this;
8586 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8587 var action = shouldShow ? 'show' : 'hide';
8588 options = _objectSpread2({}, options);
8589 options.animationOptions = util$4.extend(options.animationOptions || {}, this.animationOptions);
8590 var canceled = false;
8591 util$4.triggerElementEvent(this, "pre".concat(action), (_util$triggerElementE = {}, _defineProperty(_util$triggerElementE, this._selfCamelName, this), _defineProperty(_util$triggerElementE, "cancel", function cancel() {
8592 return canceled = true;
8593 }), _util$triggerElementE));
8594 if (canceled) {
8595 return Promise.reject("Canceled in pre".concat(action, " event."));
8596 }
8597 return new Promise(function (resolve) {
8598 _this6._doorLock.waitUnlock(function () {
8599 var unlock = _this6._doorLock.lock();
8600 var animator = _this6._animatorFactory.newAnimator(options);
8601 shouldShow && _this6._toggleStyle(true, options);
8602 _this6._visible = shouldShow;
8603 util$4.iosPageScrollFix(shouldShow);
8604 contentReady(_this6, function () {
8605 animator[action](_this6, function () {
8606 !shouldShow && _this6._toggleStyle(false, options);
8607 unlock();
8608 util$4.propagateAction(_this6, '_' + action);
8609 util$4.triggerElementEvent(_this6, 'post' + action, _defineProperty({}, _this6._selfCamelName, _this6)); // postshow posthide
8610
8611 if (options.callback instanceof Function) {
8612 options.callback(_this6);
8613 }
8614 resolve(_this6);
8615 });
8616 });
8617 });
8618 });
8619 }
8620 }, {
8621 key: "maskColor",
8622 get: function get() {
8623 return this.getAttribute('mask-color');
8624 },
8625 set: function set(value) {
8626 if (value === null || value === undefined) {
8627 this.removeAttribute('mask-color');
8628 } else {
8629 this.setAttribute('mask-color', value);
8630 }
8631 }
8632 }, {
8633 key: "animationOptions",
8634 get: function get() {
8635 return AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options'));
8636 },
8637 set: function set(value) {
8638 if (value === undefined || value === null) {
8639 this.removeAttribute('animation-options');
8640 } else {
8641 this.setAttribute('animation-options', JSON.stringify(value));
8642 }
8643 }
8644 }, {
8645 key: "_updateMask",
8646 value: function _updateMask() {
8647 var _this7 = this;
8648 contentReady(this, function () {
8649 if (_this7._mask) {
8650 _this7._mask.style.backgroundColor = _this7.maskColor;
8651 }
8652 });
8653 }
8654 }, {
8655 key: "_updateAnimation",
8656 value: function _updateAnimation() {
8657 this._animatorFactory = this._updateAnimatorFactory();
8658 }
8659 }, {
8660 key: "connectedCallback",
8661 value: function connectedCallback() {
8662 var _this8 = this;
8663 if (typeof this._backButtonCallback === 'function') {
8664 this.onDeviceBackButton = this._backButtonCallback;
8665 } else if (typeof this._defaultDBB === 'function') {
8666 this.onDeviceBackButton = this._defaultDBB.bind(this);
8667 }
8668 contentReady(this, function () {
8669 if (_this8._mask) {
8670 _this8._mask.addEventListener('click', _this8._cancel, false);
8671 }
8672 });
8673 }
8674 }, {
8675 key: "disconnectedCallback",
8676 value: function disconnectedCallback() {
8677 if (this._backButtonHandler) {
8678 this._backButtonHandler.destroy();
8679 this._backButtonHandler = null;
8680 }
8681 if (this._mask) {
8682 this._mask.removeEventListener('click', this._cancel, false);
8683 }
8684 }
8685 }, {
8686 key: "attributeChangedCallback",
8687 value: function attributeChangedCallback(name, last, current) {
8688 var _this9 = this;
8689 switch (name) {
8690 case 'modifier':
8691 ModifierUtil.onModifierChanged(last, current, this, this._scheme);
8692 break;
8693 case 'animation':
8694 this._updateAnimation();
8695 break;
8696 case 'mask-color':
8697 this._updateMask();
8698 break;
8699 case 'visible':
8700 if (this.visible !== this._visible) {
8701 // update the mask and animation early in case `visible` attribute
8702 // changed callback is called before `animation` or `mask-color`
8703 this._updateMask();
8704 this._updateAnimation();
8705 contentReady(this, function () {
8706 _this9._setVisible(_this9.visible);
8707 });
8708 }
8709 break;
8710 }
8711 }
8712 }], [{
8713 key: "observedAttributes",
8714 get: function get() {
8715 return ['modifier', 'animation', 'mask-color', 'visible'];
8716 }
8717 }, {
8718 key: "events",
8719 get: function get() {
8720 return ['preshow', 'postshow', 'prehide', 'posthide', 'dialogcancel', 'dialog-cancel'];
8721 }
8722 }]);
8723 return BaseDialogElement;
8724 }(BaseElement);
8725 util$4.defineBooleanProperties(BaseDialogElement, ['visible', 'disabled', 'cancelable']);
8726
8727 var scheme$v = {
8728 '.action-sheet': 'action-sheet--*',
8729 '.action-sheet-mask': 'action-sheet-mask--*',
8730 '.action-sheet-title': 'action-sheet-title--*'
8731 };
8732 var _animatorDict$8 = {
8733 'default': function _default() {
8734 return platform.isAndroid() ? MDActionSheetAnimator : IOSActionSheetAnimator;
8735 },
8736 'none': ActionSheetAnimator
8737 };
8738
8739 /**
8740 * @element ons-action-sheet
8741 * @category dialog
8742 * @description
8743 * [en]
8744 * Action/bottom sheet that is displayed on top of current screen.
8745 *
8746 * 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.
8747 *
8748 * 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.
8749 *
8750 * It will automatically be displayed as Material Design (bottom sheet) when running on an Android device.
8751 * [/en]
8752 * [ja]
8753 * アクションシート、もしくはボトムシートを現在のスクリーン上に表示します。
8754 *
8755 * この要素は、`<body>`要素に直接アタッチされるか、もしくは`ons.createElement(template, { append: true })`と`<template>`タグを使ってテンプレートから動的に生成されます。
8756 *
8757 * アクションシートは、選択肢のリストを表示してユーザーに尋ねるのに便利です。`ons-action-sheet-button`は、この要素の中に置くために提供されていますが、それ以外にも他のどのような要素を含むことができます。
8758 *
8759 * Androidデバイスで実行されるときには、自動的にマテリアルデザイン(ボトムシート)として表示されます。
8760 * [/ja]
8761 * @modifier material
8762 * [en]Display a Material Design bottom sheet.[/en]
8763 * [ja]マテリアルデザインのボトムシートを表示します。[/ja]
8764 * @tutorial vanilla/reference/action-sheet
8765 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
8766 * @seealso ons-popover
8767 * [en]`<ons-popover>` component[/en]
8768 * [ja]ons-popoverコンポーネント[/ja]
8769 * @seealso ons-modal
8770 * [en]`<ons-modal>` component[/en]
8771 * [ja]ons-modalコンポーネント[/ja]
8772 * @example
8773 * <ons-action-sheet id="sheet">
8774 * <ons-action-sheet-button>Label</ons-action-sheet-button>
8775 * <ons-action-sheet-button>Label</ons-action-sheet-button>
8776 * </ons-action-sheet>
8777 *
8778 * <script>
8779 * document.getElementById('sheet').show();
8780 * </script>
8781 */
8782 var ActionSheetElement = /*#__PURE__*/function (_BaseDialogElement) {
8783 _inherits(ActionSheetElement, _BaseDialogElement);
8784 var _super = _createSuper(ActionSheetElement);
8785 /**
8786 * @event preshow
8787 * @description
8788 * [en]Fired just before the action sheet is displayed.[/en]
8789 * [ja]ダイアログが表示される直前に発火します。[/ja]
8790 * @param {Object} event [en]Event object.[/en]
8791 * @param {Object} event.actionSheet
8792 * [en]Component object.[/en]
8793 * [ja]コンポーネントのオブジェクト。[/ja]
8794 * @param {Function} event.cancel
8795 * [en]Execute this function to stop the action sheet from being shown.[/en]
8796 * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
8797 */
8798
8799 /**
8800 * @event postshow
8801 * @description
8802 * [en]Fired just after the action sheet is displayed.[/en]
8803 * [ja]ダイアログが表示された直後に発火します。[/ja]
8804 * @param {Object} event [en]Event object.[/en]
8805 * @param {Object} event.actionSheet
8806 * [en]Component object.[/en]
8807 * [ja]コンポーネントのオブジェクト。[/ja]
8808 */
8809
8810 /**
8811 * @event prehide
8812 * @description
8813 * [en]Fired just before the action sheet is hidden.[/en]
8814 * [ja]ダイアログが隠れる直前に発火します。[/ja]
8815 * @param {Object} event [en]Event object.[/en]
8816 * @param {Object} event.actionSheet
8817 * [en]Component object.[/en]
8818 * [ja]コンポーネントのオブジェクト。[/ja]
8819 * @param {Function} event.cancel
8820 * [en]Execute this function to stop the action sheet from being hidden.[/en]
8821 * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
8822 */
8823
8824 /**
8825 * @event posthide
8826 * @description
8827 * [en]Fired just after the action sheet is hidden.[/en]
8828 * [ja]ダイアログが隠れた後に発火します。[/ja]
8829 * @param {Object} event [en]Event object.[/en]
8830 * @param {Object} event.actionSheet
8831 * [en]Component object.[/en]
8832 * [ja]コンポーネントのオブジェクト。[/ja]
8833 */
8834
8835 /**
8836 * @event dialogcancel
8837 * @description
8838 * [en]Fired when the action sheet is canceled.[/en]
8839 * [ja][/ja]
8840 */
8841
8842 /**
8843 * @attribute title
8844 * @type {String}
8845 * @description
8846 * [en]Optional title of the action sheet. A new element will be created containing this string.[/en]
8847 * [ja]アクションシートのタイトルを指定します。ここで指定した文字列を含む新しい要素が作成されます。[/ja]
8848 */
8849
8850 /**
8851 * @property title
8852 * @type {String}
8853 * @description
8854 * [en]Optional title of the action sheet. A new element will be created containing this string.[/en]
8855 * [ja]アクションシートのタイトルを指定します。ここで指定した文字列を含む新しい要素が作成されます。[/ja]
8856 */
8857
8858 /**
8859 * @attribute modifier
8860 * @type {String}
8861 * @description
8862 * [en]The appearance of the action sheet.[/en]
8863 * [ja]ダイアログの表現を指定します。[/ja]
8864 */
8865
8866 /**
8867 * @attribute cancelable
8868 * @description
8869 * [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]
8870 * [ja]この属性が設定されると、アクションシートの背景やAndroidデバイスのバックボタンを推すことでアクションシートが閉じるようになります。[/ja]
8871 */
8872
8873 /**
8874 * @attribute disabled
8875 * @description
8876 * [en]If this attribute is set the action sheet is disabled.[/en]
8877 * [ja]この属性がある時、ダイアログはdisabled状態になります。[/ja]
8878 */
8879
8880 /**
8881 * @attribute animation
8882 * @type {String}
8883 * @default default
8884 * @description
8885 * [en]The animation used when showing and hiding the action sheet. Can be either `"none"` or `"default"`.[/en]
8886 * [ja]ダイアログを表示する際のアニメーション名を指定します。"none"もしくは"default"を指定できます。[/ja]
8887 */
8888
8889 /**
8890 * @attribute animation-options
8891 * @type {Expression}
8892 * @description
8893 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
8894 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
8895 */
8896
8897 /**
8898 * @property animationOptions
8899 * @type {Object}
8900 * @description
8901 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
8902 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
8903 */
8904
8905 /**
8906 * @attribute mask-color
8907 * @type {String}
8908 * @default rgba(0, 0, 0, 0.2)
8909 * @description
8910 * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
8911 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
8912 */
8913
8914 /**
8915 * @attribute visible
8916 * @type {Boolean}
8917 * @description
8918 * [en]Whether the action sheet is visible or not.[/en]
8919 * [ja]要素が見える場合に`true`。[/ja]
8920 */
8921
8922 function ActionSheetElement() {
8923 var _this;
8924 _classCallCheck(this, ActionSheetElement);
8925 _this = _super.call(this);
8926 contentReady(_assertThisInitialized(_this), function () {
8927 return _this._compile();
8928 });
8929 return _this;
8930 }
8931 _createClass(ActionSheetElement, [{
8932 key: "_scheme",
8933 get: function get() {
8934 return scheme$v;
8935 }
8936 }, {
8937 key: "_mask",
8938 get: function get() {
8939 return util$4.findChild(this, '.action-sheet-mask');
8940 }
8941 }, {
8942 key: "_sheet",
8943 get: function get() {
8944 return util$4.findChild(this, '.action-sheet');
8945 }
8946 }, {
8947 key: "_title",
8948 get: function get() {
8949 return this.querySelector('.action-sheet-title');
8950 }
8951 }, {
8952 key: "_updateAnimatorFactory",
8953 value: function _updateAnimatorFactory() {
8954 return new AnimatorFactory({
8955 animators: _animatorDict$8,
8956 baseClass: ActionSheetAnimator,
8957 baseClassName: 'ActionSheetAnimator',
8958 defaultAnimation: this.getAttribute('animation')
8959 });
8960 }
8961 }, {
8962 key: "_compile",
8963 value: function _compile() {
8964 autoStyle.prepare(this);
8965 this.style.display = 'none';
8966 this.style.zIndex = 10001;
8967
8968 /* Expected result:
8969 * <ons-action-sheet>
8970 * <div class="action-sheet-mask"></div>
8971 * <div class="action-sheet">
8972 * <div class="action-sheet-title></div>
8973 * ...
8974 * </div>
8975 * </ons-action-sheet>
8976 */
8977
8978 if (!this._sheet) {
8979 var sheet = document.createElement('div');
8980 sheet.classList.add('action-sheet');
8981 while (this.firstChild) {
8982 sheet.appendChild(this.firstChild);
8983 }
8984 this.appendChild(sheet);
8985 }
8986 if (!this._title) {
8987 var title = document.createElement('div');
8988 title.classList.add('action-sheet-title');
8989 if (this.title) {
8990 title.innerHTML = this.title;
8991 } else {
8992 title.hidden = true;
8993 }
8994 this._sheet.insertBefore(title, this._sheet.firstChild);
8995 }
8996 if (!this._mask) {
8997 var mask = document.createElement('div');
8998 mask.classList.add('action-sheet-mask');
8999 this.insertBefore(mask, this.firstChild);
9000 }
9001 this._sheet.style.zIndex = 20001;
9002 this._mask.style.zIndex = 20000;
9003 ModifierUtil.initModifier(this, this._scheme);
9004 }
9005 }, {
9006 key: "_updateTitle",
9007 value: function _updateTitle() {
9008 if (this._title) {
9009 if (!this.title) {
9010 this._title.hidden = true;
9011 } else {
9012 this._title.innerHTML = this.title;
9013 this._title.hidden = false;
9014 }
9015 }
9016 }
9017 }, {
9018 key: "title",
9019 get: function get() {
9020 return this.getAttribute('title');
9021 },
9022 set: function set(value) {
9023 if (value === null || value === undefined) {
9024 this.removeAttribute('title');
9025 } else {
9026 this.setAttribute('title', value);
9027 }
9028 }
9029
9030 /**
9031 * @property onDeviceBackButton
9032 * @type {Object}
9033 * @description
9034 * [en]Back-button handler.[/en]
9035 * [ja]バックボタンハンドラ。[/ja]
9036 */
9037
9038 /**
9039 * @property maskColor
9040 * @type {String}
9041 * @default rgba(0, 0, 0, 0.2)
9042 * @description
9043 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
9044 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
9045 */
9046
9047 /**
9048 * @method show
9049 * @signature show([options])
9050 * @param {Object} [options]
9051 * [en]Parameter object.[/en]
9052 * [ja]オプションを指定するオブジェクト。[/ja]
9053 * @param {String} [options.animation]
9054 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
9055 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定します。[/ja]
9056 * @param {String} [options.animationOptions]
9057 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
9058 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
9059 * @param {Function} [options.callback]
9060 * [en]This function is called after the action sheet has been revealed.[/en]
9061 * [ja]ダイアログが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
9062 * @description
9063 * [en]Show the action sheet.[/en]
9064 * [ja]ダイアログを開きます。[/ja]
9065 * @return {Promise} Resolves to the displayed element.
9066 */
9067
9068 /**
9069 * @method hide
9070 * @signature hide([options])
9071 * @param {Object} [options]
9072 * [en]Parameter object.[/en]
9073 * [ja]オプションを指定するオブジェクト。[/ja]
9074 * @param {String} [options.animation]
9075 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
9076 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定できます。[/ja]
9077 * @param {String} [options.animationOptions]
9078 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
9079 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/ja]
9080 * @param {Function} [options.callback]
9081 * [en]This functions is called after the action sheet has been hidden.[/en]
9082 * [ja]ダイアログが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
9083 * @description
9084 * [en]Hide the action sheet.[/en]
9085 * [ja]ダイアログを閉じます。[/ja]
9086 * @return {Promise}
9087 * [en]Resolves to the hidden element[/en]
9088 * [ja]隠れた要素を解決します。[/ja]
9089 */
9090
9091 /**
9092 * @property visible
9093 * @type {Boolean}
9094 * @description
9095 * [en]Whether the action sheet is visible or not.[/en]
9096 * [ja]要素が見える場合に`true`。[/ja]
9097 */
9098
9099 /**
9100 * @property disabled
9101 * @type {Boolean}
9102 * @description
9103 * [en]Whether the action sheet is disabled or not.[/en]
9104 * [ja]無効化されている場合に`true`。[/ja]
9105 */
9106
9107 /**
9108 * @property cancelable
9109 * @type {Boolean}
9110 * @description
9111 * [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]
9112 * [ja]アクションシートがキャンセル可能かどうかを設定します。キャンセル可能なアクションシートは、背景をタップしたりAndroidデバイスのバックボタンを推すことで閉じるようになります。[/ja]
9113 */
9114 }, {
9115 key: "attributeChangedCallback",
9116 value: function attributeChangedCallback(name, last, current) {
9117 if (name === 'title') {
9118 this._updateTitle();
9119 } else {
9120 _get(_getPrototypeOf(ActionSheetElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
9121 }
9122 }
9123
9124 /**
9125 * @param {String} name
9126 * @param {ActionSheetAnimator} Animator
9127 */
9128 }], [{
9129 key: "observedAttributes",
9130 get: function get() {
9131 return [].concat(_toConsumableArray(_get(_getPrototypeOf(ActionSheetElement), "observedAttributes", this)), ['title']);
9132 }
9133 }, {
9134 key: "registerAnimator",
9135 value: function registerAnimator(name, Animator) {
9136 if (!(Animator.prototype instanceof ActionSheetAnimator)) {
9137 util$4.throwAnimator('ActionSheet');
9138 }
9139 _animatorDict$8[name] = Animator;
9140 }
9141 }, {
9142 key: "animators",
9143 get: function get() {
9144 return _animatorDict$8;
9145 }
9146 }, {
9147 key: "ActionSheetAnimator",
9148 get: function get() {
9149 return ActionSheetAnimator;
9150 }
9151 }]);
9152 return ActionSheetElement;
9153 }(BaseDialogElement);
9154 onsElements.ActionSheet = ActionSheetElement;
9155 customElements.define('ons-action-sheet', ActionSheetElement);
9156
9157 /**
9158 * @class AnimatorCSS - implementation of Animator class using css transitions
9159 */
9160 var AnimatorCSS = /*#__PURE__*/function () {
9161 function AnimatorCSS() {
9162 _classCallCheck(this, AnimatorCSS);
9163 this._queue = [];
9164 this._index = 0;
9165 }
9166 _createClass(AnimatorCSS, [{
9167 key: "animate",
9168 value:
9169 /**
9170 * @method animate
9171 * @desc main animation function
9172 * @param {Element} element
9173 * @param {Object} finalCSS
9174 * @param {number} [duration=200] - duration in milliseconds
9175 * @return {Object} result
9176 * @return {Function} result.then(callback) - sets a callback to be executed after the animation has stopped
9177 * @return {Function} result.stop(options) - stops the animation; if options.stopNext is true then it doesn't call the callback
9178 * @return {Function} result.finish(ms) - finishes the animation in the specified time in milliseconds
9179 * @return {Function} result.speed(ms) - sets the animation speed so that it finishes as if the original duration was the one specified here
9180 * @example
9181 * ````
9182 * var result = animator.animate(el, {opacity: 0.5}, 1000);
9183 *
9184 * el.addEventListener('click', function(e){
9185 * result.speed(200).then(function(){
9186 * console.log('done');
9187 * });
9188 * }, 300);
9189 * ````
9190 */
9191 function animate(el, final) {
9192 var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 200;
9193 var start = new Date().getTime(),
9194 initial = {},
9195 stopped = false,
9196 next = false,
9197 timeout = false,
9198 properties = Object.keys(final);
9199 var updateStyles = function updateStyles() {
9200 var s = window.getComputedStyle(el);
9201 properties.forEach(s.getPropertyValue.bind(s));
9202 s = el.offsetHeight;
9203 };
9204 var result = {
9205 stop: function stop() {
9206 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
9207 timeout && clearTimeout(timeout);
9208 var k = Math.min(1, (new Date().getTime() - start) / duration);
9209 properties.forEach(function (i) {
9210 el.style[i] = (1 - k) * initial[i] + k * final[i] + (i == 'opacity' ? '' : 'px');
9211 });
9212 el.style.transitionDuration = '0s';
9213 if (options.stopNext) {
9214 next = false;
9215 } else if (!stopped) {
9216 stopped = true;
9217 next && next();
9218 }
9219 return result;
9220 },
9221 then: function then(cb) {
9222 next = cb;
9223 if (stopped) {
9224 next && next();
9225 }
9226 return result;
9227 },
9228 speed: function speed(newDuration) {
9229 if (internal$1.config.animationsDisabled) {
9230 newDuration = 0;
9231 }
9232 if (!stopped) {
9233 timeout && clearTimeout(timeout);
9234 var passed = new Date().getTime() - start;
9235 var k = passed / duration;
9236 var remaining = newDuration * (1 - k);
9237 properties.forEach(function (i) {
9238 el.style[i] = (1 - k) * initial[i] + k * final[i] + (i == 'opacity' ? '' : 'px');
9239 });
9240 updateStyles();
9241 start = el.speedUpTime;
9242 duration = remaining;
9243 el.style.transitionDuration = duration / 1000 + 's';
9244 properties.forEach(function (i) {
9245 el.style[i] = final[i] + (i == 'opacity' ? '' : 'px');
9246 });
9247 timeout = setTimeout(result.stop, remaining);
9248 }
9249 return result;
9250 },
9251 finish: function finish() {
9252 var milliseconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 50;
9253 var k = (new Date().getTime() - start) / duration;
9254 result.speed(milliseconds / (1 - k));
9255 return result;
9256 }
9257 };
9258 if (el.hasAttribute('disabled') || stopped || internal$1.config.animationsDisabled) {
9259 return result;
9260 }
9261 var style = window.getComputedStyle(el);
9262 properties.forEach(function (e) {
9263 var v = parseFloat(style.getPropertyValue(e));
9264 initial[e] = isNaN(v) ? 0 : v;
9265 });
9266 if (!stopped) {
9267 el.style.transitionProperty = properties.join(',');
9268 el.style.transitionDuration = duration / 1000 + 's';
9269 properties.forEach(function (e) {
9270 el.style[e] = final[e] + (e == 'opacity' ? '' : 'px');
9271 });
9272 }
9273 timeout = setTimeout(result.stop, duration);
9274 this._onStopAnimations(el, result.stop);
9275 return result;
9276 }
9277 }, {
9278 key: "_onStopAnimations",
9279 value: function _onStopAnimations(el, listener) {
9280 var queue = this._queue;
9281 var i = this._index++;
9282 queue[el] = queue[el] || [];
9283 queue[el][i] = function (options) {
9284 delete queue[el][i];
9285 if (queue[el] && queue[el].length == 0) {
9286 delete queue[el];
9287 }
9288 return listener(options);
9289 };
9290 }
9291
9292 /**
9293 * @method stopAnimations
9294 * @desc stops active animations on a specified element
9295 * @param {Element|Array} element - element or array of elements
9296 * @param {Object} [options={}]
9297 * @param {Boolean} [options.stopNext] - the callbacks after the animations won't be called if this option is true
9298 */
9299 }, {
9300 key: "stopAnimations",
9301 value: function stopAnimations(el) {
9302 var _this = this;
9303 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
9304 if (Array.isArray(el)) {
9305 return el.forEach(function (el) {
9306 _this.stopAnimations(el, options);
9307 });
9308 }
9309 (this._queue[el] || []).forEach(function (e) {
9310 e(options || {});
9311 });
9312 }
9313
9314 /**
9315 * @method stopAll
9316 * @desc stops all active animations
9317 * @param {Object} [options={}]
9318 * @param {Boolean} [options.stopNext] - the callbacks after the animations won't be called if this option is true
9319 */
9320 }, {
9321 key: "stopAll",
9322 value: function stopAll() {
9323 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
9324 this.stopAnimations(Object.keys(this._queue), options);
9325 }
9326
9327 /**
9328 * @method fade
9329 * @desc fades the element (short version for animate(el, {opacity: 0}))
9330 * @param {Element} element
9331 * @param {number} [duration=200]
9332 */
9333 }, {
9334 key: "fade",
9335 value: function fade(el) {
9336 var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;
9337 return this.animate(el, {
9338 opacity: 0
9339 }, duration);
9340 }
9341 }]);
9342 return AnimatorCSS;
9343 }();
9344
9345 var defaultClassName$h = 'ripple';
9346 var scheme$u = {
9347 '': 'ripple--*',
9348 '.ripple__wave': 'ripple--*__wave',
9349 '.ripple__background': 'ripple--*__background'
9350 };
9351
9352 /**
9353 * @element ons-ripple
9354 * @category visual
9355 * @description
9356 * [en]
9357 * Adds a Material Design "ripple" effect to an element. The ripple effect will spread from the position where the user taps.
9358 *
9359 * Some elements such as `<ons-button>` and `<ons-fab>` support a `ripple` attribute.
9360 * [/en]
9361 * [ja]マテリアルデザインのリップル効果をDOM要素に追加します。[/ja]
9362 * @codepen wKQWdZ
9363 * @tutorial vanilla/Reference/ripple
9364 * @modifier light-gray
9365 * [en]Change the color of effects to light gray.[/en]
9366 * [ja]エフェクトの色が明るい灰色になります。[/ja]
9367 * @guide theming.html#cross-platform-styling-autostyling
9368 * [en]Cross platform styling[/en]
9369 * [ja]Cross platform styling[/ja]
9370 * @example
9371 * <div class="my-div">
9372 * <ons-ripple></ons-ripple>
9373 * </div>
9374 *
9375 * @example
9376 * <ons-button ripple>Click me!</ons-button>
9377 */
9378 var RippleElement = /*#__PURE__*/function (_BaseElement) {
9379 _inherits(RippleElement, _BaseElement);
9380 var _super = _createSuper(RippleElement);
9381 /**
9382 * @attribute color
9383 * @type {String}
9384 * @description
9385 * [en]Color of the ripple effect.[/en]
9386 * [ja]リップルエフェクトの色を指定します。[/ja]
9387 */
9388
9389 /**
9390 * @attribute modifier
9391 * @type {String}
9392 * @description
9393 * [en]The appearance of the ripple effect.[/en]
9394 * [ja]エフェクトの表現を指定します。[/ja]
9395 */
9396
9397 /**
9398 * @attribute background
9399 * @type {String}
9400 * @description
9401 * [en]Color of the background.[/en]
9402 * [ja]背景の色を設定します。[/ja]
9403 */
9404
9405 /**
9406 * @attribute size
9407 * @type {String}
9408 * @description
9409 * [en]Sizing of the wave on ripple effect. Set "cover" or "contain". Default is "cover".[/en]
9410 * [ja]エフェクトのサイズを指定します。"cover"もしくは"contain"を指定します。デフォルトは"cover"です。[/ja]
9411 */
9412
9413 /**
9414 * @attribute center
9415 * @type {Boolean}
9416 * @description
9417 * [en]If this attribute presents, change the position of wave effect to center of the target element.[/en]
9418 * [ja]この要素を設定すると、エフェクトの位置が要素の真ん中から始まります。[/ja]
9419 */
9420
9421 /**
9422 * @property center
9423 * @type {Boolean}
9424 * @description
9425 * [en]If this attribute presents, change the position of wave effect to center of the target element.[/en]
9426 * [ja]この要素を設定すると、エフェクトの位置が要素の真ん中から始まります。[/ja]
9427 */
9428
9429 /**
9430 * @attribute disabled
9431 * @description
9432 * [en]If this attribute is set, the ripple effect will be disabled.[/en]
9433 * [ja]この属性が設定された場合、リップルエフェクトは無効になります。[/ja]
9434 */
9435
9436 function RippleElement() {
9437 var _this;
9438 _classCallCheck(this, RippleElement);
9439 _this = _super.call(this);
9440 _this._onTap = _this._onTap.bind(_assertThisInitialized(_this));
9441 _this._onHold = _this._onHold.bind(_assertThisInitialized(_this));
9442 _this._onDragStart = _this._onDragStart.bind(_assertThisInitialized(_this));
9443 _this._onRelease = _this._onRelease.bind(_assertThisInitialized(_this));
9444 contentReady(_assertThisInitialized(_this), function () {
9445 return _this._compile();
9446 });
9447 _this._animator = new AnimatorCSS();
9448 ['color', 'center', 'start-radius', 'background', 'modifier'].forEach(function (e) {
9449 _this.attributeChangedCallback(e, null, _this.getAttribute(e));
9450 });
9451 return _this;
9452 }
9453 _createClass(RippleElement, [{
9454 key: "_compile",
9455 value: function _compile() {
9456 this.classList.add(defaultClassName$h);
9457 this._wave = this.getElementsByClassName('ripple__wave')[0];
9458 this._background = this.getElementsByClassName('ripple__background')[0];
9459 if (!(this._background && this._wave)) {
9460 this._wave = util$4.create('.ripple__wave');
9461 this._background = util$4.create('.ripple__background');
9462 this.appendChild(this._wave);
9463 this.appendChild(this._background);
9464 }
9465 ModifierUtil.initModifier(this, scheme$u);
9466 }
9467 }, {
9468 key: "_getEffectSize",
9469 value: function _getEffectSize() {
9470 var sizes = ['cover', 'contain'];
9471 if (this.hasAttribute('size')) {
9472 var size = this.getAttribute('size');
9473 if (sizes.indexOf(size) !== -1) {
9474 return size;
9475 }
9476 }
9477 return 'cover';
9478 }
9479 }, {
9480 key: "_calculateCoords",
9481 value: function _calculateCoords(e) {
9482 var x, y, h, w, r;
9483 var b = this.getBoundingClientRect();
9484 var size = this._getEffectSize();
9485 var error = function error() {
9486 return util$4.throw('Ripple invalid state');
9487 };
9488 if (this._center) {
9489 x = b.width / 2;
9490 y = b.height / 2;
9491 if (size === 'cover') {
9492 r = Math.sqrt(x * x + y * y);
9493 } else if (size === 'contain') {
9494 r = Math.min(x, y);
9495 } else {
9496 error();
9497 }
9498 } else {
9499 x = (typeof e.clientX === 'number' ? e.clientX : e.changedTouches[0].clientX) - b.left;
9500 y = (typeof e.clientY === 'number' ? e.clientY : e.changedTouches[0].clientY) - b.top;
9501 h = Math.max(y, b.height - y);
9502 w = Math.max(x, b.width - x);
9503 if (size === 'cover') {
9504 r = Math.sqrt(h * h + w * w);
9505 } else if (size === 'contain') {
9506 r = Math.min(Math.round(h / 2), Math.round(w / 2));
9507 } else {
9508 error();
9509 }
9510 }
9511 return {
9512 x: x,
9513 y: y,
9514 r: r
9515 };
9516 }
9517 }, {
9518 key: "_rippleAnimation",
9519 value: function _rippleAnimation(e) {
9520 var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 300;
9521 var _animator = this._animator,
9522 _wave = this._wave,
9523 _background = this._background,
9524 _minR = this._minR;
9525 var _this$_calculateCoord = this._calculateCoords(e),
9526 x = _this$_calculateCoord.x,
9527 y = _this$_calculateCoord.y,
9528 r = _this$_calculateCoord.r;
9529 _animator.stopAll({
9530 stopNext: 1
9531 });
9532 _animator.animate(_background, {
9533 opacity: 1
9534 }, duration);
9535 util$4.extend(_wave.style, {
9536 opacity: 1,
9537 top: y - _minR + 'px',
9538 left: x - _minR + 'px',
9539 width: 2 * _minR + 'px',
9540 height: 2 * _minR + 'px'
9541 });
9542 return _animator.animate(_wave, {
9543 top: y - r,
9544 left: x - r,
9545 height: 2 * r,
9546 width: 2 * r
9547 }, duration);
9548 }
9549 }, {
9550 key: "_updateParent",
9551 value: function _updateParent() {
9552 if (!this._parentUpdated && this.parentNode) {
9553 var computedStyle = window.getComputedStyle(this.parentNode);
9554 if (computedStyle.getPropertyValue('position') === 'static') {
9555 this.parentNode.style.position = 'relative';
9556 }
9557 this._parentUpdated = true;
9558 }
9559 }
9560 }, {
9561 key: "_onTap",
9562 value: function _onTap(e) {
9563 var _this2 = this;
9564 if (!this.disabled && !e.ripple) {
9565 e.ripple = true;
9566 this._updateParent();
9567 this._rippleAnimation(e.gesture.srcEvent).then(function () {
9568 _this2._animator.fade(_this2._wave);
9569 _this2._animator.fade(_this2._background);
9570 });
9571 }
9572 }
9573 }, {
9574 key: "_onHold",
9575 value: function _onHold(e) {
9576 if (!this.disabled && !e.ripple) {
9577 e.ripple = true;
9578 this._updateParent();
9579 this._holding = this._rippleAnimation(e.gesture.srcEvent, 2000);
9580 document.addEventListener('release', this._onRelease);
9581 }
9582 }
9583 }, {
9584 key: "_onRelease",
9585 value: function _onRelease(e) {
9586 var _this3 = this;
9587 if (this._holding && !e.ripple) {
9588 e.ripple = true;
9589 this._holding.speed(300).then(function () {
9590 _this3._animator.stopAll({
9591 stopNext: true
9592 });
9593 _this3._animator.fade(_this3._wave);
9594 _this3._animator.fade(_this3._background);
9595 });
9596 this._holding = false;
9597 }
9598 document.removeEventListener('release', this._onRelease);
9599 }
9600 }, {
9601 key: "_onDragStart",
9602 value: function _onDragStart(e) {
9603 if (this._holding) {
9604 return this._onRelease(e);
9605 }
9606 if (['left', 'right'].indexOf(e.gesture.direction) != -1) {
9607 this._onTap(e);
9608 }
9609 }
9610 }, {
9611 key: "connectedCallback",
9612 value: function connectedCallback() {
9613 this._parentNode = this.parentNode;
9614 if (internal$1.config.animationsDisabled) {
9615 this.disabled = true;
9616 } else {
9617 this._parentNode.addEventListener('tap', this._onTap);
9618 this._parentNode.addEventListener('hold', this._onHold);
9619 this._parentNode.addEventListener('dragstart', this._onDragStart);
9620 }
9621 }
9622 }, {
9623 key: "disconnectedCallback",
9624 value: function disconnectedCallback() {
9625 var pn = this._parentNode || this.parentNode;
9626 pn.removeEventListener('tap', this._onTap);
9627 pn.removeEventListener('hold', this._onHold);
9628 pn.removeEventListener('dragstart', this._onDragStart);
9629 }
9630 }, {
9631 key: "attributeChangedCallback",
9632 value: function attributeChangedCallback(name, last, current) {
9633 var _this4 = this;
9634 switch (name) {
9635 case 'class':
9636 util$4.restoreClass(this, defaultClassName$h, scheme$u);
9637 break;
9638 case 'modifier':
9639 ModifierUtil.onModifierChanged(last, current, this, scheme$u);
9640 break;
9641 case 'start-radius':
9642 this._minR = Math.max(0, parseFloat(current) || 0);
9643 break;
9644 case 'color':
9645 if (current) {
9646 contentReady(this, function () {
9647 _this4._wave.style.background = current;
9648 if (!_this4.hasAttribute('background')) {
9649 _this4._background.style.background = current;
9650 }
9651 });
9652 }
9653 break;
9654 case 'background':
9655 if (current || last) {
9656 if (current === 'none') {
9657 contentReady(this, function () {
9658 _this4._background.setAttribute('disabled', 'disabled');
9659 _this4._background.style.background = 'transparent';
9660 });
9661 } else {
9662 contentReady(this, function () {
9663 if (_this4._background.hasAttribute('disabled')) {
9664 _this4._background.removeAttribute('disabled');
9665 }
9666 _this4._background.style.background = current;
9667 });
9668 }
9669 }
9670 break;
9671 case 'center':
9672 if (name === 'center') {
9673 this._center = current != null && current != 'false';
9674 }
9675 break;
9676 }
9677 }
9678
9679 /**
9680 * @property disabled
9681 * @type {Boolean}
9682 * @description
9683 * [en]Whether the element is disabled or not.[/en]
9684 * [ja]無効化されている場合に`true`。[/ja]
9685 */
9686 }], [{
9687 key: "observedAttributes",
9688 get: function get() {
9689 return ['start-radius', 'color', 'background', 'center', 'class', 'modifier'];
9690 }
9691 }]);
9692 return RippleElement;
9693 }(BaseElement);
9694 util$4.defineBooleanProperties(RippleElement, ['disabled', 'center']);
9695 onsElements.Ripple = RippleElement;
9696 customElements.define('ons-ripple', RippleElement);
9697
9698 var BaseButtonElement = /*#__PURE__*/function (_BaseElement) {
9699 _inherits(BaseButtonElement, _BaseElement);
9700 var _super = _createSuper(BaseButtonElement);
9701 function BaseButtonElement() {
9702 var _this;
9703 _classCallCheck(this, BaseButtonElement);
9704 _this = _super.call(this);
9705 if (_this.constructor === BaseButtonElement) {
9706 util$4.throwAbstract();
9707 }
9708 contentReady(_assertThisInitialized(_this), function () {
9709 return _this._compile();
9710 });
9711 return _this;
9712 }
9713 _createClass(BaseButtonElement, [{
9714 key: "_scheme",
9715 get: function get() {
9716 // eslint-disable-line getter-return
9717 util$4.throwMember();
9718 }
9719 }, {
9720 key: "_defaultClassName",
9721 get: function get() {
9722 // eslint-disable-line getter-return
9723 util$4.throwMember();
9724 }
9725 }, {
9726 key: "_rippleOpt",
9727 get: function get() {
9728 return [this];
9729 }
9730 }, {
9731 key: "_icon",
9732 get: function get() {
9733 return util$4.findChild(this, 'ons-icon');
9734 }
9735 }, {
9736 key: "_hiddenButton",
9737 get: function get() {
9738 return util$4.findChild(this, 'button');
9739 }
9740 }, {
9741 key: "_compile",
9742 value: function _compile() {
9743 autoStyle.prepare(this);
9744 this.classList.add(this._defaultClassName);
9745 if (!this._icon && this.hasAttribute('icon')) {
9746 util$4.checkMissingImport('Icon');
9747 var icon = util$4.createElement("<ons-icon icon=\"".concat(this.getAttribute('icon'), "\"></ons-icon>"));
9748 icon.classList.add(this._defaultClassName.replace('button', 'icon'));
9749 this.insertBefore(icon, this.firstChild);
9750 }
9751
9752 // Add hidden button to allow form submission
9753 if (!this._hiddenButton) {
9754 var button = util$4.createElement('<button hidden></button>');
9755 this.appendChild(button);
9756 }
9757 this._updateRipple();
9758 ModifierUtil.initModifier(this, this._scheme);
9759 }
9760 }, {
9761 key: "_updateIcon",
9762 value: function _updateIcon() {
9763 if (this._icon) {
9764 this._icon.setAttribute('icon', this.getAttribute('icon'));
9765 }
9766 }
9767 }, {
9768 key: "_updateRipple",
9769 value: function _updateRipple() {
9770 this._rippleOpt && util$4.updateRipple.apply(util$4, _toConsumableArray(this._rippleOpt));
9771 }
9772 }, {
9773 key: "attributeChangedCallback",
9774 value: function attributeChangedCallback(name, last, current) {
9775 switch (name) {
9776 case 'class':
9777 util$4.restoreClass(this, this._defaultClassName, this._scheme);
9778 break;
9779 case 'modifier':
9780 ModifierUtil.onModifierChanged(last, current, this, this._scheme);
9781 break;
9782 case 'icon':
9783 this._updateIcon();
9784 break;
9785 case 'ripple':
9786 this.classList.contains(this._defaultClassName) && this._updateRipple();
9787 break;
9788 }
9789 }
9790 }], [{
9791 key: "observedAttributes",
9792 get: function get() {
9793 return ['modifier', 'class', 'icon', 'ripple'];
9794 }
9795 }]);
9796 return BaseButtonElement;
9797 }(BaseElement);
9798 util$4.defineBooleanProperties(BaseButtonElement, ['ripple', 'disabled']);
9799
9800 /**
9801 * @element ons-action-sheet-button
9802 * @category dialog
9803 * @modifier destructive
9804 * [en]Shows a "destructive" button (only for iOS).[/en]
9805 * [ja]"destructive"なボタンを表示します(iOSでのみ有効)。[/ja]
9806 * @description
9807 * [en]Component that represent each button of the action sheet.[/en]
9808 * [ja]アクションシートに表示される各ボタンを表現するコンポーネントです。[/ja]
9809 * @seealso ons-action-sheet
9810 * [en]The `<ons-action-sheet>` component[/en]
9811 * [ja]ons-action-sheetコンポーネント[/ja]
9812 * @seealso ons-list-item
9813 * [en]The `<ons-list-item>` component[/en]
9814 * [ja]ons-list-itemコンポーネント[/ja]
9815 * @seealso ons-icon
9816 * [en]The `<ons-icon>` component[/en]
9817 * [ja]ons-iconコンポーネント[/ja]
9818 * @tutorial vanilla/Reference/action-sheet
9819 * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
9820 * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
9821 * @modifier material
9822 * [en]Display a Material Design action sheet button.[/en]
9823 * [ja]マテリアルデザインのアクションシート用のボタンを表示します。[/ja]
9824 * @example
9825 * <ons-action-sheet id="sheet">
9826 * <ons-action-sheet-button>Label</ons-action-sheet-button>
9827 * <ons-action-sheet-button>Label</ons-action-sheet-button>
9828 * </ons-action-sheet>
9829 *
9830 * <script>
9831 * document.getElementById('sheet').show();
9832 * </script>
9833 */
9834 var ActionSheetButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
9835 _inherits(ActionSheetButtonElement, _BaseButtonElement);
9836 var _super = _createSuper(ActionSheetButtonElement);
9837 function ActionSheetButtonElement() {
9838 _classCallCheck(this, ActionSheetButtonElement);
9839 return _super.apply(this, arguments);
9840 }
9841 _createClass(ActionSheetButtonElement, [{
9842 key: "_scheme",
9843 get:
9844 /**
9845 * @attribute icon
9846 * @type {String}
9847 * @description
9848 * [en]Creates an `ons-icon` component with this string. Only visible on Android. Check [See also](#seealso) section for more information.[/en]
9849 * [ja]`ons-icon`コンポーネントを悪性します。Androidでのみ表示されます。[/ja]
9850 */
9851
9852 /**
9853 * @attribute modifier
9854 * @type {String}
9855 * @description
9856 * [en]The appearance of the action sheet button.[/en]
9857 * [ja]アクションシートボタンの見た目を設定します。[/ja]
9858 */
9859
9860 function get() {
9861 return {
9862 '': 'action-sheet-button--*',
9863 '.action-sheet-icon': 'action-sheet-icon--*'
9864 };
9865 }
9866 }, {
9867 key: "_defaultClassName",
9868 get: function get() {
9869 return 'action-sheet-button';
9870 }
9871 }, {
9872 key: "_rippleOpt",
9873 get: function get() {
9874 return undefined;
9875 }
9876 }]);
9877 return ActionSheetButtonElement;
9878 }(BaseButtonElement);
9879 onsElements.ActionSheetButton = ActionSheetButtonElement;
9880 customElements.define('ons-action-sheet-button', ActionSheetButtonElement);
9881
9882 var AlertDialogAnimator = /*#__PURE__*/function (_BaseAnimator) {
9883 _inherits(AlertDialogAnimator, _BaseAnimator);
9884 var _super = _createSuper(AlertDialogAnimator);
9885 function AlertDialogAnimator() {
9886 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
9887 _ref$timing = _ref.timing,
9888 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
9889 _ref$delay = _ref.delay,
9890 delay = _ref$delay === void 0 ? 0 : _ref$delay,
9891 _ref$duration = _ref.duration,
9892 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
9893 _classCallCheck(this, AlertDialogAnimator);
9894 return _super.call(this, {
9895 timing: timing,
9896 delay: delay,
9897 duration: duration
9898 });
9899 }
9900
9901 /**
9902 * @param {HTMLElement} dialog
9903 * @param {Function} done
9904 */
9905 _createClass(AlertDialogAnimator, [{
9906 key: "show",
9907 value: function show(dialog, done) {
9908 done();
9909 }
9910
9911 /**
9912 * @param {HTMLElement} dialog
9913 * @param {Function} done
9914 */
9915 }, {
9916 key: "hide",
9917 value: function hide(dialog, done) {
9918 done();
9919 }
9920 }]);
9921 return AlertDialogAnimator;
9922 }(BaseAnimator);
9923
9924 /**
9925 * Android style animator for alert dialog.
9926 */
9927 var AndroidAlertDialogAnimator = /*#__PURE__*/function (_AlertDialogAnimator) {
9928 _inherits(AndroidAlertDialogAnimator, _AlertDialogAnimator);
9929 var _super2 = _createSuper(AndroidAlertDialogAnimator);
9930 function AndroidAlertDialogAnimator() {
9931 var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
9932 _ref2$timing = _ref2.timing,
9933 timing = _ref2$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref2$timing,
9934 _ref2$duration = _ref2.duration,
9935 duration = _ref2$duration === void 0 ? 0.2 : _ref2$duration,
9936 _ref2$delay = _ref2.delay,
9937 delay = _ref2$delay === void 0 ? 0 : _ref2$delay;
9938 _classCallCheck(this, AndroidAlertDialogAnimator);
9939 return _super2.call(this, {
9940 duration: duration,
9941 timing: timing,
9942 delay: delay
9943 });
9944 }
9945
9946 /**
9947 * @param {Object} dialog
9948 * @param {Function} callback
9949 */
9950 _createClass(AndroidAlertDialogAnimator, [{
9951 key: "show",
9952 value: function show(dialog, callback) {
9953 callback = callback ? callback : function () {};
9954 Animit.runAll(Animit(dialog._mask, this.def).default({
9955 opacity: 0
9956 }, {
9957 opacity: 1
9958 }), Animit(dialog._dialog, this.def).default({
9959 transform: 'translate3d(-50%, -50%, 0) scale3d(.9, .9, 1)',
9960 opacity: 0
9961 }, {
9962 transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
9963 opacity: 1
9964 }).queue(function (done) {
9965 callback();
9966 done();
9967 }));
9968 }
9969
9970 /**
9971 * @param {Object} dialog
9972 * @param {Function} callback
9973 */
9974 }, {
9975 key: "hide",
9976 value: function hide(dialog, callback) {
9977 callback = callback ? callback : function () {};
9978 Animit.runAll(Animit(dialog._mask, this.def).default({
9979 opacity: 1
9980 }, {
9981 opacity: 0
9982 }), Animit(dialog._dialog, this.def).default({
9983 transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
9984 opacity: 1
9985 }, {
9986 transform: 'translate3d(-50%, -50%, 0) scale3d(.9, .9, 1)',
9987 opacity: 0
9988 }).queue(function (done) {
9989 callback();
9990 done();
9991 }));
9992 }
9993 }]);
9994 return AndroidAlertDialogAnimator;
9995 }(AlertDialogAnimator);
9996
9997 /**
9998 * iOS style animator for alert dialog.
9999 */
10000 var IOSAlertDialogAnimator = /*#__PURE__*/function (_AlertDialogAnimator2) {
10001 _inherits(IOSAlertDialogAnimator, _AlertDialogAnimator2);
10002 var _super3 = _createSuper(IOSAlertDialogAnimator);
10003 function IOSAlertDialogAnimator() {
10004 var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
10005 _ref3$timing = _ref3.timing,
10006 timing = _ref3$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref3$timing,
10007 _ref3$duration = _ref3.duration,
10008 duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration,
10009 _ref3$delay = _ref3.delay,
10010 delay = _ref3$delay === void 0 ? 0 : _ref3$delay;
10011 _classCallCheck(this, IOSAlertDialogAnimator);
10012 return _super3.call(this, {
10013 duration: duration,
10014 timing: timing,
10015 delay: delay
10016 });
10017 }
10018
10019 /*
10020 * @param {Object} dialog
10021 * @param {Function} callback
10022 */
10023 _createClass(IOSAlertDialogAnimator, [{
10024 key: "show",
10025 value: function show(dialog, callback) {
10026 callback = callback ? callback : function () {};
10027 Animit.runAll(Animit(dialog._mask, this.def).default({
10028 opacity: 0
10029 }, {
10030 opacity: 1
10031 }), Animit(dialog._dialog, this.def).default({
10032 transform: 'translate3d(-50%, -50%, 0) scale3d(1.3, 1.3, 1)',
10033 opacity: 0
10034 }, {
10035 transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
10036 opacity: 1
10037 }).queue(function (done) {
10038 callback();
10039 done();
10040 }));
10041 }
10042
10043 /**
10044 * @param {Object} dialog
10045 * @param {Function} callback
10046 */
10047 }, {
10048 key: "hide",
10049 value: function hide(dialog, callback) {
10050 callback = callback ? callback : function () {};
10051 Animit.runAll(Animit(dialog._mask, this.def).default({
10052 opacity: 1
10053 }, {
10054 opacity: 0
10055 }), Animit(dialog._dialog, this.def).default({
10056 opacity: 1
10057 }, {
10058 opacity: 0
10059 }).queue(function (done) {
10060 callback();
10061 done();
10062 }));
10063 }
10064 }]);
10065 return IOSAlertDialogAnimator;
10066 }(AlertDialogAnimator);
10067
10068 var scheme$t = {
10069 '.alert-dialog': 'alert-dialog--*',
10070 '.alert-dialog-container': 'alert-dialog-container--*',
10071 '.alert-dialog-title': 'alert-dialog-title--*',
10072 '.alert-dialog-content': 'alert-dialog-content--*',
10073 '.alert-dialog-footer': 'alert-dialog-footer--*',
10074 '.alert-dialog-footer--rowfooter': 'alert-dialog-footer--rowfooter--*',
10075 '.alert-dialog-button--rowfooter': 'alert-dialog-button--rowfooter--*',
10076 '.alert-dialog-button--primal': 'alert-dialog-button--primal--*',
10077 '.alert-dialog-button': 'alert-dialog-button--*',
10078 'ons-alert-dialog-button': 'alert-dialog-button--*',
10079 '.alert-dialog-mask': 'alert-dialog-mask--*',
10080 '.text-input': 'text-input--*'
10081 };
10082 var _animatorDict$7 = {
10083 'none': AlertDialogAnimator,
10084 'default': function _default() {
10085 return platform.isAndroid() ? AndroidAlertDialogAnimator : IOSAlertDialogAnimator;
10086 },
10087 'fade': function fade() {
10088 return platform.isAndroid() ? AndroidAlertDialogAnimator : IOSAlertDialogAnimator;
10089 }
10090 };
10091
10092 /**
10093 * @element ons-alert-dialog
10094 * @category dialog
10095 * @description
10096 * [en]
10097 * 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.
10098 *
10099 * 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.
10100 * [/en]
10101 * [ja]
10102 * 現在のスクリーンの上に表示するアラートダイアログです。ユーザに対する問いかけ、警告、エラーメッセージを表示するのに利用できます。タイトルやコンテンツやボタンは簡単にカスタマイズでき、実行しているプラットフォームに併せてスタイルが自動的に切り替わります。
10103 * [/ja]
10104 * @codepen Qwwxyp
10105 * @tutorial vanilla/Reference/alert-dialog
10106 * @modifier material
10107 * [en]Material Design style[/en]
10108 * [ja]マテリアルデザインのスタイル[/ja]
10109 * @modifier rowfooter
10110 * [en]Horizontally aligns the footer buttons.[/en]
10111 * [ja]フッターの複数のボタンを水平に配置[/ja]
10112 * @seealso ons-dialog
10113 * [en]ons-dialog component[/en]
10114 * [ja]ons-dialogコンポーネント[/ja]
10115 * @seealso ons-popover
10116 * [en]ons-popover component[/en]
10117 * [ja]ons-dialogコンポーネント[/ja]
10118 * @seealso ons.notification
10119 * [en]Using ons.notification utility functions.[/en]
10120 * [ja]アラートダイアログを表示するには、ons.notificationオブジェクトのメソッドを使うこともできます。[/ja]
10121 * @example
10122 * <ons-alert-dialog id="alert-dialog">
10123 * <div class="alert-dialog-title">Warning!</div>
10124 * <div class="alert-dialog-content">
10125 * An error has occurred!
10126 * </div>
10127 * <div class="alert-dialog-footer">
10128 * <button id="alert-dialog-button" class="alert-dialog-button">OK</button>
10129 * </div>
10130 * </ons-alert-dialog>
10131 * <script>
10132 * document.getElementById('alert-dialog').show();
10133 * </script>
10134 */
10135 var AlertDialogElement = /*#__PURE__*/function (_BaseDialogElement) {
10136 _inherits(AlertDialogElement, _BaseDialogElement);
10137 var _super = _createSuper(AlertDialogElement);
10138 /**
10139 * @event preshow
10140 * @description
10141 * [en]Fired just before the alert dialog is displayed.[/en]
10142 * [ja]アラートダイアログが表示される直前に発火します。[/ja]
10143 * @param {Object} event [en]Event object.[/en]
10144 * @param {Object} event.alertDialog
10145 * [en]Alert dialog object.[/en]
10146 * [ja]アラートダイアログのオブジェクト。[/ja]
10147 * @param {Function} event.cancel
10148 * [en]Execute to stop the dialog from showing.[/en]
10149 * [ja]この関数を実行すると、アラートダイアログの表示を止めます。[/ja]
10150 */
10151
10152 /**
10153 * @event postshow
10154 * @description
10155 * [en]Fired just after the alert dialog is displayed.[/en]
10156 * [ja]アラートダイアログが表示された直後に発火します。[/ja]
10157 * @param {Object} event [en]Event object.[/en]
10158 * @param {Object} event.alertDialog
10159 * [en]Alert dialog object.[/en]
10160 * [ja]アラートダイアログのオブジェクト。[/ja]
10161 */
10162
10163 /**
10164 * @event prehide
10165 * @description
10166 * [en]Fired just before the alert dialog is hidden.[/en]
10167 * [ja]アラートダイアログが隠れる直前に発火します。[/ja]
10168 * @param {Object} event [en]Event object.[/en]
10169 * @param {Object} event.alertDialog
10170 * [en]Alert dialog object.[/en]
10171 * [ja]アラートダイアログのオブジェクト。[/ja]
10172 * @param {Function} event.cancel
10173 * [en]Execute to stop the dialog from hiding.[/en]
10174 * [ja]この関数を実行すると、アラートダイアログが閉じようとするのを止めます。[/ja]
10175 */
10176
10177 /**
10178 * @event posthide
10179 * @description
10180 * [en]Fired just after the alert dialog is hidden.[/en]
10181 * [ja]アラートダイアログが隠れた後に発火します。[/ja]
10182 * @param {Object} event [en]Event object.[/en]
10183 * @param {Object} event.alertDialog
10184 * [en]Alert dialog object.[/en]
10185 * [ja]アラートダイアログのオブジェクト。[/ja]
10186 */
10187
10188 /**
10189 * @event dialogcancel
10190 * @description
10191 * [en]Fired when the dialog is canceled.[/en]
10192 * [ja][/ja]
10193 */
10194
10195 /**
10196 * @attribute modifier
10197 * @type {String}
10198 * @description
10199 * [en]The appearance of the dialog.[/en]
10200 * [ja]ダイアログの見た目を指定します。[/ja]
10201 */
10202
10203 /**
10204 * @attribute cancelable
10205 * @description
10206 * [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]
10207 * [ja]この属性を設定すると、ダイアログの背景をタップしたりAndroidデバイスのバックボタンを押すとダイアログが閉じるようになります。[/ja]
10208 */
10209
10210 /**
10211 * @attribute disabled
10212 * @description
10213 * [en]If this attribute is set the dialog is disabled.[/en]
10214 * [ja]この属性がある時、アラートダイアログはdisabled状態になります。[/ja]
10215 */
10216
10217 /**
10218 * @attribute animation
10219 * @type {String}
10220 * @default default
10221 * @description
10222 * [en]The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.[/en]
10223 * [ja]ダイアログを表示する際のアニメーション名を指定します。デフォルトでは"none"か"default"が指定できます。[/ja]
10224 */
10225
10226 /**
10227 * @attribute animation-options
10228 * @type {Expression}
10229 * @description
10230 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
10231 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
10232 */
10233
10234 /**
10235 * @attribute mask-color
10236 * @type {String}
10237 * @default rgba(0, 0, 0, 0.2)
10238 * @description
10239 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
10240 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
10241 */
10242
10243 /**
10244 * @attribute visible
10245 * @type {Boolean}
10246 * @description
10247 * [en]Whether the alert dialog is visible or not.[/en]
10248 * [ja]要素が見える場合に`true`。[/ja]
10249 */
10250
10251 function AlertDialogElement() {
10252 var _this;
10253 _classCallCheck(this, AlertDialogElement);
10254 _this = _super.call(this);
10255 contentReady(_assertThisInitialized(_this), function () {
10256 return _this._compile();
10257 });
10258 return _this;
10259 }
10260 _createClass(AlertDialogElement, [{
10261 key: "_scheme",
10262 get: function get() {
10263 return scheme$t;
10264 }
10265
10266 /**
10267 * @return {Element}
10268 */
10269 }, {
10270 key: "_mask",
10271 get: function get() {
10272 return util$4.findChild(this, '.alert-dialog-mask');
10273 }
10274
10275 /**
10276 * @return {Element}
10277 */
10278 }, {
10279 key: "_dialog",
10280 get: function get() {
10281 return util$4.findChild(this, '.alert-dialog');
10282 }
10283
10284 /**
10285 * @return {Element}
10286 */
10287 }, {
10288 key: "_titleElement",
10289 get: function get() {
10290 return util$4.findChild(this._dialog.children[0], '.alert-dialog-title');
10291 }
10292
10293 /**
10294 * @return {Element}
10295 */
10296 }, {
10297 key: "_contentElement",
10298 get: function get() {
10299 return util$4.findChild(this._dialog.children[0], '.alert-dialog-content');
10300 }
10301 }, {
10302 key: "_updateAnimatorFactory",
10303 value: function _updateAnimatorFactory() {
10304 return new AnimatorFactory({
10305 animators: _animatorDict$7,
10306 baseClass: AlertDialogAnimator,
10307 baseClassName: 'AlertDialogAnimator',
10308 defaultAnimation: this.getAttribute('animation')
10309 });
10310 }
10311 }, {
10312 key: "_compile",
10313 value: function _compile() {
10314 autoStyle.prepare(this);
10315 this.style.display = 'none';
10316 this.style.zIndex = 10001;
10317
10318 /**
10319 * Expected result after compile:
10320 *
10321 * <ons-alert-dialog style="none">
10322 * <div class="alert-dialog-mask"></div>
10323 * <div class="alert-dialog">
10324 * <div class="alert-dialog-container">...</div>
10325 * </div>
10326 * </ons-alert-dialog>
10327 */
10328
10329 var content = document.createDocumentFragment();
10330 if (!this._mask && !this._dialog) {
10331 while (this.firstChild) {
10332 content.appendChild(this.firstChild);
10333 }
10334 }
10335 if (!this._mask) {
10336 var mask = document.createElement('div');
10337 mask.classList.add('alert-dialog-mask');
10338 this.insertBefore(mask, this.children[0]);
10339 }
10340 if (!this._dialog) {
10341 var dialog = document.createElement('div');
10342 dialog.classList.add('alert-dialog');
10343 this.insertBefore(dialog, null);
10344 }
10345 if (!util$4.findChild(this._dialog, '.alert-dialog-container')) {
10346 var container = document.createElement('div');
10347 container.classList.add('alert-dialog-container');
10348 this._dialog.appendChild(container);
10349 }
10350 this._dialog.children[0].appendChild(content);
10351 this._dialog.style.zIndex = 20001;
10352 this._mask.style.zIndex = 20000;
10353 ModifierUtil.initModifier(this, this._scheme);
10354 }
10355
10356 /**
10357 * @property disabled
10358 * @type {Boolean}
10359 * @description
10360 * [en]Whether the element is disabled or not.[/en]
10361 * [ja]無効化されている場合に`true`。[/ja]
10362 */
10363
10364 /**
10365 * @property cancelable
10366 * @type {Boolean}
10367 * @description
10368 * [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]
10369 * [ja]そのダイアログがキャンセル可能かどうかを表します。キャンセル可能なダイアログは、背景をタップするかAndroidデバイスのバックボタンを押すことで閉じることが出来るようになります。[/ja]
10370 */
10371
10372 /**
10373 * @property maskColor
10374 * @type {String}
10375 * @default rgba(0, 0, 0, 0.2)
10376 * @description
10377 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
10378 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
10379 */
10380
10381 /**
10382 * @method show
10383 * @signature show([options])
10384 * @param {Object} [options]
10385 * [en]Parameter object.[/en]
10386 * [ja]オプションを指定するオブジェクトです。[/ja]
10387 * @param {String} [options.animation]
10388 * [en]Animation name. Available animations are `"fade"` and `"none"`.[/en]
10389 * [ja]アニメーション名を指定します。指定できるのは、"fade", "none"のいずれかです。[/ja]
10390 * @param {String} [options.animationOptions]
10391 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
10392 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code> [/ja]
10393 * @param {Function} [options.callback]
10394 * [en]Function to execute after the dialog has been revealed.[/en]
10395 * [ja]ダイアログが表示され終わった時に呼び出されるコールバックを指定します。[/ja]
10396 * @description
10397 * [en]Show the alert dialog.[/en]
10398 * [ja]ダイアログを表示します。[/ja]
10399 * @return {Promise}
10400 * [en]A `Promise` object that resolves to the displayed element.[/en]
10401 * [ja]表示される要素を解決する`Promise`オブジェクトを返します。[/ja]
10402 */
10403
10404 /**
10405 * @method hide
10406 * @signature hide([options])
10407 * @param {Object} [options]
10408 * [en]Parameter object.[/en]
10409 * [ja]オプションを指定するオブジェクト。[/ja]
10410 * @param {String} [options.animation]
10411 * [en]Animation name. Available animations are `"fade"` and `"none"`.[/en]
10412 * [ja]アニメーション名を指定します。"fade", "none"のいずれかを指定します。[/ja]
10413 * @param {String} [options.animationOptions]
10414 * [en]Specify the animation's duration, delay and timing. E.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code>[/en]
10415 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code> [/ja]
10416 * @param {Function} [options.callback]
10417 * [en]Function to execute after the dialog has been hidden.[/en]
10418 * [ja]このダイアログが閉じた時に呼び出されるコールバックを指定します。[/ja]
10419 * @description
10420 * [en]Hide the alert dialog.[/en]
10421 * [ja]ダイアログを閉じます。[/ja]
10422 * @return {Promise}
10423 * [en]Resolves to the hidden element[/en]
10424 * [ja]隠れた要素を解決する`Promise`オブジェクトを返します。[/ja]
10425 */
10426
10427 /**
10428 * @property visible
10429 * @type {Boolean}
10430 * @description
10431 * [en]Whether the dialog is visible or not.[/en]
10432 * [ja]要素が見える場合に`true`。[/ja]
10433 */
10434
10435 /**
10436 * @property onDeviceBackButton
10437 * @type {Object}
10438 * @description
10439 * [en]Back-button handler.[/en]
10440 * [ja]バックボタンハンドラ。[/ja]
10441 */
10442
10443 /**
10444 * @property animationOptions
10445 * @type {Object}
10446 * @description
10447 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
10448 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
10449 */
10450
10451 /**
10452 * @param {String} name
10453 * @param {DialogAnimator} Animator
10454 */
10455 }], [{
10456 key: "registerAnimator",
10457 value: function registerAnimator(name, Animator) {
10458 if (!(Animator.prototype instanceof AlertDialogAnimator)) {
10459 util$4.throwAnimator('AlertDialog');
10460 }
10461 _animatorDict$7[name] = Animator;
10462 }
10463 }, {
10464 key: "animators",
10465 get: function get() {
10466 return _animatorDict$7;
10467 }
10468 }, {
10469 key: "AlertDialogAnimator",
10470 get: function get() {
10471 return AlertDialogAnimator;
10472 }
10473 }]);
10474 return AlertDialogElement;
10475 }(BaseDialogElement);
10476 onsElements.AlertDialog = AlertDialogElement;
10477 customElements.define('ons-alert-dialog', AlertDialogElement);
10478
10479 /**
10480 * @element ons-alert-dialog-button
10481 * @modifier material
10482 * [en]Material Design alert-dialog button.[/en]
10483 * [ja]マテリアルデザインのボタンを表示します。[/ja]
10484 * @description
10485 * [en][/en]
10486 * [ja][/ja]
10487 * @seealso ons-alert-dialog
10488 * [en]The `<ons-alert-dialog>` component displays a alert dialog.[/en]
10489 * [ja]ons-alert-dialogコンポーネント[/ja]
10490 * @example
10491 * <ons-alert-dialog>
10492 * <div class="alert-dialog-title">Warning!</div>
10493 * <div class="alert-dialog-content">
10494 * An error has occurred!
10495 * </div>
10496 * <div class="alert-dialog-footer">
10497 * <alert-dialog-button onclick="app.close()">Cancel</alert-dialog-button>
10498 * <alert-dialog-button class="alert-dialog-button" onclick="app.close()">OK</alert-dialog-button>
10499 * </div>
10500 * </ons-alert-dialog>
10501 */
10502 var AlertDialogButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
10503 _inherits(AlertDialogButtonElement, _BaseButtonElement);
10504 var _super = _createSuper(AlertDialogButtonElement);
10505 function AlertDialogButtonElement() {
10506 _classCallCheck(this, AlertDialogButtonElement);
10507 return _super.apply(this, arguments);
10508 }
10509 _createClass(AlertDialogButtonElement, [{
10510 key: "_scheme",
10511 get:
10512 /**
10513 * @attribute modifier
10514 * @type {String}
10515 * @description
10516 * [en]The appearance of the button.[/en]
10517 * [ja]ボタンの表現を指定します。[/ja]
10518 */
10519
10520 /**
10521 * @attribute disabled
10522 * @description
10523 * [en]Specify if button should be disabled.[/en]
10524 * [ja]ボタンを無効化する場合は指定してください。[/ja]
10525 */
10526
10527 /**
10528 * @property disabled
10529 * @type {Boolean}
10530 * @description
10531 * [en]Whether the element is disabled or not.[/en]
10532 * [ja]無効化されている場合に`true`。[/ja]
10533 */
10534
10535 function get() {
10536 return {
10537 '': 'alert-dialog-button--*'
10538 };
10539 }
10540 }, {
10541 key: "_defaultClassName",
10542 get: function get() {
10543 return 'alert-dialog-button';
10544 }
10545 }, {
10546 key: "_rippleOpt",
10547 get: function get() {
10548 return [this, undefined, {
10549 'modifier': 'light-gray'
10550 }];
10551 }
10552 }]);
10553 return AlertDialogButtonElement;
10554 }(BaseButtonElement);
10555 onsElements.AlertDialogButton = AlertDialogButtonElement;
10556 customElements.define('ons-alert-dialog-button', AlertDialogButtonElement);
10557
10558 var defaultClassName$g = 'back-button';
10559 var scheme$s = {
10560 '': 'back-button--*',
10561 '.back-button__icon': 'back-button--*__icon',
10562 '.back-button__label': 'back-button--*__label'
10563 };
10564
10565 // original image file at misc/images/ios-back-button-icon.svg
10566 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";
10567
10568 // original image file at misc/images/md-back-button-icon.svg
10569 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";
10570
10571 /**
10572 * @element ons-back-button
10573 * @category navigation
10574 * @description
10575 * [en]
10576 * Back button component for `<ons-toolbar>`. Put it in the left part of the `<ons-toolbar>`.
10577 *
10578 * 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.
10579 * [/en]
10580 * [ja][/ja]
10581 * @codepen aHmGL
10582 * @tutorial vanilla/Reference/back-button
10583 * @modifier material
10584 * [en]Material Design style[/en]
10585 * [ja][/ja]
10586 * @seealso ons-toolbar
10587 * [en]ons-toolbar component[/en]
10588 * [ja]ons-toolbarコンポーネント[/ja]
10589 * @seealso ons-navigator
10590 * [en]ons-navigator component[/en]
10591 * [ja]ons-navigatorコンポーネント[/ja]
10592 * @example
10593 * <ons-toolbar>
10594 * <div class="left">
10595 * <ons-back-button>Back</ons-back-button>
10596 * </div>
10597 * <div class="center">
10598 * Title
10599 * <div>
10600 * </ons-toolbar>
10601 */
10602 var BackButtonElement = /*#__PURE__*/function (_BaseElement) {
10603 _inherits(BackButtonElement, _BaseElement);
10604 var _super = _createSuper(BackButtonElement);
10605 /**
10606 * @attribute modifier
10607 * @type {String}
10608 * @description
10609 * [en]The appearance of the back button.[/en]
10610 * [ja]バックボタンの見た目を指定します。[/ja]
10611 */
10612
10613 function BackButtonElement() {
10614 var _this;
10615 _classCallCheck(this, BackButtonElement);
10616 _this = _super.call(this);
10617 contentReady(_assertThisInitialized(_this), function () {
10618 _this._compile();
10619 });
10620 _this._options = {};
10621 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
10622 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
10623 onConnected = _util$defineListenerP.onConnected,
10624 onDisconnected = _util$defineListenerP.onDisconnected;
10625 _this._connectOnClick = onConnected;
10626 _this._disconnectOnClick = onDisconnected;
10627 return _this;
10628 }
10629 _createClass(BackButtonElement, [{
10630 key: "_updateIcon",
10631 value: function _updateIcon() {
10632 var icon = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : util$4.findChild(this, '.back-button__icon');
10633 icon.innerHTML = autoStyle.getPlatform(this) === 'android' || util$4.hasModifier(this, 'material') ? mdBackButtonIcon : iosBackButtonIcon;
10634 }
10635 }, {
10636 key: "_compile",
10637 value: function _compile() {
10638 autoStyle.prepare(this);
10639 this.classList.add(defaultClassName$g);
10640 if (!util$4.findChild(this, '.back-button__label')) {
10641 var label = util$4.create('span.back-button__label');
10642 while (this.childNodes[0]) {
10643 label.appendChild(this.childNodes[0]);
10644 }
10645 this.appendChild(label);
10646 }
10647 if (!util$4.findChild(this, '.back-button__icon')) {
10648 var icon = util$4.create('span.back-button__icon');
10649 this._updateIcon(icon);
10650 this.insertBefore(icon, this.children[0]);
10651 }
10652 util$4.updateRipple(this, undefined, {
10653 center: '',
10654 'size': 'contain',
10655 'background': 'transparent'
10656 });
10657 ModifierUtil.initModifier(this, scheme$s);
10658 }
10659
10660 /**
10661 * @property options
10662 * @type {Object}
10663 * @description
10664 * [en]Options object.[/en]
10665 * [ja]オプションを指定するオブジェクト。[/ja]
10666 */
10667
10668 /**
10669 * @property options.animation
10670 * @type {String}
10671 * @description
10672 * [en]Animation name. Available animations are "slide", "lift", "fade" and "none".
10673 * These are platform based animations. For fixed animations, add "-ios" or "-md"
10674 * suffix to the animation name. E.g. "lift-ios", "lift-md". Defaults values are "slide-ios" and "fade-md".
10675 * [/en]
10676 * [ja][/ja]
10677 */
10678
10679 /**
10680 * @property options.animationOptions
10681 * @type {String}
10682 * @description
10683 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/en]
10684 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
10685 */
10686
10687 /**
10688 * @property options.callback
10689 * @type {String}
10690 * @description
10691 * [en]Function that is called when the transition has ended.[/en]
10692 * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
10693 */
10694 }, {
10695 key: "options",
10696 get: function get() {
10697 return this._options;
10698 },
10699 set: function set(object) {
10700 this._options = object;
10701 }
10702
10703 /**
10704 * @property onClick
10705 * @type {Function}
10706 * @description
10707 * [en]Used to override the default back button behavior.[/en]
10708 * [ja][/ja]
10709 */
10710 }, {
10711 key: "_onClick",
10712 value: function _onClick(event) {
10713 var _this2 = this;
10714 setTimeout(function () {
10715 if (!event.defaultPrevented) {
10716 var navigator = util$4.findParent(_this2, 'ons-navigator');
10717 if (navigator) {
10718 navigator.popPage(_objectSpread2(_objectSpread2({}, _this2.options), {}, {
10719 onsBackButton: true
10720 }));
10721 }
10722 }
10723 });
10724 }
10725 }, {
10726 key: "connectedCallback",
10727 value: function connectedCallback() {
10728 this.addEventListener('click', this._boundOnClick, false);
10729 this._connectOnClick();
10730 }
10731 }, {
10732 key: "attributeChangedCallback",
10733 value: function attributeChangedCallback(name, last, current) {
10734 switch (name) {
10735 case 'class':
10736 util$4.restoreClass(this, defaultClassName$g, scheme$s);
10737 break;
10738 case 'modifier':
10739 {
10740 ModifierUtil.onModifierChanged(last, current, this, scheme$s) && this._updateIcon();
10741 break;
10742 }
10743 }
10744 }
10745 }, {
10746 key: "disconnectedCallback",
10747 value: function disconnectedCallback() {
10748 this.removeEventListener('click', this._boundOnClick, false);
10749 this._disconnectOnClick();
10750 }
10751 }, {
10752 key: "show",
10753 value: function show() {
10754 this.style.display = 'inline-block';
10755 }
10756 }, {
10757 key: "hide",
10758 value: function hide() {
10759 this.style.display = 'none';
10760 }
10761 }], [{
10762 key: "observedAttributes",
10763 get: function get() {
10764 return ['modifier', 'class'];
10765 }
10766 }]);
10767 return BackButtonElement;
10768 }(BaseElement);
10769 onsElements.BackButton = BackButtonElement;
10770 customElements.define('ons-back-button', BackButtonElement);
10771
10772 var defaultClassName$f = 'bottom-bar';
10773 var scheme$r = {
10774 '': 'bottom-bar--*'
10775 };
10776
10777 /**
10778 * @element ons-bottom-toolbar
10779 * @category page
10780 * @description
10781 * [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]
10782 * [ja]ページ下部に配置されるツールバー用コンポーネントです。[/ja]
10783 * @modifier transparent
10784 * [en]Make the toolbar transparent.[/en]
10785 * [ja]ツールバーの背景を透明にして表示します。[/ja]
10786 * @modifier aligned
10787 * [en]Vertically aligns its children and applies flexbox for block elements. `justify-content` CSS rule can be used to change horizontal align.[/en]
10788 * [ja]ツールバーの背景を透明にして表示します。[/ja]
10789 * @seealso ons-toolbar [en]ons-toolbar component[/en][ja]ons-toolbarコンポーネント[/ja]
10790 * @example
10791 * <ons-bottom-toolbar>
10792 * Content
10793 * </ons-bottom-toolbar>
10794 */
10795 var BottomToolbarElement = /*#__PURE__*/function (_BaseElement) {
10796 _inherits(BottomToolbarElement, _BaseElement);
10797 var _super = _createSuper(BottomToolbarElement);
10798 /**
10799 * @attribute modifier
10800 * @type {String}
10801 * @description
10802 * [en]The appearance of the toolbar.[/en]
10803 * [ja]ツールバーの見た目の表現を指定します。[/ja]
10804 */
10805
10806 function BottomToolbarElement() {
10807 var _this;
10808 _classCallCheck(this, BottomToolbarElement);
10809 _this = _super.call(this);
10810 _this.classList.add(defaultClassName$f);
10811 ModifierUtil.initModifier(_assertThisInitialized(_this), scheme$r);
10812 return _this;
10813 }
10814 _createClass(BottomToolbarElement, [{
10815 key: "attributeChangedCallback",
10816 value: function attributeChangedCallback(name, last, current) {
10817 switch (name) {
10818 case 'class':
10819 util$4.restoreClass(this, defaultClassName$f, scheme$r);
10820 break;
10821 case 'modifier':
10822 ModifierUtil.onModifierChanged(last, current, this, scheme$r);
10823 break;
10824 }
10825 }
10826 }], [{
10827 key: "observedAttributes",
10828 get: function get() {
10829 return ['modifier', 'class'];
10830 }
10831 }]);
10832 return BottomToolbarElement;
10833 }(BaseElement);
10834 onsElements.BottomToolbar = BottomToolbarElement;
10835 customElements.define('ons-bottom-toolbar', BottomToolbarElement);
10836
10837 /**
10838 * @element ons-button
10839 * @category form
10840 * @modifier outline
10841 * [en]Button with outline and transparent background[/en]
10842 * [ja]アウトラインを持ったボタンを表示します。[/ja]
10843 * @modifier light
10844 * [en]Button that doesn't stand out.[/en]
10845 * [ja]目立たないボタンを表示します。[/ja]
10846 * @modifier quiet
10847 * [en]Button with no outline and or background..[/en]
10848 * [ja]枠線や背景が無い文字だけのボタンを表示します。[/ja]
10849 * @modifier cta
10850 * [en]Button that really stands out.[/en]
10851 * [ja]目立つボタンを表示します。[/ja]
10852 * @modifier large
10853 * [en]Large button that covers the width of the screen.[/en]
10854 * [ja]横いっぱいに広がる大きなボタンを表示します。[/ja]
10855 * @modifier large--quiet
10856 * [en]Large quiet button.[/en]
10857 * [ja]横いっぱいに広がるquietボタンを表示します。[/ja]
10858 * @modifier large--cta
10859 * [en]Large call to action button.[/en]
10860 * [ja]横いっぱいに広がるctaボタンを表示します。[/ja]
10861 * @modifier material
10862 * [en]Material Design button[/en]
10863 * [ja]マテリアルデザインのボタン[/ja]
10864 * @modifier material--flat
10865 * [en]Material Design flat button[/en]
10866 * [ja]マテリアルデザインのフラットボタン[/ja]
10867 * @description
10868 * [en]
10869 * Button component. If you want to place a button in a toolbar, use `<ons-toolbar-button>` or `<ons-back-button>` instead.
10870 *
10871 * Will automatically display as a Material Design button with a ripple effect on Android.
10872 * [/en]
10873 * [ja]ボタン用コンポーネント。ツールバーにボタンを設置する場合は、ons-toolbar-buttonもしくはons-back-buttonコンポーネントを使用します。[/ja]
10874 * @codepen hLayx
10875 * @tutorial vanilla/Reference/button
10876 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
10877 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
10878 * @example
10879 * <ons-button modifier="large--cta">
10880 * Tap Me
10881 * </ons-button>
10882 */
10883 var ButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
10884 _inherits(ButtonElement, _BaseButtonElement);
10885 var _super = _createSuper(ButtonElement);
10886 function ButtonElement() {
10887 _classCallCheck(this, ButtonElement);
10888 return _super.apply(this, arguments);
10889 }
10890 _createClass(ButtonElement, [{
10891 key: "_scheme",
10892 get:
10893 /**
10894 * @attribute modifier
10895 * @type {String}
10896 * @description
10897 * [en]The appearance of the button.[/en]
10898 * [ja]ボタンの表現を指定します。[/ja]
10899 */
10900
10901 /**
10902 * @attribute ripple
10903 * @description
10904 * [en]If this attribute is defined, the button will have a ripple effect.[/en]
10905 * [ja][/ja]
10906 */
10907
10908 /**
10909 * @property ripple
10910 * @type {Boolean}
10911 * @description
10912 * [en]Whether the button has a ripple effect or not.[/en]
10913 * [ja][/ja]
10914 */
10915
10916 /**
10917 * @attribute disabled
10918 * @description
10919 * [en]Specify if button should be disabled.[/en]
10920 * [ja]ボタンを無効化する場合は指定します。[/ja]
10921 */
10922
10923 /**
10924 * @property disabled
10925 * @type {Boolean}
10926 * @description
10927 * [en]Whether the button is disabled or not.[/en]
10928 * [ja]無効化されている場合に`true`。[/ja]
10929 */
10930
10931 function get() {
10932 return {
10933 '': 'button--*'
10934 };
10935 }
10936 }, {
10937 key: "_defaultClassName",
10938 get: function get() {
10939 return 'button';
10940 }
10941 }]);
10942 return ButtonElement;
10943 }(BaseButtonElement);
10944 onsElements.Button = ButtonElement;
10945 customElements.define('ons-button', ButtonElement);
10946
10947 var defaultClassName$e = 'card';
10948 var scheme$q = {
10949 '': 'card--*',
10950 '.card__title': 'card--*__title',
10951 '.card__content': 'card--*__content'
10952 };
10953
10954 /**
10955 * @element ons-card
10956 * @category visual
10957 * @modifier material
10958 * [en]A card with material design.[/en]
10959 * [ja]リストの上下のボーダーが無いリストを表示します。[/ja]
10960 * @description
10961 * [en]
10962 * Component to create a card that displays some information.
10963 *
10964 * 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]
10965 * [ja][/ja]
10966 * @tutorial vanilla/Reference/card
10967 * @example
10968 * <ons-card>
10969 * <p>Some content</p>
10970 * </ons-card>
10971 */
10972 var CardElement = /*#__PURE__*/function (_BaseElement) {
10973 _inherits(CardElement, _BaseElement);
10974 var _super = _createSuper(CardElement);
10975 /**
10976 * @attribute modifier
10977 * @type {String}
10978 * @description
10979 * [en]The appearance of the card.[/en]
10980 * [ja]リストの表現を指定します。[/ja]
10981 */
10982
10983 function CardElement() {
10984 var _this;
10985 _classCallCheck(this, CardElement);
10986 _this = _super.call(this);
10987 contentReady(_assertThisInitialized(_this), function () {
10988 _this._compile();
10989 });
10990 return _this;
10991 }
10992 _createClass(CardElement, [{
10993 key: "_compile",
10994 value: function _compile() {
10995 for (var i = 0; i < this.children.length; i++) {
10996 var el = this.children[i];
10997 if (el.classList.contains('title')) {
10998 el.classList.add('card__title');
10999 } else if (el.classList.contains('content')) {
11000 el.classList.add('card__content');
11001 }
11002 }
11003 autoStyle.prepare(this);
11004 this.classList.add(defaultClassName$e);
11005 ModifierUtil.initModifier(this, scheme$q);
11006 }
11007 }, {
11008 key: "attributeChangedCallback",
11009 value: function attributeChangedCallback(name, last, current) {
11010 switch (name) {
11011 case 'class':
11012 util$4.restoreClass(this, defaultClassName$e, scheme$q);
11013 break;
11014 case 'modifier':
11015 ModifierUtil.onModifierChanged(last, current, this, scheme$q);
11016 break;
11017 }
11018 }
11019 }], [{
11020 key: "observedAttributes",
11021 get: function get() {
11022 return ['modifier', 'class'];
11023 }
11024 }]);
11025 return CardElement;
11026 }(BaseElement);
11027 onsElements.Card = CardElement;
11028 customElements.define('ons-card', CardElement);
11029
11030 var scheme$p = {
11031 '': 'carousel-item--*'
11032 };
11033
11034 /**
11035 * @element ons-carousel-item
11036 * @category carousel
11037 * @description
11038 * [en]
11039 * Carousel item component. Used as a child of the `<ons-carousel>` element.
11040 * [/en]
11041 * [ja][/ja]
11042 * @codepen xbbzOQ
11043 * @tutorial vanilla/Reference/carousel
11044 * @seealso ons-carousel
11045 * [en]`<ons-carousel>` components[/en]
11046 * [ja]<ons-carousel>コンポーネント[/ja]
11047 * @example
11048 * <ons-carousel style="width: 100%; height: 200px">
11049 * <ons-carousel-item>
11050 * ...
11051 * </ons-carousel-item>
11052 * <ons-carousel-item>
11053 * ...
11054 * </ons-carousel-item>
11055 * </ons-carousel>
11056 */
11057 var CarouselItemElement = /*#__PURE__*/function (_BaseElement) {
11058 _inherits(CarouselItemElement, _BaseElement);
11059 var _super = _createSuper(CarouselItemElement);
11060 function CarouselItemElement() {
11061 var _this;
11062 _classCallCheck(this, CarouselItemElement);
11063 _this = _super.call(this);
11064 _this.style.width = '100%';
11065 ModifierUtil.initModifier(_assertThisInitialized(_this), scheme$p);
11066 return _this;
11067 }
11068 _createClass(CarouselItemElement, [{
11069 key: "attributeChangedCallback",
11070 value: function attributeChangedCallback(name, last, current) {
11071 if (name === 'modifier') {
11072 return ModifierUtil.onModifierChanged(last, current, this, scheme$p);
11073 }
11074 }
11075 }], [{
11076 key: "observedAttributes",
11077 get: function get() {
11078 return ['modifier'];
11079 }
11080 }]);
11081 return CarouselItemElement;
11082 }(BaseElement);
11083 onsElements.CarouselItem = CarouselItemElement;
11084 customElements.define('ons-carousel-item', CarouselItemElement);
11085
11086 var directionMap = {
11087 vertical: {
11088 axis: 'Y',
11089 size: 'Height',
11090 dir: ['up', 'down'],
11091 t3d: ['0px, ', 'px, 0px']
11092 },
11093 horizontal: {
11094 axis: 'X',
11095 size: 'Width',
11096 dir: ['left', 'right'],
11097 t3d: ['', 'px, 0px, 0px']
11098 }
11099 };
11100 var Swiper = /*#__PURE__*/function () {
11101 function Swiper(params) {
11102 var _this = this;
11103 _classCallCheck(this, Swiper);
11104 // Parameters
11105 var FALSE = function FALSE() {
11106 return false;
11107 };
11108 "getInitialIndex getBubbleWidth isVertical isOverScrollable isCentered\n isAutoScrollable refreshHook preChangeHook postChangeHook overScrollHook".split(/\s+/).forEach(function (key) {
11109 return _this[key] = params[key] || FALSE;
11110 });
11111 this.getElement = params.getElement; // Required
11112 this.scrollHook = params.scrollHook; // Optional
11113 this.itemSize = params.itemSize || '100%';
11114 this.getAutoScrollRatio = function () {
11115 var ratio = params.getAutoScrollRatio && params.getAutoScrollRatio.apply(params, arguments);
11116 ratio = typeof ratio === 'number' && ratio === ratio ? ratio : .5;
11117 if (ratio < 0.0 || ratio > 1.0) {
11118 util$4.throw('Invalid auto-scroll-ratio ' + ratio + '. Must be between 0 and 1');
11119 }
11120 return ratio;
11121 };
11122
11123 // Prevent clicks only on desktop
11124 this.shouldBlock = util$4.globals.actualMobileOS === 'other';
11125
11126 // Bind handlers
11127 this.onDragStart = this.onDragStart.bind(this);
11128 this.onDrag = this.onDrag.bind(this);
11129 this.onDragEnd = this.onDragEnd.bind(this);
11130 this.onResize = this.onResize.bind(this);
11131 this._shouldFixScroll = util$4.globals.actualMobileOS === 'ios';
11132 }
11133 _createClass(Swiper, [{
11134 key: "init",
11135 value: function init() {
11136 var _this2 = this;
11137 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
11138 swipeable = _ref.swipeable,
11139 autoRefresh = _ref.autoRefresh;
11140 this.initialized = true;
11141 this.target = this.getElement().children[0];
11142 this.blocker = this.getElement().children[1];
11143 if (!this.target || !this.blocker) {
11144 util$4.throw('Expected "target" and "blocker" elements to exist before initializing Swiper');
11145 }
11146 if (!this.shouldBlock) {
11147 this.blocker.style.display = 'none';
11148 }
11149
11150 // Add classes
11151 this.getElement().classList.add('ons-swiper');
11152 this.target.classList.add('ons-swiper-target');
11153 this.blocker.classList.add('ons-swiper-blocker');
11154
11155 // Setup listeners
11156 this._gestureDetector = new GestureDetector(this.getElement(), {
11157 dragMinDistance: 1,
11158 dragLockToAxis: true,
11159 passive: !this._shouldFixScroll
11160 });
11161 this._mutationObserver = new MutationObserver(function () {
11162 return _this2.refresh();
11163 });
11164 this.updateSwipeable(swipeable);
11165 this.updateAutoRefresh(autoRefresh);
11166
11167 // Setup initial layout
11168 this._scroll = this._offset = this._lastActiveIndex = 0;
11169 this._updateLayout();
11170 this._setupInitialIndex();
11171 setImmediate(function () {
11172 return _this2.initialized && _this2._setupInitialIndex();
11173 });
11174
11175 // Fix rendering glitch on Android 4.1
11176 // Fix for iframes where the width is inconsistent at the beginning
11177 if (window !== window.parent || this.offsetHeight === 0) {
11178 window.requestAnimationFrame(function () {
11179 return _this2.initialized && _this2.onResize();
11180 });
11181 }
11182 }
11183 }, {
11184 key: "dispose",
11185 value: function dispose() {
11186 this.initialized = false;
11187 this.updateSwipeable(false);
11188 this.updateAutoRefresh(false);
11189 this._gestureDetector && this._gestureDetector.dispose();
11190 this.target = this.blocker = this._gestureDetector = this._mutationObserver = null;
11191 this.setupResize(false);
11192 }
11193 }, {
11194 key: "onResize",
11195 value: function onResize() {
11196 var i = this._scroll / this.itemNumSize;
11197 this._reset();
11198 this.setActiveIndex(i);
11199 this.refresh();
11200 }
11201 }, {
11202 key: "itemCount",
11203 get: function get() {
11204 return this.target.children.length;
11205 }
11206 }, {
11207 key: "itemNumSize",
11208 get: function get() {
11209 if (typeof this._itemNumSize !== 'number' || this._itemNumSize !== this._itemNumSize) {
11210 this._itemNumSize = this._calculateItemSize();
11211 }
11212 return this._itemNumSize;
11213 }
11214 }, {
11215 key: "maxScroll",
11216 get: function get() {
11217 var max = this.itemCount * this.itemNumSize - this.targetSize;
11218 return Math.ceil(max < 0 ? 0 : max); // Need to return an integer value.
11219 }
11220 }, {
11221 key: "_calculateItemSize",
11222 value: function _calculateItemSize() {
11223 var matches = this.itemSize.match(/^(\d+)(px|%)/);
11224 if (!matches) {
11225 util$4.throw("Invalid state: swiper's size unit must be '%' or 'px'");
11226 }
11227 var value = parseInt(matches[1], 10);
11228 return matches[2] === '%' ? Math.round(value / 100 * this.targetSize) : value;
11229 }
11230 }, {
11231 key: "_setupInitialIndex",
11232 value: function _setupInitialIndex() {
11233 this._reset();
11234 this._lastActiveIndex = Math.max(Math.min(Number(this.getInitialIndex()), this.itemCount), 0);
11235 this._scroll = this._offset + this.itemNumSize * this._lastActiveIndex;
11236 this._scrollTo(this._scroll);
11237 }
11238 }, {
11239 key: "_setSwiping",
11240 value: function _setSwiping(toggle) {
11241 this.target.classList.toggle('swiping', toggle); // Hides everything except shown pages
11242 }
11243 }, {
11244 key: "setActiveIndex",
11245 value: function setActiveIndex(index) {
11246 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
11247 this._setSwiping(true);
11248 index = Math.max(0, Math.min(index, this.itemCount - 1));
11249 var scroll = Math.max(0, Math.min(this.maxScroll, this._offset + this.itemNumSize * index));
11250 return this._changeTo(scroll, options);
11251 }
11252 }, {
11253 key: "getActiveIndex",
11254 value: function getActiveIndex() {
11255 var scroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._scroll;
11256 scroll -= this._offset;
11257 var count = this.itemCount,
11258 size = this.itemNumSize;
11259 if (this.itemNumSize === 0 || !util$4.isInteger(scroll)) {
11260 return this._lastActiveIndex;
11261 }
11262 if (scroll <= 0) {
11263 return 0;
11264 }
11265 for (var i = 0; i < count; i++) {
11266 if (size * i <= scroll && size * (i + 1) > scroll) {
11267 return i;
11268 }
11269 }
11270 return count - 1;
11271 }
11272 }, {
11273 key: "setupResize",
11274 value: function setupResize(add) {
11275 window[(add ? 'add' : 'remove') + 'EventListener']('resize', this.onResize, true);
11276 }
11277 }, {
11278 key: "show",
11279 value: function show() {
11280 var _this3 = this;
11281 this.setupResize(true);
11282 this.onResize();
11283 setTimeout(function () {
11284 return _this3.target && _this3.target.classList.add('active');
11285 }, 1000 / 60); // Hide elements after animations
11286 }
11287 }, {
11288 key: "hide",
11289 value: function hide() {
11290 this.setupResize(false);
11291 this.target.classList.remove('active'); // Show elements before animations
11292 }
11293 }, {
11294 key: "updateSwipeable",
11295 value: function updateSwipeable(shouldUpdate) {
11296 if (this._gestureDetector) {
11297 var action = shouldUpdate ? 'on' : 'off';
11298 this._gestureDetector[action]('drag', this.onDrag);
11299 this._gestureDetector[action]('dragstart', this.onDragStart);
11300 this._gestureDetector[action]('dragend', this.onDragEnd);
11301 }
11302 }
11303 }, {
11304 key: "updateAutoRefresh",
11305 value: function updateAutoRefresh(shouldWatch) {
11306 if (this._mutationObserver) {
11307 shouldWatch ? this._mutationObserver.observe(this.target, {
11308 childList: true
11309 }) : this._mutationObserver.disconnect();
11310 }
11311 }
11312 }, {
11313 key: "updateItemSize",
11314 value: function updateItemSize(newSize) {
11315 this.itemSize = newSize || '100%';
11316 this.refresh();
11317 }
11318 }, {
11319 key: "toggleBlocker",
11320 value: function toggleBlocker(block) {
11321 this.blocker.style.pointerEvents = block ? 'auto' : 'none';
11322 }
11323 }, {
11324 key: "_canConsumeGesture",
11325 value: function _canConsumeGesture(gesture) {
11326 var d = gesture.direction;
11327 var isFirst = this._scroll === 0 && !this.isOverScrollable();
11328 var isLast = this._scroll === this.maxScroll && !this.isOverScrollable();
11329 return this.isVertical() ? d === 'down' && !isFirst || d === 'up' && !isLast : d === 'right' && !isFirst || d === 'left' && !isLast;
11330 }
11331 }, {
11332 key: "onDragStart",
11333 value: function onDragStart(event) {
11334 var _this4 = this;
11335 this._ignoreDrag = event.consumed || !util$4.isValidGesture(event);
11336 if (!this._ignoreDrag) {
11337 var consume = event.consume;
11338 event.consume = function () {
11339 consume && consume();
11340 _this4._ignoreDrag = true;
11341 };
11342 if (this._canConsumeGesture(event.gesture)) {
11343 var startX = event.gesture.center && event.gesture.center.clientX || 0,
11344 distFromEdge = this.getBubbleWidth() || 0,
11345 start = function start() {
11346 consume && consume();
11347 event.consumed = true;
11348 _this4._started = true; // Avoid starting drag from outside
11349 _this4.shouldBlock && _this4.toggleBlocker(true);
11350 _this4._setSwiping(true);
11351 util$4.iosPreventScroll(_this4._gestureDetector);
11352 };
11353
11354 // Let parent elements consume the gesture or consume it right away
11355 startX < distFromEdge || startX > this.targetSize - distFromEdge ? setImmediate(function () {
11356 return !_this4._ignoreDrag && start();
11357 }) : start();
11358 }
11359 }
11360 }
11361 }, {
11362 key: "onDrag",
11363 value: function onDrag(event) {
11364 if (!event.gesture || this._ignoreDrag || !this._started) {
11365 return;
11366 }
11367 this._continued = true; // Fix for random 'dragend' without 'drag'
11368 event.stopPropagation();
11369 this._scrollTo(this._scroll - this._getDelta(event), {
11370 throttle: true
11371 });
11372 }
11373 }, {
11374 key: "onDragEnd",
11375 value: function onDragEnd(event) {
11376 this._started = false;
11377 if (!event.gesture || this._ignoreDrag || !this._continued) {
11378 this._ignoreDrag = true; // onDragEnd might fire before onDragStart's setImmediate
11379 return;
11380 }
11381 this._continued = false;
11382 event.stopPropagation();
11383 var scroll = this._scroll - this._getDelta(event);
11384 var normalizedScroll = this._normalizeScroll(scroll);
11385 scroll === normalizedScroll ? this._startMomentumScroll(scroll, event) : this._killOverScroll(normalizedScroll);
11386 this.shouldBlock && this.toggleBlocker(false);
11387 }
11388 }, {
11389 key: "_startMomentumScroll",
11390 value: function _startMomentumScroll(scroll, event) {
11391 var velocity = this._getVelocity(event),
11392 matchesDirection = event.gesture.interimDirection === this.dM.dir[this._getDelta(event) < 0 ? 0 : 1];
11393 var nextScroll = this._getAutoScroll(scroll, velocity, matchesDirection);
11394 var duration = Math.abs(nextScroll - scroll) / (velocity + 0.01) / 1000;
11395 duration = Math.min(.25, Math.max(.1, duration));
11396 this._changeTo(nextScroll, {
11397 swipe: true,
11398 animationOptions: {
11399 duration: duration,
11400 timing: 'cubic-bezier(.4, .7, .5, 1)'
11401 }
11402 });
11403 }
11404 }, {
11405 key: "_killOverScroll",
11406 value: function _killOverScroll(scroll) {
11407 var _this5 = this;
11408 this._scroll = scroll;
11409 var direction = this.dM.dir[Number(scroll > 0)];
11410 var killOverScroll = function killOverScroll() {
11411 return _this5._changeTo(scroll, {
11412 animationOptions: {
11413 duration: .4,
11414 timing: 'cubic-bezier(.1, .4, .1, 1)'
11415 }
11416 });
11417 };
11418 this.overScrollHook({
11419 direction: direction,
11420 killOverScroll: killOverScroll
11421 }) || killOverScroll();
11422 }
11423 }, {
11424 key: "_changeTo",
11425 value: function _changeTo(scroll) {
11426 var _this6 = this;
11427 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
11428 var e = {
11429 activeIndex: this.getActiveIndex(scroll),
11430 lastActiveIndex: this._lastActiveIndex,
11431 swipe: options.swipe || false
11432 };
11433 var change = e.activeIndex !== e.lastActiveIndex;
11434 var canceled = change ? this.preChangeHook(e) : false;
11435 this._scroll = canceled ? this._offset + e.lastActiveIndex * this.itemNumSize : scroll;
11436 this._lastActiveIndex = canceled ? e.lastActiveIndex : e.activeIndex;
11437 return this._scrollTo(this._scroll, options).then(function () {
11438 if (scroll === _this6._scroll && !canceled) {
11439 _this6._setSwiping(false);
11440 change && _this6.postChangeHook(e);
11441 } else if (options.reject) {
11442 _this6._setSwiping(false);
11443 return Promise.reject('Canceled');
11444 }
11445 });
11446 }
11447 }, {
11448 key: "_scrollTo",
11449 value: function _scrollTo(scroll) {
11450 var _this7 = this;
11451 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
11452 if (options.throttle) {
11453 var ratio = 0.35;
11454 if (scroll < 0) {
11455 scroll = this.isOverScrollable() ? Math.round(scroll * ratio) : 0;
11456 } else {
11457 var maxScroll = this.maxScroll;
11458 if (maxScroll < scroll) {
11459 scroll = this.isOverScrollable() ? maxScroll + Math.round((scroll - maxScroll) * ratio) : maxScroll;
11460 }
11461 }
11462 }
11463 var opt = options.animation === 'none' ? {} : options.animationOptions;
11464 this.scrollHook && this.itemNumSize > 0 && this.scrollHook((scroll / this.itemNumSize).toFixed(2), options.animationOptions || {});
11465 return new Promise(function (resolve) {
11466 return Animit(_this7.target).queue({
11467 transform: _this7._getTransform(scroll)
11468 }, opt).play(resolve);
11469 });
11470 }
11471 }, {
11472 key: "_getAutoScroll",
11473 value: function _getAutoScroll(scroll, velocity, matchesDirection) {
11474 var max = this.maxScroll,
11475 offset = this._offset,
11476 size = this.itemNumSize;
11477 if (!this.isAutoScrollable()) {
11478 return Math.max(0, Math.min(max, scroll));
11479 }
11480 var arr = [];
11481 for (var s = offset; s < max; s += size) {
11482 arr.push(s);
11483 }
11484 arr.push(max);
11485 arr = arr.sort(function (left, right) {
11486 return Math.abs(left - scroll) - Math.abs(right - scroll);
11487 }).filter(function (item, pos) {
11488 return !pos || item !== arr[pos - 1];
11489 });
11490 var result = arr[0];
11491 var lastScroll = this._lastActiveIndex * size + offset;
11492 var scrollRatio = Math.abs(scroll - lastScroll) / size;
11493 if (scrollRatio <= this.getAutoScrollRatio(matchesDirection, velocity, size)) {
11494 result = lastScroll;
11495 } else {
11496 if (scrollRatio < 1.0 && arr[0] === lastScroll && arr.length > 1) {
11497 result = arr[1];
11498 }
11499 }
11500 return Math.max(0, Math.min(max, result));
11501 }
11502 }, {
11503 key: "_reset",
11504 value: function _reset() {
11505 this._targetSize = this._itemNumSize = undefined;
11506 }
11507 }, {
11508 key: "_normalizeScroll",
11509 value: function _normalizeScroll(scroll) {
11510 return Math.max(Math.min(scroll, this.maxScroll), 0);
11511 }
11512 }, {
11513 key: "refresh",
11514 value: function refresh() {
11515 this._reset();
11516 this._updateLayout();
11517 if (util$4.isInteger(this._scroll)) {
11518 var scroll = this._normalizeScroll(this._scroll);
11519 scroll !== this._scroll ? this._killOverScroll(scroll) : this._changeTo(scroll);
11520 } else {
11521 this._setupInitialIndex();
11522 }
11523 this.refreshHook();
11524 }
11525 }, {
11526 key: "targetSize",
11527 get: function get() {
11528 if (!this._targetSize) {
11529 this._targetSize = this.target["offset".concat(this.dM.size)];
11530 }
11531 return this._targetSize;
11532 }
11533 }, {
11534 key: "_getDelta",
11535 value: function _getDelta(event) {
11536 return event.gesture["delta".concat(this.dM.axis)];
11537 }
11538 }, {
11539 key: "_getVelocity",
11540 value: function _getVelocity(event) {
11541 return event.gesture["velocity".concat(this.dM.axis)];
11542 }
11543 }, {
11544 key: "_getTransform",
11545 value: function _getTransform(scroll) {
11546 return "translate3d(".concat(this.dM.t3d[0]).concat(-scroll).concat(this.dM.t3d[1], ")");
11547 }
11548 }, {
11549 key: "_updateLayout",
11550 value: function _updateLayout() {
11551 this.dM = directionMap[this.isVertical() ? 'vertical' : 'horizontal'];
11552 this.target.classList.toggle('ons-swiper-target--vertical', this.isVertical());
11553 for (var c = this.target.children[0]; c; c = c.nextElementSibling) {
11554 c.style[this.dM.size.toLowerCase()] = this.itemSize;
11555 }
11556 if (this.isCentered()) {
11557 this._offset = (this.targetSize - this.itemNumSize) / -2 || 0;
11558 }
11559 }
11560 }]);
11561 return Swiper;
11562 }();
11563
11564 /**
11565 * @element ons-carousel
11566 * @category carousel
11567 * @description
11568 * [en]
11569 * Carousel component. A carousel can be used to display several items in the same space.
11570 *
11571 * 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.
11572 * [/en]
11573 * [ja][/ja]
11574 * @codepen xbbzOQ
11575 * @tutorial vanilla/Reference/carousel
11576 * @seealso ons-carousel-item
11577 * [en]`<ons-carousel-item>` component[/en]
11578 * [ja]ons-carousel-itemコンポーネント[/ja]
11579 * @example
11580 * <ons-carousel style="width: 100%; height: 200px">
11581 * <ons-carousel-item>
11582 * ...
11583 * </ons-carousel-item>
11584 * <ons-carousel-item>
11585 * ...
11586 * </ons-carousel-item>
11587 * </ons-carousel>
11588 */
11589 var CarouselElement = /*#__PURE__*/function (_BaseElement) {
11590 _inherits(CarouselElement, _BaseElement);
11591 var _super = _createSuper(CarouselElement);
11592 /**
11593 * @event postchange
11594 * @description
11595 * [en]Fired just after the current carousel item has changed.[/en]
11596 * [ja]現在表示しているカルーセルの要素が変わった時に発火します。[/ja]
11597 * @param {Object} event
11598 * [en]Event object.[/en]
11599 * [ja]イベントオブジェクトです。[/ja]
11600 * @param {Object} event.carousel
11601 * [en]Carousel object.[/en]
11602 * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
11603 * @param {Number} event.activeIndex
11604 * [en]Current active index.[/en]
11605 * [ja]現在アクティブになっている要素のインデックス。[/ja]
11606 * @param {Number} event.lastActiveIndex
11607 * [en]Previous active index.[/en]
11608 * [ja]以前アクティブだった要素のインデックス。[/ja]
11609 */
11610
11611 /**
11612 * @event prechange
11613 * @description
11614 * [en]Fired just before the current carousel item changes.[/en]
11615 * [ja][/ja]
11616 * @param {Object} event
11617 * [en]Event object.[/en]
11618 * [ja]イベントオブジェクトです。[/ja]
11619 * @param {Object} event.carousel
11620 * [en]Carousel object.[/en]
11621 * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
11622 * @param {Number} event.activeIndex
11623 * [en]Current active index.[/en]
11624 * [ja]現在アクティブになっている要素のインデックス。[/ja]
11625 * @param {Number} event.lastActiveIndex
11626 * [en]Previous active index.[/en]
11627 * [ja]以前アクティブだった要素のインデックス。[/ja]
11628 */
11629
11630 /**
11631 * @event refresh
11632 * @description
11633 * [en]Fired when the carousel has been refreshed.[/en]
11634 * [ja]カルーセルが更新された時に発火します。[/ja]
11635 * @param {Object} event
11636 * [en]Event object.[/en]
11637 * [ja]イベントオブジェクトです。[/ja]
11638 * @param {Object} event.carousel
11639 * [en]Carousel object.[/en]
11640 * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
11641 */
11642
11643 /**
11644 * @event overscroll
11645 * @description
11646 * [en]Fired when the carousel has been overscrolled.[/en]
11647 * [ja]カルーセルがオーバースクロールした時に発火します。[/ja]
11648 * @param {Object} event
11649 * [en]Event object.[/en]
11650 * [ja]イベントオブジェクトです。[/ja]
11651 * @param {Object} event.carousel
11652 * [en]Fired when the carousel has been refreshed.[/en]
11653 * [ja]カルーセルが更新された時に発火します。[/ja]
11654 * @param {Number} event.activeIndex
11655 * [en]Current active index.[/en]
11656 * [ja]現在アクティブになっている要素のインデックス。[/ja]
11657 * @param {String} event.direction
11658 * [en]Can be one of either "up", "down", "left" or "right".[/en]
11659 * [ja]オーバースクロールされた方向が得られます。"up", "down", "left", "right"のいずれかの方向が渡されます。[/ja]
11660 * @param {Function} event.waitToReturn
11661 * [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]
11662 * [ja]この関数はPromiseオブジェクトを引数として受け取ります。渡したPromiseオブジェクトがresolveされるかrejectされるまで、カルーセルはスクロールバックしません。[/ja]
11663 */
11664
11665 /**
11666 * @event swipe
11667 * @description
11668 * [en]Fires when the carousel swipes.[/en]
11669 * [ja][/ja]
11670 * @param {Object} event
11671 * [en]Event object.[/en]
11672 * [ja]イベントオブジェクト。[/ja]
11673 * @param {Number} event.index
11674 * [en]Current index.[/en]
11675 * [ja]現在アクティブになっているons-carouselのインデックスを返します。[/ja]
11676 * @param {Object} event.options
11677 * [en]Animation options object.[/en]
11678 * [ja][/ja]
11679 */
11680
11681 /**
11682 * @attribute direction
11683 * @type {String}
11684 * @description
11685 * [en]The direction of the carousel. Can be either "horizontal" or "vertical". Default is "horizontal".[/en]
11686 * [ja]カルーセルの方向を指定します。"horizontal"か"vertical"を指定できます。"horizontal"がデフォルト値です。[/ja]
11687 */
11688
11689 /**
11690 * @attribute fullscreen
11691 * @description
11692 * [en]If this attribute is set the carousel will cover the whole screen.[/en]
11693 * [ja]この属性があると、absoluteポジションを使ってカルーセルが自動的に画面いっぱいに広がります。[/ja]
11694 */
11695
11696 /**
11697 * @property fullscreen
11698 * @type {Boolean}
11699 * @description
11700 * [en]If this property is set the carousel will cover the whole screen.[/en]
11701 * [ja]この属性があると、absoluteポジションを使ってカルーセルが自動的に画面いっぱいに広がります。[/ja]
11702 */
11703
11704 /**
11705 * @attribute overscrollable
11706 * @description
11707 * [en]If this attribute is set the carousel will be scrollable over the edge. It will bounce back when released.[/en]
11708 * [ja]この属性がある時、タッチやドラッグで端までスクロールした時に、バウンドするような効果が当たります。[/ja]
11709 */
11710
11711 /**
11712 * @attribute centered
11713 * @description
11714 * [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]
11715 * [ja]この属性がある時、選んでいるons-carousel-itemはカルーセルの真ん中へ行きます。項目がカルーセルよりも小さい場合にのみ、これは便利です。[/ja]
11716 */
11717
11718 /**
11719 * @attribute item-width
11720 * @type {String}
11721 * @description
11722 * [en]ons-carousel-item's width. Only works when the direction is set to "horizontal".[/en]
11723 * [ja]ons-carousel-itemの幅を指定します。この属性は、direction属性に"horizontal"を指定した時のみ有効になります。[/ja]
11724 */
11725
11726 /**
11727 * @attribute item-height
11728 * @type {String}
11729 * @description
11730 * [en]ons-carousel-item's height. Only works when the direction is set to "vertical".[/en]
11731 * [ja]ons-carousel-itemの高さを指定します。この属性は、direction属性に"vertical"を指定した時のみ有効になります。[/ja]
11732 */
11733
11734 /**
11735 * @attribute auto-scroll
11736 * @description
11737 * [en]If this attribute is set the carousel will be automatically scrolled to the closest item border when released.[/en]
11738 * [ja]この属性がある時、一番近いcarousel-itemの境界まで自動的にスクロールするようになります。[/ja]
11739 */
11740
11741 /**
11742 * @attribute auto-scroll-ratio
11743 * @type {Number}
11744 * @description
11745 * [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]
11746 * [ja]0.0から1.0までの値を指定します。カルーセルの要素をどれぐらいの割合までドラッグすると次の要素に自動的にスクロールするかを指定します。[/ja]
11747 */
11748
11749 /**
11750 * @attribute swipeable
11751 * @description
11752 * [en]If this attribute is set the carousel can be scrolled by drag or swipe.[/en]
11753 * [ja]この属性がある時、カルーセルをスワイプやドラッグで移動できるようになります。[/ja]
11754 */
11755
11756 /**
11757 * @attribute disabled
11758 * @description
11759 * [en]If this attribute is set the carousel is disabled.[/en]
11760 * [ja]この属性がある時、dragやtouchやswipeを受け付けなくなります。[/ja]
11761 */
11762
11763 /**
11764 * @attribute initial-index
11765 * @initonly
11766 * @default 0
11767 * @type {Number}
11768 * @description
11769 * [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]
11770 * [ja]最初に表示するons-carousel-itemを0始まりのインデックスで指定します。デフォルト値は 0 です。[/ja]
11771 */
11772
11773 /**
11774 * @attribute auto-refresh
11775 * @description
11776 * [en]When this attribute is set the carousel will automatically refresh when the number of child nodes change.[/en]
11777 * [ja]この属性がある時、子要素の数が変わるとカルーセルは自動的に更新されるようになります。[/ja]
11778 */
11779
11780 /**
11781 * @property autoRefresh
11782 * @type {Boolean}
11783 * @description
11784 * [en]When this property is set the carousel will automatically refresh when the number of child nodes change.[/en]
11785 * [ja]この属性がある時、子要素の数が変わるとカルーセルは自動的に更新されるようになります。[/ja]
11786 */
11787
11788 /**
11789 * @attribute animation
11790 * @type {String}
11791 * @description
11792 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
11793 * [ja][/ja]
11794 */
11795
11796 /**
11797 * @attribute animation-options
11798 * @type {Expression}
11799 * @description
11800 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
11801 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
11802 */
11803
11804 function CarouselElement() {
11805 var _this;
11806 _classCallCheck(this, CarouselElement);
11807 _this = _super.call(this);
11808 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'swipe'),
11809 onConnected = _util$defineListenerP.onConnected,
11810 onDisconnected = _util$defineListenerP.onDisconnected;
11811 _this._connectOnSwipe = onConnected;
11812 _this._disconnectOnSwipe = onDisconnected;
11813 contentReady(_assertThisInitialized(_this), function () {
11814 return _this._compile();
11815 });
11816 return _this;
11817 }
11818 _createClass(CarouselElement, [{
11819 key: "_compile",
11820 value: function _compile() {
11821 var target = this.children[0] && this.children[0].tagName !== 'ONS-CAROUSEL-ITEM' && this.children[0] || document.createElement('div');
11822 if (!target.parentNode) {
11823 while (this.firstChild) {
11824 target.appendChild(this.firstChild);
11825 }
11826 this.appendChild(target);
11827 }
11828 !this.children[1] && this.appendChild(document.createElement('div'));
11829 this.appendChild = this.appendChild.bind(target);
11830 this.insertBefore = this.insertBefore.bind(target);
11831 }
11832 }, {
11833 key: "connectedCallback",
11834 value: function connectedCallback() {
11835 var _this2 = this;
11836 if (!this._swiper) {
11837 this._swiper = new Swiper({
11838 getElement: function getElement() {
11839 return _this2;
11840 },
11841 getInitialIndex: function getInitialIndex() {
11842 return _this2.getAttribute('active-index') || _this2.getAttribute('initial-index');
11843 },
11844 getAutoScrollRatio: function getAutoScrollRatio() {
11845 return _this2.autoScrollRatio;
11846 },
11847 isVertical: function isVertical() {
11848 return _this2.vertical;
11849 },
11850 isOverScrollable: function isOverScrollable() {
11851 return _this2.overscrollable;
11852 },
11853 isCentered: function isCentered() {
11854 return _this2.centered;
11855 },
11856 isAutoScrollable: function isAutoScrollable() {
11857 return _this2.autoScroll;
11858 },
11859 itemSize: this.itemSize,
11860 overScrollHook: this._onOverScroll.bind(this),
11861 preChangeHook: this._onPreChange.bind(this),
11862 postChangeHook: this._onPostChange.bind(this),
11863 refreshHook: this._onRefresh.bind(this),
11864 scrollHook: function scrollHook(index, options) {
11865 return util$4.triggerElementEvent(_this2, 'swipe', {
11866 index: index,
11867 options: options
11868 });
11869 }
11870 });
11871 contentReady(this, function () {
11872 return _this2._swiper.init({
11873 swipeable: _this2.hasAttribute('swipeable'),
11874 autoRefresh: _this2.hasAttribute('auto-refresh')
11875 });
11876 });
11877 }
11878 this._connectOnSwipe();
11879 }
11880 }, {
11881 key: "disconnectedCallback",
11882 value: function disconnectedCallback() {
11883 if (this._swiper && this._swiper.initialized) {
11884 this._swiper.dispose();
11885 this._swiper = null;
11886 }
11887 this._disconnectOnSwipe();
11888 }
11889 }, {
11890 key: "attributeChangedCallback",
11891 value: function attributeChangedCallback(name, last, current) {
11892 if (!this._swiper) {
11893 return;
11894 }
11895 switch (name) {
11896 case 'swipeable':
11897 this._swiper.updateSwipeable(this.hasAttribute('swipeable'));
11898 break;
11899 case 'auto-refresh':
11900 this._swiper.updateAutoRefresh(this.hasAttribute('auto-refresh'));
11901 break;
11902 case 'item-height':
11903 this.vertical && this._swiper.updateItemSize(this.itemSize);
11904 break;
11905 case 'item-width':
11906 this.vertical || this._swiper.updateItemSize(this.itemSize);
11907 break;
11908 case 'direction':
11909 this._swiper.refresh();
11910 break;
11911 case 'active-index':
11912 if (this.getActiveIndex() !== this.activeIndex) {
11913 this.setActiveIndex(this.activeIndex);
11914 }
11915 break;
11916 }
11917 }
11918 }, {
11919 key: "_show",
11920 value: function _show() {
11921 this._swiper.show();
11922 }
11923 }, {
11924 key: "_hide",
11925 value: function _hide() {
11926 this._swiper.hide();
11927 }
11928 }, {
11929 key: "_onOverScroll",
11930 value: function _onOverScroll(_ref) {
11931 var direction = _ref.direction,
11932 killOverScroll = _ref.killOverScroll;
11933 var waitForAction = false;
11934 util$4.triggerElementEvent(this, 'overscroll', {
11935 carousel: this,
11936 activeIndex: this.getActiveIndex(),
11937 direction: direction,
11938 waitToReturn: function waitToReturn(promise) {
11939 waitForAction = true;
11940 promise.then(killOverScroll);
11941 }
11942 });
11943 return waitForAction;
11944 }
11945 }, {
11946 key: "_onPreChange",
11947 value: function _onPreChange(_ref2) {
11948 var activeIndex = _ref2.activeIndex,
11949 lastActiveIndex = _ref2.lastActiveIndex;
11950 util$4.triggerElementEvent(this, 'prechange', {
11951 carousel: this,
11952 activeIndex: activeIndex,
11953 lastActiveIndex: lastActiveIndex
11954 });
11955 }
11956 }, {
11957 key: "_onPostChange",
11958 value: function _onPostChange(_ref3) {
11959 var activeIndex = _ref3.activeIndex,
11960 lastActiveIndex = _ref3.lastActiveIndex;
11961 this.activeIndex = activeIndex;
11962 util$4.triggerElementEvent(this, 'postchange', {
11963 carousel: this,
11964 activeIndex: activeIndex,
11965 lastActiveIndex: lastActiveIndex
11966 });
11967 }
11968 }, {
11969 key: "_onRefresh",
11970 value: function _onRefresh() {
11971 util$4.triggerElementEvent(this, 'refresh', {
11972 carousel: this
11973 });
11974 }
11975
11976 /**
11977 * @method setActiveIndex
11978 * @signature setActiveIndex(index, [options])
11979 * @param {Number} index
11980 * [en]The index that the carousel should be set to.[/en]
11981 * [ja]carousel要素のインデックスを指定します。[/ja]
11982 * @param {Object} [options]
11983 * [en]Parameter object.[/en]
11984 * [ja][/ja]
11985 * @param {Function} [options.callback]
11986 * [en]A function that will be called after the animation is finished.[/en]
11987 * [ja][/ja]
11988 * @param {String} [options.animation]
11989 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
11990 * [ja][/ja]
11991 * @param {Object} [options.animationOptions]
11992 * [en]An object that can be used to specify duration, delay and timing function of the animation.[/en]
11993 * [ja][/ja]
11994 * @description
11995 * [en]Specify the index of the `<ons-carousel-item>` to show.[/en]
11996 * [ja]表示するons-carousel-itemをindexで指定します。[/ja]
11997 * @return {Promise}
11998 * [en]Resolves to the carousel element.[/en]
11999 * [ja][/ja]
12000 */
12001 }, {
12002 key: "setActiveIndex",
12003 value: function setActiveIndex(index) {
12004 var _this3 = this;
12005 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12006 options = _objectSpread2({
12007 animation: this.getAttribute('animation'),
12008 animationOptions: this.animationOptions || {
12009 duration: .3,
12010 timing: 'cubic-bezier(.4, .7, .5, 1)'
12011 }
12012 }, options);
12013 return this._swiper.setActiveIndex(index, options).then(function () {
12014 options.callback instanceof Function && options.callback(_this3);
12015 return Promise.resolve(_this3);
12016 });
12017 }
12018
12019 /**
12020 * @method getActiveIndex
12021 * @signature getActiveIndex()
12022 * @return {Number}
12023 * [en]The current carousel item index.[/en]
12024 * [ja]現在表示しているカルーセル要素のインデックスが返されます。[/ja]
12025 * @description
12026 * [en]Returns the index of the currently visible `<ons-carousel-item>`.[/en]
12027 * [ja]現在表示されているons-carousel-item要素のインデックスを返します。[/ja]
12028 */
12029 }, {
12030 key: "getActiveIndex",
12031 value: function getActiveIndex() {
12032 return this._swiper.getActiveIndex();
12033 }
12034
12035 /**
12036 * @method next
12037 * @signature next([options])
12038 * @param {Object} [options]
12039 * [en]Parameter object.[/en]
12040 * [ja][/ja]
12041 * @param {Function} [options.callback]
12042 * [en]A function that will be executed after the animation has finished.[/en]
12043 * [ja][/ja]
12044 * @param {String} [options.animation]
12045 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
12046 * [ja][/ja]
12047 * @param {Object} [options.animationOptions]
12048 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
12049 * [ja][/ja]
12050 * @return {Promise}
12051 * [en]Resolves to the carousel element[/en]
12052 * [ja][/ja]
12053 * @description
12054 * [en]Show next `<ons-carousel-item>`.[/en]
12055 * [ja]次のons-carousel-itemを表示します。[/ja]
12056 */
12057 }, {
12058 key: "next",
12059 value: function next(options) {
12060 return this.setActiveIndex(this.getActiveIndex() + 1, options);
12061 }
12062
12063 /**
12064 * @method prev
12065 * @signature prev([options])
12066 * @param {Object} [options]
12067 * [en]Parameter object.[/en]
12068 * [ja][/ja]
12069 * @param {Function} [options.callback]
12070 * [en]A function that will be executed after the animation has finished.[/en]
12071 * [ja][/ja]
12072 * @param {String} [options.animation]
12073 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
12074 * [ja][/ja]
12075 * @param {Object} [options.animationOptions]
12076 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
12077 * [ja][/ja]
12078 * @return {Promise}
12079 * [en]Resolves to the carousel element[/en]
12080 * [ja][/ja]
12081 * @description
12082 * [en]Show previous `<ons-carousel-item>`.[/en]
12083 * [ja]前のons-carousel-itemを表示します。[/ja]
12084 */
12085 }, {
12086 key: "prev",
12087 value: function prev(options) {
12088 return this.setActiveIndex(this.getActiveIndex() - 1, options);
12089 }
12090
12091 /**
12092 * @method first
12093 * @signature first()
12094 * @param {Object} [options]
12095 * [en]Parameter object.[/en]
12096 * [ja][/ja]
12097 * @param {Function} [options.callback]
12098 * [en]A function that will be executed after the animation has finished.[/en]
12099 * [ja][/ja]
12100 * @param {String} [options.animation]
12101 * [en]If this is set to `"none"`, the transitions will not be animated.[/en]
12102 * [ja][/ja]
12103 * @param {Object} [options.animationOptions]
12104 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
12105 * [ja][/ja]
12106 * @return {Promise}
12107 * [en]Resolves to the carousel element[/en]
12108 * [ja][/ja]
12109 * @description
12110 * [en]Show first `<ons-carousel-item>`.[/en]
12111 * [ja]最初のons-carousel-itemを表示します。[/ja]
12112 */
12113 }, {
12114 key: "first",
12115 value: function first(options) {
12116 return this.setActiveIndex(0, options);
12117 }
12118
12119 /**
12120 * @method last
12121 * @signature last()
12122 * @param {Object} [options]
12123 * [en]Parameter object.[/en]
12124 * [ja][/ja]
12125 * @param {Function} [options.callback]
12126 * [en]A function that will be executed after the animation has finished.[/en]
12127 * [ja][/ja]
12128 * @param {String} [options.animation]
12129 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
12130 * [ja][/ja]
12131 * @param {Object} [options.animationOptions]
12132 * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
12133 * [ja][/ja]
12134 * @return {Promise}
12135 * [en]Resolves to the carousel element[/en]
12136 * [ja]Resolves to the carousel element[/ja]
12137 * @description
12138 * [en]Show last ons-carousel item.[/en]
12139 * [ja]最後のons-carousel-itemを表示します。[/ja]
12140 */
12141 }, {
12142 key: "last",
12143 value: function last(options) {
12144 this.setActiveIndex(Math.max(this.itemCount - 1, 0), options);
12145 }
12146
12147 /**
12148 * @method refresh
12149 * @signature refresh()
12150 * @description
12151 * [en]Update the layout of the carousel. Used when adding `<ons-carousel-items>` dynamically or to automatically adjust the size.[/en]
12152 * [ja]レイアウトや内部の状態を最新のものに更新します。ons-carousel-itemを動的に増やしたり、ons-carouselの大きさを動的に変える際に利用します。[/ja]
12153 */
12154 }, {
12155 key: "refresh",
12156 value: function refresh() {
12157 this._swiper.refresh();
12158 }
12159
12160 /**
12161 * @property itemCount
12162 * @readonly
12163 * @type {Number}
12164 * @description
12165 * [en]The number of carousel items.[/en]
12166 * [ja]カルーセル要素の数です。[/ja]
12167 */
12168 }, {
12169 key: "itemCount",
12170 get: function get() {
12171 return this._swiper.itemCount;
12172 }
12173
12174 /**
12175 * @property swipeable
12176 * @type {Boolean}
12177 * @description
12178 * [en]true if the carousel is swipeable.[/en]
12179 * [ja]swipeableであればtrueを返します。[/ja]
12180 */
12181
12182 /**
12183 * @property onSwipe
12184 * @type {Function}
12185 * @description
12186 * [en]Hook called whenever the user slides the carousel. It gets a decimal index and an animationOptions object as arguments.[/en]
12187 * [ja][/ja]
12188 */
12189
12190 /**
12191 * @property autoScroll
12192 * @type {Boolean}
12193 * @description
12194 * [en]true if auto scroll is enabled.[/en]
12195 * [ja]オートスクロールが有効であればtrueを返します。[/ja]
12196 */
12197 }, {
12198 key: "vertical",
12199 get: function get() {
12200 return this.getAttribute('direction') === 'vertical';
12201 }
12202 }, {
12203 key: "itemSize",
12204 get: function get() {
12205 var itemSizeAttr = (this.getAttribute("item-".concat(this.vertical ? 'height' : 'width')) || '').trim();
12206 return itemSizeAttr.match(/^\d+(px|%)$/) ? itemSizeAttr : '100%';
12207 }
12208
12209 /**
12210 * @property autoScrollRatio
12211 * @type {Number}
12212 * @description
12213 * [en]The current auto scroll ratio. [/en]
12214 * [ja]現在のオートスクロールのratio値。[/ja]
12215 */
12216 }, {
12217 key: "autoScrollRatio",
12218 get: function get() {
12219 return parseFloat(this.getAttribute('auto-scroll-ratio'));
12220 },
12221 set: function set(ratio) {
12222 this.setAttribute('auto-scroll-ratio', ratio);
12223 }
12224
12225 /**
12226 * @property disabled
12227 * @type {Boolean}
12228 * @description
12229 * [en]Whether the carousel is disabled or not.[/en]
12230 * [ja]無効化されている場合に`true`。[/ja]
12231 */
12232
12233 /**
12234 * @property overscrollable
12235 * @type {Boolean}
12236 * @description
12237 * [en]Whether the carousel is overscrollable or not.[/en]
12238 * [ja]overscrollできればtrueを返します。[/ja]
12239 */
12240
12241 /**
12242 * @property centered
12243 * @type {Boolean}
12244 * @description
12245 * [en]Whether the carousel is centered or not.[/en]
12246 * [ja]centered状態になっていればtrueを返します。[/ja]
12247 */
12248 }, {
12249 key: "animationOptions",
12250 get:
12251 /**
12252 * @property animationOptions
12253 * @type {Object}
12254 * @description
12255 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
12256 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
12257 */
12258 function get() {
12259 var attr = this.getAttribute('animation-options');
12260 if (attr) {
12261 return util$4.animationOptionsParse(attr);
12262 } else {
12263 return attr;
12264 }
12265 },
12266 set: function set(value) {
12267 if (value === undefined || value === null) {
12268 this.removeAttribute('animation-options');
12269 } else {
12270 this.setAttribute('animation-options', JSON.stringify(value));
12271 }
12272 }
12273
12274 /**
12275 * @attribute active-index
12276 * @type {Number}
12277 * @description
12278 * [en]Specify the index of the carousel item that should be shown.[/en]
12279 * [ja][/ja]
12280 */
12281
12282 /**
12283 * @property activeIndex
12284 * @type {Number}
12285 * @description
12286 * [en]Specify the index of the carousel item that should be shown.[/en]
12287 * [ja][/ja]
12288 */
12289 }, {
12290 key: "activeIndex",
12291 get: function get() {
12292 return parseInt(this.getAttribute('active-index'));
12293 },
12294 set: function set(value) {
12295 if (value !== undefined && value !== null) {
12296 this.setAttribute('active-index', value);
12297 }
12298 }
12299 }], [{
12300 key: "observedAttributes",
12301 get: function get() {
12302 return ['swipeable', 'auto-refresh', 'direction', 'item-height', 'item-width', 'active-index'];
12303 }
12304 }, {
12305 key: "events",
12306 get: function get() {
12307 return ['postchange', 'refresh', 'overscroll', 'prechange', 'swipe'];
12308 }
12309 }]);
12310 return CarouselElement;
12311 }(BaseElement);
12312 util$4.defineBooleanProperties(CarouselElement, ['swipeable', 'disabled', 'overscrollable', 'auto-scroll', 'centered', 'fullscreen', 'auto-refresh']);
12313 onsElements.Carousel = CarouselElement;
12314 customElements.define('ons-carousel', CarouselElement);
12315
12316 /**
12317 * @element ons-col
12318 * @category grid
12319 * @description
12320 * [en]Represents a column in the grid system. Use with `<ons-row>` to layout components.[/en]
12321 * [ja]グリッドシステムにて列を定義します。ons-rowとともに使用し、コンポーネントのレイアウトに利用します。[/ja]
12322 * @note
12323 * [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]
12324 * [ja]Android 4.3以前、もしくはiOS 6以前のOSの場合、ons-rowとons-columnを組み合わせた場合に描画が崩れる場合があります。[/ja]
12325 * @codepen GgujC {wide}
12326 * @guide theming.html [en]Layouting guide[/en][ja]レイアウト機能[/ja]
12327 * @seealso ons-row
12328 * [en]The `<ons-row>` component is the parent of `<ons-col>`.[/en]
12329 * [ja]ons-rowコンポーネント[/ja]
12330 * @example
12331 * <ons-row>
12332 * <ons-col width="50px"><ons-icon icon="fa-twitter"></ons-icon></ons-col>
12333 * <ons-col>Text</ons-col>
12334 * </ons-row>
12335 */
12336
12337 /**
12338 * @attribute vertical-align
12339 * @type {String}
12340 * @description
12341 * [en]Vertical alignment of the column. Valid values are "top", "center", and "bottom".[/en]
12342 * [ja]縦の配置を指定する。"top", "center", "bottom"のいずれかを指定します。[/ja]
12343 */
12344
12345 /**
12346 * @attribute width
12347 * @type {String}
12348 * @description
12349 * [en]The width of the column. Valid values are css width values ("10%", "50px").[/en]
12350 * [ja]カラムの横幅を指定する。パーセントもしくはピクセルで指定します(10%や50px)。[/ja]
12351 */
12352 var ColElement = /*#__PURE__*/function (_BaseElement) {
12353 _inherits(ColElement, _BaseElement);
12354 var _super = _createSuper(ColElement);
12355 function ColElement() {
12356 var _this;
12357 _classCallCheck(this, ColElement);
12358 _this = _super.call(this);
12359 if (_this.getAttribute('width')) {
12360 _this._updateWidth();
12361 }
12362 return _this;
12363 }
12364 _createClass(ColElement, [{
12365 key: "attributeChangedCallback",
12366 value: function attributeChangedCallback(name, last, current) {
12367 if (name === 'width') {
12368 this._updateWidth();
12369 }
12370 }
12371 }, {
12372 key: "_updateWidth",
12373 value: function _updateWidth() {
12374 var width = this.getAttribute('width');
12375 if (!width) {
12376 styler.clear(this, 'flex maxWidth');
12377 } else {
12378 width = width.trim().match(/^\d+$/) ? width + '%' : width;
12379 styler(this, {
12380 flex: '0 0 ' + width,
12381 maxWidth: width
12382 });
12383 }
12384 }
12385 }], [{
12386 key: "observedAttributes",
12387 get: function get() {
12388 return ['width'];
12389 }
12390 }]);
12391 return ColElement;
12392 }(BaseElement);
12393 onsElements.Col = ColElement;
12394 customElements.define('ons-col', ColElement);
12395
12396 var DialogAnimator = /*#__PURE__*/function (_BaseAnimator) {
12397 _inherits(DialogAnimator, _BaseAnimator);
12398 var _super = _createSuper(DialogAnimator);
12399 function DialogAnimator() {
12400 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
12401 _ref$timing = _ref.timing,
12402 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
12403 _ref$delay = _ref.delay,
12404 delay = _ref$delay === void 0 ? 0 : _ref$delay,
12405 _ref$duration = _ref.duration,
12406 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
12407 _classCallCheck(this, DialogAnimator);
12408 return _super.call(this, {
12409 timing: timing,
12410 delay: delay,
12411 duration: duration
12412 });
12413 }
12414
12415 /**
12416 * @param {HTMLElement} dialog
12417 * @param {Function} done
12418 */
12419 _createClass(DialogAnimator, [{
12420 key: "show",
12421 value: function show(dialog, done) {
12422 done();
12423 }
12424
12425 /**
12426 * @param {HTMLElement} dialog
12427 * @param {Function} done
12428 */
12429 }, {
12430 key: "hide",
12431 value: function hide(dialog, done) {
12432 done();
12433 }
12434 }]);
12435 return DialogAnimator;
12436 }(BaseAnimator);
12437
12438 /**
12439 * Android style animator for dialog.
12440 */
12441 var AndroidDialogAnimator = /*#__PURE__*/function (_DialogAnimator) {
12442 _inherits(AndroidDialogAnimator, _DialogAnimator);
12443 var _super2 = _createSuper(AndroidDialogAnimator);
12444 function AndroidDialogAnimator() {
12445 var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
12446 _ref2$timing = _ref2.timing,
12447 timing = _ref2$timing === void 0 ? 'ease-in-out' : _ref2$timing,
12448 _ref2$delay = _ref2.delay,
12449 delay = _ref2$delay === void 0 ? 0 : _ref2$delay,
12450 _ref2$duration = _ref2.duration,
12451 duration = _ref2$duration === void 0 ? 0.3 : _ref2$duration;
12452 _classCallCheck(this, AndroidDialogAnimator);
12453 return _super2.call(this, {
12454 timing: timing,
12455 delay: delay,
12456 duration: duration
12457 });
12458 }
12459
12460 /**
12461 * @param {Object} dialog
12462 * @param {Function} callback
12463 */
12464 _createClass(AndroidDialogAnimator, [{
12465 key: "show",
12466 value: function show(dialog, callback) {
12467 callback = callback ? callback : function () {};
12468 Animit.runAll(Animit(dialog._mask, this.def).default({
12469 opacity: 0
12470 }, {
12471 opacity: 1
12472 }), Animit(dialog._dialog, this.def).default({
12473 transform: 'translate3d(-50%, -60%, 0)',
12474 opacity: 0
12475 }, {
12476 transform: 'translate3d(-50%, -50%, 0)',
12477 opacity: 1
12478 }).queue(function (done) {
12479 callback();
12480 done();
12481 }));
12482 }
12483
12484 /**
12485 * @param {Object} dialog
12486 * @param {Function} callback
12487 */
12488 }, {
12489 key: "hide",
12490 value: function hide(dialog, callback) {
12491 callback = callback ? callback : function () {};
12492 Animit.runAll(Animit(dialog._mask, this.def).default({
12493 opacity: 1
12494 }, {
12495 opacity: 0
12496 }), Animit(dialog._dialog, this.def).default({
12497 transform: 'translate3d(-50%, -50%, 0)',
12498 opacity: 1
12499 }, {
12500 transform: 'translate3d(-50%, -60%, 0)',
12501 opacity: 0
12502 }).queue(function (done) {
12503 callback();
12504 done();
12505 }));
12506 }
12507 }]);
12508 return AndroidDialogAnimator;
12509 }(DialogAnimator);
12510
12511 /**
12512 * iOS style animator for dialog.
12513 */
12514 var IOSDialogAnimator = /*#__PURE__*/function (_DialogAnimator2) {
12515 _inherits(IOSDialogAnimator, _DialogAnimator2);
12516 var _super3 = _createSuper(IOSDialogAnimator);
12517 function IOSDialogAnimator() {
12518 var _this;
12519 var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
12520 _ref3$timing = _ref3.timing,
12521 timing = _ref3$timing === void 0 ? 'ease-in-out' : _ref3$timing,
12522 _ref3$delay = _ref3.delay,
12523 delay = _ref3$delay === void 0 ? 0 : _ref3$delay,
12524 _ref3$duration = _ref3.duration,
12525 duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration;
12526 _classCallCheck(this, IOSDialogAnimator);
12527 _this = _super3.call(this, {
12528 timing: timing,
12529 delay: delay,
12530 duration: duration
12531 });
12532 _this.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
12533 return _this;
12534 }
12535
12536 /**
12537 * @param {Object} dialog
12538 * @param {Function} callback
12539 */
12540 _createClass(IOSDialogAnimator, [{
12541 key: "show",
12542 value: function show(dialog, callback) {
12543 callback = callback ? callback : function () {};
12544 Animit.runAll(Animit(dialog._mask, this.def).default({
12545 opacity: 0
12546 }, {
12547 opacity: 1
12548 }), Animit(dialog._dialog, this.def).default({
12549 transform: "translate3d(-50%, ".concat(this.bodyHeight / 2.0 - 1, "px, 0)")
12550 }, {
12551 transform: 'translate3d(-50%, -50%, 0)'
12552 }).queue(function (done) {
12553 callback();
12554 done();
12555 }));
12556 }
12557
12558 /**
12559 * @param {Object} dialog
12560 * @param {Function} callback
12561 */
12562 }, {
12563 key: "hide",
12564 value: function hide(dialog, callback) {
12565 callback = callback ? callback : function () {};
12566 Animit.runAll(Animit(dialog._mask, this.def).default({
12567 opacity: 1
12568 }, {
12569 opacity: 0
12570 }), Animit(dialog._dialog, this.def).default({
12571 transform: 'translate3d(-50%, -50%, 0)'
12572 }, {
12573 transform: "translate3d(-50%, ".concat(this.bodyHeight / 2.0 - 1, "px, 0)")
12574 }).queue(function (done) {
12575 callback();
12576 done();
12577 }));
12578 }
12579 }]);
12580 return IOSDialogAnimator;
12581 }(DialogAnimator);
12582
12583 /**
12584 * Slide animator for dialog.
12585 */
12586 var SlideDialogAnimator = /*#__PURE__*/function (_DialogAnimator3) {
12587 _inherits(SlideDialogAnimator, _DialogAnimator3);
12588 var _super4 = _createSuper(SlideDialogAnimator);
12589 function SlideDialogAnimator() {
12590 var _this2;
12591 var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
12592 _ref4$timing = _ref4.timing,
12593 timing = _ref4$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref4$timing,
12594 _ref4$delay = _ref4.delay,
12595 delay = _ref4$delay === void 0 ? 0 : _ref4$delay,
12596 _ref4$duration = _ref4.duration,
12597 duration = _ref4$duration === void 0 ? 0.2 : _ref4$duration;
12598 _classCallCheck(this, SlideDialogAnimator);
12599 _this2 = _super4.call(this, {
12600 timing: timing,
12601 delay: delay,
12602 duration: duration
12603 });
12604 _this2.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
12605 return _this2;
12606 }
12607
12608 /**
12609 * @param {Object} dialog
12610 * @param {Function} callback
12611 */
12612 _createClass(SlideDialogAnimator, [{
12613 key: "show",
12614 value: function show(dialog, callback) {
12615 callback = callback ? callback : function () {};
12616 Animit.runAll(Animit(dialog._mask, this.def).default({
12617 opacity: 0
12618 }, {
12619 opacity: 1
12620 }), Animit(dialog._dialog, this.def).default(
12621 // FIXME: This should avoid Forced Synchronous Layout. Otherwise, fade animation of mask will be broken.
12622 {
12623 transform: "translate3d(-50%, ".concat(-(this.bodyHeight / 2.0) + 1 - dialog._dialog.clientHeight, "px, 0)")
12624 }, {
12625 transform: 'translate3d(-50%, -50%, 0)'
12626 }).queue(function (done) {
12627 callback();
12628 done();
12629 }));
12630 }
12631
12632 /**
12633 * @param {Object} dialog
12634 * @param {Function} callback
12635 */
12636 }, {
12637 key: "hide",
12638 value: function hide(dialog, callback) {
12639 callback = callback ? callback : function () {};
12640 Animit.runAll(Animit(dialog._mask, this.def).default({
12641 opacity: 1
12642 }, {
12643 opacity: 0
12644 }), Animit(dialog._dialog, this.def).default({
12645 transform: 'translate3d(-50%, -50%, 0)'
12646 },
12647 // FIXME: This should avoid Forced Synchronous Layout. Otherwise, fade animation of mask will be broken.
12648 {
12649 transform: "translate3d(-50%, ".concat(-(this.bodyHeight / 2.0) + 1 - dialog._dialog.clientHeight, "px, 0)")
12650 }).queue(function (done) {
12651 callback();
12652 done();
12653 }));
12654 }
12655 }]);
12656 return SlideDialogAnimator;
12657 }(DialogAnimator);
12658
12659 var scheme$o = {
12660 '.dialog': 'dialog--*',
12661 '.dialog-container': 'dialog-container--*',
12662 '.dialog-mask': 'dialog-mask--*'
12663 };
12664 var _animatorDict$6 = {
12665 'default': function _default() {
12666 return platform.isAndroid() ? AndroidDialogAnimator : IOSDialogAnimator;
12667 },
12668 'slide': SlideDialogAnimator,
12669 'none': DialogAnimator
12670 };
12671
12672 /**
12673 * @element ons-dialog
12674 * @category dialog
12675 * @description
12676 * [en]
12677 * 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.
12678 *
12679 * 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.
12680 *
12681 * The dialog is useful for displaying menus, additional information or to ask the user to make a decision.
12682 *
12683 * It will automatically be displayed as Material Design when running on an Android device.
12684 * [/en]
12685 * [ja][/ja]
12686 * @modifier material
12687 * [en]Display a Material Design dialog.[/en]
12688 * [ja]マテリアルデザインのダイアログを表示します。[/ja]
12689 * @codepen zxxaGa
12690 * @tutorial vanilla/Reference/dialog
12691 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
12692 * @seealso ons-alert-dialog
12693 * [en]`<ons-alert-dialog>` component[/en]
12694 * [ja]ons-alert-dialogコンポーネント[/ja]
12695 * @seealso ons-popover
12696 * [en]`<ons-popover>` component[/en]
12697 * [ja]ons-popoverコンポーネント[/ja]
12698 * @seealso ons-modal
12699 * [en]`<ons-modal>` component[/en]
12700 * [ja]ons-modalコンポーネント[/ja]
12701 * @example
12702 * <ons-dialog id="dialog">
12703 * <p>This is a dialog!</p>
12704 * </ons-dialog>
12705 *
12706 * <script>
12707 * document.getElementById('dialog').show();
12708 * </script>
12709 */
12710 var DialogElement = /*#__PURE__*/function (_BaseDialogElement) {
12711 _inherits(DialogElement, _BaseDialogElement);
12712 var _super = _createSuper(DialogElement);
12713 /**
12714 * @event preshow
12715 * @description
12716 * [en]Fired just before the dialog is displayed.[/en]
12717 * [ja]ダイアログが表示される直前に発火します。[/ja]
12718 * @param {Object} event [en]Event object.[/en]
12719 * @param {Object} event.dialog
12720 * [en]Component object.[/en]
12721 * [ja]コンポーネントのオブジェクト。[/ja]
12722 * @param {Function} event.cancel
12723 * [en]Execute this function to stop the dialog from being shown.[/en]
12724 * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
12725 */
12726
12727 /**
12728 * @event postshow
12729 * @description
12730 * [en]Fired just after the dialog is displayed.[/en]
12731 * [ja]ダイアログが表示された直後に発火します。[/ja]
12732 * @param {Object} event [en]Event object.[/en]
12733 * @param {Object} event.dialog
12734 * [en]Component object.[/en]
12735 * [ja]コンポーネントのオブジェクト。[/ja]
12736 */
12737
12738 /**
12739 * @event prehide
12740 * @description
12741 * [en]Fired just before the dialog is hidden.[/en]
12742 * [ja]ダイアログが隠れる直前に発火します。[/ja]
12743 * @param {Object} event [en]Event object.[/en]
12744 * @param {Object} event.dialog
12745 * [en]Component object.[/en]
12746 * [ja]コンポーネントのオブジェクト。[/ja]
12747 * @param {Function} event.cancel
12748 * [en]Execute this function to stop the dialog from being hidden.[/en]
12749 * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
12750 */
12751
12752 /**
12753 * @event posthide
12754 * @description
12755 * [en]Fired just after the dialog is hidden.[/en]
12756 * [ja]ダイアログが隠れた後に発火します。[/ja]
12757 * @param {Object} event [en]Event object.[/en]
12758 * @param {Object} event.dialog
12759 * [en]Component object.[/en]
12760 * [ja]コンポーネントのオブジェクト。[/ja]
12761 */
12762
12763 /**
12764 * @event dialogcancel
12765 * @description
12766 * [en]Fired when the dialog is canceled.[/en]
12767 * [ja][/ja]
12768 */
12769
12770 /**
12771 * @attribute modifier
12772 * @type {String}
12773 * @description
12774 * [en]The appearance of the dialog.[/en]
12775 * [ja]ダイアログの表現を指定します。[/ja]
12776 */
12777
12778 /**
12779 * @attribute cancelable
12780 * @description
12781 * [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]
12782 * [ja][/ja]
12783 */
12784
12785 /**
12786 * @attribute disabled
12787 * @description
12788 * [en]If this attribute is set the dialog is disabled.[/en]
12789 * [ja]この属性がある時、ダイアログはdisabled状態になります。[/ja]
12790 */
12791
12792 /**
12793 * @attribute animation
12794 * @type {String}
12795 * @default default
12796 * @description
12797 * [en]The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.[/en]
12798 * [ja]ダイアログを表示する際のアニメーション名を指定します。"none"もしくは"default"を指定できます。[/ja]
12799 */
12800
12801 /**
12802 * @attribute animation-options
12803 * @type {Expression}
12804 * @description
12805 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
12806 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
12807 */
12808
12809 /**
12810 * @property animationOptions
12811 * @type {Object}
12812 * @description
12813 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
12814 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
12815 */
12816
12817 /**
12818 * @attribute mask-color
12819 * @type {String}
12820 * @default rgba(0, 0, 0, 0.2)
12821 * @description
12822 * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
12823 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
12824 */
12825
12826 /**
12827 * @attribute visible
12828 * @type {Boolean}
12829 * @description
12830 * [en]Whether the dialog is visible or not.[/en]
12831 * [ja]要素が見える場合に`true`。[/ja]
12832 */
12833
12834 function DialogElement() {
12835 var _this;
12836 _classCallCheck(this, DialogElement);
12837 _this = _super.call(this);
12838 contentReady(_assertThisInitialized(_this), function () {
12839 return _this._compile();
12840 });
12841 return _this;
12842 }
12843 _createClass(DialogElement, [{
12844 key: "_scheme",
12845 get: function get() {
12846 return scheme$o;
12847 }
12848 }, {
12849 key: "_mask",
12850 get: function get() {
12851 return util$4.findChild(this, '.dialog-mask');
12852 }
12853 }, {
12854 key: "_dialog",
12855 get: function get() {
12856 return util$4.findChild(this, '.dialog');
12857 }
12858 }, {
12859 key: "_updateAnimatorFactory",
12860 value: function _updateAnimatorFactory() {
12861 return new AnimatorFactory({
12862 animators: _animatorDict$6,
12863 baseClass: DialogAnimator,
12864 baseClassName: 'DialogAnimator',
12865 defaultAnimation: this.getAttribute('animation')
12866 });
12867 }
12868 }, {
12869 key: "_compile",
12870 value: function _compile() {
12871 autoStyle.prepare(this);
12872 this.style.display = 'none';
12873 this.style.zIndex = 10001;
12874
12875 /* Expected result:
12876 * <ons-dialog>
12877 * <div class="dialog-mask"></div>
12878 * <div class="dialog">
12879 * <div class="dialog-container">...</div>
12880 * </div>
12881 * </ons-dialog>
12882 */
12883
12884 if (!this._dialog) {
12885 var dialog = document.createElement('div');
12886 dialog.classList.add('dialog');
12887 var container = document.createElement('div');
12888 container.classList.add('dialog-container');
12889 while (this.firstChild) {
12890 container.appendChild(this.firstChild);
12891 }
12892 dialog.appendChild(container);
12893 this.appendChild(dialog);
12894 }
12895 if (!this._mask) {
12896 var mask = document.createElement('div');
12897 mask.classList.add('dialog-mask');
12898 this.insertBefore(mask, this.firstChild);
12899 }
12900 this._dialog.style.zIndex = 20001;
12901 this._mask.style.zIndex = 20000;
12902 this.setAttribute('status-bar-fill', '');
12903 ModifierUtil.initModifier(this, this._scheme);
12904 }
12905
12906 /**
12907 * @property onDeviceBackButton
12908 * @type {Object}
12909 * @description
12910 * [en]Back-button handler.[/en]
12911 * [ja]バックボタンハンドラ。[/ja]
12912 */
12913
12914 /**
12915 * @method show
12916 * @signature show([options])
12917 * @param {Object} [options]
12918 * [en]Parameter object.[/en]
12919 * [ja]オプションを指定するオブジェクト。[/ja]
12920 * @param {String} [options.animation]
12921 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
12922 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定します。[/ja]
12923 * @param {String} [options.animationOptions]
12924 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
12925 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
12926 * @param {Function} [options.callback]
12927 * [en]This function is called after the dialog has been revealed.[/en]
12928 * [ja]ダイアログが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
12929 * @description
12930 * [en]Show the dialog.[/en]
12931 * [ja]ダイアログを開きます。[/ja]
12932 * @return {Promise} Resolves to the displayed element.
12933 */
12934
12935 /**
12936 * @method hide
12937 * @signature hide([options])
12938 * @param {Object} [options]
12939 * [en]Parameter object.[/en]
12940 * [ja]オプションを指定するオブジェクト。[/ja]
12941 * @param {String} [options.animation]
12942 * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
12943 * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定できます。[/ja]
12944 * @param {String} [options.animationOptions]
12945 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
12946 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/ja]
12947 * @param {Function} [options.callback]
12948 * [en]This functions is called after the dialog has been hidden.[/en]
12949 * [ja]ダイアログが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
12950 * @description
12951 * [en]Hide the dialog.[/en]
12952 * [ja]ダイアログを閉じます。[/ja]
12953 * @return {Promise}
12954 * [en]Resolves to the hidden element[/en]
12955 * [ja][/ja]
12956 */
12957
12958 /**
12959 * @property visible
12960 * @type {Boolean}
12961 * @description
12962 * [en]Whether the dialog is visible or not.[/en]
12963 * [ja]要素が見える場合に`true`。[/ja]
12964 */
12965
12966 /**
12967 * @property disabled
12968 * @type {Boolean}
12969 * @description
12970 * [en]Whether the dialog is disabled or not.[/en]
12971 * [ja]無効化されている場合に`true`。[/ja]
12972 */
12973
12974 /**
12975 * @property cancelable
12976 * @type {Boolean}
12977 * @description
12978 * [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]
12979 * [ja][/ja]
12980 */
12981
12982 /**
12983 * @property maskColor
12984 * @type {String}
12985 * @default rgba(0, 0, 0, 0.2)
12986 * @description
12987 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
12988 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
12989 */
12990
12991 /**
12992 * @param {String} name
12993 * @param {DialogAnimator} Animator
12994 */
12995 }], [{
12996 key: "registerAnimator",
12997 value: function registerAnimator(name, Animator) {
12998 if (!(Animator.prototype instanceof DialogAnimator)) {
12999 util$4.throwAnimator('Dialog');
13000 }
13001 _animatorDict$6[name] = Animator;
13002 }
13003 }, {
13004 key: "animators",
13005 get: function get() {
13006 return _animatorDict$6;
13007 }
13008 }, {
13009 key: "DialogAnimator",
13010 get: function get() {
13011 return DialogAnimator;
13012 }
13013 }]);
13014 return DialogElement;
13015 }(BaseDialogElement);
13016 onsElements.Dialog = DialogElement;
13017 customElements.define('ons-dialog', DialogElement);
13018
13019 var defaultClassName$d = 'fab';
13020 var scheme$n = {
13021 '': 'fab--*',
13022 '.fab__icon': 'fab--*__icon'
13023 };
13024
13025 /**
13026 * @element ons-fab
13027 * @category form
13028 * @description
13029 * [en]
13030 * 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.
13031 *
13032 * 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.
13033 * [/en]
13034 * [ja][/ja]
13035 * @tutorial vanilla/Reference/fab
13036 * @modifier mini
13037 * [en]Makes the `ons-fab` smaller.[/en]
13038 * [ja][/ja]
13039 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
13040 * @seealso ons-speed-dial
13041 * [en]The `<ons-speed-dial>` component is a Floating action button that displays a menu when tapped.[/en]
13042 * [ja][/ja]
13043 */
13044 var FabElement = /*#__PURE__*/function (_BaseElement) {
13045 _inherits(FabElement, _BaseElement);
13046 var _super = _createSuper(FabElement);
13047 /**
13048 * @attribute modifier
13049 * @type {String}
13050 * @description
13051 * [en]The appearance of the button.[/en]
13052 * [ja]ボタンの表現を指定します。[/ja]
13053 */
13054
13055 /**
13056 * @attribute ripple
13057 * @description
13058 * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
13059 * [ja][/ja]
13060 */
13061
13062 /**
13063 * @property ripple
13064 * @type {Boolean}
13065 * @description
13066 * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
13067 * [ja][/ja]
13068 */
13069
13070 /**
13071 * @attribute position
13072 * @type {String}
13073 * @description
13074 * [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]
13075 * [ja][/ja]
13076 */
13077
13078 /**
13079 * @attribute disabled
13080 * @description
13081 * [en]Specify if button should be disabled.[/en]
13082 * [ja]ボタンを無効化する場合は指定します。[/ja]
13083 */
13084
13085 function FabElement() {
13086 var _this;
13087 _classCallCheck(this, FabElement);
13088 _this = _super.call(this);
13089
13090 // The following statements can be executed before contentReady
13091 // since these do not access the children
13092 _this._hide();
13093 _this.classList.add(defaultClassName$d);
13094 contentReady(_assertThisInitialized(_this), function () {
13095 _this._compile();
13096 });
13097 return _this;
13098 }
13099 _createClass(FabElement, [{
13100 key: "_compile",
13101 value: function _compile() {
13102 autoStyle.prepare(this);
13103 if (!util$4.findChild(this, '.fab__icon')) {
13104 var content = document.createElement('span');
13105 content.classList.add('fab__icon');
13106 util$4.arrayFrom(this.childNodes).forEach(function (element) {
13107 if (!element.tagName || element.tagName.toLowerCase() !== 'ons-ripple') {
13108 content.appendChild(element);
13109 }
13110 });
13111 this.appendChild(content);
13112 }
13113 this._updateRipple();
13114 ModifierUtil.initModifier(this, scheme$n);
13115 this._updatePosition();
13116 }
13117 }, {
13118 key: "connectedCallback",
13119 value: function connectedCallback() {
13120 var _this2 = this;
13121 setImmediate(function () {
13122 return _this2._show();
13123 });
13124 }
13125 }, {
13126 key: "attributeChangedCallback",
13127 value: function attributeChangedCallback(name, last, current) {
13128 switch (name) {
13129 case 'class':
13130 util$4.restoreClass(this, defaultClassName$d, scheme$n);
13131 break;
13132 case 'modifier':
13133 ModifierUtil.onModifierChanged(last, current, this, scheme$n);
13134 break;
13135 case 'ripple':
13136 this._updateRipple();
13137 break;
13138 case 'position':
13139 this._updatePosition();
13140 break;
13141 }
13142 }
13143 }, {
13144 key: "_show",
13145 value: function _show() {
13146 if (!this._manuallyHidden) {
13147 // if user has not called ons-fab.hide()
13148 this._toggle(true);
13149 }
13150 }
13151 }, {
13152 key: "_hide",
13153 value: function _hide() {
13154 var _this3 = this;
13155 setImmediate(function () {
13156 return _this3._toggle(false);
13157 });
13158 }
13159 }, {
13160 key: "_updateRipple",
13161 value: function _updateRipple() {
13162 util$4.updateRipple(this);
13163 }
13164 }, {
13165 key: "_updatePosition",
13166 value: function _updatePosition() {
13167 var position = this.getAttribute('position');
13168 this.classList.remove('fab--top__left', 'fab--bottom__right', 'fab--bottom__left', 'fab--top__right', 'fab--top__center', 'fab--bottom__center');
13169 switch (position) {
13170 case 'top right':
13171 case 'right top':
13172 this.classList.add('fab--top__right');
13173 break;
13174 case 'top left':
13175 case 'left top':
13176 this.classList.add('fab--top__left');
13177 break;
13178 case 'bottom right':
13179 case 'right bottom':
13180 this.classList.add('fab--bottom__right');
13181 break;
13182 case 'bottom left':
13183 case 'left bottom':
13184 this.classList.add('fab--bottom__left');
13185 break;
13186 case 'center top':
13187 case 'top center':
13188 this.classList.add('fab--top__center');
13189 break;
13190 case 'center bottom':
13191 case 'bottom center':
13192 this.classList.add('fab--bottom__center');
13193 break;
13194 }
13195 }
13196
13197 /**
13198 * @method show
13199 * @signature show()
13200 * @description
13201 * [en]Show the floating action button.[/en]
13202 * [ja][/ja]
13203 */
13204 }, {
13205 key: "show",
13206 value: function show() {
13207 this.toggle(true);
13208 }
13209
13210 /**
13211 * @method hide
13212 * @signature hide()
13213 * @description
13214 * [en]Hide the floating action button.[/en]
13215 * [ja][/ja]
13216 */
13217 }, {
13218 key: "hide",
13219 value: function hide() {
13220 this.toggle(false);
13221 }
13222
13223 /**
13224 * @method toggle
13225 * @signature toggle()
13226 * @description
13227 * [en]Toggle the visibility of the button.[/en]
13228 * [ja][/ja]
13229 */
13230 }, {
13231 key: "toggle",
13232 value: function toggle() {
13233 var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : !this.visible;
13234 this._manuallyHidden = !action;
13235 this._toggle(action);
13236 }
13237 }, {
13238 key: "_toggle",
13239 value: function _toggle() {
13240 var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : !this.visible;
13241 var isBottom = (this.getAttribute('position') || '').indexOf('bottom') >= 0;
13242 var translate = isBottom ? "translate3d(0px, -".concat(util$4.globals.fabOffset || 0, "px, 0px)") : '';
13243 styler(this, {
13244 transform: "".concat(translate, " scale(").concat(Number(action), ")")
13245 });
13246 }
13247
13248 /**
13249 * @property disabled
13250 * @type {Boolean}
13251 * @description
13252 * [en]Whether the element is disabled or not.[/en]
13253 * [ja]無効化されている場合に`true`。[/ja]
13254 */
13255
13256 /**
13257 * @property visible
13258 * @readonly
13259 * @type {Boolean}
13260 * @description
13261 * [en]Whether the element is visible or not.[/en]
13262 * [ja]要素が見える場合に`true`。[/ja]
13263 */
13264 }, {
13265 key: "visible",
13266 get: function get() {
13267 return this.style.transform.indexOf('scale(0)') === -1 && this.style.display !== 'none';
13268 }
13269 }], [{
13270 key: "observedAttributes",
13271 get: function get() {
13272 return ['modifier', 'ripple', 'position', 'class'];
13273 }
13274 }]);
13275 return FabElement;
13276 }(BaseElement);
13277 util$4.defineBooleanProperties(FabElement, ['disabled', 'ripple']);
13278 onsElements.Fab = FabElement;
13279 customElements.define('ons-fab', FabElement);
13280
13281 /**
13282 * @element ons-gesture-detector
13283 * @category gesture
13284 * @description
13285 * [en]
13286 * Component to detect finger gestures within the wrapped element. Following gestures are supported:
13287 * - Drag gestures: `drag`, `dragleft`, `dragright`, `dragup`, `dragdown`
13288 * - Hold gestures: `hold`, `release`
13289 * - Swipe gestures: `swipe`, `swipeleft`, `swiperight`, `swipeup`, `swipedown`
13290 * - Tap gestures: `tap`, `doubletap`
13291 * - Pinch gestures: `pinch`, `pinchin`, `pinchout`
13292 * - Other gestures: `touch`, `transform`, `rotate`
13293 * [/en]
13294 * [ja]要素内のジェスチャー操作を検知します。詳しくはガイドを参照してください。[/ja]
13295 * @guide features.html#gesture-detection
13296 * [en]Detecting finger gestures[/en]
13297 * [ja]ジェスチャー操作の検知[/ja]
13298 * @example
13299 * <ons-gesture-detector>
13300 * <div id="detect-area" style="width: 100px; height: 100px;">
13301 * Swipe Here
13302 * </div>
13303 * </ons-gesture-detector>
13304 *
13305 * <script>
13306 * document.addEventListener('swipeleft', function(event) {
13307 * if (event.target.matches('#detect-area')) {
13308 * console.log('Swipe left is detected.');
13309 * }
13310 * });
13311 * </script>
13312 */
13313 var GestureDetectorElement = /*#__PURE__*/function (_BaseElement) {
13314 _inherits(GestureDetectorElement, _BaseElement);
13315 var _super = _createSuper(GestureDetectorElement);
13316 function GestureDetectorElement() {
13317 var _this;
13318 _classCallCheck(this, GestureDetectorElement);
13319 _this = _super.call(this);
13320 _this._gestureDetector = new GestureDetector(_assertThisInitialized(_this), {
13321 passive: true
13322 });
13323 return _this;
13324 }
13325 return _createClass(GestureDetectorElement);
13326 }(BaseElement);
13327 onsElements.GestureDetector = GestureDetectorElement;
13328 customElements.define('ons-gesture-detector', GestureDetectorElement);
13329
13330 var autoPrefix = 'fa'; // FIXME: To be removed in v3
13331
13332 /**
13333 * @element ons-icon
13334 * @category visual
13335 * @description
13336 * [en]
13337 * Displays an icon. The following icon suites are available:
13338 *
13339 * * [Font Awesome](https://fortawesome.github.io/Font-Awesome/)
13340 * * [Ionicons](http://ionicons.com/)
13341 * * [Material Design Iconic Font](http://zavoloklom.github.io/material-design-iconic-font/)
13342 * [/en]
13343 * [ja][/ja]
13344 * @codepen xAhvg
13345 * @tutorial vanilla/Reference/icon
13346 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja][/ja]
13347 * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
13348 * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
13349 * @example
13350 * <ons-icon
13351 * icon="md-car"
13352 * size="20px"
13353 * style="color: red">
13354 * </ons-icon>
13355 *
13356 * <ons-button>
13357 * <ons-icon icon="md-car"></ons-icon>
13358 * Car
13359 * </ons-button>
13360 */
13361 var IconElement = /*#__PURE__*/function (_BaseElement) {
13362 _inherits(IconElement, _BaseElement);
13363 var _super = _createSuper(IconElement);
13364 /**
13365 * @attribute icon
13366 * @type {String}
13367 * @description
13368 * [en]
13369 * The icon name. `"md-"` prefix for Material Icons, `"fa-"` for Font Awesome and `"ion-"` prefix for Ionicons.
13370 *
13371 * See all available icons on the element description (at the top).
13372 *
13373 * Icons can also be styled based on modifier presence. Add comma-separated icons with `"modifierName:"` prefix.
13374 *
13375 * 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.
13376 *
13377 * `fa-` prefix is added automatically if none is provided. Check [See also](#seealso) section for more information.
13378 * [/en]
13379 * [ja][/ja]
13380 */
13381
13382 /**
13383 * @attribute size
13384 * @type {String}
13385 * @description
13386 * [en]
13387 * The sizes of the icon. Valid values are lg, 2x, 3x, 4x, 5x, or in the size in pixels.
13388 * Icons can also be styled based on modifier presence. Add comma-separated icons with `"modifierName:"` prefix.
13389 *
13390 * The code:
13391 *
13392 * ```
13393 * <ons-icon
13394 * icon="ion-edit"
13395 * size="32px, material:24px">
13396 * </ons-icon>
13397 * ```
13398 *
13399 * will render as a `24px` icon if the `"material"` modifier is present and `32px` otherwise.
13400 * [/en]
13401 * [ja][/ja]
13402 */
13403
13404 /**
13405 * @attribute rotate
13406 * @type {Number}
13407 * @description
13408 * [en]Number of degrees to rotate the icon. Valid values are 90, 180 and 270.[/en]
13409 * [ja]アイコンを回転して表示します。90, 180, 270から指定できます。[/ja]
13410 */
13411
13412 /**
13413 * @attribute fixed-width
13414 * @type {Boolean}
13415 * @default false
13416 * @description
13417 * [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]
13418 * [ja][/ja]
13419 */
13420
13421 /**
13422 * @property fixedWidth
13423 * @type {Boolean}
13424 * @default false
13425 * @description
13426 * [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]
13427 * [ja][/ja]
13428 */
13429
13430 /**
13431 * @attribute spin
13432 * @description
13433 * [en]Specify whether the icon should be spinning.[/en]
13434 * [ja]アイコンを回転するかどうかを指定します。[/ja]
13435 */
13436
13437 /**
13438 * @property spin
13439 * @type {Boolean}
13440 * @description
13441 * [en]Specify whether the icon should be spinning.[/en]
13442 * [ja]アイコンを回転するかどうかを指定します。[/ja]
13443 */
13444
13445 function IconElement() {
13446 var _this;
13447 _classCallCheck(this, IconElement);
13448 _this = _super.call(this);
13449 contentReady(_assertThisInitialized(_this), function () {
13450 _this._compile();
13451 });
13452 return _this;
13453 }
13454 _createClass(IconElement, [{
13455 key: "attributeChangedCallback",
13456 value: function attributeChangedCallback(name, last, current) {
13457 this._cleanClassAttribute(name === 'icon' ? last : this.getAttribute('icon'), name === 'modifier' ? last : undefined);
13458 this._update();
13459 }
13460 }, {
13461 key: "_compile",
13462 value: function _compile() {
13463 autoStyle.prepare(this);
13464 this._update();
13465 }
13466 }, {
13467 key: "_update",
13468 value: function _update() {
13469 var _this2 = this;
13470 var _this$_buildClassAndS = this._buildClassAndStyle(this._parseAttr('icon'), this._parseAttr('size')),
13471 classList = _this$_buildClassAndS.classList,
13472 style = _this$_buildClassAndS.style;
13473 util$4.extend(this.style, style);
13474 classList.forEach(function (className) {
13475 return _this2.classList.add(className);
13476 });
13477 }
13478 }, {
13479 key: "_parseAttr",
13480 value: function _parseAttr(attrName) {
13481 var modifier = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getAttribute('modifier') || '';
13482 var attr = this.getAttribute(attrName) || attrName || '';
13483 var parts = attr.split(/\s*,\s*/);
13484 var def = parts[0];
13485 var md = parts[1];
13486 md = (md || '').split(/\s*:\s*/);
13487 return (modifier && RegExp("(^|\\s+)".concat(md[0], "($|\\s+)"), 'i').test(modifier) ? md[1] : def) || '';
13488 }
13489
13490 /**
13491 * Remove unneeded class value.
13492 */
13493 }, {
13494 key: "_cleanClassAttribute",
13495 value: function _cleanClassAttribute(lastIcon, lastModifier) {
13496 var _this3 = this;
13497 var _this$_prefixIcon = this._prefixIcon(this._parseAttr(lastIcon, lastModifier)),
13498 className = _this$_prefixIcon.className,
13499 prefix = _this$_prefixIcon.prefix;
13500 var customPrefixRE = className !== prefix ? "|".concat(prefix, "$|").concat(prefix, "-") : "|".concat(className, "$") || '';
13501 var re = new RegExp("^(fa$|fa-|ion-|zmdi$|zmdi-|ons-icon--".concat(customPrefixRE, ")"));
13502 util$4.arrayFrom(this.classList).filter(function (className) {
13503 return re.test(className);
13504 }).forEach(function (className) {
13505 return _this3.classList.remove(className);
13506 });
13507 }
13508 }, {
13509 key: "_prefixIcon",
13510 value: function _prefixIcon(iconName) {
13511 var className = autoPrefix + (autoPrefix ? '-' : '') + iconName;
13512 return {
13513 className: className,
13514 prefix: className.split('-')[0]
13515 };
13516 }
13517 }, {
13518 key: "_buildClassAndStyle",
13519 value: function _buildClassAndStyle(iconName, size) {
13520 var classList = ['ons-icon'];
13521 var style = {};
13522
13523 // Icon
13524 if (iconName.indexOf('ion-') === 0) {
13525 classList.push(iconName);
13526 classList.push('ons-icon--ion');
13527 } else if (iconName.indexOf('fa-') === 0) {
13528 classList.push(iconName);
13529 // default icon style to Font Awesome Solid if icon style is not specified already
13530 if (!(this.classList.contains('far') || this.classList.contains('fab') || this.classList.contains('fal'))) {
13531 classList.push('fa');
13532 }
13533 } else if (iconName.indexOf('md-') === 0) {
13534 classList.push('zmdi');
13535 classList.push('zmdi-' + iconName.split(/-(.+)?/)[1]);
13536 } else {
13537 var _this$_prefixIcon2 = this._prefixIcon(iconName),
13538 className = _this$_prefixIcon2.className,
13539 prefix = _this$_prefixIcon2.prefix;
13540 prefix && classList.push(prefix);
13541 className && classList.push(className);
13542 }
13543
13544 // Size
13545 if (size.match(/^[1-5]x|lg$/)) {
13546 classList.push('ons-icon--' + size);
13547 this.style.removeProperty('font-size');
13548 } else {
13549 style.fontSize = size;
13550 }
13551 return {
13552 classList: classList,
13553 style: style
13554 };
13555 }
13556 }], [{
13557 key: "observedAttributes",
13558 get: function get() {
13559 return ['icon', 'size', 'modifier', 'class'];
13560 }
13561 }, {
13562 key: "setAutoPrefix",
13563 value: function setAutoPrefix(prefix) {
13564 autoPrefix = prefix ? typeof prefix === 'string' && prefix || 'fa' : '';
13565 }
13566 }]);
13567 return IconElement;
13568 }(BaseElement);
13569 util$4.defineBooleanProperties(IconElement, ['fixed-width', 'spin']);
13570 onsElements.Icon = IconElement;
13571 customElements.define('ons-icon', IconElement);
13572
13573 var LazyRepeatDelegate = /*#__PURE__*/function () {
13574 function LazyRepeatDelegate(userDelegate) {
13575 var templateElement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
13576 _classCallCheck(this, LazyRepeatDelegate);
13577 if (_typeof(userDelegate) !== 'object' || userDelegate === null) {
13578 util$4.throw('"delegate" parameter must be an object');
13579 }
13580 this._userDelegate = userDelegate;
13581 if (!(templateElement instanceof Element) && templateElement !== null) {
13582 util$4.throw('"templateElement" parameter must be an instance of Element or null');
13583 }
13584 this._templateElement = templateElement;
13585 }
13586 _createClass(LazyRepeatDelegate, [{
13587 key: "itemHeight",
13588 get: function get() {
13589 return this._userDelegate.itemHeight;
13590 }
13591
13592 /**
13593 * @return {Boolean}
13594 */
13595 }, {
13596 key: "hasRenderFunction",
13597 value: function hasRenderFunction() {
13598 return this._userDelegate._render instanceof Function;
13599 }
13600
13601 /**
13602 * @return {void}
13603 */
13604 }, {
13605 key: "_render",
13606 value: function _render() {
13607 this._userDelegate._render.apply(this._userDelegate, arguments);
13608 }
13609
13610 /**
13611 * @param {Number} index
13612 * @param {Function} done A function that take item object as parameter.
13613 */
13614 }, {
13615 key: "loadItemElement",
13616 value: function loadItemElement(index, done) {
13617 if (this._userDelegate.loadItemElement instanceof Function) {
13618 this._userDelegate.loadItemElement(index, done);
13619 } else {
13620 var element = this._userDelegate.createItemContent(index, this._templateElement);
13621 if (!(element instanceof Element)) {
13622 util$4.throw('"createItemContent" must return an instance of Element');
13623 }
13624 done({
13625 element: element
13626 });
13627 }
13628 }
13629
13630 /**
13631 * @return {Number}
13632 */
13633 }, {
13634 key: "countItems",
13635 value: function countItems() {
13636 var count = this._userDelegate.countItems();
13637 if (typeof count !== 'number') {
13638 util$4.throw('"countItems" must return a number');
13639 }
13640 return count;
13641 }
13642
13643 /**
13644 * @param {Number} index
13645 * @param {Object} item
13646 * @param {Element} item.element
13647 */
13648 }, {
13649 key: "updateItem",
13650 value: function updateItem(index, item) {
13651 if (this._userDelegate.updateItemContent instanceof Function) {
13652 this._userDelegate.updateItemContent(index, item);
13653 }
13654 }
13655
13656 /**
13657 * @return {Number}
13658 */
13659 }, {
13660 key: "calculateItemHeight",
13661 value: function calculateItemHeight(index) {
13662 if (this._userDelegate.calculateItemHeight instanceof Function) {
13663 var height = this._userDelegate.calculateItemHeight(index);
13664 if (typeof height !== 'number') {
13665 util$4.throw('"calculateItemHeight" must return a number');
13666 }
13667 return height;
13668 }
13669 return 0;
13670 }
13671
13672 /**
13673 * @param {Number} index
13674 * @param {Object} item
13675 */
13676 }, {
13677 key: "destroyItem",
13678 value: function destroyItem(index, item) {
13679 if (this._userDelegate.destroyItem instanceof Function) {
13680 this._userDelegate.destroyItem(index, item);
13681 }
13682 }
13683
13684 /**
13685 * @return {void}
13686 */
13687 }, {
13688 key: "destroy",
13689 value: function destroy() {
13690 if (this._userDelegate.destroy instanceof Function) {
13691 this._userDelegate.destroy();
13692 }
13693 this._userDelegate = this._templateElement = null;
13694 }
13695 }]);
13696 return LazyRepeatDelegate;
13697 }();
13698
13699 /**
13700 * This class provide core functions for ons-lazy-repeat.
13701 */
13702 var LazyRepeatProvider = /*#__PURE__*/function () {
13703 /**
13704 * @param {Element} wrapperElement
13705 * @param {LazyRepeatDelegate} delegate
13706 */
13707 function LazyRepeatProvider(wrapperElement, delegate) {
13708 _classCallCheck(this, LazyRepeatProvider);
13709 if (!(delegate instanceof LazyRepeatDelegate)) {
13710 util$4.throw('"delegate" parameter must be an instance of LazyRepeatDelegate');
13711 }
13712 this._wrapperElement = wrapperElement;
13713 this._delegate = delegate;
13714 this._insertIndex = this._wrapperElement.children[0] && this._wrapperElement.children[0].tagName === 'ONS-LAZY-REPEAT' ? 1 : 0;
13715 if (wrapperElement.tagName.toLowerCase() === 'ons-list') {
13716 wrapperElement.classList.add('lazy-list');
13717 }
13718 this._pageContent = this._findPageContentElement(wrapperElement);
13719 if (!this._pageContent) {
13720 util$4.throw('LazyRepeat must be descendant of a Page element');
13721 }
13722 this.lastScrollTop = this._pageContent.scrollTop;
13723 this.padding = 0;
13724 this._topPositions = [0];
13725 this._renderedItems = {};
13726 if (!this._delegate.itemHeight && !this._delegate.calculateItemHeight(0)) {
13727 this._unknownItemHeight = true;
13728 }
13729 this._addEventListeners();
13730 this._onChange();
13731 }
13732 _createClass(LazyRepeatProvider, [{
13733 key: "padding",
13734 get: function get() {
13735 return parseInt(this._wrapperElement.style.paddingTop, 10);
13736 },
13737 set: function set(newValue) {
13738 this._wrapperElement.style.paddingTop = newValue + 'px';
13739 }
13740 }, {
13741 key: "_findPageContentElement",
13742 value: function _findPageContentElement(wrapperElement) {
13743 var pageContent = util$4.findParent(wrapperElement, '.page__content');
13744 if (pageContent) {
13745 return pageContent;
13746 }
13747 var page = util$4.findParent(wrapperElement, 'ons-page');
13748 if (page) {
13749 var content = util$4.findChild(page, '.content');
13750 if (content) {
13751 return content;
13752 }
13753 }
13754 return null;
13755 }
13756 }, {
13757 key: "_checkItemHeight",
13758 value: function _checkItemHeight(callback) {
13759 var _this = this;
13760 this._delegate.loadItemElement(0, function (item) {
13761 if (!_this._unknownItemHeight) {
13762 util$4.throw('Invalid state');
13763 }
13764 _this._wrapperElement.appendChild(item.element);
13765 var done = function done() {
13766 _this._delegate.destroyItem(0, item);
13767 item.element && item.element.remove();
13768 delete _this._unknownItemHeight;
13769 callback();
13770 };
13771 _this._itemHeight = item.element.offsetHeight;
13772 if (_this._itemHeight > 0) {
13773 done();
13774 return;
13775 }
13776
13777 // retry to measure offset height
13778 // dirty fix for angular2 directive
13779 _this._wrapperElement.style.visibility = 'hidden';
13780 item.element.style.visibility = 'hidden';
13781 setImmediate(function () {
13782 _this._itemHeight = item.element.offsetHeight;
13783 if (_this._itemHeight == 0) {
13784 util$4.throw('Invalid state: "itemHeight" must be greater than zero');
13785 }
13786 _this._wrapperElement.style.visibility = '';
13787 done();
13788 });
13789 });
13790 }
13791 }, {
13792 key: "staticItemHeight",
13793 get: function get() {
13794 return this._delegate.itemHeight || this._itemHeight;
13795 }
13796 }, {
13797 key: "_countItems",
13798 value: function _countItems() {
13799 return this._delegate.countItems();
13800 }
13801 }, {
13802 key: "_getItemHeight",
13803 value: function _getItemHeight(i) {
13804 // Item is rendered
13805 if (Object.prototype.hasOwnProperty.call(this._renderedItems, i)) {
13806 if (!Object.prototype.hasOwnProperty.call(this._renderedItems[i], 'height')) {
13807 this._renderedItems[i].height = this._renderedItems[i].element.offsetHeight;
13808 }
13809 return this._renderedItems[i].height;
13810 }
13811
13812 // Item is not rendered, scroll up
13813 if (this._topPositions[i + 1] && this._topPositions[i]) {
13814 return this._topPositions[i + 1] - this._topPositions[i];
13815 }
13816 // Item is not rendered, scroll down
13817 return this.staticItemHeight || this._delegate.calculateItemHeight(i);
13818 }
13819 }, {
13820 key: "_calculateRenderedHeight",
13821 value: function _calculateRenderedHeight() {
13822 var _this2 = this;
13823 return Object.keys(this._renderedItems).reduce(function (a, b) {
13824 return a + _this2._getItemHeight(+b);
13825 }, 0);
13826 }
13827 }, {
13828 key: "_onChange",
13829 value: function _onChange() {
13830 this._render();
13831 }
13832 }, {
13833 key: "_lastItemRendered",
13834 value: function _lastItemRendered() {
13835 return Math.max.apply(Math, _toConsumableArray(Object.keys(this._renderedItems)));
13836 }
13837 }, {
13838 key: "_firstItemRendered",
13839 value: function _firstItemRendered() {
13840 return Math.min.apply(Math, _toConsumableArray(Object.keys(this._renderedItems)));
13841 }
13842 }, {
13843 key: "refresh",
13844 value: function refresh() {
13845 var forceRender = {
13846 forceScrollDown: true
13847 };
13848 var firstItemIndex = this._firstItemRendered();
13849 if (util$4.isInteger(firstItemIndex)) {
13850 this._wrapperElement.style.height = this._topPositions[firstItemIndex] + this._calculateRenderedHeight() + 'px';
13851 this.padding = this._topPositions[firstItemIndex];
13852 forceRender.forceFirstIndex = firstItemIndex;
13853 }
13854 this._removeAllElements();
13855 this._render(forceRender);
13856 this._wrapperElement.style.height = 'inherit';
13857 }
13858 }, {
13859 key: "_render",
13860 value: function _render() {
13861 var _this3 = this;
13862 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
13863 _ref$forceScrollDown = _ref.forceScrollDown,
13864 forceScrollDown = _ref$forceScrollDown === void 0 ? false : _ref$forceScrollDown,
13865 forceFirstIndex = _ref.forceFirstIndex,
13866 forceLastIndex = _ref.forceLastIndex;
13867 if (this._unknownItemHeight) {
13868 return this._checkItemHeight(this._render.bind(this, arguments[0]));
13869 }
13870 var isScrollUp = !forceScrollDown && this.lastScrollTop > this._pageContent.scrollTop;
13871 this.lastScrollTop = this._pageContent.scrollTop;
13872 var keep = {};
13873 var offset = this._wrapperElement.getBoundingClientRect().top;
13874 var limit = 4 * window.innerHeight - offset;
13875 var count = this._countItems();
13876 var start = forceFirstIndex || Math.max(0, this._calculateStartIndex(offset) - 30); // Recalculate for 0 or undefined
13877 var i = start;
13878 for (var top = this._topPositions[i]; i < count && top < limit; i++) {
13879 if (i >= this._topPositions.length) {
13880 // perf optimization
13881 this._topPositions.length += 100;
13882 }
13883 this._topPositions[i] = top;
13884 top += this._getItemHeight(i);
13885 }
13886 if (this._delegate.hasRenderFunction && this._delegate.hasRenderFunction()) {
13887 return this._delegate._render(start, i, function () {
13888 _this3.padding = _this3._topPositions[start];
13889 });
13890 }
13891 if (isScrollUp) {
13892 for (var j = i - 1; j >= start; j--) {
13893 keep[j] = true;
13894 this._renderElement(j, isScrollUp);
13895 }
13896 } else {
13897 var lastIndex = forceLastIndex || Math.max.apply(Math, [i - 1].concat(_toConsumableArray(Object.keys(this._renderedItems)))); // Recalculate for 0 or undefined
13898 for (var _j = start; _j <= lastIndex; _j++) {
13899 keep[_j] = true;
13900 this._renderElement(_j, isScrollUp);
13901 }
13902 }
13903 Object.keys(this._renderedItems).forEach(function (key) {
13904 return keep[key] || _this3._removeElement(key, isScrollUp);
13905 });
13906 }
13907
13908 /**
13909 * @param {Number} index
13910 * @param {Boolean} isScrollUp
13911 */
13912 }, {
13913 key: "_renderElement",
13914 value: function _renderElement(index, isScrollUp) {
13915 var _this4 = this;
13916 var item = this._renderedItems[index];
13917 if (item) {
13918 this._delegate.updateItem(index, item); // update if it exists
13919 return;
13920 }
13921 this._delegate.loadItemElement(index, function (item) {
13922 if (isScrollUp) {
13923 _this4._wrapperElement.insertBefore(item.element, _this4._wrapperElement.children[_this4._insertIndex]);
13924 _this4.padding = _this4._topPositions[index];
13925 item.height = _this4._topPositions[index + 1] - _this4._topPositions[index];
13926 } else {
13927 _this4._wrapperElement.appendChild(item.element);
13928 }
13929 _this4._renderedItems[index] = item;
13930 });
13931 }
13932
13933 /**
13934 * @param {Number} index
13935 * @param {Boolean} isScrollUp
13936 */
13937 }, {
13938 key: "_removeElement",
13939 value: function _removeElement(index) {
13940 var isScrollUp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
13941 index = +index;
13942 var item = this._renderedItems[index];
13943 this._delegate.destroyItem(index, item);
13944 if (isScrollUp) {
13945 this._topPositions[index + 1] = undefined;
13946 } else {
13947 this.padding = this.padding + this._getItemHeight(index);
13948 }
13949 if (item.element.parentElement) {
13950 item.element.parentElement.removeChild(item.element);
13951 }
13952 delete this._renderedItems[index];
13953 }
13954 }, {
13955 key: "_removeAllElements",
13956 value: function _removeAllElements() {
13957 var _this5 = this;
13958 Object.keys(this._renderedItems).forEach(function (key) {
13959 return _this5._removeElement(key);
13960 });
13961 }
13962 }, {
13963 key: "_recalculateTopPositions",
13964 value: function _recalculateTopPositions(start, end) {
13965 for (var i = start; i <= end; i++) {
13966 this._topPositions[i + 1] = this._topPositions[i] + this._getItemHeight(i);
13967 }
13968 }
13969 }, {
13970 key: "_calculateStartIndex",
13971 value: function _calculateStartIndex(current) {
13972 var firstItemIndex = this._firstItemRendered();
13973 var lastItemIndex = this._lastItemRendered();
13974
13975 // Fix for Safari scroll and Angular 2
13976 this._recalculateTopPositions(firstItemIndex, lastItemIndex);
13977 var start = 0;
13978 var end = this._countItems() - 1;
13979
13980 // Binary search for index at top of screen so we can speed up rendering.
13981 for (;;) {
13982 var middle = Math.floor((start + end) / 2);
13983 var value = current + this._topPositions[middle];
13984 if (end < start) {
13985 return 0;
13986 } else if (value <= 0 && value + this._getItemHeight(middle) > 0) {
13987 return middle;
13988 } else if (isNaN(value) || value >= 0) {
13989 end = middle - 1;
13990 } else {
13991 start = middle + 1;
13992 }
13993 }
13994 }
13995 }, {
13996 key: "_debounce",
13997 value: function _debounce(func, wait, immediate) {
13998 var timeout;
13999 return function () {
14000 var _arguments = arguments,
14001 _this6 = this;
14002 var callNow = immediate && !timeout;
14003 clearTimeout(timeout);
14004 if (callNow) {
14005 func.apply(this, arguments);
14006 } else {
14007 timeout = setTimeout(function () {
14008 timeout = null;
14009 func.apply(_this6, _arguments);
14010 }, wait);
14011 }
14012 };
14013 }
14014 }, {
14015 key: "_doubleFireOnTouchend",
14016 value: function _doubleFireOnTouchend() {
14017 this._render();
14018 this._debounce(this._render.bind(this), 100);
14019 }
14020 }, {
14021 key: "_addEventListeners",
14022 value: function _addEventListeners() {
14023 util$4.bindListeners(this, ['_onChange', '_doubleFireOnTouchend']);
14024 if (platform.isIOS()) {
14025 this._boundOnChange = this._debounce(this._boundOnChange, 30);
14026 }
14027 this._pageContent.addEventListener('scroll', this._boundOnChange, true);
14028 if (platform.isIOS()) {
14029 util$4.addEventListener(this._pageContent, 'touchmove', this._boundOnChange, {
14030 capture: true,
14031 passive: true
14032 });
14033 this._pageContent.addEventListener('touchend', this._boundDoubleFireOnTouchend, true);
14034 }
14035 window.document.addEventListener('resize', this._boundOnChange, true);
14036 }
14037 }, {
14038 key: "_removeEventListeners",
14039 value: function _removeEventListeners() {
14040 this._pageContent.removeEventListener('scroll', this._boundOnChange, true);
14041 if (platform.isIOS()) {
14042 util$4.removeEventListener(this._pageContent, 'touchmove', this._boundOnChange, {
14043 capture: true,
14044 passive: true
14045 });
14046 this._pageContent.removeEventListener('touchend', this._boundDoubleFireOnTouchend, true);
14047 }
14048 window.document.removeEventListener('resize', this._boundOnChange, true);
14049 }
14050 }, {
14051 key: "destroy",
14052 value: function destroy() {
14053 this._removeAllElements();
14054 this._delegate.destroy();
14055 this._parentElement = this._delegate = this._renderedItems = null;
14056 this._removeEventListeners();
14057 }
14058 }]);
14059 return LazyRepeatProvider;
14060 }();
14061
14062 /**
14063 * @element ons-lazy-repeat
14064 * @category list
14065 * @description
14066 * [en]
14067 * Using this component a list with millions of items can be rendered without a drop in performance.
14068 * It does that by "lazily" loading elements into the DOM when they come into view and
14069 * removing items from the DOM when they are not visible.
14070 * [/en]
14071 * [ja]
14072 * このコンポーネント内で描画されるアイテムのDOM要素の読み込みは、画面に見えそうになった時まで自動的に遅延され、
14073 * 画面から見えなくなった場合にはその要素は動的にアンロードされます。
14074 * このコンポーネントを使うことで、パフォーマンスを劣化させること無しに巨大な数の要素を描画できます。
14075 * [/ja]
14076 * @codepen QwrGBm
14077 * @tutorial vanilla/Reference/lazy-repeat
14078 * @seealso ons-list
14079 * [en]The `<ons-list>` element is used to render a list.[/en]
14080 * [ja]`<ons-list>`要素はリストを描画するのに使われます。[/ja]
14081 * @example
14082 * <script>
14083 * window.addEventListener('load', function() {
14084 * var lazyRepeat = document.querySelector('#list');
14085 * lazyRepeat.delegate = {
14086 * createItemContent: function(i, template) {
14087 * var dom = template.cloneNode(true);
14088 * dom.innerText = i;
14089 *
14090 * return dom;
14091 * },
14092 * countItems: function() {
14093 * return 10000000;
14094 * },
14095 * destroyItem: function(index, item) {
14096 * console.log('Destroyed item with index: ' + index);
14097 * }
14098 * };
14099 * });
14100 * </script>
14101 *
14102 * <ons-list id="list">
14103 * <ons-lazy-repeat>
14104 * <ons-list-item></ons-list-item>
14105 * </ons-lazy-repeat>
14106 * </ons-list>
14107 */
14108 var LazyRepeatElement = /*#__PURE__*/function (_BaseElement) {
14109 _inherits(LazyRepeatElement, _BaseElement);
14110 var _super = _createSuper(LazyRepeatElement);
14111 function LazyRepeatElement() {
14112 _classCallCheck(this, LazyRepeatElement);
14113 return _super.apply(this, arguments);
14114 }
14115 _createClass(LazyRepeatElement, [{
14116 key: "connectedCallback",
14117 value: function connectedCallback() {
14118 // not very good idea and also not documented
14119 if (this.hasAttribute('delegate')) {
14120 this.delegate = window[this.getAttribute('delegate')];
14121 }
14122 }
14123
14124 /**
14125 * @property delegate
14126 * @type {Object}
14127 * @description
14128 * [en]Specify a delegate object to load and unload item elements.[/en]
14129 * [ja]要素のロード、アンロードなどの処理を委譲するオブジェクトを指定します。[/ja]
14130 */
14131
14132 /**
14133 * @property delegate.createItemContent
14134 * @type {Function}
14135 * @description
14136 * [en]
14137 * This function should return a `HTMLElement`.
14138 *
14139 * 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.
14140 * [/en]
14141 * [ja]
14142 * この関数は`HTMLElement`を返してください。
14143 * 要素を生成しやすくするために、現在のアイテムのインデックスとテンプレートが引数に渡されます。
14144 * このテンプレートは、`<ons-lazy-repeat>`要素のコンテンツが渡されます。
14145 * [/ja]
14146 */
14147
14148 /**
14149 * @property delegate.countItems
14150 * @type {Function}
14151 * @description
14152 * [en]Should return the number of items in the list.[/en]
14153 * [ja]リスト内のアイテム数を返してください。[/ja]
14154 */
14155
14156 /**
14157 * @property delegate.calculateItemHeight
14158 * @type {Function}
14159 * @description
14160 * [en]
14161 * Should return the height of an item. The index is provided as an argument.
14162 *
14163 * This is important when rendering lists where the items have different height.
14164 *
14165 * 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.
14166 * [/en]
14167 * [ja]
14168 * アイテムの高さ(ピクセル)を返してください。アイテムのインデックス値は引数で渡されます。
14169 * この関数は、それぞれのアイムが違った高さを持つリストをレンダリングする際に重要です。
14170 * この関数はオプショナルです。もしこの関数が無い場合には、
14171 * 最初のアイテムの高さが他のすべてのアイテムの高さとして利用されます。
14172 * [/ja]
14173 */
14174
14175 /**
14176 * @property delegate.destroyItem
14177 * @type {Function}
14178 * @description
14179 * [en]
14180 * This function is used called when an item is removed from the DOM. The index and DOM element is provided as arguments.
14181 *
14182 * The function is optional but may be important in order to avoid memory leaks.
14183 * [/en]
14184 * [ja]
14185 * この関数は、あるアイテムがDOMツリーから除かれた時に呼び出されます。
14186 * アイテムのインデックス値とDOM要素が引数として渡されます。
14187 * この関数はオプショナルですが、各アイテムの後処理が必要な場合にはメモリーリークを避けるために重要です。
14188 * [/ja]
14189 */
14190 }, {
14191 key: "delegate",
14192 get: function get() {
14193 // eslint-disable-line getter-return
14194 util$4.throw('No delegate getter');
14195 }
14196
14197 /**
14198 * @method refresh
14199 * @signature refresh()
14200 * @description
14201 * [en]Refresh the list. Use this method when the data has changed.[/en]
14202 * [ja]リストを更新します。もしデータが変わった場合にはこのメソッドを使ってください。[/ja]
14203 */,
14204 set: function set(userDelegate) {
14205 this._lazyRepeatProvider && this._lazyRepeatProvider.destroy();
14206 if (!this._templateElement && this.children[0]) {
14207 this._templateElement = this.removeChild(this.children[0]);
14208 }
14209 var delegate = new LazyRepeatDelegate(userDelegate, this._templateElement || null);
14210 this._lazyRepeatProvider = new LazyRepeatProvider(this.parentElement, delegate);
14211 }
14212 }, {
14213 key: "refresh",
14214 value: function refresh() {
14215 this._lazyRepeatProvider && this._lazyRepeatProvider.refresh();
14216 }
14217 }, {
14218 key: "attributeChangedCallback",
14219 value: function attributeChangedCallback(name, last, current) {}
14220 }, {
14221 key: "disconnectedCallback",
14222 value: function disconnectedCallback() {
14223 if (this._lazyRepeatProvider) {
14224 this._lazyRepeatProvider.destroy();
14225 this._lazyRepeatProvider = null;
14226 }
14227 }
14228 }]);
14229 return LazyRepeatElement;
14230 }(BaseElement);
14231 internal$1.LazyRepeatDelegate = LazyRepeatDelegate;
14232 internal$1.LazyRepeatProvider = LazyRepeatProvider;
14233 onsElements.LazyRepeat = LazyRepeatElement;
14234 customElements.define('ons-lazy-repeat', LazyRepeatElement);
14235
14236 var defaultClassName$c = 'list-header';
14237 var scheme$m = {
14238 '': 'list-header--*'
14239 };
14240
14241 /**
14242 * @element ons-list-header
14243 * @category list
14244 * @description
14245 * [en]Header element for list items. Must be put inside the `<ons-list>` component.[/en]
14246 * [ja]リスト要素に使用するヘッダー用コンポーネント。ons-listと共に使用します。[/ja]
14247 * @seealso ons-list
14248 * [en]The `<ons-list>` component[/en]
14249 * [ja]ons-listコンポーネント[/ja]
14250 * @seealso ons-list-item
14251 * [en]The `<ons-list-item>` component[/en]
14252 * [ja]ons-list-itemコンポーネント[/ja]
14253 * @codepen yxcCt
14254 * @tutorial vanilla/Reference/list
14255 * @modifier material
14256 * [en]Display a Material Design list header.[/en]
14257 * [ja][/ja]
14258 * @example
14259 * <ons-list>
14260 * <ons-list-header>Header Text</ons-list-header>
14261 * <ons-list-item>Item</ons-list-item>
14262 * <ons-list-item>Item</ons-list-item>
14263 * </ons-list>
14264 */
14265 var ListHeaderElement = /*#__PURE__*/function (_BaseElement) {
14266 _inherits(ListHeaderElement, _BaseElement);
14267 var _super = _createSuper(ListHeaderElement);
14268 /**
14269 * @attribute modifier
14270 * @type {String}
14271 * @description
14272 * [en]The appearance of the list header.[/en]
14273 * [ja]ヘッダーの表現を指定します。[/ja]
14274 */
14275
14276 function ListHeaderElement() {
14277 var _this;
14278 _classCallCheck(this, ListHeaderElement);
14279 _this = _super.call(this);
14280 _this._compile();
14281 return _this;
14282 }
14283 _createClass(ListHeaderElement, [{
14284 key: "_compile",
14285 value: function _compile() {
14286 autoStyle.prepare(this);
14287 this.classList.add(defaultClassName$c);
14288 ModifierUtil.initModifier(this, scheme$m);
14289 }
14290 }, {
14291 key: "attributeChangedCallback",
14292 value: function attributeChangedCallback(name, last, current) {
14293 switch (name) {
14294 case 'class':
14295 util$4.restoreClass(this, defaultClassName$c, scheme$m);
14296 break;
14297 case 'modifier':
14298 ModifierUtil.onModifierChanged(last, current, this, scheme$m);
14299 break;
14300 }
14301 }
14302 }], [{
14303 key: "observedAttributes",
14304 get: function get() {
14305 return ['modifier', 'class'];
14306 }
14307 }]);
14308 return ListHeaderElement;
14309 }(BaseElement);
14310 onsElements.ListHeader = ListHeaderElement;
14311 customElements.define('ons-list-header', ListHeaderElement);
14312
14313 var defaultClassName$b = 'list-title';
14314 var scheme$l = {
14315 '': 'list-title--*'
14316 };
14317
14318 /**
14319 * @element ons-list-title
14320 * @category list
14321 * @description
14322 * [en]Represents a list title.[/en]
14323 * [ja]リストのタイトルを表現します。[/ja]
14324 * @example
14325 * <ons-list-title>List Title</ons-list-title>
14326 * <ons-list>
14327 * <ons-list-item>Item</ons-list-item>
14328 * </ons-list>
14329 * @modifier material
14330 * [en]Display a Material Design list title.[/en]
14331 * [ja][/ja]
14332 */
14333 var ListTitleElement = /*#__PURE__*/function (_BaseElement) {
14334 _inherits(ListTitleElement, _BaseElement);
14335 var _super = _createSuper(ListTitleElement);
14336 function ListTitleElement() {
14337 var _this;
14338 _classCallCheck(this, ListTitleElement);
14339 _this = _super.call(this);
14340 _this._compile();
14341 return _this;
14342 }
14343 _createClass(ListTitleElement, [{
14344 key: "_compile",
14345 value: function _compile() {
14346 autoStyle.prepare(this);
14347 this.classList.add(defaultClassName$b);
14348 ModifierUtil.initModifier(this, scheme$l);
14349 }
14350 }, {
14351 key: "attributeChangedCallback",
14352 value: function attributeChangedCallback(name, last, current) {
14353 switch (name) {
14354 case 'class':
14355 util$4.restoreClass(this, defaultClassName$b, scheme$l);
14356 break;
14357 case 'modifier':
14358 ModifierUtil.onModifierChanged(last, current, this, scheme$l);
14359 break;
14360 }
14361 }
14362 }], [{
14363 key: "observedAttributes",
14364 get: function get() {
14365 return ['modifier', 'class'];
14366 }
14367 }]);
14368 return ListTitleElement;
14369 }(BaseElement);
14370 onsElements.ListTitle = ListTitleElement;
14371 customElements.define('ons-list-title', ListTitleElement);
14372
14373 var ListItemAnimator = /*#__PURE__*/function (_BaseAnimator) {
14374 _inherits(ListItemAnimator, _BaseAnimator);
14375 var _super = _createSuper(ListItemAnimator);
14376 function ListItemAnimator() {
14377 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
14378 _ref$timing = _ref.timing,
14379 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
14380 _ref$delay = _ref.delay,
14381 delay = _ref$delay === void 0 ? 0 : _ref$delay,
14382 _ref$duration = _ref.duration,
14383 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
14384 _classCallCheck(this, ListItemAnimator);
14385 return _super.call(this, {
14386 timing: timing,
14387 delay: delay,
14388 duration: duration
14389 });
14390 }
14391 _createClass(ListItemAnimator, [{
14392 key: "showExpansion",
14393 value: function showExpansion(listItem, callback) {
14394 callback();
14395 }
14396 }, {
14397 key: "hideExpansion",
14398 value: function hideExpansion(listItem, callback) {
14399 callback();
14400 }
14401 }]);
14402 return ListItemAnimator;
14403 }(BaseAnimator);
14404 var SlideListItemAnimator = /*#__PURE__*/function (_ListItemAnimator) {
14405 _inherits(SlideListItemAnimator, _ListItemAnimator);
14406 var _super2 = _createSuper(SlideListItemAnimator);
14407 function SlideListItemAnimator() {
14408 _classCallCheck(this, SlideListItemAnimator);
14409 return _super2.apply(this, arguments);
14410 }
14411 _createClass(SlideListItemAnimator, [{
14412 key: "showExpansion",
14413 value: function showExpansion(listItem, callback) {
14414 this._animateExpansion(listItem, true, callback);
14415 }
14416 }, {
14417 key: "hideExpansion",
14418 value: function hideExpansion(listItem, callback) {
14419 this._animateExpansion(listItem, false, callback);
14420 }
14421 }, {
14422 key: "_animateExpansion",
14423 value: function _animateExpansion(listItem, shouldOpen, callback) {
14424 var _animit;
14425 // To animate the opening of the expansion panel correctly, we need to know its
14426 // height. To calculate this, we set its height to auto, and then get the computed
14427 // height and padding. Once this is done, we set the height back to its original value.
14428 var oldHeight = listItem.expandableContent.style.height;
14429 var oldDisplay = listItem.expandableContent.style.display;
14430 listItem.expandableContent.style.height = 'auto';
14431 listItem.expandableContent.style.display = 'block';
14432 var computedStyle = window.getComputedStyle(listItem.expandableContent);
14433 var expansionOpenTransition = [{
14434 height: 0,
14435 paddingTop: 0,
14436 paddingBottom: 0
14437 }, {
14438 height: computedStyle.height,
14439 paddingTop: computedStyle.paddingTop,
14440 paddingBottom: computedStyle.paddingBottom
14441 }];
14442 var iconOpenTransition = [{
14443 transform: 'rotate(45deg)'
14444 }, {
14445 transform: 'rotate(225deg)'
14446 }];
14447
14448 // Now that we have the values we need, reset the height back to its original state
14449 listItem.expandableContent.style.height = oldHeight;
14450 (_animit = Animit(listItem.expandableContent, {
14451 duration: this.duration,
14452 property: 'height padding-top padding-bottom'
14453 })).default.apply(_animit, _toConsumableArray(shouldOpen ? expansionOpenTransition : expansionOpenTransition.reverse())).play(function () {
14454 listItem.expandableContent.style.display = oldDisplay;
14455 callback && callback();
14456 });
14457 if (listItem.expandChevron) {
14458 var _animit2;
14459 (_animit2 = Animit(listItem.expandChevron, {
14460 duration: this.duration,
14461 property: 'transform'
14462 })).default.apply(_animit2, _toConsumableArray(shouldOpen ? iconOpenTransition : iconOpenTransition.reverse())).play();
14463 }
14464 }
14465 }]);
14466 return SlideListItemAnimator;
14467 }(ListItemAnimator);
14468
14469 var defaultClassName$a = 'list-item';
14470 var scheme$k = {
14471 '.list-item': 'list-item--*',
14472 '.list-item__left': 'list-item--*__left',
14473 '.list-item__center': 'list-item--*__center',
14474 '.list-item__right': 'list-item--*__right',
14475 '.list-item__label': 'list-item--*__label',
14476 '.list-item__title': 'list-item--*__title',
14477 '.list-item__subtitle': 'list-item--*__subtitle',
14478 '.list-item__thumbnail': 'list-item--*__thumbnail',
14479 '.list-item__icon': 'list-item--*__icon'
14480 };
14481 var _animatorDict$5 = {
14482 'default': SlideListItemAnimator,
14483 'none': ListItemAnimator
14484 };
14485
14486 /**
14487 * @element ons-list-item
14488 * @category list
14489 * @modifier tappable
14490 * [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]
14491 * [ja]タップやクリックした時に効果が表示されるようになります。[/ja]
14492 * @modifier chevron
14493 * [en]Display a chevron at the right end of the list item and make it change appearance when tapped.[/en]
14494 * [ja][/ja]
14495 * @modifier longdivider
14496 * [en]Displays a long horizontal divider between items.[/en]
14497 * [ja][/ja]
14498 * @modifier nodivider
14499 * [en]Removes the divider between list items.[/en]
14500 * [ja][/ja]
14501 * @modifier material
14502 * [en]Display a Material Design list item.[/en]
14503 * [ja][/ja]
14504 * @description
14505 * [en]
14506 * 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.
14507 *
14508 * ```
14509 * <ons-list-item>
14510 * <div class="left">Left</div>
14511 * <div class="center">Center</div>
14512 * <div class="right">Right</div>
14513 * <div class="expandable-content">Expandable content</div>
14514 * </ons-list-item>
14515 * ```
14516 *
14517 * There are also a number of classes (prefixed with `list-item__*`) that help when putting things like icons and thumbnails into the list items.
14518 * [/en]
14519 * [ja][/ja]
14520 * @seealso ons-list
14521 * [en]ons-list component[/en]
14522 * [ja]ons-listコンポーネント[/ja]
14523 * @seealso ons-list-header
14524 * [en]ons-list-header component[/en]
14525 * [ja]ons-list-headerコンポーネント[/ja]
14526 * @codepen yxcCt
14527 * @tutorial vanilla/Reference/list
14528 * @example
14529 * <ons-list-item>
14530 * <div class="left">
14531 * <ons-icon icon="md-face" class="list-item__icon"></ons-icon>
14532 * </div>
14533 * <div class="center">
14534 * <div class="list-item__title">Title</div>
14535 * <div class="list-item__subtitle">Subtitle</div>
14536 * </div>
14537 * <div class="right">
14538 * <ons-switch></ons-switch>
14539 * </div>
14540 * </ons-list-item>
14541 */
14542 var ListItemElement = /*#__PURE__*/function (_BaseElement) {
14543 _inherits(ListItemElement, _BaseElement);
14544 var _super = _createSuper(ListItemElement);
14545 /**
14546 * @attribute modifier
14547 * @type {String}
14548 * @description
14549 * [en]The appearance of the list item.[/en]
14550 * [ja]各要素の表現を指定します。[/ja]
14551 */
14552
14553 /**
14554 * @attribute lock-on-drag
14555 * @type {Boolean}
14556 * @description
14557 * [en]Prevent vertical scrolling when the user drags horizontally.[/en]
14558 * [ja]この属性があると、ユーザーがこの要素を横方向にドラッグしている時に、縦方向のスクロールが起きないようになります。[/ja]
14559 */
14560
14561 /**
14562 * @property lockOnDrag
14563 * @type {Boolean}
14564 * @description
14565 * [en]Prevent vertical scrolling when the user drags horizontally.[/en]
14566 * [ja]この属性があると、ユーザーがこの要素を横方向にドラッグしている時に、縦方向のスクロールが起きないようになります。[/ja]
14567 */
14568
14569 /**
14570 * @attribute tappable
14571 * @type {Boolean}
14572 * @description
14573 * [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]
14574 * [ja][/ja]
14575 */
14576
14577 /**
14578 * @property tappable
14579 * @type {Boolean}
14580 * @description
14581 * [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]
14582 * [ja][/ja]
14583 */
14584
14585 /**
14586 * @attribute tap-background-color
14587 * @type {Color}
14588 * @description
14589 * [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]
14590 * [ja][/ja]
14591 */
14592
14593 /**
14594 * @property tapBackgroundColor
14595 * @type {Color}
14596 * @description
14597 * [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]
14598 * [ja][/ja]
14599 */
14600
14601 /**
14602 * @attribute keep-tap-background-color
14603 * @type {Boolean}
14604 * @description
14605 * [en] Prevent from clearing the background color on `"touchmove"`, `"touchcancel"`, `"touchend"`, `"touchleave"`, `"mouseup"`, and `"mouseout"`. For this to work, the attribute "tappable" needs to be set.[/en]
14606 * [ja] この属性があると、`"touchmove"`, `"touchcancel"`, `"touchend"`, `"touchleave"`, `"mouseup"`, and `"mouseout"` イベント時に背景色がクリアされないようになります。[/ja]
14607 */
14608
14609 /**
14610 * @property keepTapBackgroundColor
14611 * @type {Boolean}
14612 * @description
14613 * [en] Prevent from clearing the background color on `"touchmove"`, `"touchcancel"`, `"touchend"`, `"touchleave"`, `"mouseup"`, and `"mouseout"`. For this to work, the attribute "tappable" needs to be set.[/en]
14614 * [ja] この属性があると、`"touchmove"`, `"touchcancel"`, `"touchend"`, `"touchleave"`, `"mouseup"`, and `"mouseout"` イベント時に背景色がクリアされないようになります。[/ja]
14615 */
14616
14617 /**
14618 * @attribute expandable
14619 * @type {Boolean}
14620 * @description
14621 * [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]
14622 * [ja][/ja]
14623 */
14624
14625 /**
14626 * @property expandable
14627 * @initonly
14628 * @type {Boolean}
14629 * @description
14630 * [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]
14631 * [ja][/ja]
14632 */
14633
14634 /**
14635 * @attribute expanded
14636 * @type {Boolean}
14637 * @description
14638 * [en]For expandable list items, specifies whether the expandable content is expanded or not.[/en]
14639 * [ja][/ja]
14640 */
14641
14642 /**
14643 * @property expanded
14644 * @type {Boolean}
14645 * @description
14646 * [en]For expandable list items, specifies whether the expandable content is expanded or not.[/en]
14647 * [ja][/ja]
14648 */
14649
14650 /**
14651 * @event expand
14652 * @description
14653 * [en]For expandable list items, fires when the list item is expanded or contracted.[/en]
14654 * [ja][/ja]
14655 */
14656
14657 /**
14658 * @attribute animation
14659 * @type {String}
14660 * @default default
14661 * @description
14662 * [en]The animation used when showing and hiding the expandable content. Can be either `"default"` or `"none"`.[/en]
14663 * [ja][/ja]
14664 */
14665
14666 /**
14667 * @property animation
14668 * @type {String}
14669 * @default default
14670 * @description
14671 * [en]The animation used when showing and hiding the expandable content. Can be either `"default"` or `"none"`.[/en]
14672 * [ja][/ja]
14673 */
14674
14675 function ListItemElement() {
14676 var _this;
14677 _classCallCheck(this, ListItemElement);
14678 _this = _super.call(this);
14679 _this._animatorFactory = _this._updateAnimatorFactory();
14680
14681 // Elements ignored when tapping
14682 var re = /^ons-(?!col$|row$|if$)/i;
14683 _this._shouldIgnoreTap = function (e) {
14684 return e.hasAttribute('prevent-tap') || re.test(e.tagName);
14685 };
14686
14687 // show and hide functions for Vue hidable mixin
14688 _this.show = _this.showExpansion;
14689 _this.hide = _this.hideExpansion;
14690 contentReady(_assertThisInitialized(_this), function () {
14691 _this._compile();
14692 });
14693 return _this;
14694 }
14695
14696 /**
14697 * Compiles the list item.
14698 *
14699 * Various elements are allowed in the body of a list item:
14700 *
14701 * - div.left, div.right, and div.center are allowed as direct children
14702 * - 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
14703 * - if div.center is defined, anything that isn't div.left, div.right or div.expandable-content will be ignored
14704 * - if list item has expandable attribute:
14705 * - div.expandable-content is allowed as a direct child
14706 * - div.top is allowed as direct child
14707 * - if div.top is defined, anything that isn't div.expandable-content should be inside div.top - anything else will be ignored
14708 * - if div.right is not defined, a div.right will be created with a drop-down chevron
14709 *
14710 * See the tests for examples.
14711 */
14712 _createClass(ListItemElement, [{
14713 key: "_compile",
14714 value: function _compile() {
14715 autoStyle.prepare(this);
14716 this.classList.add(defaultClassName$a);
14717 var top, expandableContent;
14718 var topContent = [];
14719 Array.from(this.childNodes).forEach(function (node) {
14720 if (node.nodeType !== Node.ELEMENT_NODE) {
14721 topContent.push(node);
14722 } else if (node.classList.contains('top')) {
14723 top = node;
14724 } else if (node.classList.contains('expandable-content')) {
14725 expandableContent = node;
14726 } else {
14727 topContent.push(node);
14728 }
14729 if (node.nodeName !== 'ONS-RIPPLE') {
14730 node.remove();
14731 }
14732 });
14733 topContent = top ? Array.from(top.childNodes) : topContent;
14734 var left, right, center;
14735 var centerContent = [];
14736 topContent.forEach(function (node) {
14737 if (node.nodeType !== Node.ELEMENT_NODE) {
14738 centerContent.push(node);
14739 } else if (node.classList.contains('left')) {
14740 left = node;
14741 } else if (node.classList.contains('right')) {
14742 right = node;
14743 } else if (node.classList.contains('center')) {
14744 center = node;
14745 } else {
14746 centerContent.push(node);
14747 }
14748 });
14749 if (this.hasAttribute('expandable')) {
14750 this.classList.add('list-item--expandable');
14751 if (!top) {
14752 top = document.createElement('div');
14753 top.classList.add('top');
14754 }
14755 top.classList.add('list-item__top');
14756 this.appendChild(top);
14757 this._top = top;
14758 if (expandableContent) {
14759 expandableContent.classList.add('list-item__expandable-content');
14760 this.appendChild(expandableContent);
14761 }
14762 if (!right) {
14763 right = document.createElement('div');
14764 right.classList.add('list-item__right', 'right');
14765
14766 // We cannot use a pseudo-element for this chevron, as we cannot animate it using
14767 // JS. So, we make a chevron span instead.
14768 var chevron = document.createElement('span');
14769 chevron.classList.add('list-item__expand-chevron');
14770 right.appendChild(chevron);
14771 }
14772
14773 // The case where the list item should already start expanded.
14774 // Adding the class early stops the animation from running at startup.
14775 if (this.expanded) {
14776 this.classList.add('list-item--expanded');
14777 }
14778 } else {
14779 top = this;
14780 }
14781 if (!center) {
14782 center = document.createElement('div');
14783 center.classList.add('center');
14784 centerContent.forEach(function (node) {
14785 return center.appendChild(node);
14786 });
14787 }
14788 center.classList.add('list-item__center');
14789 top.appendChild(center);
14790 if (left) {
14791 left.classList.add('list-item__left');
14792 top.appendChild(left);
14793 }
14794 if (right) {
14795 right.classList.add('list-item__right');
14796 top.appendChild(right);
14797 }
14798 util$4.updateRipple(this);
14799 ModifierUtil.initModifier(this, scheme$k);
14800 }
14801
14802 /**
14803 * @method showExpansion
14804 * @signature showExpansion()
14805 * @description
14806 * [en]Show the expandable content if the element is expandable.[/en]
14807 * [ja][/ja]
14808 */
14809 }, {
14810 key: "showExpansion",
14811 value: function showExpansion() {
14812 this.expanded = true;
14813 }
14814
14815 /**
14816 * @method hideExpansion
14817 * @signature hideExpansion()
14818 * @description
14819 * [en]Hide the expandable content if the element expandable.[/en]
14820 * [ja][/ja]
14821 */
14822 }, {
14823 key: "hideExpansion",
14824 value: function hideExpansion() {
14825 this.expanded = false;
14826 }
14827 }, {
14828 key: "toggleExpansion",
14829 value: function toggleExpansion() {
14830 this.expanded = !this.expanded;
14831 }
14832
14833 /**
14834 * @method clearTapBackgroundColor
14835 * @signature clearTapBackgroundColor()
14836 * @description
14837 * [en]Clear backgroundColor changed on tap or click. This method is helpful when `keep-tap-background-color` is `true`. [/en]
14838 * [ja]タップやクリックした時に効果が表示されるようになります。このメソッドは `keep-tap-background-color` が `true` のときに使用します。[/ja]
14839 */
14840 }, {
14841 key: "clearTapBackgroundColor",
14842 value: function clearTapBackgroundColor() {
14843 this._clearTapBackgroundColor();
14844 }
14845 }, {
14846 key: "_animateExpansion",
14847 value: function _animateExpansion() {
14848 var _this2 = this;
14849 // Stops the animation from running in the case where the list item should start already expanded
14850 var expandedAtStartup = this.expanded && this.classList.contains('list-item--expanded');
14851 if (!this.hasAttribute('expandable') || this._expanding || expandedAtStartup) {
14852 return;
14853 }
14854 this._expanding = true;
14855 var expandedCallback = function expandedCallback() {
14856 _this2._expanding = false;
14857 if (_this2.expanded) {
14858 _this2.classList.add('list-item--expanded');
14859 } else {
14860 _this2.classList.remove('list-item--expanded');
14861 }
14862 };
14863 var animator = this._animatorFactory.newAnimator();
14864 if (animator._animateExpansion) {
14865 animator._animateExpansion(this, this.expanded, expandedCallback);
14866 } else {
14867 expandedCallback();
14868 }
14869 }
14870 }, {
14871 key: "_updateAnimatorFactory",
14872 value: function _updateAnimatorFactory() {
14873 return new AnimatorFactory({
14874 animators: _animatorDict$5,
14875 baseClass: ListItemAnimator,
14876 baseClassName: 'ListItemAnimator',
14877 defaultAnimation: this.getAttribute('animation') || 'default'
14878 });
14879 }
14880 }, {
14881 key: "expandableContent",
14882 get: function get() {
14883 return this.querySelector('.list-item__expandable-content');
14884 }
14885 }, {
14886 key: "expandChevron",
14887 get: function get() {
14888 return this.querySelector('.list-item__expand-chevron');
14889 }
14890 }, {
14891 key: "attributeChangedCallback",
14892 value: function attributeChangedCallback(name, last, current) {
14893 var _this3 = this;
14894 switch (name) {
14895 case 'class':
14896 util$4.restoreClass(this, defaultClassName$a, scheme$k);
14897 break;
14898 case 'modifier':
14899 ModifierUtil.onModifierChanged(last, current, this, scheme$k);
14900 break;
14901 case 'ripple':
14902 util$4.updateRipple(this);
14903 break;
14904 case 'animation':
14905 this._animatorFactory = this._updateAnimatorFactory();
14906 break;
14907 case 'expanded':
14908 contentReady(this, function () {
14909 return _this3._animateExpansion();
14910 });
14911 break;
14912 }
14913 }
14914 }, {
14915 key: "connectedCallback",
14916 value: function connectedCallback() {
14917 var _this4 = this;
14918 contentReady(this, function () {
14919 _this4._setupListeners(true);
14920 _this4._originalBackgroundColor = _this4.style.backgroundColor;
14921 _this4.tapped = false;
14922 });
14923 }
14924 }, {
14925 key: "disconnectedCallback",
14926 value: function disconnectedCallback() {
14927 this._setupListeners(false);
14928 }
14929 }, {
14930 key: "_setupListeners",
14931 value: function _setupListeners(add) {
14932 var action = (add ? 'add' : 'remove') + 'EventListener';
14933 util$4[action](this, 'touchstart', this._onTouch, {
14934 passive: true
14935 });
14936 util$4[action](this, 'touchmove', this._onRelease, {
14937 passive: true
14938 });
14939 this[action]('touchcancel', this._onRelease);
14940 this[action]('touchend', this._onRelease);
14941 this[action]('touchleave', this._onRelease);
14942 this[action]('drag', this._onDrag);
14943 this[action]('mousedown', this._onTouch);
14944 this[action]('mouseup', this._onRelease);
14945 this[action]('mouseout', this._onRelease);
14946 if (this._top) {
14947 this._top[action]('click', this._onClickTop.bind(this));
14948 }
14949 }
14950 }, {
14951 key: "_onClickTop",
14952 value: function _onClickTop() {
14953 if (!this._expanding) {
14954 this.toggleExpansion();
14955 this.dispatchEvent(new Event('expand'));
14956 this.dispatchEvent(new Event('expansion')); // expansion is deprecated but emit to avoid breaking user code
14957 }
14958 }
14959 }, {
14960 key: "_onDrag",
14961 value: function _onDrag(event) {
14962 var gesture = event.gesture;
14963 // Prevent vertical scrolling if the users pans left or right.
14964 if (this.hasAttribute('lock-on-drag') && ['left', 'right'].indexOf(gesture.direction) > -1) {
14965 gesture.preventDefault();
14966 }
14967 }
14968 }, {
14969 key: "_onTouch",
14970 value: function _onTouch(e) {
14971 var _this5 = this;
14972 if (this.tapped || this !== e.target && (this._shouldIgnoreTap(e.target) || util$4.findParent(e.target, this._shouldIgnoreTap, function (p) {
14973 return p === _this5;
14974 }))) {
14975 return; // Ignore tap
14976 }
14977
14978 this.tapped = true;
14979 var touchStyle = {
14980 transition: 'background-color 0.0s linear 0.02s, box-shadow 0.0s linear 0.02s'
14981 };
14982 if (this.hasAttribute('tappable')) {
14983 if (this.style.backgroundColor) {
14984 this._originalBackgroundColor = this.style.backgroundColor;
14985 }
14986 touchStyle.backgroundColor = this.getAttribute('tap-background-color') || '#d9d9d9';
14987 touchStyle.boxShadow = "0px -1px 0px 0px ".concat(touchStyle.backgroundColor);
14988 }
14989 styler(this, touchStyle);
14990 }
14991 }, {
14992 key: "_onRelease",
14993 value: function _onRelease() {
14994 this.tapped = false;
14995 if (!this.keepTapBackgroundColor) {
14996 this._clearTapBackgroundColor();
14997 }
14998 styler.clear(this, 'transition boxShadow');
14999 }
15000 }, {
15001 key: "_clearTapBackgroundColor",
15002 value: function _clearTapBackgroundColor() {
15003 this.style.backgroundColor = this._originalBackgroundColor || '';
15004 }
15005 }], [{
15006 key: "observedAttributes",
15007 get: function get() {
15008 return ['modifier', 'class', 'ripple', 'animation', 'expanded'];
15009 }
15010 }]);
15011 return ListItemElement;
15012 }(BaseElement);
15013 util$4.defineBooleanProperties(ListItemElement, ['expanded', 'expandable', 'tappable', 'lock-on-drag', 'keep-tap-background-color']);
15014 util$4.defineStringProperties(ListItemElement, ['animation', 'tap-background-color']);
15015 onsElements.ListItem = ListItemElement;
15016 customElements.define('ons-list-item', ListItemElement);
15017
15018 var defaultClassName$9 = 'list';
15019 var scheme$j = {
15020 '': 'list--*'
15021 };
15022
15023 /**
15024 * @element ons-list
15025 * @category list
15026 * @modifier inset
15027 * [en]Inset list that doesn't cover the whole width of the parent.[/en]
15028 * [ja]親要素の画面いっぱいに広がらないリストを表示します。[/ja]
15029 * @modifier noborder
15030 * [en]A list with no borders at the top and bottom.[/en]
15031 * [ja]リストの上下のボーダーが無いリストを表示します。[/ja]
15032 * @description
15033 * [en]Component to define a list, and the container for ons-list-item(s).[/en]
15034 * [ja]リストを表現するためのコンポーネント。ons-list-itemのコンテナとして使用します。[/ja]
15035 * @seealso ons-list-item
15036 * [en]ons-list-item component[/en]
15037 * [ja]ons-list-itemコンポーネント[/ja]
15038 * @seealso ons-list-header
15039 * [en]ons-list-header component[/en]
15040 * [ja]ons-list-headerコンポーネント[/ja]
15041 * @seealso ons-lazy-repeat
15042 * [en]ons-lazy-repeat component[/en]
15043 * [ja]ons-lazy-repeatコンポーネント[/ja]
15044 * @codepen yxcCt
15045 * @tutorial vanilla/Reference/list
15046 * @example
15047 * <ons-list>
15048 * <ons-list-header>Header Text</ons-list-header>
15049 * <ons-list-item>Item</ons-list-item>
15050 * <ons-list-item>Item</ons-list-item>
15051 * </ons-list>
15052 */
15053 var ListElement = /*#__PURE__*/function (_BaseElement) {
15054 _inherits(ListElement, _BaseElement);
15055 var _super = _createSuper(ListElement);
15056 /**
15057 * @attribute modifier
15058 * @type {String}
15059 * @description
15060 * [en]The appearance of the list.[/en]
15061 * [ja]リストの表現を指定します。[/ja]
15062 */
15063
15064 function ListElement() {
15065 var _this;
15066 _classCallCheck(this, ListElement);
15067 _this = _super.call(this);
15068 _this._compile();
15069 return _this;
15070 }
15071 _createClass(ListElement, [{
15072 key: "_compile",
15073 value: function _compile() {
15074 autoStyle.prepare(this);
15075 this.classList.add(defaultClassName$9);
15076 ModifierUtil.initModifier(this, scheme$j);
15077 }
15078 }, {
15079 key: "attributeChangedCallback",
15080 value: function attributeChangedCallback(name, last, current) {
15081 switch (name) {
15082 case 'class':
15083 util$4.restoreClass(this, defaultClassName$9, scheme$j);
15084 break;
15085 case 'modifier':
15086 ModifierUtil.onModifierChanged(last, current, this, scheme$j);
15087 break;
15088 }
15089 }
15090 }], [{
15091 key: "observedAttributes",
15092 get: function get() {
15093 return ['modifier', 'class'];
15094 }
15095 }]);
15096 return ListElement;
15097 }(BaseElement);
15098 onsElements.List = ListElement;
15099 customElements.define('ons-list', ListElement);
15100
15101 var INPUT_ATTRIBUTES$1 = ['autocapitalize', 'autocomplete', 'autocorrect', 'autofocus', 'disabled', 'inputmode', 'max', 'maxlength', 'min', 'minlength', 'name', 'pattern', 'placeholder', 'readonly', 'required', 'size', 'spellcheck', 'step', 'validator', 'value'];
15102 var BaseInputElement = /*#__PURE__*/function (_BaseElement) {
15103 _inherits(BaseInputElement, _BaseElement);
15104 var _super = _createSuper(BaseInputElement);
15105 function BaseInputElement() {
15106 var _this;
15107 _classCallCheck(this, BaseInputElement);
15108 _this = _super.call(this);
15109 if (_this.constructor === BaseInputElement) {
15110 util$4.throwAbstract();
15111 }
15112 contentReady(_assertThisInitialized(_this), function () {
15113 return _this._compile();
15114 });
15115 _this._boundDelegateEvent = _this._delegateEvent.bind(_assertThisInitialized(_this));
15116 return _this;
15117 }
15118 _createClass(BaseInputElement, [{
15119 key: "_update",
15120 value: function _update() {} // Optionally implemented
15121 }, {
15122 key: "_scheme",
15123 get: function get() {
15124 // eslint-disable-line getter-return
15125 util$4.throwMember();
15126 }
15127 }, {
15128 key: "_template",
15129 get: function get() {
15130 // eslint-disable-line getter-return
15131 util$4.throwMember();
15132 }
15133 }, {
15134 key: "type",
15135 get: function get() {
15136 // eslint-disable-line getter-return
15137 util$4.throwMember();
15138 }
15139 }, {
15140 key: "_compile",
15141 value: function _compile() {
15142 autoStyle.prepare(this);
15143 this._defaultClassName && this.classList.add(this._defaultClassName);
15144 if (this.children.length !== 0) {
15145 return;
15146 }
15147 this.appendChild(util$4.createFragment(this._template));
15148 this._setInputId();
15149 this._updateBoundAttributes();
15150 ModifierUtil.initModifier(this, this._scheme);
15151 }
15152 }, {
15153 key: "_updateBoundAttributes",
15154 value: function _updateBoundAttributes() {
15155 var _this2 = this;
15156 INPUT_ATTRIBUTES$1.forEach(function (attr) {
15157 if (_this2.hasAttribute(attr)) {
15158 _this2._input.setAttribute(attr, _this2.getAttribute(attr));
15159 } else {
15160 _this2._input.removeAttribute(attr);
15161 }
15162 });
15163 this._update();
15164 }
15165 }, {
15166 key: "_delegateEvent",
15167 value: function _delegateEvent(event) {
15168 var e = new CustomEvent(event.type, {
15169 bubbles: false,
15170 cancelable: true
15171 });
15172 return this.dispatchEvent(e);
15173 }
15174 }, {
15175 key: "_setInputId",
15176 value: function _setInputId() {
15177 if (this.hasAttribute('input-id')) {
15178 this._input.id = this.getAttribute('input-id');
15179 }
15180 }
15181 }, {
15182 key: "_defaultClassName",
15183 get: function get() {
15184 return '';
15185 }
15186 }, {
15187 key: "_input",
15188 get: function get() {
15189 return this.querySelector('input');
15190 }
15191 }, {
15192 key: "value",
15193 get: function get() {
15194 return this._input === null ? this.getAttribute('value') : this._input.value;
15195 },
15196 set: function set(val) {
15197 var _this3 = this;
15198 contentReady(this, function () {
15199 if (val instanceof Date) {
15200 val = val.toISOString().substring(0, 10);
15201 }
15202 _this3._input.value = val;
15203 _this3._update();
15204 });
15205 }
15206 }, {
15207 key: "connectedCallback",
15208 value: function connectedCallback() {
15209 var _this4 = this;
15210 contentReady(this, function () {
15211 _this4._input.addEventListener('focus', _this4._boundDelegateEvent);
15212 _this4._input.addEventListener('blur', _this4._boundDelegateEvent);
15213 });
15214 }
15215 }, {
15216 key: "disconnectedCallback",
15217 value: function disconnectedCallback() {
15218 var _this5 = this;
15219 contentReady(this, function () {
15220 _this5._input.removeEventListener('focus', _this5._boundDelegateEvent);
15221 _this5._input.removeEventListener('blur', _this5._boundDelegateEvent);
15222 });
15223 }
15224 }, {
15225 key: "attributeChangedCallback",
15226 value: function attributeChangedCallback(name, last, current) {
15227 var _this6 = this;
15228 switch (name) {
15229 case 'modifier':
15230 contentReady(this, function () {
15231 return ModifierUtil.onModifierChanged(last, current, _this6, _this6._scheme);
15232 });
15233 break;
15234 case 'input-id':
15235 contentReady(this, function () {
15236 return _this6._setInputId();
15237 });
15238 break;
15239 case 'class':
15240 util$4.restoreClass(this, this._defaultClassName, this._scheme);
15241 break;
15242 }
15243 if (INPUT_ATTRIBUTES$1.indexOf(name) >= 0) {
15244 contentReady(this, function () {
15245 return _this6._updateBoundAttributes();
15246 });
15247 }
15248 }
15249 }, {
15250 key: "blur",
15251 value: function blur() {
15252 this._input.blur();
15253 }
15254 }, {
15255 key: "focus",
15256 value: function focus() {
15257 this._input.focus();
15258 }
15259 }], [{
15260 key: "observedAttributes",
15261 get: function get() {
15262 return ['modifier', 'input-id', 'class'].concat(INPUT_ATTRIBUTES$1);
15263 }
15264 }]);
15265 return BaseInputElement;
15266 }(BaseElement);
15267 util$4.defineBooleanProperties(BaseInputElement, ['disabled']);
15268
15269 var scheme$i = {
15270 '.text-input': 'text-input--*',
15271 '.text-input__label': 'text-input--*__label'
15272 };
15273
15274 /**
15275 * @element ons-input
15276 * @category form
15277 * @modifier material
15278 * [en]Displays a Material Design input.[/en]
15279 * [ja][/ja]
15280 * @modifier underbar
15281 * [en]Displays a horizontal line underneath a text input.[/en]
15282 * [ja][/ja]
15283 * @modifier transparent
15284 * [en]Displays a transparent input. Works for Material Design.[/en]
15285 * [ja][/ja]
15286 * @description
15287 * [en]
15288 * An input element. The `type` attribute can be used to change the input type. All text input types are supported.
15289 *
15290 * The component will automatically render as a Material Design input on Android devices.
15291 *
15292 * Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-input>` element.
15293 * [/en]
15294 * [ja][/ja]
15295 * @tutorial vanilla/Reference/input
15296 * @seealso ons-checkbox
15297 * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
15298 * [ja][/ja]
15299 * @seealso ons-radio
15300 * [en]The `<ons-radio>` element is used to display a radio button.[/en]
15301 * [ja][/ja]
15302 * @seealso ons-range
15303 * [en]The `<ons-range>` element is used to display a range slider.[/en]
15304 * [ja][/ja]
15305 * @seealso ons-switch
15306 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
15307 * [ja][/ja]
15308 * @seealso ons-select
15309 * [en]The `<ons-select>` element is used to display a select box.[/en]
15310 * [ja][/ja]
15311 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
15312 * @example
15313 * <ons-input placeholder="Username" float></ons-input>
15314 */
15315 var InputElement = /*#__PURE__*/function (_BaseInputElement) {
15316 _inherits(InputElement, _BaseInputElement);
15317 var _super = _createSuper(InputElement);
15318 function InputElement() {
15319 var _this;
15320 _classCallCheck(this, InputElement);
15321 _this = _super.call(this);
15322 _this._boundOnInput = _this._update.bind(_assertThisInitialized(_this));
15323 _this._boundOnFocusin = _this._update.bind(_assertThisInitialized(_this));
15324 return _this;
15325 }
15326
15327 /* Inherited props */
15328 _createClass(InputElement, [{
15329 key: "_update",
15330 value: function _update() {
15331 this._updateLabel();
15332 this._updateLabelClass();
15333 }
15334 }, {
15335 key: "_scheme",
15336 get: function get() {
15337 return scheme$i;
15338 }
15339 }, {
15340 key: "_template",
15341 get: function get() {
15342 return "\n <input type=\"".concat(this.type, "\" class=\"text-input\">\n <span class=\"text-input__label\"></span>\n ");
15343 }
15344 }, {
15345 key: "type",
15346 get: function get() {
15347 var type = this.getAttribute('type');
15348 return ['checkbox', 'radio'].indexOf(type) < 0 && type || 'text';
15349 },
15350 set: function set(value) {
15351 this.setAttribute('type', value);
15352 }
15353
15354 /* Own props */
15355 }, {
15356 key: "_updateLabel",
15357 value: function _updateLabel() {
15358 var label = this.getAttribute('placeholder') || '';
15359 if (typeof this._helper.textContent !== 'undefined') {
15360 this._helper.textContent = label;
15361 } else {
15362 this._helper.innerText = label;
15363 }
15364 }
15365 }, {
15366 key: "_updateLabelClass",
15367 value: function _updateLabelClass() {
15368 if (this.value === '') {
15369 this._helper.classList.remove('text-input--material__label--active');
15370 } else {
15371 this._helper.classList.add('text-input--material__label--active');
15372 }
15373 }
15374 }, {
15375 key: "_helper",
15376 get: function get() {
15377 return this.querySelector('span');
15378 }
15379 }, {
15380 key: "connectedCallback",
15381 value: function connectedCallback() {
15382 var _this2 = this;
15383 _get(_getPrototypeOf(InputElement.prototype), "connectedCallback", this).call(this);
15384 contentReady(this, function () {
15385 _this2._input.addEventListener('input', _this2._boundOnInput);
15386 _this2._input.addEventListener('focusin', _this2._boundOnFocusin);
15387 });
15388 var type = this.getAttribute('type');
15389 if (['checkbox', 'radio'].indexOf(type) >= 0) {
15390 util$4.warn("Warn: <ons-input type=\"".concat(type, "\"> is deprecated since v2.4.0. Use <ons-").concat(type, "> instead."));
15391 }
15392 }
15393 }, {
15394 key: "disconnectedCallback",
15395 value: function disconnectedCallback() {
15396 var _this3 = this;
15397 _get(_getPrototypeOf(InputElement.prototype), "disconnectedCallback", this).call(this);
15398 contentReady(this, function () {
15399 _this3._input.removeEventListener('input', _this3._boundOnInput);
15400 _this3._input.removeEventListener('focusin', _this3._boundOnFocusin);
15401 });
15402 }
15403 }, {
15404 key: "attributeChangedCallback",
15405 value: function attributeChangedCallback(name, last, current) {
15406 var _this4 = this;
15407 switch (name) {
15408 case 'type':
15409 contentReady(this, function () {
15410 return _this4._input.setAttribute('type', _this4.type);
15411 });
15412 break;
15413 default:
15414 _get(_getPrototypeOf(InputElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
15415 }
15416 }
15417
15418 /**
15419 * @attribute placeholder
15420 * @type {String}
15421 * @description
15422 * [en]Placeholder text. In Material Design, this placeholder will be a floating label.[/en]
15423 * [ja][/ja]
15424 */
15425
15426 /**
15427 * @attribute float
15428 * @description
15429 * [en]If this attribute is present, the placeholder will be animated in Material Design.[/en]
15430 * [ja]この属性が設定された時、ラベルはアニメーションするようになります。[/ja]
15431 */
15432
15433 /**
15434 * @property float
15435 * @type {Boolean}
15436 * @description
15437 * [en]If this property is present, the placeholder will be animated in Material Design.[/en]
15438 * [ja]この属性が設定された時、ラベルはアニメーションするようになります。[/ja]
15439 */
15440
15441 /**
15442 * @attribute type
15443 * @type {String}
15444 * @description
15445 * [en]
15446 * 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.
15447 *
15448 * 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.
15449 * [/en]
15450 * [ja][/ja]
15451 */
15452
15453 /**
15454 * @attribute input-id
15455 * @type {String}
15456 * @description
15457 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
15458 * [ja][/ja]
15459 */
15460
15461 /**
15462 * @property value
15463 * @type {String}
15464 * @description
15465 * [en]The current value of the input.[/en]
15466 * [ja][/ja]
15467 */
15468
15469 /**
15470 * @property disabled
15471 * @type {Boolean}
15472 * @description
15473 * [en]Whether the input is disabled or not.[/en]
15474 * [ja]無効化されている場合に`true`。[/ja]
15475 */
15476
15477 /**
15478 * @method focus
15479 * @signature focus()
15480 * @description
15481 * [en]Focuses the input.[/en]
15482 * [ja][/ja]
15483 */
15484
15485 /**
15486 * @method blur
15487 * @signature blur()
15488 * @description
15489 * [en]Removes focus from the input.[/en]
15490 * [ja][/ja]
15491 */
15492 }], [{
15493 key: "observedAttributes",
15494 get: function get() {
15495 return [].concat(_toConsumableArray(_get(_getPrototypeOf(InputElement), "observedAttributes", this)), ['type']);
15496 }
15497 }]);
15498 return InputElement;
15499 }(BaseInputElement);
15500 util$4.defineBooleanProperties(InputElement, ['float']);
15501 onsElements.Input = InputElement;
15502 customElements.define('ons-input', InputElement);
15503
15504 var BaseCheckboxElement = /*#__PURE__*/function (_BaseInputElement) {
15505 _inherits(BaseCheckboxElement, _BaseInputElement);
15506 var _super = _createSuper(BaseCheckboxElement);
15507 function BaseCheckboxElement() {
15508 var _this;
15509 _classCallCheck(this, BaseCheckboxElement);
15510 _this = _super.call(this);
15511 if (_this.constructor === BaseCheckboxElement) {
15512 util.throwAbstract();
15513 }
15514 contentReady(_assertThisInitialized(_this), function () {
15515 _this.attributeChangedCallback('checked', null, _this.getAttribute('checked'));
15516 });
15517 return _this;
15518 }
15519
15520 /* Inherited props */
15521 _createClass(BaseCheckboxElement, [{
15522 key: "_template",
15523 get: function get() {
15524 return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <span class=\"").concat(this._defaultClassName, "__checkmark\"></span>\n ");
15525 }
15526
15527 /* Own props */
15528 }, {
15529 key: "_helper",
15530 get: function get() {
15531 return this.querySelector('span');
15532 }
15533 }, {
15534 key: "checked",
15535 get: function get() {
15536 return this._input.checked;
15537 },
15538 set: function set(val) {
15539 var _this2 = this;
15540 contentReady(this, function () {
15541 _this2._input.checked = val;
15542 });
15543 }
15544 }, {
15545 key: "attributeChangedCallback",
15546 value: function attributeChangedCallback(name, last, current) {
15547 switch (name) {
15548 case 'checked':
15549 this.checked = current !== null;
15550 break;
15551 default:
15552 _get(_getPrototypeOf(BaseCheckboxElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
15553 }
15554 }
15555 }], [{
15556 key: "observedAttributes",
15557 get: function get() {
15558 return [].concat(_toConsumableArray(_get(_getPrototypeOf(BaseCheckboxElement), "observedAttributes", this)), ['checked']);
15559 }
15560 }]);
15561 return BaseCheckboxElement;
15562 }(BaseInputElement);
15563
15564 var scheme$h = {
15565 '.checkbox': 'checkbox--*',
15566 '.checkbox__input': 'checkbox--*__input',
15567 '.checkbox__checkmark': 'checkbox--*__checkmark'
15568 };
15569
15570 /**
15571 * @element ons-checkbox
15572 * @category form
15573 * @modifier material
15574 * [en]Displays a Material Design checkbox.[/en]
15575 * [ja][/ja]
15576 * @modifier noborder
15577 * [en]iOS borderless checkbox.[/en]
15578 * [ja][/ja]
15579 * @description
15580 * [en]
15581 * A checkbox element. The component will automatically render as a Material Design checkbox on Android devices.
15582 *
15583 * Most attributes that can be used for a normal `<input type="checkbox">` element can also be used on the `<ons-checkbox>` element.
15584 * [/en]
15585 * [ja][/ja]
15586 * @tutorial vanilla/Reference/checkbox
15587 * @seealso ons-switch
15588 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
15589 * [ja][/ja]
15590 * @seealso ons-radio
15591 * [en]The `<ons-radio>` element is used to display a radio button.[/en]
15592 * [ja][/ja]
15593 * @seealso ons-input
15594 * [en]The `<ons-input>` element is used to display a text input.[/en]
15595 * [ja][/ja]
15596 * @seealso ons-search-input
15597 * [en]The `<ons-search-input>` element is used to display a search input.[/en]
15598 * [ja][/ja]
15599 * @seealso ons-range
15600 * [en]The `<ons-range>` element is used to display a range slider.[/en]
15601 * [ja][/ja]
15602 * @seealso ons-select
15603 * [en]The `<ons-select>` element is used to display a select box.[/en]
15604 * [ja][/ja]
15605 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
15606 * @example
15607 * <ons-checkbox checked></ons-checkbox>
15608 */
15609 var CheckboxElement = /*#__PURE__*/function (_BaseCheckboxElement) {
15610 _inherits(CheckboxElement, _BaseCheckboxElement);
15611 var _super = _createSuper(CheckboxElement);
15612 function CheckboxElement() {
15613 _classCallCheck(this, CheckboxElement);
15614 return _super.apply(this, arguments);
15615 }
15616 _createClass(CheckboxElement, [{
15617 key: "_scheme",
15618 get: function get() {
15619 return scheme$h;
15620 }
15621 }, {
15622 key: "_defaultClassName",
15623 get: function get() {
15624 return 'checkbox';
15625 }
15626 }, {
15627 key: "type",
15628 get: function get() {
15629 return 'checkbox';
15630 }
15631
15632 /**
15633 * @attribute input-id
15634 * @type {String}
15635 * @description
15636 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
15637 * [ja][/ja]
15638 */
15639
15640 /**
15641 * @property value
15642 * @type {String}
15643 * @description
15644 * [en]The current value of the checkbox.[/en]
15645 * [ja][/ja]
15646 */
15647
15648 /**
15649 * @property checked
15650 * @type {Boolean}
15651 * @description
15652 * [en]Whether the checkbox is checked or not.[/en]
15653 * [ja][/ja]
15654 */
15655
15656 /**
15657 * @property disabled
15658 * @type {Boolean}
15659 * @description
15660 * [en]Whether the checkbox is disabled or not.[/en]
15661 * [ja]無効化されている場合に`true`。[/ja]
15662 */
15663
15664 /**
15665 * @method focus
15666 * @signature focus()
15667 * @description
15668 * [en]Focuses the checkbox.[/en]
15669 * [ja][/ja]
15670 */
15671
15672 /**
15673 * @method blur
15674 * @signature blur()
15675 * @description
15676 * [en]Removes focus from the checkbox.[/en]
15677 * [ja][/ja]
15678 */
15679 }]);
15680 return CheckboxElement;
15681 }(BaseCheckboxElement);
15682 onsElements.Checkbox = CheckboxElement;
15683 customElements.define('ons-checkbox', CheckboxElement);
15684
15685 var scheme$g = {
15686 '.radio-button': 'radio-button--*',
15687 '.radio-button__input': 'radio-button--*__input',
15688 '.radio-button__checkmark': 'radio-button--*__checkmark'
15689 };
15690
15691 /**
15692 * @element ons-radio
15693 * @category form
15694 * @modifier material
15695 * [en]Displays a Material Design radio button.[/en]
15696 * [ja][/ja]
15697 * @description
15698 * [en]
15699 * A radio button element. The component will automatically render as a Material Design radio button on Android devices.
15700 *
15701 * Most attributes that can be used for a normal `<input type="radio">` element can also be used on the `<ons-radio>` element.
15702 * [/en]
15703 * [ja][/ja]
15704 * @tutorial vanilla/Reference/radio
15705 * @seealso ons-select
15706 * [en]The `<ons-select>` element is used to display a select box.[/en]
15707 * [ja][/ja]
15708 * @seealso ons-checkbox
15709 * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
15710 * [ja][/ja]
15711 * @seealso ons-switch
15712 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
15713 * [ja][/ja]
15714 * @seealso ons-input
15715 * [en]The `<ons-input>` element is used to display a text input.[/en]
15716 * [ja][/ja]
15717 * @seealso ons-search-input
15718 * [en]The `<ons-search-input>` element is used to display a search input.[/en]
15719 * [ja][/ja]
15720 * @seealso ons-range
15721 * [en]The `<ons-range>` element is used to display a range slider.[/en]
15722 * [ja][/ja]
15723 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
15724 * @example
15725 * <ons-radio checked></ons-radio>
15726 */
15727 var RadioElement = /*#__PURE__*/function (_BaseCheckboxElement) {
15728 _inherits(RadioElement, _BaseCheckboxElement);
15729 var _super = _createSuper(RadioElement);
15730 function RadioElement() {
15731 _classCallCheck(this, RadioElement);
15732 return _super.apply(this, arguments);
15733 }
15734 _createClass(RadioElement, [{
15735 key: "_scheme",
15736 get: function get() {
15737 return scheme$g;
15738 }
15739 }, {
15740 key: "_defaultClassName",
15741 get: function get() {
15742 return 'radio-button';
15743 }
15744 }, {
15745 key: "type",
15746 get: function get() {
15747 return 'radio';
15748 }
15749
15750 /**
15751 * @attribute input-id
15752 * @type {String}
15753 * @description
15754 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
15755 * [ja][/ja]
15756 */
15757
15758 /**
15759 * @property value
15760 * @type {String}
15761 * @description
15762 * [en]The current value of the radio button.[/en]
15763 * [ja][/ja]
15764 */
15765
15766 /**
15767 * @property checked
15768 * @type {Boolean}
15769 * @description
15770 * [en]Whether the radio button is checked or not.[/en]
15771 * [ja][/ja]
15772 */
15773
15774 /**
15775 * @property disabled
15776 * @type {Boolean}
15777 * @description
15778 * [en]Whether the radio button is disabled or not.[/en]
15779 * [ja]無効化されている場合に`true`。[/ja]
15780 */
15781
15782 /**
15783 * @method focus
15784 * @signature focus()
15785 * @description
15786 * [en]Focuses the radio button.[/en]
15787 * [ja][/ja]
15788 */
15789
15790 /**
15791 * @method blur
15792 * @signature blur()
15793 * @description
15794 * [en]Removes focus from the radio button.[/en]
15795 * [ja][/ja]
15796 */
15797 }]);
15798 return RadioElement;
15799 }(BaseCheckboxElement);
15800 onsElements.Radio = RadioElement;
15801 customElements.define('ons-radio', RadioElement);
15802
15803 var scheme$f = {
15804 '.search-input': 'search-input--*'
15805 };
15806
15807 /**
15808 * @element ons-search-input
15809 * @category form
15810 * @modifier material
15811 * [en]Displays a Material Design search input.[/en]
15812 * [ja][/ja]
15813 * @description
15814 * [en]
15815 * A search input element. The component will automatically render as a Material Design search input on Android devices.
15816 *
15817 * Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-search-input>` element.
15818 * [/en]
15819 * [ja][/ja]
15820 * @tutorial vanilla/Reference/search-input
15821 * @seealso ons-input
15822 * [en]The `<ons-input>` element is used to display a text input.[/en]
15823 * [ja][/ja]
15824 * @seealso ons-range
15825 * [en]The `<ons-range>` element is used to display a range slider.[/en]
15826 * [ja][/ja]
15827 * @seealso ons-switch
15828 * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
15829 * [ja][/ja]
15830 * @seealso ons-select
15831 * [en]The `<ons-select>` element is used to display a select box.[/en]
15832 * [ja][/ja]
15833 * @seealso ons-checkbox
15834 * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
15835 * [ja][/ja]
15836 * @seealso ons-radio
15837 * [en]The `<ons-radio>` element is used to display a radio button.[/en]
15838 * [ja][/ja]
15839 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
15840 * @example
15841 * <ons-search-input placeholder="Search"></ons-search-input>
15842 */
15843 var SearchInputElement = /*#__PURE__*/function (_BaseInputElement) {
15844 _inherits(SearchInputElement, _BaseInputElement);
15845 var _super = _createSuper(SearchInputElement);
15846 function SearchInputElement() {
15847 _classCallCheck(this, SearchInputElement);
15848 return _super.apply(this, arguments);
15849 }
15850 _createClass(SearchInputElement, [{
15851 key: "_scheme",
15852 get: function get() {
15853 return scheme$f;
15854 }
15855 }, {
15856 key: "_template",
15857 get: function get() {
15858 return "\n <input type=\"".concat(this.type, "\" class=\"search-input\">\n ");
15859 }
15860 }, {
15861 key: "type",
15862 get: function get() {
15863 return 'search';
15864 }
15865
15866 /**
15867 * @attribute input-id
15868 * @type {String}
15869 * @description
15870 * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
15871 * [ja][/ja]
15872 */
15873
15874 /**
15875 * @property value
15876 * @type {String}
15877 * @description
15878 * [en]The current value of the input.[/en]
15879 * [ja][/ja]
15880 */
15881
15882 /**
15883 * @property disabled
15884 * @type {Boolean}
15885 * @description
15886 * [en]Whether the input is disabled or not.[/en]
15887 * [ja]無効化されている場合に`true`。[/ja]
15888 */
15889
15890 /**
15891 * @method focus
15892 * @signature focus()
15893 * @description
15894 * [en]Focuses the input.[/en]
15895 * [ja][/ja]
15896 */
15897
15898 /**
15899 * @method blur
15900 * @signature blur()
15901 * @description
15902 * [en]Removes focus from the input.[/en]
15903 * [ja][/ja]
15904 */
15905 }]);
15906 return SearchInputElement;
15907 }(BaseInputElement);
15908 onsElements.SearchInput = SearchInputElement;
15909 customElements.define('ons-search-input', SearchInputElement);
15910
15911 var ModalAnimator = /*#__PURE__*/function (_BaseAnimator) {
15912 _inherits(ModalAnimator, _BaseAnimator);
15913 var _super = _createSuper(ModalAnimator);
15914 /**
15915 * @param {Object} options
15916 * @param {String} options.timing
15917 * @param {Number} options.duration
15918 * @param {Number} options.delay
15919 */
15920 function ModalAnimator() {
15921 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
15922 _ref$timing = _ref.timing,
15923 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
15924 _ref$delay = _ref.delay,
15925 delay = _ref$delay === void 0 ? 0 : _ref$delay,
15926 _ref$duration = _ref.duration,
15927 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
15928 _classCallCheck(this, ModalAnimator);
15929 return _super.call(this, {
15930 timing: timing,
15931 delay: delay,
15932 duration: duration
15933 });
15934 }
15935
15936 /**
15937 * @param {HTMLElement} modal
15938 * @param {Function} callback
15939 */
15940 _createClass(ModalAnimator, [{
15941 key: "show",
15942 value: function show(modal, callback) {
15943 callback();
15944 }
15945
15946 /**
15947 * @param {HTMLElement} modal
15948 * @param {Function} callback
15949 */
15950 }, {
15951 key: "hide",
15952 value: function hide(modal, callback) {
15953 callback();
15954 }
15955 }]);
15956 return ModalAnimator;
15957 }(BaseAnimator);
15958
15959 /**
15960 * iOS style animator for dialog.
15961 */
15962 var FadeModalAnimator = /*#__PURE__*/function (_ModalAnimator) {
15963 _inherits(FadeModalAnimator, _ModalAnimator);
15964 var _super = _createSuper(FadeModalAnimator);
15965 function FadeModalAnimator() {
15966 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
15967 _ref$timing = _ref.timing,
15968 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
15969 _ref$delay = _ref.delay,
15970 delay = _ref$delay === void 0 ? 0 : _ref$delay,
15971 _ref$duration = _ref.duration,
15972 duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
15973 _classCallCheck(this, FadeModalAnimator);
15974 return _super.call(this, {
15975 timing: timing,
15976 delay: delay,
15977 duration: duration
15978 });
15979 }
15980
15981 /**
15982 * @param {HTMLElement} modal
15983 * @param {Function} callback
15984 */
15985 _createClass(FadeModalAnimator, [{
15986 key: "show",
15987 value: function show(modal, callback) {
15988 callback = callback ? callback : function () {};
15989 Animit(modal, this.def).default({
15990 opacity: 0
15991 }, {
15992 opacity: 1
15993 }).queue(function (done) {
15994 callback();
15995 done();
15996 }).play();
15997 }
15998
15999 /**
16000 * @param {HTMLElement} modal
16001 * @param {Function} callback
16002 */
16003 }, {
16004 key: "hide",
16005 value: function hide(modal, callback) {
16006 callback = callback ? callback : function () {};
16007 Animit(modal, this.def).default({
16008 opacity: 1
16009 }, {
16010 opacity: 0
16011 }).queue(function (done) {
16012 callback();
16013 done();
16014 }).play();
16015 }
16016 }]);
16017 return FadeModalAnimator;
16018 }(ModalAnimator);
16019
16020 /**
16021 * iOS style animator for modal.
16022 */
16023 var LiftModalAnimator = /*#__PURE__*/function (_ModalAnimator) {
16024 _inherits(LiftModalAnimator, _ModalAnimator);
16025 var _super = _createSuper(LiftModalAnimator);
16026 function LiftModalAnimator() {
16027 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
16028 _ref$timing = _ref.timing,
16029 timing = _ref$timing === void 0 ? 'cubic-bezier( .1, .7, .1, 1)' : _ref$timing,
16030 _ref$delay = _ref.delay,
16031 delay = _ref$delay === void 0 ? 0 : _ref$delay,
16032 _ref$duration = _ref.duration,
16033 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
16034 _classCallCheck(this, LiftModalAnimator);
16035 return _super.call(this, {
16036 timing: timing,
16037 delay: delay,
16038 duration: duration
16039 });
16040 }
16041
16042 /**
16043 * @param {HTMLElement} modal
16044 * @param {Function} callback
16045 */
16046 _createClass(LiftModalAnimator, [{
16047 key: "show",
16048 value: function show(modal, callback) {
16049 callback = callback ? callback : function () {};
16050 Animit(modal, this.def).default({
16051 transform: 'translate3d(0, 100%, 0)'
16052 }, {
16053 transform: 'translate3d(0, 0, 0)'
16054 }).queue(function (done) {
16055 callback();
16056 done();
16057 }).play();
16058 }
16059
16060 /**
16061 * @param {HTMLElement} modal
16062 * @param {Function} callback
16063 */
16064 }, {
16065 key: "hide",
16066 value: function hide(modal, callback) {
16067 callback = callback ? callback : function () {};
16068 Animit(modal, this.def).default({
16069 transform: 'translate3d(0, 0, 0)'
16070 }, {
16071 transform: 'translate3d(0, 100%, 0)'
16072 }).queue(function (done) {
16073 callback();
16074 done();
16075 }).play();
16076 }
16077 }]);
16078 return LiftModalAnimator;
16079 }(ModalAnimator);
16080
16081 var scheme$e = {
16082 '': 'modal--*',
16083 'modal__content': 'modal--*__content'
16084 };
16085 var defaultClassName$8 = 'modal';
16086 var _animatorDict$4 = {
16087 'default': ModalAnimator,
16088 'fade': FadeModalAnimator,
16089 'lift': LiftModalAnimator,
16090 'none': ModalAnimator
16091 };
16092
16093 /**
16094 * @element ons-modal
16095 * @category dialog
16096 * @description
16097 * [en]
16098 * Modal component that masks current screen. Underlying components are not subject to any events while the modal component is shown.
16099 *
16100 * This component can be used to block user input while some operation is running or to show some information to the user.
16101 * [/en]
16102 * [ja]
16103 * 画面全体をマスクするモーダル用コンポーネントです。下側にあるコンポーネントは、
16104 * モーダルが表示されている間はイベント通知が行われません。
16105 * [/ja]
16106 * @seealso ons-dialog
16107 * [en]The `<ons-dialog>` component can be used to create a modal dialog.[/en]
16108 * [ja][/ja]
16109 * @codepen devIg
16110 * @tutorial vanilla/reference/modal
16111 * @example
16112 * <ons-modal id="modal">
16113 * Modal content
16114 * </ons-modal>
16115 * <script>
16116 * var modal = document.getElementById('modal');
16117 * modal.show();
16118 * </script>
16119 */
16120 var ModalElement = /*#__PURE__*/function (_BaseDialogElement) {
16121 _inherits(ModalElement, _BaseDialogElement);
16122 var _super = _createSuper(ModalElement);
16123 /**
16124 * @event preshow
16125 * @description
16126 * [en]Fired just before the modal is displayed.[/en]
16127 * [ja]モーダルが表示される直前に発火します。[/ja]
16128 * @param {Object} event [en]Event object.[/en]
16129 * @param {Object} event.modal
16130 * [en]Component object.[/en]
16131 * [ja]コンポーネントのオブジェクト。[/ja]
16132 * @param {Function} event.cancel
16133 * [en]Execute this function to stop the modal from being shown.[/en]
16134 * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
16135 */
16136
16137 /**
16138 * @event postshow
16139 * @description
16140 * [en]Fired just after the modal is displayed.[/en]
16141 * [ja]モーダルが表示された直後に発火します。[/ja]
16142 * @param {Object} event [en]Event object.[/en]
16143 * @param {Object} event.modal
16144 * [en]Component object.[/en]
16145 * [ja]コンポーネントのオブジェクト。[/ja]
16146 */
16147
16148 /**
16149 * @event prehide
16150 * @description
16151 * [en]Fired just before the modal is hidden.[/en]
16152 * [ja]モーダルが隠れる直前に発火します。[/ja]
16153 * @param {Object} event [en]Event object.[/en]
16154 * @param {Object} event.modal
16155 * [en]Component object.[/en]
16156 * [ja]コンポーネントのオブジェクト。[/ja]
16157 * @param {Function} event.cancel
16158 * [en]Execute this function to stop the modal from being hidden.[/en]
16159 * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
16160 */
16161
16162 /**
16163 * @event posthide
16164 * @description
16165 * [en]Fired just after the modal is hidden.[/en]
16166 * [ja]モーダルが隠れた後に発火します。[/ja]
16167 * @param {Object} event [en]Event object.[/en]
16168 * @param {Object} event.modal
16169 * [en]Component object.[/en]
16170 * [ja]コンポーネントのオブジェクト。[/ja]
16171 */
16172
16173 /**
16174 * @attribute animation
16175 * @type {String}
16176 * @default default
16177 * @description
16178 * [en]The animation used when showing and hiding the modal. Can be either `"none"`, `"fade"` or `"lift"`.[/en]
16179 * [ja]モーダルを表示する際のアニメーション名を指定します。"none"もしくは"fade","lift"を指定できます。[/ja]
16180 */
16181
16182 /**
16183 * @attribute animation-options
16184 * @type {Expression}
16185 * @description
16186 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
16187 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. <code>{duration: 0.2, delay: 1, timing: 'ease-in'}</code>[/ja]
16188 */
16189
16190 /**
16191 * @property animationOptions
16192 * @type {Object}
16193 * @description
16194 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
16195 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
16196 */
16197
16198 /**
16199 * @attribute visible
16200 * @type {Boolean}
16201 * @description
16202 * [en]Whether the modal is visible or not.[/en]
16203 * [ja]要素が見える場合に`true`。[/ja]
16204 */
16205
16206 function ModalElement() {
16207 var _this;
16208 _classCallCheck(this, ModalElement);
16209 _this = _super.call(this);
16210 _this._defaultDBB = function () {
16211 return undefined;
16212 };
16213 contentReady(_assertThisInitialized(_this), function () {
16214 return _this._compile();
16215 });
16216 return _this;
16217 }
16218 _createClass(ModalElement, [{
16219 key: "_scheme",
16220 get: function get() {
16221 return scheme$e;
16222 }
16223 }, {
16224 key: "_updateAnimatorFactory",
16225 value: function _updateAnimatorFactory() {
16226 return new AnimatorFactory({
16227 animators: _animatorDict$4,
16228 baseClass: ModalAnimator,
16229 baseClassName: 'ModalAnimator',
16230 defaultAnimation: this.getAttribute('animation')
16231 });
16232 }
16233
16234 /**
16235 * @property onDeviceBackButton
16236 * @type {Object}
16237 * @description
16238 * [en]Back-button handler.[/en]
16239 * [ja]バックボタンハンドラ。[/ja]
16240 */
16241 }, {
16242 key: "_compile",
16243 value: function _compile() {
16244 this.style.display = 'none';
16245 this.style.zIndex = 10001;
16246 this.classList.add(defaultClassName$8);
16247 if (!util$4.findChild(this, '.modal__content')) {
16248 var content = document.createElement('div');
16249 content.classList.add('modal__content');
16250 while (this.childNodes[0]) {
16251 var node = this.childNodes[0];
16252 this.removeChild(node);
16253 content.insertBefore(node, null);
16254 }
16255 this.appendChild(content);
16256 }
16257 ModifierUtil.initModifier(this, this._scheme);
16258 }
16259 }, {
16260 key: "_toggleStyle",
16261 value: function _toggleStyle(shouldShow) {
16262 this.style.display = shouldShow ? 'table' : 'none';
16263 }
16264 }, {
16265 key: "connectedCallback",
16266 value: function connectedCallback() {
16267 _get(_getPrototypeOf(ModalElement.prototype), "connectedCallback", this).call(this);
16268 }
16269 }, {
16270 key: "disconnectedCallback",
16271 value: function disconnectedCallback() {
16272 _get(_getPrototypeOf(ModalElement.prototype), "disconnectedCallback", this).call(this);
16273 }
16274
16275 /**
16276 * @property visible
16277 * @type {Boolean}
16278 * @description
16279 * [en]Whether the element is visible or not.[/en]
16280 * [ja]要素が見える場合に`true`。[/ja]
16281 */
16282
16283 /**
16284 * @method show
16285 * @signature show([options])
16286 * @param {Object} [options]
16287 * [en]Parameter object.[/en]
16288 * [ja]オプションを指定するオブジェクト。[/ja]
16289 * @param {String} [options.animation]
16290 * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
16291 * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
16292 * @param {String} [options.animationOptions]
16293 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
16294 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
16295 * @param {Function} [options.callback]
16296 * [en]This function is called after the modal has been revealed.[/en]
16297 * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
16298 * @description
16299 * [en]Show modal.[/en]
16300 * [ja]モーダルを表示します。[/ja]
16301 * @return {Promise}
16302 * [en]Resolves to the displayed element[/en]
16303 * [ja][/ja]
16304 */
16305
16306 /**
16307 * @method toggle
16308 * @signature toggle([options])
16309 * @param {Object} [options]
16310 * [en]Parameter object.[/en]
16311 * [ja]オプションを指定するオブジェクト。[/ja]
16312 * @param {String} [options.animation]
16313 * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
16314 * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
16315 * @param {String} [options.animationOptions]
16316 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
16317 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
16318 * @param {Function} [options.callback]
16319 * [en]This function is called after the modal has been revealed.[/en]
16320 * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
16321 * @description
16322 * [en]Toggle modal visibility.[/en]
16323 * [ja]モーダルの表示を切り替えます。[/ja]
16324 */
16325
16326 /**
16327 * @method hide
16328 * @signature hide([options])
16329 * @param {Object} [options]
16330 * [en]Parameter object.[/en]
16331 * [ja]オプションを指定するオブジェクト。[/ja]
16332 * @param {String} [options.animation]
16333 * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
16334 * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
16335 * @param {String} [options.animationOptions]
16336 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
16337 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
16338 * @param {Function} [options.callback]
16339 * [en]This function is called after the modal has been revealed.[/en]
16340 * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
16341 * @description
16342 * [en]Hide modal.[/en]
16343 * [ja]モーダルを非表示にします。[/ja]
16344 * @return {Promise}
16345 * [en]Resolves to the hidden element[/en]
16346 * [ja][/ja]
16347 */
16348 }, {
16349 key: "attributeChangedCallback",
16350 value: function attributeChangedCallback(name, last, current) {
16351 if (name === 'class') {
16352 util$4.restoreClass(this, defaultClassName$8, scheme$e);
16353 } else {
16354 _get(_getPrototypeOf(ModalElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
16355 }
16356 }
16357
16358 /**
16359 * @param {String} name
16360 * @param {Function} Animator
16361 */
16362 }], [{
16363 key: "observedAttributes",
16364 get: function get() {
16365 return [].concat(_toConsumableArray(_get(_getPrototypeOf(ModalElement), "observedAttributes", this)), ['class']);
16366 }
16367 }, {
16368 key: "registerAnimator",
16369 value: function registerAnimator(name, Animator) {
16370 if (!(Animator.prototype instanceof ModalAnimator)) {
16371 util$4.throwAnimator('Modal');
16372 }
16373 _animatorDict$4[name] = Animator;
16374 }
16375 }, {
16376 key: "animators",
16377 get: function get() {
16378 return _animatorDict$4;
16379 }
16380 }, {
16381 key: "ModalAnimator",
16382 get: function get() {
16383 return ModalAnimator;
16384 }
16385 }]);
16386 return ModalElement;
16387 }(BaseDialogElement);
16388 onsElements.Modal = ModalElement;
16389 customElements.define('ons-modal', ModalElement);
16390
16391 var widthToPx = function widthToPx(width) {
16392 var _ref = [parseInt(width, 10), /px/.test(width)],
16393 value = _ref[0],
16394 px = _ref[1];
16395 return px ? value : Math.round(document.body.offsetWidth * value / 100);
16396 };
16397 var SwipeReveal = /*#__PURE__*/function () {
16398 function SwipeReveal(params) {
16399 var _this = this;
16400 _classCallCheck(this, SwipeReveal);
16401 'element ignoreSwipe isInitialState onDragCallback swipeMax swipeMin swipeMid'.split(/\s+/).forEach(function (key) {
16402 return _this[key] = params[key];
16403 });
16404 this.elementHandler = params.elementHandler || params.element;
16405 this.getThreshold = params.getThreshold || function () {
16406 return .5;
16407 };
16408 this.getSide = params.getSide || function () {
16409 return 'left';
16410 };
16411 this.handleGesture = this.handleGesture.bind(this);
16412 this._shouldFixScroll = util$4.globals.actualMobileOS === 'ios';
16413 }
16414 _createClass(SwipeReveal, [{
16415 key: "update",
16416 value: function update() {
16417 var swipeable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.element.hasAttribute('swipeable');
16418 if (!this.gestureDetector) {
16419 this.gestureDetector = new GestureDetector(this.elementHandler, {
16420 dragMinDistance: 1,
16421 passive: !this._shouldFixScroll
16422 });
16423 }
16424 var action = swipeable ? 'on' : 'off';
16425 this.gestureDetector[action]('drag dragstart dragend', this.handleGesture);
16426 }
16427 }, {
16428 key: "handleGesture",
16429 value: function handleGesture(e) {
16430 if (e.gesture) {
16431 if (e.type === 'dragstart') {
16432 this.onDragStart(e);
16433 } else if (!this._ignoreDrag) {
16434 e.type === 'dragend' ? this.onDragEnd(e) : this.onDrag(e);
16435 }
16436 }
16437 }
16438 }, {
16439 key: "onDragStart",
16440 value: function onDragStart(event) {
16441 var _this2 = this;
16442 var getDistance = function getDistance() {
16443 return _this2.getSide() === 'left' ? event.gesture.center.clientX : window.innerWidth - event.gesture.center.clientX;
16444 };
16445 this._ignoreDrag = event.consumed || !util$4.isValidGesture(event) || this.ignoreSwipe(event, getDistance());
16446 if (!this._ignoreDrag) {
16447 event.consume && event.consume();
16448 event.consumed = true;
16449 this._width = widthToPx(this.element.style.width || '100%');
16450 this._startDistance = this._distance = !(this.isInitialState instanceof Function) || this.isInitialState() ? 0 : this._width;
16451 util$4.iosPreventScroll(this.gestureDetector);
16452 }
16453 }
16454 }, {
16455 key: "onDrag",
16456 value: function onDrag(event) {
16457 event.stopPropagation();
16458 var delta = this.getSide() === 'left' ? event.gesture.deltaX : -event.gesture.deltaX;
16459 var distance = Math.max(0, Math.min(this._width, this._startDistance + delta));
16460 if (distance !== this._distance) {
16461 this._distance = distance;
16462 this.swipeMid(this._distance, this._width);
16463 }
16464 }
16465 }, {
16466 key: "onDragEnd",
16467 value: function onDragEnd(event) {
16468 event.stopPropagation();
16469 var direction = event.gesture.interimDirection;
16470 var isSwipeMax = this.getSide() !== direction && this._distance > this._width * this.getThreshold();
16471 isSwipeMax ? this.swipeMax() : this.swipeMin();
16472 }
16473 }, {
16474 key: "dispose",
16475 value: function dispose() {
16476 this.gestureDetector && this.gestureDetector.dispose();
16477 this.gestureDetector = this.element = this.elementHandler = null;
16478 }
16479 }]);
16480 return SwipeReveal;
16481 }();
16482
16483 var NavigatorAnimator = /*#__PURE__*/function (_BaseAnimator) {
16484 _inherits(NavigatorAnimator, _BaseAnimator);
16485 var _super = _createSuper(NavigatorAnimator);
16486 /**
16487 * @param {Object} options
16488 * @param {String} options.timing
16489 * @param {Number} options.duration
16490 * @param {Number} options.delay
16491 */
16492 function NavigatorAnimator(options) {
16493 _classCallCheck(this, NavigatorAnimator);
16494 options = util$4.extend({
16495 timing: 'linear',
16496 duration: '0.4',
16497 delay: '0'
16498 }, options || {});
16499 return _super.call(this, options);
16500 }
16501 _createClass(NavigatorAnimator, [{
16502 key: "push",
16503 value: function push(enterPage, leavePage, callback) {
16504 callback();
16505 }
16506 }, {
16507 key: "pop",
16508 value: function pop(enterPage, leavePage, callback) {
16509 callback();
16510 }
16511 }, {
16512 key: "block",
16513 value: function block(page) {
16514 var blocker = util$4.createElement("\n <div style=\"position: absolute; background-color: transparent; width: 100%; height: 100%; z-index: 100000\"></div>\n ");
16515 page.parentNode.appendChild(blocker);
16516 return function () {
16517 return blocker.remove();
16518 };
16519 }
16520 }]);
16521 return NavigatorAnimator;
16522 }(BaseAnimator);
16523
16524 var _excluded$1 = ["durationRestore", "durationSwipe", "timingSwipe"];
16525
16526 /**
16527 * Abstract swipe animator for iOS navigator transition.
16528 */
16529 var IOSSwipeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
16530 _inherits(IOSSwipeNavigatorAnimator, _NavigatorAnimator);
16531 var _super = _createSuper(IOSSwipeNavigatorAnimator);
16532 function IOSSwipeNavigatorAnimator() {
16533 var _this;
16534 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
16535 _ref$durationRestore = _ref.durationRestore,
16536 durationRestore = _ref$durationRestore === void 0 ? 0.1 : _ref$durationRestore,
16537 _ref$durationSwipe = _ref.durationSwipe,
16538 durationSwipe = _ref$durationSwipe === void 0 ? 0.15 : _ref$durationSwipe,
16539 _ref$timingSwipe = _ref.timingSwipe,
16540 timingSwipe = _ref$timingSwipe === void 0 ? 'linear' : _ref$timingSwipe,
16541 rest = _objectWithoutProperties(_ref, _excluded$1);
16542 _classCallCheck(this, IOSSwipeNavigatorAnimator);
16543 _this = _super.call(this, _objectSpread2({}, rest));
16544 if (_this.constructor === IOSSwipeNavigatorAnimator) {
16545 util$4.throwAbstract();
16546 }
16547 _this.durationRestore = durationRestore;
16548 _this.durationSwipe = durationSwipe;
16549 _this.timingSwipe = timingSwipe;
16550 _this.optSwipe = {
16551 timing: timingSwipe,
16552 duration: durationSwipe
16553 };
16554 _this.optRestore = {
16555 timing: timingSwipe,
16556 duration: durationRestore
16557 };
16558 _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>");
16559 _this.isDragStart = true;
16560 return _this;
16561 }
16562 _createClass(IOSSwipeNavigatorAnimator, [{
16563 key: "_decompose",
16564 value: function _decompose() {
16565 util$4.throwMember();
16566 }
16567 }, {
16568 key: "_shouldAnimateToolbar",
16569 value: function _shouldAnimateToolbar() {
16570 util$4.throwMember();
16571 }
16572 }, {
16573 key: "_calculateDelta",
16574 value: function _calculateDelta() {
16575 util$4.throwMember();
16576 }
16577 }, {
16578 key: "_dragStartSetup",
16579 value: function _dragStartSetup(enterPage, leavePage) {
16580 this.isDragStart = false;
16581
16582 // Avoid content clicks
16583 this.unblock = _get(_getPrototypeOf(IOSSwipeNavigatorAnimator.prototype), "block", this).call(this, leavePage);
16584
16585 // Mask
16586 enterPage.parentElement.insertBefore(this.backgroundMask, enterPage);
16587
16588 // Decomposition
16589 this.target = {
16590 enter: util$4.findToolbarPage(enterPage) || enterPage,
16591 leave: util$4.findToolbarPage(leavePage) || leavePage
16592 };
16593 this.decomp = {
16594 enter: this._decompose(this.target.enter),
16595 leave: this._decompose(this.target.leave)
16596 };
16597
16598 // Animation values
16599 this.delta = this._calculateDelta(leavePage, this.decomp.leave);
16600 this.shouldAnimateToolbar = this._shouldAnimateToolbar(this.target.enter, this.target.leave);
16601
16602 // Shadow && styles
16603 if (this.shouldAnimateToolbar) {
16604 this.swipeShadow.style.top = this.decomp.leave.toolbar.offsetHeight + 'px';
16605 this.target.leave.appendChild(this.swipeShadow);
16606 this._saveStyle(this.target.enter, this.target.leave);
16607 } else {
16608 leavePage.appendChild(this.swipeShadow);
16609 this._saveStyle(enterPage, leavePage);
16610 }
16611 leavePage.classList.add('overflow-visible');
16612 this.overflowElement = leavePage;
16613 this.decomp.leave.content.classList.add('content-swiping');
16614 }
16615 }, {
16616 key: "translate",
16617 value: function translate(distance, maxWidth, enterPage, leavePage) {
16618 this.isSwiping = true;
16619 if (enterPage.style.display === 'none') {
16620 enterPage.style.display = '';
16621 }
16622 if (this.isDragStart) {
16623 this.maxWidth = maxWidth;
16624 this._dragStartSetup(enterPage, leavePage);
16625 }
16626 var swipeRatio = (distance - maxWidth) / maxWidth;
16627 if (this.shouldAnimateToolbar) {
16628 Animit.runAll( /* Enter page */
16629
16630 Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
16631 transform: "translate3d(".concat(swipeRatio * 25, "%, 0, 0)"),
16632 opacity: 1 + swipeRatio * 10 / 100 // 0.9 -> 1
16633 }), Animit(this.decomp.enter.toolbarCenter).queue({
16634 transform: "translate3d(".concat(this.delta.title * swipeRatio, "px, 0, 0)"),
16635 opacity: 1 + swipeRatio // 0 -> 1
16636 }), Animit(this.decomp.enter.backButtonLabel).queue({
16637 opacity: 1 + swipeRatio * 10 / 100,
16638 // 0.9 -> 1
16639 transform: "translate3d(".concat(this.delta.label * swipeRatio, "px, 0, 0)")
16640 }), Animit(this.decomp.enter.other).queue({
16641 opacity: 1 + swipeRatio // 0 -> 1
16642 }), /* Leave page */
16643
16644 Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background, this.swipeShadow]).queue({
16645 transform: "translate3d(".concat(distance, "px, 0, 0)")
16646 }), Animit(this.decomp.leave.toolbar).queue({
16647 opacity: -1 * swipeRatio // 1 -> 0
16648 }), Animit(this.decomp.leave.toolbarCenter).queue({
16649 transform: "translate3d(".concat((1 + swipeRatio) * 125, "%, 0, 0)")
16650 }), Animit(this.decomp.leave.backButtonLabel).queue({
16651 opacity: -1 * swipeRatio,
16652 // 1 -> 0
16653 transform: "translate3d(".concat(this.delta.title * (1 + swipeRatio), "px, 0, 0)")
16654 }), /* Other */
16655
16656 Animit(this.swipeShadow).queue({
16657 opacity: -1 * swipeRatio // 1 -> 0
16658 }));
16659 } else {
16660 Animit.runAll(Animit(leavePage).queue({
16661 transform: "translate3d(".concat(distance, "px, 0, 0)")
16662 }), Animit(enterPage).queue({
16663 transform: "translate3d(".concat(swipeRatio * 25, "%, 0, 0)"),
16664 opacity: 1 + swipeRatio * 10 / 100 // 0.9 -> 1
16665 }), Animit(this.swipeShadow).queue({
16666 opacity: -1 * swipeRatio // 1 -> 0
16667 }));
16668 }
16669 }
16670 }, {
16671 key: "restore",
16672 value: function restore(enterPage, leavePage, callback) {
16673 var _this2 = this;
16674 if (this.isDragStart) {
16675 return;
16676 }
16677 if (this.shouldAnimateToolbar) {
16678 Animit.runAll( /* Enter page */
16679
16680 Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
16681 transform: 'translate3d(-25%, 0, 0)',
16682 opacity: 0.9
16683 }, this.optRestore), Animit(this.decomp.enter.toolbarCenter).queue({
16684 transform: "translate3d(-".concat(this.delta.title, "px, 0, 0)"),
16685 transition: "opacity ".concat(this.durationRestore, "s linear, transform ").concat(this.durationRestore, "s ").concat(this.timingSwipe),
16686 opacity: 0
16687 }), Animit(this.decomp.enter.backButtonLabel).queue({
16688 transform: "translate3d(-".concat(this.delta.label, "px, 0, 0)")
16689 }, this.optRestore), Animit(this.decomp.enter.other).queue({
16690 opacity: 0
16691 }, this.optRestore), /* Leave page */
16692
16693 Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background, this.swipeShadow]).queue({
16694 transform: "translate3d(0, 0, 0)"
16695 }, this.optRestore), Animit(this.decomp.leave.toolbar).queue({
16696 opacity: 1
16697 }, this.optRestore), Animit(this.decomp.leave.toolbarCenter).queue({
16698 transform: "translate3d(0, 0, 0)"
16699 }, this.optRestore), Animit(this.decomp.leave.backButtonLabel).queue({
16700 opacity: 1,
16701 transform: "translate3d(0, 0, 0)",
16702 transition: "opacity ".concat(this.durationRestore, "s linear, transform ").concat(this.durationRestore, "s ").concat(this.timingSwipe)
16703 }), /* Other */
16704
16705 Animit(this.swipeShadow).queue({
16706 opacity: 0
16707 }, this.optRestore).queue(function (done) {
16708 _this2._reset(_this2.target.enter, _this2.target.leave);
16709 enterPage.style.display = 'none';
16710 callback && callback();
16711 done();
16712 }));
16713 } else {
16714 Animit.runAll(Animit(enterPage).queue({
16715 transform: 'translate3D(-25%, 0, 0)',
16716 opacity: 0.9
16717 }, this.optRestore), Animit(leavePage).queue({
16718 transform: 'translate3D(0, 0, 0)'
16719 }, this.optRestore).queue(function (done) {
16720 _this2._reset(enterPage, leavePage);
16721 enterPage.style.display = 'none';
16722 callback && callback();
16723 done();
16724 }));
16725 }
16726 }
16727 }, {
16728 key: "popSwipe",
16729 value: function popSwipe(enterPage, leavePage, callback) {
16730 var _this3 = this;
16731 if (this.isDragStart) {
16732 return;
16733 }
16734 if (this.shouldAnimateToolbar) {
16735 Animit.runAll( /* Enter page */
16736
16737 Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
16738 transform: 'translate3d(0, 0, 0)',
16739 opacity: 1
16740 }, this.optSwipe), Animit(this.decomp.enter.toolbarCenter).queue({
16741 transform: "translate3d(0, 0, 0)",
16742 transition: "opacity ".concat(this.durationSwipe, "s linear, transform ").concat(this.durationSwipe, "s ").concat(this.timingSwipe),
16743 opacity: 1
16744 }), Animit(this.decomp.enter.backButtonLabel).queue({
16745 transform: "translate3d(0, 0, 0)"
16746 }, this.optSwipe), Animit(this.decomp.enter.other).queue({
16747 opacity: 1
16748 }, this.optSwipe), /* Leave page */
16749
16750 Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background]).queue({
16751 transform: "translate3d(100%, 0, 0)"
16752 }, this.optSwipe), Animit(this.decomp.leave.toolbar).queue({
16753 opacity: 0
16754 }, this.optSwipe), Animit(this.decomp.leave.toolbarCenter).queue({
16755 transform: "translate3d(125%, 0, 0)"
16756 }, this.optSwipe), Animit(this.decomp.leave.backButtonLabel).queue({
16757 opacity: 0,
16758 transform: "translate3d(".concat(this.delta.title, "px, 0, 0)"),
16759 transition: "opacity ".concat(this.durationSwipe, "s linear, transform ").concat(this.durationSwipe, "s ").concat(this.timingSwipe)
16760 }), /* Other */
16761
16762 Animit(this.swipeShadow).queue({
16763 opacity: 0,
16764 transform: "translate3d(".concat(this.maxWidth, "px, 0, 0)")
16765 }, this.optSwipe).queue(function (done) {
16766 _this3._reset(_this3.target.enter, _this3.target.leave);
16767 callback && callback();
16768 done();
16769 }));
16770 } else {
16771 Animit.runAll(Animit(enterPage).queue({
16772 transform: 'translate3D(0, 0, 0)',
16773 opacity: 1.0
16774 }, this.optSwipe), Animit(leavePage).queue({
16775 transform: 'translate3D(100%, 0, 0)'
16776 }, this.optSwipe).queue(function (done) {
16777 _this3._reset(enterPage, leavePage);
16778 callback && callback();
16779 done();
16780 }));
16781 }
16782 }
16783 }, {
16784 key: "_saveStyle",
16785 value: function _saveStyle() {
16786 var _this4 = this;
16787 this._savedStyle = new WeakMap();
16788 var save = function save(el) {
16789 return _this4._savedStyle.set(el, el.getAttribute('style'));
16790 };
16791 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
16792 args[_key] = arguments[_key];
16793 }
16794 args.forEach(save);
16795 Object.keys(this.decomp).forEach(function (p) {
16796 Object.keys(_this4.decomp[p]).forEach(function (k) {
16797 (_this4.decomp[p][k] instanceof Array ? _this4.decomp[p][k] : [_this4.decomp[p][k]]).forEach(save);
16798 });
16799 });
16800 }
16801 }, {
16802 key: "_restoreStyle",
16803 value: function _restoreStyle() {
16804 var _this5 = this;
16805 var restore = function restore(el) {
16806 _this5._savedStyle.get(el) === null ? el.removeAttribute('style') : el.setAttribute('style', _this5._savedStyle.get(el));
16807 _this5._savedStyle.delete(el);
16808 };
16809 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
16810 args[_key2] = arguments[_key2];
16811 }
16812 args.forEach(restore);
16813 Object.keys(this.decomp).forEach(function (p) {
16814 Object.keys(_this5.decomp[p]).forEach(function (k) {
16815 (_this5.decomp[p][k] instanceof Array ? _this5.decomp[p][k] : [_this5.decomp[p][k]]).forEach(restore);
16816 });
16817 });
16818 }
16819 }, {
16820 key: "_reset",
16821 value: function _reset() {
16822 this.isSwiping = false;
16823 this._savedStyle && this._restoreStyle.apply(this, arguments);
16824 this.unblock && this.unblock();
16825 this.swipeShadow.remove();
16826 this.backgroundMask.remove();
16827 this.overflowElement.classList.remove('overflow-visible');
16828 this.decomp.leave.content.classList.remove('content-swiping');
16829 this.decomp = this.target = this.overflowElement = this._savedStyle = null;
16830 this.isDragStart = true;
16831 }
16832 }], [{
16833 key: "swipeable",
16834 get: function get() {
16835 return true;
16836 }
16837 }]);
16838 return IOSSwipeNavigatorAnimator;
16839 }(NavigatorAnimator);
16840
16841 var _excluded = ["timing", "delay", "duration"];
16842 var translate3d = function translate3d() {
16843 var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
16844 var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
16845 var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
16846 return "translate3d(".concat(x, ", ").concat(y, ", ").concat(z, ")");
16847 };
16848
16849 /**
16850 * Slide animator for navigator transition like iOS's screen slide transition.
16851 */
16852 var IOSSlideNavigatorAnimator = /*#__PURE__*/function (_IOSSwipeNavigatorAni) {
16853 _inherits(IOSSlideNavigatorAnimator, _IOSSwipeNavigatorAni);
16854 var _super = _createSuper(IOSSlideNavigatorAnimator);
16855 function IOSSlideNavigatorAnimator() {
16856 var _this;
16857 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
16858 _ref$timing = _ref.timing,
16859 timing = _ref$timing === void 0 ? 'cubic-bezier(0.3, .4, 0, .9)' : _ref$timing,
16860 _ref$delay = _ref.delay,
16861 delay = _ref$delay === void 0 ? 0 : _ref$delay,
16862 _ref$duration = _ref.duration,
16863 duration = _ref$duration === void 0 ? 0.4 : _ref$duration,
16864 rest = _objectWithoutProperties(_ref, _excluded);
16865 _classCallCheck(this, IOSSlideNavigatorAnimator);
16866 _this = _super.call(this, _objectSpread2({
16867 timing: timing,
16868 delay: delay,
16869 duration: duration
16870 }, rest));
16871 _this.backgroundMask = util$4.createElement("<div style=\"position: absolute; width: 100%; height: 100%;" + "background-color: black; z-index: 2\"></div>");
16872 return _this;
16873 }
16874 _createClass(IOSSlideNavigatorAnimator, [{
16875 key: "_decompose",
16876 value: function _decompose(page) {
16877 var toolbar = page._getToolbarElement();
16878 var left = toolbar._getToolbarLeftItemsElement();
16879 var right = toolbar._getToolbarRightItemsElement();
16880 var excludeBackButton = function excludeBackButton(elements) {
16881 var result = [];
16882 for (var i = 0; i < elements.length; i++) {
16883 if (elements[i].nodeName.toLowerCase() !== 'ons-back-button') {
16884 result.push(elements[i]);
16885 }
16886 }
16887 return result;
16888 };
16889 var other = [].concat(left.children.length === 0 ? left : excludeBackButton(left.children)).concat(right.children.length === 0 ? right : excludeBackButton(right.children));
16890 return {
16891 toolbarCenter: toolbar._getToolbarCenterItemsElement(),
16892 backButtonIcon: toolbar._getToolbarBackButtonIconElement(),
16893 backButtonLabel: toolbar._getToolbarBackButtonLabelElement(),
16894 other: other,
16895 content: page._getContentElement(),
16896 background: page._getBackgroundElement(),
16897 toolbar: toolbar,
16898 bottomToolbar: page._getBottomToolbarElement()
16899 };
16900 }
16901 }, {
16902 key: "_shouldAnimateToolbar",
16903 value: function _shouldAnimateToolbar(enterPage, leavePage) {
16904 var toolbars = enterPage._canAnimateToolbar() && leavePage._canAnimateToolbar();
16905 var enterToolbar = enterPage._getToolbarElement();
16906 var leaveToolbar = leavePage._getToolbarElement();
16907 var isStatic = enterToolbar.hasAttribute('static') || leaveToolbar.hasAttribute('static');
16908 var isMaterial = util$4.hasModifier(enterToolbar, 'material') || util$4.hasModifier(leaveToolbar, 'material');
16909 var isTransparent = util$4.hasModifier(enterToolbar, 'transparent') || util$4.hasModifier(leaveToolbar, 'transparent');
16910 return toolbars && !isStatic && !isMaterial && !isTransparent;
16911 }
16912 }, {
16913 key: "_calculateDelta",
16914 value: function _calculateDelta(element, decomposition) {
16915 var title, label;
16916 var pageRect = element.getBoundingClientRect();
16917 if (decomposition.backButtonLabel.classList.contains('back-button__label')) {
16918 var labelRect = decomposition.backButtonLabel.getBoundingClientRect();
16919 title = Math.round(pageRect.width / 2 - labelRect.width / 2 - labelRect.left);
16920 } else {
16921 title = Math.round(pageRect.width / 2 * 0.6);
16922 }
16923 if (decomposition.backButtonIcon.classList.contains('back-button__icon')) {
16924 label = decomposition.backButtonIcon.getBoundingClientRect().right - 2;
16925 }
16926 return {
16927 title: title,
16928 label: label
16929 };
16930 }
16931
16932 /**
16933 * @param {Object} enterPage
16934 * @param {Object} leavePage
16935 * @param {Function} callback
16936 */
16937 }, {
16938 key: "push",
16939 value: function push(enterPage, leavePage, callback) {
16940 var _this2 = this;
16941 this.backgroundMask.remove();
16942 leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
16943 var unblock = _get(_getPrototypeOf(IOSSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
16944 contentReady(enterPage, function () {
16945 var enterPageTarget = util$4.findToolbarPage(enterPage) || enterPage;
16946 var leavePageTarget = util$4.findToolbarPage(leavePage) || leavePage;
16947 var enterPageDecomposition = _this2._decompose(enterPageTarget);
16948 var leavePageDecomposition = _this2._decompose(leavePageTarget);
16949 var delta = _this2._calculateDelta(leavePage, enterPageDecomposition);
16950 var shouldAnimateToolbar = _this2._shouldAnimateToolbar(enterPageTarget, leavePageTarget);
16951 if (shouldAnimateToolbar) {
16952 Animit.runAll(Animit([enterPageDecomposition.content, enterPageDecomposition.bottomToolbar, enterPageDecomposition.background], _this2.def).default({
16953 transform: translate3d('100%')
16954 }, {
16955 transform: translate3d()
16956 }), Animit(enterPageDecomposition.toolbar, _this2.def).default({
16957 opacity: 0
16958 }, {
16959 opacity: 1
16960 }), Animit(enterPageDecomposition.toolbarCenter, _this2.def).default({
16961 transform: translate3d('125%'),
16962 opacity: 1
16963 }, {
16964 transform: translate3d(),
16965 opacity: 1
16966 }), Animit(enterPageDecomposition.backButtonLabel, _this2.def).default({
16967 transform: translate3d("".concat(delta.title, "px")),
16968 opacity: 0
16969 }, {
16970 transform: translate3d(),
16971 opacity: 1,
16972 transition: "opacity ".concat(_this2.duration, "s linear, transform ").concat(_this2.duration, "s ").concat(_this2.timing)
16973 }), Animit(enterPageDecomposition.other, _this2.def).default({
16974 opacity: 0
16975 }, {
16976 css: {
16977 opacity: 1
16978 },
16979 timing: 'linear'
16980 }), Animit([leavePageDecomposition.content, leavePageDecomposition.bottomToolbar, leavePageDecomposition.background], _this2.def).default({
16981 transform: translate3d(),
16982 opacity: 1
16983 }, {
16984 transform: translate3d('-25%'),
16985 opacity: 0.9
16986 }).queue(function (done) {
16987 _this2.backgroundMask.remove();
16988 unblock();
16989 callback();
16990 done();
16991 }), Animit(leavePageDecomposition.toolbarCenter, _this2.def).default({
16992 transform: translate3d(),
16993 opacity: 1
16994 }, {
16995 transform: translate3d("-".concat(delta.title, "px")),
16996 opacity: 0,
16997 transition: "opacity ".concat(_this2.duration, "s linear, transform ").concat(_this2.duration, "s ").concat(_this2.timing)
16998 }), Animit(leavePageDecomposition.backButtonLabel, _this2.def).default({
16999 transform: translate3d(),
17000 opacity: 1
17001 }, {
17002 transform: translate3d("-".concat(delta.label, "px")),
17003 opacity: 0
17004 }), Animit(leavePageDecomposition.other, _this2.def).default({
17005 opacity: 1
17006 }, {
17007 css: {
17008 opacity: 0
17009 },
17010 timing: 'linear'
17011 }));
17012 } else {
17013 Animit.runAll(Animit(enterPage, _this2.def).default({
17014 transform: translate3d('100%')
17015 }, {
17016 transform: translate3d()
17017 }), Animit(leavePage, _this2.def).default({
17018 transform: translate3d(),
17019 opacity: 1
17020 }, {
17021 transform: translate3d('-25%'),
17022 opacity: .9
17023 }).queue(function (done) {
17024 _this2.backgroundMask.remove();
17025 unblock();
17026 callback();
17027 done();
17028 }));
17029 }
17030 });
17031 }
17032
17033 /**
17034 * @param {Object} enterPage
17035 * @param {Object} leavePage
17036 * @param {Function} callback
17037 */
17038 }, {
17039 key: "pop",
17040 value: function pop(enterPage, leavePage, callback) {
17041 var _this3 = this;
17042 if (this.isSwiping) {
17043 return this.popSwipe(enterPage, leavePage, callback);
17044 }
17045 this.backgroundMask.remove();
17046 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
17047 var unblock = _get(_getPrototypeOf(IOSSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17048 var enterPageTarget = util$4.findToolbarPage(enterPage) || enterPage;
17049 var leavePageTarget = util$4.findToolbarPage(leavePage) || leavePage;
17050 var enterPageDecomposition = this._decompose(enterPageTarget);
17051 var leavePageDecomposition = this._decompose(leavePageTarget);
17052 var delta = this._calculateDelta(leavePage, leavePageDecomposition);
17053 var shouldAnimateToolbar = this._shouldAnimateToolbar(enterPageTarget, leavePageTarget);
17054 if (shouldAnimateToolbar) {
17055 Animit.runAll(Animit([enterPageDecomposition.content, enterPageDecomposition.bottomToolbar, enterPageDecomposition.background], this.def).default({
17056 transform: translate3d('-25%'),
17057 opacity: .9
17058 }, {
17059 transform: translate3d(),
17060 opacity: 1
17061 }), Animit(enterPageDecomposition.toolbarCenter, this.def).default({
17062 transform: translate3d("-".concat(delta.title, "px")),
17063 opacity: 0
17064 }, {
17065 transform: translate3d(),
17066 opacity: 1,
17067 transition: "opacity ".concat(this.duration, "s linear, transform ").concat(this.duration, "s ").concat(this.timing)
17068 }), Animit(enterPageDecomposition.backButtonLabel, this.def).default({
17069 transform: translate3d("-".concat(delta.label, "px"))
17070 }, {
17071 transform: translate3d()
17072 }), Animit(enterPageDecomposition.other, this.def).default({
17073 opacity: 0
17074 }, {
17075 css: {
17076 opacity: 1
17077 },
17078 timing: 'linear'
17079 }), Animit([leavePageDecomposition.content, leavePageDecomposition.bottomToolbar, leavePageDecomposition.background], this.def).default({
17080 transform: translate3d()
17081 }, {
17082 transform: translate3d('100%')
17083 }).wait(0).queue(function (done) {
17084 _this3.backgroundMask.remove();
17085 unblock();
17086 callback();
17087 done();
17088 }), Animit(leavePageDecomposition.toolbar, this.def).default({
17089 opacity: 1
17090 }, {
17091 opacity: 0
17092 }), Animit(leavePageDecomposition.toolbarCenter, this.def).default({
17093 transform: translate3d()
17094 }, {
17095 transform: translate3d('125%')
17096 }), Animit(leavePageDecomposition.backButtonLabel, this.def).default({
17097 transform: translate3d(),
17098 opacity: 1
17099 }, {
17100 transform: translate3d("".concat(delta.title, "px")),
17101 opacity: 0,
17102 transition: "opacity ".concat(this.duration, "s linear, transform ").concat(this.duration, "s ").concat(this.timing)
17103 }));
17104 } else {
17105 Animit.runAll(Animit(enterPage, this.def).default({
17106 transform: translate3d('-25%'),
17107 opacity: .9
17108 }, {
17109 transform: translate3d(),
17110 opacity: 1
17111 }), Animit(leavePage, this.def).default({
17112 transform: translate3d()
17113 }, {
17114 transform: translate3d('100%')
17115 }).queue(function (done) {
17116 _this3.backgroundMask.remove();
17117 unblock();
17118 callback();
17119 done();
17120 }));
17121 }
17122 }
17123 }]);
17124 return IOSSlideNavigatorAnimator;
17125 }(IOSSwipeNavigatorAnimator);
17126
17127 /**
17128 * Lift screen transition.
17129 */
17130 var IOSLiftNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
17131 _inherits(IOSLiftNavigatorAnimator, _NavigatorAnimator);
17132 var _super = _createSuper(IOSLiftNavigatorAnimator);
17133 function IOSLiftNavigatorAnimator() {
17134 var _this;
17135 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17136 _ref$timing = _ref.timing,
17137 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
17138 _ref$delay = _ref.delay,
17139 delay = _ref$delay === void 0 ? 0 : _ref$delay,
17140 _ref$duration = _ref.duration,
17141 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
17142 _classCallCheck(this, IOSLiftNavigatorAnimator);
17143 _this = _super.call(this, {
17144 timing: timing,
17145 delay: delay,
17146 duration: duration
17147 });
17148 _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%;' + 'background: linear-gradient(black, white);"></div>');
17149 return _this;
17150 }
17151
17152 /**
17153 * @param {Object} enterPage
17154 * @param {Object} leavePage
17155 * @param {Function} callback
17156 */
17157 _createClass(IOSLiftNavigatorAnimator, [{
17158 key: "push",
17159 value: function push(enterPage, leavePage, callback) {
17160 var _this2 = this;
17161 this.backgroundMask.remove();
17162 leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
17163 var unblock = _get(_getPrototypeOf(IOSLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17164 Animit.runAll(Animit(enterPage, this.def).default({
17165 transform: 'translate3D(0, 100%, 0)'
17166 }, {
17167 transform: 'translate3D(0, 0, 0)'
17168 }), Animit(leavePage, this.def).default({
17169 transform: 'translate3D(0, 0, 0)',
17170 opacity: 1
17171 }, {
17172 transform: 'translate3D(0, -10%, 0)',
17173 opacity: .9
17174 }).queue(function (done) {
17175 _this2.backgroundMask.remove();
17176 unblock();
17177 callback();
17178 done();
17179 }));
17180 }
17181
17182 /**
17183 * @param {Object} enterPage
17184 * @param {Object} leavePage
17185 * @param {Function} callback
17186 */
17187 }, {
17188 key: "pop",
17189 value: function pop(enterPage, leavePage, callback) {
17190 var _this3 = this;
17191 this.backgroundMask.remove();
17192 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
17193 var unblock = _get(_getPrototypeOf(IOSLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17194 Animit.runAll(Animit(enterPage, this.def).default({
17195 transform: 'translate3D(0, -43px, 0)',
17196 opacity: .9
17197 }, {
17198 transform: 'translate3D(0, 0, 0)',
17199 opacity: 1
17200 }).queue(function (done) {
17201 _this3.backgroundMask.remove();
17202 unblock();
17203 callback();
17204 done();
17205 }), Animit(leavePage, this.def).default({
17206 transform: 'translate3D(0, 0, 0)'
17207 }, {
17208 transform: 'translate3D(0, 100%, 0)'
17209 }));
17210 }
17211 }]);
17212 return IOSLiftNavigatorAnimator;
17213 }(NavigatorAnimator);
17214
17215 var transform = 'translate3d(0, 0, 0)';
17216
17217 /**
17218 * Fade-in screen transition.
17219 */
17220 var IOSFadeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
17221 _inherits(IOSFadeNavigatorAnimator, _NavigatorAnimator);
17222 var _super = _createSuper(IOSFadeNavigatorAnimator);
17223 function IOSFadeNavigatorAnimator() {
17224 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17225 _ref$timing = _ref.timing,
17226 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
17227 _ref$delay = _ref.delay,
17228 delay = _ref$delay === void 0 ? 0 : _ref$delay,
17229 _ref$duration = _ref.duration,
17230 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
17231 _classCallCheck(this, IOSFadeNavigatorAnimator);
17232 return _super.call(this, {
17233 timing: timing,
17234 delay: delay,
17235 duration: duration
17236 });
17237 }
17238
17239 /**
17240 * @param {Object} enterPage
17241 * @param {Object} leavePage
17242 * @param {Function} callback
17243 */
17244 _createClass(IOSFadeNavigatorAnimator, [{
17245 key: "push",
17246 value: function push(enterPage, leavePage, callback) {
17247 var unblock = _get(_getPrototypeOf(IOSFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17248 Animit.runAll(Animit(enterPage, this.def).default({
17249 transform: transform,
17250 opacity: 0
17251 }, {
17252 transform: transform,
17253 opacity: 1
17254 }).queue(function (done) {
17255 unblock();
17256 callback();
17257 done();
17258 }));
17259 }
17260
17261 /**
17262 * @param {Object} enterPage
17263 * @param {Object} leavePage
17264 * @param {Function} done
17265 */
17266 }, {
17267 key: "pop",
17268 value: function pop(enterPage, leavePage, callback) {
17269 var unblock = _get(_getPrototypeOf(IOSFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17270 Animit.runAll(Animit(leavePage, this.def).default({
17271 transform: transform,
17272 opacity: 1
17273 }, {
17274 transform: transform,
17275 opacity: 0
17276 }).queue(function (done) {
17277 unblock();
17278 callback();
17279 done();
17280 }));
17281 }
17282 }]);
17283 return IOSFadeNavigatorAnimator;
17284 }(NavigatorAnimator);
17285
17286 /**
17287 * Slide animator for navigator transition.
17288 */
17289 var MDSlideNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
17290 _inherits(MDSlideNavigatorAnimator, _NavigatorAnimator);
17291 var _super = _createSuper(MDSlideNavigatorAnimator);
17292 function MDSlideNavigatorAnimator() {
17293 var _this;
17294 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17295 _ref$timing = _ref.timing,
17296 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref$timing,
17297 _ref$delay = _ref.delay,
17298 delay = _ref$delay === void 0 ? 0 : _ref$delay,
17299 _ref$duration = _ref.duration,
17300 duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
17301 _classCallCheck(this, MDSlideNavigatorAnimator);
17302 _this = _super.call(this, {
17303 timing: timing,
17304 delay: delay,
17305 duration: duration
17306 });
17307 _this.blackMaskOpacity = 0.4;
17308 _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%; z-index: 2;' + 'background-color: black; opacity: 0;"></div>');
17309 return _this;
17310 }
17311
17312 /**
17313 * @param {Object} enterPage
17314 * @param {Object} leavePage
17315 * @param {Function} callback
17316 */
17317 _createClass(MDSlideNavigatorAnimator, [{
17318 key: "push",
17319 value: function push(enterPage, leavePage, callback) {
17320 var _this2 = this;
17321 this.backgroundMask.remove();
17322 leavePage.parentElement.insertBefore(this.backgroundMask, leavePage.nextSibling);
17323 var unblock = _get(_getPrototypeOf(MDSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17324 Animit.runAll(Animit(this.backgroundMask, this.def).default({
17325 transform: 'translate3d(0, 0, 0)',
17326 opacity: 0
17327 }, {
17328 opacity: this.blackMaskOpacity
17329 }).queue(function (done) {
17330 _this2.backgroundMask.remove();
17331 done();
17332 }), Animit(enterPage, this.def).default({
17333 transform: 'translate3d(100%, 0, 0)'
17334 }, {
17335 transform: 'translate3d(0, 0, 0)'
17336 }), Animit(leavePage, this.def).default({
17337 transform: 'translate3d(0, 0, 0)'
17338 }, {
17339 transform: 'translate3d(-45%, 0, 0)'
17340 }).queue(function (done) {
17341 unblock();
17342 callback();
17343 done();
17344 }));
17345 }
17346
17347 /**
17348 * @param {Object} enterPage
17349 * @param {Object} leavePage
17350 * @param {Function} callback
17351 */
17352 }, {
17353 key: "pop",
17354 value: function pop(enterPage, leavePage, callback) {
17355 var _this3 = this;
17356 this.backgroundMask.remove();
17357 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage.nextSibling);
17358 var unblock = _get(_getPrototypeOf(MDSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17359 Animit.runAll(Animit(this.backgroundMask, this.def).default({
17360 transform: 'translate3d(0, 0, 0)',
17361 opacity: this.blackMaskOpacity
17362 }, {
17363 opacity: 0
17364 }).queue(function (done) {
17365 _this3.backgroundMask.remove();
17366 done();
17367 }), Animit(enterPage, this.def).default({
17368 transform: 'translate3d(-45%, 0, 0)',
17369 opacity: .9
17370 }, {
17371 transform: 'translate3d(0, 0, 0)',
17372 opacity: 1
17373 }), Animit(leavePage, this.def).default({
17374 transform: 'translate3d(0, 0, 0)'
17375 }, {
17376 transform: 'translate3d(100%, 0, 0)'
17377 }).queue(function (done) {
17378 unblock();
17379 callback();
17380 done();
17381 }));
17382 }
17383 }]);
17384 return MDSlideNavigatorAnimator;
17385 }(NavigatorAnimator);
17386
17387 /**
17388 * Lift screen transition.
17389 */
17390 var MDLiftNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
17391 _inherits(MDLiftNavigatorAnimator, _NavigatorAnimator);
17392 var _super = _createSuper(MDLiftNavigatorAnimator);
17393 function MDLiftNavigatorAnimator() {
17394 var _this;
17395 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17396 _ref$timing = _ref.timing,
17397 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
17398 _ref$delay = _ref.delay,
17399 delay = _ref$delay === void 0 ? 0.05 : _ref$delay,
17400 _ref$duration = _ref.duration,
17401 duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
17402 _classCallCheck(this, MDLiftNavigatorAnimator);
17403 _this = _super.call(this, {
17404 timing: timing,
17405 delay: delay,
17406 duration: duration
17407 });
17408 _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%;' + 'background-color: black;"></div>');
17409 return _this;
17410 }
17411
17412 /**
17413 * @param {Object} enterPage
17414 * @param {Object} leavePage
17415 * @param {Function} callback
17416 */
17417 _createClass(MDLiftNavigatorAnimator, [{
17418 key: "push",
17419 value: function push(enterPage, leavePage, callback) {
17420 var _this2 = this;
17421 this.backgroundMask.remove();
17422 leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
17423 var unblock = _get(_getPrototypeOf(MDLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17424 var maskClear = Animit(this.backgroundMask).wait(this.delay + this.duration).queue(function (done) {
17425 _this2.backgroundMask.remove();
17426 done();
17427 });
17428 Animit.runAll(maskClear, Animit(enterPage, this.def).default({
17429 transform: 'translate3d(0, 100%, 0)'
17430 }, {
17431 transform: 'translate3d(0, 0, 0)'
17432 }), Animit(leavePage, this.def).default({
17433 opacity: 1
17434 }, {
17435 opacity: .4
17436 }).queue(function (done) {
17437 unblock();
17438 callback();
17439 done();
17440 }));
17441 }
17442
17443 /**
17444 * @param {Object} enterPage
17445 * @param {Object} leavePage
17446 * @param {Function} callback
17447 */
17448 }, {
17449 key: "pop",
17450 value: function pop(enterPage, leavePage, callback) {
17451 var _this3 = this;
17452 this.backgroundMask.remove();
17453 enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
17454 var unblock = _get(_getPrototypeOf(MDLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17455 Animit.runAll(Animit(this.backgroundMask).wait(this.delay + this.duration).queue(function (done) {
17456 _this3.backgroundMask.remove();
17457 done();
17458 }), Animit(enterPage, this.def).default({
17459 opacity: .4
17460 }, {
17461 opacity: 1
17462 }).queue(function (done) {
17463 unblock();
17464 callback();
17465 done();
17466 }), Animit(leavePage, this.def).default({
17467 transform: 'translate3d(0, 0, 0)'
17468 }, {
17469 transform: 'translate3d(0, 100%, 0)'
17470 }));
17471 }
17472 }]);
17473 return MDLiftNavigatorAnimator;
17474 }(NavigatorAnimator);
17475
17476 /**
17477 * Fade-in + Lift screen transition.
17478 */
17479 var MDFadeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
17480 _inherits(MDFadeNavigatorAnimator, _NavigatorAnimator);
17481 var _super = _createSuper(MDFadeNavigatorAnimator);
17482 function MDFadeNavigatorAnimator() {
17483 var _this;
17484 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
17485 _ref$timing = _ref.timing,
17486 timing = _ref$timing === void 0 ? 'cubic-bezier(0.4, 0, 0.2, 1)' : _ref$timing,
17487 _ref$timingPop = _ref.timingPop,
17488 timingPop = _ref$timingPop === void 0 ? 'cubic-bezier(0.4, 0, 1, 1)' : _ref$timingPop,
17489 _ref$delay = _ref.delay,
17490 delay = _ref$delay === void 0 ? 0 : _ref$delay,
17491 _ref$duration = _ref.duration,
17492 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
17493 _classCallCheck(this, MDFadeNavigatorAnimator);
17494 _this = _super.call(this, {
17495 timing: timing,
17496 delay: delay,
17497 duration: duration
17498 });
17499 _this.timingPop = timingPop;
17500 return _this;
17501 }
17502
17503 /**
17504 * @param {Object} enterPage
17505 * @param {Object} leavePage
17506 * @param {Function} callback
17507 */
17508 _createClass(MDFadeNavigatorAnimator, [{
17509 key: "push",
17510 value: function push(enterPage, leavePage, callback) {
17511 var unblock = _get(_getPrototypeOf(MDFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17512 Animit.runAll(Animit(enterPage, this.def).default({
17513 transform: 'translate3D(0, 42px, 0)',
17514 opacity: 0
17515 }, {
17516 transform: 'translate3D(0, 0, 0)',
17517 opacity: 1
17518 }).queue(function (done) {
17519 unblock();
17520 callback();
17521 done();
17522 }));
17523 }
17524
17525 /**
17526 * @param {Object} enterPage
17527 * @param {Object} leavePage
17528 * @param {Function} done
17529 */
17530 }, {
17531 key: "pop",
17532 value: function pop(enterPage, leavePage, callback) {
17533 var unblock = _get(_getPrototypeOf(MDFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
17534 Animit.runAll(Animit(leavePage, this.def).default({
17535 transform: 'translate3D(0, 0, 0)',
17536 opacity: 1
17537 }, {
17538 css: {
17539 transform: 'translate3D(0, 38px, 0)',
17540 opacity: 0
17541 },
17542 timing: this.timingPop
17543 }).queue(function (done) {
17544 unblock();
17545 callback();
17546 done();
17547 }));
17548 }
17549 }]);
17550 return MDFadeNavigatorAnimator;
17551 }(NavigatorAnimator);
17552
17553 var NoneNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
17554 _inherits(NoneNavigatorAnimator, _NavigatorAnimator);
17555 var _super = _createSuper(NoneNavigatorAnimator);
17556 function NoneNavigatorAnimator(options) {
17557 _classCallCheck(this, NoneNavigatorAnimator);
17558 return _super.call(this, options);
17559 }
17560 _createClass(NoneNavigatorAnimator, [{
17561 key: "push",
17562 value: function push(enterPage, leavePage, callback) {
17563 callback();
17564 }
17565 }, {
17566 key: "pop",
17567 value: function pop(enterPage, leavePage, callback) {
17568 callback();
17569 }
17570 }]);
17571 return NoneNavigatorAnimator;
17572 }(NavigatorAnimator);
17573
17574 var _animatorDict$3 = {
17575 'default': function _default() {
17576 return platform.isAndroid() ? MDFadeNavigatorAnimator : IOSSlideNavigatorAnimator;
17577 },
17578 'slide': function slide() {
17579 return platform.isAndroid() ? MDSlideNavigatorAnimator : IOSSlideNavigatorAnimator;
17580 },
17581 'lift': function lift() {
17582 return platform.isAndroid() ? MDLiftNavigatorAnimator : IOSLiftNavigatorAnimator;
17583 },
17584 'fade': function fade() {
17585 return platform.isAndroid() ? MDFadeNavigatorAnimator : IOSFadeNavigatorAnimator;
17586 },
17587 'slide-ios': IOSSlideNavigatorAnimator,
17588 'slide-md': MDSlideNavigatorAnimator,
17589 'lift-ios': IOSLiftNavigatorAnimator,
17590 'lift-md': MDLiftNavigatorAnimator,
17591 'fade-ios': IOSFadeNavigatorAnimator,
17592 'fade-md': MDFadeNavigatorAnimator,
17593 'none': NoneNavigatorAnimator
17594 };
17595 var rewritables$3 = {
17596 /**
17597 * @param {Element} navigatorSideElement
17598 * @param {Function} callback
17599 */
17600 ready: function ready(navigatorElement, callback) {
17601 callback();
17602 }
17603 };
17604 var verifyPageElement = function verifyPageElement(el) {
17605 return el.nodeName !== 'ONS-PAGE' && util$4.throw('Only page elements can be children of navigator');
17606 };
17607
17608 /**
17609 * @element ons-navigator
17610 * @category navigation
17611 * @description
17612 * [en]
17613 * A component that provides page stack management and navigation. Stack navigation is the most common navigation pattern for mobile apps.
17614 *
17615 * 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.
17616 * [/en]
17617 * [ja][/ja]
17618 * @codepen yrhtv
17619 * @tutorial vanilla/Reference/navigator
17620 * @guide lifecycle.html#events
17621 * [en]Overview of page events[/en]
17622 * [ja]Overview of page events[/ja]
17623 * @seealso ons-toolbar
17624 * [en]The `<ons-toolbar>` component is used to display a toolbar on the top of a page.[/en]
17625 * [ja][/ja]
17626 * @seealso ons-back-button
17627 * [en]The `<ons-back-button>` component lets the user return to the previous page.[/en]
17628 * [ja][/ja]
17629 * @example
17630 * <ons-navigator id="navigator">
17631 * <ons-page>
17632 * <ons-toolbar>
17633 * <div class="center">
17634 * Title
17635 * </div>
17636 * </ons-toolbar>
17637 * <p>
17638 * <ons-button
17639 * onclick="document.getElementById('navigator').pushPage('page.html')">
17640 * Push page
17641 * </ons-button>
17642 * </p>
17643 * </ons-page>
17644 * </ons-navigator>
17645 *
17646 * <template id="page.html">
17647 * <ons-page>
17648 * <ons-toolbar>
17649 * <div class="left">
17650 * <ons-back-button>Back</ons-back-button>
17651 * </div>
17652 * <div class="center">
17653 * Another page
17654 * </div>
17655 * </ons-toolbar>
17656 * </ons-page>
17657 * </template>
17658 */
17659 var NavigatorElement = /*#__PURE__*/function (_BaseElement) {
17660 _inherits(NavigatorElement, _BaseElement);
17661 var _super = _createSuper(NavigatorElement);
17662 function NavigatorElement() {
17663 var _this;
17664 _classCallCheck(this, NavigatorElement);
17665 _this = _super.call(this);
17666 _this._isRunning = false;
17667 _this._initialized = false;
17668 _this._pageLoader = defaultPageLoader;
17669 _this._pageMap = new WeakMap();
17670 _this._updateAnimatorFactory();
17671 return _this;
17672 }
17673
17674 /**
17675 * @property pageLoader
17676 * @type {PageLoader}
17677 * @description
17678 * [en]PageLoader instance. It can be overriden to change the way pages are loaded by this element. Useful for lib developers.[/en]
17679 * [ja]PageLoaderインスタンスを格納しています。[/ja]
17680 */
17681 _createClass(NavigatorElement, [{
17682 key: "animatorFactory",
17683 get:
17684 /**
17685 * @attribute page
17686 * @initonly
17687 * @type {String}
17688 * @description
17689 * [en]First page to show when navigator is initialized.[/en]
17690 * [ja]ナビゲーターが初期化された時に表示するページを指定します。[/ja]
17691 */
17692
17693 /**
17694 * @attribute swipeable
17695 * @type {Boolean}
17696 * @description
17697 * [en]Enable iOS "swipe to pop" feature.[/en]
17698 * [ja][/ja]
17699 */
17700
17701 /**
17702 * @attribute swipe-target-width
17703 * @type {String}
17704 * @default 20px
17705 * @description
17706 * [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]
17707 * [ja]スワイプの判定領域をピクセル単位で指定します。画面の端から指定した距離に達するとページが表示されます。[/ja]
17708 */
17709
17710 /**
17711 * @attribute swipe-threshold
17712 * @type {Number}
17713 * @default 0.2
17714 * @description
17715 * [en]Specify how much the page needs to be swiped before popping. A value between `0` and `1`.[/en]
17716 * [ja][/ja]
17717 */
17718
17719 /**
17720 * @attribute animation
17721 * @type {String}
17722 * @default default
17723 * @description
17724 * [en]
17725 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
17726 *
17727 * 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.
17728 * [/en]
17729 * [ja][/ja]
17730 */
17731
17732 /**
17733 * @attribute animation-options
17734 * @type {Expression}
17735 * @description
17736 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/en]
17737 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
17738 */
17739
17740 /**
17741 * @property animationOptions
17742 * @type {Object}
17743 * @description
17744 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/en]
17745 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
17746 */
17747
17748 /**
17749 * @event prepush
17750 * @description
17751 * [en]Fired just before a page is pushed.[/en]
17752 * [ja]pageがpushされる直前に発火されます。[/ja]
17753 * @param {Object} event [en]Event object.[/en]
17754 * @param {Object} event.navigator
17755 * [en]Component object.[/en]
17756 * [ja]コンポーネントのオブジェクト。[/ja]
17757 * @param {Object} event.currentPage
17758 * [en]Current page object.[/en]
17759 * [ja]現在のpageオブジェクト。[/ja]
17760 * @param {Function} event.cancel
17761 * [en]Call this function to cancel the push.[/en]
17762 * [ja]この関数を呼び出すと、push処理がキャンセルされます。[/ja]
17763 */
17764
17765 /**
17766 * @event prepop
17767 * @description
17768 * [en]Fired just before a page is popped.[/en]
17769 * [ja]pageがpopされる直前に発火されます。[/ja]
17770 * @param {Object} event [en]Event object.[/en]
17771 * @param {Object} event.navigator
17772 * [en]Component object.[/en]
17773 * [ja]コンポーネントのオブジェクト。[/ja]
17774 * @param {Object} event.currentPage
17775 * [en]Current page object.[/en]
17776 * [ja]現在のpageオブジェクト。[/ja]
17777 * @param {Function} event.cancel
17778 * [en]Call this function to cancel the pop.[/en]
17779 * [ja]この関数を呼び出すと、pageのpopがキャンセルされます。[/ja]
17780 */
17781
17782 /**
17783 * @event postpush
17784 * @description
17785 * [en]Fired just after a page is pushed.[/en]
17786 * [ja]pageがpushされてアニメーションが終了してから発火されます。[/ja]
17787 * @param {Object} event [en]Event object.[/en]
17788 * @param {Object} event.navigator
17789 * [en]Component object.[/en]
17790 * [ja]コンポーネントのオブジェクト。[/ja]
17791 * @param {Object} event.enterPage
17792 * [en]Object of the next page.[/en]
17793 * [ja]pushされたpageオブジェクト。[/ja]
17794 * @param {Object} event.leavePage
17795 * [en]Object of the previous page.[/en]
17796 * [ja]以前のpageオブジェクト。[/ja]
17797 */
17798
17799 /**
17800 * @event postpop
17801 * @description
17802 * [en]Fired just after a page is popped.[/en]
17803 * [ja]pageがpopされてアニメーションが終わった後に発火されます。[/ja]
17804 * @param {Object} event [en]Event object.[/en]
17805 * @param {Object} event.navigator
17806 * [en]Component object.[/en]
17807 * [ja]コンポーネントのオブジェクト。[/ja]
17808 * @param {Object} event.enterPage
17809 * [en]Object of the next page.[/en]
17810 * [ja]popされて表示されるページのオブジェクト。[/ja]
17811 * @param {Object} event.leavePage
17812 * [en]Object of the previous page.[/en]
17813 * [ja]popされて消えるページのオブジェクト。[/ja]
17814 * @param {Object} event.swipeToPop
17815 * [en]True if the pop was triggered by the user swiping to pop.[/en]
17816 * [ja][/ja]
17817 * @param {Object} event.onsBackButton
17818 * [en]True if the pop was caused by pressing an ons-back-button.[/en]
17819 * [ja][/ja]
17820 */
17821
17822 /**
17823 * @event swipe
17824 * @description
17825 * [en]Fired whenever the user slides the navigator (swipe-to-pop).[/en]
17826 * [ja][/ja]
17827 * @param {Object} event [en]Event object.[/en]
17828 * @param {Object} event.ratio
17829 * [en]Decimal ratio (0-1).[/en]
17830 * [ja][/ja]
17831 * @param {Object} event.animationOptions
17832 * [en][/en]
17833 * [ja][/ja]
17834 */
17835
17836 function get() {
17837 return this._animatorFactory;
17838 }
17839 }, {
17840 key: "pageLoader",
17841 get: function get() {
17842 return this._pageLoader;
17843 },
17844 set: function set(pageLoader) {
17845 if (!(pageLoader instanceof PageLoader)) {
17846 util$4.throwPageLoader();
17847 }
17848 this._pageLoader = pageLoader;
17849 }
17850 }, {
17851 key: "_getPageTarget",
17852 value: function _getPageTarget() {
17853 return this._page || this.getAttribute('page');
17854 }
17855
17856 /**
17857 * @property page
17858 * @type {*}
17859 * @description
17860 * [en]Specify the page to be loaded during initialization. This value takes precedence over the `page` attribute. Useful for lib developers.[/en]
17861 * [ja]初期化時に読み込むページを指定します。`page`属性で指定した値よりも`page`プロパティに指定した値を優先します。[/ja]
17862 */
17863 }, {
17864 key: "page",
17865 get: function get() {
17866 return this._page;
17867 },
17868 set: function set(page) {
17869 this._page = page;
17870 }
17871 }, {
17872 key: "connectedCallback",
17873 value: function connectedCallback() {
17874 var _this2 = this;
17875 this.onDeviceBackButton = this._onDeviceBackButton.bind(this);
17876 if (!platform.isAndroid() || this.getAttribute('swipeable') === 'force') {
17877 var swipeAnimator;
17878 this._swipe = new SwipeReveal({
17879 element: this,
17880 getThreshold: function getThreshold() {
17881 return Math.max(0.2, parseFloat(_this2.getAttribute('swipe-threshold')) || 0);
17882 },
17883 swipeMax: function swipeMax() {
17884 var ratio = 1;
17885 var animationOptions = {
17886 duration: swipeAnimator.durationSwipe,
17887 timing: swipeAnimator.timingSwipe
17888 };
17889 _this2._onSwipe && _this2._onSwipe(ratio, animationOptions);
17890 util$4.triggerElementEvent(_this2, 'swipe', {
17891 ratio: ratio,
17892 animationOptions: animationOptions
17893 });
17894 _this2[_this2.swipeMax ? 'swipeMax' : 'popPage']({
17895 animator: swipeAnimator,
17896 swipeToPop: true
17897 });
17898 swipeAnimator = null;
17899 },
17900 swipeMid: function swipeMid(distance, width) {
17901 var ratio = distance / width;
17902 _this2._onSwipe && _this2._onSwipe(ratio);
17903 util$4.triggerElementEvent(_this2, 'swipe', {
17904 ratio: ratio
17905 });
17906 swipeAnimator.translate(distance, width, _this2.topPage.previousElementSibling, _this2.topPage);
17907 },
17908 swipeMin: function swipeMin() {
17909 var ratio = 0;
17910 var animationOptions = {
17911 duration: swipeAnimator.durationRestore,
17912 timing: swipeAnimator.timingSwipe
17913 };
17914 _this2._onSwipe && _this2._onSwipe(ratio, animationOptions);
17915 util$4.triggerElementEvent(_this2, 'swipe', {
17916 ratio: ratio,
17917 animationOptions: animationOptions
17918 });
17919 swipeAnimator.restore(_this2.topPage.previousElementSibling, _this2.topPage);
17920 swipeAnimator = null;
17921 },
17922 ignoreSwipe: function ignoreSwipe(event, distance) {
17923 // Basic conditions
17924 if (!_this2._isRunning && _this2.children.length > 1) {
17925 // Area or directional issues
17926 var area = parseInt(_this2.getAttribute('swipe-target-width') || 25, 10);
17927 if (event.gesture.direction === 'right' && area > distance) {
17928 // Swipes on ons-back-button and its children
17929 var isBB = function isBB(el) {
17930 return /ons-back-button/i.test(el.tagName);
17931 };
17932 if (!isBB(event.target) && !util$4.findParent(event.target, isBB, function (p) {
17933 return /ons-page/i.test(p.tagName);
17934 })) {
17935 // Animator is swipeable
17936 var animation = (_this2.topPage.pushedOptions || {}).animation || _this2.animatorFactory._animation;
17937 var Animator = _animatorDict$3[animation] instanceof Function ? _animatorDict$3[animation].call() : _animatorDict$3[animation];
17938 if (typeof Animator !== 'undefined' && Animator.swipeable) {
17939 swipeAnimator = new Animator(); // Prepare for the swipe
17940 return false;
17941 }
17942 }
17943 }
17944 }
17945 return true; // Ignore swipe
17946 }
17947 });
17948
17949 this.attributeChangedCallback('swipeable');
17950 }
17951 if (this._initialized) {
17952 return;
17953 }
17954 this._initialized = true;
17955 var deferred = util$4.defer();
17956 this.loaded = deferred.promise;
17957 rewritables$3.ready(this, function () {
17958 var show = !util$4.hasAnyComponentAsParent(_this2);
17959 var options = {
17960 animation: 'none',
17961 show: show
17962 };
17963 if (_this2.pages.length === 0 && _this2._getPageTarget()) {
17964 _this2.pushPage(_this2._getPageTarget(), options).then(function () {
17965 return deferred.resolve();
17966 });
17967 } else if (_this2.pages.length > 0) {
17968 for (var i = 0; i < _this2.pages.length; i++) {
17969 verifyPageElement(_this2.pages[i]);
17970 }
17971 if (_this2.topPage) {
17972 contentReady(_this2.topPage, function () {
17973 return setTimeout(function () {
17974 deferred.resolve();
17975 show && _this2.topPage._show();
17976 _this2._updateLastPageBackButton();
17977 }, 0);
17978 });
17979 }
17980 } else {
17981 contentReady(_this2, function () {
17982 if (_this2.pages.length === 0 && _this2._getPageTarget()) {
17983 _this2.pushPage(_this2._getPageTarget(), options).then(function () {
17984 return deferred.resolve();
17985 });
17986 } else {
17987 deferred.resolve();
17988 }
17989 });
17990 }
17991 });
17992 }
17993 }, {
17994 key: "_updateAnimatorFactory",
17995 value: function _updateAnimatorFactory() {
17996 this._animatorFactory = new AnimatorFactory({
17997 animators: _animatorDict$3,
17998 baseClass: NavigatorAnimator,
17999 baseClassName: 'NavigatorAnimator',
18000 defaultAnimation: this.getAttribute('animation')
18001 });
18002 }
18003 }, {
18004 key: "disconnectedCallback",
18005 value: function disconnectedCallback() {
18006 this._backButtonHandler.destroy();
18007 this._backButtonHandler = null;
18008 this._swipe && this._swipe.dispose();
18009 this._swipe = null;
18010 }
18011 }, {
18012 key: "attributeChangedCallback",
18013 value: function attributeChangedCallback(name, last, current) {
18014 switch (name) {
18015 case 'animation':
18016 this._updateAnimatorFactory();
18017 break;
18018 case 'swipeable':
18019 this._swipe && this._swipe.update();
18020 break;
18021 }
18022 }
18023
18024 /**
18025 * @method popPage
18026 * @signature popPage([options])
18027 * @param {Object} [options]
18028 * [en]Parameter object.[/en]
18029 * [ja]オプションを指定するオブジェクト。[/ja]
18030 * @param {String} [options.animation]
18031 * [en]
18032 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
18033 *
18034 * 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"`.
18035 * [/en]
18036 * [ja][/ja]
18037 * @param {String} [options.animationOptions]
18038 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
18039 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
18040 * @param {Function} [options.callback]
18041 * [en]Function that is called when the transition has ended.[/en]
18042 * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
18043 * @param {Object} [options.data]
18044 * [en]Custom data that will be stored in the new page element.[/en]
18045 * [ja][/ja]
18046 * @param {Number} [options.times]
18047 * [en]Number of pages to be popped. Only one animation will be shown.[/en]
18048 * [ja][/ja]
18049 * @return {Promise}
18050 * [en]Promise which resolves to the revealed page.[/en]
18051 * [ja]明らかにしたページを解決するPromiseを返します。[/ja]
18052 * @description
18053 * [en]Pops the current page from the page stack. The previous page will be displayed.[/en]
18054 * [ja]現在表示中のページをページスタックから取り除きます。一つ前のページに戻ります。[/ja]
18055 */
18056 }, {
18057 key: "popPage",
18058 value: function popPage() {
18059 var _this3 = this;
18060 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18061 var _this$_preparePageAnd = this._preparePageAndOptions(null, options);
18062 options = _this$_preparePageAnd.options;
18063 if (util$4.isInteger(options.times) && options.times > 1) {
18064 this._removePages(options.times);
18065 }
18066 var popUpdate = function popUpdate() {
18067 return new Promise(function (resolve) {
18068 _this3._pageLoader.unload(_this3.pages[_this3.pages.length - 1]);
18069 resolve();
18070 });
18071 };
18072 return this._popPage(options, popUpdate);
18073 }
18074 }, {
18075 key: "_popPage",
18076 value: function _popPage(options) {
18077 var _this4 = this;
18078 var update = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
18079 return Promise.resolve();
18080 };
18081 if (this._isRunning) {
18082 return Promise.reject('popPage is already running.');
18083 }
18084 if (this.pages.length <= 1) {
18085 return Promise.reject('ons-navigator\'s page stack is empty.');
18086 }
18087 if (this._emitPrePopEvent()) {
18088 return Promise.reject('Canceled in prepop event.');
18089 }
18090 var length = this.pages.length;
18091 this._isRunning = true;
18092 this.pages[length - 2].updateBackButton(length - 2 > 0);
18093 return new Promise(function (resolve) {
18094 var leavePage = _this4.pages[length - 1];
18095 var enterPage = _this4.pages[length - 2];
18096 options = util$4.extend({}, _this4.options || {}, options);
18097 if (options.data) {
18098 enterPage.data = util$4.extend({}, enterPage.data || {}, options.data || {});
18099 }
18100 var done = function done() {
18101 update().then(function () {
18102 _this4._isRunning = false;
18103 enterPage._show();
18104 util$4.triggerElementEvent(_this4, 'postpop', {
18105 leavePage: leavePage,
18106 enterPage: enterPage,
18107 navigator: _this4,
18108 swipeToPop: !!options.swipeToPop,
18109 // whether the pop was triggered by the user swiping
18110 onsBackButton: !!options.onsBackButton // whether the pop was triggered by clicking ons-back-button
18111 });
18112
18113 options.callback && options.callback(enterPage);
18114 resolve(enterPage);
18115 });
18116 };
18117 leavePage._hide();
18118 enterPage.style.display = '';
18119 var animator = options.animator || _this4._animatorFactory.newAnimator(options);
18120 animator.pop(_this4.pages[length - 2], _this4.pages[length - 1], done);
18121 }).catch(function () {
18122 return _this4._isRunning = false;
18123 });
18124 }
18125
18126 /**
18127 * @method pushPage
18128 * @signature pushPage(page, [options])
18129 * @param {String} page
18130 * [en]Page URL. Can be either a HTML document or a template defined with the `<template>` tag.[/en]
18131 * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
18132 * @param {Object} [options]
18133 * [en]Parameter object.[/en]
18134 * [ja]オプションを指定するオブジェクト。[/ja]
18135 * @param {String} [options.page]
18136 * [en]Page URL. Only necessary if `page` parameter is null or undefined.[/en]
18137 * [ja][/ja]
18138 * @param {String} [options.pageHTML]
18139 * [en]HTML code that will be computed as a new page. Overwrites `page` parameter.[/en]
18140 * [ja][/ja]
18141 * @param {String} [options.animation]
18142 * [en]
18143 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
18144 *
18145 * 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"`.
18146 * [/en]
18147 * [ja][/ja]
18148 * @param {String} [options.animationOptions]
18149 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/en]
18150 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
18151 * @param {Function} [options.callback]
18152 * [en]Function that is called when the transition has ended.[/en]
18153 * [ja]pushPage()による画面遷移が終了した時に呼び出される関数オブジェクトを指定します。[/ja]
18154 * @param {Object} [options.data]
18155 * [en]Custom data that will be stored in the new page element.[/en]
18156 * [ja][/ja]
18157 * @return {Promise}
18158 * [en]Promise which resolves to the pushed page.[/en]
18159 * [ja]追加したページを解決するPromiseを返します。[/ja]
18160 * @description
18161 * [en]Pushes the specified page into the stack.[/en]
18162 * [ja]指定したpageを新しいページスタックに追加します。新しいページが表示されます。[/ja]
18163 */
18164 }, {
18165 key: "pushPage",
18166 value: function pushPage(page) {
18167 var _this5 = this;
18168 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18169 var _this$_preparePageAnd2 = this._preparePageAndOptions(page, options);
18170 page = _this$_preparePageAnd2.page;
18171 options = _this$_preparePageAnd2.options;
18172 var prepare = function prepare(pageElement) {
18173 verifyPageElement(pageElement);
18174 _this5._pageMap.set(pageElement, page);
18175 pageElement = util$4.extend(pageElement, {
18176 data: options.data
18177 });
18178 pageElement.style.visibility = 'hidden';
18179 };
18180 if (options.pageHTML) {
18181 return this._pushPage(options, function () {
18182 return new Promise(function (resolve) {
18183 instantPageLoader.load({
18184 page: options.pageHTML,
18185 parent: _this5,
18186 params: options.data
18187 }, function (pageElement) {
18188 prepare(pageElement);
18189 resolve();
18190 });
18191 });
18192 });
18193 }
18194 return this._pushPage(options, function () {
18195 return new Promise(function (resolve, reject) {
18196 _this5._pageLoader.load({
18197 page: page,
18198 parent: _this5,
18199 params: options.data
18200 }, function (pageElement) {
18201 prepare(pageElement);
18202 resolve();
18203 }, function (error) {
18204 _this5._isRunning = false;
18205 reject(error);
18206 });
18207 });
18208 });
18209 }
18210 }, {
18211 key: "_pushPage",
18212 value: function _pushPage() {
18213 var _this6 = this;
18214 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18215 var update = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
18216 return Promise.resolve();
18217 };
18218 if (this._isRunning) {
18219 return Promise.reject('pushPage is already running.');
18220 }
18221 if (this._emitPrePushEvent()) {
18222 return Promise.reject('Canceled in prepush event.');
18223 }
18224 this._isRunning = true;
18225 var animationOptions = this.animationOptions;
18226 options = util$4.extend({}, this.options || {}, {
18227 animationOptions: animationOptions
18228 }, options);
18229 var animator = this._animatorFactory.newAnimator(options);
18230 return update().then(function () {
18231 var pageLength = _this6.pages.length;
18232 var enterPage = _this6.pages[pageLength - 1];
18233 var leavePage = options.leavePage || _this6.pages[pageLength - 2];
18234 verifyPageElement(enterPage);
18235 enterPage.updateBackButton(pageLength > (options._replacePage ? 2 : 1));
18236 enterPage.pushedOptions = util$4.extend({}, enterPage.pushedOptions || {}, options || {});
18237 enterPage.data = util$4.extend({}, enterPage.data || {}, options.data || {});
18238 enterPage.unload = enterPage.unload || options.unload;
18239 return new Promise(function (resolve) {
18240 var done = function done() {
18241 _this6._isRunning = false;
18242 options.show !== false && setImmediate(function () {
18243 return enterPage._show();
18244 });
18245 util$4.triggerElementEvent(_this6, 'postpush', {
18246 leavePage: leavePage,
18247 enterPage: enterPage,
18248 navigator: _this6
18249 });
18250 if (leavePage) {
18251 leavePage.style.display = 'none';
18252 }
18253 options.callback && options.callback(enterPage);
18254 resolve(enterPage);
18255 };
18256 enterPage.style.visibility = '';
18257 if (leavePage) {
18258 leavePage._hide();
18259 animator.push(enterPage, leavePage, done);
18260 } else {
18261 done();
18262 }
18263 });
18264 }).catch(function (error) {
18265 _this6._isRunning = false;
18266 throw error;
18267 });
18268 }
18269
18270 /**
18271 * @method replacePage
18272 * @signature replacePage(page, [options])
18273 * @return {Promise}
18274 * [en]Promise which resolves to the new page.[/en]
18275 * [ja]新しいページを解決するPromiseを返します。[/ja]
18276 * @description
18277 * [en]Replaces the current top page with the specified one. Extends `pushPage()` parameters.[/en]
18278 * [ja]現在表示中のページをを指定したページに置き換えます。[/ja]
18279 */
18280 }, {
18281 key: "replacePage",
18282 value: function replacePage(page) {
18283 var _this7 = this;
18284 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18285 return this.pushPage(page, options).then(function (resolvedValue) {
18286 if (_this7.pages.length > 1) {
18287 _this7._pageLoader.unload(_this7.pages[_this7.pages.length - 2]);
18288 }
18289 _this7._updateLastPageBackButton();
18290 return Promise.resolve(resolvedValue);
18291 });
18292 }
18293
18294 /**
18295 * @method insertPage
18296 * @signature insertPage(index, page, [options])
18297 * @param {Number} index
18298 * [en]The index where it should be inserted.[/en]
18299 * [ja]スタックに挿入する位置のインデックスを指定します。[/ja]
18300 * @return {Promise}
18301 * [en]Promise which resolves to the inserted page.[/en]
18302 * [ja]指定したページを解決するPromiseを返します。[/ja]
18303 * @description
18304 * [en]Insert the specified page into the stack with at a position defined by the `index` argument. Extends `pushPage()` parameters.[/en]
18305 * [ja]指定したpageをページスタックのindexで指定した位置に追加します。[/ja]
18306 */
18307 }, {
18308 key: "insertPage",
18309 value: function insertPage(index, page) {
18310 var _this8 = this;
18311 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
18312 var _this$_preparePageAnd3 = this._preparePageAndOptions(page, options);
18313 page = _this$_preparePageAnd3.page;
18314 options = _this$_preparePageAnd3.options;
18315 index = this._normalizeIndex(index);
18316 if (index >= this.pages.length) {
18317 return this.pushPage(page, options);
18318 }
18319 page = typeof options.pageHTML === 'string' ? options.pageHTML : page;
18320 var loader = typeof options.pageHTML === 'string' ? instantPageLoader : this._pageLoader;
18321 return new Promise(function (resolve) {
18322 loader.load({
18323 page: page,
18324 parent: _this8
18325 }, function (pageElement) {
18326 verifyPageElement(pageElement);
18327 _this8._pageMap.set(pageElement, page);
18328 pageElement = util$4.extend(pageElement, {
18329 data: options.data,
18330 pushedOptions: options
18331 });
18332 options.animationOptions = util$4.extend({}, _this8.animationOptions, options.animationOptions || {});
18333 pageElement.style.display = 'none';
18334 _this8.insertBefore(pageElement, _this8.pages[index]);
18335 _this8.topPage.updateBackButton(true);
18336 setTimeout(function () {
18337 pageElement = null;
18338 resolve(_this8.pages[index]);
18339 }, 1000 / 60);
18340 });
18341 });
18342 }
18343
18344 /**
18345 * @method removePage
18346 * @signature removePage(index, [options])
18347 * @param {Number} index
18348 * [en]The index where it should be removed.[/en]
18349 * [ja]スタックから削除するページのインデックスを指定します。[/ja]
18350 * @return {Promise}
18351 * [en]Promise which resolves to the revealed page.[/en]
18352 * [ja]削除によって表示されたページを解決するPromiseを返します。[/ja]
18353 * @description
18354 * [en]Remove the specified page at a position in the stack defined by the `index` argument. Extends `popPage()` parameters.[/en]
18355 * [ja]指定したインデックスにあるページを削除します。[/ja]
18356 */
18357 }, {
18358 key: "removePage",
18359 value: function removePage(index) {
18360 var _this9 = this;
18361 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18362 index = this._normalizeIndex(index);
18363 if (index < this.pages.length - 1) {
18364 return new Promise(function (resolve) {
18365 var leavePage = _this9.pages[index];
18366 var enterPage = _this9.topPage;
18367 _this9._pageMap.delete(leavePage);
18368 _this9._pageLoader.unload(leavePage);
18369 if (_this9.pages.length === 1) {
18370 // edge case
18371 _this9.topPage.updateBackButton(false);
18372 }
18373 resolve(enterPage);
18374 });
18375 } else {
18376 return this.popPage(options);
18377 }
18378 }
18379
18380 /**
18381 * @method resetToPage
18382 * @signature resetToPage(page, [options])
18383 * @return {Promise}
18384 * [en]Promise which resolves to the new top page.[/en]
18385 * [ja]新しいトップページを解決するPromiseを返します。[/ja]
18386 * @param {Boolean} [options.pop]
18387 * [en]Performs 'pop' effect if `true` instead of 'push' or none. This also sets `options.animation` value to `default` instead of `none`.[/en]
18388 * [ja][/ja]
18389 * @description
18390 * [en]Clears page stack and adds the specified page to the stack. Extends `pushPage()` parameters.[/en]
18391 * [ja]ページスタックをリセットし、指定したページを表示します。[/ja]
18392 */
18393 }, {
18394 key: "resetToPage",
18395 value: function resetToPage(page) {
18396 var _this10 = this;
18397 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18398 var _this$_preparePageAnd4 = this._preparePageAndOptions(page, options);
18399 page = _this$_preparePageAnd4.page;
18400 options = _this$_preparePageAnd4.options;
18401 if (!options.animator && !options.animation && !options.pop) {
18402 options.animation = 'none';
18403 }
18404 if (!options.page && !options.pageHTML && this._getPageTarget()) {
18405 page = options.page = this._getPageTarget();
18406 }
18407 if (options.pop) {
18408 this._removePages();
18409 return this.insertPage(0, page, {
18410 data: options.data
18411 }).then(function () {
18412 return _this10.popPage(options);
18413 });
18414 }
18415
18416 // Tip: callback runs before resolved promise
18417 var callback = options.callback;
18418 options.callback = function (newPage) {
18419 _this10._removePages();
18420 newPage.updateBackButton(false);
18421 callback && callback(newPage);
18422 };
18423 return this.pushPage(page, options);
18424 }
18425
18426 /**
18427 * @method bringPageTop
18428 * @signature bringPageTop(item, [options])
18429 * @param {String|Number} item
18430 * [en]Page URL or index of an existing page in navigator's stack.[/en]
18431 * [ja]ページのURLかもしくはons-navigatorのページスタックのインデックス値を指定します。[/ja]
18432 * @return {Promise}
18433 * [en]Promise which resolves to the new top page.[/en]
18434 * [ja]新しいトップページを解決するPromiseを返します。[/ja]
18435 * @description
18436 * [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]
18437 * [ja]指定したページをページスタックの一番上に移動します。もし指定したページが無かった場合新しくpushされます。[/ja]
18438 */
18439 }, {
18440 key: "bringPageTop",
18441 value: function bringPageTop(item) {
18442 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18443 if (['number', 'string'].indexOf(_typeof(item)) === -1) {
18444 util$4.throw('First argument must be a page name or the index of an existing page. You supplied ' + item);
18445 }
18446 var index = typeof item === 'number' ? this._normalizeIndex(item) : this._lastIndexOfPage(item);
18447 var page = this.pages[index];
18448 if (index < 0) {
18449 return this.pushPage(item, options);
18450 }
18451 var _this$_preparePageAnd5 = this._preparePageAndOptions(page, options);
18452 options = _this$_preparePageAnd5.options;
18453 if (index === this.pages.length - 1) {
18454 return Promise.resolve(page);
18455 }
18456 if (!page) {
18457 util$4.throw('Failed to find item ' + item);
18458 }
18459 if (this._isRunning) {
18460 return Promise.reject('pushPage is already running.');
18461 }
18462 if (this._emitPrePushEvent()) {
18463 return Promise.reject('Canceled in prepush event.');
18464 }
18465 page.style.display = '';
18466 page.style.visibility = 'hidden';
18467 page.parentNode.appendChild(page);
18468 return this._pushPage(options);
18469 }
18470 }, {
18471 key: "_preparePageAndOptions",
18472 value: function _preparePageAndOptions(page) {
18473 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18474 if (_typeof(options) != 'object') {
18475 util$4.throw('options must be an object. You supplied ' + options);
18476 }
18477 if ((page === null || page === undefined) && options.page) {
18478 page = options.page;
18479 }
18480 options = util$4.extend({}, this.options || {}, options, {
18481 page: page
18482 });
18483 return {
18484 page: page,
18485 options: options
18486 };
18487 }
18488 }, {
18489 key: "_removePages",
18490 value: function _removePages(times) {
18491 var pages = this.pages;
18492 var until = times === undefined ? 0 : pages.length - times;
18493 until = until < 0 ? 1 : until;
18494 for (var i = pages.length - 2; i >= until; i--) {
18495 this._pageMap.delete(pages[i]);
18496 this._pageLoader.unload(pages[i]);
18497 }
18498 }
18499 }, {
18500 key: "_updateLastPageBackButton",
18501 value: function _updateLastPageBackButton() {
18502 var index = this.pages.length - 1;
18503 if (index >= 0) {
18504 this.pages[index].updateBackButton(index > 0);
18505 }
18506 }
18507 }, {
18508 key: "_normalizeIndex",
18509 value: function _normalizeIndex(index) {
18510 return index >= 0 ? index : Math.abs(this.pages.length + index) % this.pages.length;
18511 }
18512 }, {
18513 key: "_onDeviceBackButton",
18514 value: function _onDeviceBackButton(event) {
18515 if (this.pages.length > 1) {
18516 this.popPage();
18517 } else {
18518 event.callParentHandler();
18519 }
18520 }
18521 }, {
18522 key: "_lastIndexOfPage",
18523 value: function _lastIndexOfPage(pageName) {
18524 var index;
18525 for (index = this.pages.length - 1; index >= 0; index--) {
18526 if (pageName === this._pageMap.get(this.pages[index])) {
18527 break;
18528 }
18529 }
18530 return index;
18531 }
18532 }, {
18533 key: "_emitPreEvent",
18534 value: function _emitPreEvent(name) {
18535 var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18536 var isCanceled = false;
18537 util$4.triggerElementEvent(this, 'pre' + name, util$4.extend({
18538 navigator: this,
18539 currentPage: this.pages[this.pages.length - 1],
18540 cancel: function cancel() {
18541 return isCanceled = true;
18542 }
18543 }, data));
18544 return isCanceled;
18545 }
18546 }, {
18547 key: "_emitPrePushEvent",
18548 value: function _emitPrePushEvent() {
18549 return this._emitPreEvent('push');
18550 }
18551 }, {
18552 key: "_emitPrePopEvent",
18553 value: function _emitPrePopEvent() {
18554 var l = this.pages.length;
18555 return this._emitPreEvent('pop', {
18556 leavePage: this.pages[l - 1],
18557 enterPage: this.pages[l - 2]
18558 });
18559 }
18560
18561 // TODO: 書き直す
18562 }, {
18563 key: "_createPageElement",
18564 value: function _createPageElement(templateHTML) {
18565 var pageElement = util$4.createElement(internal$1.normalizePageHTML(templateHTML));
18566 verifyPageElement(pageElement);
18567 return pageElement;
18568 }
18569
18570 /**
18571 * @property onDeviceBackButton
18572 * @type {Object}
18573 * @description
18574 * [en]Back-button handler.[/en]
18575 * [ja]バックボタンハンドラ。[/ja]
18576 */
18577 }, {
18578 key: "onDeviceBackButton",
18579 get: function get() {
18580 return this._backButtonHandler;
18581 },
18582 set: function set(callback) {
18583 if (this._backButtonHandler) {
18584 this._backButtonHandler.destroy();
18585 }
18586 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
18587 }
18588
18589 /**
18590 * @property topPage
18591 * @readonly
18592 * @type {HTMLElement}
18593 * @description
18594 * [en]Current top page element. Use this method to access options passed by `pushPage()`-like methods.[/en]
18595 * [ja]現在のページを取得します。pushPage()やresetToPage()メソッドの引数を取得できます。[/ja]
18596 */
18597 }, {
18598 key: "topPage",
18599 get: function get() {
18600 var last = this.lastElementChild;
18601 while (last && last.tagName !== 'ONS-PAGE') {
18602 last = last.previousElementSibling;
18603 }
18604 return last;
18605 }
18606
18607 /**
18608 * @property pages
18609 * @readonly
18610 * @type {Array}
18611 * @description
18612 * [en]Copy of the navigator's page stack.[/en]
18613 * [ja][/ja]
18614 */
18615 }, {
18616 key: "pages",
18617 get: function get() {
18618 return util$4.arrayFrom(this.children).filter(function (element) {
18619 return element.tagName === 'ONS-PAGE';
18620 });
18621 }
18622
18623 /**
18624 * @property onSwipe
18625 * @type {Function}
18626 * @description
18627 * [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]
18628 * [ja][/ja]
18629 */
18630 }, {
18631 key: "onSwipe",
18632 get: function get() {
18633 return this._onSwipe;
18634 },
18635 set: function set(value) {
18636 if (value && !(value instanceof Function)) {
18637 util$4.throw('"onSwipe" must be a function');
18638 }
18639 this._onSwipe = value;
18640 }
18641
18642 /**
18643 * @property options
18644 * @type {Object}
18645 * @description
18646 * [en]Default options object. Attributes have priority over this property.[/en]
18647 * [ja][/ja]
18648 */
18649
18650 /**
18651 * @property options.animation
18652 * @type {String}
18653 * @description
18654 * [en]
18655 * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
18656 * 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"`.
18657 * [/en]
18658 * [ja][/ja]
18659 */
18660
18661 /**
18662 * @property options.animationOptions
18663 * @type {String}
18664 * @description
18665 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
18666 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
18667 */
18668
18669 /**
18670 * @property options.callback
18671 * @type {String}
18672 * @description
18673 * [en]Function that is called when the transition has ended.[/en]
18674 * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
18675 */
18676 }, {
18677 key: "options",
18678 get: function get() {
18679 return this._options;
18680 },
18681 set: function set(object) {
18682 this._options = object;
18683 }
18684 }, {
18685 key: "animationOptions",
18686 get: function get() {
18687 return this.hasAttribute('animation-options') ? AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options')) : {};
18688 },
18689 set: function set(value) {
18690 if (value === undefined || value === null) {
18691 this.removeAttribute('animation-options');
18692 } else {
18693 this.setAttribute('animation-options', JSON.stringify(value));
18694 }
18695 }
18696 }, {
18697 key: "_isRunning",
18698 get: function get() {
18699 return JSON.parse(this.getAttribute('_is-running'));
18700 },
18701 set: function set(value) {
18702 this.setAttribute('_is-running', value ? 'true' : 'false');
18703 }
18704 }, {
18705 key: "_show",
18706 value: function _show() {
18707 var _this11 = this;
18708 this.loaded.then(function () {
18709 return _this11.topPage && _this11.topPage._show();
18710 });
18711 }
18712 }, {
18713 key: "_hide",
18714 value: function _hide() {
18715 this.topPage && this.topPage._hide();
18716 }
18717 }, {
18718 key: "_destroy",
18719 value: function _destroy() {
18720 for (var i = this.pages.length - 1; i >= 0; i--) {
18721 this._pageLoader.unload(this.pages[i]);
18722 }
18723 this.remove();
18724 }
18725
18726 /**
18727 * @param {String} name
18728 * @param {Function} Animator
18729 */
18730 }], [{
18731 key: "observedAttributes",
18732 get: function get() {
18733 return ['animation', 'swipeable'];
18734 }
18735 }, {
18736 key: "registerAnimator",
18737 value: function registerAnimator(name, Animator) {
18738 if (!(Animator.prototype instanceof NavigatorAnimator)) {
18739 util$4.throwAnimator('Navigator');
18740 }
18741 _animatorDict$3[name] = Animator;
18742 }
18743 }, {
18744 key: "animators",
18745 get: function get() {
18746 return _animatorDict$3;
18747 }
18748 }, {
18749 key: "NavigatorAnimator",
18750 get: function get() {
18751 return NavigatorAnimator;
18752 }
18753 }, {
18754 key: "events",
18755 get: function get() {
18756 return ['prepush', 'postpush', 'prepop', 'postpop', 'swipe'];
18757 }
18758 }, {
18759 key: "rewritables",
18760 get: function get() {
18761 return rewritables$3;
18762 }
18763 }]);
18764 return NavigatorElement;
18765 }(BaseElement);
18766 onsElements.Navigator = NavigatorElement;
18767 customElements.define('ons-navigator', NavigatorElement);
18768
18769 var defaultClassName$7 = 'toolbar';
18770 var scheme$d = {
18771 '': 'toolbar--*',
18772 '.toolbar__left': 'toolbar--*__left',
18773 '.toolbar__center': 'toolbar--*__center',
18774 '.toolbar__right': 'toolbar--*__right'
18775 };
18776
18777 /**
18778 * @element ons-toolbar
18779 * @category page
18780 * @modifier material
18781 * [en]Material Design toolbar.[/en]
18782 * [ja][/ja]
18783 * @modifier transparent
18784 * [en]Transparent toolbar.[/en]
18785 * [ja]透明な背景を持つツールバーを表示します。[/ja]
18786 * @modifier cover-content
18787 * [en]Displays the toolbar on top of the page's content. Should be combined with `transparent` modifier.[/en]
18788 * [ja][/ja]
18789 * @modifier noshadow
18790 * [en]Toolbar without shadow.[/en]
18791 * [ja]ツールバーに影を付けずに表示します。[/ja]
18792 * @description
18793 * [en]
18794 * Toolbar component that can be used with navigation.
18795 *
18796 * Left, center and right containers can be specified by class names.
18797 *
18798 * This component will automatically display as a Material Design toolbar when running on Android devices.
18799 * [/en]
18800 * [ja]ナビゲーションで使用するツールバー用コンポーネントです。クラス名により、左、中央、右のコンテナを指定できます。[/ja]
18801 * @codepen aHmGL
18802 * @tutorial vanilla/Reference/toolbar
18803 * @guide compilation.html#toolbar-compilation [en]Adding a toolbar[/en][ja]ツールバーの追加[/ja]
18804 * @seealso ons-bottom-toolbar
18805 * [en]The `<ons-bottom-toolbar>` displays a toolbar on the bottom of the page.[/en]
18806 * [ja]ons-bottom-toolbarコンポーネント[/ja]
18807 * @seealso ons-back-button
18808 * [en]The `<ons-back-button>` component displays a back button inside the toolbar.[/en]
18809 * [ja]ons-back-buttonコンポーネント[/ja]
18810 * @seealso ons-toolbar-button
18811 * [en]The `<ons-toolbar-button>` component displays a toolbar button inside the toolbar.[/en]
18812 * [ja]ons-toolbar-buttonコンポーネント[/ja]
18813 * @example
18814 * <ons-page>
18815 * <ons-toolbar>
18816 * <div class="left">
18817 * <ons-back-button>
18818 * Back
18819 * </ons-back-button>
18820 * </div>
18821 * <div class="center">
18822 * Title
18823 * </div>
18824 * <div class="right">
18825 * <ons-toolbar-button>
18826 * <ons-icon icon="md-menu"></ons-icon>
18827 * </ons-toolbar-button>
18828 * </div>
18829 * </ons-toolbar>
18830 * </ons-page>
18831 */
18832 var ToolbarElement = /*#__PURE__*/function (_BaseElement) {
18833 _inherits(ToolbarElement, _BaseElement);
18834 var _super = _createSuper(ToolbarElement);
18835 /**
18836 * @attribute inline
18837 * @initonly
18838 * @description
18839 * [en]Display the toolbar as an inline element.[/en]
18840 * [ja]ツールバーをインラインに置きます。スクロール領域内にそのまま表示されます。[/ja]
18841 */
18842
18843 /**
18844 * @attribute static
18845 * @description
18846 * [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]
18847 * [ja][/ja]
18848 */
18849
18850 /**
18851 * @property static
18852 * @type {Boolean}
18853 * @description
18854 * [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]
18855 * [ja][/ja]
18856 */
18857
18858 /**
18859 * @attribute modifier
18860 * @description
18861 * [en]The appearance of the toolbar.[/en]
18862 * [ja]ツールバーの表現を指定します。[/ja]
18863 */
18864
18865 /**
18866 * @property visible
18867 * @description
18868 * [en]Whether the toolbar is shown or not.[/en]
18869 * [ja][/ja]
18870 */
18871
18872 function ToolbarElement() {
18873 var _this;
18874 _classCallCheck(this, ToolbarElement);
18875 _this = _super.call(this);
18876 _this._visible = true;
18877 contentReady(_assertThisInitialized(_this), function () {
18878 _this._compile();
18879 });
18880 return _this;
18881 }
18882 _createClass(ToolbarElement, [{
18883 key: "attributeChangedCallback",
18884 value: function attributeChangedCallback(name, last, current) {
18885 switch (name) {
18886 case 'class':
18887 util$4.restoreClass(this, defaultClassName$7, scheme$d);
18888 break;
18889 case 'modifier':
18890 ModifierUtil.onModifierChanged(last, current, this, scheme$d);
18891 break;
18892 }
18893 }
18894
18895 /**
18896 * @method setVisibility
18897 * @signature setVisibility(visible)
18898 * @param {Boolean} visible
18899 * [en]Set to true to show the toolbar, false to hide it[/en]
18900 * [ja][/ja]
18901 * @description
18902 * [en]Shows the toolbar if visible is true, otherwise hides it.[/en]
18903 * [ja][/ja]
18904 */
18905 }, {
18906 key: "setVisibility",
18907 value: function setVisibility(visible) {
18908 var _this2 = this;
18909 contentReady(this, function () {
18910 _this2._visible = visible;
18911 _this2.style.display = visible ? '' : 'none';
18912 if (_this2.parentNode) {
18913 var siblingBackground = util$4.findChild(_this2.parentNode, '.page__background');
18914 if (siblingBackground) {
18915 siblingBackground.style.top = visible ? null : 0;
18916 }
18917 var siblingContent = util$4.findChild(_this2.parentNode, '.page__content');
18918 if (siblingContent) {
18919 siblingContent.style.top = visible ? null : 0;
18920 }
18921 }
18922 });
18923 }
18924
18925 /**
18926 * @method show
18927 * @signature show()
18928 * @description
18929 * [en]Show the toolbar.[/en]
18930 * [ja][/ja]
18931 */
18932 }, {
18933 key: "show",
18934 value: function show() {
18935 this.setVisibility(true);
18936 }
18937
18938 /**
18939 * @method hide
18940 * @signature hide()
18941 * @description
18942 * [en]Hide the toolbar.[/en]
18943 * [ja][/ja]
18944 */
18945 }, {
18946 key: "hide",
18947 value: function hide() {
18948 this.setVisibility(false);
18949 }
18950 }, {
18951 key: "visible",
18952 get: function get() {
18953 return this._visible;
18954 },
18955 set: function set(value) {
18956 this.setVisibility(value);
18957 }
18958
18959 /**
18960 * @return {HTMLElement}
18961 */
18962 }, {
18963 key: "_getToolbarLeftItemsElement",
18964 value: function _getToolbarLeftItemsElement() {
18965 return this.querySelector('.left') || internal$1.nullElement;
18966 }
18967
18968 /**
18969 * @return {HTMLElement}
18970 */
18971 }, {
18972 key: "_getToolbarCenterItemsElement",
18973 value: function _getToolbarCenterItemsElement() {
18974 return this.querySelector('.center') || internal$1.nullElement;
18975 }
18976
18977 /**
18978 * @return {HTMLElement}
18979 */
18980 }, {
18981 key: "_getToolbarRightItemsElement",
18982 value: function _getToolbarRightItemsElement() {
18983 return this.querySelector('.right') || internal$1.nullElement;
18984 }
18985
18986 /**
18987 * @return {HTMLElement}
18988 */
18989 }, {
18990 key: "_getToolbarBackButtonLabelElement",
18991 value: function _getToolbarBackButtonLabelElement() {
18992 return this.querySelector('ons-back-button .back-button__label') || internal$1.nullElement;
18993 }
18994
18995 /**
18996 * @return {HTMLElement}
18997 */
18998 }, {
18999 key: "_getToolbarBackButtonIconElement",
19000 value: function _getToolbarBackButtonIconElement() {
19001 return this.querySelector('ons-back-button .back-button__icon') || internal$1.nullElement;
19002 }
19003 }, {
19004 key: "_compile",
19005 value: function _compile() {
19006 autoStyle.prepare(this);
19007 this.classList.add(defaultClassName$7);
19008 this._ensureToolbarItemElements();
19009 ModifierUtil.initModifier(this, scheme$d);
19010 }
19011 }, {
19012 key: "_ensureToolbarItemElements",
19013 value: function _ensureToolbarItemElements() {
19014 for (var i = this.childNodes.length - 1; i >= 0; i--) {
19015 // case of not element
19016 if (this.childNodes[i].nodeType != 1) {
19017 this.removeChild(this.childNodes[i]);
19018 }
19019 }
19020 var center = this._ensureToolbarElement('center');
19021 center.classList.add('toolbar__title');
19022 if (this.children.length !== 1 || !this.children[0].classList.contains('center')) {
19023 var left = this._ensureToolbarElement('left');
19024 var right = this._ensureToolbarElement('right');
19025 if (this.children[0] !== left || this.children[1] !== center || this.children[2] !== right) {
19026 this.appendChild(left);
19027 this.appendChild(center);
19028 this.appendChild(right);
19029 }
19030 }
19031 }
19032 }, {
19033 key: "_ensureToolbarElement",
19034 value: function _ensureToolbarElement(name) {
19035 if (util$4.findChild(this, '.toolbar__' + name)) {
19036 var _element = util$4.findChild(this, '.toolbar__' + name);
19037 _element.classList.add(name);
19038 return _element;
19039 }
19040 var element = util$4.findChild(this, '.' + name) || util$4.create('.' + name);
19041 element.classList.add('toolbar__' + name);
19042 return element;
19043 }
19044 }], [{
19045 key: "observedAttributes",
19046 get: function get() {
19047 return ['modifier', 'class'];
19048 }
19049 }]);
19050 return ToolbarElement;
19051 }(BaseElement);
19052 util$4.defineBooleanProperties(ToolbarElement, ['static']);
19053 onsElements.Toolbar = ToolbarElement;
19054 customElements.define('ons-toolbar', ToolbarElement);
19055
19056 var defaultClassName$6 = 'page';
19057 var scheme$c = {
19058 '': 'page--*',
19059 '.page__content': 'page--*__content',
19060 '.page__background': 'page--*__background'
19061 };
19062
19063 /**
19064 * @element ons-page
19065 * @category page
19066 * @modifier material
19067 * [en]Material Design style[/en]
19068 * [ja][/ja]
19069 * @description
19070 * [en]
19071 * This component defines the root of each page. If the content is large it will become scrollable.
19072 *
19073 * A navigation bar can be added to the top of the page using the `<ons-toolbar>` element.
19074 * [/en]
19075 * [ja]ページ定義のためのコンポーネントです。このコンポーネントの内容はスクロールが許可されます。[/ja]
19076 * @tutorial vanilla/Reference/page
19077 * @guide lifecycle.html#events
19078 * [en]Overview of page events[/en]
19079 * [ja]Overview of page events[/ja]
19080 * @guide fundamentals.html#managing-pages
19081 * [en]Managing multiple pages[/en]
19082 * [ja]複数のページを管理する[/ja]
19083 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
19084 * @seealso ons-toolbar
19085 * [en]Use the `<ons-toolbar>` element to add a navigation bar to the top of the page.[/en]
19086 * [ja][/ja]
19087 * @example
19088 * <ons-page>
19089 * <ons-toolbar>
19090 * <div class="left">
19091 * <ons-back-button>Back</ons-back-button>
19092 * </div>
19093 * <div class="center">Title</div>
19094 * <div class="right">
19095 * <ons-toolbar-button>
19096 * <ons-icon icon="md-menu"></ons-icon>
19097 * </ons-toolbar-button>
19098 * </div>
19099 * </ons-toolbar>
19100 *
19101 * <p>Page content</p>
19102 * </ons-page>
19103 *
19104 * @example
19105 * <script>
19106 * myApp.handler = function(done) {
19107 * loadMore().then(done);
19108 * }
19109 * </script>
19110 *
19111 * <ons-page on-infinite-scroll="myApp.handler">
19112 * <ons-toolbar>
19113 * <div class="center">List</div>
19114 * </ons-toolbar>
19115 *
19116 * <ons-list>
19117 * <ons-list-item>#1</ons-list-item>
19118 * <ons-list-item>#2</ons-list-item>
19119 * <ons-list-item>#3</ons-list-item>
19120 * ...
19121 * </ons-list>
19122 * </ons-page>
19123 */
19124 var PageElement = /*#__PURE__*/function (_BaseElement) {
19125 _inherits(PageElement, _BaseElement);
19126 var _super = _createSuper(PageElement);
19127 /**
19128 * @event init
19129 * @description
19130 * [en]Fired right after the page is attached.[/en]
19131 * [ja]ページがアタッチされた後に発火します。[/ja]
19132 * @param {Object} event [en]Event object.[/en]
19133 */
19134
19135 /**
19136 * @event show
19137 * @description
19138 * [en]Fired right after the page is shown.[/en]
19139 * [ja]ページが表示された後に発火します。[/ja]
19140 * @param {Object} event [en]Event object.[/en]
19141 */
19142
19143 /**
19144 * @event hide
19145 * @description
19146 * [en]Fired right after the page is hidden.[/en]
19147 * [ja]ページが隠れた後に発火します。[/ja]
19148 * @param {Object} event [en]Event object.[/en]
19149 */
19150
19151 /**
19152 * @event destroy
19153 * @description
19154 * [en]Fired right before the page is destroyed.[/en]
19155 * [ja]ページが破棄される前に発火します。[/ja]
19156 * @param {Object} event [en]Event object.[/en]
19157 */
19158
19159 /**
19160 * @attribute modifier
19161 * @type {String}
19162 * @description
19163 * [en]Specify modifier name to specify custom styles.[/en]
19164 * [ja]スタイル定義をカスタマイズするための名前を指定します。[/ja]
19165 */
19166
19167 /**
19168 * @attribute on-infinite-scroll
19169 * @type {String}
19170 * @description
19171 * [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]
19172 * [ja][/ja]
19173 */
19174
19175 function PageElement() {
19176 var _this;
19177 _classCallCheck(this, PageElement);
19178 _this = _super.call(this);
19179 _this._deriveHooks();
19180 _this._defaultClassName = defaultClassName$6;
19181 _this.classList.add(defaultClassName$6);
19182 _this._initialized = false;
19183 contentReady(_assertThisInitialized(_this), function () {
19184 _this._compile();
19185 _this._isShown = false;
19186 _this._contentElement = _this._getContentElement();
19187 _this._backgroundElement = _this._getBackgroundElement();
19188 });
19189 return _this;
19190 }
19191 _createClass(PageElement, [{
19192 key: "_compile",
19193 value: function _compile() {
19194 var _this2 = this;
19195 autoStyle.prepare(this);
19196 var toolbar = util$4.findChild(this, 'ons-toolbar');
19197 var background = util$4.findChild(this, '.page__background') || util$4.findChild(this, '.background') || document.createElement('div');
19198 background.classList.add('page__background');
19199 this.insertBefore(background, !toolbar && this.firstChild || toolbar && toolbar.nextSibling);
19200 var content = util$4.findChild(this, '.page__content') || util$4.findChild(this, '.content') || document.createElement('div');
19201 content.classList.add('page__content');
19202 if (!content.parentElement) {
19203 util$4.arrayFrom(this.childNodes).forEach(function (node) {
19204 if (node.nodeType !== 1 || _this2._elementShouldBeMoved(node)) {
19205 content.appendChild(node); // Can trigger detached connectedCallbacks
19206 }
19207 });
19208 }
19209
19210 this._tryToFillStatusBar(content); // Must run before child pages try to fill status bar.
19211 this.insertBefore(content, background.nextSibling); // Can trigger attached connectedCallbacks
19212
19213 if ((!toolbar || !util$4.hasModifier(toolbar, 'transparent')) && content.children.length === 1 && util$4.isPageControl(content.children[0])) {
19214 this._defaultClassName += ' page--wrapper';
19215 this.attributeChangedCallback('class');
19216 }
19217 var bottomToolbar = util$4.findChild(this, 'ons-bottom-toolbar');
19218 if (bottomToolbar) {
19219 this._defaultClassName += ' page-with-bottom-toolbar';
19220 this.attributeChangedCallback('class');
19221 }
19222 ModifierUtil.initModifier(this, scheme$c);
19223 }
19224 }, {
19225 key: "_elementShouldBeMoved",
19226 value: function _elementShouldBeMoved(el) {
19227 if (el.classList.contains('page__background')) {
19228 return false;
19229 }
19230 var tagName = el.tagName.toLowerCase();
19231 if (tagName === 'ons-fab') {
19232 return !el.hasAttribute('position');
19233 }
19234 var fixedElements = ['script', 'ons-toolbar', 'ons-bottom-toolbar', 'ons-modal', 'ons-speed-dial', 'ons-dialog', 'ons-alert-dialog', 'ons-popover', 'ons-action-sheet'];
19235 return el.hasAttribute('inline') || fixedElements.indexOf(tagName) === -1;
19236 }
19237 }, {
19238 key: "_tryToFillStatusBar",
19239 value: function _tryToFillStatusBar() {
19240 var _this3 = this;
19241 var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._contentElement;
19242 internal$1.autoStatusBarFill(function () {
19243 util$4.toggleAttribute(_this3, 'status-bar-fill', !util$4.findParent(_this3, function (e) {
19244 return e.hasAttribute('status-bar-fill');
19245 }) // Not already filled
19246 && (_this3._canAnimateToolbar(content) || !util$4.findChild(content, util$4.isPageControl)) // Has toolbar or cannot delegate
19247 );
19248 });
19249 }
19250 }, {
19251 key: "_canAnimateToolbar",
19252 value: function _canAnimateToolbar() {
19253 var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._contentElement;
19254 if (util$4.findChild(this, 'ons-toolbar')) {
19255 return true;
19256 }
19257 return !!util$4.findChild(content, function (el) {
19258 return util$4.match(el, 'ons-toolbar') && !el.hasAttribute('inline');
19259 });
19260 }
19261 }, {
19262 key: "connectedCallback",
19263 value: function connectedCallback() {
19264 var _this4 = this;
19265 if (!util$4.isAttached(this)) {
19266 // Avoid detached calls
19267 return;
19268 }
19269 contentReady(this, function () {
19270 _this4._tryToFillStatusBar(); // Ensure status bar when the element was compiled before connected
19271
19272 if (_this4.hasAttribute('on-infinite-scroll')) {
19273 _this4.attributeChangedCallback('on-infinite-scroll', null, _this4.getAttribute('on-infinite-scroll'));
19274 }
19275 if (!_this4._initialized) {
19276 _this4._initialized = true;
19277 setImmediate(function () {
19278 _this4.onInit && _this4.onInit();
19279 util$4.triggerElementEvent(_this4, 'init');
19280 });
19281 if (!util$4.hasAnyComponentAsParent(_this4)) {
19282 setImmediate(function () {
19283 return _this4._show();
19284 });
19285 }
19286 }
19287 });
19288 }
19289 }, {
19290 key: "updateBackButton",
19291 value: function updateBackButton(show) {
19292 if (this.backButton) {
19293 show ? this.backButton.show() : this.backButton.hide();
19294 }
19295 }
19296 }, {
19297 key: "name",
19298 get: function get() {
19299 return this.getAttribute('name');
19300 },
19301 set: function set(str) {
19302 this.setAttribute('name', str);
19303 }
19304 }, {
19305 key: "backButton",
19306 get: function get() {
19307 return this.querySelector('ons-back-button');
19308 }
19309
19310 /**
19311 * @property onInfiniteScroll
19312 * @description
19313 * [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]
19314 * [ja][/ja]
19315 */
19316 }, {
19317 key: "onInfiniteScroll",
19318 get: function get() {
19319 return this._onInfiniteScroll;
19320 },
19321 set: function set(value) {
19322 var _this5 = this;
19323 if (value && !(value instanceof Function)) {
19324 util$4.throw('"onInfiniteScroll" must be function or null');
19325 }
19326 contentReady(this, function () {
19327 if (!value) {
19328 _this5._contentElement.removeEventListener('scroll', _this5._boundOnScroll);
19329 } else if (!_this5._onInfiniteScroll) {
19330 _this5._infiniteScrollLimit = 0.9;
19331 _this5._boundOnScroll = _this5._onScroll.bind(_this5);
19332 setImmediate(function () {
19333 return _this5._contentElement.addEventListener('scroll', _this5._boundOnScroll);
19334 });
19335 }
19336 _this5._onInfiniteScroll = value;
19337 });
19338 }
19339 }, {
19340 key: "_onScroll",
19341 value: function _onScroll() {
19342 var _this6 = this;
19343 var c = this._contentElement,
19344 overLimit = (c.scrollTop + c.clientHeight) / c.scrollHeight >= this._infiniteScrollLimit;
19345 if (this._onInfiniteScroll && !this._loadingContent && overLimit) {
19346 this._loadingContent = true;
19347 this._onInfiniteScroll(function () {
19348 return _this6._loadingContent = false;
19349 });
19350 }
19351 }
19352
19353 /**
19354 * @property onDeviceBackButton
19355 * @type {Object}
19356 * @description
19357 * [en]Back-button handler.[/en]
19358 * [ja]バックボタンハンドラ。[/ja]
19359 */
19360 }, {
19361 key: "onDeviceBackButton",
19362 get: function get() {
19363 return this._backButtonHandler;
19364 },
19365 set: function set(callback) {
19366 if (this._backButtonHandler) {
19367 this._backButtonHandler.destroy();
19368 }
19369 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
19370 }
19371 }, {
19372 key: "scrollTop",
19373 get: function get() {
19374 return this._contentElement.scrollTop;
19375 },
19376 set: function set(newValue) {
19377 this._contentElement.scrollTop = newValue;
19378 }
19379 }, {
19380 key: "_getContentElement",
19381 value: function _getContentElement() {
19382 var result = util$4.findChild(this, '.page__content');
19383 if (result) {
19384 return result;
19385 }
19386 util$4.throw('Fail to get ".page__content" element');
19387 }
19388 }, {
19389 key: "_getBackgroundElement",
19390 value: function _getBackgroundElement() {
19391 var result = util$4.findChild(this, '.page__background');
19392 if (result) {
19393 return result;
19394 }
19395 util$4.throw('Fail to get ".page__background" element');
19396 }
19397 }, {
19398 key: "_getBottomToolbarElement",
19399 value: function _getBottomToolbarElement() {
19400 return util$4.findChild(this, 'ons-bottom-toolbar') || internal$1.nullElement;
19401 }
19402 }, {
19403 key: "_getToolbarElement",
19404 value: function _getToolbarElement() {
19405 return util$4.findChild(this, 'ons-toolbar') || document.createElement('ons-toolbar');
19406 }
19407 }, {
19408 key: "attributeChangedCallback",
19409 value: function attributeChangedCallback(name, last, current) {
19410 var _this7 = this;
19411 switch (name) {
19412 case 'class':
19413 util$4.restoreClass(this, this._defaultClassName, scheme$c);
19414 break;
19415 case 'modifier':
19416 ModifierUtil.onModifierChanged(last, current, this, scheme$c);
19417 break;
19418 case 'on-infinite-scroll':
19419 if (current === null) {
19420 this.onInfiniteScroll = null;
19421 } else {
19422 this.onInfiniteScroll = function (done) {
19423 var f = util$4.findFromPath(current);
19424 _this7.onInfiniteScroll = f;
19425 f(done);
19426 };
19427 }
19428 break;
19429 }
19430 }
19431 }, {
19432 key: "_show",
19433 value: function _show() {
19434 if (!this._isShown && util$4.isAttached(this)) {
19435 this._isShown = true;
19436 this.setAttribute('shown', '');
19437 this.onShow && this.onShow();
19438 util$4.triggerElementEvent(this, 'show');
19439 util$4.propagateAction(this, '_show');
19440 }
19441 }
19442 }, {
19443 key: "_hide",
19444 value: function _hide() {
19445 if (this._isShown) {
19446 this._isShown = false;
19447 this.removeAttribute('shown');
19448 this.onHide && this.onHide();
19449 util$4.triggerElementEvent(this, 'hide');
19450 util$4.propagateAction(this, '_hide');
19451 }
19452 }
19453 }, {
19454 key: "_destroy",
19455 value: function _destroy() {
19456 this._hide();
19457 this.onDestroy && this.onDestroy();
19458 util$4.triggerElementEvent(this, 'destroy');
19459 if (this.onDeviceBackButton) {
19460 this.onDeviceBackButton.destroy();
19461 }
19462 util$4.propagateAction(this, '_destroy');
19463 this.remove();
19464 }
19465 }, {
19466 key: "_deriveHooks",
19467 value: function _deriveHooks() {
19468 var _this8 = this;
19469 this.constructor.events.forEach(function (event) {
19470 var key = 'on' + event.charAt(0).toUpperCase() + event.slice(1);
19471 Object.defineProperty(_this8, key, {
19472 configurable: true,
19473 enumerable: true,
19474 get: function get() {
19475 return _this8["_".concat(key)];
19476 },
19477 set: function set(value) {
19478 if (!(value instanceof Function)) {
19479 util$4.throw("\"".concat(key, "\" hook must be a function"));
19480 }
19481 _this8["_".concat(key)] = value.bind(_this8);
19482 }
19483 });
19484 });
19485 }
19486 }], [{
19487 key: "observedAttributes",
19488 get: function get() {
19489 return ['modifier', 'on-infinite-scroll', 'class'];
19490 }
19491 }, {
19492 key: "events",
19493 get: function get() {
19494 return ['init', 'show', 'hide', 'destroy'];
19495 }
19496
19497 /**
19498 * @property data
19499 * @type {*}
19500 * @description
19501 * [en]User's custom data passed to `pushPage()`-like methods.[/en]
19502 * [ja][/ja]
19503 */
19504 }]);
19505 return PageElement;
19506 }(BaseElement);
19507 onsElements.Page = PageElement;
19508 customElements.define('ons-page', PageElement);
19509
19510 var PopoverAnimator = /*#__PURE__*/function (_BaseAnimator) {
19511 _inherits(PopoverAnimator, _BaseAnimator);
19512 var _super = _createSuper(PopoverAnimator);
19513 /**
19514 * @param {Object} options
19515 * @param {String} options.timing
19516 * @param {Number} options.duration
19517 * @param {Number} options.delay
19518 */
19519 function PopoverAnimator() {
19520 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
19521 _ref$timing = _ref.timing,
19522 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref$timing,
19523 _ref$delay = _ref.delay,
19524 delay = _ref$delay === void 0 ? 0 : _ref$delay,
19525 _ref$duration = _ref.duration,
19526 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
19527 _classCallCheck(this, PopoverAnimator);
19528 return _super.call(this, {
19529 timing: timing,
19530 delay: delay,
19531 duration: duration
19532 });
19533 }
19534 _createClass(PopoverAnimator, [{
19535 key: "show",
19536 value: function show(popover, callback) {
19537 callback();
19538 }
19539 }, {
19540 key: "hide",
19541 value: function hide(popover, callback) {
19542 callback();
19543 }
19544 }, {
19545 key: "_animate",
19546 value: function _animate(element, _ref2) {
19547 var from = _ref2.from,
19548 to = _ref2.to,
19549 options = _ref2.options,
19550 callback = _ref2.callback,
19551 _ref2$restore = _ref2.restore,
19552 restore = _ref2$restore === void 0 ? false : _ref2$restore,
19553 animation = _ref2.animation;
19554 options = util$4.extend({}, this.options, options);
19555 if (animation) {
19556 from = animation.from;
19557 to = animation.to;
19558 }
19559 animation = Animit(element);
19560 if (restore) {
19561 animation = animation.saveStyle();
19562 }
19563 animation = animation.queue(from).wait(this.delay).queue({
19564 css: to,
19565 duration: this.duration,
19566 timing: this.timing
19567 });
19568 if (restore) {
19569 animation = animation.restoreStyle();
19570 }
19571 if (callback) {
19572 animation = animation.queue(function (done) {
19573 callback();
19574 done();
19575 });
19576 }
19577 return animation;
19578 }
19579 }, {
19580 key: "_animateAll",
19581 value: function _animateAll(element, animations) {
19582 var _this = this;
19583 Object.keys(animations).forEach(function (key) {
19584 return _this._animate(element[key], animations[key]).play();
19585 });
19586 }
19587 }]);
19588 return PopoverAnimator;
19589 }(BaseAnimator);
19590 var fade = {
19591 out: {
19592 from: {
19593 opacity: 1.0
19594 },
19595 to: {
19596 opacity: 0
19597 }
19598 },
19599 in: {
19600 from: {
19601 opacity: 0
19602 },
19603 to: {
19604 opacity: 1.0
19605 }
19606 }
19607 };
19608 var MDFadePopoverAnimator = /*#__PURE__*/function (_PopoverAnimator) {
19609 _inherits(MDFadePopoverAnimator, _PopoverAnimator);
19610 var _super2 = _createSuper(MDFadePopoverAnimator);
19611 function MDFadePopoverAnimator() {
19612 _classCallCheck(this, MDFadePopoverAnimator);
19613 return _super2.apply(this, arguments);
19614 }
19615 _createClass(MDFadePopoverAnimator, [{
19616 key: "show",
19617 value: function show(popover, callback) {
19618 this._animateAll(popover, {
19619 _mask: fade.in,
19620 _popover: {
19621 animation: fade.in,
19622 restore: true,
19623 callback: callback
19624 }
19625 });
19626 }
19627 }, {
19628 key: "hide",
19629 value: function hide(popover, callback) {
19630 this._animateAll(popover, {
19631 _mask: fade.out,
19632 _popover: {
19633 animation: fade.out,
19634 restore: true,
19635 callback: callback
19636 }
19637 });
19638 }
19639 }]);
19640 return MDFadePopoverAnimator;
19641 }(PopoverAnimator);
19642 var IOSFadePopoverAnimator = /*#__PURE__*/function (_MDFadePopoverAnimato) {
19643 _inherits(IOSFadePopoverAnimator, _MDFadePopoverAnimato);
19644 var _super3 = _createSuper(IOSFadePopoverAnimator);
19645 function IOSFadePopoverAnimator() {
19646 _classCallCheck(this, IOSFadePopoverAnimator);
19647 return _super3.apply(this, arguments);
19648 }
19649 _createClass(IOSFadePopoverAnimator, [{
19650 key: "show",
19651 value: function show(popover, callback) {
19652 this._animateAll(popover, {
19653 _mask: fade.in,
19654 _popover: {
19655 from: {
19656 transform: 'scale3d(1.3, 1.3, 1.0)',
19657 opacity: 0
19658 },
19659 to: {
19660 transform: 'scale3d(1.0, 1.0, 1.0)',
19661 opacity: 1.0
19662 },
19663 restore: true,
19664 callback: callback
19665 }
19666 });
19667 }
19668 }]);
19669 return IOSFadePopoverAnimator;
19670 }(MDFadePopoverAnimator);
19671
19672 var scheme$b = {
19673 '.popover': 'popover--*',
19674 '.popover-mask': 'popover-mask--*',
19675 '.popover__content': 'popover--*__content',
19676 '.popover__arrow': 'popover--*__arrow'
19677 };
19678 var _animatorDict$2 = {
19679 'default': function _default() {
19680 return platform.isAndroid() ? MDFadePopoverAnimator : IOSFadePopoverAnimator;
19681 },
19682 'none': PopoverAnimator,
19683 'fade-ios': IOSFadePopoverAnimator,
19684 'fade-md': MDFadePopoverAnimator
19685 };
19686 var positions = {
19687 up: 'bottom',
19688 left: 'right',
19689 down: 'top',
19690 right: 'left'
19691 };
19692 /**
19693 * @element ons-popover
19694 * @category dialog
19695 * @description
19696 * [en]
19697 * 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.
19698 *
19699 * 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.
19700 *
19701 * 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.
19702 * [/en]
19703 * [ja]ある要素を対象とするポップオーバーを表示するコンポーネントです。[/ja]
19704 * @codepen ZYYRKo
19705 * @tutorial vanilla/Reference/popover
19706 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
19707 * @example
19708 * <ons-button onclick="showPopover(this)">
19709 * Click me!
19710 * </ons-button>
19711 *
19712 * <ons-popover direction="down" id="popover">
19713 * <p>This is a popover!</p>
19714 * </ons-popover>
19715 *
19716 * <script>
19717 * var showPopover = function(element) {
19718 * var popover = document.getElementById('popover');
19719 * popover.show(element);
19720 * };
19721 * </script>
19722 */
19723 var PopoverElement = /*#__PURE__*/function (_BaseDialogElement) {
19724 _inherits(PopoverElement, _BaseDialogElement);
19725 var _super = _createSuper(PopoverElement);
19726 /**
19727 * @event preshow
19728 * @description
19729 * [en]Fired just before the popover is displayed.[/en]
19730 * [ja]ポップオーバーが表示される直前に発火します。[/ja]
19731 * @param {Object} event [en]Event object.[/en]
19732 * @param {Object} event.popover
19733 * [en]Component object.[/en]
19734 * [ja]コンポーネントのオブジェクト。[/ja]
19735 * @param {Function} event.cancel
19736 * [en]Call this function to stop the popover from being shown.[/en]
19737 * [ja]この関数を呼び出すと、ポップオーバーの表示がキャンセルされます。[/ja]
19738 */
19739
19740 /**
19741 * @event postshow
19742 * @description
19743 * [en]Fired just after the popover is displayed.[/en]
19744 * [ja]ポップオーバーが表示された直後に発火します。[/ja]
19745 * @param {Object} event [en]Event object.[/en]
19746 * @param {Object} event.popover
19747 * [en]Component object.[/en]
19748 * [ja]コンポーネントのオブジェクト。[/ja]
19749 */
19750
19751 /**
19752 * @event prehide
19753 * @description
19754 * [en]Fired just before the popover is hidden.[/en]
19755 * [ja]ポップオーバーが隠れる直前に発火します。[/ja]
19756 * @param {Object} event [en]Event object.[/en]
19757 * @param {Object} event.popover
19758 * [en]Component object.[/en]
19759 * [ja]コンポーネントのオブジェクト。[/ja]
19760 * @param {Function} event.cancel
19761 * [en]Call this function to stop the popover from being hidden.[/en]
19762 * [ja]この関数を呼び出すと、ポップオーバーが隠れる処理をキャンセルします。[/ja]
19763 */
19764
19765 /**
19766 * @event posthide
19767 * @description
19768 * [en]Fired just after the popover is hidden.[/en]
19769 * [ja]ポップオーバーが隠れた後に発火します。[/ja]
19770 * @param {Object} event [en]Event object.[/en]
19771 * @param {Object} event.popover
19772 * [en]Component object.[/en]
19773 * [ja]コンポーネントのオブジェクト。[/ja]
19774 */
19775
19776 /**
19777 * @event dialogcancel
19778 * @description
19779 * [en]Fired when the popover is canceled.[/en]
19780 * [ja][/ja]
19781 */
19782
19783 /**
19784 * @attribute modifier
19785 * @type {String}
19786 * @description
19787 * [en]The appearance of the popover.[/en]
19788 * [ja]ポップオーバーの表現を指定します。[/ja]
19789 */
19790
19791 /**
19792 * @attribute direction
19793 * @type {String}
19794 * @description
19795 * [en]
19796 * A space separated list of directions. If more than one direction is specified,
19797 * it will be chosen automatically. Valid directions are `"up"`, `"down"`, `"left"` and `"right"`.
19798 * [/en]
19799 * [ja]
19800 * ポップオーバーを表示する方向を空白区切りで複数指定できます。
19801 * 指定できる方向は、"up", "down", "left", "right"の4つです。空白区切りで複数指定することもできます。
19802 * 複数指定された場合、対象とする要素に合わせて指定した値から自動的に選択されます。
19803 * [/ja]
19804 */
19805
19806 /**
19807 * @attribute cancelable
19808 * @description
19809 * [en]If this attribute is set the popover can be closed by tapping the background or by pressing the back button.[/en]
19810 * [ja]この属性があると、ポップオーバーが表示された時に、背景やバックボタンをタップした時にをポップオーバー閉じます。[/ja]
19811 */
19812
19813 /**
19814 * @attribute cover-target
19815 * @description
19816 * [en]If set the popover will cover the target on the screen.[/en]
19817 * [ja][/ja]
19818 */
19819
19820 /**
19821 * @property coverTarget
19822 * @description
19823 * [en]If set the popover will cover the target on the screen.[/en]
19824 * [ja][/ja]
19825 */
19826
19827 /**
19828 * @attribute target
19829 * @type {String}
19830 * @description
19831 * [en]Specifies the ID of the default element for the popover.[/en]
19832 * [ja]ポップオーバーの対象とするデフォルト要素のIDを指定します。[/ja]
19833 */
19834
19835 /**
19836 * @property target
19837 * @type {String}
19838 * @description
19839 * [en]Specifies the ID of the default element for the popover.[/en]
19840 * [ja]ポップオーバーの対象とするデフォルト要素のIDを指定します。[/ja]
19841 */
19842
19843 /**
19844 * @attribute animation
19845 * @type {String}
19846 * @description
19847 * [en]The animation used when showing an hiding the popover. Can be either `"none"`, `"default"`, `"fade-ios"` or `"fade-md"`.[/en]
19848 * [ja]ポップオーバーを表示する際のアニメーション名を指定します。[/ja]
19849 */
19850
19851 /**
19852 * @attribute animation-options
19853 * @type {Expression}
19854 * @description
19855 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
19856 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
19857 */
19858
19859 /**
19860 * @property animationOptions
19861 * @type {Object}
19862 * @description
19863 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
19864 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
19865 */
19866
19867 /**
19868 * @attribute mask-color
19869 * @type {Color}
19870 * @description
19871 * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
19872 * [ja]背景のマスクの色を指定します。デフォルトは"rgba(0, 0, 0, 0.2)"です。[/ja]
19873 */
19874
19875 /**
19876 * @attribute visible
19877 * @type {Boolean}
19878 * @description
19879 * [en]Whether the popover is visible or not.[/en]
19880 * [ja]要素が見える場合に`true`。[/ja]
19881 */
19882
19883 function PopoverElement() {
19884 var _this;
19885 _classCallCheck(this, PopoverElement);
19886 _this = _super.call(this);
19887 _this._boundOnChange = _this._onChange.bind(_assertThisInitialized(_this));
19888 contentReady(_assertThisInitialized(_this), function () {
19889 _this._compile();
19890 _this.style.display = 'none';
19891 });
19892 return _this;
19893 }
19894 _createClass(PopoverElement, [{
19895 key: "_scheme",
19896 get: function get() {
19897 return scheme$b;
19898 }
19899 }, {
19900 key: "_mask",
19901 get: function get() {
19902 return util$4.findChild(this, '.popover-mask');
19903 }
19904 }, {
19905 key: "_popover",
19906 get: function get() {
19907 return util$4.findChild(this, '.popover');
19908 }
19909 }, {
19910 key: "_content",
19911 get: function get() {
19912 return util$4.findChild(this._popover, '.popover__content');
19913 }
19914 }, {
19915 key: "_arrow",
19916 get: function get() {
19917 return util$4.findChild(this._popover, '.popover__arrow');
19918 }
19919 }, {
19920 key: "_updateAnimatorFactory",
19921 value: function _updateAnimatorFactory() {
19922 return new AnimatorFactory({
19923 animators: _animatorDict$2,
19924 baseClass: PopoverAnimator,
19925 baseClassName: 'PopoverAnimator',
19926 defaultAnimation: this.getAttribute('animation') || 'default'
19927 });
19928 }
19929 }, {
19930 key: "_toggleStyle",
19931 value: function _toggleStyle(shouldShow) {
19932 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
19933 if (shouldShow) {
19934 this.style.display = 'block';
19935 var target = options.target;
19936 if (!target && this.target) {
19937 target = document.getElementById(this.target);
19938 }
19939 this._currentTarget = target;
19940 this._positionPopover(target);
19941 } else {
19942 this.style.display = 'none';
19943 this._clearStyles();
19944 }
19945 }
19946 }, {
19947 key: "_positionPopover",
19948 value: function _positionPopover(target) {
19949 var radius = this._radius,
19950 contentElement = this._content,
19951 margin = this._margin;
19952 var safeAreaLengths = iPhoneXPatch.getSafeAreaLengths();
19953 var safeAreaRect = iPhoneXPatch.getSafeAreaDOMRect();
19954 var targetRect = target.getBoundingClientRect();
19955 var isMD = util$4.hasModifier(this, 'material');
19956 var cover = isMD && this.hasAttribute('cover-target');
19957 var parent = util$4.findParent(this, 'ons-page') || document.body;
19958 var parentDimensions = parent.getBoundingClientRect();
19959 var maxPositions = {
19960 top: Math.max(parentDimensions.top, safeAreaRect.top),
19961 left: Math.max(parentDimensions.left, safeAreaRect.left),
19962 bottom: Math.min(parentDimensions.bottom, safeAreaRect.bottom),
19963 right: Math.min(parentDimensions.right, safeAreaRect.right)
19964 };
19965
19966 // Distance from each side of the safe area (with margin) to the target element
19967 var targetDistance = {
19968 top: targetRect.top - (maxPositions.top + margin),
19969 left: targetRect.left - (maxPositions.left + margin),
19970 bottom: maxPositions.bottom - margin - targetRect.bottom,
19971 right: maxPositions.right - margin - targetRect.right
19972 };
19973
19974 // Distance from each side of the safe area (with margin) to the geometric center of the target element
19975 var targetCenterDistanceFrom = {
19976 top: targetRect.top + Math.round(targetRect.height / 2) - (maxPositions.top + margin),
19977 left: targetRect.left + Math.round(targetRect.width / 2) - (maxPositions.left + margin),
19978 bottom: maxPositions.bottom - margin - targetRect.bottom + Math.round(targetRect.height / 2),
19979 right: maxPositions.right - margin - targetRect.right + Math.round(targetRect.width / 2)
19980 };
19981 var _this$_calculateDirec = this._calculateDirections(targetDistance),
19982 vertical = _this$_calculateDirec.vertical,
19983 primaryDirection = _this$_calculateDirec.primary,
19984 secondaryDirection = _this$_calculateDirec.secondary;
19985 this._currentDirection = primaryDirection;
19986 util$4.addModifier(this, primaryDirection);
19987 var sizeName = vertical ? 'width' : 'height';
19988 // Get .popover__content size
19989 var contentSize = function (style) {
19990 return {
19991 width: parseInt(style.getPropertyValue('width'), 10),
19992 height: parseInt(style.getPropertyValue('height'), 10)
19993 };
19994 }(window.getComputedStyle(contentElement));
19995
19996 // Setting .popover position.
19997 var targetAndArrowLength = cover ? 0 : (vertical ? targetRect.height : targetRect.width) + (isMD ? 0 : 14);
19998 var primaryOffset = Math.max(safeAreaLengths[primaryDirection] + margin, safeAreaLengths[primaryDirection] + margin + targetDistance[primaryDirection] + targetAndArrowLength);
19999 var secondaryOffset = Math.max(safeAreaLengths[secondaryDirection] + margin, safeAreaLengths[secondaryDirection] + margin + targetCenterDistanceFrom[secondaryDirection] - contentSize[sizeName] / 2);
20000 this._popover.style[primaryDirection] = primaryOffset + 'px';
20001 this._popover.style[secondaryDirection] = secondaryOffset + 'px';
20002
20003 // Setting .popover__arrow position.
20004 this._arrow.style[secondaryDirection] = Math.max(radius, safeAreaLengths[secondaryDirection] + margin + targetCenterDistanceFrom[secondaryDirection] - secondaryOffset) + 'px';
20005 }
20006 }, {
20007 key: "_calculateDirections",
20008 value: function _calculateDirections(distance) {
20009 var options = (this.getAttribute('direction') || 'up down left right').split(/\s+/).map(function (e) {
20010 return positions[e];
20011 });
20012 var primary = options.sort(function (a, b) {
20013 return distance[a] - distance[b];
20014 })[0];
20015 var vertical = 'top' == primary || 'bottom' == primary;
20016 var secondary;
20017 if (vertical) {
20018 secondary = distance.left < distance.right ? 'left' : 'right';
20019 } else {
20020 secondary = distance.top < distance.bottom ? 'top' : 'bottom';
20021 }
20022 return {
20023 vertical: vertical,
20024 primary: primary,
20025 secondary: secondary
20026 };
20027 }
20028 }, {
20029 key: "_clearStyles",
20030 value: function _clearStyles() {
20031 var _this2 = this;
20032 this._currentDirection = null;
20033 ['top', 'bottom', 'left', 'right'].forEach(function (e) {
20034 _this2._arrow.style[e] = _this2._content.style[e] = _this2._popover.style[e] = '';
20035 util$4.removeModifier(_this2, e);
20036 });
20037 }
20038 }, {
20039 key: "_onChange",
20040 value: function _onChange() {
20041 var _this3 = this;
20042 setImmediate(function () {
20043 if (_this3._currentTarget) {
20044 _this3._positionPopover(_this3._currentTarget);
20045 }
20046 });
20047 }
20048 }, {
20049 key: "_compile",
20050 value: function _compile() {
20051 autoStyle.prepare(this);
20052 if (this._popover && this._mask) {
20053 return;
20054 }
20055 var hasDefaultContainer = this._popover && this._content;
20056 if (hasDefaultContainer) {
20057 if (!this._mask) {
20058 var mask = document.createElement('div');
20059 mask.classList.add('popover-mask');
20060 this.insertBefore(mask, this.firstChild);
20061 }
20062 if (!this._arrow) {
20063 var arrow = document.createElement('div');
20064 arrow.classList.add('popover__arrow');
20065 this._popover.appendChild(arrow);
20066 }
20067 } else {
20068 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 ");
20069 var content = template.querySelector('.popover__content');
20070 while (this.childNodes[0]) {
20071 content.appendChild(this.childNodes[0]);
20072 }
20073 this.appendChild(template);
20074 }
20075
20076 // FIXME!
20077 if (this.hasAttribute('style')) {
20078 this._popover.setAttribute('style', this.getAttribute('style'));
20079 this.removeAttribute('style');
20080 }
20081 ModifierUtil.initModifier(this, this._scheme);
20082 }
20083
20084 /**
20085 * @method show
20086 * @signature show(target, [options])
20087 * @param {String|Event|HTMLElement} target
20088 * [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]
20089 * [ja]ポップオーバーのターゲットとなる要素を指定します。CSSセレクタかeventオブジェクトかDOM要素のいずれかを渡せます。[/ja]
20090 * @param {Object} [options]
20091 * [en]Parameter object.[/en]
20092 * [ja]オプションを指定するオブジェクト。[/ja]
20093 * @param {String} [options.animation]
20094 * [en]Animation name. Use one of `"fade-ios"`, `"fade-md"`, `"none"` and `"default"`.[/en]
20095 * [ja]アニメーション名を指定します。"fade-ios", "fade-md", "none", "default"のいずれかを指定できます。[/ja]
20096 * @param {String} [options.animationOptions]
20097 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
20098 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
20099 * @param {Function} [options.callback]
20100 * [en]This function is called after the popover has been revealed.[/en]
20101 * [ja]ポップオーバーが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
20102 * @description
20103 * [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]
20104 * [ja]対象とする要素にポップオーバーを表示します。target引数には、$eventオブジェクトやDOMエレメントやCSSセレクタを渡すことが出来ます。[/ja]
20105 * @return {Promise}
20106 * [en]Resolves to the displayed element[/en]
20107 * [ja][/ja]
20108 */
20109 }, {
20110 key: "show",
20111 value: function show(target) {
20112 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20113 // Copy options and include options.target
20114 if (target && _typeof(target) === 'object' && !(target instanceof Event) && !(target instanceof HTMLElement)) {
20115 options = _objectSpread2({}, target);
20116 } else {
20117 options = _objectSpread2(_objectSpread2({}, options), {}, {
20118 target: target
20119 });
20120 }
20121 if (typeof options.target === 'string') {
20122 options.target = document.querySelector(options.target);
20123 } else if (options.target instanceof Event) {
20124 options.target = options.target.target;
20125 }
20126 if (!options.target && this.target) {
20127 options.target = document.getElementById(this.target);
20128 }
20129 if (!(options.target instanceof HTMLElement)) {
20130 util$4.throw('Invalid target type or undefined');
20131 }
20132 return _get(_getPrototypeOf(PopoverElement.prototype), "show", this).call(this, options);
20133 }
20134
20135 /**
20136 * @method hide
20137 * @signature hide([options])
20138 * @param {Object} [options]
20139 * [en]Parameter object.[/en]
20140 * [ja]オプションを指定するオブジェクト。[/ja]
20141 * @param {String} [options.animation]
20142 * [en]Animation name. Use one of `"fade-ios"`, `"fade-md"`, `"none"` and `"default"`.[/en]
20143 * [ja]アニメーション名を指定します。"fade-ios", "fade-md", "none", "default"のいずれかを指定できます。[/ja]
20144 * @param {String} [options.animationOptions]
20145 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
20146 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
20147 * @param {Function} [options.callback]
20148 * [en]This functions is called after the popover has been hidden.[/en]
20149 * [ja]ポップオーバーが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
20150 * @description
20151 * [en]Close the popover.[/en]
20152 * [ja]ポップオーバーを閉じます。[/ja]
20153 * @return {Promise}
20154 * [en]Resolves to the hidden element[/en]
20155 * [ja][/ja]
20156 */
20157
20158 /**
20159 * @property visible
20160 * @type {Boolean}
20161 * @description
20162 * [en]Whether the element is visible or not.[/en]
20163 * [ja]要素が見える場合に`true`。[/ja]
20164 */
20165
20166 /**
20167 * @property cancelable
20168 * @type {Boolean}
20169 * @description
20170 * [en]
20171 * A boolean value that specifies whether the popover is cancelable or not.
20172 *
20173 * When the popover is cancelable it can be closed by tapping the background or by pressing the back button on Android devices.
20174 * [/en]
20175 * [ja][/ja]
20176 */
20177
20178 /**
20179 * @property onDeviceBackButton
20180 * @type {Object}
20181 * @description
20182 * [en]Back-button handler.[/en]
20183 * [ja]バックボタンハンドラ。[/ja]
20184 */
20185
20186 /**
20187 * @property maskColor
20188 * @type {String}
20189 * @default rgba(0, 0, 0, 0.2)
20190 * @description
20191 * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
20192 * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
20193 */
20194 }, {
20195 key: "connectedCallback",
20196 value: function connectedCallback() {
20197 var _this4 = this;
20198 _get(_getPrototypeOf(PopoverElement.prototype), "connectedCallback", this).call(this);
20199 window.addEventListener('resize', this._boundOnChange, false);
20200 this._margin = this._margin || parseInt(window.getComputedStyle(this).getPropertyValue('top'));
20201 this._margin = this._margin || 6; // Fix for iframes
20202
20203 contentReady(this, function () {
20204 _this4._radius = parseInt(window.getComputedStyle(_this4._content).getPropertyValue('border-top-left-radius'));
20205 });
20206 }
20207 }, {
20208 key: "disconnectedCallback",
20209 value: function disconnectedCallback() {
20210 _get(_getPrototypeOf(PopoverElement.prototype), "disconnectedCallback", this).call(this);
20211 window.removeEventListener('resize', this._boundOnChange, false);
20212 }
20213 }, {
20214 key: "attributeChangedCallback",
20215 value: function attributeChangedCallback(name, last, current) {
20216 if (name === 'direction') {
20217 return this._boundOnChange();
20218 } else if (name === 'modifier') {
20219 this._currentDirection && util$4.addModifier(this, this._currentDirection);
20220 }
20221 _get(_getPrototypeOf(PopoverElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
20222 }
20223
20224 /**
20225 * @param {String} name
20226 * @param {PopoverAnimator} Animator
20227 */
20228 }], [{
20229 key: "observedAttributes",
20230 get: function get() {
20231 return [].concat(_toConsumableArray(_get(_getPrototypeOf(PopoverElement), "observedAttributes", this)), ['direction']);
20232 }
20233 }, {
20234 key: "registerAnimator",
20235 value: function registerAnimator(name, Animator) {
20236 if (!(Animator.prototype instanceof PopoverAnimator)) {
20237 util$4.throwAnimator('Popover');
20238 }
20239 _animatorDict$2[name] = Animator;
20240 }
20241 }, {
20242 key: "animators",
20243 get: function get() {
20244 return _animatorDict$2;
20245 }
20246 }, {
20247 key: "PopoverAnimator",
20248 get: function get() {
20249 return PopoverAnimator;
20250 }
20251 }]);
20252 return PopoverElement;
20253 }(BaseDialogElement);
20254 util$4.defineBooleanProperties(PopoverElement, ['cover-target']);
20255 util$4.defineStringProperties(PopoverElement, ['target']);
20256 onsElements.Popover = PopoverElement;
20257 customElements.define('ons-popover', PopoverElement);
20258
20259 var scheme$a = {
20260 '.progress-bar': 'progress-bar--*',
20261 '.progress-bar__primary': 'progress-bar--*__primary',
20262 '.progress-bar__secondary': 'progress-bar--*__secondary'
20263 };
20264 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");
20265 var INDET$1 = 'indeterminate';
20266
20267 /**
20268 * @element ons-progress-bar
20269 * @category visual
20270 * @modifier material
20271 * [en]Display a Material Design progress bar.[/en]
20272 * [ja]マテリアルデザインのスタイルでプログレスバーを表示します。[/ja]
20273 * @description
20274 * [en]
20275 * 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.
20276 * [/en]
20277 * [ja][/ja]
20278 * @codepen zvQbGj
20279 * @tutorial vanilla/Reference/progress
20280 * @seealso ons-progress-circular
20281 * [en]The `<ons-progress-circular>` component displays a circular progress indicator.[/en]
20282 * [ja][/ja]
20283 * @example
20284 * <ons-progress-bar
20285 * value="55"
20286 * secondary-value="87">
20287 * </ons-progress-bar>
20288 *
20289 * <ons-progress-bar
20290 * indeterminate>
20291 * </ons-progress-bar>
20292 */
20293 var ProgressBarElement = /*#__PURE__*/function (_BaseElement) {
20294 _inherits(ProgressBarElement, _BaseElement);
20295 var _super = _createSuper(ProgressBarElement);
20296 /**
20297 * @attribute modifier
20298 * @type {String}
20299 * @description
20300 * [en]Change the appearance of the progress indicator.[/en]
20301 * [ja]プログレスインジケータの見た目を変更します。[/ja]
20302 */
20303
20304 /**
20305 * @attribute value
20306 * @type {Number}
20307 * @description
20308 * [en]Current progress. Should be a value between 0 and 100.[/en]
20309 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20310 */
20311
20312 /**
20313 * @attribute secondary-value
20314 * @type {Number}
20315 * @description
20316 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
20317 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20318 */
20319
20320 /**
20321 * @attribute indeterminate
20322 * @description
20323 * [en]If this attribute is set, an infinite looping animation will be shown.[/en]
20324 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
20325 */
20326
20327 function ProgressBarElement() {
20328 var _this;
20329 _classCallCheck(this, ProgressBarElement);
20330 _this = _super.call(this);
20331 contentReady(_assertThisInitialized(_this), function () {
20332 return _this._compile();
20333 });
20334 return _this;
20335 }
20336 _createClass(ProgressBarElement, [{
20337 key: "_compile",
20338 value: function _compile() {
20339 if (!this._isCompiled()) {
20340 this._template = template$1.cloneNode(true);
20341 } else {
20342 this._template = util$4.findChild(this, '.progress-bar');
20343 }
20344 this._primary = util$4.findChild(this._template, '.progress-bar__primary');
20345 this._secondary = util$4.findChild(this._template, '.progress-bar__secondary');
20346 this._updateDeterminate();
20347 this._updateValue();
20348 this.appendChild(this._template);
20349 autoStyle.prepare(this);
20350 ModifierUtil.initModifier(this, scheme$a);
20351 }
20352 }, {
20353 key: "_isCompiled",
20354 value: function _isCompiled() {
20355 if (!util$4.findChild(this, '.progress-bar')) {
20356 return false;
20357 }
20358 var barElement = util$4.findChild(this, '.progress-bar');
20359 if (!util$4.findChild(barElement, '.progress-bar__secondary')) {
20360 return false;
20361 }
20362 if (!util$4.findChild(barElement, '.progress-bar__primary')) {
20363 return false;
20364 }
20365 return true;
20366 }
20367 }, {
20368 key: "attributeChangedCallback",
20369 value: function attributeChangedCallback(name, last, current) {
20370 if (name === 'modifier') {
20371 ModifierUtil.onModifierChanged(last, current, this, scheme$a);
20372 this.hasAttribute(INDET$1) && this._updateDeterminate();
20373 } else if (name === 'value' || name === 'secondary-value') {
20374 this._updateValue();
20375 } else if (name === INDET$1) {
20376 this._updateDeterminate();
20377 }
20378 }
20379 }, {
20380 key: "_updateDeterminate",
20381 value: function _updateDeterminate() {
20382 var _this2 = this;
20383 contentReady(this, function () {
20384 return util$4.toggleModifier(_this2, INDET$1, {
20385 force: _this2.hasAttribute(INDET$1)
20386 });
20387 });
20388 }
20389 }, {
20390 key: "_updateValue",
20391 value: function _updateValue() {
20392 var _this3 = this;
20393 contentReady(this, function () {
20394 _this3._primary.style.width = _this3.hasAttribute('value') ? _this3.getAttribute('value') + '%' : '0%';
20395 _this3._secondary.style.width = _this3.hasAttribute('secondary-value') ? _this3.getAttribute('secondary-value') + '%' : '0%';
20396 });
20397 }
20398
20399 /**
20400 * @property value
20401 * @type {Number}
20402 * @description
20403 * [en]Current progress. Should be a value between 0 and 100.[/en]
20404 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20405 */
20406 }, {
20407 key: "value",
20408 get: function get() {
20409 return parseInt(this.getAttribute('value') || '0');
20410 }
20411
20412 /**
20413 * @property secondaryValue
20414 * @type {Number}
20415 * @description
20416 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
20417 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20418 */,
20419 set: function set(value) {
20420 if (typeof value !== 'number' || value < 0 || value > 100) {
20421 util$4.throw('Invalid value');
20422 }
20423 this.setAttribute('value', Math.floor(value));
20424 }
20425 }, {
20426 key: "secondaryValue",
20427 get: function get() {
20428 return parseInt(this.getAttribute('secondary-value') || '0');
20429 }
20430
20431 /**
20432 * @property indeterminate
20433 * @type {Boolean}
20434 * @description
20435 * [en]If this property is `true`, an infinite looping animation will be shown.[/en]
20436 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
20437 */,
20438 set: function set(value) {
20439 if (typeof value !== 'number' || value < 0 || value > 100) {
20440 util$4.throw('Invalid value');
20441 }
20442 this.setAttribute('secondary-value', Math.floor(value));
20443 }
20444 }, {
20445 key: "indeterminate",
20446 get: function get() {
20447 return this.hasAttribute(INDET$1);
20448 },
20449 set: function set(value) {
20450 if (value) {
20451 this.setAttribute(INDET$1, '');
20452 } else {
20453 this.removeAttribute(INDET$1);
20454 }
20455 }
20456 }], [{
20457 key: "observedAttributes",
20458 get: function get() {
20459 return ['modifier', 'value', 'secondary-value', INDET$1];
20460 }
20461 }]);
20462 return ProgressBarElement;
20463 }(BaseElement);
20464 onsElements.ProgressBar = ProgressBarElement;
20465 customElements.define('ons-progress-bar', ProgressBarElement);
20466
20467 var scheme$9 = {
20468 '.progress-circular': 'progress-circular--*',
20469 '.progress-circular__background': 'progress-circular--*__background',
20470 '.progress-circular__primary': 'progress-circular--*__primary',
20471 '.progress-circular__secondary': 'progress-circular--*__secondary'
20472 };
20473 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");
20474 var INDET = 'indeterminate';
20475
20476 /**
20477 * @element ons-progress-circular
20478 * @category visual
20479 * @description
20480 * [en]
20481 * 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.
20482 * [/en]
20483 * [ja][/ja]
20484 * @codepen EVzMjR
20485 * @tutorial vanilla/Reference/progress-circular
20486 * @seealso ons-progress-bar
20487 * [en]The `<ons-progress-bar>` component displays a bar progress indicator.[/en]
20488 * [ja][/ja]
20489 * @example
20490 * <ons-progress-circular
20491 * value="55"
20492 * secondary-value="87">
20493 * </ons-progress-circular>
20494 *
20495 * <ons-progress-circular
20496 * indeterminate>
20497 * </ons-progress-circular>
20498 */
20499 var ProgressCircularElement = /*#__PURE__*/function (_BaseElement) {
20500 _inherits(ProgressCircularElement, _BaseElement);
20501 var _super = _createSuper(ProgressCircularElement);
20502 /**
20503 * @attribute modifier
20504 * @type {String}
20505 * @description
20506 * [en]Change the appearance of the progress indicator.[/en]
20507 * [ja]プログレスインジケータの見た目を変更します。[/ja]
20508 */
20509
20510 /**
20511 * @attribute value
20512 * @type {Number}
20513 * @description
20514 * [en]Current progress. Should be a value between 0 and 100.[/en]
20515 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20516 */
20517
20518 /**
20519 * @attribute secondary-value
20520 * @type {Number}
20521 * @description
20522 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
20523 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20524 */
20525
20526 /**
20527 * @attribute indeterminate
20528 * @description
20529 * [en]If this attribute is set, an infinite looping animation will be shown.[/en]
20530 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
20531 */
20532
20533 function ProgressCircularElement() {
20534 var _this;
20535 _classCallCheck(this, ProgressCircularElement);
20536 _this = _super.call(this);
20537 contentReady(_assertThisInitialized(_this), function () {
20538 return _this._compile();
20539 });
20540 return _this;
20541 }
20542 _createClass(ProgressCircularElement, [{
20543 key: "attributeChangedCallback",
20544 value: function attributeChangedCallback(name, last, current) {
20545 if (name === 'modifier') {
20546 ModifierUtil.onModifierChanged(last, current, this, scheme$9);
20547 this.hasAttribute(INDET) && this._updateDeterminate();
20548 } else if (name === 'value' || name === 'secondary-value') {
20549 this._updateValue();
20550 } else if (name === INDET) {
20551 this._updateDeterminate();
20552 }
20553 }
20554 }, {
20555 key: "_updateDeterminate",
20556 value: function _updateDeterminate() {
20557 var _this2 = this;
20558 contentReady(this, function () {
20559 return util$4.toggleModifier(_this2, INDET, {
20560 force: _this2.hasAttribute(INDET)
20561 });
20562 });
20563 }
20564 }, {
20565 key: "_updateValue",
20566 value: function _updateValue() {
20567 var _this3 = this;
20568 if (this.hasAttribute('value')) {
20569 contentReady(this, function () {
20570 var per = Math.ceil(_this3.getAttribute('value') * 251.32 * 0.01);
20571 _this3._primary.style['stroke-dasharray'] = per + '%, 251.32%';
20572 });
20573 }
20574 if (this.hasAttribute('secondary-value')) {
20575 contentReady(this, function () {
20576 var per = Math.ceil(_this3.getAttribute('secondary-value') * 251.32 * 0.01);
20577 _this3._secondary.style.display = null;
20578 _this3._secondary.style['stroke-dasharray'] = per + '%, 251.32%';
20579 });
20580 } else {
20581 contentReady(this, function () {
20582 _this3._secondary.style.display = 'none';
20583 });
20584 }
20585 }
20586
20587 /**
20588 * @property value
20589 * @type {Number}
20590 * @description
20591 * [en]Current progress. Should be a value between 0 and 100.[/en]
20592 * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20593 */
20594 }, {
20595 key: "value",
20596 get: function get() {
20597 return parseInt(this.getAttribute('value') || '0');
20598 }
20599
20600 /**
20601 * @property secondaryValue
20602 * @type {Number}
20603 * @description
20604 * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
20605 * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
20606 */,
20607 set: function set(value) {
20608 if (typeof value !== 'number' || value < 0 || value > 100) {
20609 util$4.throw('Invalid value');
20610 }
20611 this.setAttribute('value', Math.floor(value));
20612 }
20613 }, {
20614 key: "secondaryValue",
20615 get: function get() {
20616 return parseInt(this.getAttribute('secondary-value') || '0');
20617 }
20618
20619 /**
20620 * @property indeterminate
20621 * @type {Boolean}
20622 * @description
20623 * [en]If this property is `true`, an infinite looping animation will be shown.[/en]
20624 * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
20625 */,
20626 set: function set(value) {
20627 if (typeof value !== 'number' || value < 0 || value > 100) {
20628 util$4.throw('Invalid value');
20629 }
20630 this.setAttribute('secondary-value', Math.floor(value));
20631 }
20632 }, {
20633 key: "indeterminate",
20634 get: function get() {
20635 return this.hasAttribute(INDET);
20636 },
20637 set: function set(value) {
20638 if (value) {
20639 this.setAttribute(INDET, '');
20640 } else {
20641 this.removeAttribute(INDET);
20642 }
20643 }
20644 }, {
20645 key: "_compile",
20646 value: function _compile() {
20647 if (this._isCompiled()) {
20648 this._template = util$4.findChild(this, '.progress-circular');
20649 } else {
20650 this._template = template.cloneNode(true);
20651 }
20652 this._primary = util$4.findChild(this._template, '.progress-circular__primary');
20653 this._secondary = util$4.findChild(this._template, '.progress-circular__secondary');
20654 this._updateDeterminate();
20655 this._updateValue();
20656 this.appendChild(this._template);
20657 autoStyle.prepare(this);
20658 ModifierUtil.initModifier(this, scheme$9);
20659 }
20660 }, {
20661 key: "_isCompiled",
20662 value: function _isCompiled() {
20663 if (!util$4.findChild(this, '.progress-circular')) {
20664 return false;
20665 }
20666 var svg = util$4.findChild(this, '.progress-circular');
20667 if (!util$4.findChild(svg, '.progress-circular__secondary')) {
20668 return false;
20669 }
20670 if (!util$4.findChild(svg, '.progress-circular__primary')) {
20671 return false;
20672 }
20673 return true;
20674 }
20675 }], [{
20676 key: "observedAttributes",
20677 get: function get() {
20678 return ['modifier', 'value', 'secondary-value', INDET];
20679 }
20680 }]);
20681 return ProgressCircularElement;
20682 }(BaseElement);
20683 onsElements.ProgressCircular = ProgressCircularElement;
20684 customElements.define('ons-progress-circular', ProgressCircularElement);
20685
20686 var STATE_INITIAL = 'initial';
20687 var STATE_PREACTION = 'preaction';
20688 var STATE_ACTION = 'action';
20689 var throwType = function throwType(el, type) {
20690 return util$4.throw("\"".concat(el, "\" must be ").concat(type));
20691 };
20692
20693 /**
20694 * @element ons-pull-hook
20695 * @category control
20696 * @description
20697 * [en]
20698 * Component that adds **Pull to refresh** functionality to an `<ons-page>` element.
20699 *
20700 * 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.
20701 * [/en]
20702 * [ja][/ja]
20703 * @codepen WbJogM
20704 * @tutorial vanilla/Reference/pull-hook
20705 * @example
20706 * <ons-page>
20707 * <ons-pull-hook>
20708 * Release to refresh
20709 * </ons-pull-hook>
20710 * </ons-page>
20711 *
20712 * <script>
20713 * document.querySelector('ons-pull-hook').onAction = function(done) {
20714 * setTimeout(done, 1000);
20715 * };
20716 * </script>
20717 */
20718 var PullHookElement = /*#__PURE__*/function (_BaseElement) {
20719 _inherits(PullHookElement, _BaseElement);
20720 var _super = _createSuper(PullHookElement);
20721 /**
20722 * @event changestate
20723 * @description
20724 * [en]Fired when the state is changed. The state can be either "initial", "preaction" or "action".[/en]
20725 * [ja]コンポーネントの状態が変わった場合に発火します。状態は、"initial", "preaction", "action"のいずれかです。[/ja]
20726 * @param {Object} event
20727 * [en]Event object.[/en]
20728 * [ja]イベントオブジェクト。[/ja]
20729 * @param {Object} event.pullHook
20730 * [en]Component object.[/en]
20731 * [ja]コンポーネントのオブジェクト。[/ja]
20732 * @param {String} event.state
20733 * [en]Current state.[/en]
20734 * [ja]現在の状態名を参照できます。[/ja]
20735 */
20736
20737 /**
20738 * @event pull
20739 * @description
20740 * [en]Fired when the pull hook is pulled.[/en]
20741 * [ja][/ja]
20742 * @param {Object} event
20743 * [en]Event object.[/en]
20744 * [ja]イベントオブジェクト。[/ja]
20745 * @param {Object} event.ratio
20746 * [en]The pulled distance ratio (scroll / height).[/en]
20747 * [ja][/ja]
20748 * @param {String} event.animationOptions
20749 * [en]The animation options object.[/en]
20750 * [ja][/ja]
20751 */
20752
20753 /**
20754 * @attribute disabled
20755 * @description
20756 * [en]If this attribute is set the "pull-to-refresh" functionality is disabled.[/en]
20757 * [ja]この属性がある時、disabled状態になりアクションが実行されなくなります[/ja]
20758 */
20759
20760 /**
20761 * @attribute height
20762 * @type {String}
20763 * @description
20764 * [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]
20765 * [ja]コンポーネントの高さを指定します。この高さ以上にpull downすると"preaction"状態に移行します。デフォルトの値は"64px"です。[/ja]
20766 */
20767
20768 /**
20769 * @attribute threshold-height
20770 * @type {String}
20771 * @description
20772 * [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]
20773 * [ja]閾値となる高さを指定します。この値で指定した高さよりもpull downすると、このコンポーネントは自動的に"action"状態に移行します。[/ja]
20774 */
20775
20776 /**
20777 * @attribute fixed-content
20778 * @description
20779 * [en]If this attribute is set the content of the page will not move when pulling.[/en]
20780 * [ja]この属性がある時、プルフックが引き出されている時にもコンテンツは動きません。[/ja]
20781 */
20782
20783 /**
20784 * @property fixedContent
20785 * @type {Boolean}
20786 * @description
20787 * [en]If this property is set the content of the page will not move when pulling.[/en]
20788 * [ja]この属性がある時、プルフックが引き出されている時にもコンテンツは動きません。[/ja]
20789 */
20790
20791 function PullHookElement() {
20792 var _this;
20793 _classCallCheck(this, PullHookElement);
20794 _this = _super.call(this);
20795 _this._onDrag = _this._onDrag.bind(_assertThisInitialized(_this));
20796 _this._onDragStart = _this._onDragStart.bind(_assertThisInitialized(_this));
20797 _this._onDragEnd = _this._onDragEnd.bind(_assertThisInitialized(_this));
20798 _this._onScroll = _this._onScroll.bind(_assertThisInitialized(_this));
20799 _this._setState(STATE_INITIAL, true);
20800 _this._hide(); // Fix for transparent toolbar transitions
20801
20802 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'pull'),
20803 onConnected = _util$defineListenerP.onConnected,
20804 onDisconnected = _util$defineListenerP.onDisconnected;
20805 _this._connectOnPull = onConnected;
20806 _this._disconnectOnPull = onDisconnected;
20807 return _this;
20808 }
20809 _createClass(PullHookElement, [{
20810 key: "_setStyle",
20811 value: function _setStyle() {
20812 var height = this.height + 'px';
20813 styler(this, {
20814 height: height,
20815 lineHeight: height
20816 });
20817 this.style.display === '' && this._show();
20818 }
20819 }, {
20820 key: "_onScroll",
20821 value: function _onScroll(event) {
20822 var element = this._pageElement;
20823 if (element.scrollTop < 0) {
20824 element.scrollTop = 0;
20825 }
20826 }
20827 }, {
20828 key: "_canConsumeGesture",
20829 value: function _canConsumeGesture(gesture) {
20830 return gesture.direction === 'up' || gesture.direction === 'down';
20831 }
20832 }, {
20833 key: "_onDragStart",
20834 value: function _onDragStart(event) {
20835 var _this2 = this;
20836 if (!event.gesture || this.disabled) {
20837 return;
20838 }
20839 var tapY = event.gesture.center.clientY + this._pageElement.scrollTop;
20840 var maxY = window.innerHeight;
20841 // Only use drags that start near the pullHook to reduce flickerings
20842 var draggableAreaRatio = 1;
20843 this._ignoreDrag = event.consumed || tapY > maxY * draggableAreaRatio;
20844 if (!this._ignoreDrag) {
20845 var consume = event.consume;
20846 event.consume = function () {
20847 consume && consume();
20848 _this2._ignoreDrag = true;
20849 // This elements resizes .page__content so it is safer
20850 // to hide it when other components are dragged.
20851 _this2._hide();
20852 };
20853 if (this._canConsumeGesture(event.gesture)) {
20854 consume && consume();
20855 event.consumed = true;
20856 this._show(); // Not enough due to 'dragLockAxis'
20857 }
20858 }
20859
20860 this._startScroll = this._pageElement.scrollTop;
20861 }
20862 }, {
20863 key: "_onDrag",
20864 value: function _onDrag(event) {
20865 var _this3 = this;
20866 if (!event.gesture || this.disabled || this._ignoreDrag || !this._canConsumeGesture(event.gesture)) {
20867 return;
20868 }
20869
20870 // Necessary due to 'dragLockAxis' (25px)
20871 if (this.style.display === 'none') {
20872 this._show();
20873 }
20874 event.stopPropagation();
20875 event.gesture.center.clientY + this._pageElement.scrollTop;
20876 var scroll = Math.max(event.gesture.deltaY - this._startScroll, 0);
20877 if (scroll !== this._currentTranslation) {
20878 var th = this.thresholdHeight;
20879 if (th > 0 && scroll >= th) {
20880 event.gesture.stopDetect();
20881 setImmediate(function () {
20882 return _this3._finish();
20883 });
20884 } else if (scroll >= this.height) {
20885 this._setState(STATE_PREACTION);
20886 } else {
20887 this._setState(STATE_INITIAL);
20888 }
20889 this._translateTo(scroll);
20890 }
20891 }
20892 }, {
20893 key: "_onDragEnd",
20894 value: function _onDragEnd(event) {
20895 if (!event.gesture || this.disabled || this._ignoreDrag) {
20896 return;
20897 }
20898 event.stopPropagation();
20899 if (this._currentTranslation > 0) {
20900 var scroll = this._currentTranslation;
20901 if (scroll > this.height) {
20902 this._finish();
20903 } else {
20904 this._translateTo(0, {
20905 animate: true
20906 });
20907 }
20908 }
20909 }
20910
20911 /**
20912 * @property onAction
20913 * @type {Function}
20914 * @description
20915 * [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]
20916 * [ja][/ja]
20917 */
20918 }, {
20919 key: "onAction",
20920 get: function get() {
20921 return this._onAction;
20922 },
20923 set: function set(value) {
20924 if (value && !(value instanceof Function)) {
20925 throwType('onAction', 'function or null');
20926 }
20927 this._onAction = value;
20928 }
20929
20930 /**
20931 * @property onPull
20932 * @type {Function}
20933 * @description
20934 * [en]Hook called whenever the user pulls the element. It gets the pulled distance ratio (scroll / height) and an animationOptions object as arguments.[/en]
20935 * [ja][/ja]
20936 */
20937 }, {
20938 key: "_finish",
20939 value: function _finish() {
20940 var _this4 = this;
20941 this._setState(STATE_ACTION);
20942 this._translateTo(this.height, {
20943 animate: true
20944 });
20945 var action = this.onAction || function (done) {
20946 return done();
20947 };
20948 action(function () {
20949 _this4._translateTo(0, {
20950 animate: true
20951 });
20952 _this4._setState(STATE_INITIAL);
20953 });
20954 }
20955
20956 /**
20957 * @property height
20958 * @type {Number}
20959 * @description
20960 * [en]The height of the pull hook in pixels. The default value is `64px`.[/en]
20961 * [ja][/ja]
20962 */
20963 }, {
20964 key: "height",
20965 get: function get() {
20966 return parseInt(this.getAttribute('height') || '64', 10);
20967 }
20968
20969 /**
20970 * @property thresholdHeight
20971 * @type {Number}
20972 * @description
20973 * [en]The thresholdHeight of the pull hook in pixels. The default value is `96px`.[/en]
20974 * [ja][/ja]
20975 */,
20976 set: function set(value) {
20977 if (!util$4.isInteger(value)) {
20978 throwType('height', 'integer');
20979 }
20980 this.setAttribute('height', "".concat(value, "px"));
20981 }
20982 }, {
20983 key: "thresholdHeight",
20984 get: function get() {
20985 return parseInt(this.getAttribute('threshold-height') || '96', 10);
20986 },
20987 set: function set(value) {
20988 if (!util$4.isInteger(value)) {
20989 throwType('thresholdHeight', 'integer');
20990 }
20991 this.setAttribute('threshold-height', "".concat(value, "px"));
20992 }
20993 }, {
20994 key: "_setState",
20995 value: function _setState(state, noEvent) {
20996 var lastState = this.state;
20997 this.setAttribute('state', state);
20998 if (!noEvent && lastState !== this.state) {
20999 util$4.triggerElementEvent(this, 'changestate', {
21000 pullHook: this,
21001 state: state,
21002 lastState: lastState
21003 });
21004 }
21005 }
21006
21007 /**
21008 * @property state
21009 * @readonly
21010 * @type {String}
21011 * @description
21012 * [en]Current state of the element.[/en]
21013 * [ja][/ja]
21014 */
21015 }, {
21016 key: "state",
21017 get: function get() {
21018 return this.getAttribute('state');
21019 }
21020
21021 /**
21022 * @property pullDistance
21023 * @readonly
21024 * @type {Number}
21025 * @description
21026 * [en]The current number of pixels the pull hook has moved.[/en]
21027 * [ja]現在のプルフックが引き出された距離をピクセル数。[/ja]
21028 */
21029 }, {
21030 key: "pullDistance",
21031 get: function get() {
21032 return this._currentTranslation;
21033 }
21034
21035 /**
21036 * @property disabled
21037 * @type {Boolean}
21038 * @description
21039 * [en]Whether the element is disabled or not.[/en]
21040 * [ja]無効化されている場合に`true`。[/ja]
21041 */
21042 }, {
21043 key: "_show",
21044 value: function _show() {
21045 var _this5 = this;
21046 // Run asyncrhonously to avoid conflicts with Animit's style clean
21047 setImmediate(function () {
21048 _this5.style.display = '';
21049 if (_this5._pageElement) {
21050 _this5._pageElement.style.marginTop = "-".concat(_this5.height, "px");
21051 }
21052 });
21053 }
21054 }, {
21055 key: "_hide",
21056 value: function _hide() {
21057 this.style.display = 'none';
21058 if (this._pageElement) {
21059 this._pageElement.style.marginTop = '';
21060 }
21061 }
21062
21063 /**
21064 * @param {Number} scroll
21065 * @param {Object} options
21066 * @param {Function} [options.callback]
21067 */
21068 }, {
21069 key: "_translateTo",
21070 value: function _translateTo(scroll) {
21071 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
21072 if (this._currentTranslation == 0 && scroll == 0) {
21073 return;
21074 }
21075 this._currentTranslation = scroll;
21076 var opt = options.animate ? {
21077 duration: .3,
21078 timing: 'cubic-bezier(.1, .7, .1, 1)'
21079 } : {};
21080 util$4.triggerElementEvent(this, 'pull', {
21081 ratio: (scroll / this.height).toFixed(2),
21082 animationOptions: opt
21083 });
21084 var scrollElement = this.hasAttribute('fixed-content') ? this : this._pageElement;
21085 Animit(scrollElement).queue({
21086 transform: "translate3d(0px, ".concat(scroll, "px, 0px)")
21087 }, opt).play(function () {
21088 scroll === 0 && styler.clear(scrollElement, 'transition transform');
21089 options.callback instanceof Function && options.callback();
21090 });
21091 }
21092 }, {
21093 key: "_disableDragLock",
21094 value: function _disableDragLock() {
21095 // e2e tests need it
21096 this._dragLockDisabled = true;
21097 this._setupListeners(true);
21098 }
21099 }, {
21100 key: "_setupListeners",
21101 value: function _setupListeners(add) {
21102 var _this6 = this;
21103 var scrollToggle = function scrollToggle(action) {
21104 return _this6._pageElement["".concat(action, "EventListener")]('scroll', _this6._onScroll, false);
21105 };
21106 var gdToggle = function gdToggle(action) {
21107 var passive = {
21108 passive: true
21109 };
21110 _this6._gestureDetector[action]('drag', _this6._onDrag, passive);
21111 _this6._gestureDetector[action]('dragstart', _this6._onDragStart, passive);
21112 _this6._gestureDetector[action]('dragend', _this6._onDragEnd, passive);
21113 };
21114 if (this._gestureDetector) {
21115 gdToggle('off');
21116 this._gestureDetector.dispose();
21117 this._gestureDetector = null;
21118 }
21119 scrollToggle('remove');
21120 if (add) {
21121 this._gestureDetector = new GestureDetector(this._pageElement, {
21122 dragMinDistance: 1,
21123 dragDistanceCorrection: false,
21124 dragLockToAxis: !this._dragLockDisabled,
21125 passive: true
21126 });
21127 gdToggle('on');
21128 scrollToggle('add');
21129 }
21130 }
21131 }, {
21132 key: "connectedCallback",
21133 value: function connectedCallback() {
21134 this._currentTranslation = 0;
21135 this._pageElement = this.parentNode;
21136 this._setupListeners(true);
21137 this._setStyle();
21138 this._connectOnPull();
21139 }
21140 }, {
21141 key: "disconnectedCallback",
21142 value: function disconnectedCallback() {
21143 this._hide();
21144 this._setupListeners(false);
21145 this._disconnectOnPull();
21146 }
21147 }, {
21148 key: "attributeChangedCallback",
21149 value: function attributeChangedCallback(name, last, current) {
21150 if (name === 'height' && this._pageElement) {
21151 this._setStyle();
21152 }
21153 }
21154 }], [{
21155 key: "observedAttributes",
21156 get: function get() {
21157 return ['height'];
21158 }
21159 }, {
21160 key: "events",
21161 get: function get() {
21162 return ['changestate', 'pull'];
21163 }
21164 }]);
21165 return PullHookElement;
21166 }(BaseElement);
21167 util$4.defineBooleanProperties(PullHookElement, ['disabled', 'fixed-content']);
21168 onsElements.PullHook = PullHookElement;
21169 customElements.define('ons-pull-hook', PullHookElement);
21170
21171 var scheme$8 = {
21172 '': 'range--*',
21173 '.range__input': 'range--*__input',
21174 '.range__focus-ring': 'range--*__focus-ring'
21175 };
21176 var activeClassToken = 'range__input--active';
21177
21178 /**
21179 * @element ons-range
21180 * @category form
21181 * @modifier material
21182 * [en]Material Design slider[/en]
21183 * [ja][/ja]
21184 * @description
21185 * [en]
21186 * Range input component. Used to display a draggable slider.
21187 *
21188 * Works very similar to the `<input type="range">` element.
21189 * [/en]
21190 * [ja][/ja]
21191 * @codepen xZQomM
21192 * @tutorial vanilla/Reference/range
21193 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
21194 * @seealso ons-input
21195 * [en]The `<ons-input>` component is used to display text inputs, radio buttons and checkboxes.[/en]
21196 * [ja][/ja]
21197 * @example
21198 * <ons-range value="20"></ons-range>
21199 * <ons-range modifier="material" value="10"></range>
21200 */
21201 var RangeElement = /*#__PURE__*/function (_BaseInputElement) {
21202 _inherits(RangeElement, _BaseInputElement);
21203 var _super = _createSuper(RangeElement);
21204 function RangeElement() {
21205 var _this;
21206 _classCallCheck(this, RangeElement);
21207 _this = _super.call(this);
21208 _this._onMouseDown = _this._onMouseDown.bind(_assertThisInitialized(_this));
21209 _this._onMouseUp = _this._onMouseUp.bind(_assertThisInitialized(_this));
21210 _this._onTouchStart = _this._onTouchStart.bind(_assertThisInitialized(_this));
21211 _this._onTouchEnd = _this._onTouchEnd.bind(_assertThisInitialized(_this));
21212 _this._onInput = _this._update.bind(_assertThisInitialized(_this));
21213 _this._onDragstart = _this._onDragstart.bind(_assertThisInitialized(_this));
21214 _this._onDragend = _this._onDragend.bind(_assertThisInitialized(_this));
21215 return _this;
21216 }
21217 _createClass(RangeElement, [{
21218 key: "_compile",
21219 value: function _compile() {
21220 _get(_getPrototypeOf(RangeElement.prototype), "_compile", this).call(this);
21221 this._updateDisabled(this.hasAttribute('disabled'));
21222 }
21223
21224 /* Inherited props */
21225 }, {
21226 key: "_update",
21227 value: function _update() {
21228 var input = this._input;
21229 var focusRing = this._focusRing;
21230 input.style.backgroundSize = "".concat(100 * this._ratio, "% 2px");
21231 focusRing.value = this.value;
21232
21233 // NOTE: "_zero" attribute is used for CSS styling.
21234 if (input.min === '' && input.value === '0' || input.min === input.value) {
21235 input.setAttribute('_zero', '');
21236 } else {
21237 input.removeAttribute('_zero');
21238 }
21239 ['min', 'max'].forEach(function (attr) {
21240 return focusRing[attr] = input[attr];
21241 });
21242 }
21243 }, {
21244 key: "_scheme",
21245 get: function get() {
21246 return scheme$8;
21247 }
21248 }, {
21249 key: "_template",
21250 get: function get() {
21251 return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <input type=\"range\" class=\"range__focus-ring\" tabIndex=\"-1\">\n ");
21252 }
21253 }, {
21254 key: "_defaultClassName",
21255 get: function get() {
21256 return 'range';
21257 }
21258 }, {
21259 key: "type",
21260 get: function get() {
21261 return 'range';
21262 }
21263
21264 /* Own props */
21265 }, {
21266 key: "_onMouseDown",
21267 value: function _onMouseDown(e) {
21268 var _this2 = this;
21269 this._input.classList.add(activeClassToken);
21270 setImmediate(function () {
21271 return _this2._input.focus();
21272 });
21273 }
21274 }, {
21275 key: "_onTouchStart",
21276 value: function _onTouchStart(e) {
21277 this._onMouseDown();
21278 }
21279 }, {
21280 key: "_onMouseUp",
21281 value: function _onMouseUp(e) {
21282 this._input.classList.remove(activeClassToken);
21283 }
21284 }, {
21285 key: "_onTouchEnd",
21286 value: function _onTouchEnd(e) {
21287 this._onMouseUp(e);
21288 }
21289 }, {
21290 key: "_onDragstart",
21291 value: function _onDragstart(e) {
21292 e.consumed = true;
21293 e.gesture.stopPropagation();
21294 this._input.classList.add(activeClassToken);
21295 this.addEventListener('drag', this._onDrag);
21296 }
21297 }, {
21298 key: "_onDrag",
21299 value: function _onDrag(e) {
21300 e.stopPropagation();
21301 }
21302 }, {
21303 key: "_onDragend",
21304 value: function _onDragend(e) {
21305 this._input.classList.remove(activeClassToken);
21306 this.removeEventListener('drag', this._onDrag);
21307 }
21308 }, {
21309 key: "_focusRing",
21310 get: function get() {
21311 return this.children[1];
21312 }
21313 }, {
21314 key: "_ratio",
21315 get: function get() {
21316 // Returns the current ratio.
21317 var min = this._input.min === '' ? 0 : parseInt(this._input.min);
21318 var max = this._input.max === '' ? 100 : parseInt(this._input.max);
21319 return (this.value - min) / (max - min);
21320 }
21321 }, {
21322 key: "attributeChangedCallback",
21323 value: function attributeChangedCallback(name, last, current) {
21324 if (name === 'disabled') {
21325 this._updateDisabled(current);
21326 }
21327 _get(_getPrototypeOf(RangeElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
21328 }
21329
21330 /**
21331 * @param {boolean} disabled
21332 */
21333 }, {
21334 key: "_updateDisabled",
21335 value: function _updateDisabled(disabled) {
21336 if (disabled) {
21337 this.classList.add('range--disabled');
21338 } else {
21339 this.classList.remove('range--disabled');
21340 }
21341 }
21342 }, {
21343 key: "connectedCallback",
21344 value: function connectedCallback() {
21345 this._setupListeners(true);
21346 }
21347 }, {
21348 key: "disconnectedCallback",
21349 value: function disconnectedCallback() {
21350 this._setupListeners(false);
21351 }
21352 }, {
21353 key: "_setupListeners",
21354 value: function _setupListeners(add) {
21355 var action = (add ? 'add' : 'remove') + 'EventListener';
21356 util$4[action](this, 'touchstart', this._onTouchStart, {
21357 passive: true
21358 });
21359 this[action]('mousedown', this._onMouseDown);
21360 this[action]('mouseup', this._onMouseUp);
21361 this[action]('touchend', this._onTouchEnd);
21362 this[action]('dragstart', this._onDragstart);
21363 this[action]('dragend', this._onDragend);
21364 this[action]('input', this._onInput);
21365 }
21366
21367 /**
21368 * @attribute disabled
21369 * @description
21370 * [en]Whether the element is disabled or not.[/en]
21371 * [ja]無効化されている場合に`true`。[/ja]
21372 */
21373
21374 /**
21375 * @property disabled
21376 * @type {Boolean}
21377 * @description
21378 * [en]Whether the element is disabled or not.[/en]
21379 * [ja]無効化されている場合に`true`。[/ja]
21380 */
21381
21382 /**
21383 * @property value
21384 * @type {Number}
21385 * @description
21386 * [en]Current value.[/en]
21387 * [ja][/ja]
21388 */
21389
21390 /**
21391 * @method focus
21392 * @signature focus()
21393 * @description
21394 * [en]Focuses the range.[/en]
21395 * [ja][/ja]
21396 */
21397
21398 /**
21399 * @method blur
21400 * @signature blur()
21401 * @description
21402 * [en]Removes focus from the range.[/en]
21403 * [ja][/ja]
21404 */
21405 }], [{
21406 key: "observedAttributes",
21407 get: function get() {
21408 return ['disabled'].concat(_toConsumableArray(BaseInputElement.observedAttributes));
21409 }
21410 }]);
21411 return RangeElement;
21412 }(BaseInputElement);
21413 onsElements.Range = RangeElement;
21414 customElements.define('ons-range', RangeElement);
21415
21416 /**
21417 * @element ons-row
21418 * @category grid
21419 * @description
21420 * [en]Represents a row in the grid system. Use with `<ons-col>` to layout components.[/en]
21421 * [ja]グリッドシステムにて行を定義します。ons-colとともに使用し、コンポーネントの配置に使用します。[/ja]
21422 * @codepen GgujC {wide}
21423 * @guide features.html
21424 * [en]Layouting guide[/en]
21425 * [ja]レイアウト調整[/ja]
21426 * @seealso ons-col
21427 * [en]The `<ons-col>` component is used as children of `<ons-row>`.[/en]
21428 * [ja]ons-colコンポーネント[/ja]
21429 * @note
21430 * [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]
21431 * [ja]Android 4.3以前、もしくはiOS 6以前のOSの場合、ons-rowとons-colを組み合わせてそれぞれのons-col要素のvertical-align属性の値に別々の値を指定すると、描画が崩れる場合があります。vertical-align属性の値には一つの値だけを指定できます。[/ja]
21432 * @example
21433 * <ons-row>
21434 * <ons-col width="50px"><ons-icon icon="fa-twitter"></ons-icon></ons-col>
21435 * <ons-col>Text</ons-col>
21436 * </ons-row>
21437 */
21438
21439 /**
21440 * @attribute vertical-align
21441 * @type {String}
21442 * @description
21443 * [en]Short hand attribute for aligning vertically. Valid values are top, bottom, and center.[/en]
21444 * [ja]縦に整列するために指定します。top、bottom、centerのいずれかを指定できます。[/ja]
21445 */
21446 var RowElement = /*#__PURE__*/function (_BaseElement) {
21447 _inherits(RowElement, _BaseElement);
21448 var _super = _createSuper(RowElement);
21449 function RowElement() {
21450 _classCallCheck(this, RowElement);
21451 return _super.apply(this, arguments);
21452 }
21453 return _createClass(RowElement);
21454 }(BaseElement);
21455 onsElements.Row = RowElement;
21456 customElements.define('ons-row', RowElement);
21457
21458 var defaultClassName$5 = 'segment';
21459 var scheme$7 = {
21460 '': 'segment--*',
21461 '.segment__item': 'segment--*__item',
21462 '.segment__input': 'segment--*__input',
21463 '.segment__button': 'segment--*__button'
21464 };
21465 var generateId = function () {
21466 var i = 0;
21467 return function () {
21468 return 'ons-segment-gen-' + i++;
21469 };
21470 }();
21471
21472 /**
21473 * @element ons-segment
21474 * @category control
21475 * @modifier material
21476 * [en]Material Design segment[/en]
21477 * [ja][/ja]
21478 * @description
21479 * [en]
21480 * Segment component. Use this component to have a button bar with automatic styles that switch on click of another button.
21481 *
21482 * Will automatically display as a Material Design segment on Android.
21483 * [/en]
21484 * [ja][/ja]
21485 * @codepen hLayx
21486 * @tutorial vanilla/Reference/segment
21487 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
21488 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
21489 * @example
21490 * <ons-segment>
21491 * <ons-button>Label 1</ons-button>
21492 * <ons-button>Label 2</ons-button>
21493 * <ons-button>Label 3</ons-button>
21494 * </ons-segment>
21495 */
21496 var SegmentElement = /*#__PURE__*/function (_BaseElement) {
21497 _inherits(SegmentElement, _BaseElement);
21498 var _super = _createSuper(SegmentElement);
21499 /**
21500 * @event postchange
21501 * @description
21502 * [en]Fires after the active button is changed.[/en]
21503 * [ja][/ja]
21504 * @param {Object} event
21505 * [en]Event object.[/en]
21506 * [ja][/ja]
21507 * @param {Number} event.index
21508 * [en]Tapped button index.[/en]
21509 * [ja][/ja]
21510 * @param {Object} event.segmentItem
21511 * [en]Segment item object.[/en]
21512 * [ja][/ja]
21513 */
21514
21515 /**
21516 * @attribute modifier
21517 * @type {String}
21518 * @description
21519 * [en]The appearance of the segment.[/en]
21520 * [ja][/ja]
21521 */
21522
21523 /**
21524 * @attribute tabbar-id
21525 * @initonly
21526 * @type {String}
21527 * @description
21528 * [en]ID of the tabbar element to "connect" to the segment. Must be inside the same page.[/en]
21529 * [ja][/ja]
21530 */
21531
21532 /**
21533 * @attribute active-index
21534 * @default 0
21535 * @type {Number}
21536 * @description
21537 * [en]Index of the active button. If a tabbar is connected, this will be set to the tabbar's active index.[/en]
21538 * [ja][/ja]
21539 */
21540
21541 /**
21542 * @property activeIndex
21543 * @default 0
21544 * @type {Number}
21545 * @description
21546 * [en]Index of the active button. If a tabbar is connected, this will be set to the tabbar's active index.[/en]
21547 * [ja][/ja]
21548 */
21549
21550 /**
21551 * @attribute disabled
21552 * @description
21553 * [en]Specify if segment should be disabled.[/en]
21554 * [ja]ボタンを無効化する場合は指定します。[/ja]
21555 */
21556
21557 function SegmentElement() {
21558 var _this;
21559 _classCallCheck(this, SegmentElement);
21560 _this = _super.call(this);
21561 _this._segmentId = generateId();
21562 _this._tabbar = null;
21563 _this._onChange = _this._onChange.bind(_assertThisInitialized(_this));
21564 _this._onTabbarPreChange = _this._onTabbarPreChange.bind(_assertThisInitialized(_this));
21565 contentReady(_assertThisInitialized(_this), function () {
21566 _this._compile();
21567 setImmediate(function () {
21568 return _this._lastActiveIndex = _this._tabbar ? _this._tabbar.getActiveTabIndex() : _this.getActiveButtonIndex();
21569 });
21570 });
21571 return _this;
21572 }
21573 _createClass(SegmentElement, [{
21574 key: "_compile",
21575 value: function _compile() {
21576 autoStyle.prepare(this);
21577 this.classList.add(defaultClassName$5);
21578 for (var index = this.children.length - 1; index >= 0; index--) {
21579 var item = this.children[index];
21580 item.classList.add('segment__item');
21581 var input = util$4.findChild(item, '.segment__input') || util$4.create('input.segment__input');
21582 input.type = 'radio';
21583 input.value = index;
21584 input.name = input.name || this._segmentId;
21585 input.checked = !this.hasAttribute('tabbar-id') && index === (this.activeIndex || 0);
21586 var button = util$4.findChild(item, '.segment__button') || util$4.create('.segment__button');
21587 if (button.parentElement !== item) {
21588 while (item.firstChild) {
21589 button.appendChild(item.firstChild);
21590 }
21591 }
21592 item.appendChild(input);
21593 item.appendChild(button);
21594 }
21595 ModifierUtil.initModifier(this, scheme$7);
21596 }
21597 }, {
21598 key: "connectedCallback",
21599 value: function connectedCallback() {
21600 var _this2 = this;
21601 contentReady(this, function () {
21602 if (_this2.hasAttribute('tabbar-id')) {
21603 var page = util$4.findParent(_this2, 'ons-page');
21604 _this2._tabbar = page && page.querySelector('#' + _this2.getAttribute('tabbar-id'));
21605 if (!_this2._tabbar || _this2._tabbar.tagName !== 'ONS-TABBAR') {
21606 util$4.throw("No tabbar with id ".concat(_this2.getAttribute('tabbar-id'), " was found."));
21607 }
21608 _this2._tabbar.setAttribute('hide-tabs', '');
21609 setImmediate(function () {
21610 var index = _this2._tabbar.getActiveTabIndex();
21611 _this2._setChecked(index);
21612 _this2.activeIndex = index;
21613 });
21614 _this2._tabbar.addEventListener('prechange', _this2._onTabbarPreChange);
21615 }
21616 });
21617 this.addEventListener('change', this._onChange);
21618 }
21619 }, {
21620 key: "disconnectedCallback",
21621 value: function disconnectedCallback() {
21622 var _this3 = this;
21623 contentReady(this, function () {
21624 if (_this3._tabbar) {
21625 _this3._tabbar.removeEventListener('prechange', _this3._onTabbarPreChange);
21626 _this3._tabbar = null;
21627 }
21628 });
21629 this.removeEventListener('change', this._onChange);
21630 }
21631 }, {
21632 key: "_setChecked",
21633 value: function _setChecked(index) {
21634 this.children[index].firstElementChild.checked = true;
21635 }
21636
21637 /**
21638 * @method setActiveButton
21639 * @signature setActiveButton(index, [options])
21640 * @param {Number} index
21641 * [en]Button index.[/en]
21642 * [ja][/ja]
21643 * @param {Object} [options]
21644 * [en]Parameter object, works only if there is a connected tabbar. Supports the same options as `ons-tabbar`'s `setActiveTab` method.[/en]
21645 * [ja][/ja]
21646 * @description
21647 * [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]
21648 * [ja][/ja]
21649 * @return {Promise}
21650 * [en]Resolves to the selected index or to the new page element if there is a connected tabbar.[/en]
21651 * [ja][/ja]
21652 */
21653 }, {
21654 key: "setActiveButton",
21655 value: function setActiveButton(index, options) {
21656 if (this._tabbar) {
21657 return this._tabbar.setActiveTab(index, options);
21658 }
21659 this._setChecked(index);
21660 this._postChange(index);
21661 return Promise.resolve(index);
21662 }
21663
21664 /**
21665 * @method getActiveButtonIndex
21666 * @signature getActiveButtonIndex()
21667 * @return {Number}
21668 * [en]The index of the currently active button.[/en]
21669 * [ja][/ja]
21670 * @description
21671 * [en]Returns button index of current active button. If active button is not found, returns -1.[/en]
21672 * [ja][/ja]
21673 */
21674 }, {
21675 key: "getActiveButtonIndex",
21676 value: function getActiveButtonIndex() {
21677 for (var i = this.children.length - 1; i >= 0; i--) {
21678 // Array.findIndex
21679 if (this.children[i].firstElementChild.checked) {
21680 return i;
21681 }
21682 }
21683 return -1;
21684 }
21685 }, {
21686 key: "_onChange",
21687 value: function _onChange(event) {
21688 event.stopPropagation();
21689 this._tabbar ? this._tabbar.setActiveTab(this.getActiveButtonIndex(), {
21690 reject: false
21691 }) : this._postChange(this.getActiveButtonIndex());
21692 }
21693 }, {
21694 key: "_onTabbarPreChange",
21695 value: function _onTabbarPreChange(event) {
21696 var _this4 = this;
21697 setImmediate(function () {
21698 if (!event.detail.canceled) {
21699 _this4._setChecked(event.index);
21700 _this4._postChange(event.index);
21701 }
21702 });
21703 }
21704 }, {
21705 key: "_postChange",
21706 value: function _postChange(index) {
21707 util$4.triggerElementEvent(this, 'postchange', {
21708 index: index,
21709 activeIndex: index,
21710 lastActiveIndex: this._lastActiveIndex,
21711 segmentItem: this.children[index]
21712 });
21713 this._lastActiveIndex = index;
21714 this.activeIndex = index;
21715 }
21716
21717 /**
21718 * @property disabled
21719 * @type {Boolean}
21720 * @description
21721 * [en]Whether the segment is disabled or not.[/en]
21722 * [ja]無効化されている場合に`true`。[/ja]
21723 */
21724 }, {
21725 key: "activeIndex",
21726 get: function get() {
21727 return parseInt(this.getAttribute('active-index'));
21728 },
21729 set: function set(value) {
21730 if (value !== null && value !== undefined) {
21731 this.setAttribute('active-index', value);
21732 }
21733 }
21734 }, {
21735 key: "attributeChangedCallback",
21736 value: function attributeChangedCallback(name, last, current) {
21737 var _this5 = this;
21738 switch (name) {
21739 case 'class':
21740 util$4.restoreClass(this, defaultClassName$5, scheme$7);
21741 break;
21742 case 'modifier':
21743 ModifierUtil.onModifierChanged(last, current, this, scheme$7);
21744 break;
21745 case 'active-index':
21746 contentReady(this, function () {
21747 if (_this5.getActiveButtonIndex() !== _this5.activeIndex) {
21748 _this5.setActiveButton(_this5.activeIndex);
21749 }
21750 });
21751 break;
21752 }
21753 }
21754 }], [{
21755 key: "observedAttributes",
21756 get: function get() {
21757 return ['class', 'modifier', 'active-index'];
21758 }
21759 }, {
21760 key: "events",
21761 get: function get() {
21762 return ['postchange'];
21763 }
21764 }]);
21765 return SegmentElement;
21766 }(BaseElement);
21767 util$4.defineBooleanProperties(SegmentElement, ['disabled']);
21768 onsElements.Segment = SegmentElement;
21769 customElements.define('ons-segment', SegmentElement);
21770
21771 var scheme$6 = {
21772 '': 'select-* select--*',
21773 '.select-input': 'select-input--*'
21774 };
21775 var defaultClassName$4 = 'select';
21776 var INPUT_ATTRIBUTES = ['autofocus', 'disabled', 'form', 'multiple', 'name', 'required', 'size'];
21777
21778 /**
21779 * @element ons-select
21780 * @category form
21781 * @modifier material
21782 * [en]Displays a Material Design select input.[/en]
21783 * [ja][/ja]
21784 * @modifier underbar
21785 * [en]Displays a horizontal line underneath a select input.[/en]
21786 * [ja][/ja]
21787 * @description
21788 * [en]
21789 * 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">`.
21790 *
21791 * The component will automatically display as a Material Design select on Android.
21792 *
21793 * Most attributes that can be used for a normal `<select>` element can also be used on the `<ons-select>` element.
21794 * [/en]
21795 * [ja]セレクトボックスを表示するコンポーネントです。`select` 要素に使用できる属性の多くが `ons-select` 要素でも利用できます。[/ja]
21796 * @codepen hLayx
21797 * @tutorial vanilla/Reference/select
21798 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
21799 * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
21800 * @example
21801 * <ons-select>
21802 * <option value="1">1</option>
21803 * <option value="2">2nd</option>
21804 * <option value="3">3rd option</option>
21805 * </ons-select>
21806 */
21807 var SelectElement = /*#__PURE__*/function (_BaseElement) {
21808 _inherits(SelectElement, _BaseElement);
21809 var _super = _createSuper(SelectElement);
21810 /**
21811 * @attribute autofocus
21812 * @type {Boolean}
21813 * @default false
21814 * @description
21815 * [en]Element automatically gains focus on page load.[/en]
21816 * [ja]ページロード時にこのセレクトボックスにフォーカスが移るようにします。[/ja]
21817 */
21818
21819 /**
21820 * @attribute disabled
21821 * @type {Boolean}
21822 * @default false
21823 * @description
21824 * [en]Specify if select input should be disabled.[/en]
21825 * [ja]このセレクトボックスを無効化する場合に指定します。[/ja]
21826 */
21827
21828 /**
21829 * @attribute form
21830 * @type {String}
21831 * @description
21832 * [en]Associate a select element to an existing form on the page, even if not nested.[/en]
21833 * [ja]このセレクトボックスを、指定した `form` 要素に紐付けます。セレクトボックスを `form` 要素の外側に配置する際に使用します。[/ja]
21834 */
21835
21836 /**
21837 * @attribute multiple
21838 * @type {Boolean}
21839 * @default false
21840 * @description
21841 * [en]If this attribute is defined, multiple options can be selected at once.[/en]
21842 * [ja]選択肢の複数選択を有効にします。[/ja]
21843 */
21844
21845 /**
21846 * @attribute name
21847 * @type {String}
21848 * @description
21849 * [en]Name the select element, useful for instance if it is part of a form.[/en]
21850 * [ja]このセレクトボックスの名前を指定します。通常 `form` 要素と共に使用します。[/ja]
21851 */
21852
21853 /**
21854 * @attribute required
21855 * @type {Boolean}
21856 * @description
21857 * [en]Make the select input required for submitting the form it is part of.[/en]
21858 * [ja]このセレクトボックスを入力必須にする場合に指定します。通常 `form` 要素と共に使用します。[/ja]
21859 */
21860
21861 /**
21862 * @attribute select-id
21863 * @type {String}
21864 * @description
21865 * [en]ID given to the inner select, useful for dynamic manipulation.[/en]
21866 * [ja]このセレクトボックスが内部に持つ select 要素に与える ID を指定します。セレクトボックスの内容を動的に変更する必要がある場合に使用します。[/ja]
21867 */
21868
21869 /**
21870 * @attribute size
21871 * @type {Number}
21872 * @default 1
21873 * @description
21874 * [en]How many options are displayed; if there are more than the size then a scroll appears to navigate them.[/en]
21875 * [ja]一度に表示する選択肢の個数を指定します。選択肢がこの属性で指定した個数よりも多い場合、スクロールが有効になります。[/ja]
21876 */
21877
21878 function SelectElement() {
21879 var _this;
21880 _classCallCheck(this, SelectElement);
21881 _this = _super.call(this);
21882 contentReady(_assertThisInitialized(_this), function () {
21883 return _this._compile();
21884 });
21885 _this._deriveGetters();
21886 return _this;
21887 }
21888 _createClass(SelectElement, [{
21889 key: "attributeChangedCallback",
21890 value: function attributeChangedCallback(name, last, current) {
21891 var _this2 = this;
21892 switch (name) {
21893 case 'class':
21894 util$4.restoreClass(this, defaultClassName$4, scheme$6);
21895 break;
21896 case 'modifier':
21897 ModifierUtil.onModifierChanged(last, current, this, scheme$6);
21898 break;
21899 }
21900 if (INPUT_ATTRIBUTES.indexOf(name) >= 0) {
21901 contentReady(this, function () {
21902 return _this2._updateBoundAttributes();
21903 });
21904 }
21905 }
21906 }, {
21907 key: "_select",
21908 get: function get() {
21909 return this.querySelector('select');
21910 }
21911 }, {
21912 key: "_updateBoundAttributes",
21913 value: function _updateBoundAttributes() {
21914 var _this3 = this;
21915 INPUT_ATTRIBUTES.forEach(function (attr) {
21916 if (_this3.hasAttribute(attr)) {
21917 _this3._select.setAttribute(attr, _this3.getAttribute(attr));
21918 } else {
21919 _this3._select.removeAttribute(attr);
21920 }
21921 });
21922 }
21923
21924 /**
21925 * @property length
21926 * @description
21927 * [en]Number of options in the select box.[/en]
21928 * [ja]このセレクトボックスに含まれる選択肢の個数を返します。 `select` 要素[/ja]
21929 */
21930
21931 /**
21932 * @property options
21933 * @description
21934 * [en]Several options for handling the select DOM object.[/en]
21935 * [ja]このセレクトボックスに含まれる `option` 要素の配列を返します。[/ja]
21936 */
21937
21938 /**
21939 * @property selectedIndex
21940 * @description
21941 * [en]Index of the currently selected option.[/en]
21942 * [ja]現在選択されている選択肢のインデックスを返します。[/ja]
21943 */
21944
21945 /**
21946 * @property value
21947 * @description
21948 * [en]Value of the currently selected option.[/en]
21949 * [ja]現在選択されている選択肢の値を返します。[/ja]
21950 */
21951 }, {
21952 key: "_compile",
21953 value: function _compile() {
21954 autoStyle.prepare(this);
21955 this.classList.add(defaultClassName$4);
21956 var sel = this._select || document.createElement('select');
21957 if (!sel.id && this.hasAttribute('select-id')) {
21958 sel.id = this.getAttribute('select-id');
21959 }
21960 sel.classList.add('select-input');
21961 if (!this._select) {
21962 util$4.arrayFrom(this.childNodes).forEach(function (element) {
21963 return sel.appendChild(element);
21964 });
21965 this.appendChild(sel);
21966 }
21967 ModifierUtil.initModifier(this, scheme$6);
21968 }
21969 }, {
21970 key: "_deriveGetters",
21971 value: function _deriveGetters() {
21972 var _this4 = this;
21973 ['disabled', 'length', 'multiple', 'name', 'options', 'selectedIndex', 'size', 'value', 'form', 'type'].forEach(function (key) {
21974 Object.defineProperty(_this4, key, {
21975 configurable: true,
21976 enumerable: true,
21977 get: function get() {
21978 return _this4._select[key];
21979 },
21980 set: ['form', 'type'].indexOf(key) === -1 ? function (value) {
21981 return contentReady(_this4, function () {
21982 return _this4._select[key] = value;
21983 });
21984 } : undefined
21985 });
21986 });
21987 }
21988 }, {
21989 key: "add",
21990 value: function add(option) {
21991 var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
21992 this._select.add(option, index);
21993 }
21994
21995 // If called with an index argument, removes the option element with the given index.
21996 // If called with no arguments, removes this.
21997 // This behaviour might sound crazy but it is the same as <select>'s `remove` method.
21998 // https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/remove
21999 }, {
22000 key: "remove",
22001 value: function remove(index) {
22002 if (index === undefined) {
22003 Element.prototype.remove.call(this);
22004 } else {
22005 this._select.remove(index);
22006 }
22007 }
22008 }], [{
22009 key: "observedAttributes",
22010 get: function get() {
22011 return ['modifier', 'class'].concat(INPUT_ATTRIBUTES);
22012 }
22013 }]);
22014 return SelectElement;
22015 }(BaseElement);
22016 onsElements.Select = SelectElement;
22017 customElements.define('ons-select', SelectElement);
22018
22019 var defaultClassName$3 = 'fab fab--mini speed-dial__item';
22020 var scheme$5 = {
22021 '': 'fab--* speed-dial__item--*'
22022 };
22023
22024 /**
22025 * @element ons-speed-dial-item
22026 * @category control
22027 * @description
22028 * [en]
22029 * This component displays the child elements of the Material Design Speed dial component.
22030 * [/en]
22031 * [ja]
22032 * Material DesignのSpeed dialの子要素を表現する要素です。
22033 * [/ja]
22034 * @codepen dYQYLg
22035 * @tutorial vanilla/Reference/speed-dial
22036 * @seealso ons-speed-dial
22037 * [en]The `<ons-speed-dial>` component.[/en]
22038 * [ja]ons-speed-dialコンポーネント[/ja]
22039 * @seealso ons-fab
22040 * [en]ons-fab component[/en]
22041 * [ja]ons-fabコンポーネント[/ja]
22042 * @example
22043 * <ons-speed-dial position="left bottom">
22044 * <ons-fab>
22045 * <ons-icon icon="fa-twitter"></ons-icon>
22046 * </ons-fab>
22047 * <ons-speed-dial-item>A</ons-speed-dial-item>
22048 * <ons-speed-dial-item>B</ons-speed-dial-item>
22049 * <ons-speed-dial-item>C</ons-speed-dial-item>
22050 * </ons-speed-dial>
22051 */
22052 var SpeedDialItemElement = /*#__PURE__*/function (_BaseElement) {
22053 _inherits(SpeedDialItemElement, _BaseElement);
22054 var _super = _createSuper(SpeedDialItemElement);
22055 /**
22056 * @attribute modifier
22057 * @type {String}
22058 * @description
22059 * [en]The appearance of the component.[/en]
22060 * [ja]このコンポーネントの表現を指定します。[/ja]
22061 */
22062
22063 /**
22064 * @attribute ripple
22065 * @description
22066 * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
22067 * [ja][/ja]
22068 */
22069
22070 /**
22071 * @property ripple
22072 * @type {Boolean}
22073 * @description
22074 * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
22075 * [ja][/ja]
22076 */
22077
22078 function SpeedDialItemElement() {
22079 var _this;
22080 _classCallCheck(this, SpeedDialItemElement);
22081 _this = _super.call(this);
22082 _this._compile();
22083 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
22084 return _this;
22085 }
22086 _createClass(SpeedDialItemElement, [{
22087 key: "attributeChangedCallback",
22088 value: function attributeChangedCallback(name, last, current) {
22089 switch (name) {
22090 case 'class':
22091 util$4.restoreClass(this, defaultClassName$3, scheme$5);
22092 break;
22093 case 'modifier':
22094 ModifierUtil.onModifierChanged(last, current, this, scheme$5);
22095 util$4.addModifier(this, 'mini');
22096 break;
22097 case 'ripple':
22098 this._updateRipple();
22099 }
22100 }
22101 }, {
22102 key: "connectedCallback",
22103 value: function connectedCallback() {
22104 this.addEventListener('click', this._boundOnClick, false);
22105 }
22106 }, {
22107 key: "disconnectedCallback",
22108 value: function disconnectedCallback() {
22109 this.removeEventListener('click', this._boundOnClick, false);
22110 }
22111 }, {
22112 key: "_updateRipple",
22113 value: function _updateRipple() {
22114 util$4.updateRipple(this);
22115 }
22116 }, {
22117 key: "_onClick",
22118 value: function _onClick(e) {
22119 e.stopPropagation();
22120 }
22121 }, {
22122 key: "_compile",
22123 value: function _compile() {
22124 var _this2 = this;
22125 autoStyle.prepare(this);
22126 defaultClassName$3.split(/\s+/).forEach(function (token) {
22127 return _this2.classList.add(token);
22128 });
22129 util$4.addModifier(this, 'mini');
22130 this._updateRipple();
22131 ModifierUtil.initModifier(this, scheme$5);
22132 }
22133 }], [{
22134 key: "observedAttributes",
22135 get: function get() {
22136 return ['modifier', 'ripple', 'class'];
22137 }
22138 }]);
22139 return SpeedDialItemElement;
22140 }(BaseElement);
22141 util$4.defineBooleanProperties(SpeedDialItemElement, ['ripple']);
22142 onsElements.SpeedDialItem = SpeedDialItemElement;
22143 customElements.define('ons-speed-dial-item', SpeedDialItemElement);
22144
22145 var defaultClassName$2 = 'speed-dial';
22146 var scheme$4 = {
22147 '': 'speed-dial--*'
22148 };
22149
22150 /**
22151 * @element ons-speed-dial
22152 * @category control
22153 * @description
22154 * [en]
22155 * 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.
22156 *
22157 * The Speed dial looks like a `<ons-fab>` element but will expand a menu when tapped.
22158 * [/en]
22159 * [ja][/ja]
22160 * @codepen dYQYLg
22161 * @tutorial vanilla/Reference/speed-dial
22162 * @seealso ons-speed-dial-item
22163 * [en]The `<ons-speed-dial-item>` represents a menu item.[/en]
22164 * [ja]ons-speed-dial-itemコンポーネント[/ja]
22165 * @seealso ons-fab
22166 * [en]ons-fab component[/en]
22167 * [ja]ons-fabコンポーネント[/ja]
22168 * @example
22169 * <ons-speed-dial position="left bottom">
22170 * <ons-fab>
22171 * <ons-icon icon="fa-twitter"></ons-icon>
22172 * </ons-fab>
22173 * <ons-speed-dial-item>A</ons-speed-dial-item>
22174 * <ons-speed-dial-item>B</ons-speed-dial-item>
22175 * <ons-speed-dial-item>C</ons-speed-dial-item>
22176 * </ons-speed-dial>
22177 */
22178 var SpeedDialElement = /*#__PURE__*/function (_BaseElement) {
22179 _inherits(SpeedDialElement, _BaseElement);
22180 var _super = _createSuper(SpeedDialElement);
22181 /**
22182 * @event open
22183 * @description
22184 * [en]Fired when the menu items are shown.[/en]
22185 * [ja][/ja]
22186 */
22187
22188 /**
22189 * @event close
22190 * @description
22191 * [en]Fired when the menu items are hidden.[/en]
22192 * [ja][/ja]
22193 */
22194
22195 /**
22196 * @attribute modifier
22197 * @type {String}
22198 * @description
22199 * [en]The appearance of the component.[/en]
22200 * [ja]このコンポーネントの表現を指定します。[/ja]
22201 */
22202
22203 /**
22204 * @attribute ripple
22205 * @description
22206 * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
22207 * [ja][/ja]
22208 */
22209
22210 /**
22211 * @property ripple
22212 * @type {Boolean}
22213 * @description
22214 * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
22215 * [ja][/ja]
22216 */
22217
22218 /**
22219 * @attribute position
22220 * @type {String}
22221 * @description
22222 * [en]
22223 * Specify the vertical and horizontal position of the component.
22224 * I.e. to display it in the top right corner specify "right top".
22225 * Choose from "right", "left", "top" and "bottom".
22226 * [/en]
22227 * [ja]
22228 * この要素を表示する左右と上下の位置を指定します。
22229 * 例えば、右上に表示する場合には"right top"を指定します。
22230 * 左右と上下の位置の指定には、rightとleft、topとbottomがそれぞれ指定できます。
22231 * [/ja]
22232 */
22233
22234 /**
22235 * @attribute direction
22236 * @type {String}
22237 * @description
22238 * [en]Specify the direction the items are displayed. Possible values are "up", "down", "left" and "right".[/en]
22239 * [ja]
22240 * 要素が表示する方向を指定します。up, down, left, rightが指定できます。
22241 * [/ja]
22242 */
22243
22244 /**
22245 * @attribute disabled
22246 * @description
22247 * [en]Specify if button should be disabled.[/en]
22248 * [ja]無効化する場合に指定します。[/ja]
22249 */
22250
22251 function SpeedDialElement() {
22252 var _this;
22253 _classCallCheck(this, SpeedDialElement);
22254 _this = _super.call(this);
22255 contentReady(_assertThisInitialized(_this), function () {
22256 _this._compile();
22257 });
22258 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
22259 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
22260 onConnected = _util$defineListenerP.onConnected,
22261 onDisconnected = _util$defineListenerP.onDisconnected;
22262 _this._connectOnClick = onConnected;
22263 _this._disconnectOnClick = onDisconnected;
22264 return _this;
22265 }
22266 _createClass(SpeedDialElement, [{
22267 key: "_compile",
22268 value: function _compile() {
22269 this.classList.add(defaultClassName$2);
22270 autoStyle.prepare(this);
22271 this._updateRipple();
22272 ModifierUtil.initModifier(this, scheme$4);
22273 if (this.hasAttribute('direction')) {
22274 this._updateDirection(this.getAttribute('direction'));
22275 } else {
22276 this._updateDirection('up');
22277 }
22278 this._updatePosition();
22279 }
22280 }, {
22281 key: "attributeChangedCallback",
22282 value: function attributeChangedCallback(name, last, current) {
22283 var _this2 = this;
22284 switch (name) {
22285 case 'class':
22286 util$4.restoreClass(this, defaultClassName$2, scheme$4);
22287 break;
22288 case 'modifier':
22289 ModifierUtil.onModifierChanged(last, current, this, scheme$4);
22290 break;
22291 case 'ripple':
22292 contentReady(this, function () {
22293 return _this2._updateRipple();
22294 });
22295 break;
22296 case 'direction':
22297 contentReady(this, function () {
22298 return _this2._updateDirection(current);
22299 });
22300 break;
22301 case 'position':
22302 contentReady(this, function () {
22303 return _this2._updatePosition();
22304 });
22305 break;
22306 case 'open':
22307 if (!this._ignoreOpenSideEffect) {
22308 contentReady(this, function () {
22309 return _this2._updateOpen(last);
22310 });
22311 }
22312 break;
22313 }
22314 }
22315 }, {
22316 key: "connectedCallback",
22317 value: function connectedCallback() {
22318 this.addEventListener('click', this._boundOnClick, false);
22319 this._connectOnClick();
22320 }
22321 }, {
22322 key: "disconnectedCallback",
22323 value: function disconnectedCallback() {
22324 this.removeEventListener('click', this._boundOnClick, false);
22325 this._disconnectOnClick();
22326 }
22327 }, {
22328 key: "items",
22329 get: function get() {
22330 return util$4.arrayFrom(this.querySelectorAll('ons-speed-dial-item'));
22331 }
22332 }, {
22333 key: "_fab",
22334 get: function get() {
22335 return util$4.findChild(this, 'ons-fab');
22336 }
22337 }, {
22338 key: "_onClick",
22339 value: function _onClick(event) {
22340 var _this3 = this;
22341 setTimeout(function () {
22342 if (!event.defaultPrevented && !_this3.disabled && _this3.visible) {
22343 return _this3.toggleItems();
22344 }
22345 });
22346 }
22347 }, {
22348 key: "_show",
22349 value: function _show() {
22350 if (!this.inline) {
22351 return this.show();
22352 }
22353 return Promise.resolve();
22354 }
22355 }, {
22356 key: "_hide",
22357 value: function _hide() {
22358 var _this4 = this;
22359 return new Promise(function (resolve) {
22360 if (!_this4.inline) {
22361 setImmediate(function () {
22362 return _this4.hide().then(resolve);
22363 });
22364 } else {
22365 resolve();
22366 }
22367 });
22368 }
22369 }, {
22370 key: "_updateRipple",
22371 value: function _updateRipple() {
22372 if (this._fab) {
22373 this.hasAttribute('ripple') ? this._fab.setAttribute('ripple', '') : this._fab.removeAttribute('ripple');
22374 }
22375 }
22376 }, {
22377 key: "_updateDirection",
22378 value: function _updateDirection(direction) {
22379 var children = this.items;
22380 for (var i = 0; i < children.length; i++) {
22381 styler(children[i], {
22382 transitionDelay: 25 * i + 'ms',
22383 bottom: 'auto',
22384 right: 'auto',
22385 top: 'auto',
22386 left: 'auto'
22387 });
22388 }
22389 switch (direction) {
22390 case 'up':
22391 for (var _i = 0; _i < children.length; _i++) {
22392 children[_i].style.bottom = 72 + 56 * _i + 'px';
22393 children[_i].style.right = '8px';
22394 }
22395 break;
22396 case 'down':
22397 for (var _i2 = 0; _i2 < children.length; _i2++) {
22398 children[_i2].style.top = 72 + 56 * _i2 + 'px';
22399 children[_i2].style.left = '8px';
22400 }
22401 break;
22402 case 'left':
22403 for (var _i3 = 0; _i3 < children.length; _i3++) {
22404 children[_i3].style.top = '8px';
22405 children[_i3].style.right = 72 + 56 * _i3 + 'px';
22406 }
22407 break;
22408 case 'right':
22409 for (var _i4 = 0; _i4 < children.length; _i4++) {
22410 children[_i4].style.top = '8px';
22411 children[_i4].style.left = 72 + 56 * _i4 + 'px';
22412 }
22413 break;
22414 default:
22415 util$4.throw('Argument must be one of up, down, left or right.');
22416 }
22417 }
22418 }, {
22419 key: "_updatePosition",
22420 value: function _updatePosition() {
22421 var position = this.getAttribute('position');
22422 this.classList.remove('fab--top__left', 'fab--bottom__right', 'fab--bottom__left', 'fab--top__right', 'fab--top__center', 'fab--bottom__center');
22423 switch (position) {
22424 case 'top right':
22425 case 'right top':
22426 this.classList.add('fab--top__right');
22427 break;
22428 case 'top left':
22429 case 'left top':
22430 this.classList.add('fab--top__left');
22431 break;
22432 case 'bottom right':
22433 case 'right bottom':
22434 this.classList.add('fab--bottom__right');
22435 break;
22436 case 'bottom left':
22437 case 'left bottom':
22438 this.classList.add('fab--bottom__left');
22439 break;
22440 case 'center top':
22441 case 'top center':
22442 this.classList.add('fab--top__center');
22443 break;
22444 case 'center bottom':
22445 case 'bottom center':
22446 this.classList.add('fab--bottom__center');
22447 break;
22448 }
22449 }
22450 }, {
22451 key: "_getTranslate",
22452 value: function _getTranslate() {
22453 var isBottom = (this.getAttribute('position') || '').indexOf('bottom') >= 0;
22454 var translate = isBottom ? "translate3d(0px, -".concat(util$4.globals.fabOffset || 0, "px, 0px) ") : '';
22455 return translate;
22456 }
22457
22458 /**
22459 * @method show
22460 * @signature show()
22461 * @description
22462 * [en]Show the speed dial.[/en]
22463 * [ja]Speed dialを表示します。[/ja]
22464 */
22465 }, {
22466 key: "show",
22467 value: function show() {
22468 this._fab.show();
22469 styler(this, {
22470 transform: this._getTranslate
22471 });
22472 return Promise.resolve();
22473 }
22474
22475 /**
22476 * @method hide
22477 * @signature hide()
22478 * @description
22479 * [en]Hide the speed dial.[/en]
22480 * [ja]Speed dialを非表示にします。[/ja]
22481 */
22482 }, {
22483 key: "hide",
22484 value: function hide() {
22485 var _this5 = this;
22486 return this.hideItems().then(function () {
22487 return _this5._fab.hide();
22488 });
22489 }
22490
22491 /**
22492 * @method showItems
22493 * @signature showItems()
22494 * @description
22495 * [en]Show the speed dial items.[/en]
22496 * [ja]Speed dialの子要素を表示します。[/ja]
22497 */
22498 }, {
22499 key: "showItems",
22500 value: function showItems() {
22501 var last = this.open;
22502 this._ignoreOpenSideEffect = true;
22503 this.open = true;
22504 this._ignoreOpenSideEffect = false;
22505 return this._updateOpen(last);
22506 }
22507
22508 /**
22509 * @method hideItems
22510 * @signature hideItems()
22511 * @description
22512 * [en]Hide the speed dial items.[/en]
22513 * [ja]Speed dialの子要素を非表示にします。[/ja]
22514 */
22515 }, {
22516 key: "hideItems",
22517 value: function hideItems() {
22518 var last = this.open;
22519 this._ignoreOpenSideEffect = true;
22520 this.open = false;
22521 this._ignoreOpenSideEffect = false;
22522 return this._updateOpen(last);
22523 }
22524 }, {
22525 key: "_updateOpen",
22526 value: function _updateOpen(last) {
22527 // update direction
22528 if (this.open) {
22529 if (this.hasAttribute('direction')) {
22530 this._updateDirection(this.getAttribute('direction'));
22531 } else {
22532 this._updateDirection('up');
22533 }
22534 }
22535 var totalDelay = 0;
22536 if (last !== this.open) {
22537 // do nothing if already open/closed
22538 var children = this.items;
22539 for (var i = 0; i < children.length; i++) {
22540 var delay = 25 * (this.open ? i : children.length - i);
22541 totalDelay += delay;
22542 styler(children[i], {
22543 transform: "scale(".concat(this.open ? 1 : 0, ")"),
22544 transitionDelay: delay + 'ms'
22545 });
22546 }
22547 totalDelay += 50;
22548 util$4.triggerElementEvent(this, this.open ? 'open' : 'close');
22549 }
22550 var deferred = util$4.defer();
22551 setTimeout(deferred.resolve, totalDelay);
22552 return deferred.promise;
22553 }
22554
22555 /**
22556 * @property disabled
22557 * @type {Boolean}
22558 * @description
22559 * [en]Whether the element is disabled or not.[/en]
22560 * [ja]無効化されている場合に`true`。[/ja]
22561 */
22562 }, {
22563 key: "disabled",
22564 get: function get() {
22565 return this.hasAttribute('disabled');
22566 }
22567
22568 /**
22569 * @property inline
22570 * @readonly
22571 * @type {Boolean}
22572 * @description
22573 * [en]Whether the element is inline or not.[/en]
22574 * [ja]インライン要素の場合に`true`。[/ja]
22575 */,
22576 set: function set(value) {
22577 if (value) {
22578 this.hideItems();
22579 }
22580 util$4.arrayFrom(this.children).forEach(function (e) {
22581 util$4.match(e, '.fab') && util$4.toggleAttribute(e, 'disabled', value);
22582 });
22583 util$4.toggleAttribute(this, 'disabled', value);
22584 }
22585 }, {
22586 key: "inline",
22587 get: function get() {
22588 return this.hasAttribute('inline');
22589 }
22590
22591 /**
22592 * @property visible
22593 * @readonly
22594 * @type {Boolean}
22595 * @description
22596 * [en]Whether the element is visible or not.[/en]
22597 * [ja]要素が見える場合に`true`。[/ja]
22598 */
22599 }, {
22600 key: "visible",
22601 get: function get() {
22602 return this._fab && this._fab.visible && this.style.display !== 'none';
22603 }
22604
22605 /**
22606 * @method isOpen
22607 * @signature isOpen()
22608 * @description
22609 * [en]Returns whether the menu is open or not.[/en]
22610 * [ja][/ja]
22611 */
22612 }, {
22613 key: "isOpen",
22614 value: function isOpen() {
22615 return this.open;
22616 }
22617
22618 /**
22619 * @attribute open
22620 * @type {Boolean}
22621 * @description
22622 * [en]Returns whether the menu is open or not.[/en]
22623 * [ja][/ja]
22624 */
22625
22626 /**
22627 * @property open
22628 * @type {Boolean}
22629 * @description
22630 * [en]Returns whether the menu is open or not.[/en]
22631 * [ja][/ja]
22632 */
22633
22634 /**
22635 * @method toggle
22636 * @signature toggle()
22637 * @description
22638 * [en]Toggle visibility.[/en]
22639 * [ja]Speed dialの表示非表示を切り替えます。[/ja]
22640 */
22641 }, {
22642 key: "toggle",
22643 value: function toggle() {
22644 return this.visible ? this.hide() : this.show();
22645 }
22646
22647 /**
22648 * @method toggleItems
22649 * @signature toggleItems()
22650 * @description
22651 * [en]Toggle item visibility.[/en]
22652 * [ja]Speed dialの子要素の表示非表示を切り替えます。[/ja]
22653 */
22654 }, {
22655 key: "toggleItems",
22656 value: function toggleItems() {
22657 return this.open ? this.hideItems() : this.showItems();
22658 }
22659 }], [{
22660 key: "observedAttributes",
22661 get: function get() {
22662 return ['class', 'modifier', 'ripple', 'direction', 'position', 'open'];
22663 }
22664 }, {
22665 key: "events",
22666 get: function get() {
22667 return ['open', 'close'];
22668 }
22669 }]);
22670 return SpeedDialElement;
22671 }(BaseElement);
22672 util$4.defineBooleanProperties(SpeedDialElement, ['open', 'ripple']);
22673 onsElements.SpeedDial = SpeedDialElement;
22674 customElements.define('ons-speed-dial', SpeedDialElement);
22675
22676 var rewritables$2 = {
22677 /**
22678 * @param {Element} element
22679 * @param {Function} callback
22680 */
22681 ready: function ready(element, callback) {
22682 setImmediate(callback);
22683 }
22684 };
22685
22686 /**
22687 * @element ons-splitter-content
22688 * @category menu
22689 * @description
22690 * [en]
22691 * The `<ons-splitter-content>` element is used as a child element of `<ons-splitter>`.
22692 *
22693 * It contains the main content of the page while `<ons-splitter-side>` contains the list.
22694 * [/en]
22695 * [ja]ons-splitter-content要素は、ons-splitter要素の子要素として利用します。[/ja]
22696 * @codepen rOQOML
22697 * @tutorial vanilla/Reference/splitter
22698 * @guide fundamentals.html#managing-pages
22699 * [en]Managing multiple pages.[/en]
22700 * [ja]複数のページを管理する[/ja]
22701 * @seealso ons-splitter
22702 * [en]The `<ons-splitter>` component is the parent element.[/en]
22703 * [ja]ons-splitterコンポーネント[/ja]
22704 * @seealso ons-splitter-side
22705 * [en]The `<ons-splitter-side>` component contains the menu.[/en]
22706 * [ja]ons-splitter-sideコンポーネント[/ja]
22707 * @example
22708 * <ons-splitter>
22709 * <ons-splitter-content>
22710 * ...
22711 * </ons-splitter-content>
22712 *
22713 * <ons-splitter-side side="left" width="80%" collapse>
22714 * ...
22715 * </ons-splitter-side>
22716 * </ons-splitter>
22717 */
22718 var SplitterContentElement = /*#__PURE__*/function (_BaseElement) {
22719 _inherits(SplitterContentElement, _BaseElement);
22720 var _super = _createSuper(SplitterContentElement);
22721 /**
22722 * @attribute page
22723 * @type {String}
22724 * @description
22725 * [en]
22726 * The url of the content page. If this attribute is used the content will be loaded from a `<template>` tag or a remote file.
22727 *
22728 * It is also possible to put `<ons-page>` element as a child of the element.
22729 * [/en]
22730 * [ja]ons-splitter-content要素に表示するページのURLを指定します。[/ja]
22731 */
22732
22733 function SplitterContentElement() {
22734 var _this;
22735 _classCallCheck(this, SplitterContentElement);
22736 _this = _super.call(this);
22737 _this._page = null;
22738 _this._pageLoader = defaultPageLoader;
22739 contentReady(_assertThisInitialized(_this), function () {
22740 rewritables$2.ready(_assertThisInitialized(_this), function () {
22741 var page = _this._getPageTarget();
22742 if (page) {
22743 _this.load(page);
22744 }
22745 });
22746 });
22747 return _this;
22748 }
22749 _createClass(SplitterContentElement, [{
22750 key: "connectedCallback",
22751 value: function connectedCallback() {
22752 if (!util$4.match(this.parentNode, 'ons-splitter')) {
22753 util$4.throw('"ons-splitter-content" must have "ons-splitter" as parent');
22754 }
22755 }
22756 }, {
22757 key: "_getPageTarget",
22758 value: function _getPageTarget() {
22759 return this._page || this.getAttribute('page');
22760 }
22761 }, {
22762 key: "disconnectedCallback",
22763 value: function disconnectedCallback() {}
22764 }, {
22765 key: "attributeChangedCallback",
22766 value: function attributeChangedCallback(name, last, current) {}
22767
22768 /**
22769 * @property page
22770 * @type {HTMLElement}
22771 * @description
22772 * [en]The page to load in the splitter content.[/en]
22773 * [ja]この要素内に表示するページを指定します。[/ja]
22774 */
22775 }, {
22776 key: "page",
22777 get: function get() {
22778 return this._page;
22779 }
22780
22781 /**
22782 * @param {*} page
22783 */,
22784 set: function set(page) {
22785 this._page = page;
22786 }
22787 }, {
22788 key: "_content",
22789 get: function get() {
22790 return this.children[0];
22791 }
22792
22793 /**
22794 * @property pageLoader
22795 * @type {Function}
22796 * @description
22797 * [en]Page element loaded in the splitter content.[/en]
22798 * [ja]この要素内に表示するページを指定します。[/ja]
22799 */
22800 }, {
22801 key: "pageLoader",
22802 get: function get() {
22803 return this._pageLoader;
22804 },
22805 set: function set(loader) {
22806 if (!(loader instanceof PageLoader)) {
22807 util$4.throwPageLoader();
22808 }
22809 this._pageLoader = loader;
22810 }
22811
22812 /**
22813 * @method load
22814 * @signature load(page, [options])
22815 * @param {String} page, [options]
22816 * [en]Page URL. Can be either an HTML document or an `<template>` id.[/en]
22817 * [ja]pageのURLか、`<template>`で宣言したテンプレートのid属性の値を指定します。[/ja]
22818 * @param {Object} [options]
22819 * @param {Function} [options.callback]
22820 * @description
22821 * [en]Show the page specified in `page` in the content.[/en]
22822 * [ja]指定したURLをメインページを読み込みます。[/ja]
22823 * @return {Promise}
22824 * [en]Resolves to the new `<ons-page>` element[/en]
22825 * [ja]`<ons-page>`要素を解決するPromiseオブジェクトを返します。[/ja]
22826 */
22827 }, {
22828 key: "load",
22829 value: function load(page) {
22830 var _this2 = this;
22831 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
22832 this._page = page;
22833 var callback = options.callback || function () {};
22834 return new Promise(function (resolve) {
22835 var oldContent = _this2._content || null;
22836 _this2._pageLoader.load({
22837 page: page,
22838 parent: _this2
22839 }, function (pageElement) {
22840 if (oldContent) {
22841 _this2._pageLoader.unload(oldContent);
22842 oldContent = null;
22843 }
22844 setImmediate(function () {
22845 return _this2._show();
22846 });
22847 callback(pageElement);
22848 resolve(pageElement);
22849 });
22850 });
22851 }
22852 }, {
22853 key: "_show",
22854 value: function _show() {
22855 if (this._content) {
22856 this._content._show();
22857 }
22858 }
22859 }, {
22860 key: "_hide",
22861 value: function _hide() {
22862 if (this._content) {
22863 this._content._hide();
22864 }
22865 }
22866 }, {
22867 key: "_destroy",
22868 value: function _destroy() {
22869 if (this._content) {
22870 this._pageLoader.unload(this._content);
22871 }
22872 this.remove();
22873 }
22874 }], [{
22875 key: "observedAttributes",
22876 get: function get() {
22877 return [];
22878 }
22879 }, {
22880 key: "rewritables",
22881 get: function get() {
22882 return rewritables$2;
22883 }
22884 }]);
22885 return SplitterContentElement;
22886 }(BaseElement);
22887 onsElements.SplitterContent = SplitterContentElement;
22888 customElements.define('ons-splitter-content', SplitterContentElement);
22889
22890 var SplitterMaskElement = /*#__PURE__*/function (_BaseElement) {
22891 _inherits(SplitterMaskElement, _BaseElement);
22892 var _super = _createSuper(SplitterMaskElement);
22893 function SplitterMaskElement() {
22894 var _this;
22895 _classCallCheck(this, SplitterMaskElement);
22896 _this = _super.call(this);
22897 _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
22898 contentReady(_assertThisInitialized(_this), function () {
22899 if (_this.parentNode._sides.every(function (side) {
22900 return side.mode === 'split';
22901 })) {
22902 _this.setAttribute('style', 'display: none !important');
22903 }
22904 });
22905 return _this;
22906 }
22907 _createClass(SplitterMaskElement, [{
22908 key: "_onClick",
22909 value: function _onClick(event) {
22910 if (this.onClick instanceof Function) {
22911 this.onClick();
22912 } else if (util$4.match(this.parentNode, 'ons-splitter')) {
22913 this.parentNode._sides.forEach(function (side) {
22914 return side.close('left').catch(function () {});
22915 });
22916 }
22917 event.stopPropagation();
22918 }
22919 }, {
22920 key: "attributeChangedCallback",
22921 value: function attributeChangedCallback(name, last, current) {}
22922 }, {
22923 key: "connectedCallback",
22924 value: function connectedCallback() {
22925 this.addEventListener('click', this._boundOnClick);
22926 }
22927 }, {
22928 key: "disconnectedCallback",
22929 value: function disconnectedCallback() {
22930 this.removeEventListener('click', this._boundOnClick);
22931 }
22932 }], [{
22933 key: "observedAttributes",
22934 get: function get() {
22935 return [];
22936 }
22937 }]);
22938 return SplitterMaskElement;
22939 }(BaseElement);
22940 onsElements.SplitterMask = SplitterMaskElement;
22941 customElements.define('ons-splitter-mask', SplitterMaskElement);
22942
22943 var SplitterAnimator$1 = /*#__PURE__*/function (_BaseAnimator) {
22944 _inherits(SplitterAnimator, _BaseAnimator);
22945 var _super = _createSuper(SplitterAnimator);
22946 function SplitterAnimator() {
22947 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
22948 _ref$timing = _ref.timing,
22949 timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
22950 _ref$duration = _ref.duration,
22951 duration = _ref$duration === void 0 ? 0.3 : _ref$duration,
22952 _ref$delay = _ref.delay,
22953 delay = _ref$delay === void 0 ? 0 : _ref$delay;
22954 _classCallCheck(this, SplitterAnimator);
22955 return _super.call(this, {
22956 timing: timing,
22957 duration: duration,
22958 delay: delay
22959 });
22960 }
22961 _createClass(SplitterAnimator, [{
22962 key: "updateOptions",
22963 value: function updateOptions() {
22964 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
22965 util$4.extend(this, {
22966 timing: this.timing,
22967 duration: this.duration,
22968 delay: this.delay
22969 }, options);
22970 }
22971
22972 /**
22973 * @param {Element} sideElement
22974 */
22975 }, {
22976 key: "activate",
22977 value: function activate(sideElement) {
22978 var _this = this;
22979 var splitter = sideElement.parentNode;
22980 contentReady(splitter, function () {
22981 _this._side = sideElement;
22982 _this._oppositeSide = splitter.right !== sideElement && splitter.right || splitter.left !== sideElement && splitter.left;
22983 _this._content = splitter.content;
22984 _this._mask = splitter.mask;
22985 });
22986 }
22987 }, {
22988 key: "deactivate",
22989 value: function deactivate() {
22990 this.clearTransition();
22991 this._mask && this.clearMask();
22992 this._content = this._side = this._oppositeSide = this._mask = null;
22993 }
22994 }, {
22995 key: "minus",
22996 get: function get() {
22997 return this._side.side === 'right' ? '-' : '';
22998 }
22999 }, {
23000 key: "clearTransition",
23001 value: function clearTransition() {
23002 var _this2 = this;
23003 'side mask content'.split(/\s+/).forEach(function (e) {
23004 return _this2['_' + e] && styler.clear(_this2['_' + e], 'transform transition');
23005 });
23006 }
23007 }, {
23008 key: "clearMask",
23009 value: function clearMask() {
23010 // Check if the other side needs the mask before clearing
23011 if (!this._oppositeSide || this._oppositeSide.mode === 'split' || !this._oppositeSide.isOpen) {
23012 this._mask.style.opacity = '';
23013 this._mask.style.display = 'none';
23014 }
23015 }
23016
23017 /**
23018 * @param {Number} distance
23019 */
23020 }, {
23021 key: "translate",
23022 value: function translate(distance) {}
23023
23024 /**
23025 * @param {Function} done
23026 */
23027 }, {
23028 key: "open",
23029 value: function open(done) {
23030 done();
23031 }
23032
23033 /**
23034 * @param {Function} done
23035 */
23036 }, {
23037 key: "close",
23038 value: function close(done) {
23039 done();
23040 }
23041 }]);
23042 return SplitterAnimator;
23043 }(BaseAnimator);
23044
23045 var OverlaySplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
23046 _inherits(OverlaySplitterAnimator, _SplitterAnimator);
23047 var _super = _createSuper(OverlaySplitterAnimator);
23048 function OverlaySplitterAnimator() {
23049 _classCallCheck(this, OverlaySplitterAnimator);
23050 return _super.apply(this, arguments);
23051 }
23052 _createClass(OverlaySplitterAnimator, [{
23053 key: "translate",
23054 value: function translate(distance) {
23055 this._mask.style.display = 'block'; // Avoid content clicks
23056
23057 Animit(this._side).queue({
23058 transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
23059 }).play();
23060 }
23061
23062 /**
23063 * @param {Function} done
23064 */
23065 }, {
23066 key: "open",
23067 value: function open(done) {
23068 Animit.runAll(Animit(this._side).wait(this.delay).queue({
23069 transform: "translate3d(".concat(this.minus, "100%, 0, 0)")
23070 }, this.def).queue(function (callback) {
23071 callback();
23072 done && done();
23073 }), Animit(this._mask).wait(this.delay).queue({
23074 display: 'block'
23075 }).queue({
23076 opacity: '1'
23077 }, {
23078 duration: this.duration,
23079 timing: 'linear'
23080 }));
23081 }
23082
23083 /**
23084 * @param {Function} done
23085 */
23086 }, {
23087 key: "close",
23088 value: function close(done) {
23089 Animit.runAll(Animit(this._side).wait(this.delay).queue({
23090 transform: 'translate3d(0, 0, 0)'
23091 }, this.def).queue(function (callback) {
23092 done && done();
23093 callback();
23094 }), Animit(this._mask).wait(this.delay).queue({
23095 opacity: '0'
23096 }, {
23097 duration: this.duration,
23098 timing: 'linear'
23099 }).queue({
23100 display: 'none'
23101 }));
23102 }
23103 }]);
23104 return OverlaySplitterAnimator;
23105 }(SplitterAnimator$1);
23106
23107 var PushSplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
23108 _inherits(PushSplitterAnimator, _SplitterAnimator);
23109 var _super = _createSuper(PushSplitterAnimator);
23110 function PushSplitterAnimator() {
23111 _classCallCheck(this, PushSplitterAnimator);
23112 return _super.apply(this, arguments);
23113 }
23114 _createClass(PushSplitterAnimator, [{
23115 key: "_getSlidingElements",
23116 value: function _getSlidingElements() {
23117 var slidingElements = [this._side, this._content];
23118 if (this._oppositeSide && this._oppositeSide.mode === 'split') {
23119 slidingElements.push(this._oppositeSide);
23120 }
23121 return slidingElements;
23122 }
23123 }, {
23124 key: "translate",
23125 value: function translate(distance) {
23126 if (!this._slidingElements) {
23127 this._slidingElements = this._getSlidingElements();
23128 }
23129 this._mask.style.display = 'block'; // Avoid content clicks
23130
23131 Animit(this._slidingElements).queue({
23132 transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
23133 }).play();
23134 }
23135
23136 /**
23137 * @param {Function} done
23138 */
23139 }, {
23140 key: "open",
23141 value: function open(done) {
23142 var _this = this;
23143 var max = this._side.offsetWidth;
23144 this._slidingElements = this._getSlidingElements();
23145 Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
23146 transform: "translate3d(".concat(this.minus + max, "px, 0, 0)")
23147 }, this.def).queue(function (callback) {
23148 _this._slidingElements = null;
23149 callback();
23150 done && done();
23151 }), Animit(this._mask).wait(this.delay).queue({
23152 display: 'block'
23153 }));
23154 }
23155
23156 /**
23157 * @param {Function} done
23158 */
23159 }, {
23160 key: "close",
23161 value: function close(done) {
23162 var _this2 = this;
23163 this._slidingElements = this._getSlidingElements();
23164 Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
23165 transform: 'translate3d(0, 0, 0)'
23166 }, this.def).queue(function (callback) {
23167 _this2._slidingElements = null;
23168 _get(_getPrototypeOf(PushSplitterAnimator.prototype), "clearTransition", _this2).call(_this2);
23169 done && done();
23170 callback();
23171 }), Animit(this._mask).wait(this.delay).queue({
23172 display: 'none'
23173 }));
23174 }
23175 }]);
23176 return PushSplitterAnimator;
23177 }(SplitterAnimator$1);
23178
23179 var RevealSplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
23180 _inherits(RevealSplitterAnimator, _SplitterAnimator);
23181 var _super = _createSuper(RevealSplitterAnimator);
23182 function RevealSplitterAnimator() {
23183 _classCallCheck(this, RevealSplitterAnimator);
23184 return _super.apply(this, arguments);
23185 }
23186 _createClass(RevealSplitterAnimator, [{
23187 key: "_getSlidingElements",
23188 value: function _getSlidingElements() {
23189 var slidingElements = [this._content, this._mask];
23190 if (this._oppositeSide && this._oppositeSide.mode === 'split') {
23191 slidingElements.push(this._oppositeSide);
23192 }
23193 return slidingElements;
23194 }
23195 }, {
23196 key: "activate",
23197 value: function activate(sideElement) {
23198 _get(_getPrototypeOf(RevealSplitterAnimator.prototype), "activate", this).call(this, sideElement);
23199 if (sideElement.mode === 'collapse') {
23200 this._setStyles(sideElement);
23201 }
23202 }
23203 }, {
23204 key: "deactivate",
23205 value: function deactivate() {
23206 this._side && this._unsetStyles(this._side);
23207 _get(_getPrototypeOf(RevealSplitterAnimator.prototype), "deactivate", this).call(this);
23208 }
23209 }, {
23210 key: "_setStyles",
23211 value: function _setStyles(sideElement) {
23212 styler(sideElement, {
23213 left: sideElement.side === 'right' ? 'auto' : 0,
23214 right: sideElement.side === 'right' ? 0 : 'auto',
23215 zIndex: 0,
23216 backgroundColor: 'black',
23217 transform: this._generateBehindPageStyle(0).container.transform,
23218 display: 'none'
23219 });
23220 var splitter = sideElement.parentElement;
23221 contentReady(splitter, function () {
23222 return splitter.content && styler(splitter.content, {
23223 boxShadow: '0 0 12px 0 rgba(0, 0, 0, 0.2)'
23224 });
23225 });
23226 }
23227 }, {
23228 key: "_unsetStyles",
23229 value: function _unsetStyles(sideElement) {
23230 styler.clear(sideElement, 'left right zIndex backgroundColor display');
23231 if (sideElement._content) {
23232 sideElement._content.style.opacity = '';
23233 }
23234
23235 // Check if the other side needs the common styles
23236 if (!this._oppositeSide || this._oppositeSide.mode === 'split') {
23237 sideElement.parentElement.content && styler.clear(sideElement.parentElement.content, 'boxShadow');
23238 }
23239 }
23240 }, {
23241 key: "_generateBehindPageStyle",
23242 value: function _generateBehindPageStyle(distance) {
23243 var max = this.maxWidth;
23244 var behindDistance = (distance - max) / max * 10;
23245 behindDistance = isNaN(behindDistance) ? 0 : Math.max(Math.min(behindDistance, 0), -10);
23246 var behindTransform = "translate3d(".concat((this.minus ? -1 : 1) * behindDistance, "%, 0, 0)");
23247 var opacity = 1 + behindDistance / 100;
23248 return {
23249 content: {
23250 opacity: opacity
23251 },
23252 container: {
23253 transform: behindTransform
23254 }
23255 };
23256 }
23257 }, {
23258 key: "translate",
23259 value: function translate(distance) {
23260 this._side.style.display = '';
23261 this._side.style.zIndex = 1;
23262 this.maxWidth = this.maxWidth || this._getMaxWidth();
23263 var menuStyle = this._generateBehindPageStyle(Math.min(distance, this.maxWidth));
23264 if (!this._slidingElements) {
23265 this._slidingElements = this._getSlidingElements();
23266 }
23267 this._mask.style.display = 'block'; // Avoid content clicks
23268
23269 Animit.runAll(Animit(this._slidingElements).queue({
23270 transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
23271 }), Animit(this._side._content).queue(menuStyle.content), Animit(this._side).queue(menuStyle.container));
23272 }
23273
23274 /**
23275 * @param {Function} done
23276 */
23277 }, {
23278 key: "open",
23279 value: function open(done) {
23280 var _this = this;
23281 this._side.style.display = '';
23282 this._side.style.zIndex = 1;
23283 this.maxWidth = this.maxWidth || this._getMaxWidth();
23284 var menuStyle = this._generateBehindPageStyle(this.maxWidth);
23285 this._slidingElements = this._getSlidingElements();
23286 setTimeout(function () {
23287 // Fix: Time to update previous translate3d after changing style.display
23288 Animit.runAll(Animit(_this._slidingElements).wait(_this.delay).queue({
23289 transform: "translate3d(".concat(_this.minus + _this.maxWidth, "px, 0, 0)")
23290 }, _this.def), Animit(_this._mask).wait(_this.delay).queue({
23291 display: 'block'
23292 }), 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) {
23293 _this._slidingElements = null;
23294 callback();
23295 done && done();
23296 }));
23297 }, 1000 / 60);
23298 }
23299
23300 /**
23301 * @param {Function} done
23302 */
23303 }, {
23304 key: "close",
23305 value: function close(done) {
23306 var _this2 = this;
23307 var menuStyle = this._generateBehindPageStyle(0);
23308 this._slidingElements = this._getSlidingElements();
23309 Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
23310 transform: 'translate3d(0, 0, 0)'
23311 }, this.def), Animit(this._mask).wait(this.delay).queue({
23312 display: 'none'
23313 }), 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) {
23314 _this2._slidingElements = null;
23315 _this2._side.style.zIndex = 0;
23316 _this2._side.style.display = 'none';
23317 _this2._side._content.style.opacity = '';
23318 done && done();
23319 callback();
23320 }));
23321 }
23322 }, {
23323 key: "_getMaxWidth",
23324 value: function _getMaxWidth() {
23325 return this._side.offsetWidth;
23326 }
23327 }]);
23328 return RevealSplitterAnimator;
23329 }(SplitterAnimator$1);
23330
23331 var _animatorDict$1 = {
23332 default: OverlaySplitterAnimator,
23333 overlay: OverlaySplitterAnimator,
23334 push: PushSplitterAnimator,
23335 reveal: RevealSplitterAnimator
23336 };
23337
23338 /**
23339 * @element ons-splitter
23340 * @category menu
23341 * @description
23342 * [en]
23343 * A component that enables responsive layout by implementing both a two-column layout and a sliding menu layout.
23344 *
23345 * 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.
23346 * [/en]
23347 * [ja][/ja]
23348 * @codepen rOQOML
23349 * @tutorial vanilla/Reference/splitter
23350 * @guide fundamentals.html#managing-pages
23351 * [en]Managing multiple pages.[/en]
23352 * [ja]複数のページを管理する[/ja]
23353 * @seealso ons-splitter-content
23354 * [en]The `<ons-splitter-content>` component contains the main content of the page.[/en]
23355 * [ja]ons-splitter-contentコンポーネント[/ja]
23356 * @seealso ons-splitter-side
23357 * [en]The `<ons-splitter-side>` component contains the menu.[/en]
23358 * [ja]ons-splitter-sideコンポーネント[/ja]
23359 * @example
23360 * <ons-splitter id="splitter">
23361 * <ons-splitter-content>
23362 * ...
23363 * </ons-splitter-content>
23364 *
23365 * <ons-splitter-side side="left" width="80%" collapse swipeable>
23366 * ...
23367 * </ons-splitter-side>
23368 * </ons-splitter>
23369 *
23370 * <script>
23371 * var splitter = document.getElementById('splitter');
23372 * splitter.left.open();
23373 * </script>
23374 */
23375 var SplitterElement = /*#__PURE__*/function (_BaseElement) {
23376 _inherits(SplitterElement, _BaseElement);
23377 var _super = _createSuper(SplitterElement);
23378 function SplitterElement() {
23379 var _this;
23380 _classCallCheck(this, SplitterElement);
23381 _this = _super.call(this);
23382 _this._onModeChange = _this._onModeChange.bind(_assertThisInitialized(_this));
23383 contentReady(_assertThisInitialized(_this), function () {
23384 !_this.mask && _this.appendChild(document.createElement('ons-splitter-mask'));
23385 _this._layout();
23386 });
23387 return _this;
23388 }
23389 _createClass(SplitterElement, [{
23390 key: "_getSide",
23391 value: function _getSide(side) {
23392 var element = util$4.findChild(this, function (e) {
23393 return util$4.match(e, 'ons-splitter-side') && e.getAttribute('side') === side;
23394 });
23395 return element;
23396 }
23397
23398 /**
23399 * @property left
23400 * @readonly
23401 * @type {HTMLElement}
23402 * @description
23403 * [en]Left `<ons-splitter-side>` element.[/en]
23404 * [ja][/ja]
23405 */
23406 }, {
23407 key: "left",
23408 get: function get() {
23409 return this._getSide('left');
23410 }
23411 /**
23412 * @property right
23413 * @readonly
23414 * @type {HTMLElement}
23415 * @description
23416 * [en]Right `<ons-splitter-side>` element.[/en]
23417 * [ja][/ja]
23418 */
23419 }, {
23420 key: "right",
23421 get: function get() {
23422 return this._getSide('right');
23423 }
23424
23425 /**
23426 * @property side
23427 * @readonly
23428 * @type {HTMLElement}
23429 * @description
23430 * [en]First `<ons-splitter-side>` element regardless the actual side.[/en]
23431 * [ja][/ja]
23432 */
23433 }, {
23434 key: "side",
23435 get: function get() {
23436 return util$4.findChild(this, 'ons-splitter-side');
23437 }
23438 }, {
23439 key: "_sides",
23440 get: function get() {
23441 return [this.left, this.right].filter(function (e) {
23442 return e;
23443 });
23444 }
23445 /**
23446 * @property content
23447 * @readonly
23448 * @type {HTMLElement}
23449 * @description
23450 * [en]The `<ons-splitter-content>` element.[/en]
23451 * [ja][/ja]
23452 */
23453 }, {
23454 key: "content",
23455 get: function get() {
23456 return util$4.findChild(this, 'ons-splitter-content');
23457 }
23458 }, {
23459 key: "topPage",
23460 get: function get() {
23461 return this.content._content;
23462 }
23463 }, {
23464 key: "mask",
23465 get: function get() {
23466 return util$4.findChild(this, 'ons-splitter-mask');
23467 }
23468
23469 /**
23470 * @property onDeviceBackButton
23471 * @type {Object}
23472 * @description
23473 * [en]Back-button handler.[/en]
23474 * [ja]バックボタンハンドラ。[/ja]
23475 */
23476 }, {
23477 key: "onDeviceBackButton",
23478 get: function get() {
23479 return this._backButtonHandler;
23480 },
23481 set: function set(callback) {
23482 if (this._backButtonHandler) {
23483 this._backButtonHandler.destroy();
23484 }
23485 this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
23486 }
23487 }, {
23488 key: "_onDeviceBackButton",
23489 value: function _onDeviceBackButton(event) {
23490 this._sides.some(function (s) {
23491 return s.isOpen ? s.close() : false;
23492 }) || event.callParentHandler();
23493 }
23494 }, {
23495 key: "_onModeChange",
23496 value: function _onModeChange(e) {
23497 var _this2 = this;
23498 if (e.target.parentNode) {
23499 contentReady(this, function () {
23500 _this2._layout();
23501 });
23502 }
23503 }
23504 }, {
23505 key: "_layout",
23506 value: function _layout() {
23507 var _this3 = this;
23508 this._sides.forEach(function (side) {
23509 if (_this3.content) {
23510 _this3.content.style[side.side] = side.mode === 'split' ? side.style.width : 0;
23511 }
23512 });
23513 }
23514 }, {
23515 key: "connectedCallback",
23516 value: function connectedCallback() {
23517 this.onDeviceBackButton = this._onDeviceBackButton.bind(this);
23518 this.addEventListener('modechange', this._onModeChange, false);
23519 }
23520 }, {
23521 key: "disconnectedCallback",
23522 value: function disconnectedCallback() {
23523 this._backButtonHandler.destroy();
23524 this._backButtonHandler = null;
23525 this.removeEventListener('modechange', this._onModeChange, false);
23526 }
23527 }, {
23528 key: "attributeChangedCallback",
23529 value: function attributeChangedCallback(name, last, current) {}
23530 }, {
23531 key: "_show",
23532 value: function _show() {
23533 util$4.propagateAction(this, '_show');
23534 }
23535 }, {
23536 key: "_hide",
23537 value: function _hide() {
23538 util$4.propagateAction(this, '_hide');
23539 }
23540 }, {
23541 key: "_destroy",
23542 value: function _destroy() {
23543 util$4.propagateAction(this, '_destroy');
23544 this.remove();
23545 }
23546 }], [{
23547 key: "registerAnimator",
23548 value: function registerAnimator(name, Animator) {
23549 if (!(Animator instanceof SplitterAnimator)) {
23550 util$4.throwAnimator('Splitter');
23551 }
23552 _animatorDict$1[name] = Animator;
23553 }
23554 }, {
23555 key: "SplitterAnimator",
23556 get: function get() {
23557 return SplitterAnimator;
23558 }
23559 }, {
23560 key: "animators",
23561 get: function get() {
23562 return _animatorDict$1;
23563 }
23564 }]);
23565 return SplitterElement;
23566 }(BaseElement);
23567 onsElements.Splitter = SplitterElement;
23568 customElements.define('ons-splitter', SplitterElement);
23569
23570 var SPLIT_MODE = 'split';
23571 var COLLAPSE_MODE = 'collapse';
23572 var CLOSED_STATE = 'closed';
23573 var OPEN_STATE = 'open';
23574 var CHANGING_STATE = 'changing';
23575 var rewritables$1 = {
23576 /**
23577 * @param {Element} splitterSideElement
23578 * @param {Function} callback
23579 */
23580 ready: function ready(splitterSideElement, callback) {
23581 setImmediate(callback);
23582 }
23583 };
23584 var CollapseDetection = /*#__PURE__*/function () {
23585 function CollapseDetection(element, target) {
23586 _classCallCheck(this, CollapseDetection);
23587 this._element = element;
23588 this._onChange = this._onChange.bind(this);
23589 target && this.changeTarget(target);
23590 }
23591 _createClass(CollapseDetection, [{
23592 key: "changeTarget",
23593 value: function changeTarget(target) {
23594 this.disable();
23595 this._target = target;
23596 if (target) {
23597 this._orientation = ['portrait', 'landscape'].indexOf(target) !== -1;
23598 this.activate();
23599 }
23600 }
23601 }, {
23602 key: "_match",
23603 value: function _match(value) {
23604 if (this._orientation) {
23605 return this._target === (value.isPortrait ? 'portrait' : 'landscape');
23606 }
23607 return value.matches;
23608 }
23609 }, {
23610 key: "_onChange",
23611 value: function _onChange(value) {
23612 this._element._updateMode(this._match(value) ? COLLAPSE_MODE : SPLIT_MODE);
23613 }
23614 }, {
23615 key: "activate",
23616 value: function activate() {
23617 if (this._orientation) {
23618 orientation.on('change', this._onChange);
23619 this._onChange({
23620 isPortrait: orientation.isPortrait()
23621 });
23622 } else {
23623 this._queryResult = window.matchMedia(this._target);
23624 this._queryResult.addListener(this._onChange);
23625 this._onChange(this._queryResult);
23626 }
23627 }
23628 }, {
23629 key: "disable",
23630 value: function disable() {
23631 if (this._orientation) {
23632 orientation.off('change', this._onChange);
23633 } else if (this._queryResult) {
23634 this._queryResult.removeListener(this._onChange);
23635 this._queryResult = null;
23636 }
23637 }
23638 }]);
23639 return CollapseDetection;
23640 }();
23641
23642 /**
23643 * @element ons-splitter-side
23644 * @category menu
23645 * @description
23646 * [en]
23647 * The `<ons-splitter-side>` element is used as a child element of `<ons-splitter>`.
23648 *
23649 * It will be displayed on either the left or right side of the `<ons-splitter-content>` element.
23650 *
23651 * 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.
23652 * [/en]
23653 * [ja]ons-splitter-side要素は、ons-splitter要素の子要素として利用します。[/ja]
23654 * @codepen rOQOML
23655 * @tutorial vanilla/Reference/splitter
23656 * @guide fundamentals.html#managing-pages
23657 * [en]Managing multiple pages.[/en]
23658 * [ja]複数のページを管理する[/ja]
23659 * @seealso ons-splitter
23660 * [en]The `<ons-splitter>` is the parent component.[/en]
23661 * [ja]ons-splitterコンポーネント[/ja]
23662 * @seealso ons-splitter-content
23663 * [en]The `<ons-splitter-content>` component contains the main content of the page.[/en]
23664 * [ja]ons-splitter-contentコンポーネント[/ja]
23665 * @example
23666 * <ons-splitter>
23667 * <ons-splitter-content>
23668 * ...
23669 * </ons-splitter-content>
23670 *
23671 * <ons-splitter-side side="left" width="80%" collapse>
23672 * ...
23673 * </ons-splitter-side>
23674 * </ons-splitter>
23675 */
23676 var SplitterSideElement = /*#__PURE__*/function (_BaseElement) {
23677 _inherits(SplitterSideElement, _BaseElement);
23678 var _super = _createSuper(SplitterSideElement);
23679 /**
23680 * @event modechange
23681 * @description
23682 * [en]Fired just after the component's mode changes.[/en]
23683 * [ja]この要素のモードが変化した際に発火します。[/ja]
23684 * @param {Object} event
23685 * [en]Event object.[/en]
23686 * [ja]イベントオブジェクトです。[/ja]
23687 * @param {Object} event.side
23688 * [en]Component object.[/en]
23689 * [ja]コンポーネントのオブジェクト。[/ja]
23690 * @param {String} event.mode
23691 * [en]Returns the current mode. Can be either `"collapse"` or `"split"`.[/en]
23692 * [ja]現在のモードを返します。[/ja]
23693 */
23694
23695 /**
23696 * @event preopen
23697 * @description
23698 * [en]Fired just before the sliding menu is opened.[/en]
23699 * [ja]スライディングメニューが開く前に発火します。[/ja]
23700 * @param {Object} event
23701 * [en]Event object.[/en]
23702 * [ja]イベントオブジェクトです。[/ja]
23703 * @param {Function} event.cancel
23704 * [en]Call to cancel opening sliding menu.[/en]
23705 * [ja]スライディングメニューが開くのをキャンセルします。[/ja]
23706 * @param {Object} event.side
23707 * [en]Component object.[/en]
23708 * [ja]コンポーネントのオブジェクト。[/ja]
23709 */
23710
23711 /**
23712 * @event postopen
23713 * @description
23714 * [en]Fired just after the sliding menu is opened.[/en]
23715 * [ja]スライディングメニューが開いた後に発火します。[/ja]
23716 * @param {Object} event
23717 * [en]Event object.[/en]
23718 * [ja]イベントオブジェクトです。[/ja]
23719 * @param {Object} event.side
23720 * [en]Component object.[/en]
23721 * [ja]コンポーネントのオブジェクト。[/ja]
23722 */
23723
23724 /**
23725 * @event preclose
23726 * @description
23727 * [en]Fired just before the sliding menu is closed.[/en]
23728 * [ja]スライディングメニューが閉じる前に発火します。[/ja]
23729 * @param {Object} event
23730 * [en]Event object.[/en]
23731 * [ja]イベントオブジェクトです。[/ja]
23732 * @param {Object} event.side
23733 * [en]Component object.[/en]
23734 * [ja]コンポーネントのオブジェクト。[/ja]
23735 * @param {Function} event.cancel
23736 * [en]Call to cancel opening sliding-menu.[/en]
23737 * [ja]スライディングメニューが閉じるのをキャンセルします。[/ja]
23738 */
23739
23740 /**
23741 * @event postclose
23742 * @description
23743 * [en]Fired just after the sliding menu is closed.[/en]
23744 * [ja]スライディングメニューが閉じた後に発火します。[/ja]
23745 * @param {Object} event
23746 * [en]Event object.[/en]
23747 * [ja]イベントオブジェクトです。[/ja]
23748 * @param {Object} event.side
23749 * [en]Component object.[/en]
23750 * [ja]コンポーネントのオブジェクト。[/ja]
23751 */
23752
23753 /**
23754 * @event swipe
23755 * @description
23756 * [en]Fired whenever the user slides the splitter.[/en]
23757 * [ja][/ja]
23758 * @param {Object} event [en]Event object.[/en]
23759 * @param {Object} event.ratio
23760 * [en]Decimal ratio (0-1).[/en]
23761 * [ja][/ja]
23762 * @param {Object} event.animationOptions
23763 * [en][/en]
23764 * [ja][/ja]
23765 */
23766
23767 /**
23768 * @attribute animation
23769 * @type {String}
23770 * @default default
23771 * @description
23772 * [en]Specify the animation. Use one of `overlay`, `push`, `reveal` or `default`.[/en]
23773 * [ja]アニメーションを指定します。"overlay", "push", "reveal", "default"のいずれかを指定できます。[/ja]
23774 */
23775
23776 /**
23777 * @attribute animation-options
23778 * @type {Expression}
23779 * @description
23780 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
23781 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
23782 */
23783
23784 /**
23785 * @property animationOptions
23786 * @type {Object}
23787 * @description
23788 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
23789 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
23790 */
23791
23792 /**
23793 * @attribute open-threshold
23794 * @type {Number}
23795 * @default 0.3
23796 * @description
23797 * [en]Specify how much the menu needs to be swiped before opening. A value between `0` and `1`.[/en]
23798 * [ja]どのくらいスワイプすればスライディングメニューを開くかどうかの割合を指定します。0から1の間の数値を指定します。スワイプの距離がここで指定した数値掛けるこの要素の幅よりも大きければ、スワイプが終わった時にこの要素を開きます。デフォルトは0.3です。[/ja]
23799 */
23800
23801 /**
23802 * @attribute collapse
23803 * @type {String}
23804 * @description
23805 * [en]
23806 * Specify the collapse behavior. Valid values are `"portrait"`, `"landscape"` or a media query.
23807 * The string `"portrait"` means the view will collapse when the device is in portrait orientation.
23808 * The string `"landscape"` means the view will collapse when the device is in landscape orientation.
23809 * If the value is a media query, the view will collapse when the media query resolves to `true`.
23810 * If the attribute is set, including as an empty string, the view will always be in `"collapse"` mode.
23811 * If the attribute is not set, the view will be in `"split"` mode.
23812 * [/en]
23813 * [ja]
23814 * 左側のページを非表示にする条件を指定します。portrait, landscape、width #pxもしくはメディアクエリの指定が可能です。
23815 * portraitもしくはlandscapeを指定すると、デバイスの画面が縦向きもしくは横向きになった時に適用されます。
23816 * メディアクエリを指定すると、指定したクエリに適合している場合に適用されます。
23817 * 値に何も指定しない場合には、常にcollapseモードになります。
23818 * [/ja]
23819 */
23820
23821 /**
23822 * @attribute swipe-target-width
23823 * @type {String}
23824 * @description
23825 * [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]
23826 * [ja]スワイプの判定領域をピクセル単位で指定します。画面の端から指定した距離に達するとページが表示されます。[/ja]
23827 */
23828
23829 /**
23830 * @attribute width
23831 * @type {String}
23832 * @description
23833 * [en]Can be specified in either pixels or as a percentage, e.g. `90%` or `200px`.[/en]
23834 * [ja]この要素の横幅を指定します。pxと%での指定が可能です。eg. 90%, 200px[/ja]
23835 */
23836
23837 /**
23838 * @attribute side
23839 * @type {String}
23840 * @default left
23841 * @description
23842 * [en]Specify which side of the screen the `<ons-splitter-side>` element is located. Possible values are `"left"` and `"right"`.[/en]
23843 * [ja]この要素が左か右かを指定します。指定できる値は"left"か"right"のみです。[/ja]
23844 */
23845
23846 /**
23847 * @attribute mode
23848 * @type {String}
23849 * @description
23850 * [en]Current mode. Possible values are `"collapse"` or `"split"`. This attribute is read only.[/en]
23851 * [ja]現在のモードが設定されます。"collapse"もしくは"split"が指定されます。この属性は読み込み専用です。[/ja]
23852 */
23853
23854 /**
23855 * @attribute page
23856 * @initonly
23857 * @type {String}
23858 * @description
23859 * [en]The URL of the menu page.[/en]
23860 * [ja]ons-splitter-side要素に表示するページのURLを指定します。[/ja]
23861 */
23862
23863 /**
23864 * @attribute swipeable
23865 * @type {Boolean}
23866 * @description
23867 * [en]Whether to enable swipe interaction on collapse mode.[/en]
23868 * [ja]collapseモード時にスワイプ操作を有効にする場合に指定します。[/ja]
23869 */
23870
23871 /**
23872 * @property swipeable
23873 * @type {Boolean}
23874 * @description
23875 * [en]Whether to enable swipe interaction on collapse mode.[/en]
23876 * [ja]collapseモード時にスワイプ操作を有効にする場合に指定します。[/ja]
23877 */
23878
23879 function SplitterSideElement() {
23880 var _this;
23881 _classCallCheck(this, SplitterSideElement);
23882 _this = _super.call(this);
23883 _this._page = null;
23884 _this._state = CLOSED_STATE;
23885 _this._lock = new DoorLock();
23886 _this._pageLoader = defaultPageLoader;
23887 _this._collapseDetection = new CollapseDetection(_assertThisInitialized(_this));
23888 _this._animatorFactory = new AnimatorFactory({
23889 animators: SplitterElement.animators,
23890 baseClass: SplitterAnimator$1,
23891 baseClassName: 'SplitterAnimator',
23892 defaultAnimation: _this.getAttribute('animation')
23893 });
23894 contentReady(_assertThisInitialized(_this), function () {
23895 // These attributes are used early by the parent element
23896 _this.attributeChangedCallback('width');
23897 if (!_this.hasAttribute('side')) {
23898 _this.setAttribute('side', 'left');
23899 }
23900 rewritables$1.ready(_assertThisInitialized(_this), function () {
23901 var page = _this._page || _this.getAttribute('page');
23902 page && _this.load(page);
23903 });
23904 });
23905 return _this;
23906 }
23907 _createClass(SplitterSideElement, [{
23908 key: "connectedCallback",
23909 value: function connectedCallback() {
23910 var _this2 = this;
23911 if (!util$4.match(this.parentNode, 'ons-splitter')) {
23912 util$4.throw('Parent must be an ons-splitter element');
23913 }
23914 if (!this._swipe) {
23915 this._swipe = new SwipeReveal({
23916 element: this,
23917 elementHandler: this.parentElement,
23918 swipeMax: function swipeMax() {
23919 var ratio = 1;
23920 _this2._onSwipe && _this2._onSwipe(ratio, _this2._animationOpt);
23921 util$4.triggerElementEvent(_this2, 'swipe', {
23922 ratio: ratio,
23923 animationOptions: _this2._animationOpt
23924 });
23925 _this2.open();
23926 },
23927 swipeMid: function swipeMid(distance, width) {
23928 var ratio = distance / width;
23929 _this2._onSwipe && _this2._onSwipe(ratio);
23930 util$4.triggerElementEvent(_this2, 'swipe', {
23931 ratio: ratio
23932 });
23933 _this2._animator.translate(distance);
23934 },
23935 swipeMin: function swipeMin() {
23936 var ratio = 0;
23937 _this2._onSwipe && _this2._onSwipe(ratio, _this2._animationOpt);
23938 util$4.triggerElementEvent(_this2, 'swipe', {
23939 ratio: ratio,
23940 animationOptions: _this2._animationOpt
23941 });
23942 _this2.close();
23943 },
23944 getThreshold: function getThreshold() {
23945 return Math.max(0, Math.min(1, parseFloat(_this2.getAttribute('open-threshold')) || 0.3));
23946 },
23947 getSide: function getSide() {
23948 return _this2.side;
23949 },
23950 isInitialState: function isInitialState() {
23951 var closed = _this2._state === CLOSED_STATE;
23952 _this2._state = CHANGING_STATE;
23953 return closed;
23954 },
23955 ignoreSwipe: function ignoreSwipe(event, distance) {
23956 var isOpen = _this2.isOpen;
23957 var validDrag = function validDrag(d) {
23958 return _this2.side === 'left' ? d === 'left' && isOpen || d === 'right' && !isOpen : d === 'left' && !isOpen || d === 'right' && isOpen;
23959 };
23960 var area = Math.max(0, parseInt(_this2.getAttribute('swipe-target-width'), 10) || 0);
23961 return _this2._mode === SPLIT_MODE || _this2._lock.isLocked() || _this2._isOtherSideOpen() || !validDrag(event.gesture.direction) || !isOpen && area !== 0 && distance > area;
23962 }
23963 });
23964 this.attributeChangedCallback('swipeable');
23965 }
23966 contentReady(this, function () {
23967 _this2.constructor.observedAttributes.forEach(function (attr) {
23968 return _this2.attributeChangedCallback(attr, null, _this2.getAttribute(attr));
23969 });
23970 });
23971 }
23972 }, {
23973 key: "side",
23974 get: function get() {
23975 return this.getAttribute('side') === 'right' ? 'right' : 'left';
23976 },
23977 set: function set(value) {
23978 if (value) {
23979 this.setAttribute('side', value);
23980 } else {
23981 tihs.removeAttribute('side');
23982 }
23983 }
23984 }, {
23985 key: "disconnectedCallback",
23986 value: function disconnectedCallback() {
23987 this._swipe && this._swipe.dispose();
23988 this._animator = this._animationOpt = this._swipe = null;
23989 }
23990 }, {
23991 key: "attributeChangedCallback",
23992 value: function attributeChangedCallback(name, last, current) {
23993 switch (name) {
23994 case 'swipeable':
23995 this._swipe && this._swipe.update();
23996 break;
23997 case 'width':
23998 current = this.getAttribute('width'); // Sometimes undefined. CE bug?
23999 this.style.width = /^\d+(px|%)$/.test(current) ? current : '80%';
24000 break;
24001 case 'animation':
24002 case 'animation-options':
24003 this._updateAnimation();
24004 break;
24005 default:
24006 this[util$4.camelize("_update-".concat(name))](current);
24007 }
24008 }
24009 }, {
24010 key: "_emitEvent",
24011 value: function _emitEvent(name) {
24012 if (name.slice(0, 3) !== 'pre') {
24013 return util$4.triggerElementEvent(this, name, {
24014 side: this
24015 });
24016 }
24017 var isCanceled = false;
24018 util$4.triggerElementEvent(this, name, {
24019 side: this,
24020 cancel: function cancel() {
24021 return isCanceled = true;
24022 }
24023 });
24024 return isCanceled;
24025 }
24026 }, {
24027 key: "_isOtherSideOpen",
24028 value: function _isOtherSideOpen() {
24029 var _this3 = this;
24030 return !!util$4.findChild(this.parentElement, function (el) {
24031 return el instanceof _this3.constructor && el !== _this3 && el._mode === COLLAPSE_MODE && el.isOpen;
24032 });
24033 }
24034 }, {
24035 key: "_updateCollapse",
24036 value: function _updateCollapse() {
24037 var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('collapse');
24038 if (value === null || value === 'split') {
24039 this._collapseDetection.disable();
24040 return this._updateMode(SPLIT_MODE);
24041 }
24042 if (value === '' || value === 'collapse') {
24043 this._collapseDetection.disable();
24044 return this._updateMode(COLLAPSE_MODE);
24045 }
24046 this._collapseDetection.changeTarget(value);
24047 }
24048 }, {
24049 key: "_updateMode",
24050 value: function _updateMode(mode) {
24051 if (mode !== this._mode) {
24052 this._mode = mode;
24053 this.setAttribute('mode', mode); // readonly attribute for the users
24054
24055 if (mode === SPLIT_MODE) {
24056 this._animator && this._animator.deactivate();
24057 this._state = CLOSED_STATE;
24058 } else {
24059 this._animator && this._animator.activate(this);
24060 this._state === OPEN_STATE && this._animator.open();
24061 }
24062 util$4.triggerElementEvent(this, 'modechange', {
24063 side: this,
24064 mode: mode
24065 });
24066 }
24067 }
24068 }, {
24069 key: "_updateAnimation",
24070 value: function _updateAnimation() {
24071 var animation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('animation');
24072 if (this.parentNode) {
24073 this._animator && this._animator.deactivate();
24074 this._animator = this._animatorFactory.newAnimator({
24075 animation: animation
24076 });
24077 this._animator.activate(this);
24078 this._animationOpt = {
24079 timing: this._animator.duration,
24080 duration: this._animator.duration
24081 };
24082 this._animator.updateOptions(this.animationOptions);
24083 }
24084 }
24085
24086 /**
24087 * @property page
24088 * @type {*}
24089 * @description
24090 * [en]Page location to load in the splitter side.[/en]
24091 * [ja]この要素内に表示するページを指定します。[/ja]
24092 */
24093 }, {
24094 key: "page",
24095 get: function get() {
24096 return this._page;
24097 }
24098
24099 /**
24100 * @param {*} page
24101 */,
24102 set: function set(page) {
24103 this._page = page;
24104 }
24105 }, {
24106 key: "_content",
24107 get: function get() {
24108 return this.children[0];
24109 }
24110
24111 /**
24112 * @property pageLoader
24113 * @description
24114 * [en][/en]
24115 * [ja][/ja]
24116 */
24117 }, {
24118 key: "pageLoader",
24119 get: function get() {
24120 return this._pageLoader;
24121 },
24122 set: function set(loader) {
24123 if (!(loader instanceof PageLoader)) {
24124 util$4.throwPageLoader();
24125 }
24126 this._pageLoader = loader;
24127 }
24128
24129 /**
24130 * @property mode
24131 * @readonly
24132 * @type {String}
24133 * @description
24134 * [en]Current mode. Possible values are "split", "collapse", "closed", "open" or "changing".[/en]
24135 * [ja][/ja]
24136 */
24137 }, {
24138 key: "mode",
24139 get: function get() {
24140 return this._mode;
24141 }
24142
24143 /**
24144 * @property onSwipe
24145 * @type {Function}
24146 * @description
24147 * [en]Hook called whenever the user slides the splitter. It gets a decimal ratio (0-1) and an animationOptions object as arguments.[/en]
24148 * [ja][/ja]
24149 */
24150 }, {
24151 key: "onSwipe",
24152 get: function get() {
24153 return this._onSwipe;
24154 },
24155 set: function set(value) {
24156 if (value && !(value instanceof Function)) {
24157 util$4.throw('"onSwipe" must be a function');
24158 }
24159 this._onSwipe = value;
24160 }
24161 }, {
24162 key: "animationOptions",
24163 get: function get() {
24164 return this.hasAttribute('animation-options') ? AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options')) : {};
24165 },
24166 set: function set(value) {
24167 if (value === undefined || value === null) {
24168 this.removeAttribute('animation-options');
24169 } else {
24170 this.setAttribute('animation-options', JSON.stringify(value));
24171 }
24172 }
24173
24174 /**
24175 * @property isOpen
24176 * @type {Boolean}
24177 * @description
24178 * [en]Specifies whether the menu is opened.[/en]
24179 * [ja][/ja]
24180 */
24181 }, {
24182 key: "isOpen",
24183 get: function get() {
24184 return this._mode === COLLAPSE_MODE && this._state !== CLOSED_STATE;
24185 },
24186 set: function set(value) {
24187 this.toggle({}, value);
24188 }
24189
24190 /**
24191 * @method open
24192 * @signature open([options])
24193 * @param {Object} [options]
24194 * [en]Parameter object.[/en]
24195 * [ja]オプションを指定するオブジェクト。[/ja]
24196 * @param {Function} [options.callback]
24197 * [en]This function will be called after the menu has been opened.[/en]
24198 * [ja]メニューが開いた後に呼び出される関数オブジェクトを指定します。[/ja]
24199 * @description
24200 * [en]Open menu in collapse mode.[/en]
24201 * [ja]collapseモードになっているons-splitter-side要素を開きます。[/ja]
24202 * @return {Promise}
24203 * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
24204 * [ja][/ja]
24205 */
24206 }, {
24207 key: "open",
24208 value: function open(options) {
24209 return this.toggle(options, true);
24210 }
24211
24212 /**
24213 * @method close
24214 * @signature close([options])
24215 * @param {Object} [options]
24216 * [en]Parameter object.[/en]
24217 * [ja]オプションを指定するオブジェクト。[/ja]
24218 * @param {Function} [options.callback]
24219 * [en]This function will be called after the menu has been closed.[/en]
24220 * [ja]メニューが閉じた後に呼び出される関数オブジェクトを指定します。[/ja]
24221 * @description
24222 * [en]Close menu in collapse mode.[/en]
24223 * [ja]collapseモードになっているons-splitter-side要素を閉じます。[/ja]
24224 * @return {Promise}
24225 * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
24226 * [ja][/ja]
24227 */
24228 }, {
24229 key: "close",
24230 value: function close(options) {
24231 return this.toggle(options, false);
24232 }
24233
24234 /**
24235 * @method toggle
24236 * @signature toggle([options])
24237 * @param {Object} [options]
24238 * @description
24239 * [en]Opens if it's closed. Closes if it's open.[/en]
24240 * [ja]開けている場合は要素を閉じますそして開けている場合は要素を開きます。[/ja]
24241 * @return {Promise}
24242 * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
24243 * [ja][/ja]
24244 */
24245 }, {
24246 key: "toggle",
24247 value: function toggle() {
24248 var _this4 = this;
24249 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
24250 var force = arguments.length > 1 ? arguments[1] : undefined;
24251 var shouldOpen = typeof force === 'boolean' ? force : !this.isOpen;
24252 var action = shouldOpen ? 'open' : 'close';
24253 var FINAL_STATE = shouldOpen ? OPEN_STATE : CLOSED_STATE;
24254 if (this._mode === SPLIT_MODE) {
24255 return Promise.resolve(false);
24256 }
24257 if (this._state === FINAL_STATE) {
24258 return Promise.resolve(this);
24259 }
24260 if (this._lock.isLocked()) {
24261 return Promise.reject('Another splitter-side action is already running.');
24262 }
24263 if (shouldOpen && this._isOtherSideOpen()) {
24264 return Promise.reject('Another menu is already open.');
24265 }
24266 if (this._emitEvent("pre".concat(action))) {
24267 return Promise.reject("Canceled in pre".concat(action, " event."));
24268 }
24269 var unlock = this._lock.lock();
24270 this._state = CHANGING_STATE;
24271 if (options.animation) {
24272 this._updateAnimation(options.animation);
24273 }
24274 return new Promise(function (resolve) {
24275 _this4._animator[action](function () {
24276 util$4.iosPageScrollFix(shouldOpen);
24277 _this4._state = FINAL_STATE;
24278 unlock();
24279 _this4._emitEvent("post".concat(action));
24280 options.callback instanceof Function && options.callback(_this4);
24281 resolve(_this4);
24282 });
24283 });
24284 }
24285
24286 /**
24287 * @method load
24288 * @signature load(page, [options])
24289 * @param {String} page
24290 * [en]Page URL. Can be either an HTML document or a `<template>`.[/en]
24291 * [ja]pageのURLか、`<template>`で宣言したテンプレートのid属性の値を指定します。[/ja]
24292 * @param {Object} [options]
24293 * @param {Function} [options.callback]
24294 * @description
24295 * [en]Show the page specified in pageUrl in the right section[/en]
24296 * [ja]指定したURLをメインページを読み込みます。[/ja]
24297 * @return {Promise}
24298 * [en]Resolves to the new page element[/en]
24299 * [ja][/ja]
24300 */
24301 }, {
24302 key: "load",
24303 value: function load(page) {
24304 var _this5 = this;
24305 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
24306 this._page = page;
24307 var callback = options.callback || function () {};
24308 return new Promise(function (resolve) {
24309 var oldContent = _this5._content || null;
24310 _this5._pageLoader.load({
24311 page: page,
24312 parent: _this5
24313 }, function (pageElement) {
24314 if (oldContent) {
24315 _this5._pageLoader.unload(oldContent);
24316 oldContent = null;
24317 }
24318 setImmediate(function () {
24319 return _this5._show();
24320 });
24321 callback(pageElement);
24322 resolve(pageElement);
24323 });
24324 });
24325 }
24326 }, {
24327 key: "_show",
24328 value: function _show() {
24329 if (this._content) {
24330 this._content._show();
24331 }
24332 }
24333 }, {
24334 key: "_hide",
24335 value: function _hide() {
24336 if (this._content) {
24337 this._content._hide();
24338 }
24339 }
24340 }, {
24341 key: "_destroy",
24342 value: function _destroy() {
24343 if (this._content) {
24344 this._pageLoader.unload(this._content);
24345 }
24346 this.remove();
24347 }
24348 }], [{
24349 key: "observedAttributes",
24350 get: function get() {
24351 return ['animation', 'width', 'collapse', 'swipeable', 'animation-options'];
24352 }
24353 }, {
24354 key: "events",
24355 get: function get() {
24356 return ['preopen', 'postopen', 'preclose', 'postclose', 'modechange', 'swipe'];
24357 }
24358 }, {
24359 key: "rewritables",
24360 get: function get() {
24361 return rewritables$1;
24362 }
24363 }]);
24364 return SplitterSideElement;
24365 }(BaseElement);
24366 util$4.defineBooleanProperties(SplitterSideElement, ['swipeable']);
24367 onsElements.SplitterSide = SplitterSideElement;
24368 customElements.define('ons-splitter-side', SplitterSideElement);
24369
24370 var scheme$3 = {
24371 '': 'switch--*',
24372 '.switch__input': 'switch--*__input',
24373 '.switch__handle': 'switch--*__handle',
24374 '.switch__toggle': 'switch--*__toggle'
24375 };
24376 var locations = {
24377 ios: [1, 21],
24378 material: [0, 16]
24379 };
24380
24381 /**
24382 * @element ons-switch
24383 * @category form
24384 * @description
24385 * [en]
24386 * Switch component. The switch can be toggled both by dragging and tapping.
24387 *
24388 * Will automatically displays a Material Design switch on Android devices.
24389 * [/en]
24390 * [ja]スイッチを表示するコンポーネントです。[/ja]
24391 * @modifier material
24392 * [en]Material Design switch[/en]
24393 * [ja][/ja]
24394 * @codepen LpXZQQ
24395 * @tutorial vanilla/Reference/switch
24396 * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
24397 * @example
24398 * <ons-switch checked></ons-switch>
24399 * <ons-switch disabled></ons-switch>
24400 * <ons-switch modifier="material"></ons-switch>
24401 */
24402 var SwitchElement = /*#__PURE__*/function (_BaseCheckboxElement) {
24403 _inherits(SwitchElement, _BaseCheckboxElement);
24404 var _super = _createSuper(SwitchElement);
24405 function SwitchElement() {
24406 var _this;
24407 _classCallCheck(this, SwitchElement);
24408 _this = _super.call(this);
24409 contentReady(_assertThisInitialized(_this), function () {
24410 _this.attributeChangedCallback('modifier', null, _this.getAttribute('modifier'));
24411 });
24412 _this._onChange = _this._onChange.bind(_assertThisInitialized(_this));
24413 _this._onRelease = _this._onRelease.bind(_assertThisInitialized(_this));
24414 _this._lastTimeStamp = 0;
24415 return _this;
24416 }
24417 _createClass(SwitchElement, [{
24418 key: "_scheme",
24419 get: function get() {
24420 return scheme$3;
24421 }
24422 }, {
24423 key: "_defaultClassName",
24424 get: function get() {
24425 return 'switch';
24426 }
24427 }, {
24428 key: "_template",
24429 get: function get() {
24430 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 ");
24431 }
24432 }, {
24433 key: "type",
24434 get: function get() {
24435 return 'checkbox';
24436 }
24437
24438 /* Own props */
24439 }, {
24440 key: "_getPosition",
24441 value: function _getPosition(e) {
24442 var l = this._locations;
24443 return Math.min(l[1], Math.max(l[0], this._startX + e.gesture.deltaX));
24444 }
24445 }, {
24446 key: "_emitChangeEvent",
24447 value: function _emitChangeEvent() {
24448 util$4.triggerElementEvent(this, 'change', {
24449 value: this.checked,
24450 switch: this,
24451 isInteractive: true
24452 });
24453 }
24454 }, {
24455 key: "_onChange",
24456 value: function _onChange(event) {
24457 if (event && event.stopPropagation) {
24458 event.stopPropagation();
24459 }
24460 this._emitChangeEvent();
24461 }
24462 }, {
24463 key: "_onClick",
24464 value: function _onClick(ev) {
24465 if (ev.target.classList.contains("".concat(this.defaultElementClass, "__touch")) || ev.timeStamp - this._lastTimeStamp < 50 // Prevent second click triggered by <label>
24466 ) {
24467 ev.preventDefault();
24468 }
24469 this._lastTimeStamp = ev.timeStamp;
24470 }
24471 }, {
24472 key: "_onHold",
24473 value: function _onHold(e) {
24474 if (!this.disabled) {
24475 ModifierUtil.addModifier(this, 'active');
24476 document.addEventListener('release', this._onRelease);
24477 }
24478 }
24479 }, {
24480 key: "_onDragStart",
24481 value: function _onDragStart(e) {
24482 if (this.disabled || ['left', 'right'].indexOf(e.gesture.direction) === -1) {
24483 ModifierUtil.removeModifier(this, 'active');
24484 return;
24485 }
24486 e.consumed = true;
24487 ModifierUtil.addModifier(this, 'active');
24488 this._startX = this._locations[this.checked ? 1 : 0]; // - e.gesture.deltaX;
24489
24490 this.addEventListener('drag', this._onDrag);
24491 document.addEventListener('release', this._onRelease);
24492 }
24493 }, {
24494 key: "_onDrag",
24495 value: function _onDrag(e) {
24496 e.stopPropagation();
24497 this._handle.style.left = this._getPosition(e) + 'px';
24498 }
24499 }, {
24500 key: "_onRelease",
24501 value: function _onRelease(e) {
24502 var l = this._locations;
24503 var position = this._getPosition(e);
24504 var previousValue = this.checked;
24505 this.checked = position >= (l[0] + l[1]) / 2;
24506 if (this.checked !== previousValue) {
24507 this._emitChangeEvent();
24508 }
24509 this.removeEventListener('drag', this._onDrag);
24510 document.removeEventListener('release', this._onRelease);
24511 this._handle.style.left = '';
24512 ModifierUtil.removeModifier(this, 'active');
24513 }
24514 }, {
24515 key: "click",
24516 value: function click() {
24517 var ev = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
24518 if (!this.disabled) {
24519 this.checked = !this.checked;
24520 this._emitChangeEvent();
24521 this._lastTimeStamp = ev.timeStamp || 0;
24522 }
24523 }
24524 }, {
24525 key: "_handle",
24526 get: function get() {
24527 return this.querySelector(".".concat(this._defaultClassName, "__handle"));
24528 }
24529 }, {
24530 key: "checkbox",
24531 get: function get() {
24532 return this._input;
24533 }
24534 }, {
24535 key: "connectedCallback",
24536 value: function connectedCallback() {
24537 var _this2 = this;
24538 contentReady(this, function () {
24539 _this2._input.addEventListener('change', _this2._onChange);
24540 });
24541 this.addEventListener('dragstart', this._onDragStart);
24542 this.addEventListener('hold', this._onHold);
24543 this.addEventListener('tap', this.click);
24544 this.addEventListener('click', this._onClick);
24545 this._gestureDetector = new GestureDetector(this, {
24546 dragMinDistance: 1,
24547 holdTimeout: 251,
24548 passive: true
24549 });
24550 }
24551 }, {
24552 key: "disconnectedCallback",
24553 value: function disconnectedCallback() {
24554 var _this3 = this;
24555 contentReady(this, function () {
24556 _this3._input.removeEventListener('change', _this3._onChange);
24557 });
24558 this.removeEventListener('dragstart', this._onDragStart);
24559 this.removeEventListener('hold', this._onHold);
24560 this.removeEventListener('tap', this.click);
24561 this.removeEventListener('click', this._onClick);
24562 if (this._gestureDetector) {
24563 this._gestureDetector.dispose();
24564 }
24565 }
24566 }, {
24567 key: "attributeChangedCallback",
24568 value: function attributeChangedCallback(name, last, current) {
24569 if (name === 'modifier') {
24570 var md = (current || '').indexOf('material') !== -1;
24571 this._locations = locations[md ? 'material' : 'ios'];
24572 }
24573 _get(_getPrototypeOf(SwitchElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
24574 }
24575
24576 /**
24577 * @event change
24578 * @description
24579 * [en]Fired when the switch is toggled.[/en]
24580 * [ja]ON/OFFが変わった時に発火します。[/ja]
24581 * @param {Object} event
24582 * [en]Event object.[/en]
24583 * [ja]イベントオブジェクト。[/ja]
24584 * @param {Object} event.switch
24585 * [en]Switch object.[/en]
24586 * [ja]イベントが発火したSwitchオブジェクトを返します。[/ja]
24587 * @param {Boolean} event.value
24588 * [en]Current value.[/en]
24589 * [ja]現在の値を返します。[/ja]
24590 * @param {Boolean} event.isInteractive
24591 * [en]True if the change was triggered by the user clicking on the switch.[/en]
24592 * [ja]タップやクリックなどのユーザの操作によって変わった場合にはtrueを返します。[/ja]
24593 */
24594
24595 /**
24596 * @attribute modifier
24597 * @type {String}
24598 * @description
24599 * [en]The appearance of the switch.[/en]
24600 * [ja]スイッチの表現を指定します。[/ja]
24601 */
24602
24603 /**
24604 * @attribute disabled
24605 * @description
24606 * [en]Whether the switch is be disabled.[/en]
24607 * [ja]スイッチを無効の状態にする場合に指定します。[/ja]
24608 */
24609
24610 /**
24611 * @attribute checked
24612 * @description
24613 * [en]Whether the switch is checked.[/en]
24614 * [ja]スイッチがONの状態にするときに指定します。[/ja]
24615 */
24616
24617 /**
24618 * @attribute input-id
24619 * @type {String}
24620 * @description
24621 * [en]Specify the `id` attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
24622 * [ja][/ja]
24623 */
24624
24625 /**
24626 * @property checked
24627 * @type {Boolean}
24628 * @description
24629 * [en]This value is `true` if the switch is checked.[/en]
24630 * [ja]スイッチがONの場合に`true`。[/ja]
24631 */
24632
24633 /**
24634 * @property value
24635 * @type {String}
24636 * @description
24637 * [en]The current value of the input.[/en]
24638 * [ja][/ja]
24639 */
24640
24641 /**
24642 * @property disabled
24643 * @type {Boolean}
24644 * @description
24645 * [en]Whether the element is disabled or not.[/en]
24646 * [ja]無効化されている場合に`true`。[/ja]
24647 */
24648
24649 /**
24650 * @property checkbox
24651 * @readonly
24652 * @type {HTMLElement}
24653 * @description
24654 * [en]The underlying checkbox element.[/en]
24655 * [ja]コンポーネント内部のcheckbox要素になります。[/ja]
24656 */
24657
24658 /**
24659 * @method focus
24660 * @signature focus()
24661 * @description
24662 * [en]Focuses the switch.[/en]
24663 * [ja][/ja]
24664 */
24665
24666 /**
24667 * @method blur
24668 * @signature blur()
24669 * @description
24670 * [en]Removes focus from the switch.[/en]
24671 * [ja][/ja]
24672 */
24673 }], [{
24674 key: "observedAttributes",
24675 get: function get() {
24676 return [].concat(_toConsumableArray(_get(_getPrototypeOf(SwitchElement), "observedAttributes", this)), ['modifier']);
24677 }
24678 }]);
24679 return SwitchElement;
24680 }(BaseCheckboxElement);
24681 onsElements.Switch = SwitchElement;
24682 customElements.define('ons-switch', SwitchElement);
24683
24684 var scheme$2 = {
24685 '.tabbar__content': 'tabbar--*__content',
24686 '.tabbar__border': 'tabbar--*__border',
24687 '.tabbar': 'tabbar--*'
24688 };
24689 var rewritables = {
24690 /**
24691 * @param {Element} tabbarElement
24692 * @param {Function} callback
24693 */
24694 ready: function ready(tabbarElement, callback) {
24695 callback();
24696 }
24697 };
24698 internal$1.nullElement;
24699 var lerp = function lerp(x0, x1, t) {
24700 return (1 - t) * x0 + t * x1;
24701 };
24702
24703 /**
24704 * @element ons-tabbar
24705 * @category tabbar
24706 * @description
24707 * [en]A component to display a tab bar on the bottom of a page. Used with `<ons-tab>` to manage pages using tabs.[/en]
24708 * [ja]タブバーをページ下部に表示するためのコンポーネントです。ons-tabと組み合わせて使うことで、ページを管理できます。[/ja]
24709 * @codepen pGuDL
24710 * @tutorial vanilla/Reference/tabbar
24711 * @modifier material
24712 * [en]A tabbar in Material Design.[/en]
24713 * [ja][/ja]
24714 * @modifier autogrow
24715 * [en]Tabs automatically grow depending on their content instead of having a fixed width.[/en]
24716 * [ja][/ja]
24717 * @modifier top-border
24718 * [en]Shows a static border-bottom in tabs for iOS top tabbars.[/en]
24719 * [ja][/ja]
24720 * @guide fundamentals.html#managing-pages
24721 * [en]Managing multiple pages.[/en]
24722 * [ja]複数のページを管理する[/ja]
24723 * @seealso ons-tab
24724 * [en]The `<ons-tab>` component.[/en]
24725 * [ja]ons-tabコンポーネント[/ja]
24726 * @seealso ons-page
24727 * [en]The `<ons-page>` component.[/en]
24728 * [ja]ons-pageコンポーネント[/ja]
24729 * @example
24730 * <ons-tabbar>
24731 * <ons-tab
24732 * page="home.html"
24733 * label="Home"
24734 * active>
24735 * </ons-tab>
24736 * <ons-tab
24737 * page="settings.html"
24738 * label="Settings"
24739 * active>
24740 * </ons-tab>
24741 * </ons-tabbar>
24742 *
24743 * <template id="home.html">
24744 * ...
24745 * </template>
24746 *
24747 * <template id="settings.html">
24748 * ...
24749 * </template>
24750 */
24751 var TabbarElement = /*#__PURE__*/function (_BaseElement) {
24752 _inherits(TabbarElement, _BaseElement);
24753 var _super = _createSuper(TabbarElement);
24754 /**
24755 * @event prechange
24756 * @description
24757 * [en]Fires just before the tab is changed.[/en]
24758 * [ja]アクティブなタブが変わる前に発火します。[/ja]
24759 * @param {Object} event
24760 * [en]Event object.[/en]
24761 * [ja]イベントオブジェクト。[/ja]
24762 * @param {Number} event.index
24763 * [en]Current index.[/en]
24764 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
24765 * @param {Object} event.tabItem
24766 * [en]Tab item object.[/en]
24767 * [ja]tabItemオブジェクト。[/ja]
24768 * @param {Function} event.cancel
24769 * [en]Call this function to cancel the change event.[/en]
24770 * [ja]この関数を呼び出すと、アクティブなタブの変更がキャンセルされます。[/ja]
24771 */
24772
24773 /**
24774 * @event postchange
24775 * @description
24776 * [en]Fires just after the tab is changed.[/en]
24777 * [ja]アクティブなタブが変わった後に発火します。[/ja]
24778 * @param {Object} event
24779 * [en]Event object.[/en]
24780 * [ja]イベントオブジェクト。[/ja]
24781 * @param {Number} event.index
24782 * [en]Current index.[/en]
24783 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
24784 * @param {Object} event.tabItem
24785 * [en]Tab item object.[/en]
24786 * [ja]tabItemオブジェクト。[/ja]
24787 */
24788
24789 /**
24790 * @event reactive
24791 * @description
24792 * [en]Fires if the already open tab is tapped again.[/en]
24793 * [ja]すでにアクティブになっているタブがもう一度タップやクリックされた場合に発火します。[/ja]
24794 * @param {Object} event
24795 * [en]Event object.[/en]
24796 * [ja]イベントオブジェクト。[/ja]
24797 * @param {Number} event.index
24798 * [en]Current index.[/en]
24799 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
24800 * @param {Object} event.tabItem
24801 * [en]Tab item object.[/en]
24802 * [ja]tabItemオブジェクト。[/ja]
24803 */
24804
24805 /**
24806 * @event swipe
24807 * @description
24808 * [en]Fires when the tabbar swipes.[/en]
24809 * [ja][/ja]
24810 * @param {Object} event
24811 * [en]Event object.[/en]
24812 * [ja]イベントオブジェクト。[/ja]
24813 * @param {Number} event.index
24814 * [en]Current index.[/en]
24815 * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
24816 * @param {Object} event.options
24817 * [en]Animation options object.[/en]
24818 * [ja][/ja]
24819 */
24820
24821 /**
24822 * @attribute animation
24823 * @type {String}
24824 * @default none
24825 * @description
24826 * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
24827 * [ja][/ja]
24828 */
24829
24830 /**
24831 * @attribute animation-options
24832 * @type {Expression}
24833 * @description
24834 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
24835 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
24836 */
24837
24838 /**
24839 * @property animationOptions
24840 * @type {Object}
24841 * @description
24842 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
24843 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
24844 */
24845
24846 /**
24847 * @attribute position
24848 * @initonly
24849 * @type {String}
24850 * @default bottom
24851 * @description
24852 * [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]
24853 * [ja]タブバーの位置を指定します。"bottom"もしくは"top"を選択できます。デフォルトは"bottom"です。[/ja]
24854 */
24855
24856 /**
24857 * @attribute swipeable
24858 * @description
24859 * [en]If this attribute is set the tab bar can be scrolled by drag or swipe.[/en]
24860 * [ja]この属性がある時、タブバーをスワイプやドラッグで移動できるようになります。[/ja]
24861 */
24862
24863 /**
24864 * @attribute ignore-edge-width
24865 * @type {Number}
24866 * @default 20
24867 * @description
24868 * [en]Distance in pixels from both edges. Swiping on these areas will prioritize parent components such as `ons-splitter` or `ons-navigator`.[/en]
24869 * [ja][/ja]
24870 */
24871
24872 /**
24873 * @attribute active-index
24874 * @type {Number}
24875 * @default 0
24876 * @description
24877 * [en]The index of the tab that is currently active.[/en]
24878 * [ja][/ja]
24879 */
24880
24881 /**
24882 * @property activeIndex
24883 * @type {Number}
24884 * @default 0
24885 * @description
24886 * [en]The index of the tab that is currently active.[/en]
24887 * [ja][/ja]
24888 */
24889
24890 /**
24891 * @attribute hide-tabs
24892 * @description
24893 * [en]Whether to hide the tabs.[/en]
24894 * [ja]タブを非表示にする場合に指定します。[/ja]
24895 */
24896
24897 /**
24898 * @property hideTabs
24899 * @description
24900 * [en]Whether to hide the tabs.[/en]
24901 * [ja]タブを非表示にする場合に指定します。[/ja]
24902 */
24903
24904 /**
24905 * @attribute tab-border
24906 * @description
24907 * [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]
24908 * [ja][/ja]
24909 */
24910
24911 /**
24912 * @property tabBorder
24913 * @type {Boolean}
24914 * @description
24915 * [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]
24916 * [ja][/ja]
24917 */
24918
24919 /**
24920 * @attribute modifier
24921 * @type {String}
24922 * @description
24923 * [en]The appearance of the tabbar.[/en]
24924 * [ja]タブバーの表現を指定します。[/ja]
24925 */
24926
24927 function TabbarElement() {
24928 var _this;
24929 _classCallCheck(this, TabbarElement);
24930 _this = _super.call(this);
24931 _this._loadInactive = util$4.defer(); // Improves #2324
24932 contentReady(_assertThisInitialized(_this), function () {
24933 return _this._compile();
24934 });
24935 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'swipe'),
24936 onConnected = _util$defineListenerP.onConnected,
24937 onDisconnected = _util$defineListenerP.onDisconnected;
24938 _this._connectOnSwipe = onConnected;
24939 _this._disconnectOnSwipe = onDisconnected;
24940 return _this;
24941 }
24942 _createClass(TabbarElement, [{
24943 key: "connectedCallback",
24944 value: function connectedCallback() {
24945 var _this2 = this;
24946 if (!this._swiper) {
24947 this._swiper = new Swiper({
24948 getElement: function getElement() {
24949 return _this2._contentElement;
24950 },
24951 getInitialIndex: function getInitialIndex() {
24952 return _this2.activeIndex || _this2.getAttribute('activeIndex');
24953 },
24954 getAutoScrollRatio: this._getAutoScrollRatio.bind(this),
24955 getBubbleWidth: function getBubbleWidth() {
24956 return parseInt(_this2.getAttribute('ignore-edge-width') || 25, 10);
24957 },
24958 isAutoScrollable: function isAutoScrollable() {
24959 return true;
24960 },
24961 preChangeHook: this._onPreChange.bind(this),
24962 postChangeHook: this._onPostChange.bind(this),
24963 refreshHook: this._onRefresh.bind(this),
24964 scrollHook: this._onScroll.bind(this)
24965 });
24966 contentReady(this, function () {
24967 _this2._tabbarBorder = util$4.findChild(_this2._tabbarElement, '.tabbar__border');
24968 _this2._swiper.init({
24969 swipeable: _this2.hasAttribute('swipeable')
24970 });
24971 });
24972 }
24973 contentReady(this, function () {
24974 _this2._updatePosition();
24975 _this2._updateVisibility();
24976 if (!util$4.findParent(_this2, 'ons-page', function (p) {
24977 return p === document.body;
24978 })) {
24979 _this2._show(); // This tabbar is the top component
24980 }
24981 });
24982
24983 this._connectOnSwipe();
24984 }
24985 }, {
24986 key: "disconnectedCallback",
24987 value: function disconnectedCallback() {
24988 if (this._swiper && this._swiper.initialized) {
24989 this._swiper.dispose();
24990 this._swiper = null;
24991 this._tabbarBorder = null;
24992 this._tabsRect = null;
24993 }
24994 this._disconnectOnSwipe();
24995 }
24996 }, {
24997 key: "_normalizeEvent",
24998 value: function _normalizeEvent(event) {
24999 return _objectSpread2(_objectSpread2({}, event), {}, {
25000 index: event.activeIndex,
25001 tabItem: this.tabs[event.activeIndex]
25002 });
25003 }
25004 }, {
25005 key: "_onPostChange",
25006 value: function _onPostChange(event) {
25007 event = this._normalizeEvent(event);
25008 util$4.triggerElementEvent(this, 'postchange', event);
25009 var page = event.tabItem.pageElement;
25010 page && page._show();
25011 }
25012 }, {
25013 key: "_onPreChange",
25014 value: function _onPreChange(event) {
25015 event = this._normalizeEvent(event);
25016 event.cancel = function () {
25017 return event.canceled = true;
25018 };
25019 util$4.triggerElementEvent(this, 'prechange', event);
25020 if (!event.canceled) {
25021 var _event = event,
25022 activeIndex = _event.activeIndex,
25023 lastActiveIndex = _event.lastActiveIndex;
25024 var tabs = this.tabs;
25025 tabs[activeIndex].setActive(true);
25026 if (lastActiveIndex >= 0) {
25027 var prevTab = tabs[lastActiveIndex];
25028 prevTab.setActive(false);
25029 prevTab.pageElement && prevTab.pageElement._hide();
25030 }
25031 }
25032 return event.canceled;
25033 }
25034 }, {
25035 key: "_onScroll",
25036 value: function _onScroll(index) {
25037 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
25038 if (this._tabbarBorder) {
25039 this._tabbarBorder.style.transition = "all ".concat(options.duration || 0, "s ").concat(options.timing || '');
25040 if (this._autogrow && this._tabsRect.length > 0) {
25041 var a = Math.floor(index),
25042 b = Math.ceil(index),
25043 r = index % 1;
25044 this._tabbarBorder.style.width = lerp(this._tabsRect[a].width, this._tabsRect[b].width, r) + 'px';
25045 this._tabbarBorder.style.transform = "translate3d(".concat(lerp(this._tabsRect[a].left, this._tabsRect[b].left, r), "px, 0, 0)");
25046 } else {
25047 this._tabbarBorder.style.transform = "translate3d(".concat(index * 100, "%, 0, 0)");
25048 }
25049 }
25050 util$4.triggerElementEvent(this, 'swipe', {
25051 index: index,
25052 options: options
25053 });
25054 }
25055 }, {
25056 key: "_onRefresh",
25057 value: function _onRefresh() {
25058 this._autogrow = util$4.hasModifier(this, 'autogrow');
25059 this._tabsRect = this.tabs.map(function (tab) {
25060 return tab.getBoundingClientRect();
25061 });
25062 if (this._tabbarBorder) {
25063 this._tabbarBorder.style.display = this.hasAttribute('tab-border') || util$4.hasModifier(this, 'material') ? 'block' : 'none';
25064 var index = this.getActiveTabIndex();
25065 if (this._tabsRect.length > 0 && index >= 0) {
25066 this._tabbarBorder.style.width = this._tabsRect[index].width + 'px';
25067 }
25068 }
25069 }
25070 }, {
25071 key: "_getAutoScrollRatio",
25072 value: function _getAutoScrollRatio(matches, velocity, size) {
25073 var ratio = .6; // Base ratio
25074 var modifier = size / 300 * (matches ? -1 : 1); // Based on screen size
25075 return Math.min(1, Math.max(0, ratio + velocity * modifier));
25076 }
25077 }, {
25078 key: "_tabbarElement",
25079 get: function get() {
25080 return util$4.findChild(this, '.tabbar');
25081 }
25082 }, {
25083 key: "_contentElement",
25084 get: function get() {
25085 return util$4.findChild(this, '.tabbar__content');
25086 }
25087 }, {
25088 key: "_targetElement",
25089 get: function get() {
25090 var content = this._contentElement;
25091 return content && content.children[0] || null;
25092 }
25093 }, {
25094 key: "_compile",
25095 value: function _compile() {
25096 autoStyle.prepare(this);
25097 var content = this._contentElement || util$4.create('.tabbar__content');
25098 content.classList.add('ons-tabbar__content');
25099 var tabbar = this._tabbarElement || util$4.create('.tabbar');
25100 tabbar.classList.add('ons-tabbar__footer');
25101 if (!tabbar.parentNode) {
25102 while (this.firstChild) {
25103 tabbar.appendChild(this.firstChild);
25104 }
25105 }
25106 if (tabbar.children.length > this.activeIndex && !util$4.findChild(tabbar, '[active]')) {
25107 tabbar.children[this.activeIndex].setAttribute('active', '');
25108 }
25109 this._tabbarBorder = util$4.findChild(tabbar, '.tabbar__border') || util$4.create('.tabbar__border');
25110 tabbar.appendChild(this._tabbarBorder);
25111 tabbar.classList.add('ons-swiper-tabbar'); // Hides material border
25112
25113 !content.children[0] && content.appendChild(document.createElement('div'));
25114 !content.children[1] && content.appendChild(document.createElement('div'));
25115 content.appendChild = content.appendChild.bind(content.children[0]);
25116 content.insertBefore = content.insertBefore.bind(content.children[0]);
25117 this.appendChild(content);
25118 this.appendChild(tabbar); // Triggers ons-tab connectedCallback
25119
25120 ModifierUtil.initModifier(this, scheme$2);
25121 }
25122 }, {
25123 key: "_updatePosition",
25124 value: function _updatePosition() {
25125 var _this3 = this;
25126 var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('position');
25127 var top = this._top = position === 'top' || position === 'auto' && util$4.hasModifier(this, 'material');
25128 var action = top ? util$4.addModifier : util$4.removeModifier;
25129 action(this, 'top');
25130 var page = util$4.findParent(this, 'ons-page');
25131 if (page) {
25132 contentReady(page, function () {
25133 var p = 0;
25134 if (page.children[0] && util$4.match(page.children[0], 'ons-toolbar')) {
25135 action(page.children[0], 'noshadow');
25136 p = 1; // Visual fix for some devices
25137 }
25138
25139 var content = page._getContentElement();
25140 var cs = window.getComputedStyle(page._getContentElement(), null);
25141 _this3.style.top = top ? parseInt(cs.getPropertyValue('padding-top'), 10) - p + 'px' : '';
25142
25143 // Refresh content top - Fix for iOS 8
25144 content.style.top = cs.top;
25145 content.style.top = '';
25146 });
25147 }
25148 internal$1.autoStatusBarFill(function () {
25149 var filled = util$4.findParent(_this3, function (e) {
25150 return e.hasAttribute('status-bar-fill');
25151 });
25152 util$4.toggleAttribute(_this3, 'status-bar-fill', top && !filled);
25153 });
25154 }
25155 }, {
25156 key: "topPage",
25157 get: function get() {
25158 var tabs = this.tabs,
25159 index = this.getActiveTabIndex();
25160 return tabs[index] ? tabs[index].pageElement || this.pages[0] || null : null;
25161 }
25162 }, {
25163 key: "pages",
25164 get: function get() {
25165 return util$4.arrayFrom(this._targetElement.children);
25166 }
25167 }, {
25168 key: "tabs",
25169 get: function get() {
25170 return Array.prototype.filter.call(this._tabbarElement.children, function (e) {
25171 return e.tagName === 'ONS-TAB';
25172 });
25173 }
25174
25175 /**
25176 * @method setActiveTab
25177 * @signature setActiveTab(index, [options])
25178 * @param {Number} index
25179 * [en]Tab index.[/en]
25180 * [ja]タブのインデックスを指定します。[/ja]
25181 * @param {Object} [options]
25182 * [en]Parameter object.[/en]
25183 * [ja]オプションを指定するオブジェクト。[/ja]
25184 * @param {Function} [options.callback]
25185 * [en]Function that runs when the new page has loaded.[/en]
25186 * [ja][/ja]
25187 * @param {String} [options.animation]
25188 * [en]If this option is "none", the transition won't slide.[/en]
25189 * [ja][/ja]
25190 * @param {String} [options.animationOptions]
25191 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
25192 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
25193 * @description
25194 * [en]Show specified tab page. Animations and their options can be specified by the second parameter.[/en]
25195 * [ja]指定したインデックスのタブを表示します。アニメーションなどのオプションを指定できます。[/ja]
25196 * @return {Promise}
25197 * [en]A promise that resolves to the new page element.[/en]
25198 * [ja][/ja]
25199 */
25200 }, {
25201 key: "setActiveTab",
25202 value: function setActiveTab(nextIndex) {
25203 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
25204 var previousIndex = this.activeIndex;
25205 this._activeIndexSkipEffect = true;
25206 this.activeIndex = nextIndex;
25207 return this._updateActiveIndex(nextIndex, previousIndex, options);
25208 }
25209 }, {
25210 key: "_updateActiveIndex",
25211 value: function _updateActiveIndex(nextIndex, prevIndex) {
25212 var _this4 = this;
25213 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
25214 var prevTab = this.tabs[prevIndex],
25215 nextTab = this.tabs[nextIndex];
25216 if (!nextTab) {
25217 return Promise.reject('Specified index does not match any tab.');
25218 }
25219 if (nextIndex === prevIndex) {
25220 util$4.triggerElementEvent(this, 'reactive', {
25221 index: nextIndex,
25222 activeIndex: nextIndex,
25223 tabItem: nextTab
25224 });
25225 return Promise.resolve(nextTab.pageElement);
25226 }
25227
25228 // FIXME: nextTab.loaded is broken in Zone.js promises (Angular2)
25229 var nextPage = nextTab.pageElement;
25230 return (nextPage ? Promise.resolve(nextPage) : nextTab.loaded).then(function (nextPage) {
25231 return _this4._swiper.setActiveIndex(nextIndex, _objectSpread2(_objectSpread2({
25232 reject: true
25233 }, options), {}, {
25234 animation: prevTab && nextPage ? options.animation || _this4.getAttribute('animation') : 'none',
25235 animationOptions: util$4.extend({
25236 duration: .3,
25237 timing: 'cubic-bezier(.4, .7, .5, 1)'
25238 }, _this4.animationOptions, options.animationOptions || {})
25239 })).then(function () {
25240 options.callback instanceof Function && options.callback(nextPage);
25241 return nextPage;
25242 });
25243 });
25244 }
25245
25246 /**
25247 * @method setTabbarVisibility
25248 * @signature setTabbarVisibility(visible)
25249 * @param {Boolean} visible
25250 * @description
25251 * [en]Used to hide or show the tab bar.[/en]
25252 * [ja][/ja]
25253 */
25254 }, {
25255 key: "setTabbarVisibility",
25256 value: function setTabbarVisibility(visible) {
25257 this.hideTabs = !visible;
25258 }
25259 }, {
25260 key: "show",
25261 value: function show() {
25262 this.hideTabs = false;
25263 }
25264 }, {
25265 key: "hide",
25266 value: function hide() {
25267 this.hideTabs = true;
25268 }
25269 }, {
25270 key: "_updateVisibility",
25271 value: function _updateVisibility() {
25272 var _this5 = this;
25273 contentReady(this, function () {
25274 var visible = !_this5.hideTabs;
25275 _this5._contentElement.style[_this5._top ? 'top' : 'bottom'] = visible ? '' : '0px';
25276 _this5._tabbarElement.style.display = visible ? '' : 'none';
25277 visible && _this5._onRefresh();
25278 });
25279 }
25280
25281 /**
25282 * @property visible
25283 * @readonly
25284 * @type {Boolean}
25285 * @description
25286 * [en]Whether the tabbar is visible or not.[/en]
25287 * [ja]タブバーが見える場合に`true`。[/ja]
25288 */
25289 }, {
25290 key: "visible",
25291 get: function get() {
25292 return this._tabbarElement.style.display !== 'none';
25293 }
25294
25295 /**
25296 * @property swipeable
25297 * @type {Boolean}
25298 * @description
25299 * [en]Enable swipe interaction.[/en]
25300 * [ja]swipeableであればtrueを返します。[/ja]
25301 */
25302
25303 /**
25304 * @property onSwipe
25305 * @type {Function}
25306 * @description
25307 * [en]Hook called whenever the user slides the tabbar. It gets a decimal index and an animationOptions object as arguments.[/en]
25308 * [ja][/ja]
25309 */
25310
25311 /**
25312 * @method getActiveTabIndex
25313 * @signature getActiveTabIndex()
25314 * @return {Number}
25315 * [en]The index of the currently active tab.[/en]
25316 * [ja]現在アクティブになっているタブのインデックスを返します。[/ja]
25317 * @description
25318 * [en]Returns tab index on current active tab. If active tab is not found, returns -1.[/en]
25319 * [ja]現在アクティブになっているタブのインデックスを返します。現在アクティブなタブがない場合には-1を返します。[/ja]
25320 */
25321 }, {
25322 key: "getActiveTabIndex",
25323 value: function getActiveTabIndex() {
25324 var tabs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.tabs;
25325 for (var i = 0; i < tabs.length; i++) {
25326 if (tabs[i] && tabs[i].tagName === 'ONS-TAB' && tabs[i].isActive()) {
25327 return i;
25328 }
25329 }
25330 return -1;
25331 }
25332 }, {
25333 key: "activeIndex",
25334 get: function get() {
25335 return Number(this.getAttribute('active-index'));
25336 },
25337 set: function set(value) {
25338 if (value !== null && value !== undefined) {
25339 this.setAttribute('active-index', value);
25340 }
25341 }
25342 }, {
25343 key: "_show",
25344 value: function _show() {
25345 var _this6 = this;
25346 this._swiper.show();
25347 setImmediate(function () {
25348 var tabs = _this6.tabs;
25349 var activeIndex = _this6.getActiveTabIndex(tabs);
25350 _this6._loadInactive.resolve();
25351 if (tabs.length > 0 && activeIndex >= 0) {
25352 tabs[activeIndex].loaded.then(function (el) {
25353 return el && setImmediate(function () {
25354 return el._show();
25355 });
25356 });
25357 }
25358 });
25359 }
25360 }, {
25361 key: "_hide",
25362 value: function _hide() {
25363 this._swiper.hide();
25364 var topPage = this.topPage;
25365 topPage && topPage._hide();
25366 }
25367 }, {
25368 key: "_destroy",
25369 value: function _destroy() {
25370 this.tabs.forEach(function (tab) {
25371 return tab.remove();
25372 });
25373 this.remove();
25374 }
25375 }, {
25376 key: "attributeChangedCallback",
25377 value: function attributeChangedCallback(name, last, current) {
25378 var _this7 = this;
25379 if (name === 'modifier') {
25380 ModifierUtil.onModifierChanged(last, current, this, scheme$2);
25381 var isTop = function isTop(m) {
25382 return /(^|\s+)top($|\s+)/i.test(m);
25383 };
25384 isTop(last) !== isTop(current) && this._updatePosition();
25385 } else if (name === 'position') {
25386 util$4.isAttached(this) && this._updatePosition();
25387 } else if (name === 'swipeable') {
25388 this._swiper && this._swiper.updateSwipeable(this.hasAttribute('swipeable'));
25389 } else if (name === 'hide-tabs') {
25390 this.isConnected && this._updateVisibility();
25391 } else if (name === 'active-index') {
25392 if (this._activeIndexSkipEffect) {
25393 this._activeIndexSkipEffect = false;
25394 } else if (this.isConnected) {
25395 contentReady(this, function () {
25396 return _this7._updateActiveIndex(current, last);
25397 });
25398 }
25399 }
25400 }
25401 }, {
25402 key: "animationOptions",
25403 get: function get() {
25404 return this.hasAttribute('animation-options') ? util$4.animationOptionsParse(this.getAttribute('animation-options')) : {};
25405 },
25406 set: function set(value) {
25407 if (value === undefined || value === null) {
25408 this.removeAttribute('animation-options');
25409 } else {
25410 this.setAttribute('animation-options', JSON.stringify(value));
25411 }
25412 }
25413 }], [{
25414 key: "observedAttributes",
25415 get: function get() {
25416 return ['modifier', 'position', 'swipeable', 'tab-border', 'hide-tabs', 'active-index'];
25417 }
25418 }, {
25419 key: "rewritables",
25420 get: function get() {
25421 return rewritables;
25422 }
25423 }, {
25424 key: "events",
25425 get: function get() {
25426 return ['prechange', 'postchange', 'reactive', 'swipe'];
25427 }
25428 }]);
25429 return TabbarElement;
25430 }(BaseElement);
25431 util$4.defineBooleanProperties(TabbarElement, ['hide-tabs', 'swipeable', 'tab-border']);
25432 onsElements.Tabbar = TabbarElement;
25433 customElements.define('ons-tabbar', TabbarElement);
25434
25435 var defaultClassName$1 = 'tabbar__item';
25436 var scheme$1 = {
25437 '': 'tabbar--*__item',
25438 '.tabbar__button': 'tabbar--*__button'
25439 };
25440
25441 /**
25442 * @element ons-tab
25443 * @category tabbar
25444 * @description
25445 * [en]Represents a tab inside tab bar. Each `<ons-tab>` represents a page.[/en]
25446 * [ja]
25447 * タブバーに配置される各アイテムのコンポーネントです。それぞれのons-tabはページを表します。
25448 * ons-tab要素の中には、タブに表示されるコンテンツを直接記述することが出来ます。
25449 * [/ja]
25450 * @codepen pGuDL
25451 * @tutorial vanilla/Reference/tabbar
25452 * @guide fundamentals.html#managing-pages
25453 * [en]Managing multiple pages.[/en]
25454 * [ja]複数のページを管理する[/ja]]
25455 * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
25456 * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
25457 * @seealso ons-tabbar
25458 * [en]ons-tabbar component[/en]
25459 * [ja]ons-tabbarコンポーネント[/ja]
25460 * @seealso ons-page
25461 * [en]ons-page component[/en]
25462 * [ja]ons-pageコンポーネント[/ja]
25463 * @seealso ons-icon
25464 * [en]ons-icon component[/en]
25465 * [ja]ons-iconコンポーネント[/ja]
25466 * @example
25467 * <ons-tabbar>
25468 * <ons-tab
25469 * page="home.html"
25470 * label="Home"
25471 * active>
25472 * </ons-tab>
25473 * <ons-tab
25474 * page="settings.html"
25475 * label="Settings"
25476 * active>
25477 * </ons-tab>
25478 * </ons-tabbar>
25479 *
25480 * <template id="home.html">
25481 * ...
25482 * </template>
25483 *
25484 * <template id="settings.html">
25485 * ...
25486 * </template>
25487
25488 */
25489 var TabElement = /*#__PURE__*/function (_BaseElement) {
25490 _inherits(TabElement, _BaseElement);
25491 var _super = _createSuper(TabElement);
25492 /**
25493 * @attribute page
25494 * @initonly
25495 * @type {String}
25496 * @description
25497 * [en]The page that is displayed when the tab is tapped.[/en]
25498 * [ja]ons-tabが参照するページへのURLを指定します。[/ja]
25499 */
25500
25501 /**
25502 * @attribute icon
25503 * @type {String}
25504 * @description
25505 * [en]
25506 * The icon name for the tab. Can specify the same icon name as `<ons-icon>`. Check [See also](#seealso) section for more information.
25507 * [/en]
25508 * [ja]
25509 * アイコン名を指定します。ons-iconと同じアイコン名を指定できます。
25510 * 個別にアイコンをカスタマイズする場合は、background-imageなどのCSSスタイルを用いて指定できます。
25511 * [/ja]
25512 */
25513
25514 /**
25515 * @attribute active-icon
25516 * @type {String}
25517 * @description
25518 * [en]The name of the icon when the tab is active.[/en]
25519 * [ja]アクティブの際のアイコン名を指定します。[/ja]
25520 */
25521
25522 /**
25523 * @attribute label
25524 * @type {String}
25525 * @description
25526 * [en]The label of the tab item.[/en]
25527 * [ja]アイコン下に表示されるラベルを指定します。[/ja]
25528 */
25529
25530 /**
25531 * @attribute badge
25532 * @type {String}
25533 * @description
25534 * [en]Display a notification badge on top of the tab.[/en]
25535 * [ja]バッジに表示する内容を指定します。[/ja]
25536 */
25537
25538 /**
25539 * @attribute active
25540 * @description
25541 * [en]This attribute should be set to the tab that is active by default.[/en]
25542 * [ja][/ja]
25543 */
25544
25545 function TabElement() {
25546 var _this;
25547 _classCallCheck(this, TabElement);
25548 _this = _super.call(this);
25549 if (['label', 'icon', 'badge'].some(_this.hasAttribute.bind(_assertThisInitialized(_this)))) {
25550 _this._compile();
25551 } else {
25552 contentReady(_assertThisInitialized(_this), function () {
25553 return _this._compile();
25554 });
25555 }
25556 _this._pageLoader = defaultPageLoader;
25557 _this._onClick = _this._onClick.bind(_assertThisInitialized(_this));
25558 var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
25559 onConnected = _util$defineListenerP.onConnected,
25560 onDisconnected = _util$defineListenerP.onDisconnected;
25561 _this._connectOnClick = onConnected;
25562 _this._disconnectOnClick = onDisconnected;
25563 return _this;
25564 }
25565 _createClass(TabElement, [{
25566 key: "pageLoader",
25567 get: function get() {
25568 return this._pageLoader;
25569 },
25570 set: function set(loader) {
25571 if (!(loader instanceof PageLoader)) {
25572 util$4.throwPageLoader();
25573 }
25574 this._pageLoader = loader;
25575 }
25576 }, {
25577 key: "_compile",
25578 value: function _compile() {
25579 autoStyle.prepare(this);
25580 this.classList.add(defaultClassName$1);
25581 if (this._button) {
25582 return;
25583 }
25584 var button = util$4.create('button.tabbar__button');
25585 while (this.childNodes[0]) {
25586 button.appendChild(this.childNodes[0]);
25587 }
25588 var input = util$4.create('input', {
25589 display: 'none'
25590 });
25591 input.type = 'radio';
25592 this.appendChild(input);
25593 this.appendChild(button);
25594 this._updateButtonContent();
25595 ModifierUtil.initModifier(this, scheme$1);
25596 this._updateRipple();
25597 }
25598 }, {
25599 key: "_updateRipple",
25600 value: function _updateRipple() {
25601 this._button && util$4.updateRipple(this._button, this.hasAttribute('ripple'));
25602 }
25603 }, {
25604 key: "_updateButtonContent",
25605 value: function _updateButtonContent() {
25606 var _this2 = this;
25607 var button = this._button;
25608 var iconWrapper = this._icon;
25609 if (this.hasAttribute('icon')) {
25610 iconWrapper = iconWrapper || util$4.createElement('<div class="tabbar__icon"><ons-icon></ons-icon></div>');
25611 var icon = iconWrapper.children[0];
25612 var fix = function (last) {
25613 return function () {
25614 return icon.attributeChangedCallback('icon', last, _this2.getAttribute('icon'));
25615 };
25616 }(icon.getAttribute('icon'));
25617 if (this.hasAttribute('icon') && this.hasAttribute('active-icon')) {
25618 icon.setAttribute('icon', this.getAttribute(this.isActive() ? 'active-icon' : 'icon'));
25619 } else if (this.hasAttribute('icon')) {
25620 icon.setAttribute('icon', this.getAttribute('icon'));
25621 }
25622 iconWrapper.parentElement !== button && button.insertBefore(iconWrapper, button.firstChild);
25623
25624 // dirty fix for https://github.com/OnsenUI/OnsenUI/issues/1654
25625 icon.attributeChangedCallback instanceof Function ? fix() : setImmediate(function () {
25626 return icon.attributeChangedCallback instanceof Function && fix();
25627 });
25628 } else {
25629 iconWrapper && iconWrapper.remove();
25630 }
25631 ['label', 'badge'].forEach(function (attr, index) {
25632 var prop = _this2.querySelector(".tabbar__".concat(attr));
25633 if (_this2.hasAttribute(attr)) {
25634 prop = prop || util$4.create(".tabbar__".concat(attr) + (attr === 'badge' ? ' notification' : ''));
25635 prop.textContent = _this2.getAttribute(attr);
25636 prop.parentElement !== button && button.appendChild(prop);
25637 } else {
25638 prop && prop.remove();
25639 }
25640 });
25641 }
25642 }, {
25643 key: "_input",
25644 get: function get() {
25645 return util$4.findChild(this, 'input');
25646 }
25647 }, {
25648 key: "_button",
25649 get: function get() {
25650 return util$4.findChild(this, '.tabbar__button');
25651 }
25652 }, {
25653 key: "_icon",
25654 get: function get() {
25655 return this.querySelector('.tabbar__icon');
25656 }
25657 }, {
25658 key: "_tabbar",
25659 get: function get() {
25660 return util$4.findParent(this, 'ons-tabbar');
25661 }
25662 }, {
25663 key: "index",
25664 get: function get() {
25665 return Array.prototype.indexOf.call(this.parentElement.children, this);
25666 }
25667 }, {
25668 key: "_onClick",
25669 value: function _onClick(event) {
25670 var _this3 = this;
25671 setTimeout(function () {
25672 if (!event.defaultPrevented) {
25673 _this3._tabbar.setActiveTab(_this3.index, {
25674 reject: false
25675 });
25676 }
25677 });
25678 }
25679 }, {
25680 key: "setActive",
25681 value: function setActive() {
25682 var _this4 = this;
25683 var active = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
25684 contentReady(this, function () {
25685 _this4._input.checked = active;
25686 _this4.classList.toggle('active', active);
25687 util$4.toggleAttribute(_this4, 'active', active);
25688 if (_this4.hasAttribute('icon') && _this4.hasAttribute('active-icon')) {
25689 _this4._icon.children[0].setAttribute('icon', _this4.getAttribute(active ? 'active-icon' : 'icon'));
25690 }
25691 });
25692 }
25693 }, {
25694 key: "_loadPageElement",
25695 value: function _loadPageElement(parent, page) {
25696 var _this5 = this;
25697 this._hasLoaded = true;
25698 return new Promise(function (resolve) {
25699 _this5._pageLoader.load({
25700 parent: parent,
25701 page: page
25702 }, function (pageElement) {
25703 parent.replaceChild(pageElement, parent.children[_this5.index]); // Ensure position
25704 _this5._loadedPage = pageElement;
25705 resolve(pageElement);
25706 });
25707 });
25708 }
25709 }, {
25710 key: "pageElement",
25711 get: function get() {
25712 // It has been loaded by ons-tab
25713 if (this._loadedPage) {
25714 return this._loadedPage;
25715 }
25716 // Manually attached to DOM, 1 per tab
25717 var tabbar = this._tabbar;
25718 if (tabbar.pages.length === tabbar.tabs.length) {
25719 return tabbar.pages[this.index];
25720 }
25721 // Loaded in another way
25722 return null;
25723 }
25724
25725 /**
25726 * @return {Boolean}
25727 */
25728 }, {
25729 key: "isActive",
25730 value: function isActive() {
25731 return this.classList.contains('active');
25732 }
25733 }, {
25734 key: "disconnectedCallback",
25735 value: function disconnectedCallback() {
25736 this.removeEventListener('click', this._onClick, false);
25737 if (this._loadedPage) {
25738 this._hasLoaded = false;
25739 this.loaded = null;
25740 }
25741 this._disconnectOnClick();
25742 }
25743 }, {
25744 key: "connectedCallback",
25745 value: function connectedCallback() {
25746 var _this6 = this;
25747 this.addEventListener('click', this._onClick, false);
25748 if (!util$4.isAttached(this) || this.loaded) {
25749 return; // ons-tabbar compilation may trigger this
25750 }
25751
25752 var deferred = util$4.defer();
25753 this.loaded = deferred.promise;
25754 contentReady(this, function () {
25755 var index = _this6.index;
25756 var tabbar = _this6._tabbar;
25757 if (!tabbar) {
25758 util$4.throw('Tab elements must be children of Tabbar');
25759 }
25760 if (tabbar.hasAttribute('modifier')) {
25761 util$4.addModifier(_this6, tabbar.getAttribute('modifier'));
25762 }
25763 if (!_this6._hasLoaded) {
25764 if (_this6.hasAttribute('active')) {
25765 _this6.setActive(true);
25766 tabbar.activeIndex = index;
25767 }
25768 if (index === tabbar.tabs.length - 1) {
25769 tabbar._onRefresh();
25770 setImmediate(function () {
25771 return tabbar._onRefresh();
25772 });
25773 }
25774 TabbarElement.rewritables.ready(tabbar, function () {
25775 var pageTarget = _this6.page || _this6.getAttribute('page');
25776 if (!_this6.pageElement && pageTarget) {
25777 var parentTarget = tabbar._targetElement;
25778 var dummyPage = util$4.create('div', {
25779 height: '100%',
25780 width: '100%',
25781 visibility: 'hidden'
25782 });
25783 parentTarget.insertBefore(dummyPage, parentTarget.children[index]); // Ensure position
25784
25785 var load = function load() {
25786 return _this6._loadPageElement(parentTarget, pageTarget).then(deferred.resolve);
25787 };
25788 return _this6.isActive() ? load() : tabbar._loadInactive.promise.then(load);
25789 }
25790 return deferred.resolve(_this6.pageElement);
25791 });
25792 }
25793 });
25794 this._connectOnClick();
25795 }
25796 }, {
25797 key: "attributeChangedCallback",
25798 value: function attributeChangedCallback(name, last, current) {
25799 var _this7 = this;
25800 switch (name) {
25801 case 'class':
25802 util$4.restoreClass(this, defaultClassName$1, scheme$1);
25803 break;
25804 case 'modifier':
25805 contentReady(this, function () {
25806 return ModifierUtil.onModifierChanged(last, current, _this7, scheme$1);
25807 });
25808 break;
25809 case 'ripple':
25810 contentReady(this, function () {
25811 return _this7._updateRipple();
25812 });
25813 break;
25814 case 'icon':
25815 case 'label':
25816 case 'badge':
25817 contentReady(this, function () {
25818 return _this7._updateButtonContent();
25819 });
25820 break;
25821 case 'page':
25822 this.page = current || '';
25823 break;
25824 }
25825 }
25826 }], [{
25827 key: "observedAttributes",
25828 get: function get() {
25829 return ['modifier', 'ripple', 'icon', 'label', 'page', 'badge', 'class'];
25830 }
25831 }]);
25832 return TabElement;
25833 }(BaseElement);
25834 onsElements.Tab = TabElement;
25835 customElements.define('ons-tab', TabElement);
25836
25837 var ToastAnimator = /*#__PURE__*/function (_BaseAnimator) {
25838 _inherits(ToastAnimator, _BaseAnimator);
25839 var _super = _createSuper(ToastAnimator);
25840 /**
25841 * @param {Object} options
25842 * @param {String} options.timing
25843 * @param {Number} options.duration
25844 * @param {Number} options.delay
25845 */
25846 function ToastAnimator() {
25847 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
25848 _ref$timing = _ref.timing,
25849 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
25850 _ref$delay = _ref.delay,
25851 delay = _ref$delay === void 0 ? 0 : _ref$delay,
25852 _ref$duration = _ref.duration,
25853 duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
25854 _classCallCheck(this, ToastAnimator);
25855 return _super.call(this, {
25856 timing: timing,
25857 delay: delay,
25858 duration: duration
25859 });
25860 }
25861
25862 /**
25863 * @param {HTMLElement} modal
25864 * @param {Function} callback
25865 */
25866 _createClass(ToastAnimator, [{
25867 key: "show",
25868 value: function show(modal, callback) {
25869 callback();
25870 }
25871
25872 /**
25873 * @param {HTMLElement} modal
25874 * @param {Function} callback
25875 */
25876 }, {
25877 key: "hide",
25878 value: function hide(modal, callback) {
25879 callback();
25880 }
25881 }]);
25882 return ToastAnimator;
25883 }(BaseAnimator);
25884
25885 /**
25886 * iOS style animator for dialog.
25887 */
25888 var FadeToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
25889 _inherits(FadeToastAnimator, _ToastAnimator);
25890 var _super = _createSuper(FadeToastAnimator);
25891 function FadeToastAnimator() {
25892 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
25893 _ref$timing = _ref.timing,
25894 timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
25895 _ref$delay = _ref.delay,
25896 delay = _ref$delay === void 0 ? 0 : _ref$delay,
25897 _ref$duration = _ref.duration,
25898 duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
25899 _classCallCheck(this, FadeToastAnimator);
25900 return _super.call(this, {
25901 timing: timing,
25902 delay: delay,
25903 duration: duration
25904 });
25905 }
25906
25907 /**
25908 * @param {HTMLElement} toast
25909 * @param {Function} callback
25910 */
25911 _createClass(FadeToastAnimator, [{
25912 key: "show",
25913 value: function show(toast, callback) {
25914 callback = callback ? callback : function () {};
25915 Animit(toast, this.def).default({
25916 opacity: 0
25917 }, {
25918 opacity: 1
25919 }).queue(function (done) {
25920 callback();
25921 done();
25922 }).play();
25923 }
25924
25925 /**
25926 * @param {HTMLElement} toast
25927 * @param {Function} callback
25928 */
25929 }, {
25930 key: "hide",
25931 value: function hide(toast, callback) {
25932 callback = callback ? callback : function () {};
25933 Animit(toast, this.def).default({
25934 opacity: 1
25935 }, {
25936 opacity: 0
25937 }).queue(function (done) {
25938 callback();
25939 done();
25940 }).play();
25941 }
25942 }]);
25943 return FadeToastAnimator;
25944 }(ToastAnimator);
25945
25946 /**
25947 * Ascend Toast Animator.
25948 */
25949 var AscendToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
25950 _inherits(AscendToastAnimator, _ToastAnimator);
25951 var _super = _createSuper(AscendToastAnimator);
25952 function AscendToastAnimator() {
25953 var _this;
25954 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
25955 _ref$timing = _ref.timing,
25956 timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
25957 _ref$delay = _ref.delay,
25958 delay = _ref$delay === void 0 ? 0 : _ref$delay,
25959 _ref$duration = _ref.duration,
25960 duration = _ref$duration === void 0 ? 0.25 : _ref$duration;
25961 _classCallCheck(this, AscendToastAnimator);
25962 _this = _super.call(this, {
25963 timing: timing,
25964 delay: delay,
25965 duration: duration
25966 });
25967 _this.messageDelay = _this.duration * 0.4 + _this.delay; // Delay message opacity change
25968 if (platform.isAndroid()) {
25969 _this.ascension = 48; // Toasts are always 1 line
25970 } else {
25971 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
25972 _this.ascension = 98; // 64 + 34
25973 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
25974 _this.ascension = 85; // 64 + 21
25975 } else {
25976 _this.ascension = 64;
25977 }
25978 }
25979 return _this;
25980 }
25981
25982 /**
25983 * @param {HTMLElement} toast
25984 * @param {Function} callback
25985 */
25986 _createClass(AscendToastAnimator, [{
25987 key: "show",
25988 value: function show(toast, callback) {
25989 toast = toast._toast;
25990 util$4.globals.fabOffset = this.ascension;
25991 Animit.runAll(Animit(toast, this.def).default({
25992 transform: "translate3d(0, ".concat(this.ascension, "px, 0)")
25993 }, {
25994 transform: 'translate3d(0, 0, 0)'
25995 }).queue(function (done) {
25996 callback && callback();
25997 done();
25998 }), Animit(this._getFabs()).wait(this.delay).queue({
25999 transform: "translate3d(0, -".concat(this.ascension, "px, 0) scale(1)")
26000 }, this.def), Animit(util$4.arrayFrom(toast.children), this.def).default({
26001 opacity: 0
26002 }, {
26003 opacity: 1
26004 }));
26005 }
26006
26007 /**
26008 * @param {HTMLElement} toast
26009 * @param {Function} callback
26010 */
26011 }, {
26012 key: "hide",
26013 value: function hide(toast, callback) {
26014 toast = toast._toast;
26015 util$4.globals.fabOffset = 0;
26016 Animit.runAll(Animit(toast, this.def).default({
26017 transform: 'translate3d(0, 0, 0)'
26018 }, {
26019 transform: "translate3d(0, ".concat(this.ascension, "px, 0)")
26020 }).queue(function (done) {
26021 callback && callback();
26022 done();
26023 }), Animit(this._getFabs(), this.def).wait(this.delay).queue({
26024 transform: "translate3d(0, 0, 0) scale(1)"
26025 }, this.def), Animit(util$4.arrayFrom(toast.children), this.def).default({
26026 opacity: 1
26027 }, {
26028 opacity: 0
26029 }));
26030 }
26031 }, {
26032 key: "_getFabs",
26033 value: function _getFabs() {
26034 return util$4.arrayFrom(document.querySelectorAll('ons-fab[position~=bottom], ons-speed-dial[position~=bottom]')).filter(function (fab) {
26035 return fab.visible;
26036 });
26037 }
26038 }]);
26039 return AscendToastAnimator;
26040 }(ToastAnimator);
26041
26042 /**
26043 * Lift-fade Toast Animator
26044 */
26045 var LiftToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
26046 _inherits(LiftToastAnimator, _ToastAnimator);
26047 var _super = _createSuper(LiftToastAnimator);
26048 function LiftToastAnimator() {
26049 var _this;
26050 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
26051 _ref$timing = _ref.timing,
26052 timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
26053 _ref$delay = _ref.delay,
26054 delay = _ref$delay === void 0 ? 0 : _ref$delay,
26055 _ref$duration = _ref.duration,
26056 duration = _ref$duration === void 0 ? 0.35 : _ref$duration;
26057 _classCallCheck(this, LiftToastAnimator);
26058 _this = _super.call(this, {
26059 timing: timing,
26060 delay: delay,
26061 duration: duration
26062 });
26063 _this.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
26064 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
26065 _this.liftAmount = 'calc(100% + 34px)';
26066 } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
26067 _this.liftAmount = 'calc(100% + 21px)';
26068 } else {
26069 _this.liftAmount = '100%';
26070 }
26071 return _this;
26072 }
26073
26074 /**
26075 * @param {HTMLElement} toast
26076 * @param {Function} callback
26077 */
26078 _createClass(LiftToastAnimator, [{
26079 key: "show",
26080 value: function show(toast, callback) {
26081 toast = toast._toast;
26082 Animit.runAll(Animit(toast, this.def).default({
26083 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)"),
26084 opacity: 0
26085 }, {
26086 transform: 'translate3d(0, 0, 0)',
26087 opacity: 1
26088 }).queue(function (done) {
26089 callback && callback();
26090 done();
26091 }));
26092 }
26093
26094 /**
26095 * @param {HTMLElement} toast
26096 * @param {Function} callback
26097 */
26098 }, {
26099 key: "hide",
26100 value: function hide(toast, callback) {
26101 toast = toast._toast;
26102 Animit.runAll(Animit(toast, this.def).default({
26103 transform: 'translate3d(0, 0, 0)',
26104 opacity: 1
26105 }, {
26106 transform: "translate3d(0, ".concat(this.liftAmount, ", 0)"),
26107 opacity: 0
26108 }).queue(function (done) {
26109 callback && callback();
26110 done();
26111 }));
26112 }
26113 }, {
26114 key: "_updatePosition",
26115 value: function _updatePosition(toast) {
26116 if (parseInt(toast.style.top, 10) === 0) {
26117 toast.style.top = toast.style.bottom = '';
26118 }
26119 }
26120 }]);
26121 return LiftToastAnimator;
26122 }(ToastAnimator);
26123
26124 /**
26125 * Fall-fade Toast Animator
26126 */
26127 var FallToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
26128 _inherits(FallToastAnimator, _ToastAnimator);
26129 var _super = _createSuper(FallToastAnimator);
26130 function FallToastAnimator() {
26131 var _this;
26132 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
26133 _ref$timing = _ref.timing,
26134 timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
26135 _ref$delay = _ref.delay,
26136 delay = _ref$delay === void 0 ? 0 : _ref$delay,
26137 _ref$duration = _ref.duration,
26138 duration = _ref$duration === void 0 ? 0.35 : _ref$duration;
26139 _classCallCheck(this, FallToastAnimator);
26140 _this = _super.call(this, {
26141 timing: timing,
26142 delay: delay,
26143 duration: duration
26144 });
26145 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
26146 _this.fallAmount = 'calc(-100% - 44px)';
26147 } else {
26148 _this.fallAmount = '-100%';
26149 }
26150 return _this;
26151 }
26152
26153 /**
26154 * @param {HTMLElement} toast
26155 * @param {Function} callback
26156 */
26157 _createClass(FallToastAnimator, [{
26158 key: "show",
26159 value: function show(toast, callback) {
26160 toast = toast._toast;
26161 this._updatePosition(toast);
26162 Animit.runAll(Animit(toast, this.def).default({
26163 transform: "translate3d(0, ".concat(this.fallAmount, ", 0)"),
26164 opacity: 0
26165 }, {
26166 transform: 'translate3d(0, 0, 0)',
26167 opacity: 1
26168 }).queue(function (done) {
26169 callback && callback();
26170 done();
26171 }));
26172 }
26173
26174 /**
26175 * @param {HTMLElement} toast
26176 * @param {Function} callback
26177 */
26178 }, {
26179 key: "hide",
26180 value: function hide(toast, callback) {
26181 var _this2 = this;
26182 toast = toast._toast;
26183 this._updatePosition(toast);
26184 Animit.runAll(Animit(toast, this.def).default({
26185 transform: 'translate3d(0, 0, 0)',
26186 opacity: 1
26187 }, {
26188 transform: "translate3d(0, ".concat(this.fallAmount, ", 0)"),
26189 opacity: 0
26190 }).queue(function (done) {
26191 _this2._updatePosition(toast, true);
26192 callback && callback();
26193 done();
26194 }));
26195 }
26196 }, {
26197 key: "_updatePosition",
26198 value: function _updatePosition(toast, cleanUp) {
26199 var correctTop;
26200 if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
26201 correctTop = '44px';
26202 } else {
26203 correctTop = '0';
26204 }
26205 if (toast.style.top !== correctTop) {
26206 toast.style.top = correctTop;
26207 toast.style.bottom = 'initial';
26208 }
26209 }
26210 }]);
26211 return FallToastAnimator;
26212 }(ToastAnimator);
26213
26214 var scheme = {
26215 '.toast': 'toast--*',
26216 '.toast__message': 'toast--*__message',
26217 '.toast__button': 'toast--*__button'
26218 };
26219 var defaultClassName = 'toast';
26220 var _animatorDict = {
26221 'default': platform.isAndroid() ? AscendToastAnimator : LiftToastAnimator,
26222 'fade': FadeToastAnimator,
26223 'ascend': AscendToastAnimator,
26224 'lift': LiftToastAnimator,
26225 'fall': FallToastAnimator,
26226 'none': ToastAnimator
26227 };
26228
26229 /**
26230 * @element ons-toast
26231 * @category dialog
26232 * @description
26233 * [en]
26234 * The Toast or Snackbar component is useful for displaying dismissable information or simple actions at (normally) the bottom of the page.
26235 *
26236 * This component does not block user input, allowing the app to continue its flow. For simple toasts, consider `ons.notification.toast` instead.
26237 * [/en]
26238 * [ja][/ja]
26239 * @tutorial vanilla/Reference/toast
26240 * @seealso ons-alert-dialog
26241 * [en]The `<ons-alert-dialog>` component is preferred for displaying undismissable information.[/en]
26242 * [ja][/ja]
26243 */
26244 var ToastElement = /*#__PURE__*/function (_BaseDialogElement) {
26245 _inherits(ToastElement, _BaseDialogElement);
26246 var _super = _createSuper(ToastElement);
26247 /**
26248 * @event preshow
26249 * @description
26250 * [en]Fired just before the toast is displayed.[/en]
26251 * [ja]ダイアログが表示される直前に発火します。[/ja]
26252 * @param {Object} event [en]Event object.[/en]
26253 * @param {Object} event.toast
26254 * [en]Toast object.[/en]
26255 * [ja]ダイアログのオブジェクト。[/ja]
26256 * @param {Function} event.cancel
26257 * [en]Execute to stop the toast from showing.[/en]
26258 * [ja]この関数を実行すると、ダイアログの表示を止めます。[/ja]
26259 */
26260
26261 /**
26262 * @event postshow
26263 * @description
26264 * [en]Fired just after the toast is displayed.[/en]
26265 * [ja]ダイアログが表示された直後に発火します。[/ja]
26266 * @param {Object} event [en]Event object.[/en]
26267 * @param {Object} event.toast
26268 * [en]Toast object.[/en]
26269 * [ja]ダイアログのオブジェクト。[/ja]
26270 */
26271
26272 /**
26273 * @event prehide
26274 * @description
26275 * [en]Fired just before the toast is hidden.[/en]
26276 * [ja]ダイアログが隠れる直前に発火します。[/ja]
26277 * @param {Object} event [en]Event object.[/en]
26278 * @param {Object} event.toast
26279 * [en]Toast object.[/en]
26280 * [ja]ダイアログのオブジェクト。[/ja]
26281 * @param {Function} event.cancel
26282 * [en]Execute to stop the toast from hiding.[/en]
26283 * [ja]この関数を実行すると、ダイアログが閉じようとするのを止めます。[/ja]
26284 */
26285
26286 /**
26287 * @event posthide
26288 * @description
26289 * [en]Fired just after the toast is hidden.[/en]
26290 * [ja]ダイアログが隠れた後に発火します。[/ja]
26291 * @param {Object} event [en]Event object.[/en]
26292 * @param {Object} event.toast
26293 * [en]Toast object.[/en]
26294 * [ja]ダイアログのオブジェクト。[/ja]
26295 */
26296
26297 /**
26298 * @attribute animation
26299 * @type {String}
26300 * @default default
26301 * @description
26302 * [en]The animation used when showing and hiding the toast. Can be either `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
26303 * [ja][/ja]
26304 */
26305
26306 /**
26307 * @attribute animation-options
26308 * @type {Expression}
26309 * @description
26310 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
26311 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. <code>{duration: 0.2, delay: 1, timing: 'ease-in'}</code>[/ja]
26312 */
26313
26314 /**
26315 * @property animationOptions
26316 * @type {Object}
26317 * @description
26318 * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
26319 * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
26320 */
26321
26322 /**
26323 * @attribute visible
26324 * @type {Boolean}
26325 * @description
26326 * [en]Whether the toast is visible or not.[/en]
26327 * [ja]要素が見える場合に`true`。[/ja]
26328 */
26329
26330 function ToastElement() {
26331 var _this;
26332 _classCallCheck(this, ToastElement);
26333 _this = _super.call(this);
26334 _this._defaultDBB = null;
26335 contentReady(_assertThisInitialized(_this), function () {
26336 return _this._compile();
26337 });
26338 return _this;
26339 }
26340 _createClass(ToastElement, [{
26341 key: "_scheme",
26342 get: function get() {
26343 return scheme;
26344 }
26345 }, {
26346 key: "_toast",
26347 get: function get() {
26348 return util$4.findChild(this, ".".concat(defaultClassName));
26349 }
26350 }, {
26351 key: "_updateAnimatorFactory",
26352 value: function _updateAnimatorFactory() {
26353 // Reset position style
26354 this._toast && (this._toast.style.top = this._toast.style.bottom = '');
26355 return new AnimatorFactory({
26356 animators: _animatorDict,
26357 baseClass: ToastAnimator,
26358 baseClassName: 'ToastAnimator',
26359 defaultAnimation: this.getAttribute('animation')
26360 });
26361 }
26362
26363 /**
26364 * @property onDeviceBackButton
26365 * @type {Object}
26366 * @description
26367 * [en]Back-button handler.[/en]
26368 * [ja]バックボタンハンドラ。[/ja]
26369 */
26370 }, {
26371 key: "_compile",
26372 value: function _compile() {
26373 autoStyle.prepare(this);
26374 this.style.display = 'none';
26375 this.style.zIndex = 10000; // Lower than dialogs
26376
26377 var messageClassName = 'toast__message';
26378 var buttonClassName = 'toast__button';
26379 var toast = util$4.findChild(this, ".".concat(defaultClassName));
26380 if (!toast) {
26381 toast = document.createElement('div');
26382 toast.classList.add(defaultClassName);
26383 while (this.childNodes[0]) {
26384 toast.appendChild(this.childNodes[0]);
26385 }
26386 }
26387 var button = util$4.findChild(toast, ".".concat(buttonClassName));
26388 if (!button) {
26389 button = util$4.findChild(toast, function (e) {
26390 return util$4.match(e, '.button') || util$4.match(e, 'button');
26391 });
26392 if (button) {
26393 button.classList.remove('button');
26394 button.classList.add(buttonClassName);
26395 toast.appendChild(button);
26396 }
26397 }
26398 if (!util$4.findChild(toast, ".".concat(messageClassName))) {
26399 var message = util$4.findChild(toast, '.message');
26400 if (!message) {
26401 message = document.createElement('div');
26402 for (var i = toast.childNodes.length - 1; i >= 0; i--) {
26403 if (toast.childNodes[i] !== button) {
26404 message.insertBefore(toast.childNodes[i], message.firstChild);
26405 }
26406 }
26407 }
26408 message.classList.add(messageClassName);
26409 toast.insertBefore(message, toast.firstChild);
26410 }
26411 if (toast.parentNode !== this) {
26412 this.appendChild(toast);
26413 }
26414 ModifierUtil.initModifier(this, this._scheme);
26415 }
26416
26417 /**
26418 * @property visible
26419 * @type {Boolean}
26420 * @description
26421 * [en]Whether the element is visible or not.[/en]
26422 * [ja]要素が見える場合に`true`。[/ja]
26423 */
26424
26425 /**
26426 * @method show
26427 * @signature show([options])
26428 * @param {Object} [options]
26429 * [en]Parameter object.[/en]
26430 * [ja]オプションを指定するオブジェクト。[/ja]
26431 * @param {String} [options.animation]
26432 * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
26433 * [ja][/ja]
26434 * @param {String} [options.animationOptions]
26435 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
26436 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
26437 * @description
26438 * [en]Show the element.[/en]
26439 * [ja][/ja]
26440 * @return {Promise}
26441 * [en]Resolves to the displayed element[/en]
26442 * [ja][/ja]
26443 */
26444
26445 /**
26446 * @method toggle
26447 * @signature toggle([options])
26448 * @param {Object} [options]
26449 * [en]Parameter object.[/en]
26450 * [ja]オプションを指定するオブジェクト。[/ja]
26451 * @param {String} [options.animation]
26452 * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
26453 * [ja][/ja]
26454 * @param {String} [options.animationOptions]
26455 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
26456 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
26457 * @description
26458 * [en]Toggle toast visibility.[/en]
26459 * [ja][/ja]
26460 */
26461
26462 /**
26463 * @method hide
26464 * @signature hide([options])
26465 * @param {Object} [options]
26466 * [en]Parameter object.[/en]
26467 * [ja]オプションを指定するオブジェクト。[/ja]
26468 * @param {String} [options.animation]
26469 * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
26470 * [ja][/ja]
26471 * @param {String} [options.animationOptions]
26472 * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
26473 * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
26474 * @description
26475 * [en]Hide toast.[/en]
26476 * [ja][/ja]
26477 * @return {Promise}
26478 * [en]Resolves to the hidden element[/en]
26479 * [ja][/ja]
26480 */
26481
26482 /**
26483 * @param {String} name
26484 * @param {Function} Animator
26485 */
26486 }], [{
26487 key: "registerAnimator",
26488 value: function registerAnimator(name, Animator) {
26489 if (!(Animator.prototype instanceof ToastAnimator)) {
26490 util$4.throw('"Animator" param must inherit OnsToastElement.ToastAnimator');
26491 }
26492 _animatorDict[name] = Animator;
26493 }
26494 }, {
26495 key: "animators",
26496 get: function get() {
26497 return _animatorDict;
26498 }
26499 }, {
26500 key: "ToastAnimator",
26501 get: function get() {
26502 return ToastAnimator;
26503 }
26504 }]);
26505 return ToastElement;
26506 }(BaseDialogElement);
26507 onsElements.Toast = ToastElement;
26508 customElements.define('ons-toast', ToastElement);
26509
26510 /**
26511 * @element ons-toolbar-button
26512 * @category page
26513 * @modifier material
26514 * [en]Material Design toolbar button.[/en]
26515 * [ja][/ja]
26516 * @modifier outline
26517 * [en]A button with an outline.[/en]
26518 * [ja]アウトラインをもったボタンを表示します。[/ja]
26519 * @description
26520 * [en]Button component for ons-toolbar and ons-bottom-toolbar.[/en]
26521 * [ja]ons-toolbarあるいはons-bottom-toolbarに設置できるボタン用コンポーネントです。[/ja]
26522 * @codepen aHmGL
26523 * @tutorial vanilla/Reference/page
26524 * @guide compilation.html#toolbar-compilation
26525 * [en]Adding a toolbar[/en]
26526 * [ja]ツールバーの追加[/ja]
26527 * @seealso ons-toolbar
26528 * [en]The `<ons-toolbar>` component displays a navigation bar at the top of a page.[/en]
26529 * [ja]ons-toolbarコンポーネント[/ja]
26530 * @seealso ons-back-button
26531 * [en]The `<ons-back-button>` displays a back button in the navigation bar.[/en]
26532 * [ja]ons-back-buttonコンポーネント[/ja]
26533 * @example
26534 * <ons-toolbar>
26535 * <div class="left">
26536 * <ons-toolbar-button>
26537 * Button
26538 * </ons-toolbar-button>
26539 * </div>
26540 * <div class="center">
26541 * Title
26542 * </div>
26543 * <div class="right">
26544 * <ons-toolbar-button>
26545 * <ons-icon icon="ion-navicon" size="28px"></ons-icon>
26546 * </ons-toolbar-button>
26547 * </div>
26548 * </ons-toolbar>
26549 */
26550 var ToolbarButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
26551 _inherits(ToolbarButtonElement, _BaseButtonElement);
26552 var _super = _createSuper(ToolbarButtonElement);
26553 function ToolbarButtonElement() {
26554 _classCallCheck(this, ToolbarButtonElement);
26555 return _super.apply(this, arguments);
26556 }
26557 _createClass(ToolbarButtonElement, [{
26558 key: "_scheme",
26559 get:
26560 /**
26561 * @attribute modifier
26562 * @type {String}
26563 * @description
26564 * [en]The appearance of the button.[/en]
26565 * [ja]ボタンの表現を指定します。[/ja]
26566 */
26567
26568 /**
26569 * @attribute icon
26570 * @type {String}
26571 * @description
26572 * [en]Creates an `ons-icon` component with this string.[/en]
26573 * [ja]`ons-icon`コンポーネントを悪性します。[/ja]
26574 */
26575
26576 /**
26577 * @attribute disabled
26578 * @description
26579 * [en]Specify if button should be disabled.[/en]
26580 * [ja]ボタンを無効化する場合は指定してください。[/ja]
26581 */
26582
26583 /**
26584 * @property disabled
26585 * @type {Boolean}
26586 * @description
26587 * [en]Whether the element is disabled or not.[/en]
26588 * [ja]無効化されている場合に`true`。[/ja]
26589 */
26590
26591 function get() {
26592 return {
26593 '': 'toolbar-button--*'
26594 };
26595 }
26596 }, {
26597 key: "_defaultClassName",
26598 get: function get() {
26599 return 'toolbar-button';
26600 }
26601 }, {
26602 key: "_rippleOpt",
26603 get: function get() {
26604 return [this, undefined, {
26605 center: '',
26606 'size': 'contain',
26607 'background': 'transparent'
26608 }];
26609 }
26610 }]);
26611 return ToolbarButtonElement;
26612 }(BaseButtonElement);
26613 onsElements.ToolbarButton = ToolbarButtonElement;
26614 customElements.define('ons-toolbar-button', ToolbarButtonElement);
26615
26616 setup$1(ons); // Setup initial listeners
26617 window._superSecretOns = ons;
26618
26619 return ons;
26620
26621}));
26622//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25zZW51aS5qcyIsInNvdXJjZXMiOlsiLi4vZXNtL29ucy9wbGF0Zm9ybS5qcyIsIi4uL2VzbS9wb2x5ZmlsbHMvcG9seWZpbGwtc3dpdGNoZXMuanMiLCIuLi9lc20vcG9seWZpbGxzL2N1c3RvbS1lbGVtZW50cy9jdXN0b20tZWxlbWVudHMubWluLmpzIiwiLi4vZXNtL3BvbHlmaWxscy9NdXRhdGlvbk9ic2VydmVyQDAuNy4yMi9NdXRhdGlvbk9ic2VydmVyLmpzIiwiLi4vZXNtL3BvbHlmaWxscy9zZXRJbW1lZGlhdGVAMS4wLjIrbW9kL3NldEltbWVkaWF0ZS5qcyIsIi4uL2VzbS92ZW5kb3Ivdmlld3BvcnQuanMiLCIuLi9lc20vb25zL21pY3JvZXZlbnQuanMiLCIuLi9lc20vb25zL2VsZW1lbnRzLmpzIiwiLi4vZXNtL29ucy9zdHlsZXIuanMiLCIuLi9lc20vb25zL2F1dG9zdHlsZS5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyIsIi4uL2VzbS9vbnMvYW5pbWF0aW9uLW9wdGlvbnMtcGFyc2VyLmpzIiwiLi4vZXNtL29ucy91dGlsLmpzIiwiLi4vZXNtL29ucy9wYWdlLWF0dHJpYnV0ZS1leHByZXNzaW9uLmpzIiwiLi4vZXNtL29ucy9pbnRlcm5hbC9pbnRlcm5hbC5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvZGV2aWNlLWJhY2stYnV0dG9uLWRpc3BhdGNoZXIuanMiLCIuLi9lc20vb25zL2ludGVybmFsL2luZGV4LmpzIiwiLi4vZXNtL3NldHVwLmpzIiwiLi4vZXNtL29ucy9hbmltaXQuanMiLCIuLi9lc20vb25zL2dlc3R1cmUtZGV0ZWN0b3IuanMiLCIuLi9lc20vb25zL2NvbnRlbnQtcmVhZHkuanMiLCIuLi9lc20vb25zL2ludGVybmFsL3RvYXN0LXF1ZXVlLmpzIiwiLi4vZXNtL29ucy9ub3RpZmljYXRpb24uanMiLCIuLi9lc20vb25zL2FjdGlvbi1zaGVldC5qcyIsIi4uL2VzbS9vbnMvb3JpZW50YXRpb24uanMiLCIuLi9lc20vb25zL21vZGlmaWVyLmpzIiwiLi4vZXNtL29ucy9zb2Z0d2FyZS1rZXlib2FyZC5qcyIsIi4uL2VzbS9vbnMvZG9vcmxvY2suanMiLCIuLi9lc20vb25zL3BhZ2UtbG9hZGVyLmpzIiwiLi4vZXNtL29ucy9pbmRleC5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtZWxlbWVudC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtaWYuanMiLCIuLi9lc20vb25zL2Jhc2UtYW5pbWF0b3IuanMiLCIuLi9lc20vb25zL2lwaG9uZXgtcGF0Y2guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWFjdGlvbi1zaGVldC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtZGlhbG9nLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJpcHBsZS9hbmltYXRvci1jc3MuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJpcHBsZS5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtYnV0dG9uLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hbGVydC1kaWFsb2cvYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWFsZXJ0LWRpYWxvZy5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtYWxlcnQtZGlhbG9nLWJ1dHRvbi5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtYmFjay1idXR0b24uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWJvdHRvbS10b29sYmFyLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1idXR0b24uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNhcmQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNhcm91c2VsLWl0ZW0uanMiLCIuLi9lc20vb25zL2ludGVybmFsL3N3aXBlci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtY2Fyb3VzZWwuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNvbC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtZGlhbG9nL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1kaWFsb2cuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWZhYi5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtZ2VzdHVyZS1kZXRlY3Rvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtaWNvbi5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvbGF6eS1yZXBlYXQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWxhenktcmVwZWF0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1saXN0LWhlYWRlci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbGlzdC10aXRsZS5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbGlzdC1pdGVtL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1saXN0LWl0ZW0uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWxpc3QuanMiLCIuLi9lc20vZWxlbWVudHMvYmFzZS9iYXNlLWlucHV0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1pbnB1dC5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtY2hlY2tib3guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNoZWNrYm94LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1yYWRpby5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VhcmNoLWlucHV0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1tb2RhbC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwvZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwvbGlmdC1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwuanMiLCIuLi9lc20vb25zL2ludGVybmFsL3N3aXBlLXJldmVhbC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLXN3aXBlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLXNsaWRlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLWxpZnQtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLW5hdmlnYXRvci9pb3MtZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL21kLXNsaWRlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvbWQtbGlmdC1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL21kLWZhZGUtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLW5hdmlnYXRvci9ub25lLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXRvb2xiYXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBhZ2UuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBvcG92ZXIvYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBvcG92ZXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXByb2dyZXNzLWJhci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtcHJvZ3Jlc3MtY2lyY3VsYXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXB1bGwtaG9vay5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtcmFuZ2UuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJvdy5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VnbWVudC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VsZWN0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGVlZC1kaWFsLWl0ZW0uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwZWVkLWRpYWwuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLWNvbnRlbnQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLW1hc2suanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9vdmVybGF5LWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9wdXNoLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9yZXZlYWwtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci1zaWRlLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zd2l0Y2guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXRhYmJhci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdGFiLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9hc3QvZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9hc3QvYXNjZW5kLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9saWZ0LWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9mYWxsLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9vbGJhci1idXR0b24uanMiLCIuLi9lc20vaW5kZXgudW1kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbi8vIFNhdmUgSFRNTEVsZW1lbnQgb2JqZWN0IGJlZm9yZSBDdXN0b20gRWxlbWVudHMgcG9seWZpbGwgcGF0Y2ggZ2xvYmFsIEhUTUxFbGVtZW50LlxuY29uc3QgTmF0aXZlSFRNTEVsZW1lbnQgPSB3aW5kb3cuSFRNTEVsZW1lbnQ7XG5cbi8qKlxuICogQG9iamVjdCBvbnMucGxhdGZvcm1cbiAqIEBjYXRlZ29yeSB1dGlsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVV0aWxpdHkgbWV0aG9kcyB0byBkZXRlY3QgY3VycmVudCBwbGF0Zm9ybS5bL2VuXVxuICogICBbamFd54++5Zyo5a6f6KGM44GV44KM44Gm44GE44KL44OX44Op44OD44OI44OV44Kp44O844Og44KS5qSc55+l44GZ44KL44Gf44KB44Gu44Om44O844OG44Kj44Oq44OG44Kj44Oh44K944OD44OJ44KS5Y+O44KB44Gf44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqL1xuY2xhc3MgUGxhdGZvcm0ge1xuXG4gIC8qKlxuICAgKiBBbGwgZWxlbWVudHMgd2lsbCBiZSByZW5kZXJlZCBhcyBpZiB0aGUgYXBwIHdhcyBydW5uaW5nIG9uIHRoaXMgcGxhdGZvcm0uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFBsYXRmb3JtID0gbnVsbDtcbiAgICB0aGlzLl9pZ25vcmVQbGF0Zm9ybVNlbGVjdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2VsZWN0XG4gICAqIEBzaWduYXR1cmUgc2VsZWN0KHBsYXRmb3JtKVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBsYXRmb3JtIE5hbWUgb2YgdGhlIHBsYXRmb3JtLlxuICAgKiAgIFtlbl1Qb3NzaWJsZSB2YWx1ZXMgYXJlOiBcIm9wZXJhXCIsIFwiZmlyZWZveFwiLCBcInNhZmFyaVwiLCBcImNocm9tZVwiLCBcImllXCIsIFwiYW5kcm9pZFwiLCBcImJsYWNrYmVycnlcIiwgXCJpb3NcIiBvciBcIndwXCIuWy9lbl1cbiAgICogICBbamFdXCJvcGVyYVwiLCBcImZpcmVmb3hcIiwgXCJzYWZhcmlcIiwgXCJjaHJvbWVcIiwgXCJpZVwiLCBcImFuZHJvaWRcIiwgXCJibGFja2JlcnJ5XCIsIFwiaW9zXCIsIFwid3BcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TZXRzIHRoZSBwbGF0Zm9ybSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudHMuIFVzZWZ1bCBmb3IgdGVzdGluZy5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgpLmj4/nlLvjgZnjgovjgZ/jgoHjgavliKnnlKjjgZnjgovjg5fjg6njg4Pjg4jjg5Xjgqnjg7zjg6DlkI3jgpLoqK3lrprjgZfjgb7jgZnjgILjg4bjgrnjg4jjgavkvr/liKnjgafjgZnjgIJbL2phXVxuICAgKi9cbiAgc2VsZWN0KHBsYXRmb3JtKSB7XG4gICAgaWYgKHR5cGVvZiBwbGF0Zm9ybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUGxhdGZvcm0gPSBwbGF0Zm9ybS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPyBudWxsIDogdGhpcy5fc2VsZWN0ZWRQbGF0Zm9ybTtcbiAgfVxuXG4gIF9ydW5PbkFjdHVhbFBsYXRmb3JtKGZuKSB7XG4gICAgdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuKCk7XG4gICAgdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPSBmYWxzZTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gR2VuZXJhbFxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNXZWJWaWV3XG4gICAqIEBzaWduYXR1cmUgaXNXZWJWaWV3KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciBhcHAgaXMgcnVubmluZyBpbiBDb3Jkb3ZhLlsvZW5dXG4gICAqICAgW2phXUNvcmRvdmHlhoXjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNXZWJWaWV3KCkge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXNXZWJWaWV3KCkgbWV0aG9kIGlzIGF2YWlsYWJsZSBhZnRlciBkb20gY29udGVudHMgbG9hZGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiAhISh3aW5kb3cuY29yZG92YSB8fCB3aW5kb3cucGhvbmVnYXAgfHwgd2luZG93LlBob25lR2FwKTtcbiAgfVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBpT1MgZGV2aWNlc1xuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNJUGhvbmVcbiAgICogQHNpZ25hdHVyZSBpc0lQaG9uZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGhvbmUuWy9lbl1cbiAgICogICBbamFdaVBob25l5LiK44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzSVBob25lKCkge1xuICAgIHJldHVybiAvaVBob25lL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBob25lWFxuICAgKiBAc2lnbmF0dXJlIGlzSVBob25lWCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGhvbmUgWCwgWFMsIFhTIE1heCwgWFIsIDExLCAxMSBQcm8sIDExIFBybyBNYXgsIDEyIE1pbmksIDEyLCAxMiBQcm8gb3IgMTIgUHJvIE1heCwgMTMgTWluaSwgMTMsIDEzIFBybywgMTMgUHJvIE1heCwgMTQsIDE0IFBsdXMsIDE0IFBybywgMTQgUHJvIE1heC5bL2VuXVxuICAgKiAgIFtqYV1pUGhvbmUgWCDjgoQgWFPjgIFYUyBNYXjjgIFYUuOAgTEx44CBMTEgUHJv44CBMTEgUHJvIE1heOOAgTEyIE1pbmnjgIExMuOAgTEyIFByb+OAgTEyIFBybyBNYXjjgIExMyBNaW5p44CBMTPjgIExMyBQcm/jgIExMyBQcm8gTWF444CBMTTjgIExNCBQbHVz44CBMTQgUHJv44CB44G+44Gf44GvMTQgUHJvIE1heOS4iuOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0lQaG9uZVgoKSB7XG4gICAgLy8gaU9TIFdlYlZpZXdzIG9uIHRoZSBzYW1lIGlPUyB2ZXJzaW9uIGhhdmUgdGhlIHNhbWUgdXNlciBhZ2VudC5cbiAgICAvLyBXZSBjYW5ub3QgYXZvaWQgdXNpbmcgd2luZG93LnNjcmVlbi5cbiAgICAvLyBXZSBhbHNvIGNhbm5vdCB1c2UgY29yZG92YS1wbHVnaW4tZGV2aWNlIHNpbmNlIGl0cyBiZWhhdmlvciBpcyBkaWZmZXJlbnQgYmV0d2VlbiBzaW11bGF0b3JzIGFuZCByZWFsIGRldmljZXMuXG4gICAgLy8gVGhpcyB3b3JrcyB3ZWxsIGJvdGggaW4gaU9TIFNhZmFyaSBhbmQgKFVJfFdLKVdlYlZpZXcgb2YgaVBob25lIFguXG4gICAgcmV0dXJuIHRoaXMuaXNJUGhvbmUoKSAmJlxuICAgICAgKFxuICAgICAgICAvLyBYLCBYUywgMTEgUHJvLCAxMiBNaW5pLCAxMyBNaW5pXG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDM3NSAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gODEyIHx8IC8vIHBvcnRyYWl0XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDgxMiAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gMzc1IHx8IC8vIGxhbmRzY2FwZVxuXG4gICAgICAgIC8vIFhTIE1heCwgWFIsIDExLCAxMSBQcm8gTWF4XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDQxNCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gODk2IHx8IC8vIHBvcnRyYWl0XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDg5NiAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gNDE0IHx8IC8vIGxhbmRzY2FwZVxuXG4gICAgICAgIC8vIDEyLCAxMiBQcm8sIDEzLCAxMyBQcm8sIDE0XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDM5MCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gODQ0IHx8IC8vIHBvcnRyYWl0XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDg0NCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gMzkwIHx8IC8vIGxhbmRzY2FwZVxuXG4gICAgICAgIC8vIDEyIFBybyBNYXgsIDEzIFBybyBNYXgsIDE0IFBsdXNcbiAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCA9PT0gNDI4ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0ID09PSA5MjYgfHwgLy8gcG9ydHJhaXRcbiAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCA9PT0gOTI2ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0ID09PSA0MjggfHwgLy8gbGFuZHNjYXBlXG5cbiAgICAgICAgLy8gMTQgUHJvIE1heFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA0MzAgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDkzMiB8fCAvLyBwb3J0cmFpdFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA5MzIgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDQzMCB8fCAvLyBsYW5kc2NhcGVcblxuICAgICAgICAgIC8vIDE0IFByb1xuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSAzOTMgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDg1MiB8fC8vIHBvcnRyYWl0XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDg1MiAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gMzkzIC8vIGxhbmRzY2FwZVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBhZFxuICAgKiBAc2lnbmF0dXJlIGlzSVBhZCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGFkLlsvZW5dXG4gICAqICAgW2phXWlQYWTkuIrjgaflrp/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/IGNhY2hlIDogY2FjaGVbMV07XG4gICAgICAgIHJldHVybiByZXNvbHZlKGludGVybmFsLm5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYWwgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFnZSk7XG4gICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgY29uc3QgaHRtbCA9IGxvY2FsLnRleHRDb250ZW50IHx8IGxvY2FsLmNvbnRlbnQ7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGh0bWwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCBwYWdlLCB0cnVlKTtcbiAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgaHRtbCA9IHhoci5yZXNwb25zZVRleHQ7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDQwMCAmJiB4aHIuc3RhdHVzIDwgNjAwKSB7XG4gICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmVqZWN0KDQwNCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChodG1sKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVmcmVzaCBzY3JpcHQgdGFnc1xuICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gdXRpbC5jcmVhdGVGcmFnbWVudChodG1sKTtcbiAgICAgICAgICB1dGlsLmFycmF5RnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgIHNjcmlwdC50eXBlID0gZWwudHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgICAgIHNjcmlwdC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbC50ZXh0IHx8IGVsLnRleHRDb250ZW50IHx8IGVsLmlubmVySFRNTCkpO1xuICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoc2NyaXB0LCBlbCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpbnRlcm5hbC50ZW1wbGF0ZVN0b3JlLnNldChwYWdlLCBmcmFnbWVudCk7XG4gICAgICAgICAgcmVzb2x2ZShmcmFnbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB1dGlsLnRocm93KGBQYWdlIHRlbXBsYXRlIG5vdCBmb3VuZDogJHtwYWdlfWApO1xuICAgICAgfTtcbiAgICAgIHhoci5zZW5kKG51bGwpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmludGVybmFsLmdldFBhZ2VIVE1MQXN5bmMgPSBmdW5jdGlvbihwYWdlKSB7XG4gIGNvbnN0IHBhZ2VzID0gcGFnZUF0dHJpYnV0ZUV4cHJlc3Npb24uZXZhbHVhdGUocGFnZSk7XG5cbiAgY29uc3QgZ2V0UGFnZSA9IChwYWdlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBwYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdNdXN0IHNwZWNpZnkgYSBwYWdlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcm5hbC5nZXRUZW1wbGF0ZUhUTUxBc3luYyhwYWdlKVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgIGlmIChwYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldFBhZ2UocGFnZXMuc2hpZnQoKSk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gZ2V0UGFnZShwYWdlcy5zaGlmdCgpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGludGVybmFsO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vaW50ZXJuYWwvaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbmltYXRvckZhY3Rvcnkge1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cy5hbmltYXRvcnMgVGhlIGRpY3Rpb25hcnkgZm9yIGFuaW1hdG9yIGNsYXNzZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0cy5iYXNlQ2xhc3MgVGhlIGJhc2UgY2xhc3Mgb2YgYW5pbWF0b3JzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0cy5iYXNlQ2xhc3NOYW1lXSBUaGUgbmFtZSBvZiB0aGUgYmFzZSBjbGFzcyBvZiBhbmltYXRvcnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRzLmRlZmF1bHRBbmltYXRpb25dIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5kZWZhdWx0QW5pbWF0aW9uT3B0aW9uc10gVGhlIGRlZmF1bHQgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICB0aGlzLl9hbmltYXRvcnMgPSBvcHRzLmFuaW1hdG9ycztcbiAgICB0aGlzLl9iYXNlQ2xhc3MgPSBvcHRzLmJhc2VDbGFzcztcbiAgICB0aGlzLl9iYXNlQ2xhc3NOYW1lID0gb3B0cy5iYXNlQ2xhc3NOYW1lIHx8IG9wdHMuYmFzZUNsYXNzLm5hbWU7XG4gICAgdGhpcy5fYW5pbWF0aW9uID0gb3B0cy5kZWZhdWx0QW5pbWF0aW9uIHx8ICdkZWZhdWx0JztcbiAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zID0gb3B0cy5kZWZhdWx0QW5pbWF0aW9uT3B0aW9ucyB8fCB7fTtcblxuICAgIGlmICghdGhpcy5fYW5pbWF0b3JzW3RoaXMuX2FuaW1hdGlvbl0pIHtcbiAgICAgIHV0aWwudGhyb3coJ05vIHN1Y2ggYW5pbWF0aW9uOiAnICsgdGhpcy5fYW5pbWF0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IGpzb25TdHJpbmdcbiAgICogQHJldHVybiB7T2JqZWN0L251bGx9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VBbmltYXRpb25PcHRpb25zU3RyaW5nKGpzb25TdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBqc29uU3RyaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB1dGlsLmFuaW1hdGlvbk9wdGlvbnNQYXJzZShqc29uU3RyaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignXCJhbmltYXRpb24tb3B0aW9uc1wiIGF0dHJpYnV0ZSBtdXN0IGJlIGEgSlNPTiBvYmplY3Qgc3RyaW5nOiAnICsganNvblN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdcImFuaW1hdGlvbi1vcHRpb25zXCIgYXR0cmlidXRlIG11c3QgYmUgYSBKU09OIG9iamVjdCBzdHJpbmc6ICcgKyBqc29uU3RyaW5nKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIHNldEFuaW1hdGlvbk9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuX2FuaW1hdGlvbk9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIFRoZSBhbmltYXRpb24gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc10gVGhlIGFuaW1hdGlvbiBvcHRpb25zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0QW5pbWF0b3IgVGhlIGRlZmF1bHQgYW5pbWF0b3IgaW5zdGFuY2VcbiAgICogQHJldHVybiB7T2JqZWN0fSBBbiBhbmltYXRvciBpbnN0YW5jZVxuICAgKi9cbiAgbmV3QW5pbWF0b3Iob3B0aW9ucyA9IHt9LCBkZWZhdWx0QW5pbWF0b3IpIHtcblxuICAgIGxldCBhbmltYXRvciA9IG51bGw7XG5cbiAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gaW5zdGFuY2VvZiB0aGlzLl9iYXNlQ2xhc3MpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmFuaW1hdGlvbjtcbiAgICB9XG5cbiAgICBsZXQgQW5pbWF0b3IgPSBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmFuaW1hdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIEFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JzW29wdGlvbnMuYW5pbWF0aW9uXTtcbiAgICB9XG5cbiAgICBpZiAoIUFuaW1hdG9yICYmIGRlZmF1bHRBbmltYXRvcikge1xuICAgICAgYW5pbWF0b3IgPSBkZWZhdWx0QW5pbWF0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIEFuaW1hdG9yID0gQW5pbWF0b3IgfHwgdGhpcy5fYW5pbWF0b3JzW3RoaXMuX2FuaW1hdGlvbl07XG5cbiAgICAgIGNvbnN0IGFuaW1hdGlvbk9wdHMgPSB1dGlsLmV4dGVuZChcbiAgICAgICAge30sXG4gICAgICAgIHRoaXMuX2FuaW1hdGlvbk9wdGlvbnMsXG4gICAgICAgIG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9ucyB8fCB7fSxcbiAgICAgICAgaW50ZXJuYWwuY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA/IHtkdXJhdGlvbjogMCwgZGVsYXk6IDB9IDoge31cbiAgICAgICk7XG5cbiAgICAgIGFuaW1hdG9yID0gbmV3IEFuaW1hdG9yKGFuaW1hdGlvbk9wdHMpO1xuXG4gICAgICBpZiAodHlwZW9mIGFuaW1hdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFuaW1hdG9yID0gbmV3IGFuaW1hdG9yKGFuaW1hdGlvbk9wdHMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShhbmltYXRvciBpbnN0YW5jZW9mIHRoaXMuX2Jhc2VDbGFzcykpIHtcbiAgICAgIHV0aWwudGhyb3coYFwiYW5pbWF0b3JcIiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgJHt0aGlzLl9iYXNlQ2xhc3NOYW1lfWApO1xuICAgIH1cblxuICAgIHJldHVybiBhbmltYXRvcjtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtLmpzJztcblxuY29uc3QgdXRpbCA9IHtcbiAgX3JlYWR5OiBmYWxzZSxcblxuICBfZG9tQ29udGVudExvYWRlZDogZmFsc2UsXG5cbiAgX29uRE9NQ29udGVudExvYWRlZDogKCkgPT4ge1xuICAgIHV0aWwuX2RvbUNvbnRlbnRMb2FkZWQgPSB0cnVlO1xuXG4gICAgaWYgKHBsYXRmb3JtLmlzV2ViVmlldygpKSB7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCAoKSA9PiB7XG4gICAgICAgIHV0aWwuX3JlYWR5ID0gdHJ1ZTtcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5fcmVhZHkgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICBhZGRCYWNrQnV0dG9uTGlzdGVuZXI6IGZ1bmN0aW9uKGZuKSB7XG4gICAgaWYgKCF0aGlzLl9kb21Db250ZW50TG9hZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBhZnRlciBET01Db250ZW50TG9hZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3JlYWR5KSB7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmFja2J1dHRvbicsIGZuLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmFja2J1dHRvbicsIGZuLCBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgcmVtb3ZlQmFja0J1dHRvbkxpc3RlbmVyOiBmdW5jdGlvbihmbikge1xuICAgIGlmICghdGhpcy5fZG9tQ29udGVudExvYWRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgYWZ0ZXIgRE9NQ29udGVudExvYWRlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWFkeSkge1xuICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB1dGlsLl9vbkRPTUNvbnRlbnRMb2FkZWQoKSwgZmFsc2UpO1xuXG5jb25zdCBIYW5kbGVyUmVwb3NpdG9yeSA9IHtcbiAgX3N0b3JlOiB7fSxcblxuICBfZ2VuSWQ6ICgoKSA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHJldHVybiAoKSA9PiBpKys7XG4gIH0pKCksXG5cbiAgc2V0OiBmdW5jdGlvbihlbGVtZW50LCBoYW5kbGVyKSB7XG4gICAgaWYgKGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkKSB7XG4gICAgICB0aGlzLnJlbW92ZShlbGVtZW50KTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCA9IEhhbmRsZXJSZXBvc2l0b3J5Ll9nZW5JZCgpO1xuICAgIHRoaXMuX3N0b3JlW2lkXSA9IGhhbmRsZXI7XG4gIH0sXG5cbiAgcmVtb3ZlOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkKSB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RvcmVbZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWRdO1xuICAgICAgZGVsZXRlIGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkO1xuICAgIH1cbiAgfSxcblxuICBnZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQ7XG5cbiAgICBpZiAoIXRoaXMuX3N0b3JlW2lkXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlW2lkXTtcbiAgfSxcblxuICBoYXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQuZGF0YXNldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQ7XG5cbiAgICByZXR1cm4gISF0aGlzLl9zdG9yZVtpZF07XG4gIH1cbn07XG5cbmNsYXNzIERldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYm91bmRDYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBFbmFibGUgdG8gaGFuZGxlICdiYWNrYnV0dG9uJyBldmVudHMuXG4gICAqL1xuICBlbmFibGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgIHV0aWwuYWRkQmFja0J1dHRvbkxpc3RlbmVyKHRoaXMuX2JvdW5kQ2FsbGJhY2spO1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSB0byBoYW5kbGUgJ2JhY2tidXR0b24nIGV2ZW50cy5cbiAgICovXG4gIGRpc2FibGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgdXRpbC5yZW1vdmVCYWNrQnV0dG9uTGlzdGVuZXIodGhpcy5fYm91bmRDYWxsYmFjayk7XG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZSBhICdiYWNrYnV0dG9uJyBldmVudCBtYW51YWxseS5cbiAgICovXG4gIGZpcmVEZXZpY2VCYWNrQnV0dG9uRXZlbnQoKSB7XG4gICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5pbml0RXZlbnQoJ2JhY2tidXR0b24nLCB0cnVlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIF9jYWxsYmFjaygpIHtcbiAgICB0aGlzLl9kaXNwYXRjaERldmljZUJhY2tCdXR0b25FdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGNyZWF0ZUhhbmRsZXIoZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghKGNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0ge1xuICAgICAgX2NhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIF9lbGVtZW50OiBlbGVtZW50LFxuXG4gICAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgSGFuZGxlclJlcG9zaXRvcnkucmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgfSxcblxuICAgICAgc2V0TGlzdGVuZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICB9LFxuXG4gICAgICBlbmFibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBIYW5kbGVyUmVwb3NpdG9yeS5zZXQoZWxlbWVudCwgdGhpcyk7XG4gICAgICB9LFxuXG4gICAgICBpc0VuYWJsZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSGFuZGxlclJlcG9zaXRvcnkuZ2V0KGVsZW1lbnQpID09PSB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIEhhbmRsZXJSZXBvc2l0b3J5LnJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaGFuZGxlci5lbmFibGUoKTtcblxuICAgIHJldHVybiBoYW5kbGVyO1xuICB9XG5cbiAgX2Rpc3BhdGNoRGV2aWNlQmFja0J1dHRvbkV2ZW50KCkge1xuICAgIGNvbnN0IHRyZWUgPSB0aGlzLl9jYXB0dXJlVHJlZSgpO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2ZpbmRIYW5kbGVyTGVhZkVsZW1lbnQodHJlZSk7XG5cbiAgICBsZXQgaGFuZGxlciA9IEhhbmRsZXJSZXBvc2l0b3J5LmdldChlbGVtZW50KTtcbiAgICBoYW5kbGVyLl9jYWxsYmFjayhjcmVhdGVFdmVudChlbGVtZW50KSk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVFdmVudChlbGVtZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgY2FsbFBhcmVudEhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlclJlcG9zaXRvcnkuZ2V0KHBhcmVudCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5fY2FsbGJhY2soY3JlYXRlRXZlbnQocGFyZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIF9jYXB0dXJlVHJlZSgpIHtcbiAgICByZXR1cm4gY3JlYXRlVHJlZShkb2N1bWVudC5ib2R5KTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVRyZWUoZWxlbWVudCkge1xuICAgICAgY29uc3QgdHJlZSA9IHtcbiAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgY2hpbGRyZW46IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGFycmF5T2YoZWxlbWVudC5jaGlsZHJlbikubWFwKGZ1bmN0aW9uKGNoaWxkRWxlbWVudCkge1xuXG4gICAgICAgICAgaWYgKGNoaWxkRWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgY2hpbGRFbGVtZW50Ll9pc1Nob3duID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFIYW5kbGVyUmVwb3NpdG9yeS5oYXMoY2hpbGRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZVRyZWUoY2hpbGRFbGVtZW50KTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFIYW5kbGVyUmVwb3NpdG9yeS5oYXMocmVzdWx0LmVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFtyZXN1bHRdO1xuICAgICAgICB9KSlcbiAgICAgIH07XG5cbiAgICAgIGlmICghSGFuZGxlclJlcG9zaXRvcnkuaGFzKHRyZWUuZWxlbWVudCkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICBjb25zdCBzdWJUcmVlID0gdHJlZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICBpZiAoSGFuZGxlclJlcG9zaXRvcnkuaGFzKHN1YlRyZWUuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJUcmVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcnJheU9mKHRhcmdldCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldC5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaCh0YXJnZXRbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IHRyZWVcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBfZmluZEhhbmRsZXJMZWFmRWxlbWVudCh0cmVlKSB7XG4gICAgcmV0dXJuIGZpbmQodHJlZSk7XG5cbiAgICBmdW5jdGlvbiBmaW5kKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbm9kZS5lbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGZpbmQobm9kZS5jaGlsZHJlblswXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcChmdW5jdGlvbihjaGlsZE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZS5lbGVtZW50O1xuICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGlmICghbGVmdCkge1xuICAgICAgICAgIHJldHVybiByaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlZnRaID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUobGVmdCwgJycpLnpJbmRleCwgMTApO1xuICAgICAgICBjb25zdCByaWdodFogPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyaWdodCwgJycpLnpJbmRleCwgMTApO1xuXG4gICAgICAgIGlmICghaXNOYU4obGVmdFopICYmICFpc05hTihyaWdodFopKSB7XG4gICAgICAgICAgcmV0dXJuIGxlZnRaID4gcmlnaHRaID8gbGVmdCA6IHJpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXB0dXJpbmcgYmFja2J1dHRvbi1oYW5kbGVyIGlzIGZhaWx1cmUuJyk7XG4gICAgICB9LCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IERldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4vaW50ZXJuYWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIGZyb20gJy4vZGV2aWNlLWJhY2stYnV0dG9uLWRpc3BhdGNoZXIuanMnO1xuXG5pbnRlcm5hbC5BbmltYXRvckZhY3RvcnkgPSBBbmltYXRvckZhY3Rvcnk7XG5pbnRlcm5hbC5Nb2RpZmllclV0aWwgPSBNb2RpZmllclV0aWw7XG5pbnRlcm5hbC5kYmJEaXNwYXRjaGVyID0gZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXI7XG5cbmV4cG9ydCBkZWZhdWx0IGludGVybmFsO1xuXG4iLCJpbXBvcnQgJy4vb25zL3BsYXRmb3JtLmpzJzsgLy8gVGhpcyBmaWxlIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBDdXN0b20gRWxlbWVudHMgcG9seWZpbGxzLlxuaW1wb3J0ICcuL3BvbHlmaWxscy9pbmRleC5qcyc7XG5pbXBvcnQgJy4vdmVuZG9yL2luZGV4LmpzJztcbmltcG9ydCAnLi9vbnMvbWljcm9ldmVudC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXR1cChvbnMpIHtcbiAgaW50ZXJuYWwud2FpdERPTUNvbnRlbnRMb2FkZWQoZnVuY3Rpb24oKSB7XG4gICAgcmVnaXN0ZXIoJ3NjcmlwdFt0eXBlPVwidGV4dC90ZW1wbGF0ZVwiXScpO1xuICAgIHJlZ2lzdGVyKCdzY3JpcHRbdHlwZT1cInRleHQvbmctdGVtcGxhdGVcIl0nKTtcbiAgICByZWdpc3RlcigndGVtcGxhdGUnKTtcblxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKHF1ZXJ5KSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZXMgPSB3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbnRlcm5hbC50ZW1wbGF0ZVN0b3JlLnNldCh0ZW1wbGF0ZXNbaV0uZ2V0QXR0cmlidXRlKCdpZCcpLCB0ZW1wbGF0ZXNbaV0udGV4dENvbnRlbnQgfHwgdGVtcGxhdGVzW2ldLmNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHdpbmRvdy5fb25zTG9hZGVkKSB7XG4gICAgb25zLl91dGlsLndhcm4oJ09uc2VuIFVJIGlzIGxvYWRlZCBtb3JlIHRoYW4gb25jZS4nKTtcbiAgfVxuICB3aW5kb3cuX29uc0xvYWRlZCA9IHRydWU7XG5cbiAgb25zLnJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG9ucy5lbmFibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpO1xuICAgIG9ucy5fZGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyID0gb25zLl9pbnRlcm5hbC5kYmJEaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIod2luZG93LmRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuYXZpZ2F0b3IsICdhcHAnKSkge1xuICAgICAgICBuYXZpZ2F0b3IuYXBwLmV4aXRBcHAoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGNsb3NlIHRoZSBhcHAuIElzIFxcJ2NvcmRvdmEuanNcXCcgaW5jbHVkZWQ/XFxuRXJyb3I6IFxcJ3dpbmRvdy5uYXZpZ2F0b3IuYXBwXFwnIGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkb2N1bWVudC5ib2R5Ll9nZXN0dXJlRGV0ZWN0b3IgPSBuZXcgb25zLkdlc3R1cmVEZXRlY3Rvcihkb2N1bWVudC5ib2R5LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBTaW11bGF0ZSBEZXZpY2UgQmFjayBCdXR0b24gb24gRVNDIHByZXNzXG4gICAgaWYgKCFvbnMucGxhdGZvcm0uaXNXZWJWaWV3KCkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgIG9ucy5maXJlRGV2aWNlQmFja0J1dHRvbkV2ZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNldHVwIGxvYWRpbmcgcGxhY2Vob2xkZXJcbiAgICBvbnMuX3NldHVwTG9hZGluZ1BsYWNlSG9sZGVycygpO1xuICB9KTtcblxuICAvLyB2aWV3cG9ydC5qc1xuICBWaWV3cG9ydC5zZXR1cCgpO1xufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cblxuLyoqXG4gKiBNaW5pbWFsIGFuaW1hdGlvbiBsaWJyYXJ5IGZvciBtYW5hZ2luZyBjc3MgdHJhbnNpdGlvbiBvbiBtb2JpbGUgYnJvd3NlcnMuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIFRJTUVPVVRfUkFUSU8gPSAxLjQ7XG5cbnZhciB1dGlsID0ge1xufTtcblxuLy8gY2FwaXRhbGl6ZSBzdHJpbmdcbnV0aWwuY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnByb3BlcnR5XG4gKiBAcGFyYW0ge0Zsb2F0fSBwYXJhbXMuZHVyYXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudGltaW5nXG4gKi9cbnV0aWwuYnVpbGRUcmFuc2l0aW9uVmFsdWUgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgcGFyYW1zLnByb3BlcnR5ID0gcGFyYW1zLnByb3BlcnR5IHx8ICdhbGwnO1xuICBwYXJhbXMuZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb24gfHwgMC40O1xuICBwYXJhbXMudGltaW5nID0gcGFyYW1zLnRpbWluZyB8fCAnbGluZWFyJztcblxuICB2YXIgcHJvcHMgPSBwYXJhbXMucHJvcGVydHkuc3BsaXQoLyArLyk7XG5cbiAgcmV0dXJuIHByb3BzLm1hcChmdW5jdGlvbihwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AgKyAnICcgKyBwYXJhbXMuZHVyYXRpb24gKyAncyAnICsgcGFyYW1zLnRpbWluZztcbiAgfSkuam9pbignLCAnKTtcbn07XG5cbi8qKlxuICogQWRkIGFuIGV2ZW50IGhhbmRsZXIgb24gXCJ0cmFuc2l0aW9uZW5kXCIgZXZlbnQuXG4gKi9cbnV0aWwub25jZU9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHt9O1xuICB9XG5cbiAgdmFyIHJlbW92ZUxpc3RlbmVycyA9IGZ1bmN0aW9uKCkge1xuICAgIHV0aWwuX3RyYW5zaXRpb25FbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuLCBmYWxzZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGZuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAoZWxlbWVudCA9PSBldmVudC50YXJnZXQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG5cbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9O1xuXG4gIHV0aWwuX3RyYW5zaXRpb25FbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbiwgZmFsc2UpO1xuICB9KTtcblxuICByZXR1cm4gcmVtb3ZlTGlzdGVuZXJzO1xufTtcblxudXRpbC5fdHJhbnNpdGlvbkVuZEV2ZW50cyA9IChmdW5jdGlvbigpIHtcblxuICBpZiAoJ29udHJhbnNpdGlvbmVuZCcgaW4gd2luZG93KSB7XG4gICAgcmV0dXJuIFsndHJhbnNpdGlvbmVuZCddO1xuICB9XG5cbiAgaWYgKCdvbndlYmtpdHRyYW5zaXRpb25lbmQnIGluIHdpbmRvdykge1xuICAgIHJldHVybiBbJ3dlYmtpdFRyYW5zaXRpb25FbmQnXTtcbiAgfVxuXG4gIGlmICh1dGlsLnZlbmRvclByZWZpeCA9PT0gJ3dlYmtpdCcgfHwgdXRpbC52ZW5kb3JQcmVmaXggPT09ICdvJyB8fCB1dGlsLnZlbmRvclByZWZpeCA9PT0gJ21veicgfHwgdXRpbC52ZW5kb3JQcmVmaXggPT09ICdtcycpIHtcbiAgICByZXR1cm4gW3V0aWwudmVuZG9yUHJlZml4ICsgJ1RyYW5zaXRpb25FbmQnLCAndHJhbnNpdGlvbmVuZCddO1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufSkoKTtcblxudXRpbC5fY3NzUHJvcGVydHlEaWN0ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnJyk7XG4gIHZhciBkaWN0ID0ge307XG4gIHZhciBhID0gJ0EnLmNoYXJDb2RlQXQoMCk7XG4gIHZhciB6ID0gJ3onLmNoYXJDb2RlQXQoMCk7XG5cbiAgdmFyIHVwcGVyID0gZnVuY3Rpb24ocykge1xuICAgIHJldHVybiBzLnN1YnN0cigxKS50b1VwcGVyQ2FzZSgpO1xuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICB2YXIga2V5ID0gc3R5bGVzW2ldXG4gICAgLnJlcGxhY2UoL15bLV0rLywgJycpXG4gICAgLnJlcGxhY2UoL1stXVthLXpdL2csIHVwcGVyKVxuICAgIC5yZXBsYWNlKC9ebW96LywgJ01veicpO1xuXG4gICAgaWYgKGEgPD0ga2V5LmNoYXJDb2RlQXQoMCkgJiYgeiA+PSBrZXkuY2hhckNvZGVBdCgwKSkge1xuICAgICAgaWYgKGtleSAhPT0gJ2Nzc1RleHQnICYmIGtleSAhPT0gJ3BhcmVudFRleHQnKSB7XG4gICAgICAgIGRpY3Rba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpY3Q7XG59KSgpO1xuXG51dGlsLmhhc0Nzc1Byb3BlcnR5ID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gbmFtZSBpbiB1dGlsLl9jc3NQcm9wZXJ0eURpY3Q7XG59O1xuXG4vKipcbiAqIFZlbmRvciBwcmVmaXggZm9yIGNzcyBwcm9wZXJ0eS5cbiAqL1xudXRpbC52ZW5kb3JQcmVmaXggPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICcnKSxcbiAgICBwcmUgPSAoQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgICAuY2FsbChzdHlsZXMpXG4gICAgICAuam9pbignJylcbiAgICAgIC5tYXRjaCgvLShtb3p8d2Via2l0fG1zKS0vKSB8fCAoc3R5bGVzLk9MaW5rID09PSAnJyAmJiBbJycsICdvJ10pXG4gICAgKVsxXTtcbiAgICByZXR1cm4gcHJlO1xufSkoKTtcblxudXRpbC5mb3JjZUxheW91dEF0T25jZSA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBjYWxsYmFjaykge1xuICB0aGlzLmJhdGNoSW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgLy8gZm9yY2UgbGF5b3V0XG4gICAgICBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB9KTtcbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbn07XG5cbnV0aWwuYmF0Y2hJbW1lZGlhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFja3MgPSBbXTtcblxuICByZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY29uY3JlYXRlQ2FsbGJhY2tzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xuICAgICAgICBjYWxsYmFja3MgPSBbXTtcbiAgICAgICAgY29uY3JlYXRlQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfTtcbn0pKCk7XG5cbnV0aWwuYmF0Y2hBbmltYXRpb25GcmFtZSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrcyA9IFtdO1xuXG4gIHZhciByYWYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDYwKTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmFmKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY29uY3JlYXRlQ2FsbGJhY2tzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xuICAgICAgICBjYWxsYmFja3MgPSBbXTtcbiAgICAgICAgY29uY3JlYXRlQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfTtcbn0pKCk7XG5cbnV0aWwudHJhbnNpdGlvblByb3BlcnR5TmFtZSA9IChmdW5jdGlvbigpIHtcbiAgaWYgKHV0aWwuaGFzQ3NzUHJvcGVydHkoJ3RyYW5zaXRpb25EdXJhdGlvbicpKSB7XG4gICAgcmV0dXJuICd0cmFuc2l0aW9uJztcbiAgfVxuXG4gIGlmICh1dGlsLmhhc0Nzc1Byb3BlcnR5KHV0aWwudmVuZG9yUHJlZml4ICsgJ1RyYW5zaXRpb25EdXJhdGlvbicpKSB7XG4gICAgcmV0dXJuIHV0aWwudmVuZG9yUHJlZml4ICsgJ1RyYW5zaXRpb24nO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG59KSgpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICovXG52YXIgQW5pbWl0ID0gZnVuY3Rpb24oZWxlbWVudCwgZGVmYXVsdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFuaW1pdCkpIHtcbiAgICByZXR1cm4gbmV3IEFuaW1pdChlbGVtZW50LCBkZWZhdWx0cyk7XG4gIH1cblxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5lbGVtZW50cyA9IFtlbGVtZW50XTtcbiAgfSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWxlbWVudCkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudDtcblxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSBvciBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudC4nKTtcbiAgfVxuXG4gIHRoaXMuZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgdGhpcy50cmFuc2l0aW9uUXVldWUgPSBbXTtcbiAgdGhpcy5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0ID0gW107XG59O1xuXG5BbmltaXQucHJvdG90eXBlID0ge1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge0FycmF5fVxuICAgKi9cbiAgdHJhbnNpdGlvblF1ZXVlOiB1bmRlZmluZWQsXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9XG4gICAqL1xuICBlbGVtZW50czogdW5kZWZpbmVkLFxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge09iamVjdH1cbiAgICovXG4gIGRlZmF1bHRzOiB1bmRlZmluZWQsXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGFuaW1hdGlvbiBzZXF1ZW5jZSB3aXRoIHBhc3NlZCBhbmltYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgcGxheTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25RdWV1ZS5wdXNoKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1vc3Qgb2YgdGhlIGFuaW1hdGlvbnMgZm9sbG93IHRoaXMgZGVmYXVsdCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Zyb219IGNzcyBvciBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGNzc1xuICAgKiBAcGFyYW0ge3RvfSBjc3Mgb3Igb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBjc3NcbiAgICogQHBhcmFtIHtkZWxheX0gZGVsYXkgdG8gd2FpdFxuICAgKi9cbiAgZGVmYXVsdDogZnVuY3Rpb24oZnJvbSwgdG8sIGRlbGF5KSB7XG4gICAgZnVuY3Rpb24gc3RlcChwYXJhbXMsIGR1cmF0aW9uLCB0aW1pbmcpIHtcbiAgICAgIGlmIChwYXJhbXMuZHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkdXJhdGlvbiA9IHBhcmFtcy5kdXJhdGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudGltaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGltaW5nID0gcGFyYW1zLnRpbWluZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBwYXJhbXMuY3NzIHx8IHBhcmFtcyxcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICB0aW1pbmc6IHRpbWluZ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zYXZlU3R5bGUoKVxuICAgICAgLnF1ZXVlKHN0ZXAoZnJvbSwgMCwgdGhpcy5kZWZhdWx0cy50aW1pbmcpKVxuICAgICAgLndhaXQoZGVsYXkgPT09IHVuZGVmaW5lZCA/IHRoaXMuZGVmYXVsdHMuZGVsYXkgOiBkZWxheSlcbiAgICAgIC5xdWV1ZShzdGVwKHRvLCB0aGlzLmRlZmF1bHRzLmR1cmF0aW9uLCB0aGlzLmRlZmF1bHRzLnRpbWluZykpXG4gICAgICAucmVzdG9yZVN0eWxlKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFF1ZXVlIHRyYW5zaXRpb24gYW5pbWF0aW9ucyBvciBvdGhlciBmdW5jdGlvbi5cbiAgICpcbiAgICogZS5nLiBhbmltaXQoZWx0KS5xdWV1ZSh7Y29sb3I6ICdyZWQnfSlcbiAgICogZS5nLiBhbmltaXQoZWx0KS5xdWV1ZSh7Y29sb3I6ICdyZWQnfSwge2R1cmF0aW9uOiAwLjR9KVxuICAgKiBlLmcuIGFuaW1pdChlbHQpLnF1ZXVlKHtjc3M6IHtjb2xvcjogJ3JlZCd9LCBkdXJhdGlvbjogMC4yfSlcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8QW5pbWl0LlRyYW5zaXRpb258RnVuY3Rpb259IHRyYW5zaXRpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKi9cbiAgcXVldWU6IGZ1bmN0aW9uKHRyYW5zaXRpb24sIG9wdGlvbnMpIHtcbiAgICB2YXIgcXVldWUgPSB0aGlzLnRyYW5zaXRpb25RdWV1ZTtcblxuICAgIGlmICh0cmFuc2l0aW9uICYmIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMuY3NzID0gdHJhbnNpdGlvbjtcbiAgICAgIHRyYW5zaXRpb24gPSBuZXcgQW5pbWl0LlRyYW5zaXRpb24ob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKCEodHJhbnNpdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHRyYW5zaXRpb24gaW5zdGFuY2VvZiBBbmltaXQuVHJhbnNpdGlvbikpIHtcbiAgICAgIGlmICh0cmFuc2l0aW9uLmNzcykge1xuICAgICAgICB0cmFuc2l0aW9uID0gbmV3IEFuaW1pdC5UcmFuc2l0aW9uKHRyYW5zaXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBBbmltaXQuVHJhbnNpdGlvbih7XG4gICAgICAgICAgY3NzOiB0cmFuc2l0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0cmFuc2l0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHF1ZXVlLnB1c2godHJhbnNpdGlvbik7XG4gICAgfSBlbHNlIGlmICh0cmFuc2l0aW9uIGluc3RhbmNlb2YgQW5pbWl0LlRyYW5zaXRpb24pIHtcbiAgICAgIHF1ZXVlLnB1c2godHJhbnNpdGlvbi5idWlsZCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBRdWV1ZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7RmxvYXR9IHNlY29uZHNcbiAgICovXG4gIHdhaXQ6IGZ1bmN0aW9uKHNlY29uZHMpIHtcbiAgICBpZiAoc2Vjb25kcyA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvblF1ZXVlLnB1c2goZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICBzZXRUaW1lb3V0KGRvbmUsIDEwMDAgKiBzZWNvbmRzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNhdmVTdHlsZTogZnVuY3Rpb24oKSB7XG5cbiAgICB0aGlzLnRyYW5zaXRpb25RdWV1ZS5wdXNoKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuICAgICAgICB2YXIgY3NzID0gdGhpcy5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XSA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5zdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNzc1tlbGVtZW50LnN0eWxlW2ldXSA9IGVsZW1lbnQuc3R5bGVbZWxlbWVudC5zdHlsZVtpXV07XG4gICAgICAgIH1cbiAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICBkb25lKCk7XG4gICAgfS5iaW5kKHRoaXMpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGVsZW1lbnQncyBzdHlsZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Zsb2F0fSBbb3B0aW9ucy5kdXJhdGlvbl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpbWluZ11cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRyYW5zaXRpb25dXG4gICAqL1xuICByZXN0b3JlU3R5bGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uICYmICFvcHRpb25zLmR1cmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wib3B0aW9ucy5kdXJhdGlvblwiIGlzIHJlcXVpcmVkIHdoZW4gXCJvcHRpb25zLnRyYW5zaXRpb25cIiBpcyBlbmFibGVkLicpO1xuICAgIH1cblxuICAgIHZhciB0cmFuc2l0aW9uTmFtZSA9IHV0aWwudHJhbnNpdGlvblByb3BlcnR5TmFtZTtcblxuICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb24gfHwgKG9wdGlvbnMuZHVyYXRpb24gJiYgb3B0aW9ucy5kdXJhdGlvbiA+IDApKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvblZhbHVlID0gb3B0aW9ucy50cmFuc2l0aW9uIHx8ICgnYWxsICcgKyBvcHRpb25zLmR1cmF0aW9uICsgJ3MgJyArIChvcHRpb25zLnRpbWluZyB8fCAnbGluZWFyJykpO1xuXG4gICAgICB0aGlzLnRyYW5zaXRpb25RdWV1ZS5wdXNoKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICAgICAgdmFyIHRpbWVvdXRJZDtcblxuICAgICAgICB2YXIgY2xlYXJUcmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zaXRpb25OYW1lXSA9ICcnO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGFkZCBcInRyYW5zaXRpb25lbmRcIiBldmVudCBoYW5kbGVyXG4gICAgICAgIHZhciByZW1vdmVMaXN0ZW5lcnMgPSB1dGlsLm9uY2VPblRyYW5zaXRpb25FbmQoZWxlbWVudHNbMF0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIGNsZWFyVHJhbnNpdGlvbigpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZm9yIGZhaWwgc2FmZS5cbiAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICBjbGVhclRyYW5zaXRpb24oKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0sIG9wdGlvbnMuZHVyYXRpb24gKiAxMDAwICogVElNRU9VVF9SQVRJTyk7XG5cbiAgICAgICAgLy8gdHJhbnNpdGlvbiBhbmQgc3R5bGUgc2V0dGluZ3NcbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuXG4gICAgICAgICAgdmFyIGNzcyA9IHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF07XG5cbiAgICAgICAgICBpZiAoIWNzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXN0b3JlU3R5bGUoKTogVGhlIHN0eWxlIGlzIG5vdCBzYXZlZC4gSW52b2tlIHNhdmVTdHlsZSgpIGJlZm9yZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgdmFyIG5hbWU7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1lbnQuc3R5bGUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtZW50LnN0eWxlW2ldO1xuICAgICAgICAgICAgaWYgKGNzc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNzc1tuYW1lXSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsZW1lbnQuc3R5bGVbdHJhbnNpdGlvbk5hbWVdID0gdHJhbnNpdGlvblZhbHVlO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gdHJhbnNpdGlvbk5hbWUpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtrZXldID0gY3NzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zaXRpb25OYW1lXSA9IHRyYW5zaXRpb25WYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgIHJlc2V0KCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuXG4gICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAvLyBDbGVhciB0cmFuc2l0aW9uIGFuaW1hdGlvbiBzZXR0aW5ncy5cbiAgICAgIHNlbGYuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zaXRpb25OYW1lXSA9ICdub25lJztcblxuICAgICAgICB2YXIgY3NzID0gc2VsZi5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XTtcblxuICAgICAgICBpZiAoIWNzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVzdG9yZVN0eWxlKCk6IFRoZSBzdHlsZSBpcyBub3Qgc2F2ZWQuIEludm9rZSBzYXZlU3R5bGUoKSBiZWZvcmUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuYW1lID0gJyc7IGkgPCBlbGVtZW50LnN0eWxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbmFtZSA9IGVsZW1lbnQuc3R5bGVbaV07XG4gICAgICAgICAgaWYgKHR5cGVvZiBjc3NbZWxlbWVudC5zdHlsZVtpXV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjc3NbZWxlbWVudC5zdHlsZVtpXV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyhjc3MpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZVtrZXldID0gY3NzW2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGFuaW1hdGlvbiBzZXF1ZW5jZS5cbiAgICovXG4gIHN0YXJ0QW5pbWF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9kZXF1ZXVlVHJhbnNpdGlvbigpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgX2RlcXVldWVUcmFuc2l0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdHJhbnNpdGlvbiA9IHRoaXMudHJhbnNpdGlvblF1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFuc2l0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0N1cnJlbnQgdHJhbnNpdGlvbiBleGlzdHMuJyk7XG4gICAgfVxuICAgIHRoaXMuX2N1cnJlbnRUcmFuc2l0aW9uID0gdHJhbnNpdGlvbjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuXG4gICAgdmFyIGRvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIHNlbGYuX2N1cnJlbnRUcmFuc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzZWxmLl9kZXF1ZXVlVHJhbnNpdGlvbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlOiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB0d2ljZS4nKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgIHRyYW5zaXRpb24uY2FsbCh0aGlzLCBkb25lKTtcbiAgICB9XG4gIH1cblxufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FuaW1pdH0gYXJndW1lbnRzXG4gKi9cbkFuaW1pdC5ydW5BbGwgPSBmdW5jdGlvbigvKiBhcmd1bWVudHMuLi4gKi8pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhcmd1bWVudHNbaV0ucGxheSgpO1xuICB9XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7RmxvYXR9IFtvcHRpb25zLmR1cmF0aW9uXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnByb3BlcnR5XVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpbWluZ11cbiAqL1xuQW5pbWl0LlRyYW5zaXRpb24gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA9IHRoaXMub3B0aW9ucy5kdXJhdGlvbiB8fCAwO1xuICB0aGlzLm9wdGlvbnMudGltaW5nID0gdGhpcy5vcHRpb25zLnRpbWluZyB8fCAnbGluZWFyJztcbiAgdGhpcy5vcHRpb25zLmNzcyA9IHRoaXMub3B0aW9ucy5jc3MgfHwge307XG4gIHRoaXMub3B0aW9ucy5wcm9wZXJ0eSA9IHRoaXMub3B0aW9ucy5wcm9wZXJ0eSB8fCAnYWxsJztcbn07XG5cbkFuaW1pdC5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAgICovXG4gIGJ1aWxkOiBmdW5jdGlvbigpIHtcblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuY3NzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5jc3MgaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNzcyA9IGNyZWF0ZUFjdHVhbENzc1Byb3BzKHRoaXMub3B0aW9ucy5jc3MpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uVmFsdWUgPSB1dGlsLmJ1aWxkVHJhbnNpdGlvblZhbHVlKHRoaXMub3B0aW9ucyk7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgICAgICB2YXIgdGltZW91dCA9IHNlbGYub3B0aW9ucy5kdXJhdGlvbiAqIDEwMDAgKiBUSU1FT1VUX1JBVElPO1xuICAgICAgICB2YXIgdGltZW91dElkO1xuXG4gICAgICAgIHZhciByZW1vdmVMaXN0ZW5lcnMgPSB1dGlsLm9uY2VPblRyYW5zaXRpb25FbmQoZWxlbWVudHNbMF0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZVt1dGlsLnRyYW5zaXRpb25Qcm9wZXJ0eU5hbWVdID0gdHJhbnNpdGlvblZhbHVlO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZV0gPSBjc3NbbmFtZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZHVyYXRpb24gPD0gMCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZVt1dGlsLnRyYW5zaXRpb25Qcm9wZXJ0eU5hbWVdID0gJyc7XG5cbiAgICAgICAgICBPYmplY3Qua2V5cyhjc3MpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtuYW1lXSA9IGNzc1tuYW1lXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB1dGlsLmZvcmNlTGF5b3V0QXRPbmNlKGVsZW1lbnRzLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHV0aWwuYmF0Y2hBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXRpbC5iYXRjaEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVBY3R1YWxDc3NQcm9wcyhjc3MpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gY3NzW25hbWVdO1xuXG4gICAgICAgIGlmICh1dGlsLmhhc0Nzc1Byb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByZWZpeGVkID0gdXRpbC52ZW5kb3JQcmVmaXggKyB1dGlsLmNhcGl0YWxpemUobmFtZSk7XG4gICAgICAgIGlmICh1dGlsLmhhc0Nzc1Byb3BlcnR5KHByZWZpeGVkKSkge1xuICAgICAgICAgIHJlc3VsdFtwcmVmaXhlZF0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbcHJlZml4ZWRdID0gdmFsdWU7XG4gICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbmltaXQ7XG5cbiIsIi8qXG4gKiBHZXN0dXJlIGRldGVjdG9yIGxpYnJhcnkgdGhhdCBmb3JrZWQgZnJvbSBnaXRodWIuY29tL0VpZ2h0TWVkaWEvaGFtbWVyLmpzLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxudmFyIEV2ZW50LCBVdGlscywgRGV0ZWN0aW9uLCBQb2ludGVyRXZlbnQ7XG5cbi8qKlxuICogQG9iamVjdCBvbnMuR2VzdHVyZURldGVjdG9yXG4gKiBAY2F0ZWdvcnkgZ2VzdHVyZVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1VdGlsaXR5IGNsYXNzIGZvciBnZXN0dXJlIGRldGVjdGlvbi5bL2VuXVxuICogICBbamFd44K444Kn44K544OB44Oj44KS5qSc55+l44GZ44KL44Gf44KB44Gu44Om44O844OG44Kj44Oq44OG44Kj44Kv44Op44K544Gn44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBtZXRob2QgY29uc3RydWN0b3JcbiAqIEBzaWduYXR1cmUgY29uc3RydWN0b3IoZWxlbWVudFssIG9wdGlvbnNdKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXUNyZWF0ZSBhIG5ldyBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2UuWy9lbl1cbiAqICBbamFdR2VzdHVyZURldGVjdG9y44Gu44Kk44Oz44K544K/44Oz44K544KS55Sf5oiQ44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAqICAgW2phXeOCuOOCp+OCueODgeODo+OCkuaknOefpeOBmeOCi0RPTeimgee0oOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1PcHRpb25zIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEByZXR1cm4ge29ucy5HZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2V9XG4gKi9cbnZhciBHZXN0dXJlRGV0ZWN0b3IgPSBmdW5jdGlvbiBHZXN0dXJlRGV0ZWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEdlc3R1cmVEZXRlY3Rvci5JbnN0YW5jZShlbGVtZW50LCBvcHRpb25zIHx8IHt9KTtcbn07XG5cblxuLyoqXG4gKiBkZWZhdWx0IHNldHRpbmdzLlxuICogbW9yZSBzZXR0aW5ncyBhcmUgZGVmaW5lZCBwZXIgZ2VzdHVyZSBhdCBgL2dlc3R1cmVzYC4gRWFjaCBnZXN0dXJlIGNhbiBiZSBkaXNhYmxlZC9lbmFibGVkXG4gKiBieSBzZXR0aW5nIGl0J3MgbmFtZSAobGlrZSBgc3dpcGVgKSB0byBmYWxzZS5cbiAqIFlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0cyBmb3IgYWxsIGluc3RhbmNlcyBieSBjaGFuZ2luZyB0aGlzIG9iamVjdCBiZWZvcmUgY3JlYXRpbmcgYW4gaW5zdGFuY2UuXG4gKiBAZXhhbXBsZVxuICogYGBgYFxuICogIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5kcmFnID0gZmFsc2U7XG4gKiAgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzLmJlaGF2aW9yLnRvdWNoQWN0aW9uID0gJ3Bhbi15JztcbiAqICBkZWxldGUgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzLmJlaGF2aW9yLnVzZXJTZWxlY3Q7XG4gKiBgYGBgXG4gKiBAcHJvcGVydHkgZGVmYXVsdHNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cyA9IHtcbiAgYmVoYXZpb3I6IHtcbiAgICAvLyB1c2VyU2VsZWN0OiAnbm9uZScsIC8vIEFsc28gZGlzYWJsZXMgc2VsZWN0aW9uIGluIGBpbnB1dGAgY2hpbGRyZW5cbiAgICB0b3VjaEFjdGlvbjogJ3Bhbi15JyxcbiAgICB0b3VjaENhbGxvdXQ6ICdub25lJyxcbiAgICBjb250ZW50Wm9vbWluZzogJ25vbmUnLFxuICAgIHVzZXJEcmFnOiAnbm9uZScsXG4gICAgdGFwSGlnaGxpZ2h0Q29sb3I6ICdyZ2JhKDAsMCwwLDApJ1xuICB9XG59O1xuXG4vKipcbiAqIEdlc3R1cmVEZXRlY3RvciBkb2N1bWVudCB3aGVyZSB0aGUgYmFzZSBldmVudHMgYXJlIGFkZGVkIGF0XG4gKiBAcHJvcGVydHkgRE9DVU1FTlRcbiAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAqIEBkZWZhdWx0IHdpbmRvdy5kb2N1bWVudFxuICovXG5HZXN0dXJlRGV0ZWN0b3IuRE9DVU1FTlQgPSBkb2N1bWVudDtcblxuLyoqXG4gKiBkZXRlY3Qgc3VwcG9ydCBmb3IgcG9pbnRlciBldmVudHNcbiAqIEBwcm9wZXJ0eSBIQVNfUE9JTlRFUkVWRU5UU1xuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUyA9IG5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCB8fCBuYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZDtcblxuLyoqXG4gKiBkZXRlY3Qgc3VwcG9ydCBmb3IgdG91Y2ggZXZlbnRzXG4gKiBAcHJvcGVydHkgSEFTX1RPVUNIRVZFTlRTXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuR2VzdHVyZURldGVjdG9yLkhBU19UT1VDSEVWRU5UUyA9ICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpO1xuXG4vKipcbiAqIGRldGVjdCBtb2JpbGUgYnJvd3NlcnNcbiAqIEBwcm9wZXJ0eSBJU19NT0JJTEVcbiAqIEB0eXBlIHtCb29sZWFufVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSVNfTU9CSUxFID0gL21vYmlsZXx0YWJsZXR8aXAoYWR8aG9uZXxvZCl8YW5kcm9pZHxzaWxrL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuLyoqXG4gKiBkZXRlY3QgaWYgd2Ugd2FudCB0byBzdXBwb3J0IG1vdXNlZXZlbnRzIGF0IGFsbFxuICogQHByb3BlcnR5IE5PX01PVVNFRVZFTlRTXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuR2VzdHVyZURldGVjdG9yLk5PX01PVVNFRVZFTlRTID0gKEdlc3R1cmVEZXRlY3Rvci5IQVNfVE9VQ0hFVkVOVFMgJiYgR2VzdHVyZURldGVjdG9yLklTX01PQklMRSkgfHwgR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTO1xuXG4vKipcbiAqIGludGVydmFsIGluIHdoaWNoIEdlc3R1cmVEZXRlY3RvciByZWNhbGN1bGF0ZXMgY3VycmVudCB2ZWxvY2l0eS9kaXJlY3Rpb24vYW5nbGUgaW4gbXNcbiAqIEBwcm9wZXJ0eSBDQUxDVUxBVEVfSU5URVJWQUxcbiAqIEB0eXBlIHtOdW1iZXJ9XG4gKiBAZGVmYXVsdCAyNVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuQ0FMQ1VMQVRFX0lOVEVSVkFMID0gMjU7XG5cbi8qKlxuICogZXZlbnR0eXBlcyBwZXIgdG91Y2hldmVudCAoc3RhcnQsIG1vdmUsIGVuZCkgYXJlIGZpbGxlZCBieSBgRXZlbnQuZGV0ZXJtaW5lRXZlbnRUeXBlc2Agb24gYHNldHVwYFxuICogdGhlIG9iamVjdCBjb250YWlucyB0aGUgRE9NIGV2ZW50IG5hbWVzIHBlciB0eXBlIChgRVZFTlRfU1RBUlRgLCBgRVZFTlRfTU9WRWAsIGBFVkVOVF9FTkRgKVxuICogQHByb3BlcnR5IEVWRU5UX1RZUEVTXG4gKiBAcHJpdmF0ZVxuICogQHdyaXRlT25jZVxuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIEVWRU5UX1RZUEVTID0ge307XG5cbi8qKlxuICogZGlyZWN0aW9uIHN0cmluZ3MsIGZvciBzYWZlIGNvbXBhcmlzb25zXG4gKiBAcHJvcGVydHkgRElSRUNUSU9OX0RPV058TEVGVHxVUHxSSUdIVFxuICogQGZpbmFsXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlZmF1bHQgJ2Rvd24nICdsZWZ0JyAndXAnICdyaWdodCdcbiAqL1xudmFyIERJUkVDVElPTl9ET1dOID0gR2VzdHVyZURldGVjdG9yLkRJUkVDVElPTl9ET1dOID0gJ2Rvd24nO1xudmFyIERJUkVDVElPTl9MRUZUID0gR2VzdHVyZURldGVjdG9yLkRJUkVDVElPTl9MRUZUID0gJ2xlZnQnO1xudmFyIERJUkVDVElPTl9VUCA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fVVAgPSAndXAnO1xudmFyIERJUkVDVElPTl9SSUdIVCA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fUklHSFQgPSAncmlnaHQnO1xuXG4vKipcbiAqIHBvaW50ZXJ0eXBlIHN0cmluZ3MsIGZvciBzYWZlIGNvbXBhcmlzb25zXG4gKiBAcHJvcGVydHkgUE9JTlRFUl9NT1VTRXxUT1VDSHxQRU5cbiAqIEBmaW5hbFxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZWZhdWx0ICdtb3VzZScgJ3RvdWNoJyAncGVuJ1xuICovXG52YXIgUE9JTlRFUl9NT1VTRSA9IEdlc3R1cmVEZXRlY3Rvci5QT0lOVEVSX01PVVNFID0gJ21vdXNlJztcbnZhciBQT0lOVEVSX1RPVUNIID0gR2VzdHVyZURldGVjdG9yLlBPSU5URVJfVE9VQ0ggPSAndG91Y2gnO1xudmFyIFBPSU5URVJfUEVOID0gR2VzdHVyZURldGVjdG9yLlBPSU5URVJfUEVOID0gJ3Blbic7XG5cbi8qKlxuICogZXZlbnR0eXBlc1xuICogQHByb3BlcnR5IEVWRU5UX1NUQVJUfE1PVkV8RU5EfFJFTEVBU0V8VE9VQ0hcbiAqIEBmaW5hbFxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZWZhdWx0ICdzdGFydCcgJ2NoYW5nZScgJ21vdmUnICdlbmQnICdyZWxlYXNlJyAndG91Y2gnXG4gKi9cbnZhciBFVkVOVF9TVEFSVCA9IEdlc3R1cmVEZXRlY3Rvci5FVkVOVF9TVEFSVCA9ICdzdGFydCc7XG52YXIgRVZFTlRfTU9WRSA9IEdlc3R1cmVEZXRlY3Rvci5FVkVOVF9NT1ZFID0gJ21vdmUnO1xudmFyIEVWRU5UX0VORCA9IEdlc3R1cmVEZXRlY3Rvci5FVkVOVF9FTkQgPSAnZW5kJztcbnZhciBFVkVOVF9SRUxFQVNFID0gR2VzdHVyZURldGVjdG9yLkVWRU5UX1JFTEVBU0UgPSAncmVsZWFzZSc7XG52YXIgRVZFTlRfVE9VQ0ggPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfVE9VQ0ggPSAndG91Y2gnO1xuXG4vKipcbiAqIGlmIHRoZSB3aW5kb3cgZXZlbnRzIGFyZSBzZXQuLi5cbiAqIEBwcm9wZXJ0eSBSRUFEWVxuICogQHdyaXRlT25jZVxuICogQHR5cGUge0Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuUkVBRFkgPSBmYWxzZTtcblxuLyoqXG4gKiBwbHVnaW5zIG5hbWVzcGFjZVxuICogQHByb3BlcnR5IHBsdWdpbnNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5wbHVnaW5zID0gR2VzdHVyZURldGVjdG9yLnBsdWdpbnMgfHwge307XG5cbi8qKlxuICogZ2VzdHVyZXMgbmFtZXNwYWNlXG4gKiBzZWUgYC9nZXN0dXJlc2AgZm9yIHRoZSBkZWZpbml0aW9uc1xuICogQHByb3BlcnR5IGdlc3R1cmVzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMgPSBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMgfHwge307XG5cbi8qKlxuICogc2V0dXAgZXZlbnRzIHRvIGRldGVjdCBnZXN0dXJlcyBvbiB0aGUgZG9jdW1lbnRcbiAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gY3JlYXRpbmcgYW4gbmV3IGluc3RhbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXR1cChvcHRzKSB7XG4gIGlmIChHZXN0dXJlRGV0ZWN0b3IuUkVBRFkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmaW5kIHdoYXQgZXZlbnR0eXBlcyB3ZSBhZGQgbGlzdGVuZXJzIHRvXG4gIEV2ZW50LmRldGVybWluZUV2ZW50VHlwZXMoKTtcblxuICAvLyBSZWdpc3RlciBhbGwgZ2VzdHVyZXMgaW5zaWRlIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlc1xuICBVdGlscy5lYWNoKEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcywgZnVuY3Rpb24oZ2VzdHVyZSkge1xuICAgIERldGVjdGlvbi5yZWdpc3RlcihnZXN0dXJlKTtcbiAgfSk7XG5cbiAgLy8gQWRkIHRvdWNoIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnRcbiAgRXZlbnQub25Ub3VjaChHZXN0dXJlRGV0ZWN0b3IuRE9DVU1FTlQsIEVWRU5UX01PVkUsIERldGVjdGlvbi5kZXRlY3QsIG9wdHMpO1xuICBFdmVudC5vblRvdWNoKEdlc3R1cmVEZXRlY3Rvci5ET0NVTUVOVCwgRVZFTlRfRU5ELCBEZXRlY3Rpb24uZGV0ZWN0LCBvcHRzKTtcblxuICAvLyBHZXN0dXJlRGV0ZWN0b3IgaXMgcmVhZHkuLi4hXG4gIEdlc3R1cmVEZXRlY3Rvci5SRUFEWSA9IHRydWU7XG59XG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqXG4gKiBAY2xhc3MgVXRpbHNcbiAqIEBzdGF0aWNcbiAqL1xuVXRpbHMgPSBHZXN0dXJlRGV0ZWN0b3IudXRpbHMgPSB7XG4gIC8qKlxuICAgKiBleHRlbmQgbWV0aG9kLCBjb3VsZCBhbHNvIGJlIHVzZWQgZm9yIGNsb25pbmcgd2hlbiBgZGVzdGAgaXMgYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBjaGFuZ2VzIHRoZSBkZXN0IG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gZGVzdFxuICAgKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21lcmdlPWZhbHNlXSAgZG8gYSBtZXJnZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGRlc3RcbiAgICovXG4gIGV4dGVuZDogZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYywgbWVyZ2UpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNyYywga2V5KSAmJiAoZGVzdFtrZXldID09PSB1bmRlZmluZWQgfHwgIW1lcmdlKSkge1xuICAgICAgICBkZXN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNpbXBsZSBhZGRFdmVudExpc3RlbmVyIHdyYXBwZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqL1xuICBvbjogZnVuY3Rpb24gb24oZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0KSB7XG4gICAgdXRpbC5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCwgdHJ1ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNpbXBsZSByZW1vdmVFdmVudExpc3RlbmVyIHdyYXBwZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uIG9mZihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcHQpIHtcbiAgICB1dGlsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0LCB0cnVlKTtcbiAgfSxcblxuICAvKipcbiAgICogZm9yRWFjaCBvdmVyIGFycmF5cyBhbmQgb2JqZWN0c1xuICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yXG4gICAqIEBwYXJhbSB7YW55fSBpdGVyYXRvci5pdGVtXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpdGVyYXRvci5pbmRleFxuICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gaXRlcmF0b3Iub2JqIHRoZSBzb3VyY2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IHZhbHVlIHRvIHVzZSBhcyBgdGhpc2AgaW4gdGhlIGl0ZXJhdG9yXG4gICAqL1xuICBlYWNoOiBmdW5jdGlvbiBlYWNoKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgaSwgbGVuO1xuXG4gICAgLy8gbmF0aXZlIGZvckVhY2ggb24gYXJyYXlzXG4gICAgaWYgKCdmb3JFYWNoJyBpbiBvYmopIHtcbiAgICAgIG9iai5mb3JFYWNoKGl0ZXJhdG9yLCBjb250ZXh0KTtcbiAgICAgIC8vIGFycmF5c1xuICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGkgPSAwLCBsZW4gPSBvYmoubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb2JqZWN0c1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSAmJlxuICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogZmluZCBpZiBhIHN0cmluZyBjb250YWlucyB0aGUgc3RyaW5nIHVzaW5nIGluZGV4T2ZcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNyY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gZmluZFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBmb3VuZFxuICAgKi9cbiAgaW5TdHI6IGZ1bmN0aW9uIGluU3RyKHNyYywgZmluZCkge1xuICAgIHJldHVybiBzcmMuaW5kZXhPZihmaW5kKSA+IC0xO1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaW5kIGlmIGEgYXJyYXkgY29udGFpbnMgdGhlIG9iamVjdCB1c2luZyBpbmRleE9mIG9yIGEgc2ltcGxlIHBvbHlmaWxsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHJldHVybiB7Qm9vbGVhbnxOdW1iZXJ9IGZhbHNlIHdoZW4gbm90IGZvdW5kLCBvciB0aGUgaW5kZXhcbiAgICovXG4gIGluQXJyYXk6IGZ1bmN0aW9uIGluQXJyYXkoc3JjLCBmaW5kLCBkZWVwKSB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzcmMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsgLy8gQXJyYXkuZmluZEluZGV4XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhmaW5kKS5ldmVyeShmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHNyY1tpXVtrZXldID09PSBmaW5kW2tleV07IH0pKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBpZiAoc3JjLmluZGV4T2YpIHtcbiAgICAgIHJldHVybiBzcmMuaW5kZXhPZihmaW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNyYy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoc3JjW2ldID09PSBmaW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgYW4gYXJyYXktbGlrZSBvYmplY3QgKGBhcmd1bWVudHNgLCBgdG91Y2hsaXN0YCkgdG8gYW4gYXJyYXlcbiAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkob2JqKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaiwgMCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZpbmQgaWYgYSBub2RlIGlzIGluIHRoZSBnaXZlbiBwYXJlbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAgICovXG4gIGhhc1BhcmVudDogZnVuY3Rpb24gaGFzUGFyZW50KG5vZGUsIHBhcmVudCkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBpZiAobm9kZSA9PSBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGdldCB0aGUgY2VudGVyIG9mIGFsbCB0aGUgdG91Y2hlc1xuICAgKiBAcGFyYW0ge0FycmF5fSB0b3VjaGVzXG4gICAqIEByZXR1cm4ge09iamVjdH0gY2VudGVyIGNvbnRhaW5zIGBwYWdlWGAsIGBwYWdlWWAsIGBjbGllbnRYYCBhbmQgYGNsaWVudFlgIHByb3BlcnRpZXNcbiAgICovXG4gIGdldENlbnRlcjogZnVuY3Rpb24gZ2V0Q2VudGVyKHRvdWNoZXMpIHtcbiAgICB2YXIgcGFnZVggPSBbXSxcbiAgICAgICAgcGFnZVkgPSBbXSxcbiAgICAgICAgY2xpZW50WCA9IFtdLFxuICAgICAgICBjbGllbnRZID0gW10sXG4gICAgICAgIG1pbiA9IE1hdGgubWluLFxuICAgICAgICBtYXggPSBNYXRoLm1heDtcblxuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG4gICAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYWdlWDogdG91Y2hlc1swXS5wYWdlWCxcbiAgICAgICAgcGFnZVk6IHRvdWNoZXNbMF0ucGFnZVksXG4gICAgICAgIGNsaWVudFg6IHRvdWNoZXNbMF0uY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogdG91Y2hlc1swXS5jbGllbnRZXG4gICAgICB9O1xuICAgIH1cblxuICAgIFV0aWxzLmVhY2godG91Y2hlcywgZnVuY3Rpb24odG91Y2gpIHtcbiAgICAgIHBhZ2VYLnB1c2godG91Y2gucGFnZVgpO1xuICAgICAgcGFnZVkucHVzaCh0b3VjaC5wYWdlWSk7XG4gICAgICBjbGllbnRYLnB1c2godG91Y2guY2xpZW50WCk7XG4gICAgICBjbGllbnRZLnB1c2godG91Y2guY2xpZW50WSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFnZVg6IChtaW4uYXBwbHkoTWF0aCwgcGFnZVgpICsgbWF4LmFwcGx5KE1hdGgsIHBhZ2VYKSkgLyAyLFxuICAgICAgcGFnZVk6IChtaW4uYXBwbHkoTWF0aCwgcGFnZVkpICsgbWF4LmFwcGx5KE1hdGgsIHBhZ2VZKSkgLyAyLFxuICAgICAgY2xpZW50WDogKG1pbi5hcHBseShNYXRoLCBjbGllbnRYKSArIG1heC5hcHBseShNYXRoLCBjbGllbnRYKSkgLyAyLFxuICAgICAgY2xpZW50WTogKG1pbi5hcHBseShNYXRoLCBjbGllbnRZKSArIG1heC5hcHBseShNYXRoLCBjbGllbnRZKSkgLyAyXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSB2ZWxvY2l0eSBiZXR3ZWVuIHR3byBwb2ludHMuIHVuaXQgaXMgaW4gcHggcGVyIG1zLlxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhWVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHZlbG9jaXR5IGB4YCBhbmQgYHlgXG4gICAqL1xuICBnZXRWZWxvY2l0eTogZnVuY3Rpb24gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBNYXRoLmFicyhkZWx0YVggLyBkZWx0YVRpbWUpIHx8IDAsXG4gICAgICB5OiBNYXRoLmFicyhkZWx0YVkgLyBkZWx0YVRpbWUpIHx8IDBcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIGNvb3JkaW5hdGVzXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMVxuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDJcbiAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgKi9cbiAgZ2V0QW5nbGU6IGZ1bmN0aW9uIGdldEFuZ2xlKHRvdWNoMSwgdG91Y2gyKSB7XG4gICAgdmFyIHggPSB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYLFxuICAgICAgICB5ID0gdG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WTtcblxuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbiAgfSxcblxuICAvKipcbiAgICogZG8gYSBzbWFsbCBjb21wYXJpc29uIHRvIGdldCB0aGUgZGlyZWN0aW9uIGJldHdlZW4gdHdvIHRvdWNoZXMuXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMVxuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDJcbiAgICogQHJldHVybiB7U3RyaW5nfSBkaXJlY3Rpb24gbWF0Y2hlcyBgRElSRUNUSU9OX0xFRlR8UklHSFR8VVB8RE9XTmBcbiAgICovXG4gIGdldERpcmVjdGlvbjogZnVuY3Rpb24gZ2V0RGlyZWN0aW9uKHRvdWNoMSwgdG91Y2gyKSB7XG4gICAgdmFyIHggPSBNYXRoLmFicyh0b3VjaDEuY2xpZW50WCAtIHRvdWNoMi5jbGllbnRYKSxcbiAgICAgICAgeSA9IE1hdGguYWJzKHRvdWNoMS5jbGllbnRZIC0gdG91Y2gyLmNsaWVudFkpO1xuXG4gICAgaWYgKHggPj0geSkge1xuICAgICAgcmV0dXJuIHRvdWNoMS5jbGllbnRYIC0gdG91Y2gyLmNsaWVudFggPiAwID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgfVxuICAgIHJldHVybiB0b3VjaDEuY2xpZW50WSAtIHRvdWNoMi5jbGllbnRZID4gMCA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHRvdWNoZXNcbiAgICogQHBhcmFtIHtUb3VjaH10b3VjaDFcbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gyXG4gICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICovXG4gIGdldERpc3RhbmNlOiBmdW5jdGlvbiBnZXREaXN0YW5jZSh0b3VjaDEsIHRvdWNoMikge1xuICAgIHZhciB4ID0gdG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCxcbiAgICAgICAgeSA9IHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFk7XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4ICogeCkgKyAoeSAqIHkpKTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gdG91Y2hMaXN0c1xuICAgKiBubyBzY2FsZSBpcyAxLCBhbmQgZ29lcyBkb3duIHRvIDAgd2hlbiBwaW5jaGVkIHRvZ2V0aGVyLCBhbmQgYmlnZ2VyIHdoZW4gcGluY2hlZCBvdXRcbiAgICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gICAqL1xuICBnZXRTY2FsZTogZnVuY3Rpb24gZ2V0U2NhbGUoc3RhcnQsIGVuZCkge1xuICAgIC8vIG5lZWQgdHdvIGZpbmdlcnMuLi5cbiAgICBpZiAoc3RhcnQubGVuZ3RoID49IDIgJiYgZW5kLmxlbmd0aCA+PSAyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREaXN0YW5jZShlbmRbMF0sIGVuZFsxXSkgLyB0aGlzLmdldERpc3RhbmNlKHN0YXJ0WzBdLCBzdGFydFsxXSk7XG4gICAgfVxuICAgIHJldHVybiAxO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIHJvdGF0aW9uIGRlZ3JlZXMgYmV0d2VlbiB0d28gdG91Y2hMaXN0c1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiB0b3VjaGVzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiB0b3VjaGVzXG4gICAqIEByZXR1cm4ge051bWJlcn0gcm90YXRpb25cbiAgICovXG4gIGdldFJvdGF0aW9uOiBmdW5jdGlvbiBnZXRSb3RhdGlvbihzdGFydCwgZW5kKSB7XG4gICAgLy8gbmVlZCB0d28gZmluZ2Vyc1xuICAgIGlmIChzdGFydC5sZW5ndGggPj0gMiAmJiBlbmQubGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEFuZ2xlKGVuZFsxXSwgZW5kWzBdKSAtIHRoaXMuZ2V0QW5nbGUoc3RhcnRbMV0sIHN0YXJ0WzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZpbmQgb3V0IGlmIHRoZSBkaXJlY3Rpb24gaXMgdmVydGljYWwgICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3Rpb24gbWF0Y2hlcyBgRElSRUNUSU9OX1VQfERPV05gXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGlzX3ZlcnRpY2FsXG4gICAqL1xuICBpc1ZlcnRpY2FsOiBmdW5jdGlvbiBpc1ZlcnRpY2FsKGRpcmVjdGlvbikge1xuICAgIHJldHVybiBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1VQIHx8IGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTjtcbiAgfSxcblxuICAvKipcbiAgICogc2V0IGNzcyBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgcHJlZml4ZXNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbdG9nZ2xlPXRydWVdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBzZXRQcmVmaXhlZENzczogZnVuY3Rpb24gc2V0UHJlZml4ZWRDc3MoZWxlbWVudCwgcHJvcCwgdmFsdWUsIHRvZ2dsZSkge1xuICAgIHZhciBwcmVmaXhlcyA9IFsnJywgJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddO1xuICAgIHByb3AgPSBVdGlscy50b0NhbWVsQ2FzZShwcm9wKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcHJvcDtcbiAgICAgIC8vIHByZWZpeGVzXG4gICAgICBpZiAocHJlZml4ZXNbaV0pIHtcbiAgICAgICAgcCA9IHByZWZpeGVzW2ldICsgcC5zbGljZSgwLCAxKS50b1VwcGVyQ2FzZSgpICsgcC5zbGljZSgxKTtcbiAgICAgIH1cblxuICAgICAgLy8gdGVzdCB0aGUgc3R5bGVcbiAgICAgIGlmIChwIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwXSA9ICh0b2dnbGUgPT09IG51bGwgfHwgdG9nZ2xlKSAmJiB2YWx1ZSB8fCAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiB0b2dnbGUgYnJvd3NlciBkZWZhdWx0IGJlaGF2aW9yIGJ5IHNldHRpbmcgY3NzIHByb3BlcnRpZXMuXG4gICAqIGB1c2VyU2VsZWN0PSdub25lJ2AgYWxzbyBzZXRzIGBlbGVtZW50Lm9uc2VsZWN0c3RhcnRgIHRvIGZhbHNlXG4gICAqIGB1c2VyRHJhZz0nbm9uZSdgIGFsc28gc2V0cyBgZWxlbWVudC5vbmRyYWdzdGFydGAgdG8gZmFsc2VcbiAgICpcbiAgICogQHBhcmFtIHtIdG1sRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtCb29sZWFufSBbdG9nZ2xlPXRydWVdXG4gICAqL1xuICB0b2dnbGVCZWhhdmlvcjogZnVuY3Rpb24gdG9nZ2xlQmVoYXZpb3IoZWxlbWVudCwgcHJvcHMsIHRvZ2dsZSkge1xuICAgIGlmICghcHJvcHMgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuc3R5bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzZXQgdGhlIGNzcyBwcm9wZXJ0aWVzXG4gICAgVXRpbHMuZWFjaChwcm9wcywgZnVuY3Rpb24odmFsdWUsIHByb3ApIHtcbiAgICAgIFV0aWxzLnNldFByZWZpeGVkQ3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlLCB0b2dnbGUpO1xuICAgIH0pO1xuXG4gICAgdmFyIGZhbHNlRm4gPSB0b2dnbGUgJiYgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIGFsc28gdGhlIGRpc2FibGUgb25zZWxlY3RzdGFydFxuICAgIGlmIChwcm9wcy51c2VyU2VsZWN0ID09ICdub25lJykge1xuICAgICAgZWxlbWVudC5vbnNlbGVjdHN0YXJ0ID0gZmFsc2VGbjtcbiAgICB9XG4gICAgLy8gYW5kIGRpc2FibGUgb25kcmFnc3RhcnRcbiAgICBpZiAocHJvcHMudXNlckRyYWcgPT0gJ25vbmUnKSB7XG4gICAgICBlbGVtZW50Lm9uZHJhZ3N0YXJ0ID0gZmFsc2VGbjtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgYSBzdHJpbmcgd2l0aCB1bmRlcnNjb3JlcyB0byBjYW1lbENhc2VcbiAgICogc28gcHJldmVudF9kZWZhdWx0IGJlY29tZXMgcHJldmVudERlZmF1bHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGNhbWVsQ2FzZVN0clxuICAgKi9cbiAgdG9DYW1lbENhc2U6IGZ1bmN0aW9uIHRvQ2FtZWxDYXNlKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW18tXShbYS16XSkvZywgZnVuY3Rpb24ocykge1xuICAgICAgcmV0dXJuIHNbMV0udG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfVxufTtcblxuXG4vKipcbiAqIEBtb2R1bGUgR2VzdHVyZURldGVjdG9yXG4gKi9cbi8qKlxuICogQGNsYXNzIEV2ZW50XG4gKiBAc3RhdGljXG4gKi9cbkV2ZW50ID0gR2VzdHVyZURldGVjdG9yLmV2ZW50ID0ge1xuICAvKipcbiAgICogd2hlbiB0b3VjaCBldmVudHMgaGF2ZSBiZWVuIGZpcmVkLCB0aGlzIGlzIHRydWVcbiAgICogdGhpcyBpcyB1c2VkIHRvIHN0b3AgbW91c2UgZXZlbnRzXG4gICAqIEBwcm9wZXJ0eSBwcmV2ZW50X21vdXNlZXZlbnRzXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgcHJldmVudE1vdXNlRXZlbnRzOiBmYWxzZSxcblxuICAvKipcbiAgICogaWYgRVZFTlRfU1RBUlQgaGFzIGJlZW4gZmlyZWRcbiAgICogQHByb3BlcnR5IHN0YXJ0ZWRcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBzdGFydGVkOiBmYWxzZSxcblxuICAvKipcbiAgICogd2hlbiB0aGUgbW91c2UgaXMgaG9sZCBkb3duLCB0aGlzIGlzIHRydWVcbiAgICogQHByb3BlcnR5IHNob3VsZF9kZXRlY3RcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBzaG91bGREZXRlY3Q6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgZXZlbnQgYmluZGVyIHdpdGggYSBob29rIGFuZCBzdXBwb3J0IGZvciBtdWx0aXBsZSB0eXBlc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtob29rXVxuICAgKiBAcGFyYW0ge09iamVjdH0gaG9vay50eXBlXG4gICAqL1xuICBvbjogZnVuY3Rpb24gb24oZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0LCBob29rKSB7XG4gICAgdmFyIHR5cGVzID0gdHlwZS5zcGxpdCgnICcpO1xuICAgIFV0aWxzLmVhY2godHlwZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIFV0aWxzLm9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCk7XG4gICAgICBob29rICYmIGhvb2sodHlwZSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNpbXBsZSBldmVudCB1bmJpbmRlciB3aXRoIGEgaG9vayBhbmQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdHlwZXNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaG9va11cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvb2sudHlwZVxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0LCBob29rKSB7XG4gICAgdmFyIHR5cGVzID0gdHlwZS5zcGxpdCgnICcpO1xuICAgIFV0aWxzLmVhY2godHlwZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIFV0aWxzLm9mZihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcHQpO1xuICAgICAgaG9vayAmJiBob29rKHR5cGUpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiB0aGUgY29yZSB0b3VjaCBldmVudCBoYW5kbGVyLlxuICAgKiB0aGlzIGZpbmRzIG91dCBpZiB3ZSBzaG91bGQgdG8gZGV0ZWN0IGdlc3R1cmVzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZSBtYXRjaGVzIGBFVkVOVF9TVEFSVHxNT1ZFfEVORGBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcmV0dXJuIG9uVG91Y2hIYW5kbGVyIHtGdW5jdGlvbn0gdGhlIGNvcmUgZXZlbnQgaGFuZGxlclxuICAgKi9cbiAgb25Ub3VjaDogZnVuY3Rpb24gb25Ub3VjaChlbGVtZW50LCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBvblRvdWNoSGFuZGxlciA9IGZ1bmN0aW9uIG9uVG91Y2hIYW5kbGVyKGV2KSB7XG4gICAgICB2YXIgc3JjVHlwZSA9IGV2LnR5cGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICBpc1BvaW50ZXIgPSBHZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFMsXG4gICAgICAgICAgaXNNb3VzZSA9IFV0aWxzLmluU3RyKHNyY1R5cGUsICdtb3VzZScpLFxuICAgICAgICAgIHRyaWdnZXJUeXBlO1xuXG4gICAgICAvLyBpZiB3ZSBhcmUgaW4gYSBtb3VzZWV2ZW50LCBidXQgdGhlcmUgaGFzIGJlZW4gYSB0b3VjaGV2ZW50IHRyaWdnZXJlZCBpbiB0aGlzIHNlc3Npb25cbiAgICAgIC8vIHdlIHdhbnQgdG8gZG8gbm90aGluZy4gc2ltcGx5IGJyZWFrIG91dCBvZiB0aGUgZXZlbnQuXG4gICAgICBpZiAoaXNNb3VzZSAmJiBzZWxmLnByZXZlbnRNb3VzZUV2ZW50cykge1xuICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gbW91c2VidXR0b24gbXVzdCBiZSBkb3duXG4gICAgICB9IGVsc2UgaWYgKGlzTW91c2UgJiYgZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUICYmIGV2LmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBzZWxmLnByZXZlbnRNb3VzZUV2ZW50cyA9IGZhbHNlO1xuICAgICAgICBzZWxmLnNob3VsZERldGVjdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGlzUG9pbnRlciAmJiBldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSAoZXYuYnV0dG9ucyA9PT0gMSB8fCBQb2ludGVyRXZlbnQubWF0Y2hUeXBlKFBPSU5URVJfVE9VQ0gsIGV2KSk7XG4gICAgICAgIC8vIGp1c3QgYSB2YWxpZCBzdGFydCBldmVudCwgYnV0IG5vIG1vdXNlXG4gICAgICB9IGVsc2UgaWYgKCFpc01vdXNlICYmIGV2ZW50VHlwZSA9PSBFVkVOVF9TVEFSVCkge1xuICAgICAgICBzZWxmLnByZXZlbnRNb3VzZUV2ZW50cyA9IHRydWU7XG4gICAgICAgIHNlbGYuc2hvdWxkRGV0ZWN0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIHRoZSBwb2ludGVyIGV2ZW50IGJlZm9yZSBlbnRlcmluZyB0aGUgZGV0ZWN0aW9uXG4gICAgICBpZiAoaXNQb2ludGVyICYmIGV2ZW50VHlwZSAhPSBFVkVOVF9FTkQpIHtcbiAgICAgICAgUG9pbnRlckV2ZW50LnVwZGF0ZVBvaW50ZXIoZXZlbnRUeXBlLCBldik7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGFyZSBpbiBhIHRvdWNoL2Rvd24gc3RhdGUsIHNvIGFsbG93ZWQgZGV0ZWN0aW9uIG9mIGdlc3R1cmVzXG4gICAgICBpZiAoc2VsZi5zaG91bGREZXRlY3QpIHtcbiAgICAgICAgdHJpZ2dlclR5cGUgPSBzZWxmLmRvRGV0ZWN0LmNhbGwoc2VsZiwgZXYsIGV2ZW50VHlwZSwgZWxlbWVudCwgaGFuZGxlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIC4uLmFuZCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBkZXRlY3Rpb25cbiAgICAgIC8vIHNvIHJlc2V0IGV2ZXJ5dGhpbmcgdG8gc3RhcnQgZWFjaCBkZXRlY3Rpb24gdG90YWxseSBmcmVzaFxuICAgICAgaWYgKHRyaWdnZXJUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgICBzZWxmLnByZXZlbnRNb3VzZUV2ZW50cyA9IGZhbHNlO1xuICAgICAgICBzZWxmLnNob3VsZERldGVjdCA9IGZhbHNlO1xuICAgICAgICBQb2ludGVyRXZlbnQucmVzZXQoKTtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBwb2ludGVyZXZlbnQgb2JqZWN0IGFmdGVyIHRoZSBkZXRlY3Rpb25cbiAgICAgIH1cblxuICAgICAgaWYgKGlzUG9pbnRlciAmJiBldmVudFR5cGUgPT0gRVZFTlRfRU5EKSB7XG4gICAgICAgIFBvaW50ZXJFdmVudC51cGRhdGVQb2ludGVyKGV2ZW50VHlwZSwgZXYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm9uKGVsZW1lbnQsIEVWRU5UX1RZUEVTW2V2ZW50VHlwZV0sIG9uVG91Y2hIYW5kbGVyLCBvcHQpO1xuICAgIHJldHVybiBvblRvdWNoSGFuZGxlcjtcbiAgfSxcblxuICAvKipcbiAgICogdGhlIGNvcmUgZGV0ZWN0aW9uIG1ldGhvZFxuICAgKiB0aGlzIGZpbmRzIG91dCB3aGF0IEdlc3R1cmVEZXRlY3Rvci10b3VjaC1ldmVudHMgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZSBtYXRjaGVzIGBFVkVOVF9TVEFSVHxNT1ZFfEVORGBcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gdHJpZ2dlclR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqL1xuICBkb0RldGVjdDogZnVuY3Rpb24gZG9EZXRlY3QoZXYsIGV2ZW50VHlwZSwgZWxlbWVudCwgaGFuZGxlcikge1xuICAgIHZhciB0b3VjaExpc3QgPSB0aGlzLmdldFRvdWNoTGlzdChldiwgZXZlbnRUeXBlKTtcbiAgICB2YXIgdG91Y2hMaXN0TGVuZ3RoID0gdG91Y2hMaXN0Lmxlbmd0aDtcbiAgICB2YXIgdHJpZ2dlclR5cGUgPSBldmVudFR5cGU7XG4gICAgdmFyIHRyaWdnZXJDaGFuZ2UgPSB0b3VjaExpc3QudHJpZ2dlcjsgLy8gdXNlZCBieSBmYWtlTXVsdGl0b3VjaCBwbHVnaW5cbiAgICB2YXIgY2hhbmdlZExlbmd0aCA9IHRvdWNoTGlzdExlbmd0aDtcblxuICAgIC8vIGF0IGVhY2ggdG91Y2hzdGFydC1saWtlIGV2ZW50IHdlIHdhbnQgYWxzbyB3YW50IHRvIHRyaWdnZXIgYSBUT1VDSCBldmVudC4uLlxuICAgIGlmIChldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgIHRyaWdnZXJDaGFuZ2UgPSBFVkVOVF9UT1VDSDtcbiAgICAgIC8vIC4uLnRoZSBzYW1lIGZvciBhIHRvdWNoZW5kLWxpa2UgZXZlbnRcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgIHRyaWdnZXJDaGFuZ2UgPSBFVkVOVF9SRUxFQVNFO1xuXG4gICAgICAvLyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHRvdWNoZXMgaGF2ZSBiZWVuIHJlbW92ZWRcbiAgICAgIGNoYW5nZWRMZW5ndGggPSB0b3VjaExpc3QubGVuZ3RoIC0gKChldi5jaGFuZ2VkVG91Y2hlcykgPyBldi5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggOiAxKTtcbiAgICB9XG5cbiAgICAvLyBhZnRlciB0aGVyZSBhcmUgc3RpbGwgdG91Y2hlcyBvbiB0aGUgc2NyZWVuLFxuICAgIC8vIHdlIGp1c3Qgd2FudCB0byB0cmlnZ2VyIGEgTU9WRSBldmVudC4gc28gY2hhbmdlIHRoZSBTVEFSVCBvciBFTkQgdG8gYSBNT1ZFXG4gICAgLy8gYnV0IG9ubHkgYWZ0ZXIgZGV0ZWN0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQsIHRoZSBmaXJzdCB0aW1lIHdlIGFjdHVhbGx5IHdhbnQgYSBTVEFSVFxuICAgIGlmIChjaGFuZ2VkTGVuZ3RoID4gMCAmJiB0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIHRyaWdnZXJUeXBlID0gRVZFTlRfTU9WRTtcbiAgICB9XG5cbiAgICAvLyBkZXRlY3Rpb24gaGFzIGJlZW4gc3RhcnRlZCwgd2Uga2VlcCB0cmFjayBvZiB0aGlzLCBzZWUgYWJvdmVcbiAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgLy8gZ2VuZXJhdGUgc29tZSBldmVudCBkYXRhLCBzb21lIGJhc2ljIGluZm9ybWF0aW9uXG4gICAgdmFyIGV2RGF0YSA9IHRoaXMuY29sbGVjdEV2ZW50RGF0YShlbGVtZW50LCB0cmlnZ2VyVHlwZSwgdG91Y2hMaXN0LCBldik7XG5cbiAgICAvLyB0cmlnZ2VyIHRoZSB0cmlnZ2VyVHlwZSBldmVudCBiZWZvcmUgdGhlIGNoYW5nZSAoVE9VQ0gsIFJFTEVBU0UpIGV2ZW50c1xuICAgIC8vIGJ1dCB0aGUgRU5EIGV2ZW50IHNob3VsZCBiZSBhdCBsYXN0XG4gICAgaWYgKGV2ZW50VHlwZSAhPSBFVkVOVF9FTkQpIHtcbiAgICAgIGhhbmRsZXIuY2FsbChEZXRlY3Rpb24sIGV2RGF0YSk7XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciBhIGNoYW5nZSAoVE9VQ0gsIFJFTEVBU0UpIGV2ZW50LCB0aGlzIG1lYW5zIHRoZSBsZW5ndGggb2YgdGhlIHRvdWNoZXMgY2hhbmdlZFxuICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XG4gICAgICBldkRhdGEuY2hhbmdlZExlbmd0aCA9IGNoYW5nZWRMZW5ndGg7XG4gICAgICBldkRhdGEuZXZlbnRUeXBlID0gdHJpZ2dlckNoYW5nZTtcblxuICAgICAgaGFuZGxlci5jYWxsKERldGVjdGlvbiwgZXZEYXRhKTtcblxuICAgICAgZXZEYXRhLmV2ZW50VHlwZSA9IHRyaWdnZXJUeXBlO1xuICAgICAgZGVsZXRlIGV2RGF0YS5jaGFuZ2VkTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIHRyaWdnZXIgdGhlIEVORCBldmVudFxuICAgIGlmICh0cmlnZ2VyVHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgIGhhbmRsZXIuY2FsbChEZXRlY3Rpb24sIGV2RGF0YSk7XG5cbiAgICAgIC8vIC4uLmFuZCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBkZXRlY3Rpb25cbiAgICAgIC8vIHNvIHJlc2V0IGV2ZXJ5dGhpbmcgdG8gc3RhcnQgZWFjaCBkZXRlY3Rpb24gdG90YWxseSBmcmVzaFxuICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyaWdnZXJUeXBlO1xuICB9LFxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIGRpZmZlcmVudCBldmVudHMgZm9yIGVhY2ggZGV2aWNlL2Jyb3dzZXJcbiAgICogZGV0ZXJtaW5lIHdoYXQgd2UgbmVlZCBhbmQgc2V0IHRoZW0gaW4gdGhlIEVWRU5UX1RZUEVTIGNvbnN0YW50XG4gICAqIHRoZSBgb25Ub3VjaGAgbWV0aG9kIGlzIGJpbmQgdG8gdGhlc2UgcHJvcGVydGllcy5cbiAgICogQHJldHVybiB7T2JqZWN0fSBldmVudHNcbiAgICovXG4gIGRldGVybWluZUV2ZW50VHlwZXM6IGZ1bmN0aW9uIGRldGVybWluZUV2ZW50VHlwZXMoKSB7XG4gICAgdmFyIHR5cGVzO1xuICAgIGlmIChHZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFMpIHtcbiAgICAgIGlmICh3aW5kb3cuUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIHR5cGVzID0gW1xuICAgICAgICAgICdwb2ludGVyZG93bicsXG4gICAgICAgICAgJ3BvaW50ZXJtb3ZlJyxcbiAgICAgICAgICAncG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwgbG9zdHBvaW50ZXJjYXB0dXJlJ1xuICAgICAgICBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZXMgPSBbXG4gICAgICAgICAgJ01TUG9pbnRlckRvd24nLFxuICAgICAgICAgICdNU1BvaW50ZXJNb3ZlJyxcbiAgICAgICAgICAnTVNQb2ludGVyVXAgTVNQb2ludGVyQ2FuY2VsIE1TTG9zdFBvaW50ZXJDYXB0dXJlJ1xuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoR2VzdHVyZURldGVjdG9yLk5PX01PVVNFRVZFTlRTKSB7XG4gICAgICB0eXBlcyA9IFtcbiAgICAgICAgJ3RvdWNoc3RhcnQnLFxuICAgICAgICAndG91Y2htb3ZlJyxcbiAgICAgICAgJ3RvdWNoZW5kIHRvdWNoY2FuY2VsJ1xuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZXMgPSBbXG4gICAgICAgICd0b3VjaHN0YXJ0IG1vdXNlZG93bicsXG4gICAgICAgICd0b3VjaG1vdmUgbW91c2Vtb3ZlJyxcbiAgICAgICAgJ3RvdWNoZW5kIHRvdWNoY2FuY2VsIG1vdXNldXAnXG4gICAgICBdO1xuICAgIH1cblxuICAgIEVWRU5UX1RZUEVTW0VWRU5UX1NUQVJUXSA9IHR5cGVzWzBdO1xuICAgIEVWRU5UX1RZUEVTW0VWRU5UX01PVkVdID0gdHlwZXNbMV07XG4gICAgRVZFTlRfVFlQRVNbRVZFTlRfRU5EXSA9IHR5cGVzWzJdO1xuICAgIHJldHVybiBFVkVOVF9UWVBFUztcbiAgfSxcblxuICAvKipcbiAgICogY3JlYXRlIHRvdWNoTGlzdCBkZXBlbmRpbmcgb24gdGhlIGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlXG4gICAqIEByZXR1cm4ge0FycmF5fSB0b3VjaGVzXG4gICAqL1xuICBnZXRUb3VjaExpc3Q6IGZ1bmN0aW9uIGdldFRvdWNoTGlzdChldiwgZXZlbnRUeXBlKSB7XG4gICAgLy8gZ2V0IHRoZSBmYWtlIHBvaW50ZXJFdmVudCB0b3VjaGxpc3RcbiAgICBpZiAoR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTKSB7XG4gICAgICByZXR1cm4gUG9pbnRlckV2ZW50LmdldFRvdWNoTGlzdCgpO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgdG91Y2hsaXN0XG4gICAgaWYgKGV2LnRvdWNoZXMpIHtcbiAgICAgIGlmIChldmVudFR5cGUgPT0gRVZFTlRfTU9WRSkge1xuICAgICAgICByZXR1cm4gZXYudG91Y2hlcztcbiAgICAgIH1cblxuICAgICAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gICAgICB2YXIgY29uY2F0ID0gW10uY29uY2F0KFV0aWxzLnRvQXJyYXkoZXYudG91Y2hlcyksIFV0aWxzLnRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpKTtcbiAgICAgIHZhciB0b3VjaExpc3QgPSBbXTtcblxuICAgICAgVXRpbHMuZWFjaChjb25jYXQsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIGlmIChVdGlscy5pbkFycmF5KGlkZW50aWZpZXJzLCB0b3VjaC5pZGVudGlmaWVyKSA9PT0gLTEpIHtcbiAgICAgICAgICB0b3VjaExpc3QucHVzaCh0b3VjaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWRlbnRpZmllcnMucHVzaCh0b3VjaC5pZGVudGlmaWVyKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdG91Y2hMaXN0O1xuICAgIH1cblxuICAgIC8vIG1ha2UgZmFrZSB0b3VjaExpc3QgZnJvbSBtb3VzZSBwb3NpdGlvblxuICAgIGV2LmlkZW50aWZpZXIgPSAxO1xuICAgIHJldHVybiBbZXZdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjb2xsZWN0IGJhc2ljIGV2ZW50IGRhdGFcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKiBAcGFyYW0ge0FycmF5fSB0b3VjaGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGV2XG4gICAqL1xuICBjb2xsZWN0RXZlbnREYXRhOiBmdW5jdGlvbiBjb2xsZWN0RXZlbnREYXRhKGVsZW1lbnQsIGV2ZW50VHlwZSwgdG91Y2hlcywgZXYpIHtcbiAgICAvLyBmaW5kIG91dCBwb2ludGVyVHlwZVxuICAgIHZhciBwb2ludGVyVHlwZSA9IFBPSU5URVJfVE9VQ0g7XG4gICAgaWYgKFV0aWxzLmluU3RyKGV2LnR5cGUsICdtb3VzZScpIHx8IFBvaW50ZXJFdmVudC5tYXRjaFR5cGUoUE9JTlRFUl9NT1VTRSwgZXYpKSB7XG4gICAgICBwb2ludGVyVHlwZSA9IFBPSU5URVJfTU9VU0U7XG4gICAgfSBlbHNlIGlmIChQb2ludGVyRXZlbnQubWF0Y2hUeXBlKFBPSU5URVJfUEVOLCBldikpIHtcbiAgICAgIHBvaW50ZXJUeXBlID0gUE9JTlRFUl9QRU47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNlbnRlcjogVXRpbHMuZ2V0Q2VudGVyKHRvdWNoZXMpLFxuICAgICAgdGltZVN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgdGFyZ2V0OiBldi50YXJnZXQsXG4gICAgICB0b3VjaGVzOiB0b3VjaGVzLFxuICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUsXG4gICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICBzcmNFdmVudDogZXYsXG5cbiAgICAgIC8qKlxuICAgICAgICogcHJldmVudCB0aGUgYnJvd3NlciBkZWZhdWx0IGFjdGlvbnNcbiAgICAgICAqIG1vc3RseSB1c2VkIHRvIGRpc2FibGUgc2Nyb2xsaW5nIG9mIHRoZSBicm93c2VyXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNyY0V2ZW50ID0gdGhpcy5zcmNFdmVudDtcbiAgICAgICAgc3JjRXZlbnQucHJldmVudE1hbmlwdWxhdGlvbiAmJiBzcmNFdmVudC5wcmV2ZW50TWFuaXB1bGF0aW9uKCk7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0ICYmIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIHN0b3AgYnViYmxpbmcgdGhlIGV2ZW50IHVwIHRvIGl0cyBwYXJlbnRzXG4gICAgICAgKi9cbiAgICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIGltbWVkaWF0ZWx5IHN0b3AgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICAgICAqIG1pZ2h0IGJlIHVzZWZ1bCBhZnRlciBhIHN3aXBlIHdhcyBkZXRlY3RlZFxuICAgICAgICogQHJldHVybiB7Kn1cbiAgICAgICAqL1xuICAgICAgc3RvcERldGVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBEZXRlY3Rpb24uc3RvcERldGVjdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICpcbiAqIEBjbGFzcyBQb2ludGVyRXZlbnRcbiAqIEBzdGF0aWNcbiAqL1xuUG9pbnRlckV2ZW50ID0gR2VzdHVyZURldGVjdG9yLlBvaW50ZXJFdmVudCA9IHtcbiAgLyoqXG4gICAqIGhvbGRzIGFsbCBwb2ludGVycywgYnkgYGlkZW50aWZpZXJgXG4gICAqIEBwcm9wZXJ0eSBwb2ludGVyc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgcG9pbnRlcnM6IHt9LFxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIHBvaW50ZXJzIGFzIGFuIGFycmF5XG4gICAqIEByZXR1cm4ge0FycmF5fSB0b3VjaGxpc3RcbiAgICovXG4gIGdldFRvdWNoTGlzdDogZnVuY3Rpb24gZ2V0VG91Y2hMaXN0KCkge1xuICAgIHZhciB0b3VjaGxpc3QgPSBbXTtcbiAgICAvLyB3ZSBjYW4gdXNlIGZvckVhY2ggc2luY2UgcG9pbnRlckV2ZW50cyBvbmx5IGlzIGluIElFMTBcbiAgICBVdGlscy5lYWNoKHRoaXMucG9pbnRlcnMsIGZ1bmN0aW9uKHBvaW50ZXIpIHtcbiAgICAgIHRvdWNobGlzdC5wdXNoKHBvaW50ZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiB0b3VjaGxpc3Q7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgYSBwb2ludGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwb2ludGVyRXZlbnRcbiAgICovXG4gIHVwZGF0ZVBvaW50ZXI6IGZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXIoZXZlbnRUeXBlLCBwb2ludGVyRXZlbnQpIHtcbiAgICBpZiAoZXZlbnRUeXBlID09IEVWRU5UX0VORCB8fCAoZXZlbnRUeXBlICE9IEVWRU5UX0VORCAmJiBwb2ludGVyRXZlbnQuYnV0dG9ucyAhPT0gMSkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBvaW50ZXJzW3BvaW50ZXJFdmVudC5wb2ludGVySWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludGVyRXZlbnQuaWRlbnRpZmllciA9IHBvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICB0aGlzLnBvaW50ZXJzW3BvaW50ZXJFdmVudC5wb2ludGVySWRdID0gcG9pbnRlckV2ZW50O1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogY2hlY2sgaWYgZXYgbWF0Y2hlcyBwb2ludGVydHlwZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcG9pbnRlclR5cGUgbWF0Y2hlcyBgUE9JTlRFUl9NT1VTRXxUT1VDSHxQRU5gXG4gICAqIEBwYXJhbSB7UG9pbnRlckV2ZW50fSBldlxuICAgKi9cbiAgbWF0Y2hUeXBlOiBmdW5jdGlvbiBtYXRjaFR5cGUocG9pbnRlclR5cGUsIGV2KSB7XG4gICAgaWYgKCFldi5wb2ludGVyVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBwdCA9IGV2LnBvaW50ZXJUeXBlLFxuICAgICAgICB0eXBlcyA9IHt9O1xuXG4gICAgdHlwZXNbUE9JTlRFUl9NT1VTRV0gPSAocHQgPT09IChldi5NU1BPSU5URVJfVFlQRV9NT1VTRSB8fCBQT0lOVEVSX01PVVNFKSk7XG4gICAgdHlwZXNbUE9JTlRFUl9UT1VDSF0gPSAocHQgPT09IChldi5NU1BPSU5URVJfVFlQRV9UT1VDSCB8fCBQT0lOVEVSX1RPVUNIKSk7XG4gICAgdHlwZXNbUE9JTlRFUl9QRU5dID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfUEVOIHx8IFBPSU5URVJfUEVOKSk7XG4gICAgcmV0dXJuIHR5cGVzW3BvaW50ZXJUeXBlXTtcbiAgfSxcblxuICAvKipcbiAgICogcmVzZXQgdGhlIHN0b3JlZCBwb2ludGVyc1xuICAgKi9cbiAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0TGlzdCgpIHtcbiAgICB0aGlzLnBvaW50ZXJzID0ge307XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICpcbiAqIEBjbGFzcyBEZXRlY3Rpb25cbiAqIEBzdGF0aWNcbiAqL1xuRGV0ZWN0aW9uID0gR2VzdHVyZURldGVjdG9yLmRldGVjdGlvbiA9IHtcbiAgLy8gY29udGFpbnMgYWxsIHJlZ2lzdGVyZWQgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gIGdlc3R1cmVzOiBbXSxcblxuICAvLyBkYXRhIG9mIHRoZSBjdXJyZW50IEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGRldGVjdGlvbiBzZXNzaW9uXG4gIGN1cnJlbnQ6IG51bGwsXG5cbiAgLy8gdGhlIHByZXZpb3VzIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIHNlc3Npb24gZGF0YVxuICAvLyBpcyBhIGZ1bGwgY2xvbmUgb2YgdGhlIHByZXZpb3VzIGdlc3R1cmUuY3VycmVudCBvYmplY3RcbiAgcHJldmlvdXM6IG51bGwsXG5cbiAgLy8gd2hlbiB0aGlzIGJlY29tZXMgdHJ1ZSwgbm8gZ2VzdHVyZXMgYXJlIGZpcmVkXG4gIHN0b3BwZWQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBzdGFydCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICogQHBhcmFtIHtHZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2V9IGluc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50RGF0YVxuICAgKi9cbiAgc3RhcnREZXRlY3Q6IGZ1bmN0aW9uIHN0YXJ0RGV0ZWN0KGluc3QsIGV2ZW50RGF0YSkge1xuICAgIC8vIGFscmVhZHkgYnVzeSB3aXRoIGEgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgZGV0ZWN0aW9uIG9uIGFuIGVsZW1lbnRcbiAgICBpZiAodGhpcy5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG5cbiAgICAvLyBob2xkcyBjdXJyZW50IHNlc3Npb25cbiAgICB0aGlzLmN1cnJlbnQgPSB7XG4gICAgICBpbnN0OiBpbnN0LCAvLyByZWZlcmVuY2UgdG8gR2VzdHVyZURldGVjdG9ySW5zdGFuY2Ugd2UncmUgd29ya2luZyBmb3JcbiAgICAgIHN0YXJ0RXZlbnQ6IFV0aWxzLmV4dGVuZCh7fSwgZXZlbnREYXRhKSwgLy8gc3RhcnQgZXZlbnREYXRhIGZvciBkaXN0YW5jZXMsIHRpbWluZyBldGNcbiAgICAgIGxhc3RFdmVudDogZmFsc2UsIC8vIGxhc3QgZXZlbnREYXRhXG4gICAgICBsYXN0Q2FsY0V2ZW50OiBmYWxzZSwgLy8gbGFzdCBldmVudERhdGEgZm9yIGNhbGN1bGF0aW9ucy5cbiAgICAgIGZ1dHVyZUNhbGNFdmVudDogZmFsc2UsIC8vIGxhc3QgZXZlbnREYXRhIGZvciBjYWxjdWxhdGlvbnMuXG4gICAgICBsYXN0Q2FsY0RhdGE6IHt9LCAvLyBsYXN0IGxhc3RDYWxjRGF0YVxuICAgICAgbmFtZTogJycgLy8gY3VycmVudCBnZXN0dXJlIHdlJ3JlIGluL2RldGVjdGVkLCBjYW4gYmUgJ3RhcCcsICdob2xkJyBldGNcbiAgICB9O1xuXG4gICAgdGhpcy5kZXRlY3QoZXZlbnREYXRhKTtcbiAgfSxcblxuICAvKipcbiAgICogR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudERhdGFcbiAgICogQHJldHVybiB7YW55fVxuICAgKi9cbiAgZGV0ZWN0OiBmdW5jdGlvbiBkZXRlY3QoZXZlbnREYXRhKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnQgfHwgdGhpcy5zdG9wcGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXh0ZW5kIGV2ZW50IGRhdGEgd2l0aCBjYWxjdWxhdGlvbnMgYWJvdXQgc2NhbGUsIGRpc3RhbmNlIGV0Y1xuICAgIGV2ZW50RGF0YSA9IHRoaXMuZXh0ZW5kRXZlbnREYXRhKGV2ZW50RGF0YSk7XG5cbiAgICAvLyBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2UgYW5kIGluc3RhbmNlIG9wdGlvbnNcbiAgICB2YXIgaW5zdCA9IHRoaXMuY3VycmVudC5pbnN0LFxuICAgICAgICBpbnN0T3B0aW9ucyA9IGluc3Qub3B0aW9ucztcblxuICAgIC8vIGNhbGwgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgaGFuZGxlcnNcbiAgICBVdGlscy5lYWNoKHRoaXMuZ2VzdHVyZXMsIGZ1bmN0aW9uIHRyaWdnZXJHZXN0dXJlKGdlc3R1cmUpIHtcbiAgICAgIC8vIG9ubHkgd2hlbiB0aGUgaW5zdGFuY2Ugb3B0aW9ucyBoYXZlIGVuYWJsZWQgdGhpcyBnZXN0dXJlXG4gICAgICBpZiAoIXRoaXMuc3RvcHBlZCAmJiBpbnN0LmVuYWJsZWQgJiYgaW5zdE9wdGlvbnNbZ2VzdHVyZS5uYW1lXSkge1xuICAgICAgICBnZXN0dXJlLmhhbmRsZXIuY2FsbChnZXN0dXJlLCBldmVudERhdGEsIGluc3QpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgLy8gc3RvcmUgYXMgcHJldmlvdXMgZXZlbnQgZXZlbnRcbiAgICBpZiAodGhpcy5jdXJyZW50KSB7XG4gICAgICB0aGlzLmN1cnJlbnQubGFzdEV2ZW50ID0gZXZlbnREYXRhO1xuICAgIH1cblxuICAgIGlmIChldmVudERhdGEuZXZlbnRUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgdGhpcy5zdG9wRGV0ZWN0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50RGF0YTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICB9LFxuXG4gIC8qKlxuICAgKiBjbGVhciB0aGUgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgdmFyc1xuICAgKiB0aGlzIGlzIGNhbGxlZCBvbiBlbmREZXRlY3QsIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIHdoZW4gYSBmaW5hbCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBoYXMgYmVlbiBkZXRlY3RlZFxuICAgKiB0byBzdG9wIG90aGVyIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcyBmcm9tIGJlaW5nIGZpcmVkXG4gICAqL1xuICBzdG9wRGV0ZWN0OiBmdW5jdGlvbiBzdG9wRGV0ZWN0KCkge1xuICAgIC8vIGNsb25lIGN1cnJlbnQgZGF0YSB0byB0aGUgc3RvcmUgYXMgdGhlIHByZXZpb3VzIGdlc3R1cmVcbiAgICAvLyB1c2VkIGZvciB0aGUgZG91YmxlIHRhcCBnZXN0dXJlLCBzaW5jZSB0aGlzIGlzIGFuIG90aGVyIGdlc3R1cmUgZGV0ZWN0IHNlc3Npb25cbiAgICB0aGlzLnByZXZpb3VzID0gVXRpbHMuZXh0ZW5kKHt9LCB0aGlzLmN1cnJlbnQpO1xuXG4gICAgLy8gcmVzZXQgdGhlIGN1cnJlbnRcbiAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB2ZWxvY2l0eSwgYW5nbGUgYW5kIGRpcmVjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHBhcmFtIHtPYmplY3R9IGNlbnRlclxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhWVxuICAgKi9cbiAgZ2V0Q2FsY3VsYXRlZERhdGE6IGZ1bmN0aW9uIGdldENhbGN1bGF0ZWREYXRhKGV2LCBjZW50ZXIsIGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpIHtcbiAgICB2YXIgY3VyID0gdGhpcy5jdXJyZW50LFxuICAgICAgICByZWNhbGMgPSBmYWxzZSxcbiAgICAgICAgY2FsY0V2ID0gY3VyLmxhc3RDYWxjRXZlbnQsXG4gICAgICAgIGNhbGNEYXRhID0gY3VyLmxhc3RDYWxjRGF0YTtcblxuICAgIGlmIChjYWxjRXYgJiYgZXYudGltZVN0YW1wIC0gY2FsY0V2LnRpbWVTdGFtcCA+IEdlc3R1cmVEZXRlY3Rvci5DQUxDVUxBVEVfSU5URVJWQUwpIHtcbiAgICAgIGNlbnRlciA9IGNhbGNFdi5jZW50ZXI7XG4gICAgICBkZWx0YVRpbWUgPSBldi50aW1lU3RhbXAgLSBjYWxjRXYudGltZVN0YW1wO1xuICAgICAgZGVsdGFYID0gZXYuY2VudGVyLmNsaWVudFggLSBjYWxjRXYuY2VudGVyLmNsaWVudFg7XG4gICAgICBkZWx0YVkgPSBldi5jZW50ZXIuY2xpZW50WSAtIGNhbGNFdi5jZW50ZXIuY2xpZW50WTtcbiAgICAgIHJlY2FsYyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCB8fCBldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgY3VyLmZ1dHVyZUNhbGNFdmVudCA9IGV2O1xuICAgIH1cblxuICAgIGlmICghY3VyLmxhc3RDYWxjRXZlbnQgfHwgcmVjYWxjKSB7XG4gICAgICBjYWxjRGF0YS52ZWxvY2l0eSA9IFV0aWxzLmdldFZlbG9jaXR5KGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgY2FsY0RhdGEuYW5nbGUgPSBVdGlscy5nZXRBbmdsZShjZW50ZXIsIGV2LmNlbnRlcik7XG4gICAgICBjYWxjRGF0YS5kaXJlY3Rpb24gPSBVdGlscy5nZXREaXJlY3Rpb24oY2VudGVyLCBldi5jZW50ZXIpO1xuXG4gICAgICBjdXIubGFzdENhbGNFdmVudCA9IGN1ci5mdXR1cmVDYWxjRXZlbnQgfHwgZXY7XG4gICAgICBjdXIuZnV0dXJlQ2FsY0V2ZW50ID0gZXY7XG4gICAgfVxuXG4gICAgZXYudmVsb2NpdHlYID0gY2FsY0RhdGEudmVsb2NpdHkueDtcbiAgICBldi52ZWxvY2l0eVkgPSBjYWxjRGF0YS52ZWxvY2l0eS55O1xuICAgIGV2LmludGVyaW1BbmdsZSA9IGNhbGNEYXRhLmFuZ2xlO1xuICAgIGV2LmludGVyaW1EaXJlY3Rpb24gPSBjYWxjRGF0YS5kaXJlY3Rpb247XG4gIH0sXG5cbiAgLyoqXG4gICAqIGV4dGVuZCBldmVudERhdGEgZm9yIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHJldHVybiB7T2JqZWN0fSBldlxuICAgKi9cbiAgZXh0ZW5kRXZlbnREYXRhOiBmdW5jdGlvbiBleHRlbmRFdmVudERhdGEoZXYpIHtcbiAgICB2YXIgY3VyID0gdGhpcy5jdXJyZW50LFxuICAgICAgICBzdGFydEV2ID0gY3VyLnN0YXJ0RXZlbnQsXG4gICAgICAgIGxhc3RFdiA9IGN1ci5sYXN0RXZlbnQgfHwgc3RhcnRFdjtcblxuICAgIC8vIHVwZGF0ZSB0aGUgc3RhcnQgdG91Y2hsaXN0IHRvIGNhbGN1bGF0ZSB0aGUgc2NhbGUvcm90YXRpb25cbiAgICBpZiAoZXYuZXZlbnRUeXBlID09IEVWRU5UX1RPVUNIIHx8IGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9SRUxFQVNFKSB7XG4gICAgICBzdGFydEV2LnRvdWNoZXMgPSBbXTtcbiAgICAgIFV0aWxzLmVhY2goZXYudG91Y2hlcywgZnVuY3Rpb24odG91Y2gpIHtcbiAgICAgICAgc3RhcnRFdi50b3VjaGVzLnB1c2goe1xuICAgICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgICAgY2xpZW50WTogdG91Y2guY2xpZW50WVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBkZWx0YVRpbWUgPSBldi50aW1lU3RhbXAgLSBzdGFydEV2LnRpbWVTdGFtcCxcbiAgICAgICAgZGVsdGFYID0gZXYuY2VudGVyLmNsaWVudFggLSBzdGFydEV2LmNlbnRlci5jbGllbnRYLFxuICAgICAgICBkZWx0YVkgPSBldi5jZW50ZXIuY2xpZW50WSAtIHN0YXJ0RXYuY2VudGVyLmNsaWVudFk7XG5cbiAgICB0aGlzLmdldENhbGN1bGF0ZWREYXRhKGV2LCBsYXN0RXYuY2VudGVyLCBkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcblxuICAgIFV0aWxzLmV4dGVuZChldiwge1xuICAgICAgc3RhcnRFdmVudDogc3RhcnRFdixcblxuICAgICAgZGVsdGFUaW1lOiBkZWx0YVRpbWUsXG4gICAgICBkZWx0YVg6IGRlbHRhWCxcbiAgICAgIGRlbHRhWTogZGVsdGFZLFxuXG4gICAgICBkaXN0YW5jZTogVXRpbHMuZ2V0RGlzdGFuY2Uoc3RhcnRFdi5jZW50ZXIsIGV2LmNlbnRlciksXG4gICAgICBhbmdsZTogVXRpbHMuZ2V0QW5nbGUoc3RhcnRFdi5jZW50ZXIsIGV2LmNlbnRlciksXG4gICAgICBkaXJlY3Rpb246IFV0aWxzLmdldERpcmVjdGlvbihzdGFydEV2LmNlbnRlciwgZXYuY2VudGVyKSxcbiAgICAgIHNjYWxlOiBVdGlscy5nZXRTY2FsZShzdGFydEV2LnRvdWNoZXMsIGV2LnRvdWNoZXMpLFxuICAgICAgcm90YXRpb246IFV0aWxzLmdldFJvdGF0aW9uKHN0YXJ0RXYudG91Y2hlcywgZXYudG91Y2hlcylcbiAgICB9KTtcblxuICAgIHJldHVybiBldjtcbiAgfSxcblxuICAvKipcbiAgICogcmVnaXN0ZXIgbmV3IGdlc3R1cmVcbiAgICogQHBhcmFtIHtPYmplY3R9IGdlc3R1cmUgb2JqZWN0LCBzZWUgYGdlc3R1cmVzL2AgZm9yIGRvY3VtZW50YXRpb25cbiAgICogQHJldHVybiB7QXJyYXl9IGdlc3R1cmVzXG4gICAqL1xuICByZWdpc3RlcjogZnVuY3Rpb24gcmVnaXN0ZXIoZ2VzdHVyZSkge1xuICAgIC8vIGFkZCBhbiBlbmFibGUgZ2VzdHVyZSBvcHRpb25zIGlmIHRoZXJlIGlzIG5vIGdpdmVuXG4gICAgdmFyIG9wdGlvbnMgPSBnZXN0dXJlLmRlZmF1bHRzIHx8IHt9O1xuICAgIGlmIChvcHRpb25zW2dlc3R1cmUubmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9uc1tnZXN0dXJlLm5hbWVdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBleHRlbmQgR2VzdHVyZURldGVjdG9yIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBvcHRpb25zXG4gICAgVXRpbHMuZXh0ZW5kKEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cywgb3B0aW9ucywgdHJ1ZSk7XG5cbiAgICAvLyBzZXQgaXRzIGluZGV4XG4gICAgZ2VzdHVyZS5pbmRleCA9IGdlc3R1cmUuaW5kZXggfHwgMTAwMDtcblxuICAgIC8vIGFkZCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSB0byB0aGUgbGlzdFxuICAgIHRoaXMuZ2VzdHVyZXMucHVzaChnZXN0dXJlKTtcblxuICAgIC8vIHNvcnQgdGhlIGxpc3QgYnkgaW5kZXhcbiAgICB0aGlzLmdlc3R1cmVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgaWYgKGEuaW5kZXggPCBiLmluZGV4KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmluZGV4ID4gYi5pbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2VzdHVyZXM7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICovXG5cbi8qKlxuICogY3JlYXRlIG5ldyBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2VcbiAqIGFsbCBtZXRob2RzIHNob3VsZCByZXR1cm4gdGhlIGluc3RhbmNlIGl0c2VsZiwgc28gaXQgaXMgY2hhaW5hYmxlLlxuICpcbiAqIEBjbGFzcyBJbnN0YW5jZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIG9wdGlvbnMgYXJlIG1lcmdlZCB3aXRoIGBHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHNgXG4gKiBAcmV0dXJuIHtHZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2V9XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5JbnN0YW5jZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbGlzdGVuZXJPcHRpb25zID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5wYXNzaXZlKSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogdW5kZWZpbmVkO1xuXG4gIC8vIHNldHVwIEdlc3R1cmVEZXRlY3RvckpTIHdpbmRvdyBldmVudHMgYW5kIHJlZ2lzdGVyIGFsbCBnZXN0dXJlc1xuICAvLyB0aGlzIGFsc28gc2V0cyB1cCB0aGUgZGVmYXVsdCBvcHRpb25zXG4gIHNldHVwKGxpc3RlbmVyT3B0aW9ucyk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBlbGVtZW50XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBlbmFibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBvcHRpb25zLCBtZXJnZWQgd2l0aCB0aGUgZGVmYXVsdHNcbiAgICogb3B0aW9ucyB3aXRoIGFuIF8gYXJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2VcbiAgICogQHByb3BlcnR5IG9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIFV0aWxzLmVhY2gob3B0aW9ucywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBkZWxldGUgb3B0aW9uc1tuYW1lXTtcbiAgICBvcHRpb25zW1V0aWxzLnRvQ2FtZWxDYXNlKG5hbWUpXSA9IHZhbHVlO1xuICB9KTtcblxuICB0aGlzLm9wdGlvbnMgPSBVdGlscy5leHRlbmQoVXRpbHMuZXh0ZW5kKHt9LCBHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMpLCBvcHRpb25zIHx8IHt9KTtcbiAgdGhpcy5vcHRpb25zLmxpc3RlbmVyT3B0aW9ucyA9IGxpc3RlbmVyT3B0aW9ucztcblxuICAvLyBhZGQgc29tZSBjc3MgdG8gdGhlIGVsZW1lbnQgdG8gcHJldmVudCB0aGUgYnJvd3NlciBmcm9tIGRvaW5nIGl0cyBuYXRpdmUgYmVoYXZpb3JcbiAgaWYgKHRoaXMub3B0aW9ucy5iZWhhdmlvcikge1xuICAgIFV0aWxzLnRvZ2dsZUJlaGF2aW9yKHRoaXMuZWxlbWVudCwgdGhpcy5vcHRpb25zLmJlaGF2aW9yLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBldmVudCBzdGFydCBoYW5kbGVyIG9uIHRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBkZXRlY3Rpb25cbiAgICogQHByb3BlcnR5IGV2ZW50U3RhcnRIYW5kbGVyXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICB0aGlzLmV2ZW50U3RhcnRIYW5kbGVyID0gRXZlbnQub25Ub3VjaChlbGVtZW50LCBFVkVOVF9TVEFSVCwgZnVuY3Rpb24oZXYpIHtcbiAgICBpZiAoc2VsZi5lbmFibGVkICYmIGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9TVEFSVCkge1xuICAgICAgRGV0ZWN0aW9uLnN0YXJ0RGV0ZWN0KHNlbGYsIGV2KTtcbiAgICB9IGVsc2UgaWYgKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCkge1xuICAgICAgRGV0ZWN0aW9uLmRldGVjdChldik7XG4gICAgfVxuICB9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXG4gIC8qKlxuICAgKiBrZWVwIGEgbGlzdCBvZiB1c2VyIGV2ZW50IGhhbmRsZXJzIHdoaWNoIG5lZWRzIHRvIGJlIHJlbW92ZWQgd2hlbiBjYWxsaW5nICdkaXNwb3NlJ1xuICAgKiBAcHJvcGVydHkgZXZlbnRIYW5kbGVyc1xuICAgKiBAdHlwZSB7QXJyYXl9XG4gICAqL1xuICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBbXTtcbn07XG5cbkdlc3R1cmVEZXRlY3Rvci5JbnN0YW5jZS5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBAbWV0aG9kIG9uXG4gICAqIEBzaWduYXR1cmUgb24oZ2VzdHVyZXMsIGhhbmRsZXIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUFkZHMgYW4gZXZlbnQgaGFuZGxlciBmb3IgYSBnZXN0dXJlLiBBdmFpbGFibGUgZ2VzdHVyZXMgYXJlOiBkcmFnLCBkcmFnbGVmdCwgZHJhZ3JpZ2h0LCBkcmFndXAsIGRyYWdkb3duLCBob2xkLCByZWxlYXNlLCBzd2lwZSwgc3dpcGVsZWZ0LCBzd2lwZXJpZ2h0LCBzd2lwZXVwLCBzd2lwZWRvd24sIHRhcCwgZG91YmxldGFwLCB0b3VjaCwgdHJhbnNmb3JtLCBwaW5jaCwgcGluY2hpbiwgcGluY2hvdXQgYW5kIHJvdGF0ZS4gWy9lbl1cbiAgICogIFtqYV3jgrjjgqfjgrnjg4Hjg6Pjgavlr77jgZnjgovjgqTjg5njg7Pjg4jjg4/jg7Pjg4njg6njgpLov73liqDjgZfjgb7jgZnjgILmjIflrprjgafjgY3jgovjgrjjgqfjgrnjg4Hjg6PlkI3jga/jgIFkcmFnIGRyYWdsZWZ0IGRyYWdyaWdodCBkcmFndXAgZHJhZ2Rvd24gaG9sZCByZWxlYXNlIHN3aXBlIHN3aXBlbGVmdCBzd2lwZXJpZ2h0IHN3aXBldXAgc3dpcGVkb3duIHRhcCBkb3VibGV0YXAgdG91Y2ggdHJhbnNmb3JtIHBpbmNoIHBpbmNoaW4gcGluY2hvdXQgcm90YXRlIOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnZXN0dXJlc1xuICAgKiAgIFtlbl1BIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGdlc3R1cmVzLlsvZW5dXG4gICAqICAgW2phXeaknOefpeOBmeOCi+OCuOOCp+OCueODgeODo+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAguOCueODmuODvOOCueOBp+ikh+aVsOaMh+WumuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogICBbZW5dQW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44OP44Oz44OJ44Op44Go44Gq44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIG9uOiBmdW5jdGlvbiBvbkV2ZW50KGdlc3R1cmVzLCBoYW5kbGVyLCBvcHQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBFdmVudC5vbihzZWxmLmVsZW1lbnQsIGdlc3R1cmVzLCBoYW5kbGVyLCB1dGlsLmV4dGVuZCh7fSwgc2VsZi5vcHRpb25zLmxpc3RlbmVyT3B0aW9ucywgb3B0KSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgc2VsZi5ldmVudEhhbmRsZXJzLnB1c2goeyBnZXN0dXJlOiB0eXBlLCBoYW5kbGVyOiBoYW5kbGVyIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIG9mZlxuICAgKiBAc2lnbmF0dXJlIG9mZihnZXN0dXJlcywgaGFuZGxlcilcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlsvZW5dXG4gICAqICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5YmK6Zmk44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IGdlc3R1cmVzXG4gICAqICAgW2VuXUEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZ2VzdHVyZXMuWy9lbl1cbiAgICogICBbamFd44K444Kn44K544OB44Oj5ZCN44KS5oyH5a6a44GX44G+44GZ44CC44K544Oa44O844K544Gn6KSH5pWw5oyH5a6a44GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiAgIFtlbl1BbiBldmVudCBoYW5kbGluZyBmdW5jdGlvbi5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjg4/jg7Pjg4njg6njgajjgarjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmZFdmVudChnZXN0dXJlcywgaGFuZGxlciwgb3B0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgRXZlbnQub2ZmKHNlbGYuZWxlbWVudCwgZ2VzdHVyZXMsIGhhbmRsZXIsIHV0aWwuZXh0ZW5kKHt9LCBzZWxmLm9wdGlvbnMubGlzdGVuZXJPcHRpb25zLCBvcHQpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgaW5kZXggPSBVdGlscy5pbkFycmF5KHNlbGYuZXZlbnRIYW5kbGVycywgeyBnZXN0dXJlOiB0eXBlLCBoYW5kbGVyOiBoYW5kbGVyIH0sIHRydWUpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgc2VsZi5ldmVudEhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHRyaWdnZXIgZ2VzdHVyZSBldmVudFxuICAgKiBAbWV0aG9kIHRyaWdnZXJcbiAgICogQHNpZ25hdHVyZSB0cmlnZ2VyKGdlc3R1cmUsIGV2ZW50RGF0YSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IGdlc3R1cmVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdXG4gICAqL1xuICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZ2VzdHVyZSwgZXZlbnREYXRhKSB7XG4gICAgLy8gb3B0aW9uYWxcbiAgICBpZiAoIWV2ZW50RGF0YSkge1xuICAgICAgZXZlbnREYXRhID0ge307XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIERPTSBldmVudFxuICAgIHZhciBldmVudCA9IEdlc3R1cmVEZXRlY3Rvci5ET0NVTUVOVC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5pbml0RXZlbnQoZ2VzdHVyZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZXZlbnQuZ2VzdHVyZSA9IGV2ZW50RGF0YTtcblxuICAgIC8vIHRyaWdnZXIgb24gdGhlIHRhcmdldCBpZiBpdCBpcyBpbiB0aGUgaW5zdGFuY2UgZWxlbWVudCxcbiAgICAvLyB0aGlzIGlzIGZvciBldmVudCBkZWxlZ2F0aW9uIHRyaWNrc1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuICAgIGlmIChVdGlscy5oYXNQYXJlbnQoZXZlbnREYXRhLnRhcmdldCwgZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQgPSBldmVudERhdGEudGFyZ2V0O1xuICAgIH1cblxuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZW5hYmxlXG4gICAqIEBzaWduYXR1cmUgZW5hYmxlKHN0YXRlKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1FbmFibGUgb3IgZGlzYWJsZSBnZXN0dXJlIGRldGVjdGlvbi5bL2VuXVxuICAgKiAgW2phXeOCuOOCp+OCueODgeODo+aknOefpeOCkuacieWKueWMli/nhKHlirnljJbjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0YXRlXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgaXQgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeacieWKueOBq+OBmeOCi+OBi+OBqeOBhuOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBlbmFibGU6IGZ1bmN0aW9uIGVuYWJsZShzdGF0ZSkge1xuICAgIHRoaXMuZW5hYmxlZCA9IHN0YXRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICogQHNpZ25hdHVyZSBkaXNwb3NlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dUmVtb3ZlIGFuZCBkZXN0cm95IGFsbCBldmVudCBoYW5kbGVycyBmb3IgdGhpcyBpbnN0YW5jZS5bL2VuXVxuICAgKiAgW2phXeOBk+OBruOCpOODs+OCueOCv+ODs+OCueOBp+OBruOCuOOCp+OCueODgeODo+OBruaknOefpeOChOOAgeOCpOODmeODs+ODiOODj+ODs+ODieODqeOCkuWFqOOBpuino+mZpOOBl+OBpuW7g+ajhOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHZhciBpLCBlaDtcblxuICAgIC8vIHVuZG8gYWxsIGNoYW5nZXMgbWFkZSBieSBzdG9wX2Jyb3dzZXJfYmVoYXZpb3JcbiAgICBVdGlscy50b2dnbGVCZWhhdmlvcih0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5iZWhhdmlvciwgZmFsc2UpO1xuXG4gICAgLy8gdW5iaW5kIGFsbCBjdXN0b20gZXZlbnQgaGFuZGxlcnNcbiAgICBmb3IgKGkgPSAtMTsgKGVoID0gdGhpcy5ldmVudEhhbmRsZXJzWysraV0pOykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbmQtYXNzaWduXG4gICAgICBVdGlscy5vZmYodGhpcy5lbGVtZW50LCBlaC5nZXN0dXJlLCBlaC5oYW5kbGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBbXTtcblxuICAgIC8vIHVuYmluZCB0aGUgc3RhcnQgZXZlbnQgbGlzdGVuZXJcbiAgICBFdmVudC5vZmYodGhpcy5lbGVtZW50LCBFVkVOVF9UWVBFU1tFVkVOVF9TVEFSVF0sIHRoaXMuZXZlbnRTdGFydEhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIGdlc3R1cmVzXG4gKi9cbi8qKlxuICogTW92ZSB3aXRoIHggZmluZ2VycyAoZGVmYXVsdCAxKSBhcm91bmQgb24gdGhlIHBhZ2UuXG4gKiBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3IgaXMgYSBnb29kIHdheSB0byBpbXByb3ZlIGZlZWwgYW5kIHdvcmtpbmcuXG4gKiBgYGBgXG4gKiAgR2VzdHVyZURldGVjdG9ydGltZS5vbihcImRyYWdcIiwgZnVuY3Rpb24oZXYpIHtcbiAqICAgIGNvbnNvbGUubG9nKGV2KTtcbiAqICAgIGV2Lmdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcbiAqICB9KTtcbiAqIGBgYGBcbiAqXG4gKiBAY2xhc3MgRHJhZ1xuICogQHN0YXRpY1xuICovXG4vKipcbiAqIEBldmVudCBkcmFnXG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ3N0YXJ0XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ2VuZFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYXBsZWZ0XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ3JpZ2h0XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ3VwXG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ2Rvd25cbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqL1xuKGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHRyaWdnZXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGRyYWdHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgdmFyIGN1ciA9IERldGVjdGlvbi5jdXJyZW50O1xuXG4gICAgLy8gbWF4IHRvdWNoZXNcbiAgICBpZiAoaW5zdC5vcHRpb25zLmRyYWdNYXhUb3VjaGVzID4gMCAmJlxuICAgICAgZXYudG91Y2hlcy5sZW5ndGggPiBpbnN0Lm9wdGlvbnMuZHJhZ01heFRvdWNoZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2LmV2ZW50VHlwZSkge1xuICAgIGNhc2UgRVZFTlRfU1RBUlQ6XG4gICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgLy8gd2hlbiB0aGUgZGlzdGFuY2Ugd2UgbW92ZWQgaXMgdG9vIHNtYWxsIHdlIHNraXAgdGhpcyBnZXN0dXJlXG4gICAgICAvLyBvciB3ZSBjYW4gYmUgYWxyZWFkeSBpbiBkcmFnZ2luZ1xuICAgICAgaWYgKGV2LmRpc3RhbmNlIDwgaW5zdC5vcHRpb25zLmRyYWdNaW5EaXN0YW5jZSAmJlxuICAgICAgICBjdXIubmFtZSAhPSBuYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0Q2VudGVyID0gY3VyLnN0YXJ0RXZlbnQuY2VudGVyO1xuXG4gICAgICAvLyB3ZSBhcmUgZHJhZ2dpbmchXG4gICAgICBpZiAoY3VyLm5hbWUgIT0gbmFtZSkge1xuICAgICAgICBjdXIubmFtZSA9IG5hbWU7XG4gICAgICAgIGlmIChpbnN0Lm9wdGlvbnMuZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvbiAmJiBldi5kaXN0YW5jZSA+IDApIHtcbiAgICAgICAgICAvLyBXaGVuIGEgZHJhZyBpcyB0cmlnZ2VyZWQsIHNldCB0aGUgZXZlbnQgY2VudGVyIHRvIGRyYWdNaW5EaXN0YW5jZSBwaXhlbHMgZnJvbSB0aGUgb3JpZ2luYWwgZXZlbnQgY2VudGVyLlxuICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcyBjb3JyZWN0aW9uLCB0aGUgZHJhZ2dlZCBkaXN0YW5jZSB3b3VsZCBqdW1wc3RhcnQgYXQgZHJhZ01pbkRpc3RhbmNlIHBpeGVscyBpbnN0ZWFkIG9mIGF0IDAuXG4gICAgICAgICAgLy8gSXQgbWlnaHQgYmUgdXNlZnVsIHRvIHNhdmUgdGhlIG9yaWdpbmFsIHN0YXJ0IHBvaW50IHNvbWV3aGVyZVxuICAgICAgICAgIHZhciBmYWN0b3IgPSBNYXRoLmFicyhpbnN0Lm9wdGlvbnMuZHJhZ01pbkRpc3RhbmNlIC8gZXYuZGlzdGFuY2UpO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLnBhZ2VYICs9IGV2LmRlbHRhWCAqIGZhY3RvcjtcbiAgICAgICAgICBzdGFydENlbnRlci5wYWdlWSArPSBldi5kZWx0YVkgKiBmYWN0b3I7XG4gICAgICAgICAgc3RhcnRDZW50ZXIuY2xpZW50WCArPSBldi5kZWx0YVggKiBmYWN0b3I7XG4gICAgICAgICAgc3RhcnRDZW50ZXIuY2xpZW50WSArPSBldi5kZWx0YVkgKiBmYWN0b3I7XG5cbiAgICAgICAgICAvLyByZWNhbGN1bGF0ZSBldmVudCBkYXRhIHVzaW5nIG5ldyBzdGFydCBwb2ludFxuICAgICAgICAgIGV2ID0gRGV0ZWN0aW9uLmV4dGVuZEV2ZW50RGF0YShldik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbG9jayBkcmFnIHRvIGF4aXM/XG4gICAgICBpZiAoY3VyLmxhc3RFdmVudC5kcmFnTG9ja1RvQXhpcyB8fFxuICAgICAgICAoIGluc3Qub3B0aW9ucy5kcmFnTG9ja1RvQXhpcyAmJlxuICAgICAgICAgIGluc3Qub3B0aW9ucy5kcmFnTG9ja01pbkRpc3RhbmNlIDw9IGV2LmRpc3RhbmNlXG4gICAgICAgICkpIHtcbiAgICAgICAgICBldi5kcmFnTG9ja1RvQXhpcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBrZWVwIGRpcmVjdGlvbiBvbiB0aGUgYXhpcyB0aGF0IHRoZSBkcmFnIGdlc3R1cmUgc3RhcnRlZCBvblxuICAgICAgICB2YXIgbGFzdERpcmVjdGlvbiA9IGN1ci5sYXN0RXZlbnQuZGlyZWN0aW9uO1xuICAgICAgICBpZiAoZXYuZHJhZ0xvY2tUb0F4aXMgJiYgbGFzdERpcmVjdGlvbiAhPT0gZXYuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgaWYgKFV0aWxzLmlzVmVydGljYWwobGFzdERpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGV2LmRpcmVjdGlvbiA9IChldi5kZWx0YVkgPCAwKSA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldi5kaXJlY3Rpb24gPSAoZXYuZGVsdGFYIDwgMCkgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCB0aW1lLCB0cmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICBpZiAoIXRyaWdnZXJlZCkge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ3N0YXJ0JywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIGV2ZW50c1xuICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSwgZXYpO1xuICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSArIGV2LmRpcmVjdGlvbiwgZXYpO1xuXG4gICAgICAgIHZhciBpc1ZlcnRpY2FsID0gVXRpbHMuaXNWZXJ0aWNhbChldi5kaXJlY3Rpb24pO1xuXG4gICAgICAgIC8vIGJsb2NrIHRoZSBicm93c2VyIGV2ZW50c1xuICAgICAgICBpZiAoKGluc3Qub3B0aW9ucy5kcmFnQmxvY2tWZXJ0aWNhbCAmJiBpc1ZlcnRpY2FsKSB8fFxuICAgICAgICAgIChpbnN0Lm9wdGlvbnMuZHJhZ0Jsb2NrSG9yaXpvbnRhbCAmJiAhaXNWZXJ0aWNhbCkpIHtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX1JFTEVBU0U6XG4gICAgICAgIGlmICh0cmlnZ2VyZWQgJiYgZXYuY2hhbmdlZExlbmd0aCA8PSBpbnN0Lm9wdGlvbnMuZHJhZ01heFRvdWNoZXMpIHtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSArICdlbmQnLCBldik7XG4gICAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfRU5EOlxuICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLkRyYWcgPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaW5kZXg6IDUwLFxuICAgICAgaGFuZGxlcjogZHJhZ0dlc3R1cmUsXG4gICAgICBkZWZhdWx0czoge1xuICAgICAgICAvKipcbiAgICAgICAgICogbWluaW1hbCBtb3ZlbWVudCB0aGF0IGhhdmUgdG8gYmUgbWFkZSBiZWZvcmUgdGhlIGRyYWcgZXZlbnQgZ2V0cyB0cmlnZ2VyZWRcbiAgICAgICAgICogQHByb3BlcnR5IGRyYWdNaW5EaXN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ01pbkRpc3RhbmNlOiAxMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IGRyYWdEaXN0YW5jZUNvcnJlY3Rpb24gdG8gdHJ1ZSB0byBtYWtlIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgZHJhZ1xuICAgICAgICAgKiBiZSBjYWxjdWxhdGVkIGZyb20gd2hlcmUgdGhlIGRyYWcgd2FzIHRyaWdnZXJlZCwgbm90IGZyb20gd2hlcmUgdGhlIHRvdWNoIHN0YXJ0ZWQuXG4gICAgICAgICAqIFVzZWZ1bCB0byBhdm9pZCBhIGplcmstc3RhcnRpbmcgZHJhZywgd2hpY2ggY2FuIG1ha2UgZmluZS1hZGp1c3RtZW50c1xuICAgICAgICAgKiB0aHJvdWdoIGRyYWdnaW5nIGRpZmZpY3VsdCwgYW5kIGJlIHZpc3VhbGx5IHVuYXBwZWFsaW5nLlxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvbjogdHJ1ZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogc2V0IDAgZm9yIHVubGltaXRlZCwgYnV0IHRoaXMgY2FuIGNvbmZsaWN0IHdpdGggdHJhbnNmb3JtXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTWF4VG91Y2hlc1xuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTWF4VG91Y2hlczogMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogcHJldmVudCBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3Igd2hlbiBkcmFnZ2luZyBvY2N1cnNcbiAgICAgICAgICogYmUgY2FyZWZ1bCB3aXRoIGl0LCBpdCBtYWtlcyB0aGUgZWxlbWVudCBhIGJsb2NraW5nIGVsZW1lbnRcbiAgICAgICAgICogd2hlbiB5b3UgYXJlIHVzaW5nIHRoZSBkcmFnIGdlc3R1cmUsIGl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBzZXQgdGhpcyB0cnVlXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnQmxvY2tIb3Jpem9udGFsXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ0Jsb2NrSG9yaXpvbnRhbDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHNhbWUgYXMgYGRyYWdCbG9ja0hvcml6b250YWxgLCBidXQgZm9yIHZlcnRpY2FsIG1vdmVtZW50XG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnQmxvY2tWZXJ0aWNhbFxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdCbG9ja1ZlcnRpY2FsOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZHJhZ0xvY2tUb0F4aXMga2VlcHMgdGhlIGRyYWcgZ2VzdHVyZSBvbiB0aGUgYXhpcyB0aGF0IGl0IHN0YXJ0ZWQgb24sXG4gICAgICAgICAqIEl0IGRpc2FsbG93cyB2ZXJ0aWNhbCBkaXJlY3Rpb25zIGlmIHRoZSBpbml0aWFsIGRpcmVjdGlvbiB3YXMgaG9yaXpvbnRhbCwgYW5kIHZpY2UgdmVyc2EuXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTG9ja1RvQXhpc1xuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdMb2NrVG9BeGlzOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZHJhZyBsb2NrIG9ubHkga2lja3MgaW4gd2hlbiBkaXN0YW5jZSA+IGRyYWdMb2NrTWluRGlzdGFuY2VcbiAgICAgICAgICogVGhpcyB3YXksIGxvY2tpbmcgb2NjdXJzIG9ubHkgd2hlbiB0aGUgZGlzdGFuY2UgaGFzIGJlY29tZSBsYXJnZSBlbm91Z2ggdG8gcmVsaWFibHkgZGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb25cbiAgICAgICAgICogQHByb3BlcnR5IGRyYWdMb2NrTWluRGlzdGFuY2VcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMjVcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdMb2NrTWluRGlzdGFuY2U6IDI1XG4gICAgICB9XG4gICAgfTtcbiAgfSkoJ2RyYWcnKTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIHRyaWdnZXIgYSBzaW1wbGUgZ2VzdHVyZSBldmVudCwgc28geW91IGNhbiBkbyBhbnl0aGluZyBpbiB5b3VyIGhhbmRsZXIuXG4gICAqIG9ubHkgdXNhYmxlIGlmIHlvdSBrbm93IHdoYXQgeW91ciBkb2luZy4uLlxuICAgKlxuICAgKiBAY2xhc3MgR2VzdHVyZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IGdlc3R1cmVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuR2VzdHVyZSA9IHtcbiAgICBuYW1lOiAnZ2VzdHVyZScsXG4gICAgaW5kZXg6IDEzMzcsXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gcmVsZWFzZUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUsIGV2KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiBUb3VjaCBzdGF5cyBhdCB0aGUgc2FtZSBwbGFjZSBmb3IgeCB0aW1lXG4gICAqXG4gICAqIEBjbGFzcyBIb2xkXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgaG9sZFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqL1xuICAoZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciB0aW1lcjtcblxuICAgIGZ1bmN0aW9uIGhvbGRHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGluc3Qub3B0aW9ucyxcbiAgICAgICAgICBjdXJyZW50ID0gRGV0ZWN0aW9uLmN1cnJlbnQ7XG5cbiAgICAgIHN3aXRjaCAoZXYuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgZ2VzdHVyZSBzbyB3ZSBjYW4gY2hlY2sgaW4gdGhlIHRpbWVvdXQgaWYgaXQgc3RpbGwgaXNcbiAgICAgICAgY3VycmVudC5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBzZXQgdGltZXIgYW5kIGlmIGFmdGVyIHRoZSB0aW1lb3V0IGl0IHN0aWxsIGlzIGhvbGQsXG4gICAgICAgIC8vIHdlIHRyaWdnZXIgdGhlIGhvbGQgZXZlbnRcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQubmFtZSA9PSBuYW1lKSB7XG4gICAgICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSwgZXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0aW9ucy5ob2xkVGltZW91dCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX01PVkU6XG4gICAgICAgIGlmIChldi5kaXN0YW5jZSA+IG9wdGlvbnMuaG9sZFRocmVzaG9sZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfUkVMRUFTRTpcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLkhvbGQgPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaW5kZXg6IDEwLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcm9wZXJ0eSBob2xkVGltZW91dFxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCA1MDBcbiAgICAgICAgICovXG4gICAgICAgIGhvbGRUaW1lb3V0OiA1MDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1vdmVtZW50IGFsbG93ZWQgd2hpbGUgaG9sZGluZ1xuICAgICAgICAgKiBAcHJvcGVydHkgaG9sZFRocmVzaG9sZFxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAyXG4gICAgICAgICAqL1xuICAgICAgICBob2xkVGhyZXNob2xkOiAyXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogaG9sZEdlc3R1cmVcbiAgICB9O1xuICB9KSgnaG9sZCcpO1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogd2hlbiBhIHRvdWNoIGlzIGJlaW5nIHJlbGVhc2VkIGZyb20gdGhlIHBhZ2VcbiAgICpcbiAgICogQGNsYXNzIFJlbGVhc2VcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCByZWxlYXNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLlJlbGVhc2UgPSB7XG4gICAgbmFtZTogJ3JlbGVhc2UnLFxuICAgIGluZGV4OiBJbmZpbml0eSxcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiByZWxlYXNlR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgaWYgKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9SRUxFQVNFKSB7XG4gICAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUsIGV2KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB0cmlnZ2VycyBzd2lwZSBldmVudHMgd2hlbiB0aGUgZW5kIHZlbG9jaXR5IGlzIGFib3ZlIHRoZSB0aHJlc2hvbGRcbiAgICogZm9yIGJlc3QgdXNhZ2UsIHNldCBgcHJldmVudERlZmF1bHRgIChvbiB0aGUgZHJhZyBnZXN0dXJlKSB0byBgdHJ1ZWBcbiAgICogYGBgYFxuICAgKiAgR2VzdHVyZURldGVjdG9ydGltZS5vbihcImRyYWdsZWZ0IHN3aXBlbGVmdFwiLCBmdW5jdGlvbihldikge1xuICAgKiAgICBjb25zb2xlLmxvZyhldik7XG4gICAqICAgIGV2Lmdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcbiAgICogIH0pO1xuICAgKiBgYGBgXG4gICAqXG4gICAqIEBjbGFzcyBTd2lwZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZWxlZnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBlcmlnaHRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBldXBcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBlZG93blxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Td2lwZSA9IHtcbiAgICBuYW1lOiAnc3dpcGUnLFxuICAgIGluZGV4OiA0MCxcbiAgICBkZWZhdWx0czoge1xuICAgICAgLyoqXG4gICAgICAgKiBAcHJvcGVydHkgc3dpcGVNaW5Ub3VjaGVzXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICovXG4gICAgICBzd2lwZU1pblRvdWNoZXM6IDEsXG5cbiAgICAgIC8qKlxuICAgICAgICogQHByb3BlcnR5IHN3aXBlTWF4VG91Y2hlc1xuICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAqL1xuICAgICAgc3dpcGVNYXhUb3VjaGVzOiAxLFxuXG4gICAgICAvKipcbiAgICAgICAqIGhvcml6b250YWwgc3dpcGUgdmVsb2NpdHlcbiAgICAgICAqIEBwcm9wZXJ0eSBzd2lwZVZlbG9jaXR5WFxuICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAqIEBkZWZhdWx0IDAuNlxuICAgICAgICovXG4gICAgICBzd2lwZVZlbG9jaXR5WDogMC42LFxuXG4gICAgICAvKipcbiAgICAgICAqIHZlcnRpY2FsIHN3aXBlIHZlbG9jaXR5XG4gICAgICAgKiBAcHJvcGVydHkgc3dpcGVWZWxvY2l0eVlcbiAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgKiBAZGVmYXVsdCAwLjZcbiAgICAgICAqL1xuICAgICAgc3dpcGVWZWxvY2l0eVk6IDAuNlxuICAgIH0sXG5cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBzd2lwZUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2LnRvdWNoZXMubGVuZ3RoLFxuICAgICAgICAgICAgb3B0aW9ucyA9IGluc3Qub3B0aW9ucztcblxuICAgICAgICAvLyBtYXggdG91Y2hlc1xuICAgICAgICBpZiAodG91Y2hlcyA8IG9wdGlvbnMuc3dpcGVNaW5Ub3VjaGVzIHx8XG4gICAgICAgICAgdG91Y2hlcyA+IG9wdGlvbnMuc3dpcGVNYXhUb3VjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgZGlzdGFuY2Ugd2UgbW92ZWQgaXMgdG9vIHNtYWxsIHdlIHNraXAgdGhpcyBnZXN0dXJlXG4gICAgICAgIC8vIG9yIHdlIGNhbiBiZSBhbHJlYWR5IGluIGRyYWdnaW5nXG4gICAgICAgIGlmIChldi52ZWxvY2l0eVggPiBvcHRpb25zLnN3aXBlVmVsb2NpdHlYIHx8XG4gICAgICAgICAgZXYudmVsb2NpdHlZID4gb3B0aW9ucy5zd2lwZVZlbG9jaXR5WSkge1xuICAgICAgICAgIC8vIHRyaWdnZXIgc3dpcGUgZXZlbnRzXG4gICAgICAgICAgaW5zdC50cmlnZ2VyKHRoaXMubmFtZSwgZXYpO1xuICAgICAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUgKyBldi5kaXJlY3Rpb24sIGV2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIFNpbmdsZSB0YXAgYW5kIGEgZG91YmxlIHRhcCBvbiBhIHBsYWNlXG4gICAqXG4gICAqIEBjbGFzcyBUYXBcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0YXBcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IGRvdWJsZXRhcFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqL1xuICAoZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBoYXNNb3ZlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdGFwR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnMsXG4gICAgICAgICAgY3VycmVudCA9IERldGVjdGlvbi5jdXJyZW50LFxuICAgICAgICAgIHByZXYgPSBEZXRlY3Rpb24ucHJldmlvdXMsXG4gICAgICAgICAgc2luY2VQcmV2LFxuICAgICAgICAgIGRpZERvdWJsZVRhcDtcblxuICAgICAgc3dpdGNoIChldi5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgRVZFTlRfU1RBUlQ6XG4gICAgICAgIGhhc01vdmVkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX01PVkU6XG4gICAgICAgIGhhc01vdmVkID0gaGFzTW92ZWQgfHwgKGV2LmRpc3RhbmNlID4gb3B0aW9ucy50YXBNYXhEaXN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX0VORDpcbiAgICAgICAgaWYgKCFVdGlscy5pblN0cihldi5zcmNFdmVudC50eXBlLCAnY2FuY2VsJykgJiYgZXYuZGVsdGFUaW1lIDwgb3B0aW9ucy50YXBNYXhUaW1lICYmICFoYXNNb3ZlZCkge1xuICAgICAgICAgIC8vIHByZXZpb3VzIGdlc3R1cmUsIGZvciB0aGUgZG91YmxlIHRhcCBzaW5jZSB0aGVzZSBhcmUgdHdvIGRpZmZlcmVudCBnZXN0dXJlIGRldGVjdGlvbnNcbiAgICAgICAgICBzaW5jZVByZXYgPSBwcmV2ICYmIHByZXYubGFzdEV2ZW50ICYmIGV2LnRpbWVTdGFtcCAtIHByZXYubGFzdEV2ZW50LnRpbWVTdGFtcDtcbiAgICAgICAgICBkaWREb3VibGVUYXAgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIGNoZWNrIGlmIGRvdWJsZSB0YXBcbiAgICAgICAgICBpZiAocHJldiAmJiBwcmV2Lm5hbWUgPT0gbmFtZSAmJlxuICAgICAgICAgICAgKHNpbmNlUHJldiAmJiBzaW5jZVByZXYgPCBvcHRpb25zLmRvdWJsZVRhcEludGVydmFsKSAmJlxuICAgICAgICAgICAgZXYuZGlzdGFuY2UgPCBvcHRpb25zLmRvdWJsZVRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgICBpbnN0LnRyaWdnZXIoJ2RvdWJsZXRhcCcsIGV2KTtcbiAgICAgICAgICAgIGRpZERvdWJsZVRhcCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZG8gYSBzaW5nbGUgdGFwXG4gICAgICAgICAgaWYgKCFkaWREb3VibGVUYXAgfHwgb3B0aW9ucy50YXBBbHdheXMpIHtcbiAgICAgICAgICAgIGN1cnJlbnQubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBpbnN0LnRyaWdnZXIoY3VycmVudC5uYW1lLCBldik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5UYXAgPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaW5kZXg6IDEwMCxcbiAgICAgIGhhbmRsZXI6IHRhcEdlc3R1cmUsXG4gICAgICBkZWZhdWx0czoge1xuICAgICAgICAvKipcbiAgICAgICAgICogbWF4IHRpbWUgb2YgYSB0YXAsIHRoaXMgaXMgZm9yIHRoZSBzbG93IHRhcHBlcnNcbiAgICAgICAgICogQHByb3BlcnR5IHRhcE1heFRpbWVcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMjUwXG4gICAgICAgICAqL1xuICAgICAgICB0YXBNYXhUaW1lOiAyNTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCBkaXN0YW5jZSBvZiBtb3ZlbWVudCBvZiBhIHRhcCwgdGhpcyBpcyBmb3IgdGhlIHNsb3cgdGFwcGVyc1xuICAgICAgICAgKiBAcHJvcGVydHkgdGFwTWF4RGlzdGFuY2VcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAgICovXG4gICAgICAgIHRhcE1heERpc3RhbmNlOiAxMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYWx3YXlzIHRyaWdnZXIgdGhlIGB0YXBgIGV2ZW50LCBldmVuIHdoaWxlIGRvdWJsZS10YXBwaW5nXG4gICAgICAgICAqIEBwcm9wZXJ0eSB0YXBBbHdheXNcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHRhcEFsd2F5czogdHJ1ZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogbWF4IGRpc3RhbmNlIGJldHdlZW4gdHdvIHRhcHNcbiAgICAgICAgICogQHByb3BlcnR5IGRvdWJsZVRhcERpc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgICAqL1xuICAgICAgICBkb3VibGVUYXBEaXN0YW5jZTogMjAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCB0aW1lIGJldHdlZW4gdHdvIHRhcHNcbiAgICAgICAgICogQHByb3BlcnR5IGRvdWJsZVRhcEludGVydmFsXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDMwMFxuICAgICAgICAgKi9cbiAgICAgICAgZG91YmxlVGFwSW50ZXJ2YWw6IDMwMFxuICAgICAgfVxuICAgIH07XG4gIH0pKCd0YXAnKTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIHdoZW4gYSB0b3VjaCBpcyBiZWluZyB0b3VjaGVkIGF0IHRoZSBwYWdlXG4gICAqXG4gICAqIEBjbGFzcyBUb3VjaFxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHRvdWNoXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLlRvdWNoID0ge1xuICAgIG5hbWU6ICd0b3VjaCcsXG4gICAgaW5kZXg6IC1JbmZpbml0eSxcbiAgICBkZWZhdWx0czoge1xuICAgICAgLyoqXG4gICAgICAgKiBjYWxsIHByZXZlbnREZWZhdWx0IGF0IHRvdWNoc3RhcnQsIGFuZCBtYWtlcyB0aGUgZWxlbWVudCBibG9ja2luZyBieSBkaXNhYmxpbmcgdGhlIHNjcm9sbGluZyBvZiB0aGUgcGFnZSxcbiAgICAgICAqIGJ1dCBpdCBpbXByb3ZlcyBnZXN0dXJlcyBsaWtlIHRyYW5zZm9ybWluZyBhbmQgZHJhZ2dpbmcuXG4gICAgICAgKiBiZSBjYXJlZnVsIHdpdGggdXNpbmcgdGhpcywgaXQgY2FuIGJlIHZlcnkgYW5ub3lpbmcgZm9yIHVzZXJzIHRvIGJlIHN0dWNrIG9uIHRoZSBwYWdlXG4gICAgICAgKiBAcHJvcGVydHkgcHJldmVudERlZmF1bHRcbiAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcHJldmVudERlZmF1bHQ6IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIGRpc2FibGUgbW91c2UgZXZlbnRzLCBzbyBvbmx5IHRvdWNoIChvciBwZW4hKSBpbnB1dCB0cmlnZ2VycyBldmVudHNcbiAgICAgICAqIEBwcm9wZXJ0eSBwcmV2ZW50TW91c2VcbiAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcHJldmVudE1vdXNlOiBmYWxzZVxuICAgIH0sXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gdG91Y2hHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBpZiAoaW5zdC5vcHRpb25zLnByZXZlbnRNb3VzZSAmJiBldi5wb2ludGVyVHlwZSA9PSBQT0lOVEVSX01PVVNFKSB7XG4gICAgICAgIGV2LnN0b3BEZXRlY3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdC5vcHRpb25zLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0gpIHtcbiAgICAgICAgaW5zdC50cmlnZ2VyKCd0b3VjaCcsIGV2KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiBVc2VyIHdhbnQgdG8gc2NhbGUgb3Igcm90YXRlIHdpdGggMiBmaW5nZXJzXG4gICAqIFByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvciBpcyBhIGdvb2Qgd2F5IHRvIGltcHJvdmUgZmVlbCBhbmQgd29ya2luZy4gVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZVxuICAgKiBgcHJldmVudERlZmF1bHRgIG9wdGlvbi5cbiAgICpcbiAgICogQGNsYXNzIFRyYW5zZm9ybVxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHRyYW5zZm9ybVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgdHJhbnNmb3Jtc3RhcnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHRyYW5zZm9ybWVuZFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgcGluY2hpblxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgcGluY2hvdXRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHJvdGF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqL1xuICAoZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciB0cmlnZ2VyZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIHN3aXRjaCAoZXYuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfTU9WRTpcbiAgICAgICAgLy8gYXQgbGVhc3QgbXVsdGl0b3VjaFxuICAgICAgICBpZiAoZXYudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNjYWxlVGhyZXNob2xkID0gTWF0aC5hYnMoMSAtIGV2LnNjYWxlKTtcbiAgICAgICAgdmFyIHJvdGF0aW9uVGhyZXNob2xkID0gTWF0aC5hYnMoZXYucm90YXRpb24pO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgICAvLyBvciB3ZSBjYW4gYmUgYWxyZWFkeSBpbiBkcmFnZ2luZ1xuICAgICAgICBpZiAoc2NhbGVUaHJlc2hvbGQgPCBpbnN0Lm9wdGlvbnMudHJhbnNmb3JtTWluU2NhbGUgJiZcbiAgICAgICAgICByb3RhdGlvblRocmVzaG9sZCA8IGluc3Qub3B0aW9ucy50cmFuc2Zvcm1NaW5Sb3RhdGlvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIGFyZSB0cmFuc2Zvcm1pbmchXG4gICAgICAgIERldGVjdGlvbi5jdXJyZW50Lm5hbWUgPSBuYW1lO1xuXG4gICAgICAgIC8vIGZpcnN0IHRpbWUsIHRyaWdnZXIgZHJhZ3N0YXJ0IGV2ZW50XG4gICAgICAgIGlmICghdHJpZ2dlcmVkKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnc3RhcnQnLCBldik7XG4gICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QudHJpZ2dlcihuYW1lLCBldik7IC8vIGJhc2ljIHRyYW5zZm9ybSBldmVudFxuXG4gICAgICAgIC8vIHRyaWdnZXIgcm90YXRlIGV2ZW50XG4gICAgICAgIGlmIChyb3RhdGlvblRocmVzaG9sZCA+IGluc3Qub3B0aW9ucy50cmFuc2Zvcm1NaW5Sb3RhdGlvbikge1xuICAgICAgICAgIGluc3QudHJpZ2dlcigncm90YXRlJywgZXYpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJpZ2dlciBwaW5jaCBldmVudFxuICAgICAgICBpZiAoc2NhbGVUaHJlc2hvbGQgPiBpbnN0Lm9wdGlvbnMudHJhbnNmb3JtTWluU2NhbGUpIHtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIoJ3BpbmNoJywgZXYpO1xuICAgICAgICAgIGluc3QudHJpZ2dlcigncGluY2gnICsgKGV2LnNjYWxlIDwgMSA/ICdpbicgOiAnb3V0JyksIGV2KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9SRUxFQVNFOlxuICAgICAgICBpZiAodHJpZ2dlcmVkICYmIGV2LmNoYW5nZWRMZW5ndGggPCAyKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnZW5kJywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5UcmFuc2Zvcm0gPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaW5kZXg6IDQ1LFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1pbmltYWwgc2NhbGUgZmFjdG9yLCBubyBzY2FsZSBpcyAxLCB6b29taW4gaXMgdG8gMCBhbmQgem9vbW91dCB1bnRpbCBoaWdoZXIgdGhlbiAxXG4gICAgICAgICAqIEBwcm9wZXJ0eSB0cmFuc2Zvcm1NaW5TY2FsZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwLjAxXG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zvcm1NaW5TY2FsZTogMC4wMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogcm90YXRpb24gaW4gZGVncmVlc1xuICAgICAgICAgKiBAcHJvcGVydHkgdHJhbnNmb3JtTWluUm90YXRpb25cbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtTWluUm90YXRpb246IDFcbiAgICAgIH0sXG5cbiAgICAgIGhhbmRsZXI6IHRyYW5zZm9ybUdlc3R1cmVcbiAgICB9O1xuICB9KSgndHJhbnNmb3JtJyk7XG5cbmV4cG9ydCBkZWZhdWx0IEdlc3R1cmVEZXRlY3RvcjtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmxldCByZWFkeU1hcCwgcXVldWVNYXA7XG5cbmZ1bmN0aW9uIGlzQ29udGVudFJlYWR5KGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgc2V0Q29udGVudFJlYWR5KGVsZW1lbnQpO1xuICB9XG4gIHJldHVybiByZWFkeU1hcC5oYXMoZWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRSZWFkeShlbGVtZW50KSB7XG4gIHJlYWR5TWFwLnNldChlbGVtZW50LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2FsbGJhY2soZWxlbWVudCwgZm4pIHtcbiAgaWYgKCFxdWV1ZU1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICBxdWV1ZU1hcC5zZXQoZWxlbWVudCwgW10pO1xuICB9XG4gIHF1ZXVlTWFwLmdldChlbGVtZW50KS5wdXNoKGZuKTtcbn1cblxuZnVuY3Rpb24gY29uc3VtZVF1ZXVlKGVsZW1lbnQpIHtcbiAgY29uc3QgY2FsbGJhY2tzID0gcXVldWVNYXAuZ2V0KGVsZW1lbnQsIFtdKSB8fCBbXTtcbiAgcXVldWVNYXAuZGVsZXRlKGVsZW1lbnQpO1xuICBjYWxsYmFja3MuZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjaygpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGVudFJlYWR5KGVsZW1lbnQsIGZuID0gKCkgPT4ge30pIHtcbiAgaWYgKHJlYWR5TWFwID09PSB1bmRlZmluZWQpIHtcbiAgICByZWFkeU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgcXVldWVNYXAgPSBuZXcgV2Vha01hcCgpO1xuICB9XG5cbiAgYWRkQ2FsbGJhY2soZWxlbWVudCwgZm4pO1xuXG4gIGlmIChpc0NvbnRlbnRSZWFkeShlbGVtZW50KSkge1xuICAgIGNvbnN1bWVRdWV1ZShlbGVtZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNoYW5nZXMgPT4ge1xuICAgIHNldENvbnRlbnRSZWFkeShlbGVtZW50KTtcbiAgICBjb25zdW1lUXVldWUoZWxlbWVudCk7XG4gIH0pO1xuICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtjaGlsZExpc3Q6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWV9KTtcblxuICAvLyBmYWlsYmFjayBmb3IgZWxlbWVudHMgaGFzIGVtcHR5IGNvbnRlbnQuXG4gIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgc2V0Q29udGVudFJlYWR5KGVsZW1lbnQpO1xuICAgIGNvbnN1bWVRdWV1ZShlbGVtZW50KTtcbiAgfSk7XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5jbGFzcyBUb2FzdFF1ZXVlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICB9XG5cbiAgYWRkKGZuLCBwcm9taXNlKSB7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKGZuKTtcblxuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc2V0SW1tZWRpYXRlKHRoaXMucXVldWVbMF0pO1xuICAgIH1cblxuICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2V0VGltZW91dCh0aGlzLnF1ZXVlWzBdLCAxMDAwLzMwKTsgLy8gQXBwbHkgc29tZSB2aXN1YWwgZGVsYXlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgVG9hc3RRdWV1ZSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBUb2FzdFF1ZXVlIGZyb20gJy4vaW50ZXJuYWwvdG9hc3QtcXVldWUuanMnO1xuXG5jb25zdCBfc2V0QXR0cmlidXRlcyA9IChlbGVtZW50LCBvcHRpb25zKSA9PiB7XG4gIFsnaWQnLCAnY2xhc3MnLCAnYW5pbWF0aW9uJ11cbiAgICAuZm9yRWFjaChhID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCBhKSAmJiBlbGVtZW50LnNldEF0dHJpYnV0ZShhLCBvcHRpb25zW2FdKSk7XG5cbiAgaWYgKG9wdGlvbnMubW9kaWZpZXIpIHtcbiAgICB1dGlsLmFkZE1vZGlmaWVyKGVsZW1lbnQsIG9wdGlvbnMubW9kaWZpZXIpO1xuICB9XG59O1xuXG5jb25zdCBfbm9ybWFsaXplQXJndW1lbnRzID0gKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSwgZGVmYXVsdHMgPSB7fSkgPT4ge1xuICBvcHRpb25zID0geyAuLi5vcHRpb25zIH07XG4gIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyA/IChvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlKSA6IChvcHRpb25zID0gbWVzc2FnZSk7XG4gIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5tZXNzYWdlICYmICFvcHRpb25zLm1lc3NhZ2VIVE1MKSB7XG4gICAgdXRpbC50aHJvdygnTm90aWZpY2F0aW9ucyBtdXN0IGNvbnRhaW4gYSBtZXNzYWdlJyk7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdidXR0b25MYWJlbHMnKSB8fCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ2J1dHRvbkxhYmVsJykpIHtcbiAgICBvcHRpb25zLmJ1dHRvbkxhYmVscyA9IG9wdGlvbnMuYnV0dG9uTGFiZWxzIHx8IG9wdGlvbnMuYnV0dG9uTGFiZWw7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuYnV0dG9uTGFiZWxzKSkge1xuICAgICAgb3B0aW9ucy5idXR0b25MYWJlbHMgPSBbb3B0aW9ucy5idXR0b25MYWJlbHMgfHwgJyddO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1dGlsLmV4dGVuZCh7XG4gICAgICBjb21waWxlOiBwYXJhbSA9PiBwYXJhbSxcbiAgICAgIGNhbGxiYWNrOiBwYXJhbSA9PiBwYXJhbSxcbiAgICAgIGFuaW1hdGlvbjogJ2RlZmF1bHQnLFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICBwcmltYXJ5QnV0dG9uSW5kZXg6IChvcHRpb25zLmJ1dHRvbkxhYmVscyB8fCBkZWZhdWx0cy5idXR0b25MYWJlbHMgfHwgW10pLmxlbmd0aCAtIDFcbiAgICB9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEBvYmplY3Qgb25zLm5vdGlmaWNhdGlvblxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL25vdGlmaWNhdGlvblxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBVdGlsaXR5IG1ldGhvZHMgdG8gY3JlYXRlIGRpZmZlcmVudCBraW5kcyBvZiBub3RpZmljYXRpb25zLiBUaGVyZSBhcmUgdGhyZWUgbWV0aG9kcyBhdmFpbGFibGU6XG4gKlxuICogICAgICogYG9ucy5ub3RpZmljYXRpb24uYWxlcnQoKWBcbiAqICAgICAqIGBvbnMubm90aWZpY2F0aW9uLmNvbmZpcm0oKWBcbiAqICAgICAqIGBvbnMubm90aWZpY2F0aW9uLnByb21wdCgpYFxuICogICAgICogYG9ucy5ub3RpZmljYXRpb24udG9hc3QoKWBcbiAqXG4gKiAgICAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgYSBNYXRlcmlhbCBEZXNpZ24gZGlhbG9nIG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqICAgWy9lbl1cbiAqICAgW2phXeOBhOOBj+OBpOOBi+OBrueorumhnuOBruOCouODqeODvOODiOODgOOCpOOCouODreOCsOOCkuS9nOaIkOOBmeOCi+OBn+OCgeOBruODpuODvOODhuOCo+ODquODhuOCo+ODoeOCveODg+ODieOCkuWPjuOCgeOBn+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiBAZXhhbXBsZVxuICogb25zLm5vdGlmaWNhdGlvbi5hbGVydCgnSGVsbG8sIHdvcmxkIScpO1xuICpcbiAqIG9ucy5ub3RpZmljYXRpb24uY29uZmlybSgnQXJlIHlvdSByZWFkeT8nKVxuICogICAudGhlbihcbiAqICAgICBmdW5jdGlvbihhbnN3ZXIpIHtcbiAqICAgICAgIGlmIChhbnN3ZXIgPT09IDEpIHtcbiAqICAgICAgICAgb25zLm5vdGlmaWNhdGlvbi5hbGVydCgnTGV0XFwncyBnbyEnKTtcbiAqICAgICAgIH1cbiAqICAgICB9XG4gKiAgICk7XG4gKlxuICogb25zLm5vdGlmaWNhdGlvbi5wcm9tcHQoJ0hvdyBvbGQgYXJlID8nKVxuICogICAudGhlbihcbiAqICAgICBmdW5jdGlvbihhZ2UpIHtcbiAqICAgICAgIG9ucy5ub3RpZmljYXRpb24uYWxlcnQoJ1lvdSBhcmUgJyArIGFnZSArICcgeWVhcnMgb2xkLicpO1xuICogICAgIH1cbiAqICAgKTtcbiAqL1xuY29uc3Qgbm90aWZpY2F0aW9uID0ge307XG5cbm5vdGlmaWNhdGlvbi5fY3JlYXRlQWxlcnREaWFsb2cgPSAoLi4ucGFyYW1zKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IF9ub3JtYWxpemVBcmd1bWVudHMoLi4ucGFyYW1zKTtcbiAgdXRpbC5jaGVja01pc3NpbmdJbXBvcnQoJ0FsZXJ0RGlhbG9nJywgJ0FsZXJ0RGlhbG9nQnV0dG9uJyk7XG5cbiAgLy8gUHJvbXB0IGlucHV0IHN0cmluZ1xuICBsZXQgaW5wdXRTdHJpbmcgPSAnJztcbiAgaWYgKG9wdGlvbnMuaXNQcm9tcHQpIHtcbiAgICBpbnB1dFN0cmluZyA9IGBcbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzcz1cInRleHQtaW5wdXQgdGV4dC1pbnB1dC0tdW5kZXJiYXJcIlxuICAgICAgICB0eXBlPVwiJHtvcHRpb25zLmlucHV0VHlwZSB8fCAndGV4dCd9XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke29wdGlvbnMucGxhY2Vob2xkZXIgfHwgJyd9XCJcbiAgICAgICAgdmFsdWU9XCIke29wdGlvbnMuZGVmYXVsdFZhbHVlIHx8ICcnfVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDEwcHg7XCJcbiAgICAgIC8+XG4gICAgYDtcbiAgfVxuXG4gIC8vIEJ1dHRvbnMgc3RyaW5nXG4gIGxldCBidXR0b25zID0gJyc7XG4gIG9wdGlvbnMuYnV0dG9uTGFiZWxzLmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgIGJ1dHRvbnMgKz0gYFxuICAgICAgPG9ucy1hbGVydC1kaWFsb2ctYnV0dG9uXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgJHtpbmRleCA9PT0gb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXggPyAnIGFsZXJ0LWRpYWxvZy1idXR0b24tLXByaW1hbCcgOiAnJ31cbiAgICAgICAgICAke29wdGlvbnMuYnV0dG9uTGFiZWxzLmxlbmd0aCA8PSAyID8gJyBhbGVydC1kaWFsb2ctYnV0dG9uLS1yb3dmb290ZXInIDogJyd9XG4gICAgICAgIFwiXG4gICAgICAgIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPlxuICAgICAgICAke2xhYmVsfVxuICAgICAgPC9vbnMtYWxlcnQtZGlhbG9nLWJ1dHRvbj5cbiAgICBgO1xuICB9KTtcblxuICAvLyBEaWFsb2cgRWxlbWVudFxuICBsZXQgZWwgPSB7fTtcbiAgY29uc3QgX2Rlc3Ryb3lEaWFsb2cgPSAoKSA9PiB7XG4gICAgaWYgKGVsLmRpYWxvZy5vbkRpYWxvZ0NhbmNlbCkge1xuICAgICAgZWwuZGlhbG9nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RpYWxvZ2NhbmNlbCcsIGVsLmRpYWxvZy5vbkRpYWxvZ0NhbmNlbCk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoZWwpLmZvckVhY2goa2V5ID0+IGRlbGV0ZSBlbFtrZXldKTtcbiAgICBlbCA9IG51bGw7XG5cbiAgICBpZiAob3B0aW9ucy5kZXN0cm95IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIG9wdGlvbnMuZGVzdHJveSgpO1xuICAgIH1cbiAgfTtcblxuICBlbC5kaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbnMtYWxlcnQtZGlhbG9nJyk7XG4gIGVsLmRpYWxvZy5pbm5lckhUTUwgPSBgXG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy1tYXNrXCJcbiAgICAgIHN0eWxlPVwiXG4gICAgICAgICR7b3B0aW9ucy5tYXNrQ29sb3IgPyAnYmFja2dyb3VuZC1jb2xvcjogJyArIG9wdGlvbnMubWFza0NvbG9yIDogJyd9XG4gICAgICBcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgICAgJHtvcHRpb25zLnRpdGxlIHx8ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy1jb250ZW50XCI+XG4gICAgICAgICAgJHtvcHRpb25zLm1lc3NhZ2UgfHwgb3B0aW9ucy5tZXNzYWdlSFRNTH1cbiAgICAgICAgICAke2lucHV0U3RyaW5nfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIlxuICAgICAgICAgIGFsZXJ0LWRpYWxvZy1mb290ZXJcbiAgICAgICAgICAke29wdGlvbnMuYnV0dG9uTGFiZWxzLmxlbmd0aCA8PSAyID8gJyBhbGVydC1kaWFsb2ctZm9vdGVyLS1yb3dmb290ZXInIDogJyd9XG4gICAgICAgIFwiPlxuICAgICAgICAgICR7YnV0dG9uc31cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgY29udGVudFJlYWR5KGVsLmRpYWxvZyk7XG5cbiAgLy8gU2V0IGF0dHJpYnV0ZXNcbiAgX3NldEF0dHJpYnV0ZXMoZWwuZGlhbG9nLCBvcHRpb25zKTtcblxuICAvLyBQcm9tcHQgZXZlbnRzXG4gIGlmIChvcHRpb25zLmlzUHJvbXB0KSB7XG4gICAgZWwuaW5wdXQgPSBlbC5kaWFsb2cucXVlcnlTZWxlY3RvcignLnRleHQtaW5wdXQnKTtcblxuICAgIGlmIChvcHRpb25zLnN1Ym1pdE9uRW50ZXIpIHtcbiAgICAgIGVsLmlucHV0Lm9ua2V5cHJlc3MgPSBldmVudCA9PiB7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgIGVsLmRpYWxvZy5oaWRlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVZhbHVlID0gZWwuaW5wdXQudmFsdWU7XG4gICAgICAgICAgICAgICAgX2Rlc3Ryb3lEaWFsb2coKTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKHJlc29sdmVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlVmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBCdXR0b24gZXZlbnRzXG4gIGVsLmZvb3RlciA9IGVsLmRpYWxvZy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtZGlhbG9nLWZvb3RlcicpO1xuICB1dGlsLmFycmF5RnJvbShlbC5kaWFsb2cucXVlcnlTZWxlY3RvckFsbCgnLmFsZXJ0LWRpYWxvZy1idXR0b24nKSkuZm9yRWFjaCgoYnV0dG9uRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICBidXR0b25FbGVtZW50Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGVsLmRpYWxvZy5oaWRlKClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgbGV0IHJlc29sdmVWYWx1ZSA9IGluZGV4O1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc1Byb21wdCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmVWYWx1ZSA9IGluZGV4ID09PSBvcHRpb25zLnByaW1hcnlCdXR0b25JbmRleCA/IGVsLmlucHV0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbC5kaWFsb2cucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIF9kZXN0cm95RGlhbG9nKCk7XG4gICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2socmVzb2x2ZVZhbHVlKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBlbC5mb290ZXIuYXBwZW5kQ2hpbGQoYnV0dG9uRWxlbWVudCk7XG4gIH0pO1xuXG4gIC8vIENhbmNlbCBldmVudHNcbiAgaWYgKG9wdGlvbnMuY2FuY2VsYWJsZSkge1xuICAgIGVsLmRpYWxvZy5jYW5jZWxhYmxlID0gdHJ1ZTtcbiAgICBlbC5kaWFsb2cub25EaWFsb2dDYW5jZWwgPSAoKSA9PiB7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICBlbC5kaWFsb2cucmVtb3ZlKCk7XG4gICAgICAgIF9kZXN0cm95RGlhbG9nKCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc29sdmVWYWx1ZSA9IG9wdGlvbnMuaXNQcm9tcHQgPyBudWxsIDogLTE7XG4gICAgICBvcHRpb25zLmNhbGxiYWNrKHJlc29sdmVWYWx1ZSk7XG4gICAgICByZXNvbHZlKHJlc29sdmVWYWx1ZSk7XG4gICAgfTtcbiAgICBlbC5kaWFsb2cuYWRkRXZlbnRMaXN0ZW5lcignZGlhbG9nY2FuY2VsJywgZWwuZGlhbG9nLm9uRGlhbG9nQ2FuY2VsLCBmYWxzZSk7XG4gIH1cblxuICAvLyBTaG93IGRpYWxvZ1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsLmRpYWxvZyk7XG4gIG9wdGlvbnMuY29tcGlsZShlbC5kaWFsb2cpO1xuICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgIGVsLmRpYWxvZy5zaG93KClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKGVsLmlucHV0ICYmIG9wdGlvbnMuaXNQcm9tcHQgJiYgb3B0aW9ucy5hdXRvZm9jdXMpIHtcbiAgICAgICAgICBjb25zdCBzdHJMZW5ndGggPSBlbC5pbnB1dC52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgZWwuaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICBpZiAoZWwuaW5wdXQudHlwZSAmJlxuICAgICAgICAgICAgWyd0ZXh0JywgJ3NlYXJjaCcsICd1cmwnLCAndGVsJywgJ3Bhc3N3b3JkJ10uaW5jbHVkZXMoZWwuaW5wdXQudHlwZSkpIHtcbiAgICAgICAgICAgIGVsLmlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0ckxlbmd0aCwgc3RyTGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIEBtZXRob2QgYWxlcnRcbiAqIEBzaWduYXR1cmUgYWxlcnQobWVzc2FnZSBbLCBvcHRpb25zXSB8IG9wdGlvbnMpXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogICBbZW5dV2lsbCByZXNvbHZlIHRvIHRoZSBpbmRleCBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHByZXNzZWQgb3IgYC0xYCB3aGVuIGNhbmNlbGVkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAqICAgW2VuXU5vdGlmaWNhdGlvbiBtZXNzYWdlLiBUaGlzIGFyZ3VtZW50IGlzIG9wdGlvbmFsIGJ1dCBpZiBpdCdzIG5vdCBkZWZpbmVkIGVpdGhlciBgb3B0aW9ucy5tZXNzYWdlYCBvciBgb3B0aW9ucy5tZXNzYWdlSFRNTGAgbXVzdCBiZSBkZWZpbmVkIGluc3RlYWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlXVxuICogICBbZW5dTm90aWZpY2F0aW9uIG1lc3NhZ2UuWy9lbl1cbiAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBq+ihqOekuuOBmeOCi+aWh+Wtl+WIl+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZUhUTUxdXG4gKiAgIFtlbl1Ob3RpZmljYXRpb24gbWVzc2FnZSBpbiBIVE1MLlsvZW5dXG4gKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgavooajnpLrjgZnjgotIVE1M44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nIHwgQXJyYXl9IFtvcHRpb25zLmJ1dHRvbkxhYmVsc11cbiAqICAgW2VuXUxhYmVscyBmb3IgdGhlIGJ1dHRvbnMuIERlZmF1bHQgaXMgYFwiT0tcImAuWy9lbl1cbiAqICAgW2phXeeiuuiqjeODnOOCv+ODs+OBruODqeODmeODq+OCkuaMh+WumuOBl+OBvuOBmeOAglwiT0tcIuOBjOODh+ODleOCqeODq+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucHJpbWFyeUJ1dHRvbkluZGV4XVxuICogICBbZW5dSW5kZXggb2YgcHJpbWFyeSBidXR0b24uIERlZmF1bHQgaXMgdGhlIGxhc3Qgb25lLlsvZW5dXG4gKiAgIFtqYV3jg5fjg6njgqTjg57jg6rjg5zjgr/jg7Pjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga8gMCDjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jYW5jZWxhYmxlXVxuICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgb3Igbm90LiBEZWZhdWx0IGlzIGBmYWxzZWAuIElmIHRoZSBkaWFsb2cgaXMgY2FuY2VsYWJsZSBpdCBjYW4gYmUgY2xvc2VkIGJ5IGNsaWNraW5nIHRoZSBiYWNrZ3JvdW5kIG9yIHByZXNzaW5nIHRoZSBBbmRyb2lkIGJhY2sgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzjgq3jg6Pjg7Pjgrvjg6vlj6/og73jgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYG5vbmVgIGFuZCBgZmFkZWAuIERlZmF1bHQgaXMgYGZhZGVgLlsvZW5dXG4gKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgpLooajnpLrjgZnjgovpmpvjga7jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJmYWRlXCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmlkXVxuICogICBbZW5dVGhlIGA8b25zLWFsZXJ0LWRpYWxvZz5gIGVsZW1lbnQncyBJRC5bL2VuXVxuICogICBbamFdb25zLWFsZXJ0LWRpYWxvZ+imgee0oOOBrklE44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jbGFzc11cbiAqICAgW2VuXVRoZSBgPG9ucy1hbGVydC1kaWFsb2c+YCBlbGVtZW50J3MgY2xhc3MuWy9lbl1cbiAqICAgW2phXW9ucy1hbGVydC1kaWFsb2fopoHntKDjga5jbGFzc+OAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGl0bGVdXG4gKiAgIFtlbl1EaWFsb2cgdGl0bGUuIERlZmF1bHQgaXMgYFwiQWxlcnRcImAuWy9lbl1cbiAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBruS4iumDqOOBq+ihqOekuuOBmeOCi+OCv+OCpOODiOODq+OCkuaMh+WumuOBl+OBvuOBmeOAglwiQWxlcnRcIuOBjOODh+ODleOCqeODq+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gKiAgIFtlbl1Nb2RpZmllciBmb3IgdGhlIGRpYWxvZy5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GubW9kaWZpZXLlsZ7mgKfjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1hc2tDb2xvcl1cbiAqICAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgXCJyZ2JhKDAsIDAsIDAsIDAuMilcIiAoXCJyZ2JhKDAsIDAsIDAsIDAuMylcIiBmb3IgTWF0ZXJpYWwpLlsvZW5dXG4gKiAgIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICogICBbZW5dRnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhZnRlciBkaWFsb2cgaGFzIGJlZW4gY2xvc2VkLlsvZW5dXG4gKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgYzplonjgZjjgonjgozjgZ/mmYLjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBEaXNwbGF5IGFuIGFsZXJ0IGRpYWxvZyB0byBzaG93IHRoZSB1c2VyIGEgbWVzc2FnZS5cbiAqXG4gKiAgICAgVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgY2FuIGJlIGVpdGhlciBzaW1wbGUgdGV4dCBvciBIVE1MLlxuICpcbiAqICAgICBJdCBjYW4gYmUgY2FsbGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqXG4gKiAgICAgYGBgXG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5hbGVydChtZXNzYWdlLCBvcHRpb25zKTtcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLmFsZXJ0KG9wdGlvbnMpO1xuICogICAgIGBgYFxuICpcbiAqICAgICBNdXN0IHNwZWNpZnkgZWl0aGVyIGBtZXNzYWdlYCBvciBgbWVzc2FnZUhUTUxgLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg44Om44O844K244O844G444Oh44OD44K744O844K444KS6KaL44Gb44KL44Gf44KB44Gu44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GX44G+44GZ44CCXG4gKiAgICAg6KGo56S644GZ44KL44Oh44OD44K744O844K444Gv44CB44OG44Kt44K544OI44GL44KC44GX44GP44GvSFRNTOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglxuICogICAgIOOBk+OBruODoeOCveODg+ODieOBruW8leaVsOOBq+OBr+OAgW9wdGlvbnMubWVzc2FnZeOCguOBl+OBj+OBr29wdGlvbnMubWVzc2FnZUhUTUzjga7jganjgaHjgonjgYvjgpLlv4XjgZrmjIflrprjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIJcbiAqICAgWy9qYV1cbiAqL1xubm90aWZpY2F0aW9uLmFsZXJ0ID0gKG1lc3NhZ2UsIG9wdGlvbnMpID0+XG4gIG5vdGlmaWNhdGlvbi5fY3JlYXRlQWxlcnREaWFsb2cobWVzc2FnZSwgb3B0aW9ucywge1xuICAgIGJ1dHRvbkxhYmVsczogWydPSyddLFxuICAgIHRpdGxlOiAnQWxlcnQnXG4gIH0pO1xuXG4vKipcbiAqIEBtZXRob2QgY29uZmlybVxuICogQHNpZ25hdHVyZSBjb25maXJtKG1lc3NhZ2UgWywgb3B0aW9uc10gfCBvcHRpb25zKVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVdpbGwgcmVzb2x2ZSB0byB0aGUgaW5kZXggb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIG9yIGAtMWAgd2hlbiBjYW5jZWxlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiAgIFtlbl1Ob3RpZmljYXRpb24gbWVzc2FnZS4gVGhpcyBhcmd1bWVudCBpcyBvcHRpb25hbCBidXQgaWYgaXQncyBub3QgZGVmaW5lZCBlaXRoZXIgYG9wdGlvbnMubWVzc2FnZWAgb3IgYG9wdGlvbnMubWVzc2FnZUhUTUxgIG11c3QgYmUgZGVmaW5lZCBpbnN0ZWFkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLmJ1dHRvbkxhYmVsc11cbiAqICAgW2VuXUxhYmVscyBmb3IgdGhlIGJ1dHRvbnMuIERlZmF1bHQgaXMgYFtcIkNhbmNlbFwiLCBcIk9LXCJdYC5bL2VuXVxuICogICBbamFd44Oc44K/44Oz44Gu44Op44OZ44Or44Gu6YWN5YiX44KS5oyH5a6a44GX44G+44GZ44CCW1wiQ2FuY2VsXCIsIFwiT0tcIl3jgYzjg4fjg5Xjgqnjg6vjg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByaW1hcnlCdXR0b25JbmRleF1cbiAqICAgW2VuXUluZGV4IG9mIHByaW1hcnkgYnV0dG9uLiBEZWZhdWx0IGlzIHRoZSBsYXN0IG9uZS5bL2VuXVxuICogICBbamFd44OX44Op44Kk44Oe44Oq44Oc44K/44Oz44Gu44Kk44Oz44OH44OD44Kv44K544KS5oyH5a6a44GX44G+44GZ44CC44OH44OV44Kp44Or44OI44GvIDEg44Gn44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRGlzcGxheSBhIGRpYWxvZyB0byBhc2sgdGhlIHVzZXIgZm9yIGNvbmZpcm1hdGlvbi4gRXh0ZW5kcyBgYWxlcnQoKWAgcGFyYW1ldGVycy5cbiAqICAgICBUaGUgZGVmYXVsdCBidXR0b24gbGFiZWxzIGFyZSBgXCJDYW5jZWxcImAgYW5kIGBcIk9LXCJgIGJ1dCB0aGV5IGNhbiBiZSBjdXN0b21pemVkLlxuICpcbiAqICAgICBJdCBjYW4gYmUgY2FsbGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqXG4gKiAgICAgYGBgXG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5jb25maXJtKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICogICAgIG9ucy5ub3RpZmljYXRpb24uY29uZmlybShvcHRpb25zKTtcbiAqICAgICBgYGBcbiAqXG4gKiAgICAgTXVzdCBzcGVjaWZ5IGVpdGhlciBgbWVzc2FnZWAgb3IgYG1lc3NhZ2VIVE1MYC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVxuICogICAgIOODpuODvOOCtuOBq+eiuuiqjeOCkuS/g+OBmeODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglxuICogICAgIOODh+OCquODq+OBqOOBruODnOOCv+ODs+ODqeODmeODq+OBr+OAgVwiQ2FuY2VsXCLjgahcIk9LXCLjgafjgZnjgYzjgIHjgZPjgozjga/jgZPjga7jg6Hjgr3jg4Pjg4njga7lvJXmlbDjgafjgqvjgrnjgr/jg57jgqTjgrrjgafjgY3jgb7jgZnjgIJcbiAqICAgICDjgZPjga7jg6Hjgr3jg4Pjg4njga7lvJXmlbDjgavjga/jgIFvcHRpb25zLm1lc3NhZ2XjgoLjgZfjgY/jga9vcHRpb25zLm1lc3NhZ2VIVE1M44Gu44Gp44Gh44KJ44GL44KS5b+F44Ga5oyH5a6a44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKi9cbm5vdGlmaWNhdGlvbi5jb25maXJtID0gKG1lc3NhZ2UsIG9wdGlvbnMpID0+XG4gIG5vdGlmaWNhdGlvbi5fY3JlYXRlQWxlcnREaWFsb2cobWVzc2FnZSwgb3B0aW9ucywge1xuICAgIGJ1dHRvbkxhYmVsczogWydDYW5jZWwnLCAnT0snXSxcbiAgICB0aXRsZTogJ0NvbmZpcm0nXG4gIH0pO1xuXG4vKipcbiAqIEBtZXRob2QgcHJvbXB0XG4gKiBAc2lnbmF0dXJlIHByb21wdChtZXNzYWdlIFssIG9wdGlvbnNdIHwgb3B0aW9ucylcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiAgIFtlbl1Ob3RpZmljYXRpb24gbWVzc2FnZS4gVGhpcyBhcmd1bWVudCBpcyBvcHRpb25hbCBidXQgaWYgaXQncyBub3QgZGVmaW5lZCBlaXRoZXIgYG9wdGlvbnMubWVzc2FnZWAgb3IgYG9wdGlvbnMubWVzc2FnZUhUTUxgIG11c3QgYmUgZGVmaW5lZCBpbnN0ZWFkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVdpbGwgcmVzb2x2ZSB0byB0aGUgaW5wdXQgdmFsdWUgd2hlbiB0aGUgZGlhbG9nIGlzIGNsb3NlZCBvciBgbnVsbGAgd2hlbiBjYW5jZWxlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmcgfCBBcnJheX0gW29wdGlvbnMuYnV0dG9uTGFiZWxzXVxuICogICBbZW5dTGFiZWxzIGZvciB0aGUgYnV0dG9ucy4gRGVmYXVsdCBpcyBgXCJPS1wiYC5bL2VuXVxuICogICBbamFd56K66KqN44Oc44K/44Oz44Gu44Op44OZ44Or44KS5oyH5a6a44GX44G+44GZ44CCXCJPS1wi44GM44OH44OV44Kp44Or44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXhdXG4gKiAgIFtlbl1JbmRleCBvZiBwcmltYXJ5IGJ1dHRvbi4gRGVmYXVsdCBpcyB0aGUgbGFzdCBvbmUuWy9lbl1cbiAqICAgW2phXeODl+ODqeOCpOODnuODquODnOOCv+ODs+OBruOCpOODs+ODh+ODg+OCr+OCueOCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBryAwIOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucGxhY2Vob2xkZXJdXG4gKiAgIFtlbl1QbGFjZWhvbGRlciBmb3IgdGhlIHRleHQgaW5wdXQuWy9lbl1cbiAqICAgW2phXeODhuOCreOCueODiOashOOBruODl+ODrOODvOOCueODm+ODq+ODgOOBq+ihqOekuuOBmeOCi+ODhuOCreOCueODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZGVmYXVsdFZhbHVlXVxuICogICBbZW5dRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRleHQgaW5wdXQuWy9lbl1cbiAqICAgW2phXeODhuOCreOCueODiOashOOBruODh+ODleOCqeODq+ODiOOBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaW5wdXRUeXBlXVxuICogICBbZW5dVHlwZSBvZiB0aGUgaW5wdXQgZWxlbWVudCAoYHBhc3N3b3JkYCwgYGRhdGVgLi4uKS4gRGVmYXVsdCBpcyBgdGV4dGAuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9mb2N1c11cbiAqICAgW2VuXUF1dG9mb2N1cyB0aGUgaW5wdXQgZWxlbWVudC4gRGVmYXVsdCBpcyBgdHJ1ZWAuIEluIENvcmRvdmEsIGBLZXlib2FyZERpc3BsYXlSZXF1aXJlc1VzZXJBY3Rpb25gIGluIGBjb25maWcueG1sYCBtdXN0IGJlIGBmYWxzZWAgdG8gYWN0aXZhdGUgdGhpcyBmZWF0dXJlLlsvZW5dXG4gKiAgIFtqYV1pbnB1dOimgee0oOOBq+iHquWLleeahOOBq+ODleOCqeODvOOCq+OCueOBmeOCi+OBi+OBqeOBhuOBi+OCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBr3RydWXjgafjgZnjgIJDb3Jkb3Zh55Kw5aKD44Gn44Gv44CB44GT44Gu5qmf6IO944KS5pyJ5Yq544Gr44GZ44KL44Gf44KB44Gr44GvIGBjb25maWcueG1sYCDjgacgYEtleWJvYXJkRGlzcGxheVJlcXVpcmVzVXNlckFjdGlvbmAg44KSIGBmYWxzZWAg44Gr6Kit5a6a44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3VibWl0T25FbnRlcl1cbiAqICAgW2VuXVN1Ym1pdCBhdXRvbWF0aWNhbGx5IHdoZW4gZW50ZXIgaXMgcHJlc3NlZC4gRGVmYXVsdCBpcyBgdHJ1ZWAuWy9lbl1cbiAqICAgW2phXUVudGVy44GM5oq844GV44KM44Gf6Zqb44Gr44Gd44GuZm9ybeOCknN1Ym1pdOOBmeOCi+OBi+OBqeOBhuOBi+OCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBr3RydWXjgafjgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBEaXNwbGF5IGEgZGlhbG9nIHdpdGggYSBwcm9tcHQgdG8gYXNrIHRoZSB1c2VyIGEgcXVlc3Rpb24uIEV4dGVuZHMgYGFsZXJ0KClgIHBhcmFtZXRlcnMuXG4gKlxuICogICAgIEl0IGNhbiBiZSBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICpcbiAqICAgICBgYGBcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLnByb21wdChtZXNzYWdlLCBvcHRpb25zKTtcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLnByb21wdChvcHRpb25zKTtcbiAqICAgICBgYGBcbiAqXG4gKiAgICAgTXVzdCBzcGVjaWZ5IGVpdGhlciBgbWVzc2FnZWAgb3IgYG1lc3NhZ2VIVE1MYC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVxuICogICAgIOODpuODvOOCtuODvOOBq+WFpeWKm+OCkuS/g+OBmeODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglxuICogICAgIOOBk+OBruODoeOCveODg+ODieOBruW8leaVsOOBq+OBr+OAgW9wdGlvbnMubWVzc2FnZeOCguOBl+OBj+OBr29wdGlvbnMubWVzc2FnZUhUTUzjga7jganjgaHjgonjgYvjgpLlv4XjgZrmjIflrprjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIJcbiAqICAgWy9qYV1cbiAqL1xubm90aWZpY2F0aW9uLnByb21wdCA9IChtZXNzYWdlLCBvcHRpb25zKSA9PlxuICBub3RpZmljYXRpb24uX2NyZWF0ZUFsZXJ0RGlhbG9nKG1lc3NhZ2UsIG9wdGlvbnMsIHtcbiAgICBidXR0b25MYWJlbHM6IFsnT0snXSxcbiAgICB0aXRsZTogJ0FsZXJ0JyxcbiAgICBpc1Byb21wdDogdHJ1ZSxcbiAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgc3VibWl0T25FbnRlcjogdHJ1ZVxuICB9KTtcblxuLyoqXG4gKiBAbWV0aG9kIHRvYXN0XG4gKiBAc2lnbmF0dXJlIHRvYXN0KG1lc3NhZ2UgWywgb3B0aW9uc10gfCBvcHRpb25zKVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVdpbGwgcmVzb2x2ZSB3aGVuIHRoZSB0b2FzdCBpcyBoaWRkZW4uWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogICBbZW5dVG9hc3QgbWVzc2FnZS4gVGhpcyBhcmd1bWVudCBpcyBvcHRpb25hbCBidXQgaWYgaXQncyBub3QgZGVmaW5lZCB0aGVuIGBvcHRpb25zLm1lc3NhZ2VgIG11c3QgYmUgZGVmaW5lZCBpbnN0ZWFkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZV1cbiAqICAgW2VuXU5vdGlmaWNhdGlvbiBtZXNzYWdlLlsvZW5dXG4gKiAgIFtqYV3jg4jjg7zjgrnjg4jjgavooajnpLrjgZnjgovmloflrZfliJfjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJ1dHRvbkxhYmVsXVxuICogICBbZW5dTGFiZWwgZm9yIHRoZSBidXR0b24uWy9lbl1cbiAqICAgW2phXeeiuuiqjeODnOOCv+ODs+OBruODqeODmeODq+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgbm9uZWAsIGBmYWRlYCwgYGFzY2VuZGAsIGBsaWZ0YCBhbmQgYGZhbGxgLiBEZWZhdWx0IGlzIGBhc2NlbmRgIGZvciBBbmRyb2lkIGFuZCBgbGlmdGAgZm9yIGlPUy5bL2VuXVxuICogICBbamFd44OI44O844K544OI44KS6KGo56S644GZ44KL6Zqb44Gu44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwiZmFkZVwiLCBcImFzY2VuZFwiLCBcImxpZnRcIiwgXCJmYWxsXCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRpbWVvdXRdXG4gKiAgIFtlbl1OdW1iZXIgb2YgbWlsaXNlY29uZHMgd2hlcmUgdGhlIHRvYXN0IGlzIHZpc2libGUgYmVmb3JlIGhpZGluZyBhdXRvbWF0aWNhbGx5LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mb3JjZV1cbiAqICAgW2VuXUlmIGB0cnVlYCwgdGhlIHRvYXN0IHNraXBzIHRoZSBub3RpZmljYXRpb24gcXVldWUgYW5kIGlzIHNob3duIGltbWVkaWF0ZWx5LiBEZWZhdWx0cyB0byBgZmFsc2VgLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmlkXVxuICogICBbZW5dVGhlIGA8b25zLXRvYXN0PmAgZWxlbWVudCdzIElELlsvZW5dXG4gKiAgIFtqYV1vbnMtdG9hc3TopoHntKDjga5JROOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2xhc3NdXG4gKiAgIFtlbl1UaGUgYDxvbnMtdG9hc3Q+YCBlbGVtZW50J3MgY2xhc3MuWy9lbl1cbiAqICAgW2phXW9ucy10b2FzdOimgee0oOOBrmNsYXNz44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tb2RpZmllcl1cbiAqICAgW2VuXU1vZGlmaWVyIGZvciB0aGUgZWxlbWVudC5bL2VuXVxuICogICBbamFd44OI44O844K544OI44GubW9kaWZpZXLlsZ7mgKfjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gKiAgIFtlbl1GdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIGFmdGVyIHRvYXN0IGhhcyBiZWVuIGhpZGRlbi5bL2VuXVxuICogICBbamFd44OI44O844K544OI44GM6ZaJ44GY44KJ44KM44Gf5pmC44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRGlzcGxheSBhIHNpbXBsZSBub3RpZmljYXRpb24gdG9hc3Qgd2l0aCBhbiBvcHRpb25hbCBidXR0b24gdGhhdCBjYW4gYmUgdXNlZCBmb3Igc2ltcGxlIGFjdGlvbnMuXG4gKlxuICogICAgIEl0IGNhbiBiZSBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICpcbiAqICAgICBgYGBcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLnRvYXN0KG1lc3NhZ2UsIG9wdGlvbnMpO1xuICogICAgIG9ucy5ub3RpZmljYXRpb24udG9hc3Qob3B0aW9ucyk7XG4gKiAgICAgYGBgXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5ub3RpZmljYXRpb24udG9hc3QgPSAobWVzc2FnZSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgdXRpbC5jaGVja01pc3NpbmdJbXBvcnQoJ1RvYXN0Jyk7IC8vIFRocm93cyBlcnJvciwgbXVzdCBiZSBpbnNpZGUgcHJvbWlzZVxuXG4gICAgb3B0aW9ucyA9IF9ub3JtYWxpemVBcmd1bWVudHMobWVzc2FnZSwgb3B0aW9ucywge1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIGZvcmNlOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgbGV0IHRvYXN0ID0gdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICAgIDxvbnMtdG9hc3Q+XG4gICAgICAgICR7b3B0aW9ucy5tZXNzYWdlfVxuICAgICAgICAke29wdGlvbnMuYnV0dG9uTGFiZWxzID8gYDxidXR0b24+JHtvcHRpb25zLmJ1dHRvbkxhYmVsc1swXX08L2J1dHRvbj5gIDogJyd9XG4gICAgICA8L29ucy10b2FzdD5cbiAgICBgKTtcblxuICAgIF9zZXRBdHRyaWJ1dGVzKHRvYXN0LCBvcHRpb25zKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsSGlkZSA9IHRvYXN0LmhpZGUuYmluZCh0b2FzdCk7XG5cbiAgICBjb25zdCBmaW5pc2ggPSB2YWx1ZSA9PiB7XG4gICAgICBpZiAodG9hc3QpIHtcbiAgICAgICAgb3JpZ2luYWxIaWRlKClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0b2FzdCkge1xuICAgICAgICAgICAgdG9hc3QucmVtb3ZlKCk7XG4gICAgICAgICAgICB0b2FzdCA9IG51bGw7XG4gICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKHZhbHVlKTtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLmJ1dHRvbkxhYmVscykge1xuICAgICAgdXRpbC5maW5kQ2hpbGQodG9hc3QuX3RvYXN0LCAnYnV0dG9uJykub25jbGljayA9ICgpID0+IGZpbmlzaCgwKTtcbiAgICB9XG5cbiAgICAvLyBvdmVyd3JpdGUgc28gdGhhdCBvbnMubm90aWZpY2F0aW9uLmhpZGUgcmVzb2x2ZXMgd2hlbiB0b2FzdC5oaWRlIGlzIGNhbGxlZFxuICAgIHRvYXN0LmhpZGUgPSAoKSA9PiBmaW5pc2goLTEpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0b2FzdCk7XG4gICAgb3B0aW9ucy5jb21waWxlKHRvYXN0KTtcblxuICAgIGNvbnN0IHNob3cgPSAoKSA9PiB7XG4gICAgICB0b2FzdC5wYXJlbnRFbGVtZW50ICYmIHRvYXN0LnNob3cob3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLnRpbWVvdXQpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGZpbmlzaCgtMSksIG9wdGlvbnMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4gb3B0aW9ucy5mb3JjZSA/IHNob3coKSA6IFRvYXN0UXVldWUuYWRkKHNob3csIHByb21pc2UpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBub3RpZmljYXRpb247XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuL3V0aWwuanMnO1xuXG4vLyBWYWxpZGF0ZSBwYXJhbWV0ZXJzXG5jb25zdCBjaGVja09wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgY29uc3QgZXJyID0gKHByb3AsIHR5cGUgPSAnRnVuY3Rpb24nKSA9PiB1dGlsLnRocm93KGBcIm9wdGlvbnMuJHtwcm9wfVwiIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgJHt0eXBlfWApO1xuICBjb25zdCBoYXNPd25Qcm9wZXJ0eSA9IHByb3AgPT4gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgcHJvcCk7XG4gIGNvbnN0IGluc3RhbmNlT2YgPSAocHJvcCwgdHlwZSA9IEZ1bmN0aW9uKSA9PiBvcHRpb25zW3Byb3BdIGluc3RhbmNlb2YgdHlwZTtcblxuICBjb25zdCBiID0gJ2J1dHRvbnMnLCBjYiA9ICdjYWxsYmFjaycsIGMgPSAnY29tcGlsZScsIGQgPSAnZGVzdHJveSc7XG4gICghaGFzT3duUHJvcGVydHkoYikgfHwgIWluc3RhbmNlT2YoYiwgQXJyYXkpKSAmJiBlcnIoYiwgJ0FycmF5Jyk7XG4gIChoYXNPd25Qcm9wZXJ0eShjYikgJiYgIWluc3RhbmNlT2YoY2IpKSAmJiBlcnIoY2IpO1xuICAoaGFzT3duUHJvcGVydHkoYykgJiYgIWluc3RhbmNlT2YoYykpICYmIGVycihjKTtcbiAgKGhhc093blByb3BlcnR5KGQpICYmICFpbnN0YW5jZU9mKGQpKSAmJiBlcnIoZCk7XG59O1xuXG4vLyBBY3Rpb24gU2hlZXRcbmV4cG9ydCBkZWZhdWx0IChvcHRpb25zID0ge30pID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICB1dGlsLmNoZWNrTWlzc2luZ0ltcG9ydCgnQWN0aW9uU2hlZXQnKTtcbiAgY2hlY2tPcHRpb25zKG9wdGlvbnMpO1xuXG4gIC8vIE1haW4gY29tcG9uZW50XG4gIGxldCBhY3Rpb25TaGVldCA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgPG9ucy1hY3Rpb24tc2hlZXRcbiAgICAgICR7b3B0aW9ucy50aXRsZSA/IGB0aXRsZT1cIiR7b3B0aW9ucy50aXRsZX1cImAgOiAnJ31cbiAgICAgICR7b3B0aW9ucy5jYW5jZWxhYmxlID8gJ2NhbmNlbGFibGUnIDogJyd9XG4gICAgICAke29wdGlvbnMubW9kaWZpZXIgPyBgbW9kaWZpZXI9XCIke29wdGlvbnMubW9kaWZpZXJ9XCJgIDogJyd9XG4gICAgICAke29wdGlvbnMubWFza0NvbG9yID8gYG1hc2stY29sb3I9XCIke29wdGlvbnMubWFza0NvbG9yfVwiYCA6ICcnfVxuICAgICAgJHtvcHRpb25zLmlkID8gYGlkPVwiJHtvcHRpb25zLmlkfVwiYCA6ICcnfVxuICAgICAgJHtvcHRpb25zLmNsYXNzID8gYGNsYXNzPVwiJHtvcHRpb25zLmNsYXNzfVwiYCA6ICcnfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tc2hlZXRcIj48L2Rpdj5cbiAgICA8L29ucy1hY3Rpb24tc2hlZXQ+XG4gIGApO1xuXG4gIC8vIFJlc29sdmUgYWN0aW9uIGFuZCBjbGVhbiB1cFxuICBjb25zdCBmaW5pc2ggPSAoZXZlbnQsIGluZGV4ID0gLTEpID0+IHtcbiAgICBpZiAoYWN0aW9uU2hlZXQpIHtcbiAgICAgIG9wdGlvbnMuZGVzdHJveSAmJiBvcHRpb25zLmRlc3Ryb3koYWN0aW9uU2hlZXQpO1xuXG4gICAgICBhY3Rpb25TaGVldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkaWFsb2djYW5jZWwnLCBmaW5pc2gsIGZhbHNlKTtcbiAgICAgIGFjdGlvblNoZWV0LnJlbW92ZSgpO1xuICAgICAgYWN0aW9uU2hlZXQgPSBudWxsO1xuXG4gICAgICBvcHRpb25zLmNhbGxiYWNrICYmIG9wdGlvbnMuY2FsbGJhY2soaW5kZXgpO1xuICAgICAgcmVzb2x2ZShpbmRleCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIExpbmsgY2FuY2VsIGhhbmRsZXJcbiAgYWN0aW9uU2hlZXQuYWRkRXZlbnRMaXN0ZW5lcignZGlhbG9nY2FuY2VsJywgZmluaXNoLCBmYWxzZSk7XG5cbiAgLy8gQ3JlYXRlIGJ1dHRvbnMgYW5kIGxpbmsgYWN0aW9uIGhhbmRsZXJcbiAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgb3B0aW9ucy5idXR0b25zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgYnV0dG9uT3B0aW9ucyA9ICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8geyBsYWJlbDogaXRlbSB9IDogeyAuLi5pdGVtIH07XG4gICAgaWYgKG9wdGlvbnMuZGVzdHJ1Y3RpdmUgPT09IGluZGV4KSB7XG4gICAgICBidXR0b25PcHRpb25zLm1vZGlmaWVyID0gKGJ1dHRvbk9wdGlvbnMubW9kaWZpZXIgfHwgJycpICsgJyBkZXN0cnVjdGl2ZSc7XG4gICAgfVxuXG4gICAgY29uc3QgYnV0dG9uID0gdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICAgIDxvbnMtYWN0aW9uLXNoZWV0LWJ1dHRvblxuICAgICAgICAke2J1dHRvbk9wdGlvbnMuaWNvbiA/IGBpY29uPVwiJHtidXR0b25PcHRpb25zLmljb259XCJgIDogJyd9XG4gICAgICAgICR7YnV0dG9uT3B0aW9ucy5tb2RpZmllciA/IGBtb2RpZmllcj1cIiR7YnV0dG9uT3B0aW9ucy5tb2RpZmllcn1cImAgOiAnJ31cbiAgICAgID5cbiAgICAgICAgJHtidXR0b25PcHRpb25zLmxhYmVsfVxuICAgICAgPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAgICBgKTtcblxuICAgIGJ1dHRvbi5vbmNsaWNrID0gZXZlbnQgPT4gYWN0aW9uU2hlZXQuaGlkZSgpLnRoZW4oKCkgPT4gZmluaXNoKGV2ZW50LCBpbmRleCkpO1xuICAgIGJ1dHRvbnMuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgfSk7XG5cbiAgLy8gRmluaXNoIGNvbXBvbmVudCBhbmQgYXR0YWNoXG4gIHV0aWwuZmluZENoaWxkKGFjdGlvblNoZWV0LCAnLmFjdGlvbi1zaGVldCcpLmFwcGVuZENoaWxkKGJ1dHRvbnMpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGFjdGlvblNoZWV0KTtcbiAgb3B0aW9ucy5jb21waWxlICYmIG9wdGlvbnMuY29tcGlsZShlbC5kaWFsb2cpO1xuXG4gIC8vIFNob3dcbiAgc2V0SW1tZWRpYXRlKCgpID0+IGFjdGlvblNoZWV0LnNob3coe1xuICAgIGFuaW1hdGlvbjogb3B0aW9ucy5hbmltYXRpb24sXG4gICAgYW5pbWF0aW9uT3B0aW9uczogb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXG4gIH0pKTtcbn0pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IE1pY3JvRXZlbnQgZnJvbSAnLi9taWNyb2V2ZW50LmpzJztcblxuY29uc3QgY3JlYXRlID0gKCkgPT4ge1xuXG4gIC8qKlxuICAgKiBAb2JqZWN0IG9ucy5vcmllbnRhdGlvblxuICAgKiBAY2F0ZWdvcnkgdXRpbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVXRpbGl0eSBtZXRob2RzIGZvciBvcmllbnRhdGlvbiBkZXRlY3Rpb24uWy9lbl1cbiAgICogICBbamFd55S76Z2i44Gu44Kq44Oq44Ko44Oz44OG44O844K344On44Oz5qSc55+l44Gu44Gf44KB44Gu44Om44O844OG44Kj44Oq44OG44Kj44Oh44K944OD44OJ44KS5Y+O44KB44Gm44GE44KL44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICovXG4gIGNvbnN0IG9iaiA9IHtcbiAgICAvKipcbiAgICAgKiBAZXZlbnQgY2hhbmdlXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogICBbZW5dRmlyZWQgd2hlbiB0aGUgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZXMuWy9lbl1cbiAgICAgKiAgIFtqYV3jg4fjg5DjgqTjgrnjga7jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgYzlpInljJbjgZfjgZ/pmpvjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5pc1BvcnRyYWl0XG4gICAgICogICBbZW5dV2lsbCBiZSB0cnVlIGlmIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGlzIHBvcnRyYWl0IG1vZGUuWy9lbl1cbiAgICAgKiAgIFtqYV3nj77lnKjjga7jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgYxwb3J0cmFpdOOBruWgtOWQiOOBq3RydWXjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBvblxuICAgICAqIEBzaWduYXR1cmUgb24oZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiAgIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAgICAgKiAgIFtlbl1OYW1lIG9mIHRoZSBldmVudC5bL2VuXVxuICAgICAqICAgW2phXeOCpOODmeODs+ODiOWQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5bL2VuXVxuICAgICAqICAgW2phXeOBk+OBruOCpOODmeODs+ODiOOBjOeZuueBq+OBleOCjOOBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIG9uY2VcbiAgICAgKiBAc2lnbmF0dXJlIG9uY2UoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiAgW2VuXUFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0J3Mgb25seSB0cmlnZ2VyZWQgb25jZS5bL2VuXVxuICAgICAqICBbamFd5LiA5bqm44Gg44GR5ZG844Gz5Ye644GV44KM44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBvZmZcbiAgICAgKiBAc2lnbmF0dXJlIG9mZihldmVudE5hbWUsIFtsaXN0ZW5lcl0pXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogIFtlbl1SZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuIElmIHRoZSBsaXN0ZW5lciBpcyBub3Qgc3BlY2lmaWVkIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBldmVudCB0eXBlIHdpbGwgYmUgcmVtb3ZlZC5bL2VuXVxuICAgICAqICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5YmK6Zmk44GX44G+44GZ44CC44KC44GX44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5oyH5a6a44GX44Gq44GL44Gj44Gf5aC05ZCI44Gr44Gv44CB44Gd44Gu44Kk44OZ44Oz44OI44Gr57SQ44Gl44GP5YWo44Gm44Gu44Kk44OZ44Oz44OI44Oq44K544OK44O844GM5YmK6Zmk44GV44KM44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAgICAgKiAgIFtqYV3liYrpmaTjgZnjgovjgqTjg5njg7Pjg4jjg6rjgrnjg4rjg7zjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuXG4gICAgLy8gYWN0dWFsIGltcGxlbWVudGF0aW9uIHRvIGRldGVjdCBpZiB3aGV0aGVyIGN1cnJlbnQgc2NyZWVuIGlzIHBvcnRyYWl0IG9yIG5vdFxuICAgIF9pc1BvcnRyYWl0OiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgaXNQb3J0cmFpdFxuICAgICAqIEBzaWduYXR1cmUgaXNQb3J0cmFpdCgpXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKiAgIFtlbl1XaWxsIGJlIHRydWUgaWYgdGhlIGN1cnJlbnQgb3JpZW50YXRpb24gaXMgcG9ydHJhaXQgbW9kZS5bL2VuXVxuICAgICAqICAgW2phXeOCquODquOCqOODs+ODhuODvOOCt+ODp+ODs+OBjHBvcnRyYWl044Oi44O844OJ44Gu5aC05ZCI44GrdHJ1ZeOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBpcyBwb3J0cmFpdCBvciBub3QuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgYxwb3J0cmFpdOODouODvOODieOBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAgICovXG4gICAgaXNQb3J0cmFpdDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXNQb3J0cmFpdCgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGlzTGFuZHNjYXBlXG4gICAgICogQHNpZ25hdHVyZSBpc0xhbmRzY2FwZSgpXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKiAgIFtlbl1XaWxsIGJlIHRydWUgaWYgdGhlIGN1cnJlbnQgb3JpZW50YXRpb24gaXMgbGFuZHNjYXBlIG1vZGUuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgYxsYW5kc2NhcGXjg6Ljg7zjg4njga7loLTlkIjjgat0cnVl44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2NyZWVuIG9yaWVudGF0aW9uIGlzIGxhbmRzY2FwZSBvciBub3QuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgYxsYW5kc2NhcGXjg6Ljg7zjg4njgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuICAgIGlzTGFuZHNjYXBlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc1BvcnRyYWl0KCk7XG4gICAgfSxcblxuICAgIF9pbml0OiBmdW5jdGlvbigpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB0aGlzLl9vbkRPTUNvbnRlbnRMb2FkZWQuYmluZCh0aGlzKSwgZmFsc2UpO1xuXG4gICAgICBpZiAoJ29yaWVudGF0aW9uJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25SZXNpemUuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc1BvcnRyYWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQgPiB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfb25ET01Db250ZW50TG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuX2luc3RhbGxJc1BvcnRyYWl0SW1wbGVtZW50YXRpb24oKTtcbiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IHRoaXMuaXNQb3J0cmFpdCgpfSk7XG4gICAgfSxcblxuICAgIF9pbnN0YWxsSXNQb3J0cmFpdEltcGxlbWVudGF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGlzUG9ydHJhaXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgaWYgKCEoJ29yaWVudGF0aW9uJyBpbiB3aW5kb3cpKSB7XG4gICAgICAgIHRoaXMuX2lzUG9ydHJhaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0ID4gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5vcmllbnRhdGlvbiAlIDE4MCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9pc1BvcnRyYWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5vcmllbnRhdGlvbiAlIDE4MCkgPT09IDAgPyBpc1BvcnRyYWl0IDogIWlzUG9ydHJhaXQ7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc1BvcnRyYWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5vcmllbnRhdGlvbiAlIDE4MCkgPT09IDkwID8gaXNQb3J0cmFpdCA6ICFpc1BvcnRyYWl0O1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBfb25PcmllbnRhdGlvbkNoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBpc1BvcnRyYWl0ID0gdGhpcy5faXNQb3J0cmFpdCgpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgZGltZW5zaW9ucyB0byBjaGFuZ2UgYmVjYXVzZVxuICAgICAgLy8gb2YgQW5kcm9pZCBpbmNvbnNpc3RlbmN5LlxuICAgICAgbGV0IG5JdGVyID0gMDtcbiAgICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBuSXRlcisrO1xuXG4gICAgICAgIGNvbnN0IHcgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgY29uc3QgaCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgICBpZiAoKGlzUG9ydHJhaXQgJiYgdyA8PSBoKSB8fFxuICAgICAgICAgICAoIWlzUG9ydHJhaXQgJiYgdyA+PSBoKSkge1xuICAgICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IGlzUG9ydHJhaXR9KTtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChuSXRlciA9PT0gNTApIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIHtpc1BvcnRyYWl0OiBpc1BvcnRyYWl0fSk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwKTtcbiAgICB9LFxuXG4gICAgLy8gUnVuIG9uIG5vdCBtb2JpbGUgYnJvd3Nlci5cbiAgICBfb25SZXNpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCB7aXNQb3J0cmFpdDogdGhpcy5pc1BvcnRyYWl0KCl9KTtcbiAgICB9XG4gIH07XG5cbiAgTWljcm9FdmVudC5taXhpbihvYmopO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGUoKS5faW5pdCgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxuLyoqXG4gKiBAb2JqZWN0IG9ucy5tb2RpZmllclxuICogQGNhdGVnb3J5IHZpc3VhbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBVdGlsaXR5IG1ldGhvZHMgdG8gY2hhbmdlIG1vZGlmaWVyIGF0dHJpYnV0ZXMgb2YgT25zZW4gVUkgZWxlbWVudHMuLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiBvbnMubW9kaWZpZXIuYWRkKG15T25zSW5wdXRFbGVtZW50LCAndW5kZXJiYXInKTtcbiAqIG9ucy5tb2RpZmllci50b2dnbGUobXlPbnNUb2FzdEVsZW1lbnQsICdjdXN0b20tbW9kaWZpZXInKTtcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkXG4gICAqIEBzaWduYXR1cmUgYWRkKGVsZW1lbnQsIG1vZGlmaWVyIFssIG1vZGlmaWVyXSlcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUFkZCB0aGUgc3BlY2lmaWVkIG1vZGlmaWVycyB0byB0aGUgZWxlbWVudCBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBpbmNsdWRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqICAgW2VuXVRhcmdldCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllclxuICAgKiAgIFtlbl1OYW1lIG9mIHRoZSBtb2RpZmllci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgYWRkOiAoZWxlbWVudCwgLi4ubW9kaWZpZXJzKSA9PiBtb2RpZmllcnMuZm9yRWFjaChtb2RpZmllciA9PiB1dGlsLmFkZE1vZGlmaWVyKGVsZW1lbnQsIG1vZGlmaWVyKSksXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbW92ZVxuICAgKiBAc2lnbmF0dXJlIHJlbW92ZShlbGVtZW50LCBtb2RpZmllciBbLCBtb2RpZmllcl0pXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZW1vdmUgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgZnJvbSB0aGUgZWxlbWVudCBpZiB0aGV5IGFyZSBpbmNsdWRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqICAgW2VuXVRhcmdldCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllclxuICAgKiAgIFtlbl1OYW1lIG9mIHRoZSBtb2RpZmllci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgcmVtb3ZlOiAoZWxlbWVudCwgLi4ubW9kaWZpZXJzKSA9PiBtb2RpZmllcnMuZm9yRWFjaChtb2RpZmllciA9PiB1dGlsLnJlbW92ZU1vZGlmaWVyKGVsZW1lbnQsIG1vZGlmaWVyKSksXG4gIC8qKlxuICAgKiBAbWV0aG9kIGNvbnRhaW5zXG4gICAqIEBzaWduYXR1cmUgY29udGFpbnMoZWxlbWVudCwgbW9kaWZpZXIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXIgaXMgaW5jbHVkZWQgaW4gdGhlIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiAgIFtlbl1UYXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJcbiAgICogICBbZW5dTmFtZSBvZiB0aGUgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICogICBbZW5dYHRydWVgIHdoZW4gdGhlIHNwZWNpZmllZCBtb2RpZmllciBpcyBmb3VuZCBpbiB0aGUgZWxlbWVudCdzIGBtb2RpZmllcmAgYXR0cmlidXRlLiBgZmFsc2VgIG90aGVyd2lzZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgY29udGFpbnM6IHV0aWwuaGFzTW9kaWZpZXIsXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZVxuICAgKiBAc2lnbmF0dXJlIHRvZ2dsZShlbGVtZW50LCBtb2RpZmllciBbLCBmb3JjZV0pXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ub2dnbGUgdGhlIHNwZWNpZmllZCBtb2RpZmllci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqICAgW2VuXVRhcmdldCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllclxuICAgKiAgIFtlbl1OYW1lIG9mIHRoZSBtb2RpZmllci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZm9yY2VcbiAgICogICBbZW5dSWYgaXQgZXZhbHVhdGVzIHRvIHRydWUsIGFkZCBzcGVjaWZpZWQgbW9kaWZpZXIgdmFsdWUsIGFuZCBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHJlbW92ZSBpdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgdG9nZ2xlOiB1dGlsLnRvZ2dsZU1vZGlmaWVyXG59O1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCBNaWNyb0V2ZW50IGZyb20gJy4vbWljcm9ldmVudC5qcyc7XG5cbmNvbnN0IHNvZnR3YXJlS2V5Ym9hcmQgPSBuZXcgTWljcm9FdmVudCgpO1xuc29mdHdhcmVLZXlib2FyZC5fdmlzaWJsZSA9IGZhbHNlO1xuXG5jb25zdCBvblNob3cgPSAoKSA9PiB7XG4gIHNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSB0cnVlO1xuICBzb2Z0d2FyZUtleWJvYXJkLmVtaXQoJ3Nob3cnKTtcbn07XG5cbmNvbnN0IG9uSGlkZSA9ICgpID0+IHtcbiAgc29mdHdhcmVLZXlib2FyZC5fdmlzaWJsZSA9IGZhbHNlO1xuICBzb2Z0d2FyZUtleWJvYXJkLmVtaXQoJ2hpZGUnKTtcbn07XG5cbmNvbnN0IGJpbmRFdmVudHMgPSAoKSA9PiB7XG4gIGlmICh0eXBlb2YgS2V5Ym9hcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcnRpbm1vc2UvY29yZG92YS1rZXlib2FyZC9ibG9iLzk1ZjNkYTNhMzhkOGY4ZTFmYTQxZmJmNDAxNDUzNTJjMTM1MzVhMDAvUkVBRE1FLm1kXG4gICAgS2V5Ym9hcmQub25zaG93ID0gb25TaG93O1xuICAgIEtleWJvYXJkLm9uaGlkZSA9IG9uSGlkZTtcbiAgICBzb2Z0d2FyZUtleWJvYXJkLmVtaXQoJ2luaXQnLCB7dmlzaWJsZTogS2V5Ym9hcmQuaXNWaXNpYmxlfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29yZG92YS5wbHVnaW5zICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29yZG92YS5wbHVnaW5zLktleWJvYXJkICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kcmlmdHljby9pb25pYy1wbHVnaW5zLWtleWJvYXJkL2Jsb2IvY2EyN2VjZi9SRUFETUUubWRcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbmF0aXZlLmtleWJvYXJkc2hvdycsIG9uU2hvdyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ25hdGl2ZS5rZXlib2FyZGhpZGUnLCBvbkhpZGUpO1xuICAgIHNvZnR3YXJlS2V5Ym9hcmQuZW1pdCgnaW5pdCcsIHt2aXNpYmxlOiBjb3Jkb3ZhLnBsdWdpbnMuS2V5Ym9hcmQuaXNWaXNpYmxlfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IG5vUGx1Z2luRXJyb3IgPSAoKSA9PiB7XG4gIHV0aWwud2Fybignb25zLWtleWJvYXJkOiBDb3Jkb3ZhIEtleWJvYXJkIHBsdWdpbiBpcyBub3QgcHJlc2VudC4nKTtcbn07XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xuICBpZiAoIWJpbmRFdmVudHMoKSkge1xuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbb25zLWtleWJvYXJkLWFjdGl2ZV0nKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW29ucy1rZXlib2FyZC1pbmFjdGl2ZV0nKSkge1xuICAgICAgbm9QbHVnaW5FcnJvcigpO1xuICAgIH1cblxuICAgIHNvZnR3YXJlS2V5Ym9hcmQub24gPSBub1BsdWdpbkVycm9yO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc29mdHdhcmVLZXlib2FyZDtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmNvbnN0IGdlbmVyYXRlSWQgPSAoZnVuY3Rpb24oKSB7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBpKys7XG4gIH07XG59KSgpO1xuXG4vKipcbiAqIERvb3IgbG9ja2luZyBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMubG9nXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb29yTG9jayB7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5fbG9ja0xpc3QgPSBbXTtcbiAgICB0aGlzLl93YWl0TGlzdCA9IFtdO1xuICAgIHRoaXMuX2xvZyA9IG9wdGlvbnMubG9nIHx8IGZ1bmN0aW9uKCkge307XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsb2NrLlxuICAgKlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gQ2FsbGJhY2sgZm9yIHVubG9ja2luZy5cbiAgICovXG4gIGxvY2soKSB7XG4gICAgY29uc3QgdW5sb2NrID0gKCkgPT4ge1xuICAgICAgdGhpcy5fdW5sb2NrKHVubG9jayk7XG4gICAgfTtcbiAgICB1bmxvY2suaWQgPSBnZW5lcmF0ZUlkKCk7XG4gICAgdGhpcy5fbG9ja0xpc3QucHVzaCh1bmxvY2spO1xuICAgIHRoaXMuX2xvZygnbG9jazogJyArICh1bmxvY2suaWQpKTtcblxuICAgIHJldHVybiB1bmxvY2s7XG4gIH1cblxuICBfdW5sb2NrKGZuKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9sb2NrTGlzdC5pbmRleE9mKGZuKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZnVuY3Rpb24gaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGxvY2sgbGlzdC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NrTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX2xvZygndW5sb2NrOiAnICsgZm4uaWQpO1xuXG4gICAgdGhpcy5fdHJ5VG9GcmVlV2FpdExpc3QoKTtcbiAgfVxuXG4gIF90cnlUb0ZyZWVXYWl0TGlzdCgpIHtcbiAgICB3aGlsZSAoIXRoaXMuaXNMb2NrZWQoKSAmJiB0aGlzLl93YWl0TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl93YWl0TGlzdC5zaGlmdCgpKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIHdhaXRpbmcgdW5sb2NrZWQgZG9vci5cbiAgICpcbiAgICogQHBhcmFtcyB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIG9uIHVubG9ja2luZyB0aGUgZG9vciBjb21wbGV0ZWx5LlxuICAgKi9cbiAgd2FpdFVubG9jayhjYWxsYmFjaykge1xuICAgIGlmICghKGNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjYWxsYmFjayBwYXJhbSBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNMb2NrZWQoKSkge1xuICAgICAgdGhpcy5fd2FpdExpc3QucHVzaChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0xvY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9ja0xpc3QubGVuZ3RoID4gMDtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi9pbnRlcm5hbC9pbmRleC5qcyc7XG5cbi8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGdsb2JhbCBQYWdlTG9hZGVyLlxuZnVuY3Rpb24gbG9hZFBhZ2Uoe3BhZ2UsIHBhcmVudCwgcGFyYW1zID0ge319LCBkb25lLCBlcnJvcikge1xuICBpbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jKHBhZ2UpLnRoZW4oaHRtbCA9PiB7XG4gICAgY29uc3QgcGFnZUVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoaHRtbCk7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKHBhZ2VFbGVtZW50KTtcblxuICAgIGRvbmUocGFnZUVsZW1lbnQpO1xuICB9KS5jYXRjaChlID0+IGVycm9yKGUpKTtcbn1cblxuZnVuY3Rpb24gdW5sb2FkUGFnZShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50Ll9kZXN0cm95IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICBlbGVtZW50Ll9kZXN0cm95KCk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFnZUxvYWRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgaGFzIFwiZWxlbWVudFwiIHByb3BlcnR5IGFuZCBcInVubG9hZFwiIGZ1bmN0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3IobG9hZGVyLCB1bmxvYWRlcikge1xuICAgIHRoaXMuX2xvYWRlciA9IGxvYWRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbG9hZGVyIDogbG9hZFBhZ2U7XG4gICAgdGhpcy5fdW5sb2FkZXIgPSB1bmxvYWRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdW5sb2FkZXIgOiB1bmxvYWRQYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnRlcm5hbCBsb2FkZXIgaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBzZXQgaW50ZXJuYWxMb2FkZXIoZm4pIHtcbiAgICBpZiAoIShmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlciA9IGZuO1xuICB9XG5cbiAgZ2V0IGludGVybmFsTG9hZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9wdGlvbnMucGFnZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9wdGlvbnMucGFyZW50IEEgbG9jYXRpb24gdG8gbG9hZCBwYWdlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucGFyYW1zXSBFeHRyYSBwYXJhbWV0ZXJzIGZvciBvbnMtcGFnZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZSBUYWtlIGFuIG9iamVjdCB0aGF0IGhhcyBcImVsZW1lbnRcIiBwcm9wZXJ0eSBhbmQgXCJ1bmxvYWRcIiBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3IgRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IuXG4gICAqL1xuICBsb2FkKHtwYWdlLCBwYXJlbnQsIHBhcmFtcyA9IHt9fSwgZG9uZSwgZXJyb3IpIHtcbiAgICB0aGlzLl9sb2FkZXIoe3BhZ2UsIHBhcmVudCwgcGFyYW1zfSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgaWYgKCEocGFnZUVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBFcnJvcigncGFnZUVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFbGVtZW50LicpO1xuICAgICAgfVxuXG4gICAgICBkb25lKHBhZ2VFbGVtZW50KTtcbiAgICB9LCBlcnJvcik7XG4gIH1cblxuICB1bmxvYWQocGFnZUVsZW1lbnQpIHtcbiAgICBpZiAoIShwYWdlRWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBFcnJvcigncGFnZUVsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFbGVtZW50LicpO1xuICAgIH1cblxuICAgIHRoaXMuX3VubG9hZGVyKHBhZ2VFbGVtZW50KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFBhZ2VMb2FkZXIgPSBuZXcgUGFnZUxvYWRlcigpO1xuXG5leHBvcnQgY29uc3QgaW5zdGFudFBhZ2VMb2FkZXIgPSBuZXcgUGFnZUxvYWRlcihcbiAgZnVuY3Rpb24oe3BhZ2UsIHBhcmVudCwgcGFyYW1zID0ge319LCBkb25lKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHV0aWwuY3JlYXRlRWxlbWVudChwYWdlLnRyaW0oKSk7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgZG9uZShlbGVtZW50KTtcbiAgfSxcbiAgdW5sb2FkUGFnZVxuKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgZWxlbWVudHMgZnJvbSAnLi9lbGVtZW50cy5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4vYW5pbWl0LmpzJztcbmltcG9ydCBHZXN0dXJlRGV0ZWN0b3IgZnJvbSAnLi9nZXN0dXJlLWRldGVjdG9yLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3JtLmpzJztcbmltcG9ydCBub3RpZmljYXRpb24gZnJvbSAnLi9ub3RpZmljYXRpb24uanMnO1xuaW1wb3J0IGFjdGlvblNoZWV0IGZyb20gJy4vYWN0aW9uLXNoZWV0LmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBvcmllbnRhdGlvbiBmcm9tICcuL29yaWVudGF0aW9uLmpzJztcbmltcG9ydCBtb2RpZmllciBmcm9tICcuL21vZGlmaWVyLmpzJztcbmltcG9ydCBzb2Z0d2FyZUtleWJvYXJkIGZyb20gJy4vc29mdHdhcmUta2V5Ym9hcmQuanMnO1xuaW1wb3J0IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uIGZyb20gJy4vcGFnZS1hdHRyaWJ1dGUtZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4vYXV0b3N0eWxlLmpzJztcbmltcG9ydCBEb29yTG9jayBmcm9tICcuL2Rvb3Jsb2NrLmpzJztcbmltcG9ydCB7IGRlZmF1bHRQYWdlTG9hZGVyLCBQYWdlTG9hZGVyIH0gZnJvbSAnLi9wYWdlLWxvYWRlci5qcyc7XG5cbi8qKlxuICogQG9iamVjdCBvbnNcbiAqIEBjYXRlZ29yeSB1dGlsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2phXU9uc2VuIFVJ44Gn5Yip55So44Gn44GN44KL44Kw44Ot44O844OQ44Or44Gq44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqICAgW2VuXUEgZ2xvYmFsIG9iamVjdCB0aGF0J3MgdXNlZCBpbiBPbnNlbiBVSS4gWy9lbl1cbiAqL1xuY29uc3Qgb25zID0ge1xuICBhbmltaXQsXG4gIGRlZmF1bHRQYWdlTG9hZGVyLFxuICBlbGVtZW50cyxcbiAgR2VzdHVyZURldGVjdG9yLFxuICBtb2RpZmllcixcbiAgbm90aWZpY2F0aW9uLFxuICBvcmllbnRhdGlvbixcbiAgcGFnZUF0dHJpYnV0ZUV4cHJlc3Npb24sXG4gIFBhZ2VMb2FkZXIsXG4gIHBsYXRmb3JtLFxuICBzb2Z0d2FyZUtleWJvYXJkLFxuICBfYXV0b1N0eWxlOiBhdXRvU3R5bGUsXG4gIF9pbnRlcm5hbDogaW50ZXJuYWwsXG4gIF9yZWFkeUxvY2s6IG5ldyBEb29yTG9jaygpLFxuICBfdXRpbDogdXRpbCxcbn07XG5cbm9ucy5wbGF0Zm9ybS5zZWxlY3QoKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gubWF0Y2goL3BsYXRmb3JtPShbXFx3LV0rKS8pIHx8IFtdKVsxXSk7XG5cbndhaXREZXZpY2VSZWFkeSgpO1xuXG5jb25zdCByZWFkeUVycm9yID0gYWZ0ZXIgPT4gdXRpbC50aHJvdyhgVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgJHthZnRlciA/ICdhZnRlcicgOiAnYmVmb3JlJ30gb25zLmlzUmVhZHkoKSBpcyB0cnVlYCk7XG5cbi8qKlxuICogQG1ldGhvZCBpc1JlYWR5XG4gKiBAc2lnbmF0dXJlIGlzUmVhZHkoKVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqICAgW2VuXVdpbGwgYmUgdHJ1ZSBpZiBPbnNlbiBVSSBpcyBpbml0aWFsaXplZC5bL2VuXVxuICogICBbamFd5Yid5pyf5YyW44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dUmV0dXJucyB0cnVlIGlmIE9uc2VuIFVJIGlzIGluaXRpYWxpemVkLlsvZW5dXG4gKiAgIFtqYV1PbnNlbiBVSeOBjOOBmeOBp+OBq+WIneacn+WMluOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBmeODoeOCveODg+ODieOBp+OBmeOAglsvamFdXG4gKi9cbm9ucy5pc1JlYWR5ID0gKCkgPT4ge1xuICByZXR1cm4gIW9ucy5fcmVhZHlMb2NrLmlzTG9ja2VkKCk7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgaXNXZWJWaWV3XG4gKiBAc2lnbmF0dXJlIGlzV2ViVmlldygpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogICBbZW5dV2lsbCBiZSB0cnVlIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiBDb3Jkb3ZhLlsvZW5dXG4gKiAgIFtqYV1Db3Jkb3Zh44Gn5a6f6KGM44GV44KM44Gm44GE44KL5aC05ZCI44GrdHJ1ZeOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJldHVybnMgdHJ1ZSBpZiBydW5uaW5nIGluc2lkZSBDb3Jkb3ZhLlsvZW5dXG4gKiAgIFtqYV1Db3Jkb3Zh44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GZ44Oh44K944OD44OJ44Gn44GZ44CCWy9qYV1cbiAqL1xub25zLmlzV2ViVmlldyA9IG9ucy5wbGF0Zm9ybS5pc1dlYlZpZXc7XG5cbi8qKlxuICogQG1ldGhvZCByZWFkeVxuICogQHNpZ25hdHVyZSByZWFkeShjYWxsYmFjaylcbiAqIEBkZXNjcmlwdGlvblxuICogICBbamFd44Ki44OX44Oq44Gu5Yid5pyf5YyW44Gr5Yip55So44GZ44KL44Oh44K944OD44OJ44Gn44GZ44CC5rih44GV44KM44Gf6Zai5pWw44Gv44CBT25zZW4gVUnjga7liJ3mnJ/ljJbjgYzntYLkuobjgZfjgabjgYTjgovmmYLngrnjgaflv4XjgZrlkbzjgbDjgozjgb7jgZnjgIJbL2phXVxuICogICBbZW5dTWV0aG9kIHVzZWQgdG8gd2FpdCBmb3IgYXBwIGluaXRpYWxpemF0aW9uLiBXYWl0cyBmb3IgYERPTUNvbnRlbnRMb2FkZWRgIGFuZCBgZGV2aWNlcmVhZHlgLCB3aGVuIG5lY2Vzc2FyeSwgYmVmb3JlIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suWy9lbl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiAgIFtlbl1GdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIGFmdGVyIE9uc2VuIFVJIGhhcyBiZWVuIGluaXRpYWxpemVkLlsvZW5dXG4gKiAgIFtqYV1PbnNlbiBVSeOBjOWIneacn+WMluOBjOWujOS6huOBl+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cbm9ucy5yZWFkeSA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKG9ucy5pc1JlYWR5KCkpIHtcbiAgICBjYWxsYmFjaygpO1xuICB9IGVsc2Uge1xuICAgIG9ucy5fcmVhZHlMb2NrLndhaXRVbmxvY2soY2FsbGJhY2spO1xuICB9XG59O1xuXG4vKipcbiAqIEBtZXRob2Qgc2V0RGVmYXVsdERldmljZUJhY2tCdXR0b25MaXN0ZW5lclxuICogQHNpZ25hdHVyZSBzZXREZWZhdWx0RGV2aWNlQmFja0J1dHRvbkxpc3RlbmVyKGxpc3RlbmVyKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAqICAgW2VuXUZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgd2hlbiBkZXZpY2UgYmFjayBidXR0b24gaXMgcHJlc3NlZC4gTXVzdCBiZSBjYWxsZWQgb24gYG9ucy5yZWFkeWAuWy9lbl1cbiAqICAgW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OBjOaKvOOBleOCjOOBn+aZguOBq+Wun+ihjOOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVNldCBkZWZhdWx0IGhhbmRsZXIgZm9yIGRldmljZSBiYWNrIGJ1dHRvbi5bL2VuXVxuICogICBbamFd44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44Gu44Gf44KB44Gu44OH44OV44Kp44Or44OI44Gu44OP44Oz44OJ44Op44KS6Kit5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLnNldERlZmF1bHREZXZpY2VCYWNrQnV0dG9uTGlzdGVuZXIgPSBmdW5jdGlvbihsaXN0ZW5lcikge1xuICBpZiAoIW9ucy5pc1JlYWR5KCkpIHtcbiAgICByZWFkeUVycm9yKHRydWUpO1xuICB9XG4gIG9ucy5fZGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyLnNldExpc3RlbmVyKGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBkaXNhYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXJcbiAqIEBzaWduYXR1cmUgZGlzYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyKClcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXURpc2FibGUgZGV2aWNlIGJhY2sgYnV0dG9uIGV2ZW50IGhhbmRsZXIuIE11c3QgYmUgY2FsbGVkIG9uIGBvbnMucmVhZHlgLlsvZW5dXG4gKiBbamFd44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44Gu44Kk44OZ44Oz44OI44KS5Y+X44GR5LuY44GR44Gq44GE44KI44GG44Gr44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLmRpc2FibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIW9ucy5pc1JlYWR5KCkpIHtcbiAgICByZWFkeUVycm9yKHRydWUpO1xuICB9XG4gIGludGVybmFsLmRiYkRpc3BhdGNoZXIuZGlzYWJsZSgpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGVuYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyXG4gKiBAc2lnbmF0dXJlIGVuYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyKClcbiAqIEBkZXNjcmlwdGlvblxuICogW2VuXUVuYWJsZSBkZXZpY2UgYmFjayBidXR0b24gZXZlbnQgaGFuZGxlci4gTXVzdCBiZSBjYWxsZWQgb24gYG9ucy5yZWFkeWAuWy9lbl1cbiAqIFtqYV3jg4fjg5DjgqTjgrnjga7jg5Djg4Pjgq/jg5zjgr/jg7Pjga7jgqTjg5njg7Pjg4jjgpLlj5fjgZHku5jjgZHjgovjgojjgYbjgavjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMuZW5hYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCFvbnMuaXNSZWFkeSgpKSB7XG4gICAgcmVhZHlFcnJvcih0cnVlKTtcbiAgfVxuICBpbnRlcm5hbC5kYmJEaXNwYXRjaGVyLmVuYWJsZSgpO1xufTtcblxub25zLmZpcmVEZXZpY2VCYWNrQnV0dG9uRXZlbnQgPSBmdW5jdGlvbigpIHtcbiAgaW50ZXJuYWwuZGJiRGlzcGF0Y2hlci5maXJlRGV2aWNlQmFja0J1dHRvbkV2ZW50KCk7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZW5hYmxlQXV0b1N0YXR1c0JhckZpbGxcbiAqIEBzaWduYXR1cmUgZW5hYmxlQXV0b1N0YXR1c0JhckZpbGwoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1FbmFibGUgc3RhdHVzIGJhciBmaWxsIGZlYXR1cmUgb24gaU9TNyBhbmQgYWJvdmUgKGV4Y2VwdCBmb3IgaVBob25lIFgpLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYG9ucy5yZWFkeWAuWy9lbl1cbiAqICAgW2phXWlPUzfku6XkuIrvvIhpUGhvbmUgWOOBr+mZpOOBj++8ieOBp+OAgeOCueODhuODvOOCv+OCueODkOODvOmDqOWIhuOBrumrmOOBleOCkuiHquWLleeahOOBq+Wfi+OCgeOCi+WHpueQhuOCkuacieWKueOBq+OBl+OBvuOBmeOAglsvamFdXG4gKi9cbm9ucy5lbmFibGVBdXRvU3RhdHVzQmFyRmlsbCA9ICgpID0+IHtcbiAgaWYgKG9ucy5pc1JlYWR5KCkpIHtcbiAgICByZWFkeUVycm9yKGZhbHNlKTtcbiAgfVxuICBpbnRlcm5hbC5jb25maWcuYXV0b1N0YXR1c0JhckZpbGwgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGRpc2FibGVBdXRvU3RhdHVzQmFyRmlsbFxuICogQHNpZ25hdHVyZSBkaXNhYmxlQXV0b1N0YXR1c0JhckZpbGwoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1EaXNhYmxlIHN0YXR1cyBiYXIgZmlsbCBmZWF0dXJlIG9uIGlPUzcgYW5kIGFib3ZlIChleGNlcHQgZm9yIGlQaG9uZSBYKS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBvbnMucmVhZHlgLlsvZW5dXG4gKiAgIFtqYV1pT1M35Lul5LiK77yIaVBob25lIFjjga/pmaTjgY/vvInjgafjgIHjgrnjg4bjg7zjgr/jgrnjg5Djg7zpg6jliIbjga7pq5jjgZXjgpLoh6rli5XnmoTjgavln4vjgoHjgovlh6bnkIbjgpLnhKHlirnjgavjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMuZGlzYWJsZUF1dG9TdGF0dXNCYXJGaWxsID0gKCkgPT4ge1xuICBpZiAob25zLmlzUmVhZHkoKSkge1xuICAgIHJlYWR5RXJyb3IoZmFsc2UpO1xuICB9XG4gIGludGVybmFsLmNvbmZpZy5hdXRvU3RhdHVzQmFyRmlsbCA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIG1vY2tTdGF0dXNCYXJcbiAqIEBzaWduYXR1cmUgbW9ja1N0YXR1c0JhcigpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUNyZWF0ZXMgYSBzdGF0aWMgZWxlbWVudCBzaW1pbGFyIHRvIGlPUyBzdGF0dXMgYmFyLiBPbmx5IHVzZWZ1bCBmb3IgYnJvd3NlciB0ZXN0aW5nLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYG9ucy5yZWFkeWAuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5tb2NrU3RhdHVzQmFyID0gKCkgPT4ge1xuICBpZiAob25zLmlzUmVhZHkoKSkge1xuICAgIHJlYWR5RXJyb3IoZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgbW9jayA9ICgpID0+IHtcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY2hpbGRyZW5bMF0gfHwgIWRvY3VtZW50LmJvZHkuY2hpbGRyZW5bMF0uY2xhc3NMaXN0LmNvbnRhaW5zKCdvbnMtc3RhdHVzLWJhci1tb2NrJykpIHtcbiAgICAgIGNvbnN0IGFuZHJvaWQgPSBwbGF0Zm9ybS5pc0FuZHJvaWQoKSwgaSA9IGkgPT4gYDxpIGNsYXNzPVwiJHtpLnNwbGl0KCctJylbMF19ICR7aX1cIj48L2k+YDtcbiAgICAgIGNvbnN0IGxlZnQgPSBhbmRyb2lkID8gYCR7aSgnem1kaS10d2l0dGVyJyl9ICR7aSgnem1kaS1nb29nbGUtcGxheScpfWAgOiBgTm8gU0lNICR7aSgnZmEtd2lmaScpfWAsXG4gICAgICAgIGNlbnRlciA9IGFuZHJvaWQgPyAnJyA6ICcxMjoyOCBQTScsXG4gICAgICAgIHJpZ2h0ID0gYW5kcm9pZCA/IGAke2koJ3ptZGktbmV0d29yaycpfSAke2koJ3ptZGktd2lmaScpfSAke2koJ3ptZGktYmF0dGVyeScpfSAxMjoyOCBQTWAgOiBgODAlICR7aSgnZmEtYmF0dGVyeS10aHJlZS1xdWFydGVycycpfWA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHV0aWwuY3JlYXRlRWxlbWVudChcbiAgICAgICAgYDxkaXYgY2xhc3M9XCJvbnMtc3RhdHVzLWJhci1tb2NrICR7YW5kcm9pZCA/ICdhbmRyb2lkJyA6ICdpb3MnfVwiPmAgK1xuICAgICAgICAgIGA8ZGl2PiR7bGVmdH08L2Rpdj48ZGl2PiR7Y2VudGVyfTwvZGl2PjxkaXY+JHtyaWdodH08L2Rpdj5gICtcbiAgICAgICAgYDwvZGl2PmBcbiAgICAgICksIGRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmJvZHlcbiAgICA/IG1vY2soKVxuICAgIDogaW50ZXJuYWwud2FpdERPTUNvbnRlbnRMb2FkZWQobW9jayk7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZGlzYWJsZUFuaW1hdGlvbnNcbiAqIEBzaWduYXR1cmUgZGlzYWJsZUFuaW1hdGlvbnMoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1EaXNhYmxlIGFsbCBhbmltYXRpb25zLiBDb3VsZCBiZSBoYW5keSBmb3IgdGVzdGluZyBhbmQgb2xkZXIgZGV2aWNlcy5bL2VuXVxuICogICBbamFd44Ki44OL44Oh44O844K344On44Oz44KS5YWo44Gm54Sh5Yq544Gr44GX44G+44GZ44CC44OG44K544OI44Gu6Zqb44Gr5L6/5Yip44Gn44GZ44CCWy9qYV1cbiAqL1xub25zLmRpc2FibGVBbmltYXRpb25zID0gKCkgPT4ge1xuICBpbnRlcm5hbC5jb25maWcuYW5pbWF0aW9uc0Rpc2FibGVkID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBlbmFibGVBbmltYXRpb25zXG4gKiBAc2lnbmF0dXJlIGVuYWJsZUFuaW1hdGlvbnMoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1FbmFibGUgYW5pbWF0aW9ucyAoZGVmYXVsdCkuWy9lbl1cbiAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+OCkuacieWKueOBq+OBl+OBvuOBmeOAglsvamFdXG4gKi9cbm9ucy5lbmFibGVBbmltYXRpb25zID0gKCkgPT4ge1xuICBpbnRlcm5hbC5jb25maWcuYW5pbWF0aW9uc0Rpc2FibGVkID0gZmFsc2U7XG59O1xuXG5vbnMuX2Rpc2FibGVXYXJuaW5ncyA9ICgpID0+IHtcbiAgaW50ZXJuYWwuY29uZmlnLndhcm5pbmdzRGlzYWJsZWQgPSB0cnVlO1xufTtcblxub25zLl9lbmFibGVXYXJuaW5ncyA9ICgpID0+IHtcbiAgaW50ZXJuYWwuY29uZmlnLndhcm5pbmdzRGlzYWJsZWQgPSBmYWxzZTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBkaXNhYmxlQXV0b1N0eWxpbmdcbiAqIEBzaWduYXR1cmUgZGlzYWJsZUF1dG9TdHlsaW5nKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRGlzYWJsZSBhdXRvbWF0aWMgc3R5bGluZy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xub25zLmRpc2FibGVBdXRvU3R5bGluZyA9IGF1dG9TdHlsZS5kaXNhYmxlO1xuXG4vKipcbiAqIEBtZXRob2QgZW5hYmxlQXV0b1N0eWxpbmdcbiAqIEBzaWduYXR1cmUgZW5hYmxlQXV0b1N0eWxpbmcoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1FbmFibGUgYXV0b21hdGljIHN0eWxpbmcgYmFzZWQgb24gT1MgKGRlZmF1bHQpLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5vbnMuZW5hYmxlQXV0b1N0eWxpbmcgPSBhdXRvU3R5bGUuZW5hYmxlO1xuXG4vKipcbiAqIEBtZXRob2QgZGlzYWJsZUljb25BdXRvUHJlZml4XG4gKiBAc2lnbmF0dXJlIGRpc2FibGVJY29uQXV0b1ByZWZpeCgpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXURpc2FibGUgYWRkaW5nIGBmYS1gIHByZWZpeCBhdXRvbWF0aWNhbGx5IHRvIGBvbnMtaWNvbmAgY2xhc3Nlcy4gVXNlZnVsIHdoZW4gaW5jbHVkaW5nIGN1c3RvbSBpY29uIHBhY2tzLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5vbnMuZGlzYWJsZUljb25BdXRvUHJlZml4ID0gKCkgPT4ge1xuICB1dGlsLmNoZWNrTWlzc2luZ0ltcG9ydCgnSWNvbicpO1xuICBlbGVtZW50cy5JY29uLnNldEF1dG9QcmVmaXgoZmFsc2UpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGZvcmNlUGxhdGZvcm1TdHlsaW5nXG4gKiBAc2lnbmF0dXJlIGZvcmNlUGxhdGZvcm1TdHlsaW5nKHBsYXRmb3JtKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZWZyZXNoIHN0eWxpbmcgZm9yIHRoZSBnaXZlbiBwbGF0Zm9ybS4gT25seSB1c2VmdWwgZm9yIGRlbW9zLiBVc2UgYG9ucy5wbGF0Zm9ybS5zZWxlY3QoLi4uKWAgaW5zdGVhZCBmb3IgZGV2ZWxvcG1lbnQgYW5kIHByb2R1Y3Rpb24uWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhdGZvcm0gTmV3IHBsYXRmb3JtIHRvIHN0eWxlIHRoZSBlbGVtZW50cy5cbiAqL1xub25zLmZvcmNlUGxhdGZvcm1TdHlsaW5nID0gbmV3UGxhdGZvcm0gPT4ge1xuICBvbnMuZW5hYmxlQXV0b1N0eWxpbmcoKTtcbiAgb25zLnBsYXRmb3JtLnNlbGVjdChuZXdQbGF0Zm9ybSB8fCAnaW9zJyk7XG5cbiAgb25zLl91dGlsLmFycmF5RnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLWlmJykge1xuICAgICAgICBlbGVtZW50Ll9wbGF0Zm9ybVVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnRhZ05hbWUubWF0Y2goL15vbnMtL2kpKSB7XG4gICAgICAgIGF1dG9TdHlsZS5wcmVwYXJlKGVsZW1lbnQsIHRydWUpO1xuICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvbnMtdGFiYmFyJykge1xuICAgICAgICAgIGVsZW1lbnQuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBwcmVsb2FkXG4gKiBAc2lnbmF0dXJlIHByZWxvYWQodGVtcGxhdGVQYXRocylcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB0ZW1wbGF0ZVBhdGhzXG4gKiAgIFtlbl1TZXQgb2YgSFRNTCBmaWxlIHBhdGhzIGNvbnRhaW5pbmcgJ29ucy1wYWdlJyBlbGVtZW50cy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1Qcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgdGhlIHRlbXBsYXRlcyBhcmUgY2FjaGVkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TZXBhcmF0ZWQgZmlsZXMgbmVlZCB0byBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kIGFuZCB0aGlzIGNhbiBzbGlnaHRseSBkZWxheSBwdXNoaW5nIG5ldyBwYWdlcy4gVGhpcyBtZXRob2QgcmVxdWVzdHMgYW5kIGNhY2hlcyB0ZW1wbGF0ZXMgZm9yIGxhdGVyIHVzZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xub25zLnByZWxvYWQgPSBmdW5jdGlvbih0ZW1wbGF0ZXMgPSBbXSkge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoKHRlbXBsYXRlcyBpbnN0YW5jZW9mIEFycmF5ID8gdGVtcGxhdGVzIDogW3RlbXBsYXRlc10pLm1hcCh0ZW1wbGF0ZSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHV0aWwudGhyb3coJ0V4cGVjdGVkIHN0cmluZyBhcmd1bWVudHMgYnV0IGdvdCAnICsgdHlwZW9mIHRlbXBsYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGludGVybmFsLmdldFRlbXBsYXRlSFRNTEFzeW5jKHRlbXBsYXRlKTtcbiAgfSkpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZUVsZW1lbnRcbiAqIEBzaWduYXR1cmUgY3JlYXRlRWxlbWVudCh0ZW1wbGF0ZSwgb3B0aW9ucylcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuICogICBbZW5dRWl0aGVyIGFuIEhUTUwgZmlsZSBwYXRoLCBhIGA8dGVtcGxhdGU+YCBpZCBvciBhbiBIVE1MIHN0cmluZyBzdWNoIGFzIGAnPGRpdiBpZD1cImZvb1wiPmhvZ2U8L2Rpdj4nYC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge0Jvb2xlYW58SFRNTEVsZW1lbnR9IFtvcHRpb25zLmFwcGVuZF1cbiAqICAgW2VuXVdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBET00uICBEZWZhdWx0cyB0byBgZmFsc2VgLiBJZiBgdHJ1ZWAgdmFsdWUgaXMgZ2l2ZW4sIGBkb2N1bWVudC5ib2R5YCB3aWxsIGJlIHVzZWQgYXMgdGhlIHRhcmdldC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtvcHRpb25zLmluc2VydEJlZm9yZV1cbiAqICAgW2VuXVJlZmVyZW5jZSBub2RlIHRoYXQgYmVjb21lcyB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoZSBuZXcgbm9kZSAoYG9wdGlvbnMuYXBwZW5kYCBlbGVtZW50KS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fFByb21pc2V9XG4gKiAgIFtlbl1JZiB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgd2FzIGFuIGlubGluZSBIVE1MIHN0cmluZywgaXQgcmV0dXJucyB0aGUgbmV3IGVsZW1lbnQuIE90aGVyd2lzZSwgaXQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IGVsZW1lbnQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUNyZWF0ZSBhIG5ldyBlbGVtZW50IGZyb20gYSB0ZW1wbGF0ZS4gQm90aCBpbmxpbmUgSFRNTCBhbmQgZXh0ZXJuYWwgZmlsZXMgYXJlIHN1cHBvcnRlZCBhbHRob3VnaCB0aGUgcmV0dXJuIHZhbHVlIGRpZmZlcnMuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5jcmVhdGVFbGVtZW50ID0gKHRlbXBsYXRlLCBvcHRpb25zID0ge30pID0+IHtcbiAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS50cmltKCk7XG5cbiAgY29uc3QgY3JlYXRlID0gaHRtbCA9PiB7XG4gICAgY29uc3QgZWxlbWVudCA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KGh0bWwpO1xuICAgIGVsZW1lbnQucmVtb3ZlKCk7XG5cbiAgICBpZiAob3B0aW9ucy5hcHBlbmQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMuYXBwZW5kIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBvcHRpb25zLmFwcGVuZCA6IGRvY3VtZW50LmJvZHk7XG4gICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMuaW5zZXJ0QmVmb3JlIHx8IG51bGwpO1xuICAgICAgb3B0aW9ucy5saW5rIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb3B0aW9ucy5saW5rKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9O1xuXG4gIHJldHVybiB0ZW1wbGF0ZS5jaGFyQXQoMCkgPT09ICc8JyA/IGNyZWF0ZSh0ZW1wbGF0ZSkgOiBpbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jKHRlbXBsYXRlKS50aGVuKGNyZWF0ZSk7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgY3JlYXRlUG9wb3ZlclxuICogQHNpZ25hdHVyZSBjcmVhdGVQb3BvdmVyKHBhZ2UsIFtvcHRpb25zXSlcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gKiAgIFtlbl1QYWdlIG5hbWUuIENhbiBiZSBlaXRoZXIgYW4gSFRNTCBmaWxlIG9yIGEgPHRlbXBsYXRlPiBjb250YWluaW5nIGEgPG9ucy1kaWFsb2c+IGNvbXBvbmVudC5bL2VuXVxuICogICBbamFdcGFnZeOBrlVSTOOBi+OAgeOCguOBl+OBj+OBr2A8dGVtcGxhdGU+YOOBp+Wuo+iogOOBl+OBn+ODhuODs+ODl+ODrOODvOODiOOBrmlk5bGe5oCn44Gu5YCk44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucGFyZW50U2NvcGVdXG4gKiAgIFtlbl1QYXJlbnQgc2NvcGUgb2YgdGhlIGRpYWxvZy4gVXNlZCB0byBiaW5kIG1vZGVscyBhbmQgYWNjZXNzIHNjb3BlIG1ldGhvZHMgZnJvbSB0aGUgZGlhbG9nLlsvZW5dXG4gKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDlhoXjgafliKnnlKjjgZnjgovopqrjgrnjgrPjg7zjg5fjgpLmjIflrprjgZfjgb7jgZnjgILjg4DjgqTjgqLjg63jgrDjgYvjgonjg6Ljg4fjg6vjgoTjgrnjgrPjg7zjg5fjga7jg6Hjgr3jg4Pjg4njgavjgqLjgq/jgrvjgrnjgZnjgovjga7jgavkvb/jgYTjgb7jgZnjgILjgZPjga7jg5Hjg6njg6Hjg7zjgr/jga9Bbmd1bGFySlPjg5DjgqTjg7Pjg4fjgqPjg7PjgrDjgafjga7jgb/liKnnlKjjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVByb21pc2Ugb2JqZWN0IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBvcG92ZXIgY29tcG9uZW50IG9iamVjdC5bL2VuXVxuICogICBbamFd44Od44OD44OX44Kq44O844OQ44O844Gu44Kz44Oz44Od44O844ON44Oz44OI44Kq44OW44K444Kn44Kv44OI44KS6Kej5rG644GZ44KLUHJvbWlzZeOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUNyZWF0ZSBhIHBvcG92ZXIgaW5zdGFuY2UgZnJvbSBhIHRlbXBsYXRlLlsvZW5dXG4gKiAgIFtqYV3jg4bjg7Pjg5fjg6zjg7zjg4jjgYvjgonjg53jg4Pjg5fjgqrjg7zjg5Djg7zjga7jgqTjg7Pjgrnjgr/jg7PjgrnjgpLnlJ/miJDjgZfjgb7jgZnjgIJbL2phXVxuICovXG4vKipcbiAqIEBtZXRob2QgY3JlYXRlRGlhbG9nXG4gKiBAc2lnbmF0dXJlIGNyZWF0ZURpYWxvZyhwYWdlLCBbb3B0aW9uc10pXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICogICBbZW5dUGFnZSBuYW1lLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZmlsZSBvciBhbiBgPHRlbXBsYXRlPmAgY29udGFpbmluZyBhIDxvbnMtZGlhbG9nPiBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVByb21pc2Ugb2JqZWN0IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRpYWxvZyBjb21wb25lbnQgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgpLop6PmsbrjgZnjgotQcm9taXNl44Kq44OW44K444Kn44Kv44OI44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ3JlYXRlIGEgZGlhbG9nIGluc3RhbmNlIGZyb20gYSB0ZW1wbGF0ZS5bL2VuXVxuICogICBbamFd44OG44Oz44OX44Os44O844OI44GL44KJ44OA44Kk44Ki44Ot44Kw44Gu44Kk44Oz44K544K/44Oz44K544KS55Sf5oiQ44GX44G+44GZ44CCWy9qYV1cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZUFsZXJ0RGlhbG9nXG4gKiBAc2lnbmF0dXJlIGNyZWF0ZUFsZXJ0RGlhbG9nKHBhZ2UsIFtvcHRpb25zXSlcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gKiAgIFtlbl1QYWdlIG5hbWUuIENhbiBiZSBlaXRoZXIgYW4gSFRNTCBmaWxlIG9yIGFuIGA8dGVtcGxhdGU+YCBjb250YWluaW5nIGEgPG9ucy1hbGVydC1kaWFsb2c+IGNvbXBvbmVudC5bL2VuXVxuICogICBbamFdcGFnZeOBrlVSTOOBi+OAgeOCguOBl+OBj+OBr2A8dGVtcGxhdGU+YOOBp+Wuo+iogOOBl+OBn+ODhuODs+ODl+ODrOODvOODiOOBrmlk5bGe5oCn44Gu5YCk44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogICBbZW5dUHJvbWlzZSBvYmplY3QgdGhhdCByZXNvbHZlcyB0byB0aGUgYWxlcnQgZGlhbG9nIGNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAqICAgW2phXeODgOOCpOOCouODreOCsOOBruOCs+ODs+ODneODvOODjeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOCkuino+axuuOBmeOCi1Byb21pc2Xjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1DcmVhdGUgYSBhbGVydCBkaWFsb2cgaW5zdGFuY2UgZnJvbSBhIHRlbXBsYXRlLlsvZW5dXG4gKiAgIFtqYV3jg4bjg7Pjg5fjg6zjg7zjg4jjgYvjgonjgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga7jgqTjg7Pjgrnjgr/jg7PjgrnjgpLnlJ/miJDjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMuY3JlYXRlUG9wb3ZlciA9IG9ucy5jcmVhdGVEaWFsb2cgPSBvbnMuY3JlYXRlQWxlcnREaWFsb2cgPSAodGVtcGxhdGUsIG9wdGlvbnMgPSB7fSkgPT4gb25zLmNyZWF0ZUVsZW1lbnQodGVtcGxhdGUsIHsgYXBwZW5kOiB0cnVlLCAuLi5vcHRpb25zIH0pO1xuXG4vKipcbiAqIEBtZXRob2Qgb3BlbkFjdGlvblNoZWV0XG4gKiBAc2lnbmF0dXJlIG9wZW5BY3Rpb25TaGVldChvcHRpb25zKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TaG93cyBhbiBpbnN0YW50IEFjdGlvbiBTaGVldCBhbmQgbGV0cyB0aGUgdXNlciBjaG9vc2UgYW4gYWN0aW9uLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLmJ1dHRvbnNdXG4gKiAgIFtlbl1SZXByZXNlbnQgZWFjaCBidXR0b24gb2YgdGhlIGFjdGlvbiBzaGVldCBmb2xsb3dpbmcgdGhlIHNwZWNpZmllZCBvcmRlci4gRXZlcnkgaXRlbSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIGxhYmVsIG9yIGFuIG9iamVjdCBjb250YWluaW5nIGBsYWJlbGAsIGBpY29uYCBhbmQgYG1vZGlmaWVyYCBwcm9wZXJ0aWVzLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuICogICBbZW5dT3B0aW9uYWwgdGl0bGUgZm9yIHRoZSBhY3Rpb24gc2hlZXQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVzdHJ1Y3RpdmVdXG4gKiAgIFtlbl1PcHRpb25hbCBpbmRleCBvZiB0aGUgXCJkZXN0cnVjdGl2ZVwiIGJ1dHRvbiAob25seSBmb3IgaU9TKS4gSXQgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgYnV0dG9uIGFycmF5IGFzIHdlbGwuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNhbmNlbGFibGVdXG4gKiAgIFtlbl1XaGV0aGVyIHRoZSBhY3Rpb24gc2hlZXQgY2FuIGJlIGNhbmNlbGVkIGJ5IHRhcHBpbmcgb24gdGhlIGJhY2tncm91bmQgbWFzayBvciBub3QuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gKiAgIFtlbl1Nb2RpZmllciBhdHRyaWJ1dGUgb2YgdGhlIGFjdGlvbiBzaGVldC4gRS5nLiBgJ2Rlc3RydWN0aXZlJ2AuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWFza0NvbG9yXVxuICogICBbZW5dT3B0aW9uYWxseSBjaGFuZ2UgdGhlIGJhY2tncm91bmQgbWFzayBjb2xvci5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pZF1cbiAqICAgW2VuXVRoZSBlbGVtZW50J3MgaWQgYXR0cmlidXRlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNsYXNzXVxuICogICBbZW5dVGhlIGVsZW1lbnQncyBjbGFzcyBhdHRyaWJ1dGUuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogICBbZW5dV2lsbCByZXNvbHZlIHdoZW4gdGhlIGFjdGlvbiBzaGVldCBpcyBjbG9zZWQuIFRoZSByZXNvbHZlIHZhbHVlIGlzIGVpdGhlciB0aGUgaW5kZXggb2YgdGhlIHRhcHBlZCBidXR0b24gb3IgLTEgd2hlbiBjYW5jZWxlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xub25zLm9wZW5BY3Rpb25TaGVldCA9IGFjdGlvblNoZWV0O1xuXG4vKipcbiAqIEBtZXRob2QgcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlclxuICogQHNpZ25hdHVyZSByZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyKHBhZ2UpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICogICBbZW5dUGFnZSBuYW1lLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZmlsZSBvciBhIGA8dGVtcGxhdGU+YCBpZC5bL2VuXVxuICogICBbamFdcGFnZeOBrlVSTOOBi+OAgeOCguOBl+OBj+OBr2A8dGVtcGxhdGU+YOOBp+Wuo+iogOOBl+OBn+ODhuODs+ODl+ODrOODvOODiOOBrmlk5bGe5oCn44Gu5YCk44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dSWYgbm8gcGFnZSBpcyBkZWZpbmVkIGZvciB0aGUgYG9ucy1sb2FkaW5nLXBsYWNlaG9sZGVyYCBhdHRyaWJ1dGUgaXQgd2lsbCB3YWl0IGZvciB0aGlzIG1ldGhvZCBiZWluZyBjYWxsZWQgYmVmb3JlIGxvYWRpbmcgdGhlIHBhZ2UuWy9lbl1cbiAqICAgW2phXW9ucy1sb2FkaW5nLXBsYWNlaG9sZGVy44Gu5bGe5oCn5YCk44Go44GX44Gm44Oa44O844K444GM5oyH5a6a44GV44KM44Gm44GE44Gq44GE5aC05ZCI44Gv44CB44Oa44O844K444Ot44O844OJ5YmN44Gr5ZG844Gw44KM44KLb25zLnJlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXLlh6bnkIbjgYzooYzjgo/jgozjgovjgb7jgafooajnpLrjgZXjgozjgb7jgZvjgpPjgIJbL2phXVxuICovXG5vbnMucmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlciA9IChwYWdlLCBsaW5rKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gb25zLl91dGlsLmFycmF5RnJvbSh3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ucy1sb2FkaW5nLXBsYWNlaG9sZGVyXScpKTtcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHV0aWwudGhyb3coJ05vIG9ucy1sb2FkaW5nLXBsYWNlaG9sZGVyIGV4aXN0cycpO1xuICB9XG5cbiAgZWxlbWVudHNcbiAgICAuZmlsdGVyKGVsZW1lbnQgPT4gIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdwYWdlJykpXG4gICAgLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnb25zLWxvYWRpbmctcGxhY2Vob2xkZXInLCBwYWdlKTtcbiAgICAgIG9ucy5fcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlcihlbGVtZW50LCBwYWdlLCBsaW5rKTtcbiAgICB9KTtcbn07XG5cblxub25zLl9zZXR1cExvYWRpbmdQbGFjZUhvbGRlcnMgPSBmdW5jdGlvbigpIHtcbiAgb25zLnJlYWR5KCgpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IG9ucy5fdXRpbC5hcnJheUZyb20od2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbnMtbG9hZGluZy1wbGFjZWhvbGRlcl0nKSk7XG5cbiAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgcGFnZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdvbnMtbG9hZGluZy1wbGFjZWhvbGRlcicpO1xuICAgICAgaWYgKHR5cGVvZiBwYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBvbnMuX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIoZWxlbWVudCwgcGFnZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxub25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyID0gZnVuY3Rpb24ocGFyZW50LCBwYWdlLCBsaW5rID0gKChlbCwgZG9uZSkgPT4gZG9uZSgpKSkge1xuICBwYWdlICYmIG9ucy5jcmVhdGVFbGVtZW50KHBhZ2UpXG4gICAgLnRoZW4oZWxlbWVudCA9PiB7XG4gICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICBsaW5rKGVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgd2hpbGUgKHBhcmVudC5maXJzdENoaWxkICYmIHBhcmVudC5maXJzdENoaWxkICE9PSBlbGVtZW50KSB7XG4gICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKGVycm9yID0+IFByb21pc2UucmVqZWN0KCdVbmFibGVkIHRvIHJlc29sdmUgcGxhY2Vob2xkZXI6ICcgKyBlcnJvcikpO1xufTtcblxuZnVuY3Rpb24gd2FpdERldmljZVJlYWR5KCkge1xuICBjb25zdCB1bmxvY2tEZXZpY2VSZWFkeSA9IG9ucy5fcmVhZHlMb2NrLmxvY2soKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgaWYgKG9ucy5pc1dlYlZpZXcoKSkge1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgdW5sb2NrRGV2aWNlUmVhZHksIHtvbmNlOiB0cnVlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVubG9ja0RldmljZVJlYWR5KCk7XG4gICAgfVxuICB9LCB7b25jZTogdHJ1ZX0pO1xufVxuXG4vKipcbiAqIEBtZXRob2QgZ2V0U2NyaXB0UGFnZVxuICogQHNpZ25hdHVyZSBnZXRTY3JpcHRQYWdlKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQWNjZXNzIHRoZSBsYXN0IGNyZWF0ZWQgcGFnZSBmcm9tIHRoZSBjdXJyZW50IGBzY3JpcHRgIHNjb3BlLiBPbmx5IHdvcmtzIGluc2lkZSBgPHNjcmlwdD48L3NjcmlwdD5gIHRhZ3MgdGhhdCBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIGBvbnMtcGFnZWAgZWxlbWVudC4gVXNlIHRoaXMgdG8gYWRkIGxpZmVjeWNsZSBob29rcyB0byBhIHBhZ2UuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqICAgW2VuXVJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFnZSBlbGVtZW50LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5jb25zdCBnZXRDUyA9ICdjdXJyZW50U2NyaXB0JyBpbiBkb2N1bWVudCA/ICgpID0+IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgOiAoKSA9PiBkb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoIC0gMV07XG5vbnMuZ2V0U2NyaXB0UGFnZSA9ICgpID0+IGdldENTKCkgJiYgL29ucy1wYWdlL2kudGVzdChnZXRDUygpLnBhcmVudEVsZW1lbnQudGFnTmFtZSkgJiYgZ2V0Q1MoKS5wYXJlbnRFbGVtZW50IHx8IG51bGw7XG5cbmV4cG9ydCBkZWZhdWx0IG9ucztcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRDbGFzcygpIHtcbiAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ2Z1bmN0aW9uJykgeyAvLyBjYXNlIG9mIFNhZmFyaVxuICAgIGNvbnN0IEJhc2VFbGVtZW50ID0gKCkgPT4ge307XG4gICAgQmFzZUVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcmV0dXJuIEJhc2VFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBIVE1MRWxlbWVudDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlRWxlbWVudCBleHRlbmRzIGdldEVsZW1lbnRDbGFzcygpIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgb3JpZW50YXRpb24gZnJvbSAnLi4vb25zL29yaWVudGF0aW9uLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9vbnMvcGxhdGZvcm0uanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWlmXG4gKiBAY2F0ZWdvcnkgY29uZGl0aW9uYWxcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9pZlxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDb25kaXRpb25hbGx5IGRpc3BsYXkgY29udGVudCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLCBkZXZpY2Ugb3JpZW50YXRpb24gb3IgYm90aC5cbiAqXG4gKiAgICAgU29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0byBjb25kaXRpb25hbGx5IGhpZGUgb3Igc2hvdyBjZXJ0YWluIGNvbXBvbmVudHMgYmFzZWQgb24gcGxhdGZvcm0uIFdoZW4gcnVubmluZyBvbiBpT1MgdGhlIGA8b25zLWlmPmAgZWxlbWVudCBjYW4gYmUgdXNlZCB0byBoaWRlIHRoZSBgPG9ucy1mYWI+YCBlbGVtZW50LlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjY3Jvc3MtcGxhdGZvcm0tc3R5bGluZy1hdXRvc3R5bGluZyBbZW5dSW5mb3JtYXRpb24gYWJvdXQgY3Jvc3MgcGxhdGZvcm0gc3R5bGluZ1svZW5dW2phXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcGFnZT5cbiAqICAgPG9ucy1pZiBvcmllbnRhdGlvbj1cImxhbmRzY2FwZVwiPlxuICogICAgIExhbmRzY2FwZSB2aWV3IVxuICogICA8L29ucy1pZj5cbiAqICAgPG9ucy1pZiBwbGF0Zm9ybT1cImFuZHJvaWRcIj5cbiAqICAgICBUaGlzIGlzIEFuZHJvaWQuXG4gKiAgIDwvb25zLWlmPlxuICogICA8b25zLWlmIHBsYXRmb3JtPVwiaW9zIG90aGVyXCI+XG4gKiAgICAgVGhpcyBpcyBub3QgQW5kcm9pZC5cbiAqICAgPC9vbnMtaWY+XG4gKiA8L29ucy1wYWdlPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJZkVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcGxhdGZvcm1cbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwYWNlLXNlcGFyYXRlZCBwbGF0Zm9ybSBuYW1lcy4gUG9zc2libGUgdmFsdWVzIGFyZSBgXCJpb3NcImAsIGBcImFuZHJvaWRcImAsIGBcIndpbmRvd3NcImAgYW5kIGBcIm90aGVyXCJgLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgb3JpZW50YXRpb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dRWl0aGVyIGBcInBvcnRyYWl0XCJgIG9yIGBcImxhbmRzY2FwZVwiYC5bL2VuXVxuICAgKiAgW2phXXBvcnRyYWl044KC44GX44GP44GvbGFuZHNjYXBl44KS5oyH5a6a44GX44G+44GZWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICBpZiAocGxhdGZvcm0uX2dldFNlbGVjdGVkUGxhdGZvcm0oKSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wbGF0Zm9ybVVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNBbGxvd2VkUGxhdGZvcm0oKSkge1xuICAgICAgICB3aGlsZSAodGhpcy5jaGlsZE5vZGVzWzBdKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZE5vZGVzWzBdLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BsYXRmb3JtVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbk9yaWVudGF0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBvcmllbnRhdGlvbi5vbignY2hhbmdlJywgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ29yaWVudGF0aW9uJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSkge1xuICAgIGlmIChuYW1lID09PSAnb3JpZW50YXRpb24nKSB7XG4gICAgICB0aGlzLl9vbk9yaWVudGF0aW9uQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgb3JpZW50YXRpb24ub2ZmKCdjaGFuZ2UnLCB0aGlzLl9vbk9yaWVudGF0aW9uQ2hhbmdlKTtcbiAgfVxuXG4gIF9wbGF0Zm9ybVVwZGF0ZSgpIHtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9pc0FsbG93ZWRQbGF0Zm9ybSgpID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBfaXNBbGxvd2VkUGxhdGZvcm0oKSB7XG4gICAgcmV0dXJuICF0aGlzLmdldEF0dHJpYnV0ZSgncGxhdGZvcm0nKSB8fCB0aGlzLmdldEF0dHJpYnV0ZSgncGxhdGZvcm0nKS5zcGxpdCgvXFxzKy8pLmluZGV4T2YocGxhdGZvcm0uZ2V0TW9iaWxlT1MoKSkgPj0gMDtcbiAgfVxuXG4gIF9vbk9yaWVudGF0aW9uQ2hhbmdlKCkge1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnb3JpZW50YXRpb24nKSAmJiB0aGlzLl9pc0FsbG93ZWRQbGF0Zm9ybSgpKSB7XG4gICAgICBjb25zdCBjb25kaXRpb25hbE9yaWVudGF0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ29yaWVudGF0aW9uJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uLmlzUG9ydHJhaXQoKSA/ICdwb3J0cmFpdCcgOiAnbGFuZHNjYXBlJztcblxuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gKGNvbmRpdGlvbmFsT3JpZW50YXRpb24gPT09IGN1cnJlbnRPcmllbnRhdGlvbikgPyAnJyA6ICdub25lJztcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuSWYgPSBJZkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1pZicsIElmRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuL3V0aWwuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlQW5pbWF0b3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudGltaW5nID0gb3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcic7XG4gICAgdGhpcy5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gfHwgMDtcbiAgICB0aGlzLmRlbGF5ID0gb3B0aW9ucy5kZWxheSB8fCAwO1xuXG4gICAgdGhpcy5kZWYgPSB7XG4gICAgICB0aW1pbmc6IHRoaXMudGltaW5nLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBkZWxheTogdGhpcy5kZWxheVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZXh0ZW5kKHByb3BlcnRpZXMgPSB7fSkge1xuICAgIGNvbnN0IGV4dGVuZGVkQW5pbWF0b3IgPSB0aGlzO1xuICAgIGNvbnN0IG5ld0FuaW1hdG9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBleHRlbmRlZEFuaW1hdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB1dGlsLmV4dGVuZCh0aGlzLCBwcm9wZXJ0aWVzKTtcbiAgICB9O1xuXG4gICAgbmV3QW5pbWF0b3IucHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG4gICAgcmV0dXJuIG5ld0FuaW1hdG9yO1xuICB9XG59XG5cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbi8vIFRoaXMgb2JqZWN0IHNob3VsZCBub3QgYmUgZXhwb3NlZCB0byB1c2Vycy4gUGxlYXNlIGtlZXAgdGhpcyBwcml2YXRlLlxuY29uc3QgaVBob25lWFBhdGNoID0ge307XG5cbmlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlID0gKCkgPT4ge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnb25zZmxhZy1pcGhvbmV4LXBvcnRyYWl0JykgIT0gbnVsbCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IHdpbmRvdy5pbm5lckhlaWdodDtcbn07XG5cbmlQaG9uZVhQYXRjaC5pc0lQaG9uZVhMYW5kc2NhcGVQYXRjaEFjdGl2ZSA9ICgpID0+IHtcbiAgLy8gSWYgd2lkdGggPT09IGhlaWdodCwgdHJlYXQgaXQgYXMgbGFuZHNjYXBlXG4gIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdvbnNmbGFnLWlwaG9uZXgtbGFuZHNjYXBlJykgIT0gbnVsbCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+PSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHNhZmUgYXJlYSBsZW5ndGhzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzYWZlIGFyZWFzLlxuICovXG5pUGhvbmVYUGF0Y2guZ2V0U2FmZUFyZWFMZW5ndGhzID0gKCkgPT4ge1xuICBsZXQgc2FmZUFyZWFMZW5ndGhzO1xuICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgIHNhZmVBcmVhTGVuZ3RocyA9IHtcbiAgICAgIHRvcDogNDQsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMzQsXG4gICAgICBsZWZ0OiAwXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUoKSkge1xuICAgIHNhZmVBcmVhTGVuZ3RocyA9IHtcbiAgICAgIHRvcDogMCxcbiAgICAgIHJpZ2h0OiA0NCxcbiAgICAgIGJvdHRvbTogMjEsXG4gICAgICBsZWZ0OiA0NFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgc2FmZUFyZWFMZW5ndGhzID0ge1xuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzYWZlQXJlYUxlbmd0aHM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHNhZmUgYXJlYSByZWN0IGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzYWZlIGFyZWFzLlxuICovXG5pUGhvbmVYUGF0Y2guZ2V0U2FmZUFyZWFET01SZWN0ID0gKCkgPT4ge1xuICBsZXQgc2FmZUFyZWFSZWN0O1xuICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgIHNhZmVBcmVhUmVjdCA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiA0NCwgLyogMCArIDQ0ICh0b3Agc2FmZSBhcmVhKSAqL1xuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSA3OCAvKiBoZWlnaHQgLSA0NCAodG9wIHNhZmUgYXJlYSkgLSAzNCAoYm90dG9tIHNhZmUgYXJlYSkgKi9cbiAgICB9O1xuICB9IGVsc2UgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhMYW5kc2NhcGVQYXRjaEFjdGl2ZSgpKSB7XG4gICAgc2FmZUFyZWFSZWN0ID0ge1xuICAgICAgeDogNDQsIC8qIDAgKyA0NCAobGVmdCBzYWZlIGFyZWEpICovXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoIC0gODgsIC8qIHdpZHRoIC0gNDQgKGxlZnQgc2FmZSBhcmVhKSAtIDM0IChyaWdodCBzYWZlIGFyZWEpICovXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCAtIDIxIC8qIGhlaWdodCAtIDIxIChib3R0b20gc2FmZSBhcmVhKSAqL1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgc2FmZUFyZWFSZWN0ID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnNhZmVBcmVhUmVjdCxcbiAgICBsZWZ0OiBzYWZlQXJlYVJlY3QueCxcbiAgICB0b3A6IHNhZmVBcmVhUmVjdC55LFxuICAgIHJpZ2h0OiBzYWZlQXJlYVJlY3QueCArIHNhZmVBcmVhUmVjdC53aWR0aCxcbiAgICBib3R0b206IHNhZmVBcmVhUmVjdC55ICsgc2FmZUFyZWFSZWN0LmhlaWdodFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaVBob25lWFBhdGNoO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuaW1wb3J0IGlQaG9uZVhQYXRjaCBmcm9tICcuLi8uLi9vbnMvaXBob25leC1wYXRjaC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25TaGVldEFuaW1hdG9yIGV4dGVuZHMgQmFzZUFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBzaG93KGRpYWxvZywgZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgaGlkZShkaWFsb2csIGRvbmUpIHtcbiAgICBkb25lKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbmRyb2lkIHN0eWxlIGFuaW1hdG9yIGZvciBBY3Rpb24gU2hlZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNREFjdGlvblNoZWV0QW5pbWF0b3IgZXh0ZW5kcyBBY3Rpb25TaGVldEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWluZyA9ICdlYXNlJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuNCB9ID0ge30pIHtcbiAgICBzdXBlcih7dGltaW5nLCBkZWxheSwgZHVyYXRpb259KTtcblxuICAgIHRoaXMubWFza1RpbWluZyA9ICdsaW5lYXInO1xuICAgIHRoaXMubWFza0R1cmF0aW9uID0gMC4yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgIC5xdWV1ZSh7IG9wYWNpdHk6IDAgfSlcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMS4wIH0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5tYXNrRHVyYXRpb24sXG4gICAgICAgICAgdGltaW5nOiB0aGlzLm1hc2tUaW1pbmdcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX3NoZWV0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCA4MCUsIDApYCwgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAucXVldWUoeyBvcGFjaXR5OiAxIH0pXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7IG9wYWNpdHk6IDAgfSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLm1hc2tEdXJhdGlvbixcbiAgICAgICAgICB0aW1pbmc6IHRoaXMubWFza1RpbWluZ1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fc2hlZXQsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogMSB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgODAlLCAwKWAsIG9wYWNpdHk6IDAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBJT1NBY3Rpb25TaGVldEFuaW1hdG9yIGV4dGVuZHMgQWN0aW9uU2hlZXRBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3IoeyB0aW1pbmcgPSAnZWFzZScsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjMgfSA9IHt9KSB7XG4gICAgc3VwZXIoe3RpbWluZywgZGVsYXksIGR1cmF0aW9ufSk7XG5cbiAgICB0aGlzLm1hc2tUaW1pbmcgPSAnbGluZWFyJztcbiAgICB0aGlzLm1hc2tEdXJhdGlvbiA9IDAuMjtcbiAgICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgICAgdGhpcy5saWZ0QW1vdW50ID0gJ2NhbGMoMTAwJSArIDQ4cHgpJztcbiAgICB9IGVsc2UgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhMYW5kc2NhcGVQYXRjaEFjdGl2ZSgpKSB7XG4gICAgICB0aGlzLmxpZnRBbW91bnQgPSAnY2FsYygxMDAlICsgMzNweCknO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxpZnRBbW91bnQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAvIDIuMCAtIDEgKyAncHgnOyAvLyBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAucXVldWUoeyBvcGFjaXR5OiAwIH0pXG4gICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMSB9LCB7XG4gICAgICAgIGR1cmF0aW9uOiB0aGlzLm1hc2tEdXJhdGlvbixcbiAgICAgICAgdGltaW5nOiB0aGlzLm1hc2tUaW1pbmdcbiAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9zaGVldCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgJHt0aGlzLmxpZnRBbW91bnR9LCAwKWAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgIC5xdWV1ZSh7IG9wYWNpdHk6IDEgfSlcbiAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAucXVldWUoeyBvcGFjaXR5OiAwIH0sIHtcbiAgICAgICAgZHVyYXRpb246IHRoaXMubWFza0R1cmF0aW9uLFxuICAgICAgICB0aW1pbmc6IHRoaXMubWFza1RpbWluZ1xuICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX3NoZWV0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5saWZ0QW1vdW50fSwgMClgIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi8uLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgRG9vckxvY2sgZnJvbSAnLi4vLi4vb25zL2Rvb3Jsb2NrLmpzJztcbmltcG9ydCBkZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciBmcm9tICcuLi8uLi9vbnMvaW50ZXJuYWwvZGV2aWNlLWJhY2stYnV0dG9uLWRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi8uLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VEaWFsb2dFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGdldCBfc2NoZW1lKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIF90b2dnbGVTdHlsZShzaG91bGRTaG93KSB7XG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gc2hvdWxkU2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VEaWFsb2dFbGVtZW50KSB7XG4gICAgICB1dGlsLnRocm93QWJzdHJhY3QoKTtcbiAgICB9XG5cbiAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5fZG9vckxvY2sgPSBuZXcgRG9vckxvY2soKTtcbiAgICB0aGlzLl9jYW5jZWwgPSB0aGlzLl9jYW5jZWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zZWxmQ2FtZWxOYW1lID0gdXRpbC5jYW1lbGl6ZSh0aGlzLnRhZ05hbWUuc2xpY2UoNCkpO1xuICAgIHRoaXMuX2RlZmF1bHREQkIgPSBlID0+IHRoaXMuY2FuY2VsYWJsZSA/IHRoaXMuX2NhbmNlbCgpIDogZS5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgIHRoaXMuX2FuaW1hdG9yRmFjdG9yeSA9IHRoaXMuX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpO1xuICB9XG5cbiAgZ2V0IG9uRGV2aWNlQmFja0J1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja0J1dHRvbkhhbmRsZXI7XG4gIH1cblxuICBzZXQgb25EZXZpY2VCYWNrQnV0dG9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyKSB7XG4gICAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYmFja0J1dHRvbkNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIgPSBkZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlci5jcmVhdGVIYW5kbGVyKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIF9jYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsYWJsZSAmJiAhdGhpcy5fcnVubmluZykge1xuICAgICAgdGhpcy5fcnVubmluZyA9IHRydWU7XG4gICAgICB0aGlzLmhpZGUoKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ2RpYWxvZ2NhbmNlbCcpO1xuICAgICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdkaWFsb2ctY2FuY2VsJyk7ICAvLyBkaWFsb2ctY2FuY2VsIGlzIGRlcHJlY2F0ZWQgYnV0IHN0aWxsIGVtaXQgdG8gYXZvaWQgYnJlYWtpbmcgdXNlciBjb2RlXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB0aGlzLl9ydW5uaW5nID0gZmFsc2VcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzaG93KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0VmlzaWJsZSh0cnVlLCAuLi5hcmdzKS50aGVuKGRpYWxvZyA9PiB7XG4gICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9KTtcbiAgfVxuXG4gIGhpZGUoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLl9zZXRWaXNpYmxlKGZhbHNlLCAuLi5hcmdzKS50aGVuKGRpYWxvZyA9PiB7XG4gICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGUoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLl9zZXRWaXNpYmxlKCF0aGlzLnZpc2libGUsIC4uLmFyZ3MpLnRoZW4oZGlhbG9nID0+IHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuX3Zpc2libGU7XG4gICAgICByZXR1cm4gZGlhbG9nO1xuICAgIH0pO1xuICB9XG5cbiAgX3NldFZpc2libGUoc2hvdWxkU2hvdywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgYWN0aW9uID0gc2hvdWxkU2hvdyA/ICdzaG93JyA6ICdoaWRlJztcblxuICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnMgPSB1dGlsLmV4dGVuZChcbiAgICAgIG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9ucyB8fCB7fSxcbiAgICAgIHRoaXMuYW5pbWF0aW9uT3B0aW9uc1xuICAgICk7XG5cbiAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgYHByZSR7YWN0aW9ufWAsIHsgLy8gcHJlc2hvdyBwcmVoaWRlXG4gICAgICBbdGhpcy5fc2VsZkNhbWVsTmFtZV06IHRoaXMsXG4gICAgICBjYW5jZWw6ICgpID0+IGNhbmNlbGVkID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoYENhbmNlbGVkIGluIHByZSR7YWN0aW9ufSBldmVudC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHtcbiAgICAgICAgY29uc3QgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpO1xuICAgICAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zKTtcblxuICAgICAgICBzaG91bGRTaG93ICYmIHRoaXMuX3RvZ2dsZVN0eWxlKHRydWUsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl92aXNpYmxlID0gc2hvdWxkU2hvdztcbiAgICAgICAgdXRpbC5pb3NQYWdlU2Nyb2xsRml4KHNob3VsZFNob3cpO1xuXG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgYW5pbWF0b3JbYWN0aW9uXSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAhc2hvdWxkU2hvdyAmJiB0aGlzLl90b2dnbGVTdHlsZShmYWxzZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHVubG9jaygpO1xuXG4gICAgICAgICAgICB1dGlsLnByb3BhZ2F0ZUFjdGlvbih0aGlzLCAnXycgKyBhY3Rpb24pO1xuICAgICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdwb3N0JyArIGFjdGlvbiwge1t0aGlzLl9zZWxmQ2FtZWxOYW1lXTogdGhpc30pOyAvLyBwb3N0c2hvdyBwb3N0aGlkZVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2sodGhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBtYXNrQ29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdtYXNrLWNvbG9yJyk7XG4gIH1cblxuICBzZXQgbWFza0NvbG9yKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdtYXNrLWNvbG9yJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdtYXNrLWNvbG9yJywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbmltYXRpb25PcHRpb25zKCkge1xuICAgIHJldHVybiBBbmltYXRvckZhY3RvcnkucGFyc2VBbmltYXRpb25PcHRpb25zU3RyaW5nKHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpKTtcbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVNYXNrKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fbWFzaykge1xuICAgICAgICB0aGlzLl9tYXNrLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubWFza0NvbG9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdGlvbigpIHtcbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSB0aGlzLl91cGRhdGVBbmltYXRvckZhY3RvcnkoKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fYmFja0J1dHRvbkNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm9uRGV2aWNlQmFja0J1dHRvbiA9IHRoaXMuX2JhY2tCdXR0b25DYWxsYmFjaztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9kZWZhdWx0REJCID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm9uRGV2aWNlQmFja0J1dHRvbiA9IHRoaXMuX2RlZmF1bHREQkIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX21hc2spIHtcbiAgICAgICAgdGhpcy5fbWFzay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NhbmNlbCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyKSB7XG4gICAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21hc2spIHtcbiAgICAgIHRoaXMuX21hc2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jYW5jZWwsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdhbmltYXRpb24nLCAnbWFzay1jb2xvcicsICd2aXNpYmxlJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbmltYXRpb24nOlxuICAgICAgICB0aGlzLl91cGRhdGVBbmltYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtYXNrLWNvbG9yJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlTWFzaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Zpc2libGUnOlxuICAgICAgICBpZiAodGhpcy52aXNpYmxlICE9PSB0aGlzLl92aXNpYmxlKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBtYXNrIGFuZCBhbmltYXRpb24gZWFybHkgaW4gY2FzZSBgdmlzaWJsZWAgYXR0cmlidXRlXG4gICAgICAgICAgLy8gY2hhbmdlZCBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGBhbmltYXRpb25gIG9yIGBtYXNrLWNvbG9yYFxuICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hc2soKTtcbiAgICAgICAgICB0aGlzLl91cGRhdGVBbmltYXRpb24oKTtcblxuICAgICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZXRWaXNpYmxlKHRoaXMudmlzaWJsZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncHJlc2hvdycsICdwb3N0c2hvdycsICdwcmVoaWRlJywgJ3Bvc3RoaWRlJywgJ2RpYWxvZ2NhbmNlbCcsICdkaWFsb2ctY2FuY2VsJ107XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhCYXNlRGlhbG9nRWxlbWVudCwgWyd2aXNpYmxlJywgJ2Rpc2FibGVkJywgJ2NhbmNlbGFibGUnXSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IHsgQWN0aW9uU2hlZXRBbmltYXRvciwgSU9TQWN0aW9uU2hlZXRBbmltYXRvciwgTURBY3Rpb25TaGVldEFuaW1hdG9yIH0gZnJvbSAnLi9vbnMtYWN0aW9uLXNoZWV0L2FuaW1hdG9yLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9vbnMvcGxhdGZvcm0uanMnO1xuaW1wb3J0IEJhc2VEaWFsb2dFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWRpYWxvZy5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnLmFjdGlvbi1zaGVldCc6ICdhY3Rpb24tc2hlZXQtLSonLFxuICAnLmFjdGlvbi1zaGVldC1tYXNrJzogJ2FjdGlvbi1zaGVldC1tYXNrLS0qJyxcbiAgJy5hY3Rpb24tc2hlZXQtdGl0bGUnOiAnYWN0aW9uLXNoZWV0LXRpdGxlLS0qJ1xufTtcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgJ2RlZmF1bHQnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBwbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IE1EQWN0aW9uU2hlZXRBbmltYXRvciA6IElPU0FjdGlvblNoZWV0QW5pbWF0b3I7IH0sXG4gICdub25lJzogQWN0aW9uU2hlZXRBbmltYXRvclxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYWN0aW9uLXNoZWV0XG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEFjdGlvbi9ib3R0b20gc2hlZXQgdGhhdCBpcyBkaXNwbGF5ZWQgb24gdG9wIG9mIGN1cnJlbnQgc2NyZWVuLlxuICpcbiAqICAgICBUaGlzIGVsZW1lbnQgY2FuIGVpdGhlciBiZSBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgYDxib2R5PmAgb3IgZHluYW1pY2FsbHkgY3JlYXRlZCBmcm9tIGEgdGVtcGxhdGUgdXNpbmcgdGhlIGBvbnMuY3JlYXRlRWxlbWVudCh0ZW1wbGF0ZSwgeyBhcHBlbmQ6IHRydWUgfSlgIHV0aWxpdHkgZnVuY3Rpb24gYW5kIHRoZSBgPHRlbXBsYXRlPmAgdGFnLlxuICpcbiAqICAgICBUaGUgYWN0aW9uIHNoZWV0IGlzIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBhIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgYXNraW5nIHRoZSB1c2VyIHRvIG1ha2UgYSBkZWNpc2lvbi4gQSBgb25zLWFjdGlvbi1zaGVldC1idXR0b25gIGlzIHByb3ZpZGVkIGZvciB0aGlzIHB1cnBvc2UsIGFsdGhvdWdoIGl0IGNhbiBjb250YWluIGFueSB0eXBlIG9mIGNvbnRlbnQuXG4gKlxuICogICAgIEl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNwbGF5ZWQgYXMgTWF0ZXJpYWwgRGVzaWduIChib3R0b20gc2hlZXQpIHdoZW4gcnVubmluZyBvbiBhbiBBbmRyb2lkIGRldmljZS5cbiAqICAgWy9lbl1cbiAqICAgW2phXVxuICogICAgIOOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOOAgeOCguOBl+OBj+OBr+ODnOODiOODoOOCt+ODvOODiOOCkuePvuWcqOOBruOCueOCr+ODquODvOODs+S4iuOBq+ihqOekuuOBl+OBvuOBmeOAglxuICpcbiAqICAgICDjgZPjga7opoHntKDjga/jgIFgPGJvZHk+YOimgee0oOOBq+ebtOaOpeOCouOCv+ODg+ODgeOBleOCjOOCi+OBi+OAgeOCguOBl+OBj+OBr2BvbnMuY3JlYXRlRWxlbWVudCh0ZW1wbGF0ZSwgeyBhcHBlbmQ6IHRydWUgfSlg44GoYDx0ZW1wbGF0ZT5g44K/44Kw44KS5L2/44Gj44Gm44OG44Oz44OX44Os44O844OI44GL44KJ5YuV55qE44Gr55Sf5oiQ44GV44KM44G+44GZ44CCXG4gKlxuICogICAgIOOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOOBr+OAgemBuOaKnuiCouOBruODquOCueODiOOCkuihqOekuuOBl+OBpuODpuODvOOCtuODvOOBq+Wwi+OBreOCi+OBruOBq+S+v+WIqeOBp+OBmeOAgmBvbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbmDjga/jgIHjgZPjga7opoHntKDjga7kuK3jgavnva7jgY/jgZ/jgoHjgavmj5DkvpvjgZXjgozjgabjgYTjgb7jgZnjgYzjgIHjgZ3jgozku6XlpJbjgavjgoLku5bjga7jganjga7jgojjgYbjgaropoHntKDjgpLlkKvjgoDjgZPjgajjgYzjgafjgY3jgb7jgZnjgIJcbiAqXG4gKiAgICAgQW5kcm9pZOODh+ODkOOCpOOCueOBp+Wun+ihjOOBleOCjOOCi+OBqOOBjeOBq+OBr+OAgeiHquWLleeahOOBq+ODnuODhuODquOCouODq+ODh+OCtuOCpOODsyjjg5zjg4jjg6Djgrfjg7zjg4gp44Go44GX44Gm6KGo56S644GV44KM44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXURpc3BsYXkgYSBNYXRlcmlhbCBEZXNpZ24gYm90dG9tIHNoZWV0LlsvZW5dXG4gKiAgIFtqYV3jg57jg4bjg6rjgqLjg6vjg4fjgrbjgqTjg7Pjga7jg5zjg4jjg6Djgrfjg7zjg4jjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvcmVmZXJlbmNlL2FjdGlvbi1zaGVldFxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtcG9wb3ZlclxuICogICBbZW5dYDxvbnMtcG9wb3Zlcj5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtcG9wb3ZlcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbW9kYWxcbiAqICAgW2VuXWA8b25zLW1vZGFsPmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1tb2RhbOOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1hY3Rpb24tc2hlZXQgaWQ9XCJzaGVldFwiPlxuICogICA8b25zLWFjdGlvbi1zaGVldC1idXR0b24+TGFiZWw8L29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPlxuICogICA8b25zLWFjdGlvbi1zaGVldC1idXR0b24+TGFiZWw8L29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPlxuICogPC9vbnMtYWN0aW9uLXNoZWV0PlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGVldCcpLnNob3coKTtcbiAqIDwvc2NyaXB0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY3Rpb25TaGVldEVsZW1lbnQgZXh0ZW5kcyBCYXNlRGlhbG9nRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBldmVudCBwcmVzaG93XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIGFjdGlvbiBzaGVldCBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hY3Rpb25TaGVldFxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCB0aGUgYWN0aW9uIHNoZWV0IGZyb20gYmVpbmcgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGFjdGlvbiBzaGVldCBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOBn+ebtOW+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hY3Rpb25TaGVldFxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlaGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBhY3Rpb24gc2hlZXQgaXMgaGlkZGVuLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWN0aW9uU2hlZXRcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIHRvIHN0b3AgdGhlIGFjdGlvbiBzaGVldCBmcm9tIGJlaW5nIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHjg4DjgqTjgqLjg63jgrDjga7pnZ7ooajnpLrjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgYWN0aW9uIHNoZWV0IGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFjdGlvblNoZWV0XG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBkaWFsb2djYW5jZWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCB3aGVuIHRoZSBhY3Rpb24gc2hlZXQgaXMgY2FuY2VsZWQuWy9lbl1cbiAgICogW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHRpdGxlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXU9wdGlvbmFsIHRpdGxlIG9mIHRoZSBhY3Rpb24gc2hlZXQuIEEgbmV3IGVsZW1lbnQgd2lsbCBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgdGhpcyBzdHJpbmcuWy9lbl1cbiAgICogIFtqYV3jgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjga7jgr/jgqTjg4jjg6vjgpLmjIflrprjgZfjgb7jgZnjgILjgZPjgZPjgafmjIflrprjgZfjgZ/mloflrZfliJfjgpLlkKvjgoDmlrDjgZfjgYTopoHntKDjgYzkvZzmiJDjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHRpdGxlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXU9wdGlvbmFsIHRpdGxlIG9mIHRoZSBhY3Rpb24gc2hlZXQuIEEgbmV3IGVsZW1lbnQgd2lsbCBiZSBjcmVhdGVkIGNvbnRhaW5pbmcgdGhpcyBzdHJpbmcuWy9lbl1cbiAgICogIFtqYV3jgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjga7jgr/jgqTjg4jjg6vjgpLmjIflrprjgZfjgb7jgZnjgILjgZPjgZPjgafmjIflrprjgZfjgZ/mloflrZfliJfjgpLlkKvjgoDmlrDjgZfjgYTopoHntKDjgYzkvZzmiJDjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgYWN0aW9uIHNoZWV0LlsvZW5dXG4gICAqICBbamFd44OA44Kk44Ki44Ot44Kw44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgY2FuY2VsYWJsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGFjdGlvbiBzaGVldCBjYW4gYmUgY2xvc2VkIGJ5IHRhcHBpbmcgdGhlIGJhY2tncm91bmQgb3IgYnkgcHJlc3NpbmcgdGhlIGJhY2sgYnV0dG9uIG9uIEFuZHJvaWQgZGV2aWNlcy5bL2VuXVxuICAgKiAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOCi+OBqOOAgeOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOOBruiDjOaZr+OChEFuZHJvaWTjg4fjg5DjgqTjgrnjga7jg5Djg4Pjgq/jg5zjgr/jg7PjgpLmjqjjgZnjgZPjgajjgafjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjgYzplonjgZjjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGFjdGlvbiBzaGVldCBpcyBkaXNhYmxlZC5bL2VuXVxuICAgKiAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeODgOOCpOOCouODreOCsOOBr2Rpc2FibGVk54q25oWL44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IGRlZmF1bHRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gc2hvd2luZyBhbmQgaGlkaW5nIHRoZSBhY3Rpb24gc2hlZXQuIENhbiBiZSBlaXRoZXIgYFwibm9uZVwiYCBvciBgXCJkZWZhdWx0XCJgLlsvZW5dXG4gICAqICBbamFd44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GZ44KL6Zqb44Gu44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCLjgoLjgZfjgY/jga9cImRlZmF1bHRcIuOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtYXNrLWNvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIGBcInJnYmEoMCwgMCwgMCwgMC4yKVwiYC5bL2VuXVxuICAgKiAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglwicmdiYSgwLCAwLCAwLCAwLjIpXCLjgYzjg4fjg5Xjgqnjg6vjg4jlgKTjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgYWN0aW9uIHNoZWV0IGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeimgee0oOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX21hc2soKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuYWN0aW9uLXNoZWV0LW1hc2snKTtcbiAgfVxuXG4gIGdldCBfc2hlZXQoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuYWN0aW9uLXNoZWV0Jyk7XG4gIH1cblxuICBnZXQgX3RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5hY3Rpb24tc2hlZXQtdGl0bGUnKTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgYW5pbWF0b3JzOiBfYW5pbWF0b3JEaWN0LFxuICAgICAgYmFzZUNsYXNzOiBBY3Rpb25TaGVldEFuaW1hdG9yLFxuICAgICAgYmFzZUNsYXNzTmFtZTogJ0FjdGlvblNoZWV0QW5pbWF0b3InLFxuICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpXG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLnN0eWxlLnpJbmRleCA9IDEwMDAxO1xuXG4gICAgLyogRXhwZWN0ZWQgcmVzdWx0OlxuICAgICAqICAgPG9ucy1hY3Rpb24tc2hlZXQ+XG4gICAgICogICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tc2hlZXQtbWFza1wiPjwvZGl2PlxuICAgICAqICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXNoZWV0XCI+XG4gICAgICogICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1zaGVldC10aXRsZT48L2Rpdj5cbiAgICAgKiAgICAgICAuLi5cbiAgICAgKiAgICAgPC9kaXY+XG4gICAgICogICA8L29ucy1hY3Rpb24tc2hlZXQ+XG4gICAgICovXG5cbiAgICBpZiAoIXRoaXMuX3NoZWV0KSB7XG4gICAgICBjb25zdCBzaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgc2hlZXQuY2xhc3NMaXN0LmFkZCgnYWN0aW9uLXNoZWV0Jyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgc2hlZXQuYXBwZW5kQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBlbmRDaGlsZChzaGVldCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRpdGxlLmNsYXNzTGlzdC5hZGQoJ2FjdGlvbi1zaGVldC10aXRsZScpO1xuICAgICAgaWYgKHRoaXMudGl0bGUpIHtcbiAgICAgICAgdGl0bGUuaW5uZXJIVE1MID0gdGhpcy50aXRsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpdGxlLmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9zaGVldC5pbnNlcnRCZWZvcmUodGl0bGUsIHRoaXMuX3NoZWV0LmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fbWFzaykge1xuICAgICAgY29uc3QgbWFzayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbWFzay5jbGFzc0xpc3QuYWRkKCdhY3Rpb24tc2hlZXQtbWFzaycpO1xuICAgICAgdGhpcy5pbnNlcnRCZWZvcmUobWFzaywgdGhpcy5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zaGVldC5zdHlsZS56SW5kZXggPSAyMDAwMTtcbiAgICB0aGlzLl9tYXNrLnN0eWxlLnpJbmRleCA9IDIwMDAwO1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgX3VwZGF0ZVRpdGxlKCkge1xuICAgIGlmICh0aGlzLl90aXRsZSkge1xuICAgICAgaWYgKCF0aGlzLnRpdGxlKSB7XG4gICAgICAgIHRoaXMuX3RpdGxlLmhpZGRlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl90aXRsZS5pbm5lckhUTUwgPSB0aGlzLnRpdGxlO1xuICAgICAgICB0aGlzLl90aXRsZS5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgdGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICB9XG5cbiAgc2V0IHRpdGxlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGl0bGUnLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtYXNrQ29sb3JcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgcmdiYSgwLCAwLCAwLCAwLjIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgXCJyZ2JhKDAsIDAsIDAsIDAuMilcIi5bL2VuXVxuICAgKiAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglwicmdiYSgwLCAwLCAwLCAwLjIpXCLjgYzjg4fjg5Xjgqnjg6vjg4jlgKTjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdyhbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcIm5vbmVcImAgYW5kIGBcInNsaWRlXCJgLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwiLCBcInNsaWRlXCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAgWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBhY3Rpb24gc2hlZXQgaGFzIGJlZW4gcmV2ZWFsZWQuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44GM6KGo56S644GV44KM57WC44KP44Gj44Gf5b6M44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU2hvdyB0aGUgYWN0aW9uIHNoZWV0LlsvZW5dXG4gICAqICBbamFd44OA44Kk44Ki44Ot44Kw44KS6ZaL44GN44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgdG8gdGhlIGRpc3BsYXllZCBlbGVtZW50LlxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlXG4gICAqIEBzaWduYXR1cmUgaGlkZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcIm5vbmVcImAgYW5kIGBcInNsaWRlXCJgLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwiLCBcInNsaWRlXCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbnMgaXMgY2FsbGVkIGFmdGVyIHRoZSBhY3Rpb24gc2hlZXQgaGFzIGJlZW4gaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOmaoOOCjOOBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1IaWRlIHRoZSBhY3Rpb24gc2hlZXQuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44KS6ZaJ44GY44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGhpZGRlbiBlbGVtZW50Wy9lbl1cbiAgICogICBbamFd6Zqg44KM44Gf6KaB57Sg44KS6Kej5rG644GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgYWN0aW9uIHNoZWV0IGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeimgee0oOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2FuY2VsYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGFjdGlvbiBzaGVldCBpcyBjYW5jZWxhYmxlIG9yIG5vdC4gQSBjYW5jZWxhYmxlIGFjdGlvbiBzaGVldCBjYW4gYmUgY2xvc2VkIGJ5IHRhcHBpbmcgdGhlIGJhY2tncm91bmQgb3IgYnkgcHJlc3NpbmcgdGhlIGJhY2sgYnV0dG9uIG9uIEFuZHJvaWQgZGV2aWNlcy5bL2VuXVxuICAgKiAgIFtqYV3jgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjgYzjgq3jg6Pjg7Pjgrvjg6vlj6/og73jgYvjganjgYbjgYvjgpLoqK3lrprjgZfjgb7jgZnjgILjgq3jg6Pjg7Pjgrvjg6vlj6/og73jgarjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjga/jgIHog4zmma/jgpLjgr/jg4Pjg5fjgZfjgZ/jgopBbmRyb2lk44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44KS5o6o44GZ44GT44Go44Gn6ZaJ44GY44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsICd0aXRsZSddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ3RpdGxlJykge1xuICAgICAgdGhpcy5fdXBkYXRlVGl0bGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FjdGlvblNoZWV0QW5pbWF0b3J9IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIEFjdGlvblNoZWV0QW5pbWF0b3IpKSB7XG4gICAgICB1dGlsLnRocm93QW5pbWF0b3IoJ0FjdGlvblNoZWV0Jyk7XG4gICAgfVxuICAgIF9hbmltYXRvckRpY3RbbmFtZV0gPSBBbmltYXRvcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgYW5pbWF0b3JzKCkge1xuICAgIHJldHVybiBfYW5pbWF0b3JEaWN0O1xuICB9XG5cbiAgc3RhdGljIGdldCBBY3Rpb25TaGVldEFuaW1hdG9yKCkge1xuICAgIHJldHVybiBBY3Rpb25TaGVldEFuaW1hdG9yO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkFjdGlvblNoZWV0ID0gQWN0aW9uU2hlZXRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYWN0aW9uLXNoZWV0JywgQWN0aW9uU2hlZXRFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE2IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuLi8uLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjbGFzcyBBbmltYXRvckNTUyAtIGltcGxlbWVudGF0aW9uIG9mIEFuaW1hdG9yIGNsYXNzIHVzaW5nIGNzcyB0cmFuc2l0aW9uc1xuICovXG5jbGFzcyBBbmltYXRvckNTUyB7XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYW5pbWF0ZVxuICAgKiBAZGVzYyBtYWluIGFuaW1hdGlvbiBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGZpbmFsQ1NTXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZHVyYXRpb249MjAwXSAtIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IHJlc3VsdFxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gcmVzdWx0LnRoZW4oY2FsbGJhY2spIC0gc2V0cyBhIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIHN0b3BwZWRcbiAgICogQHJldHVybiB7RnVuY3Rpb259IHJlc3VsdC5zdG9wKG9wdGlvbnMpIC0gc3RvcHMgdGhlIGFuaW1hdGlvbjsgaWYgb3B0aW9ucy5zdG9wTmV4dCBpcyB0cnVlIHRoZW4gaXQgZG9lc24ndCBjYWxsIHRoZSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gcmVzdWx0LmZpbmlzaChtcykgLSBmaW5pc2hlcyB0aGUgYW5pbWF0aW9uIGluIHRoZSBzcGVjaWZpZWQgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICogQHJldHVybiB7RnVuY3Rpb259IHJlc3VsdC5zcGVlZChtcykgLSBzZXRzIHRoZSBhbmltYXRpb24gc3BlZWQgc28gdGhhdCBpdCBmaW5pc2hlcyBhcyBpZiB0aGUgb3JpZ2luYWwgZHVyYXRpb24gd2FzIHRoZSBvbmUgc3BlY2lmaWVkIGhlcmVcbiAgICogQGV4YW1wbGVcbiAgICogYGBgYFxuICAgKiAgdmFyIHJlc3VsdCA9IGFuaW1hdG9yLmFuaW1hdGUoZWwsIHtvcGFjaXR5OiAwLjV9LCAxMDAwKTtcbiAgICpcbiAgICogIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7XG4gICAqICAgIHJlc3VsdC5zcGVlZCgyMDApLnRoZW4oZnVuY3Rpb24oKXtcbiAgICogICAgICBjb25zb2xlLmxvZygnZG9uZScpO1xuICAgKiAgICB9KTtcbiAgICogIH0sIDMwMCk7XG4gICAqIGBgYGBcbiAgICovXG4gIGFuaW1hdGUoZWwsIGZpbmFsLCBkdXJhdGlvbiA9IDIwMCkge1xuICAgIHZhciBzdGFydCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksXG4gICAgICAgIGluaXRpYWwgPSB7fSxcbiAgICAgICAgc3RvcHBlZCA9IGZhbHNlLFxuICAgICAgICBuZXh0ID0gZmFsc2UsXG4gICAgICAgIHRpbWVvdXQgPSBmYWxzZSxcbiAgICAgICAgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGZpbmFsKTtcblxuICAgIHZhciB1cGRhdGVTdHlsZXMgPSAoKSA9PiB7XG4gICAgICBsZXQgcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChzLmdldFByb3BlcnR5VmFsdWUuYmluZChzKSk7XG4gICAgICBzID0gZWwub2Zmc2V0SGVpZ2h0O1xuICAgIH07XG5cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgc3RvcDogKG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICB0aW1lb3V0ICYmIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdmFyIGsgPSBNYXRoLm1pbigxLCAoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIHN0YXJ0KSAvIGR1cmF0aW9uKTtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgIGVsLnN0eWxlW2ldID0gKDEgLSBrKSAqIGluaXRpYWxbaV0gKyBrICogZmluYWxbaV0gKyAoaSA9PSAnb3BhY2l0eScgPyAnJyA6ICdweCcpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJztcblxuICAgICAgICBpZiAob3B0aW9ucy5zdG9wTmV4dCkge1xuICAgICAgICAgIG5leHQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RvcHBlZCkge1xuICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIG5leHQgJiYgbmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgdGhlbjogKGNiKSA9PiB7XG4gICAgICAgIG5leHQgPSBjYjtcbiAgICAgICAgaWYgKHN0b3BwZWQpIHtcbiAgICAgICAgICBuZXh0ICYmIG5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHNwZWVkOiAobmV3RHVyYXRpb24pID0+IHtcbiAgICAgICAgaWYgKGludGVybmFsLmNvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQpIHtcbiAgICAgICAgICBuZXdEdXJhdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdG9wcGVkKSB7XG4gICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICBjb25zdCBwYXNzZWQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC0gc3RhcnQ7XG4gICAgICAgICAgY29uc3QgIGsgPSBwYXNzZWQgLyBkdXJhdGlvbjtcbiAgICAgICAgICBjb25zdCByZW1haW5pbmcgPSBuZXdEdXJhdGlvbiAqICgxIC0gayk7XG5cbiAgICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBlbC5zdHlsZVtpXSA9ICgxIC0gaykgKiBpbml0aWFsW2ldICsgayAqIGZpbmFsW2ldICsgKGkgPT0gJ29wYWNpdHknID8gJycgOiAncHgnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHVwZGF0ZVN0eWxlcygpO1xuXG4gICAgICAgICAgc3RhcnQgPSBlbC5zcGVlZFVwVGltZTtcbiAgICAgICAgICBkdXJhdGlvbiA9IHJlbWFpbmluZztcblxuICAgICAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGR1cmF0aW9uIC8gMTAwMCArICdzJztcblxuICAgICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGVsLnN0eWxlW2ldID0gZmluYWxbaV0gKyAoaSA9PSAnb3BhY2l0eScgPyAnJyA6ICdweCcpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQocmVzdWx0LnN0b3AsIHJlbWFpbmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBmaW5pc2g6IChtaWxsaXNlY29uZHMgPSA1MCkgPT4ge1xuICAgICAgICB2YXIgayA9ICgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC0gc3RhcnQpIC8gZHVyYXRpb247XG5cbiAgICAgICAgcmVzdWx0LnNwZWVkKG1pbGxpc2Vjb25kcyAvICgxIC0gaykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IHN0b3BwZWQgfHwgaW50ZXJuYWwuY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGUgPT4ge1xuICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKSk7XG4gICAgICBpbml0aWFsW2VdID0gaXNOYU4odikgPyAwIDogdjtcbiAgICB9KTtcblxuXG4gICAgaWYgKCFzdG9wcGVkKSB7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHkgPSBwcm9wZXJ0aWVzLmpvaW4oJywnKTtcbiAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGR1cmF0aW9uIC8gMTAwMCArICdzJztcblxuICAgICAgcHJvcGVydGllcy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICBlbC5zdHlsZVtlXSA9IGZpbmFsW2VdICsgKGUgPT0gJ29wYWNpdHknID8gJycgOiAncHgnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHJlc3VsdC5zdG9wLCBkdXJhdGlvbik7XG4gICAgdGhpcy5fb25TdG9wQW5pbWF0aW9ucyhlbCwgcmVzdWx0LnN0b3ApO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgdGhpcy5faW5kZXggPSAwO1xuICB9XG5cbiAgX29uU3RvcEFuaW1hdGlvbnMoZWwsIGxpc3RlbmVyKSB7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7XG4gICAgdmFyIGkgPSB0aGlzLl9pbmRleCsrO1xuICAgIHF1ZXVlW2VsXSA9IHF1ZXVlW2VsXSB8fCBbXTtcbiAgICBxdWV1ZVtlbF1baV0gPSAob3B0aW9ucykgPT4ge1xuICAgICAgZGVsZXRlIHF1ZXVlW2VsXVtpXTtcbiAgICAgIGlmIChxdWV1ZVtlbF0gJiYgcXVldWVbZWxdLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBxdWV1ZVtlbF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdGVuZXIob3B0aW9ucyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAqIEBtZXRob2Qgc3RvcEFuaW1hdGlvbnNcbiAgKiBAZGVzYyBzdG9wcyBhY3RpdmUgYW5pbWF0aW9ucyBvbiBhIHNwZWNpZmllZCBlbGVtZW50XG4gICogQHBhcmFtIHtFbGVtZW50fEFycmF5fSBlbGVtZW50IC0gZWxlbWVudCBvciBhcnJheSBvZiBlbGVtZW50c1xuICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0b3BOZXh0XSAtIHRoZSBjYWxsYmFja3MgYWZ0ZXIgdGhlIGFuaW1hdGlvbnMgd29uJ3QgYmUgY2FsbGVkIGlmIHRoaXMgb3B0aW9uIGlzIHRydWVcbiAgKi9cbiAgc3RvcEFuaW1hdGlvbnMoZWwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsKSkge1xuICAgICAgcmV0dXJuIGVsLmZvckVhY2goZWwgPT4ge1xuICAgICAgICB0aGlzLnN0b3BBbmltYXRpb25zKGVsLCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgICh0aGlzLl9xdWV1ZVtlbF0gfHwgW10pLmZvckVhY2goZSA9PiB7IGUob3B0aW9ucyB8fCB7fSk7IH0pO1xuICB9XG5cbiAgLyoqXG4gICogQG1ldGhvZCBzdG9wQWxsXG4gICogQGRlc2Mgc3RvcHMgYWxsIGFjdGl2ZSBhbmltYXRpb25zXG4gICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XVxuICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3RvcE5leHRdIC0gdGhlIGNhbGxiYWNrcyBhZnRlciB0aGUgYW5pbWF0aW9ucyB3b24ndCBiZSBjYWxsZWQgaWYgdGhpcyBvcHRpb24gaXMgdHJ1ZVxuICAqL1xuICBzdG9wQWxsKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuc3RvcEFuaW1hdGlvbnMoT2JqZWN0LmtleXModGhpcy5fcXVldWUpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAqIEBtZXRob2QgZmFkZVxuICAqIEBkZXNjIGZhZGVzIHRoZSBlbGVtZW50IChzaG9ydCB2ZXJzaW9uIGZvciBhbmltYXRlKGVsLCB7b3BhY2l0eTogMH0pKVxuICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZHVyYXRpb249MjAwXVxuICAqL1xuICBmYWRlKGVsLCBkdXJhdGlvbiA9IDIwMCkge1xuICAgIHJldHVybiB0aGlzLmFuaW1hdGUoZWwsIHtvcGFjaXR5OiAwfSwgZHVyYXRpb24pO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0b3JDU1M7XG5cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgQW5pbWF0b3IgZnJvbSAnLi9vbnMtcmlwcGxlL2FuaW1hdG9yLWNzcy5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3JpcHBsZSc7XG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAncmlwcGxlLS0qJyxcbiAgJy5yaXBwbGVfX3dhdmUnOiAncmlwcGxlLS0qX193YXZlJyxcbiAgJy5yaXBwbGVfX2JhY2tncm91bmQnOiAncmlwcGxlLS0qX19iYWNrZ3JvdW5kJyxcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXJpcHBsZVxuICogQGNhdGVnb3J5IHZpc3VhbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBBZGRzIGEgTWF0ZXJpYWwgRGVzaWduIFwicmlwcGxlXCIgZWZmZWN0IHRvIGFuIGVsZW1lbnQuIFRoZSByaXBwbGUgZWZmZWN0IHdpbGwgc3ByZWFkIGZyb20gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSB1c2VyIHRhcHMuXG4gKlxuICogICAgIFNvbWUgZWxlbWVudHMgc3VjaCBhcyBgPG9ucy1idXR0b24+YCBhbmQgYDxvbnMtZmFiPmAgIHN1cHBvcnQgYSBgcmlwcGxlYCBhdHRyaWJ1dGUuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jg57jg4bjg6rjgqLjg6vjg4fjgrbjgqTjg7Pjga7jg6rjg4Pjg5fjg6vlirnmnpzjgpJET03opoHntKDjgavov73liqDjgZfjgb7jgZnjgIJbL2phXVxuICogQGNvZGVwZW4gd0tRV2RaXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvcmlwcGxlXG4gKiBAbW9kaWZpZXIgbGlnaHQtZ3JheVxuICogICBbZW5dQ2hhbmdlIHRoZSBjb2xvciBvZiBlZmZlY3RzIHRvIGxpZ2h0IGdyYXkuWy9lbl1cbiAqICAgW2phXeOCqOODleOCp+OCr+ODiOOBruiJsuOBjOaYjuOCi+OBhOeBsOiJsuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmdcbiAqICBbZW5dQ3Jvc3MgcGxhdGZvcm0gc3R5bGluZ1svZW5dXG4gKiAgW2phXUNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2phXVxuICogQGV4YW1wbGVcbiAqIDxkaXYgY2xhc3M9XCJteS1kaXZcIj5cbiAqICA8b25zLXJpcHBsZT48L29ucy1yaXBwbGU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAZXhhbXBsZVxuICogPG9ucy1idXR0b24gcmlwcGxlPkNsaWNrIG1lITwvb25zLWJ1dHRvbj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmlwcGxlRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjb2xvclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ29sb3Igb2YgdGhlIHJpcHBsZSBlZmZlY3QuWy9lbl1cbiAgICogICBbamFd44Oq44OD44OX44Or44Ko44OV44Kn44Kv44OI44Gu6Imy44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSByaXBwbGUgZWZmZWN0LlsvZW5dXG4gICAqICAgW2phXeOCqOODleOCp+OCr+ODiOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGJhY2tncm91bmRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kLlsvZW5dXG4gICAqICAgW2phXeiDjOaZr+OBruiJsuOCkuioreWumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNpemVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNpemluZyBvZiB0aGUgd2F2ZSBvbiByaXBwbGUgZWZmZWN0LiBTZXQgXCJjb3ZlclwiIG9yIFwiY29udGFpblwiLiBEZWZhdWx0IGlzIFwiY292ZXJcIi5bL2VuXVxuICAgKiAgIFtqYV3jgqjjg5Xjgqfjgq/jg4jjga7jgrXjgqTjgrrjgpLmjIflrprjgZfjgb7jgZnjgIJcImNvdmVyXCLjgoLjgZfjgY/jga9cImNvbnRhaW5cIuOCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBr1wiY292ZXJcIuOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNlbnRlclxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIHByZXNlbnRzLCBjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIHdhdmUgZWZmZWN0IHRvIGNlbnRlciBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFd44GT44Gu6KaB57Sg44KS6Kit5a6a44GZ44KL44Go44CB44Ko44OV44Kn44Kv44OI44Gu5L2N572u44GM6KaB57Sg44Gu55yf44KT5Lit44GL44KJ5aeL44G+44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjZW50ZXJcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBwcmVzZW50cywgY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB3YXZlIGVmZmVjdCB0byBjZW50ZXIgb2YgdGhlIHRhcmdldCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOOCkuioreWumuOBmeOCi+OBqOOAgeOCqOODleOCp+OCr+ODiOOBruS9jee9ruOBjOimgee0oOOBruecn+OCk+S4reOBi+OCieWni+OBvuOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSByaXBwbGUgZWZmZWN0IHdpbGwgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM6Kit5a6a44GV44KM44Gf5aC05ZCI44CB44Oq44OD44OX44Or44Ko44OV44Kn44Kv44OI44Gv54Sh5Yq544Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX29uVGFwID0gdGhpcy5fb25UYXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkhvbGQgPSB0aGlzLl9vbkhvbGQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkRyYWdTdGFydCA9IHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25SZWxlYXNlID0gdGhpcy5fb25SZWxlYXNlLmJpbmQodGhpcyk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcblxuICAgIHRoaXMuX2FuaW1hdG9yID0gbmV3IEFuaW1hdG9yKCk7XG5cbiAgICBbJ2NvbG9yJywgJ2NlbnRlcicsICdzdGFydC1yYWRpdXMnLCAnYmFja2dyb3VuZCcsICdtb2RpZmllciddLmZvckVhY2goZSA9PiB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLCBudWxsLCB0aGlzLmdldEF0dHJpYnV0ZShlKSk7XG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG5cbiAgICB0aGlzLl93YXZlID0gdGhpcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyaXBwbGVfX3dhdmUnKVswXTtcbiAgICB0aGlzLl9iYWNrZ3JvdW5kID0gdGhpcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyaXBwbGVfX2JhY2tncm91bmQnKVswXTtcblxuICAgIGlmICghKHRoaXMuX2JhY2tncm91bmQgJiYgdGhpcy5fd2F2ZSkpIHtcbiAgICAgIHRoaXMuX3dhdmUgPSB1dGlsLmNyZWF0ZSgnLnJpcHBsZV9fd2F2ZScpO1xuICAgICAgdGhpcy5fYmFja2dyb3VuZCA9IHV0aWwuY3JlYXRlKCcucmlwcGxlX19iYWNrZ3JvdW5kJyk7XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5fd2F2ZSk7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuX2JhY2tncm91bmQpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9nZXRFZmZlY3RTaXplKCkge1xuICAgIGNvbnN0IHNpemVzID0gWydjb3ZlcicsICdjb250YWluJ107XG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdzaXplJykpIHtcbiAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnc2l6ZScpO1xuICAgICAgaWYgKHNpemVzLmluZGV4T2Yoc2l6ZSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnY292ZXInO1xuICB9XG5cbiAgX2NhbGN1bGF0ZUNvb3JkcyhlKSB7XG4gICAgbGV0IHgsIHksIGgsIHcsIHI7XG4gICAgY29uc3QgYiA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2dldEVmZmVjdFNpemUoKTtcbiAgICBjb25zdCBlcnJvciA9ICgpID0+IHV0aWwudGhyb3coJ1JpcHBsZSBpbnZhbGlkIHN0YXRlJyk7XG5cbiAgICBpZiAodGhpcy5fY2VudGVyKSB7XG4gICAgICB4ID0gYi53aWR0aCAvIDI7XG4gICAgICB5ID0gYi5oZWlnaHQgLyAyO1xuXG4gICAgICBpZiAoc2l6ZSA9PT0gJ2NvdmVyJykge1xuICAgICAgICByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgICAgfSBlbHNlIGlmIChzaXplID09PSAnY29udGFpbicpIHtcbiAgICAgICAgciA9IE1hdGgubWluKHgsIHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgeCA9ICh0eXBlb2YgZS5jbGllbnRYID09PSAnbnVtYmVyJyA/IGUuY2xpZW50WCA6IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCkgLSBiLmxlZnQ7XG4gICAgICB5ID0gKHR5cGVvZiBlLmNsaWVudFkgPT09ICdudW1iZXInID8gZS5jbGllbnRZIDogZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZKSAtIGIudG9wO1xuICAgICAgaCA9IE1hdGgubWF4KHksIGIuaGVpZ2h0IC0geSk7XG4gICAgICB3ID0gTWF0aC5tYXgoeCwgYi53aWR0aCAtIHgpO1xuXG4gICAgICBpZiAoc2l6ZSA9PT0gJ2NvdmVyJykge1xuICAgICAgICByID0gTWF0aC5zcXJ0KGggKiBoICsgdyAqIHcpO1xuICAgICAgfSBlbHNlIGlmIChzaXplID09PSAnY29udGFpbicpIHtcbiAgICAgICAgciA9IE1hdGgubWluKE1hdGgucm91bmQoaCAvIDIpLCBNYXRoLnJvdW5kKHcgLyAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7eCwgeSwgcn07XG4gIH1cblxuICBfcmlwcGxlQW5pbWF0aW9uKGUsIGR1cmF0aW9uID0gMzAwKSB7XG4gICAgY29uc3Qge19hbmltYXRvciwgX3dhdmUsIF9iYWNrZ3JvdW5kLCBfbWluUn0gPSB0aGlzO1xuICAgIGNvbnN0IHt4LCB5LCByfSA9IHRoaXMuX2NhbGN1bGF0ZUNvb3JkcyhlKTtcblxuICAgIF9hbmltYXRvci5zdG9wQWxsKHtzdG9wTmV4dDogMX0pO1xuICAgIF9hbmltYXRvci5hbmltYXRlKF9iYWNrZ3JvdW5kLCB7b3BhY2l0eTogMX0sIGR1cmF0aW9uKTtcblxuICAgIHV0aWwuZXh0ZW5kKF93YXZlLnN0eWxlLCB7XG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgdG9wOiB5IC0gX21pblIgKyAncHgnLFxuICAgICAgbGVmdDogeCAtIF9taW5SICsgJ3B4JyxcbiAgICAgIHdpZHRoOiAyICogX21pblIgKyAncHgnLFxuICAgICAgaGVpZ2h0OiAyICogX21pblIgKyAncHgnXG4gICAgfSk7XG5cbiAgICByZXR1cm4gX2FuaW1hdG9yLmFuaW1hdGUoX3dhdmUsIHtcbiAgICAgIHRvcDogeSAtIHIsXG4gICAgICBsZWZ0OiB4IC0gcixcbiAgICAgIGhlaWdodDogMiAqIHIsXG4gICAgICB3aWR0aDogMiAqIHJcbiAgICB9LCBkdXJhdGlvbik7XG4gIH1cblxuICBfdXBkYXRlUGFyZW50KCkge1xuICAgIGlmICghdGhpcy5fcGFyZW50VXBkYXRlZCAmJiB0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnBhcmVudE5vZGUpO1xuICAgICAgaWYgKGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BhcmVudFVwZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIF9vblRhcChlKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICFlLnJpcHBsZSkge1xuICAgICAgZS5yaXBwbGUgPSB0cnVlO1xuICAgICAgdGhpcy5fdXBkYXRlUGFyZW50KCk7XG4gICAgICB0aGlzLl9yaXBwbGVBbmltYXRpb24oZS5nZXN0dXJlLnNyY0V2ZW50KS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IuZmFkZSh0aGlzLl93YXZlKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IuZmFkZSh0aGlzLl9iYWNrZ3JvdW5kKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9vbkhvbGQoZSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhZS5yaXBwbGUpIHtcbiAgICAgIGUucmlwcGxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZVBhcmVudCgpO1xuICAgICAgdGhpcy5faG9sZGluZyA9IHRoaXMuX3JpcHBsZUFuaW1hdGlvbihlLmdlc3R1cmUuc3JjRXZlbnQsIDIwMDApO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVsZWFzZScsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgfVxuICB9XG5cbiAgX29uUmVsZWFzZShlKSB7XG4gICAgaWYgKHRoaXMuX2hvbGRpbmcgJiYgIWUucmlwcGxlKSB7XG4gICAgICBlLnJpcHBsZSA9IHRydWU7XG4gICAgICB0aGlzLl9ob2xkaW5nLnNwZWVkKDMwMCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLnN0b3BBbGwoe3N0b3BOZXh0OiB0cnVlfSk7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmZhZGUodGhpcy5fd2F2ZSk7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmZhZGUodGhpcy5fYmFja2dyb3VuZCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faG9sZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlbGVhc2UnLCB0aGlzLl9vblJlbGVhc2UpO1xuICB9XG5cbiAgX29uRHJhZ1N0YXJ0KGUpIHtcbiAgICBpZiAodGhpcy5faG9sZGluZykge1xuICAgICAgcmV0dXJuIHRoaXMuX29uUmVsZWFzZShlKTtcbiAgICB9XG4gICAgaWYgKFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YoZS5nZXN0dXJlLmRpcmVjdGlvbikgIT0gLTEpIHtcbiAgICAgIHRoaXMuX29uVGFwKGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX3BhcmVudE5vZGUgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICBpZiAoaW50ZXJuYWwuY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BhcmVudE5vZGUuYWRkRXZlbnRMaXN0ZW5lcigndGFwJywgdGhpcy5fb25UYXApO1xuICAgICAgdGhpcy5fcGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKCdob2xkJywgdGhpcy5fb25Ib2xkKTtcbiAgICAgIHRoaXMuX3BhcmVudE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGNvbnN0IHBuID0gdGhpcy5fcGFyZW50Tm9kZSB8fCB0aGlzLnBhcmVudE5vZGU7XG4gICAgcG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGFwJywgdGhpcy5fb25UYXApO1xuICAgIHBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2hvbGQnLCB0aGlzLl9vbkhvbGQpO1xuICAgIHBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ3N0YXJ0LXJhZGl1cycsICdjb2xvcicsICdiYWNrZ3JvdW5kJywgJ2NlbnRlcicsICdjbGFzcycsICdtb2RpZmllciddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcblxuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3N0YXJ0LXJhZGl1cyc6XG4gICAgICAgIHRoaXMuX21pblIgPSBNYXRoLm1heCgwLCBwYXJzZUZsb2F0KGN1cnJlbnQpIHx8IDApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93YXZlLnN0eWxlLmJhY2tncm91bmQgPSBjdXJyZW50O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0F0dHJpYnV0ZSgnYmFja2dyb3VuZCcpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JhY2tncm91bmQnOlxuICAgICAgICBpZiAoY3VycmVudCB8fCBsYXN0KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09ICdub25lJykge1xuICAgICAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2JhY2tncm91bmQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmFja2dyb3VuZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kID0gY3VycmVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgaWYgKG5hbWUgPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgdGhpcy5fY2VudGVyID0gY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQgIT0gJ2ZhbHNlJztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhSaXBwbGVFbGVtZW50LCBbJ2Rpc2FibGVkJywgJ2NlbnRlciddKTtcblxub25zRWxlbWVudHMuUmlwcGxlID0gUmlwcGxlRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXJpcHBsZScsIFJpcHBsZUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uLy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uLy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi8uLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uLy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmltcG9ydCAnLi4vb25zLXJpcHBsZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VCdXR0b25FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGdldCBfc2NoZW1lKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIGdldCBfcmlwcGxlT3B0KCkge1xuICAgIHJldHVybiBbdGhpc107XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VCdXR0b25FbGVtZW50KSB7XG4gICAgICB1dGlsLnRocm93QWJzdHJhY3QoKTtcbiAgICB9XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIGdldCBfaWNvbigpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1pY29uJyk7XG4gIH1cblxuICBnZXQgX2hpZGRlbkJ1dHRvbigpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ2J1dHRvbicpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQodGhpcy5fZGVmYXVsdENsYXNzTmFtZSk7XG5cbiAgICBpZiAoIXRoaXMuX2ljb24gJiYgdGhpcy5oYXNBdHRyaWJ1dGUoJ2ljb24nKSkge1xuICAgICAgdXRpbC5jaGVja01pc3NpbmdJbXBvcnQoJ0ljb24nKTtcbiAgICAgIGNvbnN0IGljb24gPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYDxvbnMtaWNvbiBpY29uPVwiJHt0aGlzLmdldEF0dHJpYnV0ZSgnaWNvbicpfVwiPjwvb25zLWljb24+YCk7XG4gICAgICBpY29uLmNsYXNzTGlzdC5hZGQodGhpcy5fZGVmYXVsdENsYXNzTmFtZS5yZXBsYWNlKCdidXR0b24nLCAnaWNvbicpKTtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGljb24sIHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGhpZGRlbiBidXR0b24gdG8gYWxsb3cgZm9ybSBzdWJtaXNzaW9uXG4gICAgaWYgKCF0aGlzLl9oaWRkZW5CdXR0b24pIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHV0aWwuY3JlYXRlRWxlbWVudCgnPGJ1dHRvbiBoaWRkZW4+PC9idXR0b24+Jyk7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlUmlwcGxlKCk7XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHRoaXMuX3NjaGVtZSk7XG4gIH1cblxuICBfdXBkYXRlSWNvbigpIHtcbiAgICBpZiAodGhpcy5faWNvbikge1xuICAgICAgdGhpcy5faWNvbi5zZXRBdHRyaWJ1dGUoJ2ljb24nLCB0aGlzLmdldEF0dHJpYnV0ZSgnaWNvbicpKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlUmlwcGxlKCkge1xuICAgIHRoaXMuX3JpcHBsZU9wdCAmJiB1dGlsLnVwZGF0ZVJpcHBsZSguLi50aGlzLl9yaXBwbGVPcHQpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnY2xhc3MnLCAnaWNvbicsICdyaXBwbGUnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIHRoaXMuX2RlZmF1bHRDbGFzc05hbWUsIHRoaXMuX3NjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpY29uJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlSWNvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpcHBsZSc6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuX2RlZmF1bHRDbGFzc05hbWUpICYmIHRoaXMuX3VwZGF0ZVJpcHBsZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhCYXNlQnV0dG9uRWxlbWVudCwgWydyaXBwbGUnLCAnZGlzYWJsZWQnXSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlQnV0dG9uRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1idXR0b24uanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uXG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAbW9kaWZpZXIgZGVzdHJ1Y3RpdmVcbiAqICAgW2VuXVNob3dzIGEgXCJkZXN0cnVjdGl2ZVwiIGJ1dHRvbiAob25seSBmb3IgaU9TKS5bL2VuXVxuICogICBbamFdXCJkZXN0cnVjdGl2ZVwi44Gq44Oc44K/44Oz44KS6KGo56S644GX44G+44GZKGlPU+OBp+OBruOBv+acieWKuSnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1Db21wb25lbnQgdGhhdCByZXByZXNlbnQgZWFjaCBidXR0b24gb2YgdGhlIGFjdGlvbiBzaGVldC5bL2VuXVxuICogICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44Gr6KGo56S644GV44KM44KL5ZCE44Oc44K/44Oz44KS6KGo54++44GZ44KL44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CCWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1hY3Rpb24tc2hlZXRcbiAqICAgW2VuXVRoZSBgPG9ucy1hY3Rpb24tc2hlZXQ+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWFjdGlvbi1zaGVldOOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGlzdC1pdGVtXG4gKiAgIFtlbl1UaGUgYDxvbnMtbGlzdC1pdGVtPmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN0LWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWljb25cbiAqICAgW2VuXVRoZSBgPG9ucy1pY29uPmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1pY29u44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9hY3Rpb24tc2hlZXRcbiAqIEBndWlkZSBhcHBzaXplLmh0bWwjcmVtb3ZpbmctaWNvbi1wYWNrcyBbZW5dUmVtb3ZpbmcgaWNvbiBwYWNrcy5bL2VuXVtqYV1bL2phXVxuICogQGd1aWRlIGZhcS5odG1sI2hvdy1jYW4taS11c2UtY3VzdG9tLWljb24tcGFja3MgW2VuXUFkZGluZyBjdXN0b20gaWNvbiBwYWNrcy5bL2VuXVtqYV1bL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGFjdGlvbiBzaGVldCBidXR0b24uWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOeUqOOBruODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1hY3Rpb24tc2hlZXQgaWQ9XCJzaGVldFwiPlxuICogICA8b25zLWFjdGlvbi1zaGVldC1idXR0b24+TGFiZWw8L29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPlxuICogICA8b25zLWFjdGlvbi1zaGVldC1idXR0b24+TGFiZWw8L29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPlxuICogPC9vbnMtYWN0aW9uLXNoZWV0PlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGVldCcpLnNob3coKTtcbiAqIDwvc2NyaXB0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY3Rpb25TaGVldEJ1dHRvbkVsZW1lbnQgZXh0ZW5kcyBCYXNlQnV0dG9uRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaWNvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1DcmVhdGVzIGFuIGBvbnMtaWNvbmAgY29tcG9uZW50IHdpdGggdGhpcyBzdHJpbmcuIE9ubHkgdmlzaWJsZSBvbiBBbmRyb2lkLiBDaGVjayBbU2VlIGFsc29dKCNzZWVhbHNvKSBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlsvZW5dXG4gICAqICBbamFdYG9ucy1pY29uYOOCs+ODs+ODneODvOODjeODs+ODiOOCkuaCquaAp+OBl+OBvuOBmeOAgkFuZHJvaWTjgafjga7jgb/ooajnpLrjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGFjdGlvbiBzaGVldCBidXR0b24uWy9lbl1cbiAgICogICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44Oc44K/44Oz44Gu6KaL44Gf55uu44KS6Kit5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICcnOiAnYWN0aW9uLXNoZWV0LWJ1dHRvbi0tKicsXG4gICAgICAnLmFjdGlvbi1zaGVldC1pY29uJzogJ2FjdGlvbi1zaGVldC1pY29uLS0qJ1xuICAgIH07XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdhY3Rpb24tc2hlZXQtYnV0dG9uJztcbiAgfVxuXG4gIGdldCBfcmlwcGxlT3B0KCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxub25zRWxlbWVudHMuQWN0aW9uU2hlZXRCdXR0b24gPSBBY3Rpb25TaGVldEJ1dHRvbkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uJywgQWN0aW9uU2hlZXRCdXR0b25FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcblxuZXhwb3J0IGNsYXNzIEFsZXJ0RGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIHNob3coZGlhbG9nLCBkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBoaWRlKGRpYWxvZywgZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuZHJvaWQgc3R5bGUgYW5pbWF0b3IgZm9yIGFsZXJ0IGRpYWxvZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgQWxlcnREaWFsb2dBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoLjEsIC43LCAuNCwgMSknLCBkdXJhdGlvbiA9IDAuMiwgZGVsYXkgPSAwfSA9IHt9KSB7XG4gICAgc3VwZXIoe2R1cmF0aW9uLCB0aW1pbmcsIGRlbGF5fSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoLjksIC45LCAxKScsIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMSwgMSwgMSknLCBvcGFjaXR5OiAxIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IDAgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgxLCAxLCAxKScsIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoLjksIC45LCAxKScsIG9wYWNpdHk6IDAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBhbGVydCBkaWFsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBJT1NBbGVydERpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgQWxlcnREaWFsb2dBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoLjEsIC43LCAuNCwgMSknLCBkdXJhdGlvbiA9IDAuMiwgZGVsYXkgPSAwfSA9IHt9KSB7XG4gICAgc3VwZXIoe2R1cmF0aW9uLCB0aW1pbmcsIGRlbGF5fSk7XG4gIH1cblxuICAvKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgxLjMsIDEuMywgMSknLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKDEsIDEsIDEpJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IHsgQWxlcnREaWFsb2dBbmltYXRvciwgSU9TQWxlcnREaWFsb2dBbmltYXRvciwgQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3IgfSBmcm9tICcuL29ucy1hbGVydC1kaWFsb2cvYW5pbWF0b3IuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgQmFzZURpYWxvZ0VsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZGlhbG9nLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcuYWxlcnQtZGlhbG9nJzogJ2FsZXJ0LWRpYWxvZy0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWNvbnRhaW5lcic6ICdhbGVydC1kaWFsb2ctY29udGFpbmVyLS0qJyxcbiAgJy5hbGVydC1kaWFsb2ctdGl0bGUnOiAnYWxlcnQtZGlhbG9nLXRpdGxlLS0qJyxcbiAgJy5hbGVydC1kaWFsb2ctY29udGVudCc6ICdhbGVydC1kaWFsb2ctY29udGVudC0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWZvb3Rlcic6ICdhbGVydC1kaWFsb2ctZm9vdGVyLS0qJyxcbiAgJy5hbGVydC1kaWFsb2ctZm9vdGVyLS1yb3dmb290ZXInOiAnYWxlcnQtZGlhbG9nLWZvb3Rlci0tcm93Zm9vdGVyLS0qJyxcbiAgJy5hbGVydC1kaWFsb2ctYnV0dG9uLS1yb3dmb290ZXInOiAnYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcm93Zm9vdGVyLS0qJyxcbiAgJy5hbGVydC1kaWFsb2ctYnV0dG9uLS1wcmltYWwnOiAnYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcHJpbWFsLS0qJyxcbiAgJy5hbGVydC1kaWFsb2ctYnV0dG9uJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLSonLFxuICAnb25zLWFsZXJ0LWRpYWxvZy1idXR0b24nOiAnYWxlcnQtZGlhbG9nLWJ1dHRvbi0tKicsXG4gICcuYWxlcnQtZGlhbG9nLW1hc2snOiAnYWxlcnQtZGlhbG9nLW1hc2stLSonLFxuICAnLnRleHQtaW5wdXQnOiAndGV4dC1pbnB1dC0tKidcbn07XG5cbmNvbnN0IF9hbmltYXRvckRpY3QgPSB7XG4gICdub25lJzogQWxlcnREaWFsb2dBbmltYXRvcixcbiAgJ2RlZmF1bHQnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBwbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIDogSU9TQWxlcnREaWFsb2dBbmltYXRvcjsgfSxcbiAgJ2ZhZGUnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBwbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIDogSU9TQWxlcnREaWFsb2dBbmltYXRvcjsgfVxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYWxlcnQtZGlhbG9nXG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEFsZXJ0IGRpYWxvZyB0aGF0IGlzIGRpc3BsYXllZCBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgc2NyZWVuLiBVc2VmdWwgZm9yIGRpc3BsYXlpbmcgcXVlc3Rpb25zLCB3YXJuaW5ncyBvciBlcnJvciBtZXNzYWdlcyB0byB0aGUgdXNlci4gVGhlIHRpdGxlLCBjb250ZW50IGFuZCBidXR0b25zIGNhbiBiZSBlYXNpbHkgY3VzdG9taXplZCBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHN3aXRjaCBzdHlsZSBiYXNlZCBvbiB0aGUgcGxhdGZvcm0uXG4gKlxuICogICAgIFRvIHVzZSB0aGUgZWxlbWVudCBpdCBjYW4gZWl0aGVyIGJlIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBgPGJvZHk+YCBlbGVtZW50IG9yIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnJvbSBhIHRlbXBsYXRlIHVzaW5nIHRoZSBgb25zLmNyZWF0ZUFsZXJ0RGlhbG9nKHRlbXBsYXRlKWAgdXRpbGl0eSBmdW5jdGlvbiBhbmQgdGhlIGA8dGVtcGxhdGU+YCB0YWcuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDnj77lnKjjga7jgrnjgq/jg6rjg7zjg7Pjga7kuIrjgavooajnpLrjgZnjgovjgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgafjgZnjgILjg6bjg7zjgrbjgavlr77jgZnjgovllY/jgYTjgYvjgZHjgIHorablkYrjgIHjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrjjgpLooajnpLrjgZnjgovjga7jgavliKnnlKjjgafjgY3jgb7jgZnjgILjgr/jgqTjg4jjg6vjgoTjgrPjg7Pjg4bjg7Pjg4TjgoTjg5zjgr/jg7Pjga/nsKHljZjjgavjgqvjgrnjgr/jg57jgqTjgrrjgafjgY3jgIHlrp/ooYzjgZfjgabjgYTjgovjg5fjg6njg4Pjg4jjg5Xjgqnjg7zjg6DjgavkvbXjgZvjgabjgrnjgr/jgqTjg6vjgYzoh6rli5XnmoTjgavliIfjgormm7/jgo/jgorjgb7jgZnjgIJcbiAqICAgWy9qYV1cbiAqIEBjb2RlcGVuIFF3d3h5cFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2FsZXJ0LWRpYWxvZ1xuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc3R5bGVbL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44K544K/44Kk44OrWy9qYV1cbiAqIEBtb2RpZmllciByb3dmb290ZXJcbiAqICAgW2VuXUhvcml6b250YWxseSBhbGlnbnMgdGhlIGZvb3RlciBidXR0b25zLlsvZW5dXG4gKiAgIFtqYV3jg5Xjg4Pjgr/jg7zjga7opIfmlbDjga7jg5zjgr/jg7PjgpLmsLTlubPjgavphY3nva5bL2phXVxuICogQHNlZWFsc28gb25zLWRpYWxvZ1xuICogICBbZW5db25zLWRpYWxvZyBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWRpYWxvZ+OCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtcG9wb3ZlclxuICogICBbZW5db25zLXBvcG92ZXIgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1kaWFsb2fjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLm5vdGlmaWNhdGlvblxuICogICBbZW5dVXNpbmcgb25zLm5vdGlmaWNhdGlvbiB1dGlsaXR5IGZ1bmN0aW9ucy5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GZ44KL44Gr44Gv44CBb25zLm5vdGlmaWNhdGlvbuOCquODluOCuOOCp+OCr+ODiOOBruODoeOCveODg+ODieOCkuS9v+OBhuOBk+OBqOOCguOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1hbGVydC1kaWFsb2cgaWQ9XCJhbGVydC1kaWFsb2dcIj5cbiAqICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy10aXRsZVwiPldhcm5pbmchPC9kaXY+XG4gKiAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctY29udGVudFwiPlxuICogICAgIEFuIGVycm9yIGhhcyBvY2N1cnJlZCFcbiAqICAgPC9kaXY+XG4gKiAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctZm9vdGVyXCI+XG4gKiAgICAgPGJ1dHRvbiBpZD1cImFsZXJ0LWRpYWxvZy1idXR0b25cIiBjbGFzcz1cImFsZXJ0LWRpYWxvZy1idXR0b25cIj5PSzwvYnV0dG9uPlxuICogICA8L2Rpdj5cbiAqIDwvb25zLWFsZXJ0LWRpYWxvZz5cbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGVydC1kaWFsb2cnKS5zaG93KCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWxlcnREaWFsb2dFbGVtZW50IGV4dGVuZHMgQmFzZURpYWxvZ0VsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIGFsZXJ0IGRpYWxvZyBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GM6KGo56S644GV44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFsZXJ0RGlhbG9nXG4gICAqICAgW2VuXUFsZXJ0IGRpYWxvZyBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdG8gc3RvcCB0aGUgZGlhbG9nIGZyb20gc2hvd2luZy5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHjgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga7ooajnpLrjgpLmraLjgoHjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RzaG93XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBhbGVydCBkaWFsb2cgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOBn+ebtOW+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbGVydERpYWxvZ1xuICAgKiAgIFtlbl1BbGVydCBkaWFsb2cgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlaGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIGFsZXJ0IGRpYWxvZyBpcyBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFsZXJ0RGlhbG9nXG4gICAqICAgW2VuXUFsZXJ0IGRpYWxvZyBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdG8gc3RvcCB0aGUgZGlhbG9nIGZyb20gaGlkaW5nLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBjOmWieOBmOOCiOOBhuOBqOOBmeOCi+OBruOCkuatouOCgeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBhbGVydCBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWxlcnREaWFsb2dcbiAgICogICBbZW5dQWxlcnQgZGlhbG9nIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IGRpYWxvZ2NhbmNlbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIHdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxlZC5bL2VuXVxuICAgKiBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGRpYWxvZy5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOBruimi+OBn+ebruOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNhbmNlbGFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBkaWFsb2cgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgpLoqK3lrprjgZnjgovjgajjgIHjg4DjgqTjgqLjg63jgrDjga7og4zmma/jgpLjgr/jg4Pjg5fjgZfjgZ/jgopBbmRyb2lk44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44KS5oq844GZ44Go44OA44Kk44Ki44Ot44Kw44GM6ZaJ44GY44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBkaWFsb2cgaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga9kaXNhYmxlZOeKtuaFi+OBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgZGlhbG9nLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAgb3IgYFwiZGVmYXVsdFwiYC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBp+OBr1wibm9uZVwi44GLXCJkZWZhdWx0XCLjgYzmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgILkvovvvJp7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1hc2stY29sb3JcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgcmdiYSgwLCAwLCAwLCAwLjIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgXCJyZ2JhKDAsIDAsIDAsIDAuMilcIi5bL2VuXVxuICAgKiAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglwicmdiYSgwLCAwLCAwLCAwLjIpXCLjgYzjg4fjg5Xjgqnjg6vjg4jlgKTjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgYWxlcnQgZGlhbG9nIGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeimgee0oOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICovXG4gIGdldCBfbWFzaygpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5hbGVydC1kaWFsb2ctbWFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqL1xuICBnZXQgX2RpYWxvZygpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5hbGVydC1kaWFsb2cnKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqL1xuICBnZXQgX3RpdGxlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcy5fZGlhbG9nLmNoaWxkcmVuWzBdLCAnLmFsZXJ0LWRpYWxvZy10aXRsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqL1xuICBnZXQgX2NvbnRlbnRFbGVtZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLl9kaWFsb2cuY2hpbGRyZW5bMF0sICcuYWxlcnQtZGlhbG9nLWNvbnRlbnQnKTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgYW5pbWF0b3JzOiBfYW5pbWF0b3JEaWN0LFxuICAgICAgYmFzZUNsYXNzOiBBbGVydERpYWxvZ0FuaW1hdG9yLFxuICAgICAgYmFzZUNsYXNzTmFtZTogJ0FsZXJ0RGlhbG9nQW5pbWF0b3InLFxuICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpXG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLnN0eWxlLnpJbmRleCA9IDEwMDAxO1xuXG4gICAgLyoqXG4gICAgICogRXhwZWN0ZWQgcmVzdWx0IGFmdGVyIGNvbXBpbGU6XG4gICAgICpcbiAgICAgKiA8b25zLWFsZXJ0LWRpYWxvZyBzdHlsZT1cIm5vbmVcIj5cbiAgICAgKiAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctbWFza1wiPjwvZGl2PlxuICAgICAqICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZ1wiPlxuICAgICAqICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWNvbnRhaW5lclwiPi4uLjwvZGl2PlxuICAgICAqICAgPC9kaXY+XG4gICAgICogPC9vbnMtYWxlcnQtZGlhbG9nPlxuICAgICAqL1xuXG4gICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgIGlmICghdGhpcy5fbWFzayAmJiAhdGhpcy5fZGlhbG9nKSB7XG4gICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKSB7XG4gICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX21hc2spIHtcbiAgICAgIGNvbnN0IG1hc2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1hc2suY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nLW1hc2snKTtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKG1hc2ssIHRoaXMuY2hpbGRyZW5bMF0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZGlhbG9nKSB7XG4gICAgICBjb25zdCBkaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpYWxvZy5jbGFzc0xpc3QuYWRkKCdhbGVydC1kaWFsb2cnKTtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGRpYWxvZywgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZCh0aGlzLl9kaWFsb2csICcuYWxlcnQtZGlhbG9nLWNvbnRhaW5lcicpKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdhbGVydC1kaWFsb2ctY29udGFpbmVyJyk7XG4gICAgICB0aGlzLl9kaWFsb2cuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaWFsb2cuY2hpbGRyZW5bMF0uYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgICB0aGlzLl9kaWFsb2cuc3R5bGUuekluZGV4ID0gMjAwMDE7XG4gICAgdGhpcy5fbWFzay5zdHlsZS56SW5kZXggPSAyMDAwMDtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNhbmNlbGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBkaWFsb2cgaXMgY2FuY2VsYWJsZSBvciBub3QuIEEgY2FuY2VsYWJsZSBkaWFsb2cgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogICBbamFd44Gd44Gu44OA44Kk44Ki44Ot44Kw44GM44Kt44Oj44Oz44K744Or5Y+v6IO944GL44Gp44GG44GL44KS6KGo44GX44G+44GZ44CC44Kt44Oj44Oz44K744Or5Y+v6IO944Gq44OA44Kk44Ki44Ot44Kw44Gv44CB6IOM5pmv44KS44K/44OD44OX44GZ44KL44GLQW5kcm9pZOODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OCkuaKvOOBmeOBk+OBqOOBp+mWieOBmOOCi+OBk+OBqOOBjOWHuuadpeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWFza0NvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3coW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJmYWRlXCJgIGFuZCBgXCJub25lXCJgLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAguaMh+WumuOBp+OBjeOCi+OBruOBr+OAgVwiZmFkZVwiLCBcIm5vbmVcIuOBruOBhOOBmuOCjOOBi+OBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiAgYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiA8Y29kZT57ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPiBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSBhZnRlciB0aGUgZGlhbG9nIGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOCi+OCs+ODvOODq+ODkOODg+OCr+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBhbGVydCBkaWFsb2cuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dQSBgUHJvbWlzZWAgb2JqZWN0IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRpc3BsYXllZCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXeihqOekuuOBleOCjOOCi+imgee0oOOCkuino+axuuOBmeOCi2BQcm9taXNlYOOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwiZmFkZVwiYCBhbmQgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcImZhZGVcIiwgXCJub25lXCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gIDxjb2RlPntkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ308L2NvZGU+Wy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIDxjb2RlPntkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ308L2NvZGU+IFsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1GdW5jdGlvbiB0byBleGVjdXRlIGFmdGVyIHRoZSBkaWFsb2cgaGFzIGJlZW4gaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruODgOOCpOOCouODreOCsOOBjOmWieOBmOOBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOCi+OCs+ODvOODq+ODkOODg+OCr+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1IaWRlIHRoZSBhbGVydCBkaWFsb2cuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44KS6ZaJ44GY44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGhpZGRlbiBlbGVtZW50Wy9lbl1cbiAgICogICBbamFd6Zqg44KM44Gf6KaB57Sg44KS6Kej5rG644GZ44KLYFByb21pc2Vg44Kq44OW44K444Kn44Kv44OI44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeimgee0oOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtEaWFsb2dBbmltYXRvcn0gQW5pbWF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgQWxlcnREaWFsb2dBbmltYXRvcikpIHtcbiAgICAgIHV0aWwudGhyb3dBbmltYXRvcignQWxlcnREaWFsb2cnKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IEFsZXJ0RGlhbG9nQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIEFsZXJ0RGlhbG9nQW5pbWF0b3I7XG4gIH1cbn1cblxub25zRWxlbWVudHMuQWxlcnREaWFsb2cgPSBBbGVydERpYWxvZ0VsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1hbGVydC1kaWFsb2cnLCBBbGVydERpYWxvZ0VsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUJ1dHRvbkVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtYnV0dG9uLmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYWxlcnQtZGlhbG9nLWJ1dHRvblxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gYWxlcnQtZGlhbG9nIGJ1dHRvbi5bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtYWxlcnQtZGlhbG9nXG4gKiAgIFtlbl1UaGUgYDxvbnMtYWxlcnQtZGlhbG9nPmAgY29tcG9uZW50IGRpc3BsYXlzIGEgYWxlcnQgZGlhbG9nLlsvZW5dXG4gKiAgIFtqYV1vbnMtYWxlcnQtZGlhbG9n44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiAgPG9ucy1hbGVydC1kaWFsb2c+XG4gKiAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLXRpdGxlXCI+V2FybmluZyE8L2Rpdj5cbiAqICAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctY29udGVudFwiPlxuICogICAgICBBbiBlcnJvciBoYXMgb2NjdXJyZWQhXG4gKiAgICA8L2Rpdj5cbiAqICAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctZm9vdGVyXCI+XG4gKiAgICAgIDxhbGVydC1kaWFsb2ctYnV0dG9uIG9uY2xpY2s9XCJhcHAuY2xvc2UoKVwiPkNhbmNlbDwvYWxlcnQtZGlhbG9nLWJ1dHRvbj5cbiAqICAgICAgPGFsZXJ0LWRpYWxvZy1idXR0b24gY2xhc3M9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCIgb25jbGljaz1cImFwcC5jbG9zZSgpXCI+T0s8L2FsZXJ0LWRpYWxvZy1idXR0b24+XG4gKiAgICA8L2Rpdj5cbiAqICA8L29ucy1hbGVydC1kaWFsb2c+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFsZXJ0RGlhbG9nQnV0dG9uRWxlbWVudCBleHRlbmRzIEJhc2VCdXR0b25FbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGJ1dHRvbi5bL2VuXVxuICAgKiAgIFtqYV3jg5zjgr/jg7Pjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OCkueEoeWKueWMluOBmeOCi+WgtOWQiOOBr+aMh+WumuOBl+OBpuOBj+OBoOOBleOBhOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4geyAnJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLSonIH07XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdhbGVydC1kaWFsb2ctYnV0dG9uJztcbiAgfVxuXG4gIGdldCBfcmlwcGxlT3B0KCkge1xuICAgIHJldHVybiBbdGhpcywgdW5kZWZpbmVkLCB7ICdtb2RpZmllcic6ICdsaWdodC1ncmF5JyB9XTtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5BbGVydERpYWxvZ0J1dHRvbiA9IEFsZXJ0RGlhbG9nQnV0dG9uRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWFsZXJ0LWRpYWxvZy1idXR0b24nLCBBbGVydERpYWxvZ0J1dHRvbkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdiYWNrLWJ1dHRvbic7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdiYWNrLWJ1dHRvbi0tKicsXG4gICcuYmFjay1idXR0b25fX2ljb24nOiAnYmFjay1idXR0b24tLSpfX2ljb24nLFxuICAnLmJhY2stYnV0dG9uX19sYWJlbCc6ICdiYWNrLWJ1dHRvbi0tKl9fbGFiZWwnXG59O1xuXG4vLyBvcmlnaW5hbCBpbWFnZSBmaWxlIGF0IG1pc2MvaW1hZ2VzL2lvcy1iYWNrLWJ1dHRvbi1pY29uLnN2Z1xuY29uc3QgaW9zQmFja0J1dHRvbkljb24gPSBgXG4gIDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuICA8c3ZnIHdpZHRoPVwiMTNweFwiIGhlaWdodD1cIjIxcHhcIiB2aWV3Qm94PVwiMCAwIDEzIDIxXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj5cbiAgICAgIDx0aXRsZT5pb3MtYmFjay1idXR0b24taWNvbjwvdGl0bGU+XG4gICAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz5cbiAgICAgIDxkZWZzPjwvZGVmcz5cbiAgICAgIDxnIGlkPVwidG9vbGJhci1iYWNrLWJ1dHRvblwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICAgIDxnIGlkPVwiaW9zXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0zNC4wMDAwMDAsIC0zMC4wMDAwMDApXCI+XG4gICAgICAgICAgICAgIDxwb2x5Z29uIGlkPVwiaW9zLWJhY2stYnV0dG9uLWljb25cIiBwb2ludHM9XCIzNCA0MC41IDQ0LjUgMzAgNDYuNSAzMiAzOCA0MC41IDQ2LjUgNDkgNDQuNSA1MVwiPjwvcG9seWdvbj5cbiAgICAgICAgICA8L2c+XG4gICAgICA8L2c+XG4gIDwvc3ZnPlxuYDtcblxuLy8gb3JpZ2luYWwgaW1hZ2UgZmlsZSBhdCBtaXNjL2ltYWdlcy9tZC1iYWNrLWJ1dHRvbi1pY29uLnN2Z1xuY29uc3QgbWRCYWNrQnV0dG9uSWNvbiA9IGBcbiAgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4gIDxzdmcgd2lkdGg9XCIxNnB4XCIgaGVpZ2h0PVwiMTZweFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPlxuICAgICAgPHRpdGxlPm1kLWJhY2stYnV0dG9uLWljb248L3RpdGxlPlxuICAgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+XG4gICAgICA8ZGVmcz48L2RlZnM+XG4gICAgICA8ZyBpZD1cInRvb2xiYXItYmFjay1idXR0b25cIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICA8ZyBpZD1cImFuZHJvaWRcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTMyLjAwMDAwMCwgLTMyLjAwMDAwMClcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCI+XG4gICAgICAgICAgICAgIDxwb2x5Z29uIGlkPVwibWQtYmFjay1idXR0b24taWNvblwiIHBvaW50cz1cIjQ4IDM5IDM1LjgzIDM5IDQxLjQyIDMzLjQxIDQwIDMyIDMyIDQwIDQwIDQ4IDQxLjQxIDQ2LjU5IDM1LjgzIDQxIDQ4IDQxXCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvZz5cbiAgICAgIDwvZz5cbiAgPC9zdmc+XG5gO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1iYWNrLWJ1dHRvblxuICogQGNhdGVnb3J5IG5hdmlnYXRpb25cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQmFjayBidXR0b24gY29tcG9uZW50IGZvciBgPG9ucy10b29sYmFyPmAuIFB1dCBpdCBpbiB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBgPG9ucy10b29sYmFyPmAuXG4gKlxuICogICAgIEl0IHdpbGwgZmluZCB0aGUgcGFyZW50IGA8b25zLW5hdmlnYXRvcj5gIGVsZW1lbnQgYW5kIHBvcCBhIHBhZ2Ugd2hlbiBjbGlja2VkLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZW4gYnkgc3BlY2lmeWluZyB0aGUgYG9uQ2xpY2tgIHByb3BlcnR5IGFuZCBjYWxsaW5nIGV2ZW50LnByZXZlbnREZWZhdWx0IGluIGl0cyBjYWxsYmFjay5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBhSG1HTFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2JhY2stYnV0dG9uXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiBzdHlsZVsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXRvb2xiYXJcbiAqICAgW2VuXW9ucy10b29sYmFyIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtdG9vbGJhcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbmF2aWdhdG9yXG4gKiAgIFtlbl1vbnMtbmF2aWdhdG9yIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbmF2aWdhdG9y44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXRvb2xiYXI+XG4gKiAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gKiAgICAgPG9ucy1iYWNrLWJ1dHRvbj5CYWNrPC9vbnMtYmFjay1idXR0b24+XG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gKiAgICAgVGl0bGVcbiAqICAgPGRpdj5cbiAqIDwvb25zLXRvb2xiYXI+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja0J1dHRvbkVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBiYWNrIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXeODkOODg+OCr+ODnOOCv+ODs+OBruimi+OBn+ebruOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fb3B0aW9ucyA9IHt9O1xuICAgIHRoaXMuX2JvdW5kT25DbGljayA9IHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKTtcblxuICAgIGNvbnN0IHtvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWR9ID0gdXRpbC5kZWZpbmVMaXN0ZW5lclByb3BlcnR5KHRoaXMsICdjbGljaycpO1xuICAgIHRoaXMuX2Nvbm5lY3RPbkNsaWNrID0gb25Db25uZWN0ZWQ7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uQ2xpY2sgPSBvbkRpc2Nvbm5lY3RlZDtcbiAgfVxuXG4gIF91cGRhdGVJY29uKGljb24gPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmJhY2stYnV0dG9uX19pY29uJykpIHtcbiAgICBpY29uLmlubmVySFRNTCA9IGF1dG9TdHlsZS5nZXRQbGF0Zm9ybSh0aGlzKSA9PT0gJ2FuZHJvaWQnIHx8IHV0aWwuaGFzTW9kaWZpZXIodGhpcywgJ21hdGVyaWFsJykgPyBtZEJhY2tCdXR0b25JY29uIDogaW9zQmFja0J1dHRvbkljb247XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5iYWNrLWJ1dHRvbl9fbGFiZWwnKSkge1xuICAgICAgY29uc3QgbGFiZWwgPSB1dGlsLmNyZWF0ZSgnc3Bhbi5iYWNrLWJ1dHRvbl9fbGFiZWwnKTtcblxuICAgICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgICBsYWJlbC5hcHBlbmRDaGlsZCh0aGlzLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmJhY2stYnV0dG9uX19pY29uJykpIHtcbiAgICAgIGNvbnN0IGljb24gPSB1dGlsLmNyZWF0ZSgnc3Bhbi5iYWNrLWJ1dHRvbl9faWNvbicpO1xuICAgICAgdGhpcy5fdXBkYXRlSWNvbihpY29uKTtcblxuICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoaWNvbiwgdGhpcy5jaGlsZHJlblswXSk7XG4gICAgfVxuXG4gICAgdXRpbC51cGRhdGVSaXBwbGUodGhpcywgdW5kZWZpbmVkLCB7Y2VudGVyOiAnJywgJ3NpemUnOiAnY29udGFpbicsICdiYWNrZ3JvdW5kJzogJ3RyYW5zcGFyZW50J30pO1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1PcHRpb25zIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9wdGlvbnMuYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIFwic2xpZGVcIiwgXCJsaWZ0XCIsIFwiZmFkZVwiIGFuZCBcIm5vbmVcIi5cbiAgICogICAgIFRoZXNlIGFyZSBwbGF0Zm9ybSBiYXNlZCBhbmltYXRpb25zLiBGb3IgZml4ZWQgYW5pbWF0aW9ucywgYWRkIFwiLWlvc1wiIG9yIFwiLW1kXCJcbiAgICogICAgIHN1ZmZpeCB0byB0aGUgYW5pbWF0aW9uIG5hbWUuIEUuZy4gXCJsaWZ0LWlvc1wiLCBcImxpZnQtbWRcIi4gRGVmYXVsdHMgdmFsdWVzIGFyZSBcInNsaWRlLWlvc1wiIGFuZCBcImZhZGUtbWRcIi5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YFsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAgWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zLmNhbGxiYWNrXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2l0aW9uIGhhcyBlbmRlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jg6Hjgr3jg4Pjg4njgavjgojjgovnlLvpnaLpgbfnp7vjgYzntYLkuobjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIHNldCBvcHRpb25zKG9iamVjdCkge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9uQ2xpY2tcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiYWNrIGJ1dHRvbiBiZWhhdmlvci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICBfb25DbGljayhldmVudCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRvciA9IHV0aWwuZmluZFBhcmVudCh0aGlzLCAnb25zLW5hdmlnYXRvcicpO1xuICAgICAgICBpZiAobmF2aWdhdG9yKSB7XG4gICAgICAgICAgbmF2aWdhdG9yLnBvcFBhZ2Uoey4uLnRoaXMub3B0aW9ucywgb25zQmFja0J1dHRvbjogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrLCBmYWxzZSk7XG4gICAgdGhpcy5fY29ubmVjdE9uQ2xpY2soKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbW9kaWZpZXInOiB7XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpICYmIHRoaXMuX3VwZGF0ZUljb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBzaG93KCkge1xuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cblxub25zRWxlbWVudHMuQmFja0J1dHRvbiA9IEJhY2tCdXR0b25FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYmFjay1idXR0b24nLCBCYWNrQnV0dG9uRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdib3R0b20tYmFyJztcbmNvbnN0IHNjaGVtZSA9IHsnJzogJ2JvdHRvbS1iYXItLSonfTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYm90dG9tLXRvb2xiYXJcbiAqIEBjYXRlZ29yeSBwYWdlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRvb2xiYXIgY29tcG9uZW50IHRoYXQgaXMgcG9zaXRpb25lZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLiBTaW5jZSBib3R0b20gdG9vbGJhcnMgYXJlIHZlcnkgdmVyc2F0aWxlIGVsZW1lbnRzLCBgb25zLWJvdHRvbS10b29sYmFyYCBkb2VzIG5vdCBwcm92aWRlIGFueSBzcGVjaWZpYyBsYXlvdXQgc3ludGF4IGZvciBpdHMgY2hpbGRyZW4uIE1vZGlmaWVycyBvciBjdXN0b20gQ1NTIG11c3QgYmUgdXNlZC5bL2VuXVxuICogICBbamFd44Oa44O844K45LiL6YOo44Gr6YWN572u44GV44KM44KL44OE44O844Or44OQ44O855So44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciB0cmFuc3BhcmVudFxuICogICBbZW5dTWFrZSB0aGUgdG9vbGJhciB0cmFuc3BhcmVudC5bL2VuXVxuICogICBbamFd44OE44O844Or44OQ44O844Gu6IOM5pmv44KS6YCP5piO44Gr44GX44Gm6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBhbGlnbmVkXG4gKiAgIFtlbl1WZXJ0aWNhbGx5IGFsaWducyBpdHMgY2hpbGRyZW4gYW5kIGFwcGxpZXMgZmxleGJveCBmb3IgYmxvY2sgZWxlbWVudHMuIGBqdXN0aWZ5LWNvbnRlbnRgIENTUyBydWxlIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSBob3Jpem9udGFsIGFsaWduLlsvZW5dXG4gKiAgIFtqYV3jg4Tjg7zjg6vjg5Djg7zjga7og4zmma/jgpLpgI/mmI7jgavjgZfjgabooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQHNlZWFsc28gb25zLXRvb2xiYXIgW2VuXW9ucy10b29sYmFyIGNvbXBvbmVudFsvZW5dW2phXW9ucy10b29sYmFy44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWJvdHRvbS10b29sYmFyPlxuICogICBDb250ZW50XG4gKiA8L29ucy1ib3R0b20tdG9vbGJhcj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm90dG9tVG9vbGJhckVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgdG9vbGJhci5bL2VuXVxuICAgKiAgIFtqYV3jg4Tjg7zjg6vjg5Djg7zjga7opovjgZ/nm67jga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG59XG5cbm9uc0VsZW1lbnRzLkJvdHRvbVRvb2xiYXIgPSBCb3R0b21Ub29sYmFyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWJvdHRvbS10b29sYmFyJywgQm90dG9tVG9vbGJhckVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUJ1dHRvbkVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtYnV0dG9uLmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYnV0dG9uXG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQG1vZGlmaWVyIG91dGxpbmVcbiAqICAgW2VuXUJ1dHRvbiB3aXRoIG91dGxpbmUgYW5kIHRyYW5zcGFyZW50IGJhY2tncm91bmRbL2VuXVxuICogICBbamFd44Ki44Km44OI44Op44Kk44Oz44KS5oyB44Gj44Gf44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBsaWdodFxuICogICBbZW5dQnV0dG9uIHRoYXQgZG9lc24ndCBzdGFuZCBvdXQuWy9lbl1cbiAqICAgW2phXeebrueri+OBn+OBquOBhOODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgcXVpZXRcbiAqICAgW2VuXUJ1dHRvbiB3aXRoIG5vIG91dGxpbmUgYW5kIG9yIGJhY2tncm91bmQuLlsvZW5dXG4gKiAgIFtqYV3mnqDnt5rjgoTog4zmma/jgYznhKHjgYTmloflrZfjgaDjgZHjga7jg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIGN0YVxuICogICBbZW5dQnV0dG9uIHRoYXQgcmVhbGx5IHN0YW5kcyBvdXQuWy9lbl1cbiAqICAgW2phXeebrueri+OBpOODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbGFyZ2VcbiAqICAgW2VuXUxhcmdlIGJ1dHRvbiB0aGF0IGNvdmVycyB0aGUgd2lkdGggb2YgdGhlIHNjcmVlbi5bL2VuXVxuICogICBbamFd5qiq44GE44Gj44Gx44GE44Gr5bqD44GM44KL5aSn44GN44Gq44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBsYXJnZS0tcXVpZXRcbiAqICAgW2VuXUxhcmdlIHF1aWV0IGJ1dHRvbi5bL2VuXVxuICogICBbamFd5qiq44GE44Gj44Gx44GE44Gr5bqD44GM44KLcXVpZXTjg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIGxhcmdlLS1jdGFcbiAqICAgW2VuXUxhcmdlIGNhbGwgdG8gYWN0aW9uIGJ1dHRvbi5bL2VuXVxuICogICBbamFd5qiq44GE44Gj44Gx44GE44Gr5bqD44GM44KLY3Rh44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIGJ1dHRvblsvZW5dXG4gKiAgIFtqYV3jg57jg4bjg6rjgqLjg6vjg4fjgrbjgqTjg7Pjga7jg5zjgr/jg7NbL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsLS1mbGF0XG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gZmxhdCBidXR0b25bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44OV44Op44OD44OI44Oc44K/44OzWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQnV0dG9uIGNvbXBvbmVudC4gSWYgeW91IHdhbnQgdG8gcGxhY2UgYSBidXR0b24gaW4gYSB0b29sYmFyLCB1c2UgYDxvbnMtdG9vbGJhci1idXR0b24+YCBvciBgPG9ucy1iYWNrLWJ1dHRvbj5gIGluc3RlYWQuXG4gKlxuICogICAgIFdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5IGFzIGEgTWF0ZXJpYWwgRGVzaWduIGJ1dHRvbiB3aXRoIGEgcmlwcGxlIGVmZmVjdCBvbiBBbmRyb2lkLlxuICogICBbL2VuXVxuICogICBbamFd44Oc44K/44Oz55So44Kz44Oz44Od44O844ON44Oz44OI44CC44OE44O844Or44OQ44O844Gr44Oc44K/44Oz44KS6Kit572u44GZ44KL5aC05ZCI44Gv44CBb25zLXRvb2xiYXItYnV0dG9u44KC44GX44GP44Gvb25zLWJhY2stYnV0dG9u44Kz44Oz44Od44O844ON44Oz44OI44KS5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIGhMYXl4XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvYnV0dG9uXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI21vZGlmaWVycyBbZW5dTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBgbW9kaWZpZXJgIGF0dHJpYnV0ZVsvZW5dW2phXW1vZGlmaWVy5bGe5oCn44Gu5L2/44GE5pa5Wy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjY3Jvc3MtcGxhdGZvcm0tc3R5bGluZy1hdXRvc3R5bGluZyBbZW5dSW5mb3JtYXRpb24gYWJvdXQgY3Jvc3MgcGxhdGZvcm0gc3R5bGluZ1svZW5dW2phXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYnV0dG9uIG1vZGlmaWVyPVwibGFyZ2UtLWN0YVwiPlxuICogICBUYXAgTWVcbiAqIDwvb25zLWJ1dHRvbj5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdXR0b25FbGVtZW50IGV4dGVuZHMgQmFzZUJ1dHRvbkVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBidXR0b24uWy9lbl1cbiAgICogIFtqYV3jg5zjgr/jg7Pjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSByaXBwbGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSByaXBwbGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVdoZXRoZXIgdGhlIGJ1dHRvbiBoYXMgYSByaXBwbGUgZWZmZWN0IG9yIG5vdC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IGlmIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44Oc44K/44Oz44KS54Sh5Yq55YyW44GZ44KL5aC05ZCI44Gv5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHsgJyc6ICdidXR0b24tLSonIH07XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdidXR0b24nO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkJ1dHRvbiA9IEJ1dHRvbkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1idXR0b24nLCBCdXR0b25FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnY2FyZCc7XG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAnY2FyZC0tKicsXG4gICcuY2FyZF9fdGl0bGUnOiAnY2FyZC0tKl9fdGl0bGUnLFxuICAnLmNhcmRfX2NvbnRlbnQnOiAnY2FyZC0tKl9fY29udGVudCdcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWNhcmRcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dQSBjYXJkIHdpdGggbWF0ZXJpYWwgZGVzaWduLlsvZW5dXG4gKiAgIFtqYV3jg6rjgrnjg4jjga7kuIrkuIvjga7jg5zjg7zjg4Djg7zjgYznhKHjgYTjg6rjgrnjg4jjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgIENvbXBvbmVudCB0byBjcmVhdGUgYSBjYXJkIHRoYXQgZGlzcGxheXMgc29tZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiAgICBUaGUgY2FyZCBtYXkgYmUgY29tcG9zZWQgYnkgZGl2cyB3aXRoIHNwZWNpYWxseSBwcmVwYXJlZCBjbGFzc2VzIGB0aXRsZWAgYW5kL29yIGBjb250ZW50YC4gWW91IGNhbiBhbHNvIGFkZCB5b3VyIG93biBjb250ZW50IGFzIHlvdSBwbGVhc2UuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvY2FyZFxuICogQGV4YW1wbGVcbiAqIDxvbnMtY2FyZD5cbiAqICAgPHA+U29tZSBjb250ZW50PC9wPlxuICogPC9vbnMtY2FyZD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FyZEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBjYXJkLlsvZW5dXG4gICAqICAgW2phXeODquOCueODiOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgbGV0IHRpdGxlLCBjb250ZW50O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuY2hpbGRyZW5baV07XG5cbiAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3RpdGxlJykpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnY2FyZF9fdGl0bGUnKTtcbiAgICAgICAgdGl0bGUgPSBlbDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnY29udGVudCcpKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NhcmRfX2NvbnRlbnQnKTtcbiAgICAgICAgY29udGVudCA9IGVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuQ2FyZCA9IENhcmRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtY2FyZCcsIENhcmRFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5jb25zdCBzY2hlbWUgPSB7Jyc6ICdjYXJvdXNlbC1pdGVtLS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWNhcm91c2VsLWl0ZW1cbiAqIEBjYXRlZ29yeSBjYXJvdXNlbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDYXJvdXNlbCBpdGVtIGNvbXBvbmVudC4gVXNlZCBhcyBhIGNoaWxkIG9mIHRoZSBgPG9ucy1jYXJvdXNlbD5gIGVsZW1lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4geGJiek9RXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvY2Fyb3VzZWxcbiAqIEBzZWVhbHNvIG9ucy1jYXJvdXNlbFxuICogICBbZW5dYDxvbnMtY2Fyb3VzZWw+YCBjb21wb25lbnRzWy9lbl1cbiAqICAgW2phXTxvbnMtY2Fyb3VzZWw+44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWNhcm91c2VsIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMjAwcHhcIj5cbiAqICAgPG9ucy1jYXJvdXNlbC1pdGVtPlxuICogICAgLi4uXG4gKiAgIDwvb25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgIDxvbnMtY2Fyb3VzZWwtaXRlbT5cbiAqICAgIC4uLlxuICogICA8L29ucy1jYXJvdXNlbC1pdGVtPlxuICogPC9vbnMtY2Fyb3VzZWw+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcm91c2VsSXRlbUVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuQ2Fyb3VzZWxJdGVtID0gQ2Fyb3VzZWxJdGVtRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWNhcm91c2VsLWl0ZW0nLCBDYXJvdXNlbEl0ZW1FbGVtZW50KTtcbiIsImltcG9ydCB1dGlsIGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vYW5pbWl0LmpzJztcbmltcG9ydCBHZXN0dXJlRGV0ZWN0b3IgZnJvbSAnLi4vZ2VzdHVyZS1kZXRlY3Rvci5qcyc7XG5cbmNvbnN0IGRpcmVjdGlvbk1hcCA9IHtcbiAgdmVydGljYWw6IHtcbiAgICBheGlzOiAnWScsXG4gICAgc2l6ZTogJ0hlaWdodCcsXG4gICAgZGlyOiBbJ3VwJywgJ2Rvd24nXSxcbiAgICB0M2Q6IFsnMHB4LCAnLCAncHgsIDBweCddXG4gIH0sXG4gIGhvcml6b250YWw6IHtcbiAgICBheGlzOiAnWCcsXG4gICAgc2l6ZTogJ1dpZHRoJyxcbiAgICBkaXI6IFsnbGVmdCcsICdyaWdodCddLFxuICAgIHQzZDogWycnLCAncHgsIDBweCwgMHB4J11cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpcGVyIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgLy8gUGFyYW1ldGVyc1xuICAgIGNvbnN0IEZBTFNFID0gKCgpID0+IGZhbHNlKTtcbiAgICBgZ2V0SW5pdGlhbEluZGV4IGdldEJ1YmJsZVdpZHRoIGlzVmVydGljYWwgaXNPdmVyU2Nyb2xsYWJsZSBpc0NlbnRlcmVkXG4gICAgaXNBdXRvU2Nyb2xsYWJsZSByZWZyZXNoSG9vayBwcmVDaGFuZ2VIb29rIHBvc3RDaGFuZ2VIb29rIG92ZXJTY3JvbGxIb29rYFxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5mb3JFYWNoKGtleSA9PiB0aGlzW2tleV0gPSBwYXJhbXNba2V5XSB8fCBGQUxTRSk7XG5cbiAgICB0aGlzLmdldEVsZW1lbnQgPSBwYXJhbXMuZ2V0RWxlbWVudDsgLy8gUmVxdWlyZWRcbiAgICB0aGlzLnNjcm9sbEhvb2sgPSBwYXJhbXMuc2Nyb2xsSG9vazsgLy8gT3B0aW9uYWxcbiAgICB0aGlzLml0ZW1TaXplID0gcGFyYW1zLml0ZW1TaXplIHx8ICcxMDAlJztcblxuICAgIHRoaXMuZ2V0QXV0b1Njcm9sbFJhdGlvID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGxldCByYXRpbyA9IHBhcmFtcy5nZXRBdXRvU2Nyb2xsUmF0aW8gJiYgcGFyYW1zLmdldEF1dG9TY3JvbGxSYXRpbyguLi5hcmdzKTtcbiAgICAgIHJhdGlvID0gdHlwZW9mIHJhdGlvID09PSAnbnVtYmVyJyAmJiByYXRpbyA9PT0gcmF0aW8gPyByYXRpbyA6IC41O1xuICAgICAgaWYgKHJhdGlvIDwgMC4wIHx8IHJhdGlvID4gMS4wKSB7XG4gICAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgYXV0by1zY3JvbGwtcmF0aW8gJyArIHJhdGlvICsgJy4gTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXRpbztcbiAgICB9O1xuXG4gICAgLy8gUHJldmVudCBjbGlja3Mgb25seSBvbiBkZXNrdG9wXG4gICAgdGhpcy5zaG91bGRCbG9jayA9IHV0aWwuZ2xvYmFscy5hY3R1YWxNb2JpbGVPUyA9PT0gJ290aGVyJztcblxuICAgIC8vIEJpbmQgaGFuZGxlcnNcbiAgICB0aGlzLm9uRHJhZ1N0YXJ0ID0gdGhpcy5vbkRyYWdTdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25EcmFnID0gdGhpcy5vbkRyYWcuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZ0VuZCA9IHRoaXMub25EcmFnRW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vblJlc2l6ZSA9IHRoaXMub25SZXNpemUuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX3Nob3VsZEZpeFNjcm9sbCA9IHV0aWwuZ2xvYmFscy5hY3R1YWxNb2JpbGVPUyA9PT0gJ2lvcyc7XG4gIH1cblxuICBpbml0KHsgc3dpcGVhYmxlLCBhdXRvUmVmcmVzaCB9ID0ge30pIHtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnRhcmdldCA9IHRoaXMuZ2V0RWxlbWVudCgpLmNoaWxkcmVuWzBdO1xuICAgIHRoaXMuYmxvY2tlciA9IHRoaXMuZ2V0RWxlbWVudCgpLmNoaWxkcmVuWzFdO1xuICAgIGlmICghdGhpcy50YXJnZXQgfHwgIXRoaXMuYmxvY2tlcikge1xuICAgICAgdXRpbC50aHJvdygnRXhwZWN0ZWQgXCJ0YXJnZXRcIiBhbmQgXCJibG9ja2VyXCIgZWxlbWVudHMgdG8gZXhpc3QgYmVmb3JlIGluaXRpYWxpemluZyBTd2lwZXInKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvdWxkQmxvY2spIHtcbiAgICAgIHRoaXMuYmxvY2tlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIEFkZCBjbGFzc2VzXG4gICAgdGhpcy5nZXRFbGVtZW50KCkuY2xhc3NMaXN0LmFkZCgnb25zLXN3aXBlcicpO1xuICAgIHRoaXMudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ29ucy1zd2lwZXItdGFyZ2V0Jyk7XG4gICAgdGhpcy5ibG9ja2VyLmNsYXNzTGlzdC5hZGQoJ29ucy1zd2lwZXItYmxvY2tlcicpO1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzXG4gICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbmV3IEdlc3R1cmVEZXRlY3Rvcih0aGlzLmdldEVsZW1lbnQoKSxcbiAgICAgIHsgZHJhZ01pbkRpc3RhbmNlOiAxLCBkcmFnTG9ja1RvQXhpczogdHJ1ZSwgcGFzc2l2ZTogIXRoaXMuX3Nob3VsZEZpeFNjcm9sbCB9XG4gICAgKTtcbiAgICB0aGlzLl9tdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xuICAgIHRoaXMudXBkYXRlU3dpcGVhYmxlKHN3aXBlYWJsZSk7XG4gICAgdGhpcy51cGRhdGVBdXRvUmVmcmVzaChhdXRvUmVmcmVzaCk7XG5cbiAgICAvLyBTZXR1cCBpbml0aWFsIGxheW91dFxuICAgIHRoaXMuX3Njcm9sbCA9IHRoaXMuX29mZnNldCA9IHRoaXMuX2xhc3RBY3RpdmVJbmRleCA9IDA7XG4gICAgdGhpcy5fdXBkYXRlTGF5b3V0KCk7XG4gICAgdGhpcy5fc2V0dXBJbml0aWFsSW5kZXgoKTtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLl9zZXR1cEluaXRpYWxJbmRleCgpKTtcblxuICAgIC8vIEZpeCByZW5kZXJpbmcgZ2xpdGNoIG9uIEFuZHJvaWQgNC4xXG4gICAgLy8gRml4IGZvciBpZnJhbWVzIHdoZXJlIHRoZSB3aWR0aCBpcyBpbmNvbnNpc3RlbnQgYXQgdGhlIGJlZ2lubmluZ1xuICAgIGlmICh3aW5kb3cgIT09IHdpbmRvdy5wYXJlbnQgfHwgdGhpcy5vZmZzZXRIZWlnaHQgPT09IDApIHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLm9uUmVzaXplKCkpO1xuICAgIH1cbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlU3dpcGVhYmxlKGZhbHNlKTtcbiAgICB0aGlzLnVwZGF0ZUF1dG9SZWZyZXNoKGZhbHNlKTtcblxuICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciAmJiB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5ibG9ja2VyID0gdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IG51bGw7XG5cbiAgICB0aGlzLnNldHVwUmVzaXplKGZhbHNlKTtcbiAgfVxuXG4gIG9uUmVzaXplKCkge1xuICAgIGNvbnN0IGkgPSB0aGlzLl9zY3JvbGwgLyB0aGlzLml0ZW1OdW1TaXplO1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgdGhpcy5zZXRBY3RpdmVJbmRleChpKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIGdldCBpdGVtQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0LmNoaWxkcmVuLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBpdGVtTnVtU2l6ZSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2l0ZW1OdW1TaXplICE9PSAnbnVtYmVyJyB8fCB0aGlzLl9pdGVtTnVtU2l6ZSAhPT0gdGhpcy5faXRlbU51bVNpemUpIHtcbiAgICAgIHRoaXMuX2l0ZW1OdW1TaXplID0gdGhpcy5fY2FsY3VsYXRlSXRlbVNpemUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1OdW1TaXplO1xuICB9XG5cbiAgZ2V0IG1heFNjcm9sbCgpIHtcbiAgICBjb25zdCBtYXggPSB0aGlzLml0ZW1Db3VudCAqIHRoaXMuaXRlbU51bVNpemUgLSB0aGlzLnRhcmdldFNpemU7XG4gICAgcmV0dXJuIE1hdGguY2VpbChtYXggPCAwID8gMCA6IG1heCk7IC8vIE5lZWQgdG8gcmV0dXJuIGFuIGludGVnZXIgdmFsdWUuXG4gIH1cblxuICBfY2FsY3VsYXRlSXRlbVNpemUoKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuaXRlbVNpemUubWF0Y2goL14oXFxkKykocHh8JSkvKTtcblxuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgdXRpbC50aHJvdyhgSW52YWxpZCBzdGF0ZTogc3dpcGVyJ3Mgc2l6ZSB1bml0IG11c3QgYmUgJyUnIG9yICdweCdgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKTtcbiAgICByZXR1cm4gbWF0Y2hlc1syXSA9PT0gJyUnID8gTWF0aC5yb3VuZCh2YWx1ZSAvIDEwMCAqIHRoaXMudGFyZ2V0U2l6ZSkgOiB2YWx1ZTtcbiAgfVxuXG4gIF9zZXR1cEluaXRpYWxJbmRleCgpIHtcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIHRoaXMuX2xhc3RBY3RpdmVJbmRleCA9IE1hdGgubWF4KE1hdGgubWluKE51bWJlcih0aGlzLmdldEluaXRpYWxJbmRleCgpKSwgdGhpcy5pdGVtQ291bnQpLCAwKTtcbiAgICB0aGlzLl9zY3JvbGwgPSB0aGlzLl9vZmZzZXQgKyB0aGlzLml0ZW1OdW1TaXplICogdGhpcy5fbGFzdEFjdGl2ZUluZGV4O1xuICAgIHRoaXMuX3Njcm9sbFRvKHRoaXMuX3Njcm9sbCk7XG4gIH1cblxuICBfc2V0U3dpcGluZyh0b2dnbGUpIHtcbiAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QudG9nZ2xlKCdzd2lwaW5nJywgdG9nZ2xlKTsgLy8gSGlkZXMgZXZlcnl0aGluZyBleGNlcHQgc2hvd24gcGFnZXNcbiAgfVxuXG4gIHNldEFjdGl2ZUluZGV4KGluZGV4LCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLl9zZXRTd2lwaW5nKHRydWUpO1xuICAgIGluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIHRoaXMuaXRlbUNvdW50IC0gMSkpO1xuICAgIGNvbnN0IHNjcm9sbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMubWF4U2Nyb2xsLCB0aGlzLl9vZmZzZXQgKyB0aGlzLml0ZW1OdW1TaXplICogaW5kZXgpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VUbyhzY3JvbGwsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0QWN0aXZlSW5kZXgoc2Nyb2xsID0gdGhpcy5fc2Nyb2xsKSB7XG4gICAgc2Nyb2xsIC09IHRoaXMuX29mZnNldDtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuaXRlbUNvdW50LFxuICAgICAgc2l6ZSA9IHRoaXMuaXRlbU51bVNpemU7XG5cbiAgICBpZiAodGhpcy5pdGVtTnVtU2l6ZSA9PT0gMCB8fCAhdXRpbC5pc0ludGVnZXIoc2Nyb2xsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhc3RBY3RpdmVJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsIDw9IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgaWYgKHNpemUgKiBpIDw9IHNjcm9sbCAmJiBzaXplICogKGkgKyAxKSA+IHNjcm9sbCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY291bnQgLSAxO1xuICB9XG5cbiAgc2V0dXBSZXNpemUoYWRkKSB7XG4gICAgd2luZG93WyhhZGQgPyAnYWRkJyA6ICdyZW1vdmUnKSArICdFdmVudExpc3RlbmVyJ10oJ3Jlc2l6ZScsIHRoaXMub25SZXNpemUsIHRydWUpO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLnNldHVwUmVzaXplKHRydWUpO1xuICAgIHRoaXMub25SZXNpemUoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFyZ2V0ICYmIHRoaXMudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpLCAxMDAwLzYwKTsgLy8gSGlkZSBlbGVtZW50cyBhZnRlciBhbmltYXRpb25zXG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuc2V0dXBSZXNpemUoZmFsc2UpO1xuICAgIHRoaXMudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOyAvLyBTaG93IGVsZW1lbnRzIGJlZm9yZSBhbmltYXRpb25zXG4gIH1cblxuICB1cGRhdGVTd2lwZWFibGUoc2hvdWxkVXBkYXRlKSB7XG4gICAgaWYgKHRoaXMuX2dlc3R1cmVEZXRlY3Rvcikge1xuICAgICAgY29uc3QgYWN0aW9uID0gc2hvdWxkVXBkYXRlID8gJ29uJyA6ICdvZmYnO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWcnLCB0aGlzLm9uRHJhZyk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3JbYWN0aW9uXSgnZHJhZ3N0YXJ0JywgdGhpcy5vbkRyYWdTdGFydCk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3JbYWN0aW9uXSgnZHJhZ2VuZCcsIHRoaXMub25EcmFnRW5kKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVBdXRvUmVmcmVzaChzaG91bGRXYXRjaCkge1xuICAgIGlmICh0aGlzLl9tdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICBzaG91bGRXYXRjaFxuICAgICAgICA/IHRoaXMuX211dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnRhcmdldCwgeyBjaGlsZExpc3Q6IHRydWUgfSlcbiAgICAgICAgOiB0aGlzLl9tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVJdGVtU2l6ZShuZXdTaXplKSB7XG4gICAgdGhpcy5pdGVtU2l6ZSA9IG5ld1NpemUgfHwgJzEwMCUnO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgdG9nZ2xlQmxvY2tlcihibG9jaykge1xuICAgIHRoaXMuYmxvY2tlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gYmxvY2sgPyAnYXV0bycgOiAnbm9uZSc7XG4gIH1cblxuICBfY2FuQ29uc3VtZUdlc3R1cmUoZ2VzdHVyZSkge1xuICAgIGNvbnN0IGQgPSBnZXN0dXJlLmRpcmVjdGlvbjtcbiAgICBjb25zdCBpc0ZpcnN0ID0gdGhpcy5fc2Nyb2xsID09PSAwICYmICF0aGlzLmlzT3ZlclNjcm9sbGFibGUoKTtcbiAgICBjb25zdCBpc0xhc3QgPSB0aGlzLl9zY3JvbGwgPT09IHRoaXMubWF4U2Nyb2xsICYmICF0aGlzLmlzT3ZlclNjcm9sbGFibGUoKTtcblxuICAgIHJldHVybiB0aGlzLmlzVmVydGljYWwoKVxuICAgICAgPyAoKGQgPT09ICdkb3duJyAmJiAhaXNGaXJzdCkgfHwgKGQgPT09ICd1cCcgJiYgIWlzTGFzdCkpXG4gICAgICA6ICgoZCA9PT0gJ3JpZ2h0JyAmJiAhaXNGaXJzdCkgfHwgKGQgPT09ICdsZWZ0JyAmJiAhaXNMYXN0KSk7XG4gIH1cblxuICBvbkRyYWdTdGFydChldmVudCkge1xuICAgIHRoaXMuX2lnbm9yZURyYWcgPSBldmVudC5jb25zdW1lZCB8fCAhdXRpbC5pc1ZhbGlkR2VzdHVyZShldmVudCk7XG5cbiAgICBpZiAoIXRoaXMuX2lnbm9yZURyYWcpIHtcbiAgICAgIGNvbnN0IGNvbnN1bWUgPSBldmVudC5jb25zdW1lO1xuICAgICAgZXZlbnQuY29uc3VtZSA9ICgpID0+IHsgY29uc3VtZSAmJiBjb25zdW1lKCk7IHRoaXMuX2lnbm9yZURyYWcgPSB0cnVlOyB9O1xuXG4gICAgICBpZiAodGhpcy5fY2FuQ29uc3VtZUdlc3R1cmUoZXZlbnQuZ2VzdHVyZSkpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRYID0gZXZlbnQuZ2VzdHVyZS5jZW50ZXIgJiYgZXZlbnQuZ2VzdHVyZS5jZW50ZXIuY2xpZW50WCB8fCAwLFxuICAgICAgICAgIGRpc3RGcm9tRWRnZSA9IHRoaXMuZ2V0QnViYmxlV2lkdGgoKSB8fCAwLFxuICAgICAgICAgIHN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3VtZSAmJiBjb25zdW1lKCk7XG4gICAgICAgICAgICBldmVudC5jb25zdW1lZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTsgLy8gQXZvaWQgc3RhcnRpbmcgZHJhZyBmcm9tIG91dHNpZGVcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkQmxvY2sgJiYgdGhpcy50b2dnbGVCbG9ja2VyKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fc2V0U3dpcGluZyh0cnVlKTtcbiAgICAgICAgICAgIHV0aWwuaW9zUHJldmVudFNjcm9sbCh0aGlzLl9nZXN0dXJlRGV0ZWN0b3IpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgLy8gTGV0IHBhcmVudCBlbGVtZW50cyBjb25zdW1lIHRoZSBnZXN0dXJlIG9yIGNvbnN1bWUgaXQgcmlnaHQgYXdheVxuICAgICAgICBzdGFydFggPCBkaXN0RnJvbUVkZ2UgfHwgc3RhcnRYID4gKHRoaXMudGFyZ2V0U2l6ZSAtIGRpc3RGcm9tRWRnZSlcbiAgICAgICAgICA/IHNldEltbWVkaWF0ZSgoKSA9PiAhdGhpcy5faWdub3JlRHJhZyAmJiBzdGFydCgpKVxuICAgICAgICAgIDogc3RhcnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRyYWcoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50Lmdlc3R1cmUgfHwgdGhpcy5faWdub3JlRHJhZyB8fCAhdGhpcy5fc3RhcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbnRpbnVlZCA9IHRydWU7IC8vIEZpeCBmb3IgcmFuZG9tICdkcmFnZW5kJyB3aXRob3V0ICdkcmFnJ1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5fc2Nyb2xsVG8odGhpcy5fc2Nyb2xsIC0gdGhpcy5fZ2V0RGVsdGEoZXZlbnQpLCB7IHRocm90dGxlOiB0cnVlIH0pO1xuICB9XG5cbiAgb25EcmFnRW5kKGV2ZW50KSB7XG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlO1xuICAgIGlmICghZXZlbnQuZ2VzdHVyZSB8fCB0aGlzLl9pZ25vcmVEcmFnIHx8ICF0aGlzLl9jb250aW51ZWQpIHtcbiAgICAgIHRoaXMuX2lnbm9yZURyYWcgPSB0cnVlOyAvLyBvbkRyYWdFbmQgbWlnaHQgZmlyZSBiZWZvcmUgb25EcmFnU3RhcnQncyBzZXRJbW1lZGlhdGVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250aW51ZWQgPSBmYWxzZTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHNjcm9sbCA9IHRoaXMuX3Njcm9sbCAtIHRoaXMuX2dldERlbHRhKGV2ZW50KTtcbiAgICBjb25zdCBub3JtYWxpemVkU2Nyb2xsID0gdGhpcy5fbm9ybWFsaXplU2Nyb2xsKHNjcm9sbCk7XG4gICAgc2Nyb2xsID09PSBub3JtYWxpemVkU2Nyb2xsID8gdGhpcy5fc3RhcnRNb21lbnR1bVNjcm9sbChzY3JvbGwsIGV2ZW50KSA6IHRoaXMuX2tpbGxPdmVyU2Nyb2xsKG5vcm1hbGl6ZWRTY3JvbGwpO1xuICAgIHRoaXMuc2hvdWxkQmxvY2sgJiYgdGhpcy50b2dnbGVCbG9ja2VyKGZhbHNlKTtcbiAgfVxuXG4gIF9zdGFydE1vbWVudHVtU2Nyb2xsKHNjcm9sbCwgZXZlbnQpIHtcbiAgICBjb25zdCB2ZWxvY2l0eSA9IHRoaXMuX2dldFZlbG9jaXR5KGV2ZW50KSxcbiAgICAgIG1hdGNoZXNEaXJlY3Rpb24gPSBldmVudC5nZXN0dXJlLmludGVyaW1EaXJlY3Rpb24gPT09IHRoaXMuZE0uZGlyW3RoaXMuX2dldERlbHRhKGV2ZW50KSA8IDAgPyAwIDogMV07XG5cbiAgICBjb25zdCBuZXh0U2Nyb2xsID0gdGhpcy5fZ2V0QXV0b1Njcm9sbChzY3JvbGwsIHZlbG9jaXR5LCBtYXRjaGVzRGlyZWN0aW9uKTtcbiAgICBsZXQgZHVyYXRpb24gPSBNYXRoLmFicyhuZXh0U2Nyb2xsIC0gc2Nyb2xsKSAvICh2ZWxvY2l0eSArIDAuMDEpIC8gMTAwMDtcbiAgICBkdXJhdGlvbiA9IE1hdGgubWluKC4yNSwgTWF0aC5tYXgoLjEsIGR1cmF0aW9uKSk7XG5cbiAgICB0aGlzLl9jaGFuZ2VUbyhuZXh0U2Nyb2xsLCB7IHN3aXBlOiB0cnVlLCBhbmltYXRpb25PcHRpb25zOiB7IGR1cmF0aW9uLCB0aW1pbmc6ICdjdWJpYy1iZXppZXIoLjQsIC43LCAuNSwgMSknIH0gfSk7XG4gIH1cblxuICBfa2lsbE92ZXJTY3JvbGwoc2Nyb2xsKSB7XG4gICAgdGhpcy5fc2Nyb2xsID0gc2Nyb2xsO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuZE0uZGlyW051bWJlcihzY3JvbGwgPiAwKV07XG4gICAgY29uc3Qga2lsbE92ZXJTY3JvbGwgPSAoKSA9PiB0aGlzLl9jaGFuZ2VUbyhzY3JvbGwsIHsgYW5pbWF0aW9uT3B0aW9uczogeyBkdXJhdGlvbjogLjQsIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjQsIC4xLCAxKScgfSB9KTtcbiAgICB0aGlzLm92ZXJTY3JvbGxIb29rKHsgZGlyZWN0aW9uLCBraWxsT3ZlclNjcm9sbCB9KSB8fCBraWxsT3ZlclNjcm9sbCgpO1xuICB9XG5cbiAgX2NoYW5nZVRvKHNjcm9sbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZSA9IHsgYWN0aXZlSW5kZXg6IHRoaXMuZ2V0QWN0aXZlSW5kZXgoc2Nyb2xsKSwgbGFzdEFjdGl2ZUluZGV4OiB0aGlzLl9sYXN0QWN0aXZlSW5kZXgsIHN3aXBlOiBvcHRpb25zLnN3aXBlIHx8IGZhbHNlIH07XG4gICAgY29uc3QgY2hhbmdlID0gZS5hY3RpdmVJbmRleCAhPT0gZS5sYXN0QWN0aXZlSW5kZXg7XG4gICAgY29uc3QgY2FuY2VsZWQgPSBjaGFuZ2UgPyB0aGlzLnByZUNoYW5nZUhvb2soZSkgOiBmYWxzZTtcblxuICAgIHRoaXMuX3Njcm9sbCA9IGNhbmNlbGVkID8gdGhpcy5fb2Zmc2V0ICsgZS5sYXN0QWN0aXZlSW5kZXggKiB0aGlzLml0ZW1OdW1TaXplIDogc2Nyb2xsO1xuICAgIHRoaXMuX2xhc3RBY3RpdmVJbmRleCA9IGNhbmNlbGVkID8gZS5sYXN0QWN0aXZlSW5kZXggOiBlLmFjdGl2ZUluZGV4O1xuXG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbFRvKHRoaXMuX3Njcm9sbCwgb3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoc2Nyb2xsID09PSB0aGlzLl9zY3JvbGwgJiYgIWNhbmNlbGVkKSB7XG4gICAgICAgIHRoaXMuX3NldFN3aXBpbmcoZmFsc2UpO1xuICAgICAgICBjaGFuZ2UgJiYgdGhpcy5wb3N0Q2hhbmdlSG9vayhlKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5yZWplY3QpIHtcbiAgICAgICAgdGhpcy5fc2V0U3dpcGluZyhmYWxzZSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQ2FuY2VsZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9zY3JvbGxUbyhzY3JvbGwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChvcHRpb25zLnRocm90dGxlKSB7XG4gICAgICBjb25zdCByYXRpbyA9IDAuMzU7XG4gICAgICBpZiAoc2Nyb2xsIDwgMCkge1xuICAgICAgICBzY3JvbGwgPSB0aGlzLmlzT3ZlclNjcm9sbGFibGUoKSA/IE1hdGgucm91bmQoc2Nyb2xsICogcmF0aW8pIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHRoaXMubWF4U2Nyb2xsO1xuICAgICAgICBpZiAobWF4U2Nyb2xsIDwgc2Nyb2xsKSB7XG4gICAgICAgICAgc2Nyb2xsID0gdGhpcy5pc092ZXJTY3JvbGxhYmxlKCkgPyBtYXhTY3JvbGwgKyBNYXRoLnJvdW5kKChzY3JvbGwgLSBtYXhTY3JvbGwpICogcmF0aW8pIDogbWF4U2Nyb2xsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0ID0gb3B0aW9ucy5hbmltYXRpb24gID09PSAnbm9uZScgPyB7fSA6IG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9ucztcbiAgICB0aGlzLnNjcm9sbEhvb2sgJiYgdGhpcy5pdGVtTnVtU2l6ZSA+IDAgJiYgdGhpcy5zY3JvbGxIb29rKChzY3JvbGwgLyB0aGlzLml0ZW1OdW1TaXplKS50b0ZpeGVkKDIpLCBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnMgfHwge30pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT5cbiAgICAgIGFuaW1pdCh0aGlzLnRhcmdldClcbiAgICAgICAgLnF1ZXVlKHsgdHJhbnNmb3JtOiB0aGlzLl9nZXRUcmFuc2Zvcm0oc2Nyb2xsKSB9LCBvcHQpXG4gICAgICAgIC5wbGF5KHJlc29sdmUpXG4gICAgKTtcbiAgfVxuXG4gIF9nZXRBdXRvU2Nyb2xsKHNjcm9sbCwgdmVsb2NpdHksIG1hdGNoZXNEaXJlY3Rpb24pIHtcbiAgICBjb25zdCBtYXggPSB0aGlzLm1heFNjcm9sbCxcbiAgICAgIG9mZnNldCA9IHRoaXMuX29mZnNldCxcbiAgICAgIHNpemUgPSB0aGlzLml0ZW1OdW1TaXplO1xuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGFibGUoKSkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG1heCwgc2Nyb2xsKSk7XG4gICAgfVxuXG4gICAgbGV0IGFyciA9IFtdO1xuICAgIGZvciAobGV0IHMgPSBvZmZzZXQ7IHMgPCBtYXg7IHMgKz0gc2l6ZSkge1xuICAgICAgYXJyLnB1c2gocyk7XG4gICAgfVxuICAgIGFyci5wdXNoKG1heCk7XG5cbiAgICBhcnIgPSBhcnJcbiAgICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gTWF0aC5hYnMobGVmdCAtIHNjcm9sbCkgLSBNYXRoLmFicyhyaWdodCAtIHNjcm9sbCkpXG4gICAgICAuZmlsdGVyKChpdGVtLCBwb3MpID0+ICFwb3MgfHwgaXRlbSAhPT0gYXJyW3BvcyAtIDFdKTtcblxuICAgIGxldCByZXN1bHQgPSBhcnJbMF07XG4gICAgY29uc3QgbGFzdFNjcm9sbCA9IHRoaXMuX2xhc3RBY3RpdmVJbmRleCAqIHNpemUgKyBvZmZzZXQ7XG4gICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSBNYXRoLmFicyhzY3JvbGwgLSBsYXN0U2Nyb2xsKSAvIHNpemU7XG5cbiAgICBpZiAoc2Nyb2xsUmF0aW8gPD0gdGhpcy5nZXRBdXRvU2Nyb2xsUmF0aW8obWF0Y2hlc0RpcmVjdGlvbiwgdmVsb2NpdHksIHNpemUpKSB7XG4gICAgICByZXN1bHQgPSBsYXN0U2Nyb2xsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2Nyb2xsUmF0aW8gPCAxLjAgJiYgYXJyWzBdID09PSBsYXN0U2Nyb2xsICYmIGFyci5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJlc3VsdCA9IGFyclsxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG1heCwgcmVzdWx0KSk7XG4gIH1cblxuICBfcmVzZXQoKSB7XG4gICAgdGhpcy5fdGFyZ2V0U2l6ZSA9IHRoaXMuX2l0ZW1OdW1TaXplID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgX25vcm1hbGl6ZVNjcm9sbChzY3JvbGwpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoIE1hdGgubWluKHNjcm9sbCwgdGhpcy5tYXhTY3JvbGwpLCAwKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgICB0aGlzLl91cGRhdGVMYXlvdXQoKTtcblxuICAgIGlmICh1dGlsLmlzSW50ZWdlcih0aGlzLl9zY3JvbGwpKSB7XG4gICAgICBjb25zdCBzY3JvbGwgPSB0aGlzLl9ub3JtYWxpemVTY3JvbGwodGhpcy5fc2Nyb2xsKTtcbiAgICAgIHNjcm9sbCAhPT0gdGhpcy5fc2Nyb2xsID8gdGhpcy5fa2lsbE92ZXJTY3JvbGwoc2Nyb2xsKSA6IHRoaXMuX2NoYW5nZVRvKHNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NldHVwSW5pdGlhbEluZGV4KCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoSG9vaygpO1xuICB9XG5cbiAgZ2V0IHRhcmdldFNpemUoKSB7XG4gICAgaWYgKCF0aGlzLl90YXJnZXRTaXplKSB7XG4gICAgICB0aGlzLl90YXJnZXRTaXplID0gdGhpcy50YXJnZXRbYG9mZnNldCR7dGhpcy5kTS5zaXplfWBdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0U2l6ZTtcbiAgfVxuXG4gIF9nZXREZWx0YShldmVudCkge1xuICAgIHJldHVybiBldmVudC5nZXN0dXJlW2BkZWx0YSR7dGhpcy5kTS5heGlzfWBdO1xuICB9XG5cbiAgX2dldFZlbG9jaXR5KGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50Lmdlc3R1cmVbYHZlbG9jaXR5JHt0aGlzLmRNLmF4aXN9YF07XG4gIH1cblxuICBfZ2V0VHJhbnNmb3JtKHNjcm9sbCkge1xuICAgIHJldHVybiBgdHJhbnNsYXRlM2QoJHt0aGlzLmRNLnQzZFswXX0key1zY3JvbGx9JHt0aGlzLmRNLnQzZFsxXX0pYDtcbiAgfVxuXG4gIF91cGRhdGVMYXlvdXQoKSB7XG4gICAgdGhpcy5kTSA9IGRpcmVjdGlvbk1hcFt0aGlzLmlzVmVydGljYWwoKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCddO1xuICAgIHRoaXMudGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUoJ29ucy1zd2lwZXItdGFyZ2V0LS12ZXJ0aWNhbCcsIHRoaXMuaXNWZXJ0aWNhbCgpKTtcblxuICAgIGZvciAobGV0IGMgPSB0aGlzLnRhcmdldC5jaGlsZHJlblswXTsgYzsgYyA9IGMubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgICBjLnN0eWxlW3RoaXMuZE0uc2l6ZS50b0xvd2VyQ2FzZSgpXSA9IHRoaXMuaXRlbVNpemU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDZW50ZXJlZCgpKSB7XG4gICAgICB0aGlzLl9vZmZzZXQgPSAodGhpcy50YXJnZXRTaXplIC0gdGhpcy5pdGVtTnVtU2l6ZSkgLyAtMiB8fCAwO1xuICAgIH1cbiAgfVxufVxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IFN3aXBlciBmcm9tICcuLi9vbnMvaW50ZXJuYWwvc3dpcGVyLmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtY2Fyb3VzZWxcbiAqIEBjYXRlZ29yeSBjYXJvdXNlbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDYXJvdXNlbCBjb21wb25lbnQuIEEgY2Fyb3VzZWwgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBzZXZlcmFsIGl0ZW1zIGluIHRoZSBzYW1lIHNwYWNlLlxuICpcbiAqICAgICBUaGUgY29tcG9uZW50IHN1cHBvcnRzIGRpc3BsYXlpbmcgY29udGVudCBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS4gVGhlIHVzZXIgY2FuIHNjcm9sbCB0aHJvdWdoIHRoZSBpdGVtcyBieSBkcmFnZ2luZyBhbmQgaXQgY2FuIGFsc28gYmUgY29udHJvbGxlciBwcm9ncmFtbWF0aWNhbGx5LlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHhiYnpPUVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2Nhcm91c2VsXG4gKiBAc2VlYWxzbyBvbnMtY2Fyb3VzZWwtaXRlbVxuICogICBbZW5dYDxvbnMtY2Fyb3VzZWwtaXRlbT5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtY2Fyb3VzZWwtaXRlbeOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1jYXJvdXNlbCBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDIwMHB4XCI+XG4gKiAgIDxvbnMtY2Fyb3VzZWwtaXRlbT5cbiAqICAgIC4uLlxuICogICA8L29ucy1jYXJvdXNlbC1pdGVtPlxuICogICA8b25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgICAuLi5cbiAqICAgPC9vbnMtY2Fyb3VzZWwtaXRlbT5cbiAqIDwvb25zLWNhcm91c2VsPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJvdXNlbEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0Y2hhbmdlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBjdXJyZW50IGNhcm91c2VsIGl0ZW0gaGFzIGNoYW5nZWQuWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S644GX44Gm44GE44KL44Kr44Or44O844K744Or44Gu6KaB57Sg44GM5aSJ44KP44Gj44Gf5pmC44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuY2Fyb3VzZWxcbiAgICogICBbZW5dQ2Fyb3VzZWwgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn0Nhcm91c2Vs44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmFjdGl2ZUluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+imgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5sYXN0QWN0aXZlSW5kZXhcbiAgICogICBbZW5dUHJldmlvdXMgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICAgW2phXeS7peWJjeOCouOCr+ODhuOCo+ODluOBoOOBo+OBn+imgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlY2hhbmdlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgY3VycmVudCBjYXJvdXNlbCBpdGVtIGNoYW5nZXMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuY2Fyb3VzZWxcbiAgICogICBbZW5dQ2Fyb3VzZWwgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn0Nhcm91c2Vs44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmFjdGl2ZUluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+imgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5sYXN0QWN0aXZlSW5kZXhcbiAgICogICBbZW5dUHJldmlvdXMgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICAgW2phXeS7peWJjeOCouOCr+ODhuOCo+ODluOBoOOBo+OBn+imgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcmVmcmVzaFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQgd2hlbiB0aGUgY2Fyb3VzZWwgaGFzIGJlZW4gcmVmcmVzaGVkLlsvZW5dXG4gICAqICAgW2phXeOCq+ODq+ODvOOCu+ODq+OBjOabtOaWsOOBleOCjOOBn+aZguOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmNhcm91c2VsXG4gICAqICAgW2VuXUNhcm91c2VsIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9DYXJvdXNlbOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgb3ZlcnNjcm9sbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQgd2hlbiB0aGUgY2Fyb3VzZWwgaGFzIGJlZW4gb3ZlcnNjcm9sbGVkLlsvZW5dXG4gICAqICAgW2phXeOCq+ODq+ODvOOCu+ODq+OBjOOCquODvOODkOODvOOCueOCr+ODreODvOODq+OBl+OBn+aZguOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmNhcm91c2VsXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIGNhcm91c2VsIGhhcyBiZWVuIHJlZnJlc2hlZC5bL2VuXVxuICAgKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vjgYzmm7TmlrDjgZXjgozjgZ/mmYLjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuYWN0aXZlSW5kZXhcbiAgICogICBbZW5dQ3VycmVudCBhY3RpdmUgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KL6KaB57Sg44Gu44Kk44Oz44OH44OD44Kv44K544CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50LmRpcmVjdGlvblxuICAgKiAgIFtlbl1DYW4gYmUgb25lIG9mIGVpdGhlciBcInVwXCIsIFwiZG93blwiLCBcImxlZnRcIiBvciBcInJpZ2h0XCIuWy9lbl1cbiAgICogICBbamFd44Kq44O844OQ44O844K544Kv44Ot44O844Or44GV44KM44Gf5pa55ZCR44GM5b6X44KJ44KM44G+44GZ44CCXCJ1cFwiLCBcImRvd25cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIuOBruOBhOOBmuOCjOOBi+OBruaWueWQkeOBjOa4oeOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LndhaXRUb1JldHVyblxuICAgKiAgIFtlbl1UYWtlcyBhIDxjb2RlPlByb21pc2U8L2NvZGU+IG9iamVjdCBhcyBhbiBhcmd1bWVudC4gVGhlIGNhcm91c2VsIHdpbGwgbm90IHNjcm9sbCBiYWNrIHVudGlsIHRoZSBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkIG9yIHJlamVjdGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOBr1Byb21pc2Xjgqrjg5bjgrjjgqfjgq/jg4jjgpLlvJXmlbDjgajjgZfjgablj5fjgZHlj5bjgorjgb7jgZnjgILmuKHjgZfjgZ9Qcm9taXNl44Kq44OW44K444Kn44Kv44OI44GMcmVzb2x2ZeOBleOCjOOCi+OBi3JlamVjdOOBleOCjOOCi+OBvuOBp+OAgeOCq+ODq+ODvOOCu+ODq+OBr+OCueOCr+ODreODvOODq+ODkOODg+OCr+OBl+OBvuOBm+OCk+OAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVzIHdoZW4gdGhlIGNhcm91c2VsIHN3aXBlcy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5pbmRleFxuICAgKiAgIFtlbl1DdXJyZW50IGluZGV4LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi29ucy1jYXJvdXNlbOOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcHRpb25zXG4gICAqICAgW2VuXUFuaW1hdGlvbiBvcHRpb25zIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXJlY3Rpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBkaXJlY3Rpb24gb2YgdGhlIGNhcm91c2VsLiBDYW4gYmUgZWl0aGVyIFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIi4gRGVmYXVsdCBpcyBcImhvcml6b250YWxcIi5bL2VuXVxuICAgKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vjga7mlrnlkJHjgpLmjIflrprjgZfjgb7jgZnjgIJcImhvcml6b250YWxcIuOBi1widmVydGljYWxcIuOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglwiaG9yaXpvbnRhbFwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZnVsbHNjcmVlblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBjYXJvdXNlbCB3aWxsIGNvdmVyIHRoZSB3aG9sZSBzY3JlZW4uWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL44Go44CBYWJzb2x1dGXjg53jgrjjgrfjg6fjg7PjgpLkvb/jgaPjgabjgqvjg6vjg7zjgrvjg6vjgYzoh6rli5XnmoTjgavnlLvpnaLjgYTjgaPjgbHjgYTjgavluoPjgYzjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGZ1bGxzY3JlZW5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0aGUgY2Fyb3VzZWwgd2lsbCBjb3ZlciB0aGUgd2hvbGUgc2NyZWVuLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+OBqOOAgWFic29sdXRl44Od44K444K344On44Oz44KS5L2/44Gj44Gm44Kr44Or44O844K744Or44GM6Ieq5YuV55qE44Gr55S76Z2i44GE44Gj44Gx44GE44Gr5bqD44GM44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgb3ZlcnNjcm9sbGFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgd2lsbCBiZSBzY3JvbGxhYmxlIG92ZXIgdGhlIGVkZ2UuIEl0IHdpbGwgYm91bmNlIGJhY2sgd2hlbiByZWxlYXNlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjgr/jg4Pjg4HjgoTjg4njg6njg4PjgrDjgafnq6/jgb7jgafjgrnjgq/jg63jg7zjg6vjgZfjgZ/mmYLjgavjgIHjg5Djgqbjg7Pjg4njgZnjgovjgojjgYbjgarlirnmnpzjgYzlvZPjgZ/jgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjZW50ZXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBjYXJvdXNlbCB0aGVuIHRoZSBzZWxlY3RlZCBpdGVtIHdpbGwgYmUgaW4gdGhlIGNlbnRlciBvZiB0aGUgY2Fyb3VzZWwgaW5zdGVhZCBvZiB0aGUgYmVnaW5uaW5nLiBVc2VmdWwgb25seSB3aGVuIHRoZSBpdGVtcyBhcmUgc21hbGxlciB0aGFuIHRoZSBjYXJvdXNlbC4gWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB6YG444KT44Gn44GE44KLb25zLWNhcm91c2VsLWl0ZW3jga/jgqvjg6vjg7zjgrvjg6vjga7nnJ/jgpPkuK3jgbjooYzjgY3jgb7jgZnjgILpoIXnm67jgYzjgqvjg6vjg7zjgrvjg6vjgojjgorjgoLlsI/jgZXjgYTloLTlkIjjgavjga7jgb/jgIHjgZPjgozjga/kvr/liKnjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpdGVtLXdpZHRoXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgICBbZW5db25zLWNhcm91c2VsLWl0ZW0ncyB3aWR0aC4gT25seSB3b3JrcyB3aGVuIHRoZSBkaXJlY3Rpb24gaXMgc2V0IHRvIFwiaG9yaXpvbnRhbFwiLlsvZW5dXG4gICAqICAgIFtqYV1vbnMtY2Fyb3VzZWwtaXRlbeOBruW5heOCkuaMh+WumuOBl+OBvuOBmeOAguOBk+OBruWxnuaAp+OBr+OAgWRpcmVjdGlvbuWxnuaAp+OBq1wiaG9yaXpvbnRhbFwi44KS5oyH5a6a44GX44Gf5pmC44Gu44G/5pyJ5Yq544Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaXRlbS1oZWlnaHRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXW9ucy1jYXJvdXNlbC1pdGVtJ3MgaGVpZ2h0LiBPbmx5IHdvcmtzIHdoZW4gdGhlIGRpcmVjdGlvbiBpcyBzZXQgdG8gXCJ2ZXJ0aWNhbFwiLlsvZW5dXG4gICAqICAgW2phXW9ucy1jYXJvdXNlbC1pdGVt44Gu6auY44GV44KS5oyH5a6a44GX44G+44GZ44CC44GT44Gu5bGe5oCn44Gv44CBZGlyZWN0aW9u5bGe5oCn44GrXCJ2ZXJ0aWNhbFwi44KS5oyH5a6a44GX44Gf5pmC44Gu44G/5pyJ5Yq544Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYXV0by1zY3JvbGxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNjcm9sbGVkIHRvIHRoZSBjbG9zZXN0IGl0ZW0gYm9yZGVyIHdoZW4gcmVsZWFzZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB5LiA55Wq6L+R44GEY2Fyb3VzZWwtaXRlbeOBruWig+eVjOOBvuOBp+iHquWLleeahOOBq+OCueOCr+ODreODvOODq+OBmeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGF1dG8tc2Nyb2xsLXJhdGlvXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgICBbZW5dQSBudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDEuMCB0aGF0IHNwZWNpZmllcyBob3cgbXVjaCB0aGUgdXNlciBtdXN0IGRyYWcgdGhlIGNhcm91c2VsIGluIG9yZGVyIGZvciBpdCB0byBhdXRvIHNjcm9sbCB0byB0aGUgbmV4dCBpdGVtLlsvZW5dXG4gICAqICAgIFtqYV0wLjDjgYvjgokxLjDjgb7jgafjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgILjgqvjg6vjg7zjgrvjg6vjga7opoHntKDjgpLjganjgozjgZDjgonjgYTjga7libLlkIjjgb7jgafjg4njg6njg4PjgrDjgZnjgovjgajmrKHjga7opoHntKDjgavoh6rli5XnmoTjgavjgrnjgq/jg63jg7zjg6vjgZnjgovjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzd2lwZWFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgY2FuIGJlIHNjcm9sbGVkIGJ5IGRyYWcgb3Igc3dpcGUuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44Kr44Or44O844K744Or44KS44K544Ov44Kk44OX44KE44OJ44Op44OD44Kw44Gn56e75YuV44Gn44GN44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CBZHJhZ+OChHRvdWNo44KEc3dpcGXjgpLlj5fjgZHku5jjgZHjgarjgY/jgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpbml0aWFsLWluZGV4XG4gICAqIEBpbml0b25seVxuICAgKiBAZGVmYXVsdCAwXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBpbmRleCBvZiB0aGUgb25zLWNhcm91c2VsLWl0ZW0gdG8gc2hvdyBpbml0aWFsbHkuIERlZmF1bHQgaXMgMC4gSWYgYWN0aXZlLWluZGV4IGlzIHNldCwgaW5pdGlhbC1pbmRleCBpcyBpZ25vcmVkLlsvZW5dXG4gICAqICAgW2phXeacgOWIneOBq+ihqOekuuOBmeOCi29ucy1jYXJvdXNlbC1pdGVt44KSMOWni+OBvuOCiuOBruOCpOODs+ODh+ODg+OCr+OCueOBp+aMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOWApOOBryAwIOOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGF1dG8tcmVmcmVzaFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgYXV0b21hdGljYWxseSByZWZyZXNoIHdoZW4gdGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBjaGFuZ2UuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB5a2Q6KaB57Sg44Gu5pWw44GM5aSJ44KP44KL44Go44Kr44Or44O844K744Or44Gv6Ieq5YuV55qE44Gr5pu05paw44GV44KM44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhdXRvUmVmcmVzaFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgYXV0b21hdGljYWxseSByZWZyZXNoIHdoZW4gdGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBjaGFuZ2UuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB5a2Q6KaB57Sg44Gu5pWw44GM5aSJ44KP44KL44Go44Kr44Or44O844K744Or44Gv6Ieq5YuV55qE44Gr5pu05paw44GV44KM44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gYFwibm9uZVwiYCB0aGUgdHJhbnNpdGlvbnMgd2lsbCBub3QgYmUgYW5pbWF0ZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uLW9wdGlvbnNcbiAgICogQHR5cGUge0V4cHJlc3Npb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgILkvovvvJp7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCB7b25Db25uZWN0ZWQsIG9uRGlzY29ubmVjdGVkfSA9IHV0aWwuZGVmaW5lTGlzdGVuZXJQcm9wZXJ0eSh0aGlzLCAnc3dpcGUnKTtcbiAgICB0aGlzLl9jb25uZWN0T25Td2lwZSA9IG9uQ29ubmVjdGVkO1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPblN3aXBlID0gb25EaXNjb25uZWN0ZWQ7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY2hpbGRyZW5bMF0gJiYgdGhpcy5jaGlsZHJlblswXS50YWdOYW1lICE9PSAnT05TLUNBUk9VU0VMLUlURU0nICYmIHRoaXMuY2hpbGRyZW5bMF0gfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaWYgKCF0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkge1xuICAgICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGFyZ2V0KTtcbiAgICB9XG5cbiAgICAhdGhpcy5jaGlsZHJlblsxXSAmJiB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQgPSB0aGlzLmFwcGVuZENoaWxkLmJpbmQodGFyZ2V0KTtcbiAgICB0aGlzLmluc2VydEJlZm9yZSA9IHRoaXMuaW5zZXJ0QmVmb3JlLmJpbmQodGFyZ2V0KTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdGhpcy5fc3dpcGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZXIgPSBuZXcgU3dpcGVyKHtcbiAgICAgICAgZ2V0RWxlbWVudDogKCkgPT4gdGhpcyxcbiAgICAgICAgZ2V0SW5pdGlhbEluZGV4OiAoKSA9PiB0aGlzLmdldEF0dHJpYnV0ZSgnYWN0aXZlLWluZGV4JykgfHwgdGhpcy5nZXRBdHRyaWJ1dGUoJ2luaXRpYWwtaW5kZXgnKSxcbiAgICAgICAgZ2V0QXV0b1Njcm9sbFJhdGlvOiAoKSA9PiB0aGlzLmF1dG9TY3JvbGxSYXRpbyxcbiAgICAgICAgaXNWZXJ0aWNhbDogKCkgPT4gdGhpcy52ZXJ0aWNhbCxcbiAgICAgICAgaXNPdmVyU2Nyb2xsYWJsZTogKCkgPT4gdGhpcy5vdmVyc2Nyb2xsYWJsZSxcbiAgICAgICAgaXNDZW50ZXJlZDogKCkgPT4gdGhpcy5jZW50ZXJlZCxcbiAgICAgICAgaXNBdXRvU2Nyb2xsYWJsZTogKCkgPT4gdGhpcy5hdXRvU2Nyb2xsLFxuICAgICAgICBpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcbiAgICAgICAgb3ZlclNjcm9sbEhvb2s6IHRoaXMuX29uT3ZlclNjcm9sbC5iaW5kKHRoaXMpLFxuICAgICAgICBwcmVDaGFuZ2VIb29rOiB0aGlzLl9vblByZUNoYW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICBwb3N0Q2hhbmdlSG9vazogdGhpcy5fb25Qb3N0Q2hhbmdlLmJpbmQodGhpcyksXG4gICAgICAgIHJlZnJlc2hIb29rOiB0aGlzLl9vblJlZnJlc2guYmluZCh0aGlzKSxcbiAgICAgICAgc2Nyb2xsSG9vazogKGluZGV4LCBvcHRpb25zKSA9PiB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyBpbmRleCwgb3B0aW9ucyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9zd2lwZXIuaW5pdCh7XG4gICAgICAgIHN3aXBlYWJsZTogdGhpcy5oYXNBdHRyaWJ1dGUoJ3N3aXBlYWJsZScpLFxuICAgICAgICBhdXRvUmVmcmVzaDogdGhpcy5oYXNBdHRyaWJ1dGUoJ2F1dG8tcmVmcmVzaCcpXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29ubmVjdE9uU3dpcGUoKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLl9zd2lwZXIgJiYgdGhpcy5fc3dpcGVyLmluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9zd2lwZXIuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fc3dpcGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXNjb25uZWN0T25Td2lwZSgpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnc3dpcGVhYmxlJywgJ2F1dG8tcmVmcmVzaCcsICdkaXJlY3Rpb24nLCAnaXRlbS1oZWlnaHQnLCAnaXRlbS13aWR0aCcsICdhY3RpdmUtaW5kZXgnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKCF0aGlzLl9zd2lwZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ3N3aXBlYWJsZSc6XG4gICAgICAgIHRoaXMuX3N3aXBlci51cGRhdGVTd2lwZWFibGUodGhpcy5oYXNBdHRyaWJ1dGUoJ3N3aXBlYWJsZScpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhdXRvLXJlZnJlc2gnOlxuICAgICAgICB0aGlzLl9zd2lwZXIudXBkYXRlQXV0b1JlZnJlc2godGhpcy5oYXNBdHRyaWJ1dGUoJ2F1dG8tcmVmcmVzaCcpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpdGVtLWhlaWdodCc6XG4gICAgICAgIHRoaXMudmVydGljYWwgJiYgdGhpcy5fc3dpcGVyLnVwZGF0ZUl0ZW1TaXplKHRoaXMuaXRlbVNpemUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2l0ZW0td2lkdGgnOlxuICAgICAgICB0aGlzLnZlcnRpY2FsIHx8IHRoaXMuX3N3aXBlci51cGRhdGVJdGVtU2l6ZSh0aGlzLml0ZW1TaXplKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkaXJlY3Rpb24nOlxuICAgICAgICB0aGlzLl9zd2lwZXIucmVmcmVzaCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FjdGl2ZS1pbmRleCc6XG4gICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUluZGV4KCkgIT09IHRoaXMuYWN0aXZlSW5kZXgpIHtcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZUluZGV4KHRoaXMuYWN0aXZlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIHRoaXMuX3N3aXBlci5zaG93KCk7XG4gIH1cblxuICBfaGlkZSgpIHtcbiAgICB0aGlzLl9zd2lwZXIuaGlkZSgpO1xuICB9XG5cbiAgX29uT3ZlclNjcm9sbCh7IGRpcmVjdGlvbiwga2lsbE92ZXJTY3JvbGwgfSkge1xuICAgIGxldCB3YWl0Rm9yQWN0aW9uID0gZmFsc2U7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdvdmVyc2Nyb2xsJywge1xuICAgICAgY2Fyb3VzZWw6IHRoaXMsXG4gICAgICBhY3RpdmVJbmRleDogdGhpcy5nZXRBY3RpdmVJbmRleCgpLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgd2FpdFRvUmV0dXJuOiBwcm9taXNlID0+IHtcbiAgICAgICAgd2FpdEZvckFjdGlvbiA9IHRydWU7XG4gICAgICAgIHByb21pc2UudGhlbihraWxsT3ZlclNjcm9sbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2FpdEZvckFjdGlvbjtcbiAgfVxuXG4gIF9vblByZUNoYW5nZSh7IGFjdGl2ZUluZGV4LCBsYXN0QWN0aXZlSW5kZXggfSkge1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncHJlY2hhbmdlJywgeyBjYXJvdXNlbDogdGhpcywgYWN0aXZlSW5kZXgsIGxhc3RBY3RpdmVJbmRleCB9KTtcbiAgfVxuXG4gIF9vblBvc3RDaGFuZ2UoeyBhY3RpdmVJbmRleCwgbGFzdEFjdGl2ZUluZGV4IH0pIHtcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXg7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdwb3N0Y2hhbmdlJywgeyBjYXJvdXNlbDogdGhpcywgYWN0aXZlSW5kZXgsIGxhc3RBY3RpdmVJbmRleCB9KTtcbiAgfVxuXG4gIF9vblJlZnJlc2goKSB7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdyZWZyZXNoJywgeyBjYXJvdXNlbDogdGhpcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldEFjdGl2ZUluZGV4XG4gICAqIEBzaWduYXR1cmUgc2V0QWN0aXZlSW5kZXgoaW5kZXgsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgW2VuXVRoZSBpbmRleCB0aGF0IHRoZSBjYXJvdXNlbCBzaG91bGQgYmUgc2V0IHRvLlsvZW5dXG4gICAqICAgW2phXWNhcm91c2Vs6KaB57Sg44Gu44Kk44Oz44OH44OD44Kv44K544KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1BIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gYFwibm9uZVwiYCB0aGUgdHJhbnNpdGlvbnMgd2lsbCBub3QgYmUgYW5pbWF0ZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXUFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcgZnVuY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgaW5kZXggb2YgdGhlIGA8b25zLWNhcm91c2VsLWl0ZW0+YCB0byBzaG93LlsvZW5dXG4gICAqICAgW2phXeihqOekuuOBmeOCi29ucy1jYXJvdXNlbC1pdGVt44KSaW5kZXjjgafmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2V0QWN0aXZlSW5kZXgoaW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBhbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSxcbiAgICAgIGFuaW1hdGlvbk9wdGlvbnM6IHRoaXMuYW5pbWF0aW9uT3B0aW9ucyB8fCB7IGR1cmF0aW9uOiAuMywgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC40LCAuNywgLjUsIDEpJyB9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fc3dpcGVyLnNldEFjdGl2ZUluZGV4KGluZGV4LCBvcHRpb25zKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb3B0aW9ucy5jYWxsYmFjayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZ2V0QWN0aXZlSW5kZXhcbiAgICogQHNpZ25hdHVyZSBnZXRBY3RpdmVJbmRleCgpXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICogICBbZW5dVGhlIGN1cnJlbnQgY2Fyb3VzZWwgaXRlbSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjooajnpLrjgZfjgabjgYTjgovjgqvjg6vjg7zjgrvjg6vopoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgYzov5TjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGA8b25zLWNhcm91c2VsLWl0ZW0+YC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjooajnpLrjgZXjgozjgabjgYTjgotvbnMtY2Fyb3VzZWwtaXRlbeimgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBnZXRBY3RpdmVJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3dpcGVyLmdldEFjdGl2ZUluZGV4KCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBuZXh0XG4gICAqIEBzaWduYXR1cmUgbmV4dChbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1BbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBjYXJvdXNlbCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgbmV4dCBgPG9ucy1jYXJvdXNlbC1pdGVtPmAuWy9lbl1cbiAgICogICBbamFd5qyh44Gub25zLWNhcm91c2VsLWl0ZW3jgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgbmV4dChvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0QWN0aXZlSW5kZXgodGhpcy5nZXRBY3RpdmVJbmRleCgpICsgMSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwcmV2XG4gICAqIEBzaWduYXR1cmUgcHJldihbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1BbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBjYXJvdXNlbCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgcHJldmlvdXMgYDxvbnMtY2Fyb3VzZWwtaXRlbT5gLlsvZW5dXG4gICAqICAgW2phXeWJjeOBrm9ucy1jYXJvdXNlbC1pdGVt44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHByZXYob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldEFjdGl2ZUluZGV4KHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSAtIDEsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZmlyc3RcbiAgICogQHNpZ25hdHVyZSBmaXJzdCgpXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dSWYgdGhpcyBpcyBzZXQgdG8gYFwibm9uZVwiYCwgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1BbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBjYXJvdXNlbCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgZmlyc3QgYDxvbnMtY2Fyb3VzZWwtaXRlbT5gLlsvZW5dXG4gICAqICAgW2phXeacgOWIneOBrm9ucy1jYXJvdXNlbC1pdGVt44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGZpcnN0KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRBY3RpdmVJbmRleCgwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGxhc3RcbiAgICogQHNpZ25hdHVyZSBsYXN0KClcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1BIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciB0aGUgYW5pbWF0aW9uIGhhcyBmaW5pc2hlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gYFwibm9uZVwiYCB0aGUgdHJhbnNpdGlvbnMgd2lsbCBub3QgYmUgYW5pbWF0ZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXUFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nIGZ1bmN0aW9uIG9mIHRoZSBhbmltYXRpb24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGNhcm91c2VsIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudFsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IGxhc3Qgb25zLWNhcm91c2VsIGl0ZW0uWy9lbl1cbiAgICogICBbamFd5pyA5b6M44Gub25zLWNhcm91c2VsLWl0ZW3jgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgbGFzdChvcHRpb25zKSB7XG4gICAgdGhpcy5zZXRBY3RpdmVJbmRleChNYXRoLm1heCh0aGlzLml0ZW1Db3VudCAtIDEsIDApLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlZnJlc2hcbiAgICogQHNpZ25hdHVyZSByZWZyZXNoKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVVwZGF0ZSB0aGUgbGF5b3V0IG9mIHRoZSBjYXJvdXNlbC4gVXNlZCB3aGVuIGFkZGluZyBgPG9ucy1jYXJvdXNlbC1pdGVtcz5gIGR5bmFtaWNhbGx5IG9yIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBzaXplLlsvZW5dXG4gICAqICAgW2phXeODrOOCpOOCouOCpuODiOOChOWGhemDqOOBrueKtuaFi+OCkuacgOaWsOOBruOCguOBruOBq+abtOaWsOOBl+OBvuOBmeOAgm9ucy1jYXJvdXNlbC1pdGVt44KS5YuV55qE44Gr5aKX44KE44GX44Gf44KK44CBb25zLWNhcm91c2Vs44Gu5aSn44GN44GV44KS5YuV55qE44Gr5aSJ44GI44KL6Zqb44Gr5Yip55So44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5fc3dpcGVyLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaXRlbUNvdW50XG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIG51bWJlciBvZiBjYXJvdXNlbCBpdGVtcy5bL2VuXVxuICAgKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vopoHntKDjga7mlbDjgafjgZnjgIJbL2phXVxuICAgKi9cbiAgZ2V0IGl0ZW1Db3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3dpcGVyLml0ZW1Db3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc3dpcGVhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5ddHJ1ZSBpZiB0aGUgY2Fyb3VzZWwgaXMgc3dpcGVhYmxlLlsvZW5dXG4gICAqICAgW2phXXN3aXBlYWJsZeOBp+OBguOCjOOBsHRydWXjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9uU3dpcGVcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSG9vayBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgc2xpZGVzIHRoZSBjYXJvdXNlbC4gSXQgZ2V0cyBhIGRlY2ltYWwgaW5kZXggYW5kIGFuIGFuaW1hdGlvbk9wdGlvbnMgb2JqZWN0IGFzIGFyZ3VtZW50cy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGF1dG9TY3JvbGxcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl10cnVlIGlmIGF1dG8gc2Nyb2xsIGlzIGVuYWJsZWQuWy9lbl1cbiAgICogICBbamFd44Kq44O844OI44K544Kv44Ot44O844Or44GM5pyJ5Yq544Gn44GC44KM44GwdHJ1ZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGdldCB2ZXJ0aWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpID09PSAndmVydGljYWwnO1xuICB9XG5cbiAgZ2V0IGl0ZW1TaXplKCkge1xuICAgIGNvbnN0IGl0ZW1TaXplQXR0ciA9ICh0aGlzLmdldEF0dHJpYnV0ZShgaXRlbS0ke3RoaXMudmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCd9YCkgfHwgJycpLnRyaW0oKTtcbiAgICByZXR1cm4gaXRlbVNpemVBdHRyLm1hdGNoKC9eXFxkKyhweHwlKSQvKSA/IGl0ZW1TaXplQXR0ciA6ICcxMDAlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYXV0b1Njcm9sbFJhdGlvXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgY3VycmVudCBhdXRvIHNjcm9sbCByYXRpby4gWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu44Kq44O844OI44K544Kv44Ot44O844Or44GucmF0aW/lgKTjgIJbL2phXVxuICAgKi9cbiAgZ2V0IGF1dG9TY3JvbGxSYXRpbygpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLmdldEF0dHJpYnV0ZSgnYXV0by1zY3JvbGwtcmF0aW8nKSk7XG4gIH1cblxuICBzZXQgYXV0b1Njcm9sbFJhdGlvKHJhdGlvKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2F1dG8tc2Nyb2xsLXJhdGlvJywgcmF0aW8pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGNhcm91c2VsIGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG92ZXJzY3JvbGxhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgY2Fyb3VzZWwgaXMgb3ZlcnNjcm9sbGFibGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXW92ZXJzY3JvbGzjgafjgY3jgozjgbB0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjZW50ZXJlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGNhcm91c2VsIGlzIGNlbnRlcmVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV1jZW50ZXJlZOeKtuaFi+OBq+OBquOBo+OBpuOBhOOCjOOBsHRydWXjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBzdGF0aWMgZ2V0IGV2ZW50cygpIHtcbiAgICByZXR1cm4gWydwb3N0Y2hhbmdlJywgJ3JlZnJlc2gnLCAnb3ZlcnNjcm9sbCcsICdwcmVjaGFuZ2UnLCAnc3dpcGUnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cbiAgZ2V0IGFuaW1hdGlvbk9wdGlvbnMoKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIGlmIChhdHRyKSB7XG4gICAgICByZXR1cm4gdXRpbC5hbmltYXRpb25PcHRpb25zUGFyc2UoYXR0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhdHRyO1xuICAgIH1cbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFjdGl2ZS1pbmRleFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgaW5kZXggb2YgdGhlIGNhcm91c2VsIGl0ZW0gdGhhdCBzaG91bGQgYmUgc2hvd24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhY3RpdmVJbmRleFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgaW5kZXggb2YgdGhlIGNhcm91c2VsIGl0ZW0gdGhhdCBzaG91bGQgYmUgc2hvd24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCBhY3RpdmVJbmRleCgpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcpKTtcbiAgfVxuXG4gIHNldCBhY3RpdmVJbmRleCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYWN0aXZlLWluZGV4JywgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKENhcm91c2VsRWxlbWVudCwgWydzd2lwZWFibGUnLCAnZGlzYWJsZWQnLCAnb3ZlcnNjcm9sbGFibGUnLCAnYXV0by1zY3JvbGwnLCAnY2VudGVyZWQnLCAnZnVsbHNjcmVlbicsICdhdXRvLXJlZnJlc2gnXSk7XG5cbm9uc0VsZW1lbnRzLkNhcm91c2VsID0gQ2Fyb3VzZWxFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtY2Fyb3VzZWwnLCBDYXJvdXNlbEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1jb2xcbiAqIEBjYXRlZ29yeSBncmlkXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJlcHJlc2VudHMgYSBjb2x1bW4gaW4gdGhlIGdyaWQgc3lzdGVtLiBVc2Ugd2l0aCBgPG9ucy1yb3c+YCB0byBsYXlvdXQgY29tcG9uZW50cy5bL2VuXVxuICogICBbamFd44Kw44Oq44OD44OJ44K344K544OG44Og44Gr44Gm5YiX44KS5a6a576p44GX44G+44GZ44CCb25zLXJvd+OBqOOBqOOCguOBq+S9v+eUqOOBl+OAgeOCs+ODs+ODneODvOODjeODs+ODiOOBruODrOOCpOOCouOCpuODiOOBq+WIqeeUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAbm90ZVxuICogICBbZW5dRm9yIEFuZHJvaWQgNC4zIGFuZCBlYXJsaWVyLCBhbmQgaU9TNiBhbmQgZWFybGllciwgd2hlbiB1c2luZyBtaXhlZCBhbGlnbm1lbnQgd2l0aCBvbnMtcm93IGFuZCBvbnMtY29sdW1uLCB0aGV5IG1heSBub3QgYmUgZGlzcGxheWVkIGNvcnJlY3RseS4gWW91IGNhbiB1c2Ugb25seSBvbmUgYWxpZ25tZW50LlsvZW5dXG4gKiAgIFtqYV1BbmRyb2lkIDQuM+S7peWJjeOAgeOCguOBl+OBj+OBr2lPUyA25Lul5YmN44GuT1Pjga7loLTlkIjjgIFvbnMtcm9344Gob25zLWNvbHVtbuOCkue1hOOBv+WQiOOCj+OBm+OBn+WgtOWQiOOBq+aPj+eUu+OBjOW0qeOCjOOCi+WgtOWQiOOBjOOBguOCiuOBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBHZ3VqQyB7d2lkZX1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwgW2VuXUxheW91dGluZyBndWlkZVsvZW5dW2phXeODrOOCpOOCouOCpuODiOapn+iDvVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtcm93XG4gKiAgIFtlbl1UaGUgYDxvbnMtcm93PmAgY29tcG9uZW50IGlzIHRoZSBwYXJlbnQgb2YgYDxvbnMtY29sPmAuWy9lbl1cbiAqICAgW2phXW9ucy1yb3fjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcm93PlxuICogICA8b25zLWNvbCB3aWR0aD1cIjUwcHhcIj48b25zLWljb24gaWNvbj1cImZhLXR3aXR0ZXJcIj48L29ucy1pY29uPjwvb25zLWNvbD5cbiAqICAgPG9ucy1jb2w+VGV4dDwvb25zLWNvbD5cbiAqIDwvb25zLXJvdz5cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgdmVydGljYWwtYWxpZ25cbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVZlcnRpY2FsIGFsaWdubWVudCBvZiB0aGUgY29sdW1uLiBWYWxpZCB2YWx1ZXMgYXJlIFwidG9wXCIsIFwiY2VudGVyXCIsIGFuZCBcImJvdHRvbVwiLlsvZW5dXG4gKiAgIFtqYV3nuKbjga7phY3nva7jgpLmjIflrprjgZnjgovjgIJcInRvcFwiLCBcImNlbnRlclwiLCBcImJvdHRvbVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgd2lkdGhcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLiBWYWxpZCB2YWx1ZXMgYXJlIGNzcyB3aWR0aCB2YWx1ZXMgKFwiMTAlXCIsIFwiNTBweFwiKS5bL2VuXVxuICogICBbamFd44Kr44Op44Og44Gu5qiq5bmF44KS5oyH5a6a44GZ44KL44CC44OR44O844K744Oz44OI44KC44GX44GP44Gv44OU44Kv44K744Or44Gn5oyH5a6a44GX44G+44GZ77yIMTAl44KENTBweO+8ieOAglsvamFdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSkge1xuICAgICAgdGhpcy5fdXBkYXRlV2lkdGgoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWyd3aWR0aCddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ3dpZHRoJykge1xuICAgICAgdGhpcy5fdXBkYXRlV2lkdGgoKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlV2lkdGgoKSB7XG4gICAgbGV0IHdpZHRoID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgaWYgKCF3aWR0aCkge1xuICAgICAgc3R5bGVyLmNsZWFyKHRoaXMsICdmbGV4IG1heFdpZHRoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpZHRoID0gd2lkdGgudHJpbSgpLm1hdGNoKC9eXFxkKyQvKSA/IHdpZHRoICsgJyUnIDogd2lkdGg7XG5cbiAgICAgIHN0eWxlcih0aGlzLCB7XG4gICAgICAgIGZsZXg6ICcwIDAgJyArIHdpZHRoLFxuICAgICAgICBtYXhXaWR0aDogd2lkdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5vbnNFbGVtZW50cy5Db2wgPSBDb2xFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtY29sJywgQ29sRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBEaWFsb2dBbmltYXRvciBleHRlbmRzIEJhc2VBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdsaW5lYXInLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgc2hvdyhkaWFsb2csIGRvbmUpIHtcbiAgICBkb25lKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG59XG5cbi8qKlxuICogQW5kcm9pZCBzdHlsZSBhbmltYXRvciBmb3IgZGlhbG9nLlxuICovXG5leHBvcnQgY2xhc3MgQW5kcm9pZERpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgRGlhbG9nQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnZWFzZS1pbi1vdXQnLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zfSA9IHt9KSB7XG4gICAgc3VwZXIoe3RpbWluZywgZGVsYXksIGR1cmF0aW9ufSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC02MCUsIDApJywgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCknLCBvcGFjaXR5OiAxIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IDAgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNjAlLCAwKScsIG9wYWNpdHk6IDAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBJT1NEaWFsb2dBbmltYXRvciBleHRlbmRzIERpYWxvZ0FuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2Vhc2UtaW4tb3V0JywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuXG4gICAgdGhpcy5ib2R5SGVpZ2h0ID0gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7IC8vIGF2b2lkIEZvcmNlZCBTeW5jaHJvbm91cyBMYXlvdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoLTUwJSwgJHt0aGlzLmJvZHlIZWlnaHQgLyAyLjAgLSAxfXB4LCAwKWAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoLTUwJSwgJHt0aGlzLmJvZHlIZWlnaHQgLyAyLjAgLSAxfXB4LCAwKWAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogU2xpZGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWRlRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBEaWFsb2dBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoLjEsIC43LCAuNCwgMSknLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yfSA9IHt9KSB7XG4gICAgc3VwZXIoe3RpbWluZywgZGVsYXksIGR1cmF0aW9ufSk7XG5cbiAgICB0aGlzLmJvZHlIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsgLy8gYXZvaWQgRm9yY2VkIFN5bmNocm9ub3VzIExheW91dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGF2b2lkIEZvcmNlZCBTeW5jaHJvbm91cyBMYXlvdXQuIE90aGVyd2lzZSwgZmFkZSBhbmltYXRpb24gb2YgbWFzayB3aWxsIGJlIGJyb2tlbi5cbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC01MCUsICR7LSAodGhpcy5ib2R5SGVpZ2h0IC8gMi4wKSArIDEgLSBkaWFsb2cuX2RpYWxvZy5jbGllbnRIZWlnaHR9cHgsIDApYCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCknIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IDAgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCknIH0sXG4gICAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGF2b2lkIEZvcmNlZCBTeW5jaHJvbm91cyBMYXlvdXQuIE90aGVyd2lzZSwgZmFkZSBhbmltYXRpb24gb2YgbWFzayB3aWxsIGJlIGJyb2tlbi5cbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC01MCUsICR7LSAodGhpcy5ib2R5SGVpZ2h0IC8gMi4wKSArIDEgLSBkaWFsb2cuX2RpYWxvZy5jbGllbnRIZWlnaHR9cHgsIDApYCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBEaWFsb2dBbmltYXRvciwgSU9TRGlhbG9nQW5pbWF0b3IsIEFuZHJvaWREaWFsb2dBbmltYXRvciwgU2xpZGVEaWFsb2dBbmltYXRvciB9IGZyb20gJy4vb25zLWRpYWxvZy9hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5kaWFsb2cnOiAnZGlhbG9nLS0qJyxcbiAgJy5kaWFsb2ctY29udGFpbmVyJzogJ2RpYWxvZy1jb250YWluZXItLSonLFxuICAnLmRpYWxvZy1tYXNrJzogJ2RpYWxvZy1tYXNrLS0qJ1xufTtcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgJ2RlZmF1bHQnOiBmdW5jdGlvbiAoKSB7IHJldHVybiAgcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBBbmRyb2lkRGlhbG9nQW5pbWF0b3IgOiBJT1NEaWFsb2dBbmltYXRvcjsgfSxcbiAgJ3NsaWRlJzogU2xpZGVEaWFsb2dBbmltYXRvcixcbiAgJ25vbmUnOiBEaWFsb2dBbmltYXRvclxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtZGlhbG9nXG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIERpYWxvZyB0aGF0IGlzIGRpc3BsYXllZCBvbiB0b3Agb2YgY3VycmVudCBzY3JlZW4uIEFzIG9wcG9zZWQgdG8gdGhlIGA8b25zLWFsZXJ0LWRpYWxvZz5gIGVsZW1lbnQsIHRoaXMgY29tcG9uZW50IGNhbiBjb250YWluIGFueSBraW5kIG9mIGNvbnRlbnQuXG4gKlxuICogICAgIFRvIHVzZSB0aGUgZWxlbWVudCBpdCBjYW4gZWl0aGVyIGJlIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBgPGJvZHk+YCBlbGVtZW50IG9yIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnJvbSBhIHRlbXBsYXRlIHVzaW5nIHRoZSBgb25zLmNyZWF0ZURpYWxvZyh0ZW1wbGF0ZSlgIHV0aWxpdHkgZnVuY3Rpb24gYW5kIHRoZSBgPHRlbXBsYXRlPmAgdGFnLlxuICpcbiAqICAgICBUaGUgZGlhbG9nIGlzIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBtZW51cywgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciB0byBhc2sgdGhlIHVzZXIgdG8gbWFrZSBhIGRlY2lzaW9uLlxuICpcbiAqICAgICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzcGxheWVkIGFzIE1hdGVyaWFsIERlc2lnbiB3aGVuIHJ1bm5pbmcgb24gYW4gQW5kcm9pZCBkZXZpY2UuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGRpYWxvZy5bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIHp4eGFHYVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2RpYWxvZ1xuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtYWxlcnQtZGlhbG9nXG4gKiAgIFtlbl1gPG9ucy1hbGVydC1kaWFsb2c+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWFsZXJ0LWRpYWxvZ+OCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtcG9wb3ZlclxuICogICBbZW5dYDxvbnMtcG9wb3Zlcj5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtcG9wb3ZlcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbW9kYWxcbiAqICAgW2VuXWA8b25zLW1vZGFsPmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1tb2RhbOOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1kaWFsb2cgaWQ9XCJkaWFsb2dcIj5cbiAqICAgPHA+VGhpcyBpcyBhIGRpYWxvZyE8L3A+XG4gKiA8L29ucy1kaWFsb2c+XG4gKlxuICogPHNjcmlwdD5cbiAqICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpYWxvZycpLnNob3coKTtcbiAqIDwvc2NyaXB0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFsb2dFbGVtZW50IGV4dGVuZHMgQmFzZURpYWxvZ0VsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBkaWFsb2cgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuZGlhbG9nXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBkaWFsb2cgZnJvbSBiZWluZyBzaG93bi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHjg4DjgqTjgqLjg63jgrDjga7ooajnpLrjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RzaG93XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgZGlhbG9nIGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6KGo56S644GV44KM44Gf55u05b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmRpYWxvZ1xuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlaGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuZGlhbG9nXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBkaWFsb2cgZnJvbSBiZWluZyBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6Z2e6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0aGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBoaWRkZW4uWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOmaoOOCjOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5kaWFsb2dcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IGRpYWxvZ2NhbmNlbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIHdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxlZC5bL2VuXVxuICAgKiBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGRpYWxvZy5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNhbmNlbGFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBkaWFsb2cgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGRpYWxvZyBpcyBkaXNhYmxlZC5bL2VuXVxuICAgKiAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeODgOOCpOOCouODreOCsOOBr2Rpc2FibGVk54q25oWL44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IGRlZmF1bHRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gc2hvd2luZyBhbmQgaGlkaW5nIHRoZSBkaWFsb2cuIENhbiBiZSBlaXRoZXIgYFwibm9uZVwiYCBvciBgXCJkZWZhdWx0XCJgLlsvZW5dXG4gICAqICBbamFd44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GZ44KL6Zqb44Gu44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCLjgoLjgZfjgY/jga9cImRlZmF1bHRcIuOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtYXNrLWNvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIGBcInJnYmEoMCwgMCwgMCwgMC4yKVwiYC5bL2VuXVxuICAgKiAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglwicmdiYSgwLCAwLCAwLCAwLjIpXCLjgYzjg4fjg5Xjgqnjg6vjg4jlgKTjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeimgee0oOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX21hc2soKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuZGlhbG9nLW1hc2snKTtcbiAgfVxuXG4gIGdldCBfZGlhbG9nKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmRpYWxvZycpO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IF9hbmltYXRvckRpY3QsXG4gICAgICBiYXNlQ2xhc3M6IERpYWxvZ0FuaW1hdG9yLFxuICAgICAgYmFzZUNsYXNzTmFtZTogJ0RpYWxvZ0FuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKVxuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zdHlsZS56SW5kZXggPSAxMDAwMTtcblxuICAgIC8qIEV4cGVjdGVkIHJlc3VsdDpcbiAgICAgKiAgIDxvbnMtZGlhbG9nPlxuICAgICAqICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLW1hc2tcIj48L2Rpdj5cbiAgICAgKiAgICAgPGRpdiBjbGFzcz1cImRpYWxvZ1wiPlxuICAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctY29udGFpbmVyXCI+Li4uPC9kaXY+XG4gICAgICogICAgIDwvZGl2PlxuICAgICAqICAgPC9vbnMtZGlhbG9nPlxuICAgICAqL1xuXG4gICAgaWYgKCF0aGlzLl9kaWFsb2cpIHtcbiAgICAgIGNvbnN0IGRpYWxvZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGlhbG9nLmNsYXNzTGlzdC5hZGQoJ2RpYWxvZycpO1xuXG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkaWFsb2ctY29udGFpbmVyJyk7XG4gICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKSB7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgZGlhbG9nLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZGlhbG9nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX21hc2spIHtcbiAgICAgIGNvbnN0IG1hc2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1hc2suY2xhc3NMaXN0LmFkZCgnZGlhbG9nLW1hc2snKTtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKG1hc2ssIHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlhbG9nLnN0eWxlLnpJbmRleCA9IDIwMDAxO1xuICAgIHRoaXMuX21hc2suc3R5bGUuekluZGV4ID0gMjAwMDA7XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc3RhdHVzLWJhci1maWxsJywgJycpO1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3coW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJzbGlkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJzbGlkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gIFsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgZGlhbG9nIGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNob3cgdGhlIGRpYWxvZy5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkumWi+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVzIHRvIHRoZSBkaXNwbGF5ZWQgZWxlbWVudC5cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJzbGlkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJzbGlkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb25zIGlzIGNhbGxlZCBhZnRlciB0aGUgZGlhbG9nIGhhcyBiZWVuIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0aGUgZGlhbG9nLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOCkumWieOBmOOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNhbmNlbGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBkaWFsb2cgaXMgY2FuY2VsYWJsZSBvciBub3QuIEEgY2FuY2VsYWJsZSBkaWFsb2cgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtYXNrQ29sb3JcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgcmdiYSgwLCAwLCAwLCAwLjIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgXCJyZ2JhKDAsIDAsIDAsIDAuMilcIi5bL2VuXVxuICAgKiAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglwicmdiYSgwLCAwLCAwLCAwLjIpXCLjgYzjg4fjg5Xjgqnjg6vjg4jlgKTjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtEaWFsb2dBbmltYXRvcn0gQW5pbWF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgRGlhbG9nQW5pbWF0b3IpKSB7XG4gICAgICB1dGlsLnRocm93QW5pbWF0b3IoJ0RpYWxvZycpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGlhbG9nQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIERpYWxvZ0FuaW1hdG9yO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkRpYWxvZyA9IERpYWxvZ0VsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1kaWFsb2cnLCBEaWFsb2dFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBzdHlsZXIgZnJvbSAnLi4vb25zL3N0eWxlci5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdmYWInO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAnZmFiLS0qJyxcbiAgJy5mYWJfX2ljb24nOiAnZmFiLS0qX19pY29uJ1xufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtZmFiXG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBUaGUgRmxvYXRpbmcgYWN0aW9uIGJ1dHRvbiBpcyBhIGNpcmN1bGFyIGJ1dHRvbiBkZWZpbmVkIGluIHRoZSBbTWF0ZXJpYWwgRGVzaWduIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9idXR0b25zLWZsb2F0aW5nLWFjdGlvbi1idXR0b24uaHRtbCkuIFRoZXkgYXJlIG9mdGVuIHVzZWQgdG8gcHJvbW90ZSB0aGUgcHJpbWFyeSBhY3Rpb24gb2YgdGhlIGFwcC5cbiAqXG4gKiAgICAgSXQgY2FuIGJlIGRpc3BsYXllZCBlaXRoZXIgYXMgYW4gaW5saW5lIGVsZW1lbnQgb3IgaW4gb25lIG9mIHRoZSBjb3JuZXJzLiBOb3JtYWxseSBpdCB3aWxsIGJlIHBvc2l0aW9uZWQgaW4gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBvZiB0aGUgc2NyZWVuLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9mYWJcbiAqIEBtb2RpZmllciBtaW5pXG4gKiAgIFtlbl1NYWtlcyB0aGUgYG9ucy1mYWJgIHNtYWxsZXIuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGVlZC1kaWFsXG4gKiAgIFtlbl1UaGUgYDxvbnMtc3BlZWQtZGlhbD5gIGNvbXBvbmVudCBpcyBhIEZsb2F0aW5nIGFjdGlvbiBidXR0b24gdGhhdCBkaXNwbGF5cyBhIG1lbnUgd2hlbiB0YXBwZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZhYkVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXeODnOOCv+ODs+OBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHJpcHBsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHJpcHBsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwb3NpdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgcG9zaXRpb24gb2YgdGhlIGJ1dHRvbi4gU2hvdWxkIGJlIGEgc3RyaW5nIGxpa2UgYFwiYm90dG9tIHJpZ2h0XCJgIG9yIGBcInRvcCBsZWZ0XCJgLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBhbiBpbmxpbmUgZWxlbWVudC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IGlmIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44Oc44K/44Oz44KS54Sh5Yq55YyW44GZ44KL5aC05ZCI44Gv5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBjYW4gYmUgZXhlY3V0ZWQgYmVmb3JlIGNvbnRlbnRSZWFkeVxuICAgIC8vIHNpbmNlIHRoZXNlIGRvIG5vdCBhY2Nlc3MgdGhlIGNoaWxkcmVuXG4gICAgdGhpcy5faGlkZSgpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5mYWJfX2ljb24nKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnZmFiX19pY29uJyk7XG5cbiAgICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2hpbGROb2RlcykuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKCFlbGVtZW50LnRhZ05hbWUgfHwgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdvbnMtcmlwcGxlJykge1xuICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcblxuICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fc2hvdygpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3JpcHBsZScsICdwb3NpdGlvbicsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpcHBsZSc6XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJpcHBsZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Bvc2l0aW9uJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgX3Nob3coKSB7XG4gICAgaWYgKCF0aGlzLl9tYW51YWxseUhpZGRlbikgeyAvLyBpZiB1c2VyIGhhcyBub3QgY2FsbGVkIG9ucy1mYWIuaGlkZSgpXG4gICAgICB0aGlzLl90b2dnbGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3RvZ2dsZShmYWxzZSkpO1xuICB9XG5cbiAgX3VwZGF0ZVJpcHBsZSgpIHtcbiAgICB1dGlsLnVwZGF0ZVJpcHBsZSh0aGlzKTtcbiAgfVxuXG4gIF91cGRhdGVQb3NpdGlvbigpIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpO1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICdmYWItLXRvcF9fbGVmdCcsXG4gICAgICAnZmFiLS1ib3R0b21fX3JpZ2h0JyxcbiAgICAgICdmYWItLWJvdHRvbV9fbGVmdCcsXG4gICAgICAnZmFiLS10b3BfX3JpZ2h0JyxcbiAgICAgICdmYWItLXRvcF9fY2VudGVyJyxcbiAgICAgICdmYWItLWJvdHRvbV9fY2VudGVyJyk7XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wIHJpZ2h0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0IHRvcCc6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS10b3BfX3JpZ2h0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wIGxlZnQnOlxuICAgICAgY2FzZSAnbGVmdCB0b3AnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tdG9wX19sZWZ0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tIHJpZ2h0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0IGJvdHRvbSc6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS1ib3R0b21fX3JpZ2h0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tIGxlZnQnOlxuICAgICAgY2FzZSAnbGVmdCBib3R0b20nOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tYm90dG9tX19sZWZ0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyIHRvcCc6XG4gICAgICBjYXNlICd0b3AgY2VudGVyJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLXRvcF9fY2VudGVyJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyIGJvdHRvbSc6XG4gICAgICBjYXNlICdib3R0b20gY2VudGVyJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLWJvdHRvbV9fY2VudGVyJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3coKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TaG93IHRoZSBmbG9hdGluZyBhY3Rpb24gYnV0dG9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHNob3coKSB7XG4gICAgdGhpcy50b2dnbGUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlXG4gICAqIEBzaWduYXR1cmUgaGlkZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUhpZGUgdGhlIGZsb2F0aW5nIGFjdGlvbiBidXR0b24uWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cbiAgaGlkZSgpIHtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB0b2dnbGVcbiAgICogQHNpZ25hdHVyZSB0b2dnbGUoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBidXR0b24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHRvZ2dsZShhY3Rpb24gPSAhdGhpcy52aXNpYmxlKSB7XG4gICAgdGhpcy5fbWFudWFsbHlIaWRkZW4gPSAhYWN0aW9uO1xuICAgIHRoaXMuX3RvZ2dsZShhY3Rpb24pO1xuICB9XG5cbiAgX3RvZ2dsZShhY3Rpb24gPSAhdGhpcy52aXNpYmxlKSB7XG4gICAgY29uc3QgaXNCb3R0b20gPSAodGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJycpLmluZGV4T2YoJ2JvdHRvbScpID49IDA7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gaXNCb3R0b20gPyBgdHJhbnNsYXRlM2QoMHB4LCAtJHt1dGlsLmdsb2JhbHMuZmFiT2Zmc2V0IHx8IDB9cHgsIDBweClgIDogJyc7XG5cbiAgICBzdHlsZXIodGhpcywgeyB0cmFuc2Zvcm06IGAke3RyYW5zbGF0ZX0gc2NhbGUoJHtOdW1iZXIoYWN0aW9uKX0pYCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZpc2libGVcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGUudHJhbnNmb3JtLmluZGV4T2YoJ3NjYWxlKDApJykgPT09IC0xICYmIHRoaXMuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoRmFiRWxlbWVudCwgWydkaXNhYmxlZCcsICdyaXBwbGUnXSk7XG5cbm9uc0VsZW1lbnRzLkZhYiA9IEZhYkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1mYWInLCBGYWJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IEdlc3R1cmVEZXRlY3RvciBmcm9tICcuLi9vbnMvZ2VzdHVyZS1kZXRlY3Rvci5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWdlc3R1cmUtZGV0ZWN0b3JcbiAqIEBjYXRlZ29yeSBnZXN0dXJlXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIENvbXBvbmVudCB0byBkZXRlY3QgZmluZ2VyIGdlc3R1cmVzIHdpdGhpbiB0aGUgd3JhcHBlZCBlbGVtZW50LiBGb2xsb3dpbmcgZ2VzdHVyZXMgYXJlIHN1cHBvcnRlZDpcbiAqICAgICAtIERyYWcgZ2VzdHVyZXM6IGBkcmFnYCwgYGRyYWdsZWZ0YCwgYGRyYWdyaWdodGAsIGBkcmFndXBgLCBgZHJhZ2Rvd25gXG4gKiAgICAgLSBIb2xkIGdlc3R1cmVzOiBgaG9sZGAsIGByZWxlYXNlYFxuICogICAgIC0gU3dpcGUgZ2VzdHVyZXM6IGBzd2lwZWAsIGBzd2lwZWxlZnRgLCBgc3dpcGVyaWdodGAsIGBzd2lwZXVwYCwgYHN3aXBlZG93bmBcbiAqICAgICAtIFRhcCBnZXN0dXJlczogYHRhcGAsIGBkb3VibGV0YXBgXG4gKiAgICAgLSBQaW5jaCBnZXN0dXJlczogYHBpbmNoYCwgYHBpbmNoaW5gLCBgcGluY2hvdXRgXG4gKiAgICAgLSBPdGhlciBnZXN0dXJlczogYHRvdWNoYCwgYHRyYW5zZm9ybWAsIGByb3RhdGVgXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3opoHntKDlhoXjga7jgrjjgqfjgrnjg4Hjg6Pjg7zmk43kvZzjgpLmpJznn6XjgZfjgb7jgZnjgILoqbPjgZfjgY/jga/jgqzjgqTjg4njgpLlj4LnhafjgZfjgabjgY/jgaDjgZXjgYTjgIJbL2phXVxuICogQGd1aWRlIGZlYXR1cmVzLmh0bWwjZ2VzdHVyZS1kZXRlY3Rpb25cbiAqICAgW2VuXURldGVjdGluZyBmaW5nZXIgZ2VzdHVyZXNbL2VuXVxuICogICBbamFd44K444Kn44K544OB44Oj44O85pON5L2c44Gu5qSc55+lWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWdlc3R1cmUtZGV0ZWN0b3I+XG4gKiAgIDxkaXYgaWQ9XCJkZXRlY3QtYXJlYVwiIHN0eWxlPVwid2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDEwMHB4O1wiPlxuICogICAgIFN3aXBlIEhlcmVcbiAqICAgPC9kaXY+XG4gKiA8L29ucy1nZXN0dXJlLWRldGVjdG9yPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3N3aXBlbGVmdCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gKiAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKCcjZGV0ZWN0LWFyZWEnKSkge1xuICogICAgICAgY29uc29sZS5sb2coJ1N3aXBlIGxlZnQgaXMgZGV0ZWN0ZWQuJyk7XG4gKiAgICAgfVxuICogICB9KTtcbiAqIDwvc2NyaXB0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHZXN0dXJlRGV0ZWN0b3JFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbmV3IEdlc3R1cmVEZXRlY3Rvcih0aGlzLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gIH1cbn1cblxub25zRWxlbWVudHMuR2VzdHVyZURldGVjdG9yID0gR2VzdHVyZURldGVjdG9yRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWdlc3R1cmUtZGV0ZWN0b3InLCBHZXN0dXJlRGV0ZWN0b3JFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5sZXQgYXV0b1ByZWZpeCA9ICdmYSc7IC8vIEZJWE1FOiBUbyBiZSByZW1vdmVkIGluIHYzXG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWljb25cbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRGlzcGxheXMgYW4gaWNvbi4gVGhlIGZvbGxvd2luZyBpY29uIHN1aXRlcyBhcmUgYXZhaWxhYmxlOlxuICpcbiAqICAgICAqIFtGb250IEF3ZXNvbWVdKGh0dHBzOi8vZm9ydGF3ZXNvbWUuZ2l0aHViLmlvL0ZvbnQtQXdlc29tZS8pXG4gKiAgICAgKiBbSW9uaWNvbnNdKGh0dHA6Ly9pb25pY29ucy5jb20vKVxuICogICAgICogW01hdGVyaWFsIERlc2lnbiBJY29uaWMgRm9udF0oaHR0cDovL3phdm9sb2tsb20uZ2l0aHViLmlvL21hdGVyaWFsLWRlc2lnbi1pY29uaWMtZm9udC8pXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4geEFodmdcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9pY29uXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1bL2phXVxuICogQGd1aWRlIGFwcHNpemUuaHRtbCNyZW1vdmluZy1pY29uLXBhY2tzIFtlbl1SZW1vdmluZyBpY29uIHBhY2tzLlsvZW5dW2phXVsvamFdXG4gKiBAZ3VpZGUgZmFxLmh0bWwjaG93LWNhbi1pLXVzZS1jdXN0b20taWNvbi1wYWNrcyBbZW5dQWRkaW5nIGN1c3RvbSBpY29uIHBhY2tzLlsvZW5dW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1pY29uXG4gKiAgIGljb249XCJtZC1jYXJcIlxuICogICBzaXplPVwiMjBweFwiXG4gKiAgIHN0eWxlPVwiY29sb3I6IHJlZFwiPlxuICogPC9vbnMtaWNvbj5cbiAqXG4gKiA8b25zLWJ1dHRvbj5cbiAqICAgPG9ucy1pY29uIGljb249XCJtZC1jYXJcIj48L29ucy1pY29uPlxuICogICBDYXJcbiAqIDwvb25zLWJ1dHRvbj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSWNvbkVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaWNvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBUaGUgaWNvbiBuYW1lLiBgXCJtZC1cImAgcHJlZml4IGZvciBNYXRlcmlhbCBJY29ucywgYFwiZmEtXCJgIGZvciBGb250IEF3ZXNvbWUgYW5kIGBcImlvbi1cImAgcHJlZml4IGZvciBJb25pY29ucy5cbiAgICpcbiAgICogICAgIFNlZSBhbGwgYXZhaWxhYmxlIGljb25zIG9uIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uIChhdCB0aGUgdG9wKS5cbiAgICpcbiAgICogICAgIEljb25zIGNhbiBhbHNvIGJlIHN0eWxlZCBiYXNlZCBvbiBtb2RpZmllciBwcmVzZW5jZS4gQWRkIGNvbW1hLXNlcGFyYXRlZCBpY29ucyB3aXRoIGBcIm1vZGlmaWVyTmFtZTpcImAgcHJlZml4LlxuICAgKlxuICAgKiAgICAgVGhlIGNvZGUgYDxvbnMtaWNvbiBpY29uPVwiaW9uLWVkaXQsIG1hdGVyaWFsOm1kLWVkaXRcIj48L29ucy1pY29uPmAgd2lsbCBkaXNwbGF5IGBcIm1kLWVkaXRcImAgZm9yIE1hdGVyaWFsIERlc2lnbiBhbmQgYFwiaW9uLWVkaXRcImAgYXMgdGhlIGRlZmF1bHQgaWNvbi5cbiAgICpcbiAgICogICAgIGBmYS1gIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vbmUgaXMgcHJvdmlkZWQuIENoZWNrIFtTZWUgYWxzb10oI3NlZWFsc28pIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc2l6ZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBUaGUgc2l6ZXMgb2YgdGhlIGljb24uIFZhbGlkIHZhbHVlcyBhcmUgbGcsIDJ4LCAzeCwgNHgsIDV4LCBvciBpbiB0aGUgc2l6ZSBpbiBwaXhlbHMuXG4gICAqICAgICBJY29ucyBjYW4gYWxzbyBiZSBzdHlsZWQgYmFzZWQgb24gbW9kaWZpZXIgcHJlc2VuY2UuIEFkZCBjb21tYS1zZXBhcmF0ZWQgaWNvbnMgd2l0aCBgXCJtb2RpZmllck5hbWU6XCJgIHByZWZpeC5cbiAgICpcbiAgICogICAgIFRoZSBjb2RlOlxuICAgKlxuICAgKiAgICAgYGBgXG4gICAqICAgICA8b25zLWljb25cbiAgICogICAgICAgaWNvbj1cImlvbi1lZGl0XCJcbiAgICogICAgICAgc2l6ZT1cIjMycHgsIG1hdGVyaWFsOjI0cHhcIj5cbiAgICogICAgIDwvb25zLWljb24+XG4gICAqICAgICBgYGBcbiAgICpcbiAgICogICAgIHdpbGwgcmVuZGVyIGFzIGEgYDI0cHhgIGljb24gaWYgdGhlIGBcIm1hdGVyaWFsXCJgIG1vZGlmaWVyIGlzIHByZXNlbnQgYW5kIGAzMnB4YCBvdGhlcndpc2UuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcm90YXRlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1OdW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgdGhlIGljb24uIFZhbGlkIHZhbHVlcyBhcmUgOTAsIDE4MCBhbmQgMjcwLlsvZW5dXG4gICAqICAgW2phXeOCouOCpOOCs+ODs+OCkuWbnui7ouOBl+OBpuihqOekuuOBl+OBvuOBmeOAgjkwLCAxODAsIDI3MOOBi+OCieaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGZpeGVkLXdpZHRoXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1XaGVuIHVzZWQgaW4gYSBsaXN0LCB5b3Ugd2FudCB0aGUgaWNvbnMgdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCBzbyB0aGF0IHRoZXkgYWxpZ24gdmVydGljYWxseSBieSBkZWZpbmluZyB0aGlzIGF0dHJpYnV0ZS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZml4ZWRXaWR0aFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dV2hlbiB1c2VkIGluIGEgbGlzdCwgeW91IHdhbnQgdGhlIGljb25zIHRvIGhhdmUgdGhlIHNhbWUgd2lkdGggc28gdGhhdCB0aGV5IGFsaWduIHZlcnRpY2FsbHkgYnkgZGVmaW5pbmcgdGhpcyBhdHRyaWJ1dGUuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzcGluXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIGJlIHNwaW5uaW5nLlsvZW5dXG4gICAqICAgW2phXeOCouOCpOOCs+ODs+OCkuWbnui7ouOBmeOCi+OBi+OBqeOBhuOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc3BpblxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgd2hldGhlciB0aGUgaWNvbiBzaG91bGQgYmUgc3Bpbm5pbmcuWy9lbl1cbiAgICogICBbamFd44Ki44Kk44Kz44Oz44KS5Zue6Lui44GZ44KL44GL44Gp44GG44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydpY29uJywgJ3NpemUnLCAnbW9kaWZpZXInLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgdGhpcy5fY2xlYW5DbGFzc0F0dHJpYnV0ZShuYW1lID09PSAnaWNvbicgPyBsYXN0IDogdGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKSwgbmFtZSA9PT0gJ21vZGlmaWVyJyA/IGxhc3QgOiB1bmRlZmluZWQpO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5fdXBkYXRlKCk7XG4gIH1cblxuICBfdXBkYXRlKCkge1xuICAgIGNvbnN0IHtjbGFzc0xpc3QsIHN0eWxlfSA9IHRoaXMuX2J1aWxkQ2xhc3NBbmRTdHlsZSh0aGlzLl9wYXJzZUF0dHIoJ2ljb24nKSwgdGhpcy5fcGFyc2VBdHRyKCdzaXplJykpO1xuICAgIHV0aWwuZXh0ZW5kKHRoaXMuc3R5bGUsIHN0eWxlKTtcblxuICAgIGNsYXNzTGlzdC5mb3JFYWNoKGNsYXNzTmFtZSA9PiB0aGlzLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKSk7XG4gIH1cblxuICBfcGFyc2VBdHRyKGF0dHJOYW1lLCBtb2RpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpIHx8ICcnKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSB8fCBhdHRyTmFtZSB8fCAnJztcbiAgICBjb25zdCBwYXJ0cyA9IGF0dHIuc3BsaXQoL1xccyosXFxzKi8pO1xuICAgIGNvbnN0IGRlZiA9IHBhcnRzWzBdO1xuICAgIGxldCBtZCA9IHBhcnRzWzFdO1xuICAgIG1kID0gKG1kIHx8ICcnKS5zcGxpdCgvXFxzKjpcXHMqLyk7XG5cbiAgICByZXR1cm4gKG1vZGlmaWVyICYmIChSZWdFeHAoYChefFxcXFxzKykke21kWzBdfSgkfFxcXFxzKylgLCAnaScpLnRlc3QobW9kaWZpZXIpKSA/IG1kWzFdIDogZGVmKSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdW5uZWVkZWQgY2xhc3MgdmFsdWUuXG4gICAqL1xuICBfY2xlYW5DbGFzc0F0dHJpYnV0ZShsYXN0SWNvbiwgbGFzdE1vZGlmaWVyKSB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUsIHByZWZpeCB9ID0gdGhpcy5fcHJlZml4SWNvbih0aGlzLl9wYXJzZUF0dHIobGFzdEljb24sIGxhc3RNb2RpZmllcikpO1xuICAgIGNvbnN0IGN1c3RvbVByZWZpeFJFID0gY2xhc3NOYW1lICE9PSBwcmVmaXggPyBgfCR7cHJlZml4fSR8JHtwcmVmaXh9LWAgOiBgfCR7Y2xhc3NOYW1lfSRgIHx8ICcnO1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXihmYSR8ZmEtfGlvbi18em1kaSR8em1kaS18b25zLWljb24tLSR7Y3VzdG9tUHJlZml4UkV9KWApO1xuXG4gICAgdXRpbC5hcnJheUZyb20odGhpcy5jbGFzc0xpc3QpXG4gICAgICAuZmlsdGVyKGNsYXNzTmFtZSA9PiByZS50ZXN0KGNsYXNzTmFtZSkpXG4gICAgICAuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSkpO1xuICB9XG5cbiAgX3ByZWZpeEljb24oaWNvbk5hbWUpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBhdXRvUHJlZml4ICsgKGF1dG9QcmVmaXggPyAnLScgOiAnJykgKyBpY29uTmFtZTtcbiAgICByZXR1cm4geyBjbGFzc05hbWUsIHByZWZpeDogY2xhc3NOYW1lLnNwbGl0KCctJylbMF0gfTtcbiAgfVxuXG4gIF9idWlsZENsYXNzQW5kU3R5bGUoaWNvbk5hbWUsIHNpemUpIHtcbiAgICBjb25zdCBjbGFzc0xpc3QgPSBbJ29ucy1pY29uJ107XG4gICAgY29uc3Qgc3R5bGUgPSB7fTtcblxuICAgIC8vIEljb25cbiAgICBpZiAoaWNvbk5hbWUuaW5kZXhPZignaW9uLScpID09PSAwKSB7XG4gICAgICBjbGFzc0xpc3QucHVzaChpY29uTmFtZSk7XG4gICAgICBjbGFzc0xpc3QucHVzaCgnb25zLWljb24tLWlvbicpO1xuICAgIH0gZWxzZSBpZiAoaWNvbk5hbWUuaW5kZXhPZignZmEtJykgPT09IDApIHtcbiAgICAgIGNsYXNzTGlzdC5wdXNoKGljb25OYW1lKTtcbiAgICAgIC8vIGRlZmF1bHQgaWNvbiBzdHlsZSB0byBGb250IEF3ZXNvbWUgU29saWQgaWYgaWNvbiBzdHlsZSBpcyBub3Qgc3BlY2lmaWVkIGFscmVhZHlcbiAgICAgIGlmICghKHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYXInKSB8fCB0aGlzLmNsYXNzTGlzdC5jb250YWlucygnZmFiJykgfHwgdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ2ZhbCcpKSkge1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgnZmEnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGljb25OYW1lLmluZGV4T2YoJ21kLScpID09PSAwKSAge1xuICAgICAgY2xhc3NMaXN0LnB1c2goJ3ptZGknKTtcbiAgICAgIGNsYXNzTGlzdC5wdXNoKCd6bWRpLScgKyBpY29uTmFtZS5zcGxpdCgvLSguKyk/LylbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGNsYXNzTmFtZSwgcHJlZml4IH0gPSB0aGlzLl9wcmVmaXhJY29uKGljb25OYW1lKTtcbiAgICAgIHByZWZpeCAmJiBjbGFzc0xpc3QucHVzaChwcmVmaXgpO1xuICAgICAgY2xhc3NOYW1lICYmIGNsYXNzTGlzdC5wdXNoKGNsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gU2l6ZVxuICAgIGlmIChzaXplLm1hdGNoKC9eWzEtNV14fGxnJC8pKSB7XG4gICAgICBjbGFzc0xpc3QucHVzaCgnb25zLWljb24tLScgKyBzaXplKTtcbiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2ZvbnQtc2l6ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5mb250U2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTGlzdDogY2xhc3NMaXN0LFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBzZXRBdXRvUHJlZml4KHByZWZpeCkge1xuICAgIGF1dG9QcmVmaXggPSBwcmVmaXggPyAodHlwZW9mIHByZWZpeCA9PT0gJ3N0cmluZycgJiYgcHJlZml4IHx8ICdmYScpIDogJyc7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhJY29uRWxlbWVudCwgWydmaXhlZC13aWR0aCcsICdzcGluJ10pO1xuXG5vbnNFbGVtZW50cy5JY29uID0gSWNvbkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1pY29uJywgSWNvbkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0uanMnO1xuXG5leHBvcnQgY2xhc3MgTGF6eVJlcGVhdERlbGVnYXRlIHtcblxuICBjb25zdHJ1Y3Rvcih1c2VyRGVsZWdhdGUsIHRlbXBsYXRlRWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJEZWxlZ2F0ZSAhPT0gJ29iamVjdCcgfHwgdXNlckRlbGVnYXRlID09PSBudWxsKSB7XG4gICAgICB1dGlsLnRocm93KCdcImRlbGVnYXRlXCIgcGFyYW1ldGVyIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZSA9IHVzZXJEZWxlZ2F0ZTtcblxuICAgIGlmICghKHRlbXBsYXRlRWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIHRlbXBsYXRlRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgdXRpbC50aHJvdygnXCJ0ZW1wbGF0ZUVsZW1lbnRcIiBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFbGVtZW50IG9yIG51bGwnKTtcbiAgICB9XG4gICAgdGhpcy5fdGVtcGxhdGVFbGVtZW50ID0gdGVtcGxhdGVFbGVtZW50O1xuICB9XG5cbiAgZ2V0IGl0ZW1IZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJEZWxlZ2F0ZS5pdGVtSGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBoYXNSZW5kZXJGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckRlbGVnYXRlLl9yZW5kZXIgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgX3JlbmRlcigpIHtcbiAgICB0aGlzLl91c2VyRGVsZWdhdGUuX3JlbmRlci5hcHBseSh0aGlzLl91c2VyRGVsZWdhdGUsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmUgQSBmdW5jdGlvbiB0aGF0IHRha2UgaXRlbSBvYmplY3QgYXMgcGFyYW1ldGVyLlxuICAgKi9cbiAgbG9hZEl0ZW1FbGVtZW50KGluZGV4LCBkb25lKSB7XG4gICAgaWYgKHRoaXMuX3VzZXJEZWxlZ2F0ZS5sb2FkSXRlbUVsZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgdGhpcy5fdXNlckRlbGVnYXRlLmxvYWRJdGVtRWxlbWVudChpbmRleCwgZG9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl91c2VyRGVsZWdhdGUuY3JlYXRlSXRlbUNvbnRlbnQoaW5kZXgsIHRoaXMuX3RlbXBsYXRlRWxlbWVudCk7XG4gICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgdXRpbC50aHJvdygnXCJjcmVhdGVJdGVtQ29udGVudFwiIG11c3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mIEVsZW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgZG9uZSh7ZWxlbWVudH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuICBjb3VudEl0ZW1zKCkge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5fdXNlckRlbGVnYXRlLmNvdW50SXRlbXMoKTtcbiAgICBpZiAodHlwZW9mIGNvdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgdXRpbC50aHJvdygnXCJjb3VudEl0ZW1zXCIgbXVzdCByZXR1cm4gYSBudW1iZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGl0ZW0uZWxlbWVudFxuICAgKi9cbiAgdXBkYXRlSXRlbShpbmRleCwgaXRlbSkge1xuICAgIGlmICh0aGlzLl91c2VyRGVsZWdhdGUudXBkYXRlSXRlbUNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgdGhpcy5fdXNlckRlbGVnYXRlLnVwZGF0ZUl0ZW1Db250ZW50KGluZGV4LCBpdGVtKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgY2FsY3VsYXRlSXRlbUhlaWdodChpbmRleCkge1xuICAgIGlmICh0aGlzLl91c2VyRGVsZWdhdGUuY2FsY3VsYXRlSXRlbUhlaWdodCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLl91c2VyRGVsZWdhdGUuY2FsY3VsYXRlSXRlbUhlaWdodChpbmRleCk7XG5cbiAgICAgIGlmICh0eXBlb2YgaGVpZ2h0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICB1dGlsLnRocm93KCdcImNhbGN1bGF0ZUl0ZW1IZWlnaHRcIiBtdXN0IHJldHVybiBhIG51bWJlcicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVxuICAgKi9cbiAgZGVzdHJveUl0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICBpZiAodGhpcy5fdXNlckRlbGVnYXRlLmRlc3Ryb3lJdGVtIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZS5kZXN0cm95SXRlbShpbmRleCwgaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl91c2VyRGVsZWdhdGUuZGVzdHJveSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLl91c2VyRGVsZWdhdGUuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZSA9IHRoaXMuX3RlbXBsYXRlRWxlbWVudCA9IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGUgY29yZSBmdW5jdGlvbnMgZm9yIG9ucy1sYXp5LXJlcGVhdC5cbiAqL1xuZXhwb3J0IGNsYXNzIExhenlSZXBlYXRQcm92aWRlciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gd3JhcHBlckVsZW1lbnRcbiAgICogQHBhcmFtIHtMYXp5UmVwZWF0RGVsZWdhdGV9IGRlbGVnYXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih3cmFwcGVyRWxlbWVudCwgZGVsZWdhdGUpIHtcbiAgICBpZiAoIShkZWxlZ2F0ZSBpbnN0YW5jZW9mIExhenlSZXBlYXREZWxlZ2F0ZSkpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wiZGVsZWdhdGVcIiBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBMYXp5UmVwZWF0RGVsZWdhdGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLl93cmFwcGVyRWxlbWVudCA9IHdyYXBwZXJFbGVtZW50O1xuICAgIHRoaXMuX2RlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgdGhpcy5faW5zZXJ0SW5kZXggPSAodGhpcy5fd3JhcHBlckVsZW1lbnQuY2hpbGRyZW5bMF0gJiYgdGhpcy5fd3JhcHBlckVsZW1lbnQuY2hpbGRyZW5bMF0udGFnTmFtZSA9PT0gJ09OUy1MQVpZLVJFUEVBVCcpID8gMSA6IDA7XG5cbiAgICBpZiAod3JhcHBlckVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLWxpc3QnKSB7XG4gICAgICB3cmFwcGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsYXp5LWxpc3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wYWdlQ29udGVudCA9IHRoaXMuX2ZpbmRQYWdlQ29udGVudEVsZW1lbnQod3JhcHBlckVsZW1lbnQpO1xuXG4gICAgaWYgKCF0aGlzLl9wYWdlQ29udGVudCkge1xuICAgICAgdXRpbC50aHJvdygnTGF6eVJlcGVhdCBtdXN0IGJlIGRlc2NlbmRhbnQgb2YgYSBQYWdlIGVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSB0aGlzLl9wYWdlQ29udGVudC5zY3JvbGxUb3A7XG4gICAgdGhpcy5wYWRkaW5nID0gMDtcbiAgICB0aGlzLl90b3BQb3NpdGlvbnMgPSBbMF07XG4gICAgdGhpcy5fcmVuZGVyZWRJdGVtcyA9IHt9O1xuXG4gICAgaWYgKCF0aGlzLl9kZWxlZ2F0ZS5pdGVtSGVpZ2h0ICYmICF0aGlzLl9kZWxlZ2F0ZS5jYWxjdWxhdGVJdGVtSGVpZ2h0KDApKSB7XG4gICAgICB0aGlzLl91bmtub3duSXRlbUhlaWdodCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9vbkNoYW5nZSgpO1xuICB9XG5cbiAgZ2V0IHBhZGRpbmcoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLnBhZGRpbmdUb3AsIDEwKTtcbiAgfVxuXG4gIHNldCBwYWRkaW5nKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5fd3JhcHBlckVsZW1lbnQuc3R5bGUucGFkZGluZ1RvcCA9IG5ld1ZhbHVlICsgJ3B4JztcbiAgfVxuXG4gIF9maW5kUGFnZUNvbnRlbnRFbGVtZW50KHdyYXBwZXJFbGVtZW50KSB7XG4gICAgY29uc3QgcGFnZUNvbnRlbnQgPSB1dGlsLmZpbmRQYXJlbnQod3JhcHBlckVsZW1lbnQsICcucGFnZV9fY29udGVudCcpO1xuXG4gICAgaWYgKHBhZ2VDb250ZW50KSB7XG4gICAgICByZXR1cm4gcGFnZUNvbnRlbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZSA9IHV0aWwuZmluZFBhcmVudCh3cmFwcGVyRWxlbWVudCwgJ29ucy1wYWdlJyk7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB1dGlsLmZpbmRDaGlsZChwYWdlLCAnLmNvbnRlbnQnKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgX2NoZWNrSXRlbUhlaWdodChjYWxsYmFjaykge1xuICAgIHRoaXMuX2RlbGVnYXRlLmxvYWRJdGVtRWxlbWVudCgwLCBpdGVtID0+IHtcbiAgICAgIGlmICghdGhpcy5fdW5rbm93bkl0ZW1IZWlnaHQpIHtcbiAgICAgICAgdXRpbC50aHJvdygnSW52YWxpZCBzdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl93cmFwcGVyRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtLmVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBkb25lID0gKCkgPT4ge1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5kZXN0cm95SXRlbSgwLCBpdGVtKTtcbiAgICAgICAgaXRlbS5lbGVtZW50ICYmIGl0ZW0uZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3Vua25vd25JdGVtSGVpZ2h0O1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5faXRlbUhlaWdodCA9IGl0ZW0uZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgIGlmICh0aGlzLl9pdGVtSGVpZ2h0ID4gMCkge1xuICAgICAgICBkb25lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gcmV0cnkgdG8gbWVhc3VyZSBvZmZzZXQgaGVpZ2h0XG4gICAgICAvLyBkaXJ0eSBmaXggZm9yIGFuZ3VsYXIyIGRpcmVjdGl2ZVxuICAgICAgdGhpcy5fd3JhcHBlckVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgaXRlbS5lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblxuICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5faXRlbUhlaWdodCA9IGl0ZW0uZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtSGVpZ2h0ID09IDApIHtcbiAgICAgICAgICB1dGlsLnRocm93KCdJbnZhbGlkIHN0YXRlOiBcIml0ZW1IZWlnaHRcIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd3JhcHBlckVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzdGF0aWNJdGVtSGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5pdGVtSGVpZ2h0IHx8IHRoaXMuX2l0ZW1IZWlnaHQ7XG4gIH1cbiAgX2NvdW50SXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmNvdW50SXRlbXMoKTtcbiAgfVxuXG4gIF9nZXRJdGVtSGVpZ2h0KGkpIHtcbiAgICAvLyBJdGVtIGlzIHJlbmRlcmVkXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9yZW5kZXJlZEl0ZW1zLCBpKSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fcmVuZGVyZWRJdGVtc1tpXSwgJ2hlaWdodCcpKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkSXRlbXNbaV0uaGVpZ2h0ID0gdGhpcy5fcmVuZGVyZWRJdGVtc1tpXS5lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZEl0ZW1zW2ldLmhlaWdodDtcbiAgICB9XG5cbiAgICAvLyBJdGVtIGlzIG5vdCByZW5kZXJlZCwgc2Nyb2xsIHVwXG4gICAgaWYgKHRoaXMuX3RvcFBvc2l0aW9uc1tpICsgMV0gJiYgdGhpcy5fdG9wUG9zaXRpb25zW2ldKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdG9wUG9zaXRpb25zW2kgKyAxXSAtIHRoaXMuX3RvcFBvc2l0aW9uc1tpXTtcbiAgICB9XG4gICAgLy8gSXRlbSBpcyBub3QgcmVuZGVyZWQsIHNjcm9sbCBkb3duXG4gICAgcmV0dXJuIHRoaXMuc3RhdGljSXRlbUhlaWdodCB8fCB0aGlzLl9kZWxlZ2F0ZS5jYWxjdWxhdGVJdGVtSGVpZ2h0KGkpO1xuICB9XG5cbiAgX2NhbGN1bGF0ZVJlbmRlcmVkSGVpZ2h0KCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyB0aGlzLl9nZXRJdGVtSGVpZ2h0KCsoYikpLCAwKTtcbiAgfVxuXG4gIF9vbkNoYW5nZSgpIHtcbiAgICB0aGlzLl9yZW5kZXIoKTtcbiAgfVxuXG4gIF9sYXN0SXRlbVJlbmRlcmVkKCkge1xuICAgIHJldHVybiBNYXRoLm1heCguLi5PYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKSk7XG4gIH1cblxuICBfZmlyc3RJdGVtUmVuZGVyZWQoKSB7XG4gICAgcmV0dXJuIE1hdGgubWluKC4uLk9iamVjdC5rZXlzKHRoaXMuX3JlbmRlcmVkSXRlbXMpKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgY29uc3QgZm9yY2VSZW5kZXIgPSB7IGZvcmNlU2Nyb2xsRG93bjogdHJ1ZSB9O1xuICAgIGNvbnN0IGZpcnN0SXRlbUluZGV4ID0gdGhpcy5fZmlyc3RJdGVtUmVuZGVyZWQoKTtcblxuICAgIGlmICh1dGlsLmlzSW50ZWdlcihmaXJzdEl0ZW1JbmRleCkpIHtcbiAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuX3RvcFBvc2l0aW9uc1tmaXJzdEl0ZW1JbmRleF0gKyB0aGlzLl9jYWxjdWxhdGVSZW5kZXJlZEhlaWdodCgpICsgJ3B4JztcbiAgICAgIHRoaXMucGFkZGluZyA9IHRoaXMuX3RvcFBvc2l0aW9uc1tmaXJzdEl0ZW1JbmRleF07XG4gICAgICBmb3JjZVJlbmRlci5mb3JjZUZpcnN0SW5kZXggPSBmaXJzdEl0ZW1JbmRleDtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW1vdmVBbGxFbGVtZW50cygpO1xuICAgIHRoaXMuX3JlbmRlcihmb3JjZVJlbmRlcik7XG4gICAgdGhpcy5fd3JhcHBlckVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICB9XG5cbiAgX3JlbmRlcih7Zm9yY2VTY3JvbGxEb3duID0gZmFsc2UsIGZvcmNlRmlyc3RJbmRleCwgZm9yY2VMYXN0SW5kZXh9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fdW5rbm93bkl0ZW1IZWlnaHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja0l0ZW1IZWlnaHQodGhpcy5fcmVuZGVyLmJpbmQodGhpcywgYXJndW1lbnRzWzBdKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNTY3JvbGxVcCA9ICFmb3JjZVNjcm9sbERvd24gJiYgdGhpcy5sYXN0U2Nyb2xsVG9wID4gdGhpcy5fcGFnZUNvbnRlbnQuc2Nyb2xsVG9wO1xuICAgIHRoaXMubGFzdFNjcm9sbFRvcCA9IHRoaXMuX3BhZ2VDb250ZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBrZWVwID0ge307XG5cbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl93cmFwcGVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgY29uc3QgbGltaXQgPSA0ICogd2luZG93LmlubmVySGVpZ2h0IC0gb2Zmc2V0O1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5fY291bnRJdGVtcygpO1xuXG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBjb25zdCBzdGFydCA9IGZvcmNlRmlyc3RJbmRleCB8fCBNYXRoLm1heCgwLCB0aGlzLl9jYWxjdWxhdGVTdGFydEluZGV4KG9mZnNldCkgLSAzMCk7IC8vIFJlY2FsY3VsYXRlIGZvciAwIG9yIHVuZGVmaW5lZFxuICAgIGxldCBpID0gc3RhcnQ7XG5cbiAgICBmb3IgKGxldCB0b3AgPSB0aGlzLl90b3BQb3NpdGlvbnNbaV07IGkgPCBjb3VudCAmJiB0b3AgPCBsaW1pdDsgaSsrKSB7XG4gICAgICBpZiAoaSA+PSB0aGlzLl90b3BQb3NpdGlvbnMubGVuZ3RoKSB7IC8vIHBlcmYgb3B0aW1pemF0aW9uXG4gICAgICAgIHRoaXMuX3RvcFBvc2l0aW9ucy5sZW5ndGggKz0gMTAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90b3BQb3NpdGlvbnNbaV0gPSB0b3A7XG4gICAgICB0b3AgKz0gdGhpcy5fZ2V0SXRlbUhlaWdodChpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGVsZWdhdGUuaGFzUmVuZGVyRnVuY3Rpb24gJiYgdGhpcy5fZGVsZWdhdGUuaGFzUmVuZGVyRnVuY3Rpb24oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLl9yZW5kZXIoc3RhcnQsIGksICgpID0+IHtcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gdGhpcy5fdG9wUG9zaXRpb25zW3N0YXJ0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc1Njcm9sbFVwKSB7XG4gICAgICBmb3IgKGxldCBqID0gaSAtIDE7IGogPj0gc3RhcnQ7IGotLSkge1xuICAgICAgICBrZWVwW2pdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVuZGVyRWxlbWVudChqLCBpc1Njcm9sbFVwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFzdEluZGV4ID0gZm9yY2VMYXN0SW5kZXggfHwgTWF0aC5tYXgoaSAtIDEsIC4uLk9iamVjdC5rZXlzKHRoaXMuX3JlbmRlcmVkSXRlbXMpKTsgLy8gUmVjYWxjdWxhdGUgZm9yIDAgb3IgdW5kZWZpbmVkXG4gICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gbGFzdEluZGV4OyBqKyspIHtcbiAgICAgICAga2VlcFtqXSA9IHRydWU7XG4gICAgICAgIHRoaXMuX3JlbmRlckVsZW1lbnQoaiwgaXNTY3JvbGxVcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXModGhpcy5fcmVuZGVyZWRJdGVtcykuZm9yRWFjaChrZXkgPT4ga2VlcFtrZXldIHx8IHRoaXMuX3JlbW92ZUVsZW1lbnQoa2V5LCBpc1Njcm9sbFVwKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNTY3JvbGxVcFxuICAgKi9cbiAgX3JlbmRlckVsZW1lbnQoaW5kZXgsIGlzU2Nyb2xsVXApIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF07XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHRoaXMuX2RlbGVnYXRlLnVwZGF0ZUl0ZW0oaW5kZXgsIGl0ZW0pOyAvLyB1cGRhdGUgaWYgaXQgZXhpc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsZWdhdGUubG9hZEl0ZW1FbGVtZW50KGluZGV4LCBpdGVtID0+IHtcbiAgICAgIGlmIChpc1Njcm9sbFVwKSB7XG4gICAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50Lmluc2VydEJlZm9yZShpdGVtLmVsZW1lbnQsIHRoaXMuX3dyYXBwZXJFbGVtZW50LmNoaWxkcmVuW3RoaXMuX2luc2VydEluZGV4XSk7XG4gICAgICAgIHRoaXMucGFkZGluZyA9IHRoaXMuX3RvcFBvc2l0aW9uc1tpbmRleF07XG4gICAgICAgIGl0ZW0uaGVpZ2h0ID0gdGhpcy5fdG9wUG9zaXRpb25zW2luZGV4ICsgMV0gLSB0aGlzLl90b3BQb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd3JhcHBlckVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbS5lbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF0gPSBpdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2Nyb2xsVXBcbiAgICovXG4gIF9yZW1vdmVFbGVtZW50KGluZGV4LCBpc1Njcm9sbFVwID0gdHJ1ZSkge1xuICAgIGluZGV4ID0gKyhpbmRleCk7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdO1xuICAgIHRoaXMuX2RlbGVnYXRlLmRlc3Ryb3lJdGVtKGluZGV4LCBpdGVtKTtcblxuICAgIGlmIChpc1Njcm9sbFVwKSB7XG4gICAgICB0aGlzLl90b3BQb3NpdGlvbnNbaW5kZXggKyAxXSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWRkaW5nID0gdGhpcy5wYWRkaW5nICsgdGhpcy5fZ2V0SXRlbUhlaWdodChpbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBpdGVtLmVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChpdGVtLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzLl9yZW5kZXJlZEl0ZW1zW2luZGV4XTtcbiAgfVxuXG4gIF9yZW1vdmVBbGxFbGVtZW50cygpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKS5mb3JFYWNoKGtleSA9PiB0aGlzLl9yZW1vdmVFbGVtZW50KGtleSkpO1xuICB9XG5cbiAgX3JlY2FsY3VsYXRlVG9wUG9zaXRpb25zKHN0YXJ0LCBlbmQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIHRoaXMuX3RvcFBvc2l0aW9uc1tpICsgMV0gPSB0aGlzLl90b3BQb3NpdGlvbnNbaV0gKyB0aGlzLl9nZXRJdGVtSGVpZ2h0KGkpO1xuICAgIH1cbiAgfVxuXG4gIF9jYWxjdWxhdGVTdGFydEluZGV4KGN1cnJlbnQpIHtcbiAgICBjb25zdCBmaXJzdEl0ZW1JbmRleCA9IHRoaXMuX2ZpcnN0SXRlbVJlbmRlcmVkKCk7XG4gICAgY29uc3QgbGFzdEl0ZW1JbmRleCA9IHRoaXMuX2xhc3RJdGVtUmVuZGVyZWQoKTtcblxuICAgIC8vIEZpeCBmb3IgU2FmYXJpIHNjcm9sbCBhbmQgQW5ndWxhciAyXG4gICAgdGhpcy5fcmVjYWxjdWxhdGVUb3BQb3NpdGlvbnMoZmlyc3RJdGVtSW5kZXgsIGxhc3RJdGVtSW5kZXgpO1xuXG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgZW5kID0gdGhpcy5fY291bnRJdGVtcygpIC0gMTtcblxuICAgIC8vIEJpbmFyeSBzZWFyY2ggZm9yIGluZGV4IGF0IHRvcCBvZiBzY3JlZW4gc28gd2UgY2FuIHNwZWVkIHVwIHJlbmRlcmluZy5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChzdGFydCArIGVuZCkgLyAyKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY3VycmVudCArIHRoaXMuX3RvcFBvc2l0aW9uc1ttaWRkbGVdO1xuXG4gICAgICBpZiAoZW5kIDwgc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDAgJiYgdmFsdWUgKyB0aGlzLl9nZXRJdGVtSGVpZ2h0KG1pZGRsZSkgPiAwKSB7XG4gICAgICAgIHJldHVybiBtaWRkbGU7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA+PSAwKSB7XG4gICAgICAgIGVuZCA9IG1pZGRsZSAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IG1pZGRsZSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2RlYm91bmNlKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICAgIGxldCB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICBpZiAoY2FsbE5vdykge1xuICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9LCB3YWl0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgX2RvdWJsZUZpcmVPblRvdWNoZW5kKCkge1xuICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIHRoaXMuX2RlYm91bmNlKHRoaXMuX3JlbmRlci5iaW5kKHRoaXMpLCAxMDApO1xuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHV0aWwuYmluZExpc3RlbmVycyh0aGlzLCBbJ19vbkNoYW5nZScsICdfZG91YmxlRmlyZU9uVG91Y2hlbmQnXSk7XG5cbiAgICBpZiAocGxhdGZvcm0uaXNJT1MoKSkge1xuICAgICAgdGhpcy5fYm91bmRPbkNoYW5nZSA9IHRoaXMuX2RlYm91bmNlKHRoaXMuX2JvdW5kT25DaGFuZ2UsIDMwKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wYWdlQ29udGVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCB0cnVlKTtcblxuICAgIGlmIChwbGF0Zm9ybS5pc0lPUygpKSB7XG4gICAgICB1dGlsLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fcGFnZUNvbnRlbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICB0aGlzLl9wYWdlQ29udGVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2JvdW5kRG91YmxlRmlyZU9uVG91Y2hlbmQsIHRydWUpO1xuICAgIH1cblxuICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCB0cnVlKTtcbiAgfVxuXG4gIF9yZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICB0aGlzLl9wYWdlQ29udGVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCB0cnVlKTtcblxuICAgIGlmIChwbGF0Zm9ybS5pc0lPUygpKSB7XG4gICAgICB1dGlsLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fcGFnZUNvbnRlbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICB0aGlzLl9wYWdlQ29udGVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2JvdW5kRG91YmxlRmlyZU9uVG91Y2hlbmQsIHRydWUpO1xuICAgIH1cblxuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCB0cnVlKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVtb3ZlQWxsRWxlbWVudHMoKTtcbiAgICB0aGlzLl9kZWxlZ2F0ZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fcGFyZW50RWxlbWVudCA9IHRoaXMuX2RlbGVnYXRlID0gdGhpcy5fcmVuZGVyZWRJdGVtcyA9IG51bGw7XG4gICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxufVxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCB7IExhenlSZXBlYXREZWxlZ2F0ZSwgTGF6eVJlcGVhdFByb3ZpZGVyIH0gZnJvbSAnLi4vb25zL2ludGVybmFsL2xhenktcmVwZWF0LmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtbGF6eS1yZXBlYXRcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFVzaW5nIHRoaXMgY29tcG9uZW50IGEgbGlzdCB3aXRoIG1pbGxpb25zIG9mIGl0ZW1zIGNhbiBiZSByZW5kZXJlZCB3aXRob3V0IGEgZHJvcCBpbiBwZXJmb3JtYW5jZS5cbiAqICAgICBJdCBkb2VzIHRoYXQgYnkgXCJsYXppbHlcIiBsb2FkaW5nIGVsZW1lbnRzIGludG8gdGhlIERPTSB3aGVuIHRoZXkgY29tZSBpbnRvIHZpZXcgYW5kXG4gKiAgICAgcmVtb3ZpbmcgaXRlbXMgZnJvbSB0aGUgRE9NIHdoZW4gdGhleSBhcmUgbm90IHZpc2libGUuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jlhoXjgafmj4/nlLvjgZXjgozjgovjgqLjgqTjg4bjg6Djga5ET03opoHntKDjga7oqq3jgb/ovrzjgb/jga/jgIHnlLvpnaLjgavopovjgYjjgZ3jgYbjgavjgarjgaPjgZ/mmYLjgb7jgafoh6rli5XnmoTjgavpgYXlu7bjgZXjgozjgIFcbiAqICAgICDnlLvpnaLjgYvjgonopovjgYjjgarjgY/jgarjgaPjgZ/loLTlkIjjgavjga/jgZ3jga7opoHntKDjga/li5XnmoTjgavjgqLjg7Pjg63jg7zjg4njgZXjgozjgb7jgZnjgIJcbiAqICAgICDjgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgpLkvb/jgYbjgZPjgajjgafjgIHjg5Hjg5Xjgqnjg7zjg57jg7PjgrnjgpLliqPljJbjgZXjgZvjgovjgZPjgajnhKHjgZfjgavlt6jlpKfjgarmlbDjga7opoHntKDjgpLmj4/nlLvjgafjgY3jgb7jgZnjgIJcbiAqICAgWy9qYV1cbiAqIEBjb2RlcGVuIFF3ckdCbVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2xhenktcmVwZWF0XG4gKiBAc2VlYWxzbyBvbnMtbGlzdFxuICogICBbZW5dVGhlIGA8b25zLWxpc3Q+YCBlbGVtZW50IGlzIHVzZWQgdG8gcmVuZGVyIGEgbGlzdC5bL2VuXVxuICogICBbamFdYDxvbnMtbGlzdD5g6KaB57Sg44Gv44Oq44K544OI44KS5o+P55S744GZ44KL44Gu44Gr5L2/44KP44KM44G+44GZ44CCWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8c2NyaXB0PlxuICogICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uKCkge1xuICogICAgIHZhciBsYXp5UmVwZWF0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpc3QnKTtcbiAqICAgICBsYXp5UmVwZWF0LmRlbGVnYXRlID0ge1xuICogICAgICBjcmVhdGVJdGVtQ29udGVudDogZnVuY3Rpb24oaSwgdGVtcGxhdGUpIHtcbiAqICAgICAgICB2YXIgZG9tID0gdGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpO1xuICogICAgICAgIGRvbS5pbm5lclRleHQgPSBpO1xuICpcbiAqICAgICAgICByZXR1cm4gZG9tO1xuICogICAgICB9LFxuICogICAgICBjb3VudEl0ZW1zOiBmdW5jdGlvbigpIHtcbiAqICAgICAgICByZXR1cm4gMTAwMDAwMDA7XG4gKiAgICAgIH0sXG4gKiAgICAgIGRlc3Ryb3lJdGVtOiBmdW5jdGlvbihpbmRleCwgaXRlbSkge1xuICogICAgICAgIGNvbnNvbGUubG9nKCdEZXN0cm95ZWQgaXRlbSB3aXRoIGluZGV4OiAnICsgaW5kZXgpO1xuICogICAgICB9XG4gKiAgICAgfTtcbiAqICAgfSk7XG4gKiA8L3NjcmlwdD5cbiAqXG4gKiA8b25zLWxpc3QgaWQ9XCJsaXN0XCI+XG4gKiAgIDxvbnMtbGF6eS1yZXBlYXQ+XG4gKiAgICAgPG9ucy1saXN0LWl0ZW0+PC9vbnMtbGlzdC1pdGVtPlxuICogICA8L29ucy1sYXp5LXJlcGVhdD5cbiAqIDwvb25zLWxpc3Q+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhenlSZXBlYXRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIC8vIG5vdCB2ZXJ5IGdvb2QgaWRlYSBhbmQgYWxzbyBub3QgZG9jdW1lbnRlZFxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGVsZWdhdGUnKSkge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHdpbmRvd1t0aGlzLmdldEF0dHJpYnV0ZSgnZGVsZWdhdGUnKV07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkZWxlZ2F0ZVxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IGEgZGVsZWdhdGUgb2JqZWN0IHRvIGxvYWQgYW5kIHVubG9hZCBpdGVtIGVsZW1lbnRzLlsvZW5dXG4gICAqICBbamFd6KaB57Sg44Gu44Ot44O844OJ44CB44Ki44Oz44Ot44O844OJ44Gq44Gp44Gu5Yem55CG44KS5aeU6K2y44GZ44KL44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkZWxlZ2F0ZS5jcmVhdGVJdGVtQ29udGVudFxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIGBIVE1MRWxlbWVudGAuXG4gICAqXG4gICAqICAgICBUbyBoZWxwIHJlbmRlcmluZyB0aGUgZWxlbWVudCwgdGhlIGN1cnJlbnQgaW5kZXggYW5kIGEgdGVtcGxhdGUgaXMgc3VwcGxpZWQgYXMgYXJndW1lbnRzLiBUaGUgdGVtcGxhdGUgaXMgdGhlIGluaXRpYWwgY29udGVudCBvZiB0aGUgYDxvbnMtbGF6eS1yZXBlYXQ+YCBlbGVtZW50LlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg44GT44Gu6Zai5pWw44GvYEhUTUxFbGVtZW50YOOCkui/lOOBl+OBpuOBj+OBoOOBleOBhOOAglxuICAgKiAgICAg6KaB57Sg44KS55Sf5oiQ44GX44KE44GZ44GP44GZ44KL44Gf44KB44Gr44CB54++5Zyo44Gu44Ki44Kk44OG44Og44Gu44Kk44Oz44OH44OD44Kv44K544Go44OG44Oz44OX44Os44O844OI44GM5byV5pWw44Gr5rih44GV44KM44G+44GZ44CCXG4gICAqICAgICDjgZPjga7jg4bjg7Pjg5fjg6zjg7zjg4jjga/jgIFgPG9ucy1sYXp5LXJlcGVhdD5g6KaB57Sg44Gu44Kz44Oz44OG44Oz44OE44GM5rih44GV44KM44G+44GZ44CCXG4gICAqICAgWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkZWxlZ2F0ZS5jb3VudEl0ZW1zXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC5bL2VuXVxuICAgKiAgIFtqYV3jg6rjgrnjg4jlhoXjga7jgqLjgqTjg4bjg6DmlbDjgpLov5TjgZfjgabjgY/jgaDjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRlbGVnYXRlLmNhbGN1bGF0ZUl0ZW1IZWlnaHRcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBTaG91bGQgcmV0dXJuIHRoZSBoZWlnaHQgb2YgYW4gaXRlbS4gVGhlIGluZGV4IGlzIHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50LlxuICAgKlxuICAgKiAgICAgVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiByZW5kZXJpbmcgbGlzdHMgd2hlcmUgdGhlIGl0ZW1zIGhhdmUgZGlmZmVyZW50IGhlaWdodC5cbiAgICpcbiAgICogICAgIFRoZSBmdW5jdGlvbiBpcyBvcHRpb25hbCBhbmQgaWYgaXQgaXNuJ3QgcHJlc2VudCB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCBpdGVtIHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGFuZCB1c2VkIGZvciBhbGwgb3RoZXIgaXRlbXMuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdXG4gICAqICAgICDjgqLjgqTjg4bjg6Djga7pq5jjgZUo44OU44Kv44K744OrKeOCkui/lOOBl+OBpuOBj+OBoOOBleOBhOOAguOCouOCpOODhuODoOOBruOCpOODs+ODh+ODg+OCr+OCueWApOOBr+W8leaVsOOBp+a4oeOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg44GT44Gu6Zai5pWw44Gv44CB44Gd44KM44Ge44KM44Gu44Ki44Kk44Og44GM6YGV44Gj44Gf6auY44GV44KS5oyB44Gk44Oq44K544OI44KS44Os44Oz44OA44Oq44Oz44Kw44GZ44KL6Zqb44Gr6YeN6KaB44Gn44GZ44CCXG4gICAqICAgICDjgZPjga7plqLmlbDjga/jgqrjg5fjgrfjg6fjg4rjg6vjgafjgZnjgILjgoLjgZfjgZPjga7plqLmlbDjgYznhKHjgYTloLTlkIjjgavjga/jgIFcbiAgICogICAgIOacgOWIneOBruOCouOCpOODhuODoOOBrumrmOOBleOBjOS7luOBruOBmeOBueOBpuOBruOCouOCpOODhuODoOOBrumrmOOBleOBqOOBl+OBpuWIqeeUqOOBleOCjOOBvuOBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGVsZWdhdGUuZGVzdHJveUl0ZW1cbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgY2FsbGVkIHdoZW4gYW4gaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4gVGhlIGluZGV4IGFuZCBET00gZWxlbWVudCBpcyBwcm92aWRlZCBhcyBhcmd1bWVudHMuXG4gICAqXG4gICAqICAgICBUaGUgZnVuY3Rpb24gaXMgb3B0aW9uYWwgYnV0IG1heSBiZSBpbXBvcnRhbnQgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg44GT44Gu6Zai5pWw44Gv44CB44GC44KL44Ki44Kk44OG44Og44GMRE9N44OE44Oq44O844GL44KJ6Zmk44GL44KM44Gf5pmC44Gr5ZG844Gz5Ye644GV44KM44G+44GZ44CCXG4gICAqICAgICDjgqLjgqTjg4bjg6Djga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKTjgahET03opoHntKDjgYzlvJXmlbDjgajjgZfjgabmuKHjgZXjgozjgb7jgZnjgIJcbiAgICogICAgIOOBk+OBrumWouaVsOOBr+OCquODl+OCt+ODp+ODiuODq+OBp+OBmeOBjOOAgeWQhOOCouOCpOODhuODoOOBruW+jOWHpueQhuOBjOW/heimgeOBquWgtOWQiOOBq+OBr+ODoeODouODquODvOODquODvOOCr+OCkumBv+OBkeOCi+OBn+OCgeOBq+mHjeimgeOBp+OBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIHNldCBkZWxlZ2F0ZSh1c2VyRGVsZWdhdGUpIHtcbiAgICB0aGlzLl9sYXp5UmVwZWF0UHJvdmlkZXIgJiYgdGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyLmRlc3Ryb3koKTtcblxuICAgIGlmICghdGhpcy5fdGVtcGxhdGVFbGVtZW50ICYmIHRoaXMuY2hpbGRyZW5bMF0pIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRWxlbWVudCA9IHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5jaGlsZHJlblswXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZWdhdGUgPSBuZXcgTGF6eVJlcGVhdERlbGVnYXRlKHVzZXJEZWxlZ2F0ZSwgdGhpcy5fdGVtcGxhdGVFbGVtZW50IHx8IG51bGwpO1xuICAgIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlciA9IG5ldyBMYXp5UmVwZWF0UHJvdmlkZXIodGhpcy5wYXJlbnRFbGVtZW50LCBkZWxlZ2F0ZSk7XG4gIH1cblxuICBnZXQgZGVsZWdhdGUoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICAgIHV0aWwudGhyb3coJ05vIGRlbGVnYXRlIGdldHRlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVmcmVzaFxuICAgKiBAc2lnbmF0dXJlIHJlZnJlc2goKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVmcmVzaCB0aGUgbGlzdC4gVXNlIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGRhdGEgaGFzIGNoYW5nZWQuWy9lbl1cbiAgICogICBbamFd44Oq44K544OI44KS5pu05paw44GX44G+44GZ44CC44KC44GX44OH44O844K/44GM5aSJ44KP44Gj44Gf5aC05ZCI44Gr44Gv44GT44Gu44Oh44K944OD44OJ44KS5L2/44Gj44Gm44GP44Gg44GV44GE44CCWy9qYV1cbiAgICovXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyICYmIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlci5yZWZyZXNoKCk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge31cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyKSB7XG4gICAgICB0aGlzLl9sYXp5UmVwZWF0UHJvdmlkZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxufVxuXG5pbnRlcm5hbC5MYXp5UmVwZWF0RGVsZWdhdGUgPSBMYXp5UmVwZWF0RGVsZWdhdGU7XG5pbnRlcm5hbC5MYXp5UmVwZWF0UHJvdmlkZXIgPSBMYXp5UmVwZWF0UHJvdmlkZXI7XG5cbm9uc0VsZW1lbnRzLkxhenlSZXBlYXQgPSBMYXp5UmVwZWF0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWxhenktcmVwZWF0JywgTGF6eVJlcGVhdEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbGlzdC1oZWFkZXInO1xuY29uc3Qgc2NoZW1lID0geycnOiAnbGlzdC1oZWFkZXItLSonfTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtbGlzdC1oZWFkZXJcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUhlYWRlciBlbGVtZW50IGZvciBsaXN0IGl0ZW1zLiBNdXN0IGJlIHB1dCBpbnNpZGUgdGhlIGA8b25zLWxpc3Q+YCBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXeODquOCueODiOimgee0oOOBq+S9v+eUqOOBmeOCi+ODmOODg+ODgOODvOeUqOOCs+ODs+ODneODvOODjeODs+ODiOOAgm9ucy1saXN044Go5YWx44Gr5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1saXN0XG4gKiAgIFtlbl1UaGUgYDxvbnMtbGlzdD5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbGlzdOOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGlzdC1pdGVtXG4gKiAgIFtlbl1UaGUgYDxvbnMtbGlzdC1pdGVtPmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN0LWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGNvZGVwZW4geXhjQ3RcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9saXN0XG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXURpc3BsYXkgYSBNYXRlcmlhbCBEZXNpZ24gbGlzdCBoZWFkZXIuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1saXN0PlxuICogICA8b25zLWxpc3QtaGVhZGVyPkhlYWRlciBUZXh0PC9vbnMtbGlzdC1oZWFkZXI+XG4gKiAgIDxvbnMtbGlzdC1pdGVtPkl0ZW08L29ucy1saXN0LWl0ZW0+XG4gKiAgIDxvbnMtbGlzdC1pdGVtPkl0ZW08L29ucy1saXN0LWl0ZW0+XG4gKiA8L29ucy1saXN0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0SGVhZGVyRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGxpc3QgaGVhZGVyLlsvZW5dXG4gICAqICAgW2phXeODmOODg+ODgOODvOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb21waWxlKCk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkxpc3RIZWFkZXIgPSBMaXN0SGVhZGVyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWxpc3QtaGVhZGVyJywgTGlzdEhlYWRlckVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbGlzdC10aXRsZSc7XG5jb25zdCBzY2hlbWUgPSB7Jyc6ICdsaXN0LXRpdGxlLS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3QtdGl0bGVcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJlcHJlc2VudHMgYSBsaXN0IHRpdGxlLlsvZW5dXG4gKiAgIFtqYV3jg6rjgrnjg4jjga7jgr/jgqTjg4jjg6vjgpLooajnj77jgZfjgb7jgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtbGlzdC10aXRsZT5MaXN0IFRpdGxlPC9vbnMtbGlzdC10aXRsZT5cbiAqIDxvbnMtbGlzdD5cbiAqICAgPG9ucy1saXN0LWl0ZW0+SXRlbTwvb25zLWxpc3QtaXRlbT5cbiAqIDwvb25zLWxpc3Q+XG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXURpc3BsYXkgYSBNYXRlcmlhbCBEZXNpZ24gbGlzdCB0aXRsZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0VGl0bGVFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb21waWxlKCk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkxpc3RUaXRsZSA9IExpc3RUaXRsZUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1saXN0LXRpdGxlJywgTGlzdFRpdGxlRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxOCBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgY2xhc3MgTGlzdEl0ZW1BbmltYXRvciBleHRlbmRzIEJhc2VBbmltYXRvciB7XG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICBzaG93RXhwYW5zaW9uKGxpc3RJdGVtLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBoaWRlRXhwYW5zaW9uKGxpc3RJdGVtLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNsaWRlTGlzdEl0ZW1BbmltYXRvciBleHRlbmRzIExpc3RJdGVtQW5pbWF0b3Ige1xuXG4gIHNob3dFeHBhbnNpb24obGlzdEl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fYW5pbWF0ZUV4cGFuc2lvbihsaXN0SXRlbSwgdHJ1ZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgaGlkZUV4cGFuc2lvbihsaXN0SXRlbSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9hbmltYXRlRXhwYW5zaW9uKGxpc3RJdGVtLCBmYWxzZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgX2FuaW1hdGVFeHBhbnNpb24obGlzdEl0ZW0sIHNob3VsZE9wZW4sIGNhbGxiYWNrKSB7XG4gICAgLy8gVG8gYW5pbWF0ZSB0aGUgb3BlbmluZyBvZiB0aGUgZXhwYW5zaW9uIHBhbmVsIGNvcnJlY3RseSwgd2UgbmVlZCB0byBrbm93IGl0c1xuICAgIC8vIGhlaWdodC4gVG8gY2FsY3VsYXRlIHRoaXMsIHdlIHNldCBpdHMgaGVpZ2h0IHRvIGF1dG8sIGFuZCB0aGVuIGdldCB0aGUgY29tcHV0ZWRcbiAgICAvLyBoZWlnaHQgYW5kIHBhZGRpbmcuIE9uY2UgdGhpcyBpcyBkb25lLCB3ZSBzZXQgdGhlIGhlaWdodCBiYWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS5cbiAgICBjb25zdCBvbGRIZWlnaHQgPSBsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudC5zdHlsZS5oZWlnaHQ7XG4gICAgY29uc3Qgb2xkRGlzcGxheSA9IGxpc3RJdGVtLmV4cGFuZGFibGVDb250ZW50LnN0eWxlLmRpc3BsYXk7XG4gICAgbGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIGxpc3RJdGVtLmV4cGFuZGFibGVDb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudCk7XG5cbiAgICBjb25zdCBleHBhbnNpb25PcGVuVHJhbnNpdGlvbiA9IFtcbiAgICAgIHsgaGVpZ2h0OiAwLCBwYWRkaW5nVG9wOiAwLCBwYWRkaW5nQm90dG9tOiAwIH0sXG4gICAgICB7XG4gICAgICAgIGhlaWdodDogY29tcHV0ZWRTdHlsZS5oZWlnaHQsXG4gICAgICAgIHBhZGRpbmdUb3A6IGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tLFxuICAgICAgfVxuICAgIF07XG4gICAgY29uc3QgaWNvbk9wZW5UcmFuc2l0aW9uID0gW3t0cmFuc2Zvcm06ICdyb3RhdGUoNDVkZWcpJ30sIHt0cmFuc2Zvcm06ICdyb3RhdGUoMjI1ZGVnKSd9XTtcblxuICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHZhbHVlcyB3ZSBuZWVkLCByZXNldCB0aGUgaGVpZ2h0IGJhY2sgdG8gaXRzIG9yaWdpbmFsIHN0YXRlXG4gICAgbGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQuc3R5bGUuaGVpZ2h0ID0gb2xkSGVpZ2h0O1xuXG4gICAgYW5pbWl0KGxpc3RJdGVtLmV4cGFuZGFibGVDb250ZW50LCB7IGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLCBwcm9wZXJ0eTogJ2hlaWdodCBwYWRkaW5nLXRvcCBwYWRkaW5nLWJvdHRvbScgfSlcbiAgICAgIC5kZWZhdWx0KC4uLihzaG91bGRPcGVuID8gZXhwYW5zaW9uT3BlblRyYW5zaXRpb24gOiBleHBhbnNpb25PcGVuVHJhbnNpdGlvbi5yZXZlcnNlKCkpKVxuICAgICAgLnBsYXkoKCkgPT4ge1xuICAgICAgICBsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudC5zdHlsZS5kaXNwbGF5ID0gb2xkRGlzcGxheTtcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGxpc3RJdGVtLmV4cGFuZENoZXZyb24pIHtcbiAgICAgIGFuaW1pdChsaXN0SXRlbS5leHBhbmRDaGV2cm9uLCB7IGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLCBwcm9wZXJ0eTogJ3RyYW5zZm9ybScgfSlcbiAgICAgICAgLmRlZmF1bHQoLi4uKHNob3VsZE9wZW4gPyBpY29uT3BlblRyYW5zaXRpb24gOiBpY29uT3BlblRyYW5zaXRpb24ucmV2ZXJzZSgpKSlcbiAgICAgICAgLnBsYXkoKTtcbiAgICB9XG4gIH1cblxufSIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBzdHlsZXIgZnJvbSAnLi4vb25zL3N0eWxlci5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCB7IExpc3RJdGVtQW5pbWF0b3IsIFNsaWRlTGlzdEl0ZW1BbmltYXRvciB9IGZyb20gJy4vb25zLWxpc3QtaXRlbS9hbmltYXRvci5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdsaXN0LWl0ZW0nO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnLmxpc3QtaXRlbSc6ICdsaXN0LWl0ZW0tLSonLFxuICAnLmxpc3QtaXRlbV9fbGVmdCc6ICdsaXN0LWl0ZW0tLSpfX2xlZnQnLFxuICAnLmxpc3QtaXRlbV9fY2VudGVyJzogJ2xpc3QtaXRlbS0tKl9fY2VudGVyJyxcbiAgJy5saXN0LWl0ZW1fX3JpZ2h0JzogJ2xpc3QtaXRlbS0tKl9fcmlnaHQnLFxuICAnLmxpc3QtaXRlbV9fbGFiZWwnOiAnbGlzdC1pdGVtLS0qX19sYWJlbCcsXG4gICcubGlzdC1pdGVtX190aXRsZSc6ICdsaXN0LWl0ZW0tLSpfX3RpdGxlJyxcbiAgJy5saXN0LWl0ZW1fX3N1YnRpdGxlJzogJ2xpc3QtaXRlbS0tKl9fc3VidGl0bGUnLFxuICAnLmxpc3QtaXRlbV9fdGh1bWJuYWlsJzogJ2xpc3QtaXRlbS0tKl9fdGh1bWJuYWlsJyxcbiAgJy5saXN0LWl0ZW1fX2ljb24nOiAnbGlzdC1pdGVtLS0qX19pY29uJ1xufTtcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgJ2RlZmF1bHQnOiBTbGlkZUxpc3RJdGVtQW5pbWF0b3IsXG4gICdub25lJzogTGlzdEl0ZW1BbmltYXRvclxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtbGlzdC1pdGVtXG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQG1vZGlmaWVyIHRhcHBhYmxlXG4gKiAgIFtlbl1NYWtlIHRoZSBsaXN0IGl0ZW0gY2hhbmdlIGFwcGVhcmFuY2Ugd2hlbiBpdCdzIHRhcHBlZC4gT24gaU9TIGl0IGlzIGJldHRlciB0byB1c2UgdGhlIFwidGFwcGFibGVcIiBhbmQgXCJ0YXAtYmFja2dyb3VuZC1jb2xvclwiIGF0dHJpYnV0ZSBmb3IgYmV0dGVyIGJlaGF2aW9yIHdoZW4gc2Nyb2xsaW5nLlsvZW5dXG4gKiAgIFtqYV3jgr/jg4Pjg5fjgoTjgq/jg6rjg4Pjgq/jgZfjgZ/mmYLjgavlirnmnpzjgYzooajnpLrjgZXjgozjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIGNoZXZyb25cbiAqICAgW2VuXURpc3BsYXkgYSBjaGV2cm9uIGF0IHRoZSByaWdodCBlbmQgb2YgdGhlIGxpc3QgaXRlbSBhbmQgbWFrZSBpdCBjaGFuZ2UgYXBwZWFyYW5jZSB3aGVuIHRhcHBlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciBsb25nZGl2aWRlclxuICogICBbZW5dRGlzcGxheXMgYSBsb25nIGhvcml6b250YWwgZGl2aWRlciBiZXR3ZWVuIGl0ZW1zLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIG5vZGl2aWRlclxuICogICBbZW5dUmVtb3ZlcyB0aGUgZGl2aWRlciBiZXR3ZWVuIGxpc3QgaXRlbXMuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXURpc3BsYXkgYSBNYXRlcmlhbCBEZXNpZ24gbGlzdCBpdGVtLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDb21wb25lbnQgdGhhdCByZXByZXNlbnRzIGVhY2ggaXRlbSBpbiBhIGxpc3QuIFRoZSBsaXN0IGl0ZW0gaXMgY29tcG9zZWQgb2YgZm91ciBwYXJ0cyB0aGF0IGFyZSByZXByZXNlbnRlZCB3aXRoIHRoZSBgbGVmdGAsIGBjZW50ZXJgLCBgcmlnaHRgIGFuZCBgZXhwYW5kYWJsZS1jb250ZW50YCBjbGFzc2VzLiBUaGVzZSBjbGFzc2VzIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBsaXN0IGl0ZW1zIGlzIHByb3Blcmx5IGFsaWduZWQuXG4gKlxuICogICAgIGBgYFxuICogICAgIDxvbnMtbGlzdC1pdGVtPlxuICogICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5MZWZ0PC9kaXY+XG4gKiAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+Q2VudGVyPC9kaXY+XG4gKiAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5SaWdodDwvZGl2PlxuICogICAgICAgPGRpdiBjbGFzcz1cImV4cGFuZGFibGUtY29udGVudFwiPkV4cGFuZGFibGUgY29udGVudDwvZGl2PlxuICogICAgIDwvb25zLWxpc3QtaXRlbT5cbiAqICAgICBgYGBcbiAqXG4gKiAgICAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgY2xhc3NlcyAocHJlZml4ZWQgd2l0aCBgbGlzdC1pdGVtX18qYCkgdGhhdCBoZWxwIHdoZW4gcHV0dGluZyB0aGluZ3MgbGlrZSBpY29ucyBhbmQgdGh1bWJuYWlscyBpbnRvIHRoZSBsaXN0IGl0ZW1zLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1saXN0XG4gKiAgIFtlbl1vbnMtbGlzdCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWxpc3TjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWxpc3QtaGVhZGVyXG4gKiAgIFtlbl1vbnMtbGlzdC1oZWFkZXIgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN0LWhlYWRlcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAY29kZXBlbiB5eGNDdFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2xpc3RcbiAqIEBleGFtcGxlXG4gKiA8b25zLWxpc3QtaXRlbT5cbiAqICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAqICAgICA8b25zLWljb24gaWNvbj1cIm1kLWZhY2VcIiBjbGFzcz1cImxpc3QtaXRlbV9faWNvblwiPjwvb25zLWljb24+XG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gKiAgICAgPGRpdiBjbGFzcz1cImxpc3QtaXRlbV9fdGl0bGVcIj5UaXRsZTwvZGl2PlxuICogICAgIDxkaXYgY2xhc3M9XCJsaXN0LWl0ZW1fX3N1YnRpdGxlXCI+U3VidGl0bGU8L2Rpdj5cbiAqICAgPC9kaXY+XG4gKiAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICogICAgIDxvbnMtc3dpdGNoPjwvb25zLXN3aXRjaD5cbiAqICAgPC9kaXY+XG4gKiA8L29ucy1saXN0LWl0ZW0+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpc3RJdGVtRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGxpc3QgaXRlbS5bL2VuXVxuICAgKiAgIFtqYV3lkITopoHntKDjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBsb2NrLW9uLWRyYWdcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1QcmV2ZW50IHZlcnRpY2FsIHNjcm9sbGluZyB3aGVuIHRoZSB1c2VyIGRyYWdzIGhvcml6b250YWxseS5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIHjg6bjg7zjgrbjg7zjgYzjgZPjga7opoHntKDjgpLmqKrmlrnlkJHjgavjg4njg6njg4PjgrDjgZfjgabjgYTjgovmmYLjgavjgIHnuKbmlrnlkJHjga7jgrnjgq/jg63jg7zjg6vjgYzotbfjgY3jgarjgYTjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGxvY2tPbkRyYWdcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1QcmV2ZW50IHZlcnRpY2FsIHNjcm9sbGluZyB3aGVuIHRoZSB1c2VyIGRyYWdzIGhvcml6b250YWxseS5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIHjg6bjg7zjgrbjg7zjgYzjgZPjga7opoHntKDjgpLmqKrmlrnlkJHjgavjg4njg6njg4PjgrDjgZfjgabjgYTjgovmmYLjgavjgIHnuKbmlrnlkJHjga7jgrnjgq/jg63jg7zjg6vjgYzotbfjgY3jgarjgYTjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB0YXBwYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU1ha2VzIHRoZSBlbGVtZW50IHJlYWN0IHRvIHRhcHMuIGBwcmV2ZW50LXRhcGAgYXR0cmlidXRlIGNhbiBiZSBhZGRlZCB0byBjaGlsZCBlbGVtZW50cyBsaWtlIGJ1dHRvbnMgb3IgaW5wdXRzIHRvIHByZXZlbnQgdGhpcyBlZmZlY3QuIGBvbnMtKmAgZWxlbWVudHMgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHRhcHBhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTWFrZXMgdGhlIGVsZW1lbnQgcmVhY3QgdG8gdGFwcy4gYHByZXZlbnQtdGFwYCBhdHRyaWJ1dGUgY2FuIGJlIGFkZGVkIHRvIGNoaWxkIGVsZW1lbnRzIGxpa2UgYnV0dG9ucyBvciBpbnB1dHMgdG8gcHJldmVudCB0aGlzIGVmZmVjdC4gYG9ucy0qYCBlbGVtZW50cyBhcmUgaWdub3JlZCBieSBkZWZhdWx0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHRhcC1iYWNrZ3JvdW5kLWNvbG9yXG4gICAqIEB0eXBlIHtDb2xvcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXSBDaGFuZ2VzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHdoZW4gdGFwcGVkLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgYXR0cmlidXRlIFwidGFwcGFibGVcIiBuZWVkcyB0byBiZSBzZXQuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIFwiI2Q5ZDlkOVwiLiBJdCB3aWxsIGRpc3BsYXkgYXMgYSByaXBwbGUgZWZmZWN0IG9uIEFuZHJvaWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB0YXBCYWNrZ3JvdW5kQ29sb3JcbiAgICogQHR5cGUge0NvbG9yfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dIENoYW5nZXMgdGhlIGJhY2tncm91bmQgY29sb3Igd2hlbiB0YXBwZWQuIEZvciB0aGlzIHRvIHdvcmssIHRoZSBhdHRyaWJ1dGUgXCJ0YXBwYWJsZVwiIG5lZWRzIHRvIGJlIHNldC4gVGhlIGRlZmF1bHQgY29sb3IgaXMgXCIjZDlkOWQ5XCIuIEl0IHdpbGwgZGlzcGxheSBhcyBhIHJpcHBsZSBlZmZlY3Qgb24gQW5kcm9pZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBrZWVwLXRhcC1iYWNrZ3JvdW5kLWNvbG9yXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl0gUHJldmVudCBmcm9tIGNsZWFyaW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9uIGBcInRvdWNobW92ZVwiYCwgYFwidG91Y2hjYW5jZWxcImAsIGBcInRvdWNoZW5kXCJgLCBgXCJ0b3VjaGxlYXZlXCJgLCBgXCJtb3VzZXVwXCJgLCBhbmQgYFwibW91c2VvdXRcImAuIEZvciB0aGlzIHRvIHdvcmssIHRoZSBhdHRyaWJ1dGUgXCJ0YXBwYWJsZVwiIG5lZWRzIHRvIGJlIHNldC5bL2VuXVxuICAgKiAgW2phXSDjgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIFgXCJ0b3VjaG1vdmVcImAsIGBcInRvdWNoY2FuY2VsXCJgLCBgXCJ0b3VjaGVuZFwiYCwgYFwidG91Y2hsZWF2ZVwiYCwgYFwibW91c2V1cFwiYCwgYW5kIGBcIm1vdXNlb3V0XCJgIOOCpOODmeODs+ODiOaZguOBq+iDjOaZr+iJsuOBjOOCr+ODquOCouOBleOCjOOBquOBhOOCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkga2VlcFRhcEJhY2tncm91bmRDb2xvclxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXSBQcmV2ZW50IGZyb20gY2xlYXJpbmcgdGhlIGJhY2tncm91bmQgY29sb3Igb24gYFwidG91Y2htb3ZlXCJgLCBgXCJ0b3VjaGNhbmNlbFwiYCwgYFwidG91Y2hlbmRcImAsIGBcInRvdWNobGVhdmVcImAsIGBcIm1vdXNldXBcImAsIGFuZCBgXCJtb3VzZW91dFwiYC4gRm9yIHRoaXMgdG8gd29yaywgdGhlIGF0dHJpYnV0ZSBcInRhcHBhYmxlXCIgbmVlZHMgdG8gYmUgc2V0LlsvZW5dXG4gICAqICAgW2phXSDjgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIFgXCJ0b3VjaG1vdmVcImAsIGBcInRvdWNoY2FuY2VsXCJgLCBgXCJ0b3VjaGVuZFwiYCwgYFwidG91Y2hsZWF2ZVwiYCwgYFwibW91c2V1cFwiYCwgYW5kIGBcIm1vdXNlb3V0XCJgIOOCpOODmeODs+ODiOaZguOBq+iDjOaZr+iJsuOBjOOCr+ODquOCouOBleOCjOOBquOBhOOCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGV4cGFuZGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1NYWtlcyB0aGUgZWxlbWVudCBhYmxlIHRvIGJlIGV4cGFuZGVkIHRvIHJldmVhbCBleHRyYSBjb250ZW50LiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgZXhwYW5kYWJsZSBjb250ZW50IG11c3QgYmUgZGVmaW5lZCBpbiBgZGl2LmV4cGFuZGFibGUtY29udGVudGAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBleHBhbmRhYmxlXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU1ha2VzIHRoZSBlbGVtZW50IGFibGUgdG8gYmUgZXhwYW5kZWQgdG8gcmV2ZWFsIGV4dHJhIGNvbnRlbnQuIEZvciB0aGlzIHRvIHdvcmssIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgbXVzdCBiZSBkZWZpbmVkIGluIGBkaXYuZXhwYW5kYWJsZS1jb250ZW50YC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBleHBhbmRlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZvciBleHBhbmRhYmxlIGxpc3QgaXRlbXMsIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgaXMgZXhwYW5kZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZXhwYW5kZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Gb3IgZXhwYW5kYWJsZSBsaXN0IGl0ZW1zLCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZXhwYW5kYWJsZSBjb250ZW50IGlzIGV4cGFuZGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IGV4cGFuZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9yIGV4cGFuZGFibGUgbGlzdCBpdGVtcywgZmlyZXMgd2hlbiB0aGUgbGlzdCBpdGVtIGlzIGV4cGFuZGVkIG9yIGNvbnRyYWN0ZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IGRlZmF1bHRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gc2hvd2luZyBhbmQgaGlkaW5nIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQuIENhbiBiZSBlaXRoZXIgYFwiZGVmYXVsdFwiYCBvciBgXCJub25lXCJgLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIGV4cGFuZGFibGUgY29udGVudC4gQ2FuIGJlIGVpdGhlciBgXCJkZWZhdWx0XCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gdGhpcy5fdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCk7XG5cbiAgICAvLyBFbGVtZW50cyBpZ25vcmVkIHdoZW4gdGFwcGluZ1xuICAgIGNvbnN0IHJlID0gL15vbnMtKD8hY29sJHxyb3ckfGlmJCkvaTtcbiAgICB0aGlzLl9zaG91bGRJZ25vcmVUYXAgPSBlID0+IGUuaGFzQXR0cmlidXRlKCdwcmV2ZW50LXRhcCcpIHx8IHJlLnRlc3QoZS50YWdOYW1lKTtcblxuICAgIC8vIHNob3cgYW5kIGhpZGUgZnVuY3Rpb25zIGZvciBWdWUgaGlkYWJsZSBtaXhpblxuICAgIHRoaXMuc2hvdyA9IHRoaXMuc2hvd0V4cGFuc2lvbjtcbiAgICB0aGlzLmhpZGUgPSB0aGlzLmhpZGVFeHBhbnNpb247XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIHRoZSBsaXN0IGl0ZW0uXG4gICAqXG4gICAqIFZhcmlvdXMgZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gdGhlIGJvZHkgb2YgYSBsaXN0IGl0ZW06XG4gICAqXG4gICAqICAtIGRpdi5sZWZ0LCBkaXYucmlnaHQsIGFuZCBkaXYuY2VudGVyIGFyZSBhbGxvd2VkIGFzIGRpcmVjdCBjaGlsZHJlblxuICAgKiAgLSBpZiBkaXYuY2VudGVyIGlzIG5vdCBkZWZpbmVkLCBhbnl0aGluZyB0aGF0IGlzbid0IGRpdi5sZWZ0LCBkaXYucmlnaHQgb3IgZGl2LmV4cGFuZGFibGUtY29udGVudCB3aWxsIGJlIHB1dCBpbiBhIGRpdi5jZW50ZXJcbiAgICogIC0gaWYgZGl2LmNlbnRlciBpcyBkZWZpbmVkLCBhbnl0aGluZyB0aGF0IGlzbid0IGRpdi5sZWZ0LCBkaXYucmlnaHQgb3IgZGl2LmV4cGFuZGFibGUtY29udGVudCB3aWxsIGJlIGlnbm9yZWRcbiAgICogIC0gaWYgbGlzdCBpdGVtIGhhcyBleHBhbmRhYmxlIGF0dHJpYnV0ZTpcbiAgICogICAgICAtIGRpdi5leHBhbmRhYmxlLWNvbnRlbnQgaXMgYWxsb3dlZCBhcyBhIGRpcmVjdCBjaGlsZFxuICAgKiAgICAgIC0gZGl2LnRvcCBpcyBhbGxvd2VkIGFzIGRpcmVjdCBjaGlsZFxuICAgKiAgICAgIC0gaWYgZGl2LnRvcCBpcyBkZWZpbmVkLCBhbnl0aGluZyB0aGF0IGlzbid0IGRpdi5leHBhbmRhYmxlLWNvbnRlbnQgc2hvdWxkIGJlIGluc2lkZSBkaXYudG9wIC0gYW55dGhpbmcgZWxzZSB3aWxsIGJlIGlnbm9yZWRcbiAgICogICAgICAtIGlmIGRpdi5yaWdodCBpcyBub3QgZGVmaW5lZCwgYSBkaXYucmlnaHQgd2lsbCBiZSBjcmVhdGVkIHdpdGggYSBkcm9wLWRvd24gY2hldnJvblxuICAgKlxuICAgKiBTZWUgdGhlIHRlc3RzIGZvciBleGFtcGxlcy5cbiAgICovXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIGxldCB0b3AsIGV4cGFuZGFibGVDb250ZW50O1xuICAgIGxldCB0b3BDb250ZW50ID0gW107XG4gICAgQXJyYXkuZnJvbSh0aGlzLmNoaWxkTm9kZXMpLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgdG9wQ29udGVudC5wdXNoKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygndG9wJykpIHtcbiAgICAgICAgdG9wID0gbm9kZTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2V4cGFuZGFibGUtY29udGVudCcpKSB7XG4gICAgICAgIGV4cGFuZGFibGVDb250ZW50ID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcENvbnRlbnQucHVzaChub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUubm9kZU5hbWUgIT09ICdPTlMtUklQUExFJykge1xuICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRvcENvbnRlbnQgPSB0b3AgPyBBcnJheS5mcm9tKHRvcC5jaGlsZE5vZGVzKSA6IHRvcENvbnRlbnQ7XG5cbiAgICBsZXQgbGVmdCwgcmlnaHQsIGNlbnRlcjtcbiAgICBjb25zdCBjZW50ZXJDb250ZW50ID0gW107XG4gICAgdG9wQ29udGVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGNlbnRlckNvbnRlbnQucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2xlZnQnKSkge1xuICAgICAgICBsZWZ0ID0gbm9kZTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ3JpZ2h0JykpIHtcbiAgICAgICAgcmlnaHQgPSBub2RlO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygnY2VudGVyJykpIHtcbiAgICAgICAgY2VudGVyID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNlbnRlckNvbnRlbnQucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZXhwYW5kYWJsZScpKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbS0tZXhwYW5kYWJsZScpO1xuXG4gICAgICBpZiAoIXRvcCkge1xuICAgICAgICB0b3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdG9wLmNsYXNzTGlzdC5hZGQoJ3RvcCcpO1xuICAgICAgfVxuICAgICAgdG9wLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fdG9wJyk7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRvcCk7XG4gICAgICB0aGlzLl90b3AgPSB0b3A7XG5cbiAgICAgIGlmIChleHBhbmRhYmxlQ29udGVudCkge1xuICAgICAgICBleHBhbmRhYmxlQ29udGVudC5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW1fX2V4cGFuZGFibGUtY29udGVudCcpO1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGV4cGFuZGFibGVDb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyaWdodCkge1xuICAgICAgICByaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByaWdodC5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW1fX3JpZ2h0JywgJ3JpZ2h0Jyk7XG5cbiAgICAgICAgLy8gV2UgY2Fubm90IHVzZSBhIHBzZXVkby1lbGVtZW50IGZvciB0aGlzIGNoZXZyb24sIGFzIHdlIGNhbm5vdCBhbmltYXRlIGl0IHVzaW5nXG4gICAgICAgIC8vIEpTLiBTbywgd2UgbWFrZSBhIGNoZXZyb24gc3BhbiBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBjaGV2cm9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBjaGV2cm9uLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fZXhwYW5kLWNoZXZyb24nKTtcbiAgICAgICAgcmlnaHQuYXBwZW5kQ2hpbGQoY2hldnJvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjYXNlIHdoZXJlIHRoZSBsaXN0IGl0ZW0gc2hvdWxkIGFscmVhZHkgc3RhcnQgZXhwYW5kZWQuXG4gICAgICAvLyBBZGRpbmcgdGhlIGNsYXNzIGVhcmx5IHN0b3BzIHRoZSBhbmltYXRpb24gZnJvbSBydW5uaW5nIGF0IHN0YXJ0dXAuXG4gICAgICBpZiAodGhpcy5leHBhbmRlZCkge1xuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbS0tZXhwYW5kZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdG9wID0gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoIWNlbnRlcikge1xuICAgICAgY2VudGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjZW50ZXIuY2xhc3NMaXN0LmFkZCgnY2VudGVyJyk7XG4gICAgICBjZW50ZXJDb250ZW50LmZvckVhY2gobm9kZSA9PiBjZW50ZXIuYXBwZW5kQ2hpbGQobm9kZSkpO1xuICAgIH1cbiAgICBjZW50ZXIuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX19jZW50ZXInKTtcbiAgICB0b3AuYXBwZW5kQ2hpbGQoY2VudGVyKTtcblxuICAgIGlmIChsZWZ0KSB7XG4gICAgICBsZWZ0LmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fbGVmdCcpO1xuICAgICAgdG9wLmFwcGVuZENoaWxkKGxlZnQpO1xuICAgIH1cbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIHJpZ2h0LmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fcmlnaHQnKTtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZChyaWdodCk7XG4gICAgfVxuXG4gICAgdXRpbC51cGRhdGVSaXBwbGUodGhpcyk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd0V4cGFuc2lvblxuICAgKiBAc2lnbmF0dXJlIHNob3dFeHBhbnNpb24oKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2hvdyB0aGUgZXhwYW5kYWJsZSBjb250ZW50IGlmIHRoZSBlbGVtZW50IGlzIGV4cGFuZGFibGUuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNob3dFeHBhbnNpb24oKSB7XG4gICAgdGhpcy5leHBhbmRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlRXhwYW5zaW9uXG4gICAqIEBzaWduYXR1cmUgaGlkZUV4cGFuc2lvbigpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1IaWRlIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgaWYgdGhlIGVsZW1lbnQgZXhwYW5kYWJsZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgaGlkZUV4cGFuc2lvbigpIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVFeHBhbnNpb24oKSB7XG4gICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY2xlYXJUYXBCYWNrZ3JvdW5kQ29sb3JcbiAgICogQHNpZ25hdHVyZSBjbGVhclRhcEJhY2tncm91bmRDb2xvcigpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DbGVhciBiYWNrZ3JvdW5kQ29sb3IgY2hhbmdlZCBvbiB0YXAgb3IgY2xpY2suIFRoaXMgbWV0aG9kIGlzIGhlbHBmdWwgd2hlbiBga2VlcC10YXAtYmFja2dyb3VuZC1jb2xvcmAgaXMgYHRydWVgLiBbL2VuXVxuICAgKiAgIFtqYV3jgr/jg4Pjg5fjgoTjgq/jg6rjg4Pjgq/jgZfjgZ/mmYLjgavlirnmnpzjgYzooajnpLrjgZXjgozjgovjgojjgYbjgavjgarjgorjgb7jgZnjgILjgZPjga7jg6Hjgr3jg4Pjg4njga8gYGtlZXAtdGFwLWJhY2tncm91bmQtY29sb3JgIOOBjCBgdHJ1ZWAg44Gu44Go44GN44Gr5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGNsZWFyVGFwQmFja2dyb3VuZENvbG9yKCkge1xuICAgIHRoaXMuX2NsZWFyVGFwQmFja2dyb3VuZENvbG9yKCk7XG4gIH1cblxuICBfYW5pbWF0ZUV4cGFuc2lvbigpIHtcbiAgICAvLyBTdG9wcyB0aGUgYW5pbWF0aW9uIGZyb20gcnVubmluZyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgbGlzdCBpdGVtIHNob3VsZCBzdGFydCBhbHJlYWR5IGV4cGFuZGVkXG4gICAgY29uc3QgZXhwYW5kZWRBdFN0YXJ0dXAgPSB0aGlzLmV4cGFuZGVkICYmIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaXN0LWl0ZW0tLWV4cGFuZGVkJyk7XG5cbiAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdleHBhbmRhYmxlJykgfHwgdGhpcy5fZXhwYW5kaW5nIHx8IGV4cGFuZGVkQXRTdGFydHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZXhwYW5kaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGV4cGFuZGVkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9leHBhbmRpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0tLWV4cGFuZGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2xpc3QtaXRlbS0tZXhwYW5kZWQnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3IoKTtcblxuICAgIGlmIChhbmltYXRvci5fYW5pbWF0ZUV4cGFuc2lvbikge1xuICAgICAgYW5pbWF0b3IuX2FuaW1hdGVFeHBhbnNpb24odGhpcywgdGhpcy5leHBhbmRlZCwgZXhwYW5kZWRDYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGFuZGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogTGlzdEl0ZW1BbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdMaXN0SXRlbUFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSB8fCAnZGVmYXVsdCdcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJywgJ3JpcHBsZScsICdhbmltYXRpb24nLCAnZXhwYW5kZWQnXTtcbiAgfVxuXG4gIGdldCBleHBhbmRhYmxlQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcubGlzdC1pdGVtX19leHBhbmRhYmxlLWNvbnRlbnQnKTtcbiAgfVxuXG4gIGdldCBleHBhbmRDaGV2cm9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5saXN0LWl0ZW1fX2V4cGFuZC1jaGV2cm9uJyk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlwcGxlJzpcbiAgICAgICAgdXRpbC51cGRhdGVSaXBwbGUodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gdGhpcy5fdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXhwYW5kZWQnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fYW5pbWF0ZUV4cGFuc2lvbigpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKHRydWUpO1xuICAgICAgdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIHRoaXMudGFwcGVkID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyhmYWxzZSk7XG4gIH1cblxuICBfc2V0dXBMaXN0ZW5lcnMoYWRkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gKGFkZCA/ICdhZGQnIDogJ3JlbW92ZScpICsgJ0V2ZW50TGlzdGVuZXInO1xuICAgIHV0aWxbYWN0aW9uXSh0aGlzLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2gsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB1dGlsW2FjdGlvbl0odGhpcywgJ3RvdWNobW92ZScsIHRoaXMuX29uUmVsZWFzZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hjYW5jZWwnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hlbmQnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hsZWF2ZScsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgdGhpc1thY3Rpb25dKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICB0aGlzW2FjdGlvbl0oJ21vdXNlZG93bicsIHRoaXMuX29uVG91Y2gpO1xuICAgIHRoaXNbYWN0aW9uXSgnbW91c2V1cCcsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgdGhpc1thY3Rpb25dKCdtb3VzZW91dCcsIHRoaXMuX29uUmVsZWFzZSk7XG5cbiAgICBpZiAodGhpcy5fdG9wKSB7XG4gICAgICB0aGlzLl90b3BbYWN0aW9uXSgnY2xpY2snLCB0aGlzLl9vbkNsaWNrVG9wLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNsaWNrVG9wKCkge1xuICAgIGlmICghdGhpcy5fZXhwYW5kaW5nKSB7XG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuc2lvbigpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXhwYW5kJykpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXhwYW5zaW9uJykpOyAvLyBleHBhbnNpb24gaXMgZGVwcmVjYXRlZCBidXQgZW1pdCB0byBhdm9pZCBicmVha2luZyB1c2VyIGNvZGVcbiAgICB9XG4gIH1cblxuICBfb25EcmFnKGV2ZW50KSB7XG4gICAgY29uc3QgZ2VzdHVyZSA9IGV2ZW50Lmdlc3R1cmU7XG4gICAgLy8gUHJldmVudCB2ZXJ0aWNhbCBzY3JvbGxpbmcgaWYgdGhlIHVzZXJzIHBhbnMgbGVmdCBvciByaWdodC5cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2xvY2stb24tZHJhZycpICYmIFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YoZ2VzdHVyZS5kaXJlY3Rpb24pID4gLTEpIHtcbiAgICAgIGdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBfb25Ub3VjaChlKSB7XG4gICAgaWYgKHRoaXMudGFwcGVkIHx8XG4gICAgICAodGhpcyAhPT0gZS50YXJnZXQgJiYgKHRoaXMuX3Nob3VsZElnbm9yZVRhcChlLnRhcmdldCkgfHwgdXRpbC5maW5kUGFyZW50KGUudGFyZ2V0LCB0aGlzLl9zaG91bGRJZ25vcmVUYXAsIHAgPT4gcCA9PT0gdGhpcykpKVxuICAgICkge1xuICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgdGFwXG4gICAgfVxuXG4gICAgdGhpcy50YXBwZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRvdWNoU3R5bGUgPSB7IHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kLWNvbG9yIDAuMHMgbGluZWFyIDAuMDJzLCBib3gtc2hhZG93IDAuMHMgbGluZWFyIDAuMDJzJyB9O1xuXG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCd0YXBwYWJsZScpKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIH1cblxuICAgICAgdG91Y2hTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGFwLWJhY2tncm91bmQtY29sb3InKSB8fCAnI2Q5ZDlkOSc7XG4gICAgICB0b3VjaFN0eWxlLmJveFNoYWRvdyA9IGAwcHggLTFweCAwcHggMHB4ICR7dG91Y2hTdHlsZS5iYWNrZ3JvdW5kQ29sb3J9YDtcbiAgICB9XG5cbiAgICBzdHlsZXIodGhpcywgdG91Y2hTdHlsZSk7XG4gIH1cblxuICBfb25SZWxlYXNlKCkge1xuICAgIHRoaXMudGFwcGVkID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmtlZXBUYXBCYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGFwQmFja2dyb3VuZENvbG9yKCk7XG4gICAgfVxuICAgIHN0eWxlci5jbGVhcih0aGlzLCAndHJhbnNpdGlvbiBib3hTaGFkb3cnKTtcbiAgfVxuXG4gIF9jbGVhclRhcEJhY2tncm91bmRDb2xvcigpIHtcbiAgICB0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuX29yaWdpbmFsQmFja2dyb3VuZENvbG9yIHx8ICcnO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoTGlzdEl0ZW1FbGVtZW50LCBbJ2V4cGFuZGVkJywgJ2V4cGFuZGFibGUnLCAndGFwcGFibGUnLCAnbG9jay1vbi1kcmFnJywgJ2tlZXAtdGFwLWJhY2tncm91bmQtY29sb3InXSk7XG51dGlsLmRlZmluZVN0cmluZ1Byb3BlcnRpZXMoTGlzdEl0ZW1FbGVtZW50LCBbJ2FuaW1hdGlvbicsICd0YXAtYmFja2dyb3VuZC1jb2xvciddKTtcblxub25zRWxlbWVudHMuTGlzdEl0ZW0gPSBMaXN0SXRlbUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1saXN0LWl0ZW0nLCBMaXN0SXRlbUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbGlzdCc7XG5jb25zdCBzY2hlbWUgPSB7Jyc6ICdsaXN0LS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3RcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAbW9kaWZpZXIgaW5zZXRcbiAqICAgW2VuXUluc2V0IGxpc3QgdGhhdCBkb2Vzbid0IGNvdmVyIHRoZSB3aG9sZSB3aWR0aCBvZiB0aGUgcGFyZW50LlsvZW5dXG4gKiAgIFtqYV3opqropoHntKDjga7nlLvpnaLjgYTjgaPjgbHjgYTjgavluoPjgYzjgonjgarjgYTjg6rjgrnjg4jjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIG5vYm9yZGVyXG4gKiAgIFtlbl1BIGxpc3Qgd2l0aCBubyBib3JkZXJzIGF0IHRoZSB0b3AgYW5kIGJvdHRvbS5bL2VuXVxuICogICBbamFd44Oq44K544OI44Gu5LiK5LiL44Gu44Oc44O844OA44O844GM54Sh44GE44Oq44K544OI44KS6KGo56S644GX44G+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+IHtcbiAgICAgICAgICBwcmVwYXJlKHBhZ2VFbGVtZW50KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wdXNoUGFnZShvcHRpb25zLCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLmxvYWQoe3BhZ2UsIHBhcmVudDogdGhpcywgcGFyYW1zOiBvcHRpb25zLmRhdGF9LCBwYWdlRWxlbWVudCA9PiB7XG4gICAgICAgIHByZXBhcmUocGFnZUVsZW1lbnQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgX3B1c2hQYWdlKG9wdGlvbnMgPSB7fSwgdXBkYXRlID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpIHtcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ3B1c2hQYWdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZW1pdFByZVB1c2hFdmVudCgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NhbmNlbGVkIGluIHByZXB1c2ggZXZlbnQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSB0aGlzLmFuaW1hdGlvbk9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMgfHwge30sIHthbmltYXRpb25PcHRpb25zfSwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zKTtcblxuICAgIHJldHVybiB1cGRhdGUoKS50aGVuKCgpID0+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/mmYLjgavjgpLjg53jg4Pjg5fjgqrjg7zjg5Djg7zplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjb3Zlci10YXJnZXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHNldCB0aGUgcG9wb3ZlciB3aWxsIGNvdmVyIHRoZSB0YXJnZXQgb24gdGhlIHNjcmVlbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNvdmVyVGFyZ2V0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiBzZXQgdGhlIHBvcG92ZXIgd2lsbCBjb3ZlciB0aGUgdGFyZ2V0IG9uIHRoZSBzY3JlZW4uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGFyZ2V0XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZpZXMgdGhlIElEIG9mIHRoZSBkZWZhdWx0IGVsZW1lbnQgZm9yIHRoZSBwb3BvdmVyLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBruWvvuixoeOBqOOBmeOCi+ODh+ODleOCqeODq+ODiOimgee0oOOBrklE44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB0YXJnZXRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZmllcyB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgZWxlbWVudCBmb3IgdGhlIHBvcG92ZXIuWy9lbl1cbiAgICogICBbamFd44Od44OD44OX44Kq44O844OQ44O844Gu5a++6LGh44Go44GZ44KL44OH44OV44Kp44Or44OI6KaB57Sg44GuSUTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW4gaGlkaW5nIHRoZSBwb3BvdmVyLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAsIGBcImRlZmF1bHRcImAsIGBcImZhZGUtaW9zXCJgIG9yIGBcImZhZGUtbWRcImAuWy9lbl1cbiAgICogICBbamFd44Od44OD44OX44Kq44O844OQ44O844KS6KGo56S644GZ44KL6Zqb44Gu44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uLW9wdGlvbnNcbiAgICogQHR5cGUge0V4cHJlc3Npb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtYXNrLWNvbG9yXG4gICAqIEB0eXBlIHtDb2xvcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgYFwicmdiYSgwLCAwLCAwLCAwLjIpXCJgLlsvZW5dXG4gICAqICAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBr1wicmdiYSgwLCAwLCAwLCAwLjIpXCLjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgcG9wb3ZlciBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYm91bmRPbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHNjaGVtZTtcbiAgfVxuXG4gIGdldCBfbWFzaygpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wb3BvdmVyLW1hc2snKTtcbiAgfVxuXG4gIGdldCBfcG9wb3ZlcigpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wb3BvdmVyJyk7XG4gIH1cblxuICBnZXQgX2NvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMuX3BvcG92ZXIsICcucG9wb3Zlcl9fY29udGVudCcpO1xuICB9XG5cbiAgZ2V0IF9hcnJvdygpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcy5fcG9wb3ZlciwgJy5wb3BvdmVyX19hcnJvdycpO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IF9hbmltYXRvckRpY3QsXG4gICAgICBiYXNlQ2xhc3M6IFBvcG92ZXJBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdQb3BvdmVyQW5pbWF0b3InLFxuICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpIHx8ICdkZWZhdWx0J1xuICAgIH0pO1xuICB9XG5cbiAgX3RvZ2dsZVN0eWxlKHNob3VsZFNob3csIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzaG91bGRTaG93KSB7XG4gICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgbGV0IHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0O1xuICAgICAgaWYgKCF0YXJnZXQgJiYgdGhpcy50YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50YXJnZXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudFRhcmdldCA9IHRhcmdldDtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3Zlcih0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB0aGlzLl9jbGVhclN0eWxlcygpO1xuICAgIH1cbiAgfVxuXG4gIF9wb3NpdGlvblBvcG92ZXIodGFyZ2V0KSB7XG4gICAgY29uc3Qge19yYWRpdXM6IHJhZGl1cywgX2NvbnRlbnQ6IGNvbnRlbnRFbGVtZW50LCBfbWFyZ2luOiBtYXJnaW59ID0gdGhpcztcbiAgICBjb25zdCBzYWZlQXJlYUxlbmd0aHMgPSBpUGhvbmVYUGF0Y2guZ2V0U2FmZUFyZWFMZW5ndGhzKCk7XG4gICAgY29uc3Qgc2FmZUFyZWFSZWN0ID0gaVBob25lWFBhdGNoLmdldFNhZmVBcmVhRE9NUmVjdCgpO1xuICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXNNRCA9IHV0aWwuaGFzTW9kaWZpZXIodGhpcywgJ21hdGVyaWFsJyk7XG4gICAgY29uc3QgY292ZXIgPSBpc01EICYmIHRoaXMuaGFzQXR0cmlidXRlKCdjb3Zlci10YXJnZXQnKTtcbiAgICBjb25zdCBwYXJlbnQgPSB1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy1wYWdlJykgfHwgZG9jdW1lbnQuYm9keTtcbiAgICBjb25zdCBwYXJlbnREaW1lbnNpb25zID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heFBvc2l0aW9ucyA9IHtcbiAgICAgIHRvcDogTWF0aC5tYXgocGFyZW50RGltZW5zaW9ucy50b3AsIHNhZmVBcmVhUmVjdC50b3ApLFxuICAgICAgbGVmdDogTWF0aC5tYXgocGFyZW50RGltZW5zaW9ucy5sZWZ0LCBzYWZlQXJlYVJlY3QubGVmdCksXG4gICAgICBib3R0b206IE1hdGgubWluKHBhcmVudERpbWVuc2lvbnMuYm90dG9tLCBzYWZlQXJlYVJlY3QuYm90dG9tKSxcbiAgICAgIHJpZ2h0OiBNYXRoLm1pbihwYXJlbnREaW1lbnNpb25zLnJpZ2h0LCBzYWZlQXJlYVJlY3QucmlnaHQpLFxuICAgIH07XG5cbiAgICAvLyBEaXN0YW5jZSBmcm9tIGVhY2ggc2lkZSBvZiB0aGUgc2FmZSBhcmVhICh3aXRoIG1hcmdpbikgdG8gdGhlIHRhcmdldCBlbGVtZW50XG4gICAgY29uc3QgdGFyZ2V0RGlzdGFuY2UgPSB7XG4gICAgICB0b3A6IHRhcmdldFJlY3QudG9wIC0gKG1heFBvc2l0aW9ucy50b3AgKyBtYXJnaW4pLFxuICAgICAgbGVmdDogdGFyZ2V0UmVjdC5sZWZ0IC0gKG1heFBvc2l0aW9ucy5sZWZ0ICsgbWFyZ2luKSxcbiAgICAgIGJvdHRvbTogKG1heFBvc2l0aW9ucy5ib3R0b20gLSBtYXJnaW4pIC0gdGFyZ2V0UmVjdC5ib3R0b20sXG4gICAgICByaWdodDogKG1heFBvc2l0aW9ucy5yaWdodCAtIG1hcmdpbikgLSB0YXJnZXRSZWN0LnJpZ2h0XG4gICAgfTtcblxuICAgIC8vIERpc3RhbmNlIGZyb20gZWFjaCBzaWRlIG9mIHRoZSBzYWZlIGFyZWEgKHdpdGggbWFyZ2luKSB0byB0aGUgZ2VvbWV0cmljIGNlbnRlciBvZiB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgICBjb25zdCB0YXJnZXRDZW50ZXJEaXN0YW5jZUZyb20gPSB7XG4gICAgICB0b3A6IHRhcmdldFJlY3QudG9wICsgTWF0aC5yb3VuZCh0YXJnZXRSZWN0LmhlaWdodCAvIDIpIC0gKG1heFBvc2l0aW9ucy50b3AgKyBtYXJnaW4pLFxuICAgICAgbGVmdDogdGFyZ2V0UmVjdC5sZWZ0ICsgTWF0aC5yb3VuZCh0YXJnZXRSZWN0LndpZHRoIC8gMikgLSAobWF4UG9zaXRpb25zLmxlZnQgKyBtYXJnaW4pLFxuICAgICAgYm90dG9tOiAobWF4UG9zaXRpb25zLmJvdHRvbSAtIG1hcmdpbikgLSB0YXJnZXRSZWN0LmJvdHRvbSArIE1hdGgucm91bmQodGFyZ2V0UmVjdC5oZWlnaHQgLyAyKSxcbiAgICAgIHJpZ2h0OiAobWF4UG9zaXRpb25zLnJpZ2h0IC0gbWFyZ2luKSAtIHRhcmdldFJlY3QucmlnaHQgKyBNYXRoLnJvdW5kKHRhcmdldFJlY3Qud2lkdGggLyAyKVxuICAgIH07XG5cbiAgICBjb25zdCB7dmVydGljYWwsIHByaW1hcnk6IHByaW1hcnlEaXJlY3Rpb24sIHNlY29uZGFyeTogc2Vjb25kYXJ5RGlyZWN0aW9ufSA9IHRoaXMuX2NhbGN1bGF0ZURpcmVjdGlvbnModGFyZ2V0RGlzdGFuY2UpO1xuICAgIHRoaXMuX2N1cnJlbnREaXJlY3Rpb24gPSBwcmltYXJ5RGlyZWN0aW9uO1xuICAgIHV0aWwuYWRkTW9kaWZpZXIodGhpcywgcHJpbWFyeURpcmVjdGlvbik7XG5cbiAgICBjb25zdCBzaXplTmFtZSA9IHZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIC8vIEdldCAucG9wb3Zlcl9fY29udGVudCBzaXplXG4gICAgY29uc3QgY29udGVudFNpemUgPSAoc3R5bGUgPT4gKHtcbiAgICAgIHdpZHRoOiBwYXJzZUludChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpLCAxMCksXG4gICAgICBoZWlnaHQ6IHBhcnNlSW50KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpLCAxMClcbiAgICB9KSkod2luZG93LmdldENvbXB1dGVkU3R5bGUoY29udGVudEVsZW1lbnQpKTtcblxuICAgIC8vIFNldHRpbmcgLnBvcG92ZXIgcG9zaXRpb24uXG4gICAgY29uc3QgdGFyZ2V0QW5kQXJyb3dMZW5ndGggPSBjb3ZlciA/IDAgOiAodmVydGljYWwgPyB0YXJnZXRSZWN0LmhlaWdodCA6IHRhcmdldFJlY3Qud2lkdGgpICsgKGlzTUQgPyAwIDogMTQpO1xuICAgIGNvbnN0IHByaW1hcnlPZmZzZXQgPSBNYXRoLm1heChcbiAgICAgIHNhZmVBcmVhTGVuZ3Roc1twcmltYXJ5RGlyZWN0aW9uXSArIG1hcmdpbixcbiAgICAgIHNhZmVBcmVhTGVuZ3Roc1twcmltYXJ5RGlyZWN0aW9uXSArIG1hcmdpbiArIHRhcmdldERpc3RhbmNlW3ByaW1hcnlEaXJlY3Rpb25dICsgdGFyZ2V0QW5kQXJyb3dMZW5ndGhcbiAgICApO1xuICAgIGNvbnN0IHNlY29uZGFyeU9mZnNldCA9IE1hdGgubWF4KFxuICAgICAgc2FmZUFyZWFMZW5ndGhzW3NlY29uZGFyeURpcmVjdGlvbl0gKyBtYXJnaW4sXG4gICAgICBzYWZlQXJlYUxlbmd0aHNbc2Vjb25kYXJ5RGlyZWN0aW9uXSArIG1hcmdpbiArIHRhcmdldENlbnRlckRpc3RhbmNlRnJvbVtzZWNvbmRhcnlEaXJlY3Rpb25dIC0gKGNvbnRlbnRTaXplW3NpemVOYW1lXSAvIDIpXG4gICAgKTtcbiAgICB0aGlzLl9wb3BvdmVyLnN0eWxlW3ByaW1hcnlEaXJlY3Rpb25dID0gcHJpbWFyeU9mZnNldCArICdweCc7XG4gICAgdGhpcy5fcG9wb3Zlci5zdHlsZVtzZWNvbmRhcnlEaXJlY3Rpb25dID0gc2Vjb25kYXJ5T2Zmc2V0ICsgJ3B4JztcblxuICAgIC8vIFNldHRpbmcgLnBvcG92ZXJfX2Fycm93IHBvc2l0aW9uLlxuICAgIHRoaXMuX2Fycm93LnN0eWxlW3NlY29uZGFyeURpcmVjdGlvbl0gPSBNYXRoLm1heChcbiAgICAgIHJhZGl1cyxcbiAgICAgIChzYWZlQXJlYUxlbmd0aHNbc2Vjb25kYXJ5RGlyZWN0aW9uXSArIG1hcmdpbikgKyB0YXJnZXRDZW50ZXJEaXN0YW5jZUZyb21bc2Vjb25kYXJ5RGlyZWN0aW9uXSAtIHNlY29uZGFyeU9mZnNldFxuICAgICkgKyAncHgnO1xuICB9XG5cbiAgX2NhbGN1bGF0ZURpcmVjdGlvbnMoZGlzdGFuY2UpIHtcbiAgICBjb25zdCBvcHRpb25zID0gKHRoaXMuZ2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nKSB8fCAndXAgZG93biBsZWZ0IHJpZ2h0Jykuc3BsaXQoL1xccysvKS5tYXAoZSA9PiBwb3NpdGlvbnNbZV0pO1xuICAgIGNvbnN0IHByaW1hcnkgPSBvcHRpb25zLnNvcnQoKGEsIGIpID0+IGRpc3RhbmNlW2FdIC0gZGlzdGFuY2VbYl0pWzBdO1xuICAgIGNvbnN0IHZlcnRpY2FsID0gJ3RvcCcgPT0gcHJpbWFyeSB8fCAnYm90dG9tJyA9PSBwcmltYXJ5O1xuICAgIGxldCBzZWNvbmRhcnk7XG5cbiAgICBpZiAodmVydGljYWwpIHtcbiAgICAgIHNlY29uZGFyeSA9IGRpc3RhbmNlLmxlZnQgPCBkaXN0YW5jZS5yaWdodCA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlY29uZGFyeSA9IGRpc3RhbmNlLnRvcCA8IGRpc3RhbmNlLmJvdHRvbSA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt2ZXJ0aWNhbCwgcHJpbWFyeSwgc2Vjb25kYXJ5fTtcbiAgfVxuXG4gIF9jbGVhclN0eWxlcygpIHtcbiAgICB0aGlzLl9jdXJyZW50RGlyZWN0aW9uID0gbnVsbDtcbiAgICBbJ3RvcCcsICdib3R0b20nLCAnbGVmdCcsICdyaWdodCddLmZvckVhY2goZSA9PiB7XG4gICAgICB0aGlzLl9hcnJvdy5zdHlsZVtlXSA9IHRoaXMuX2NvbnRlbnQuc3R5bGVbZV0gPSB0aGlzLl9wb3BvdmVyLnN0eWxlW2VdID0gJyc7XG4gICAgICB1dGlsLnJlbW92ZU1vZGlmaWVyKHRoaXMsIGUpO1xuICAgIH0pO1xuICB9XG5cbiAgX29uQ2hhbmdlKCkge1xuICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY3VycmVudFRhcmdldCkge1xuICAgICAgICB0aGlzLl9wb3NpdGlvblBvcG92ZXIodGhpcy5fY3VycmVudFRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIGlmICh0aGlzLl9wb3BvdmVyICYmIHRoaXMuX21hc2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZWZhdWx0Q29udGFpbmVyID0gdGhpcy5fcG9wb3ZlciAmJiB0aGlzLl9jb250ZW50O1xuXG4gICAgaWYgKGhhc0RlZmF1bHRDb250YWluZXIpIHtcblxuICAgICAgaWYgKCF0aGlzLl9tYXNrKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbWFzay5jbGFzc0xpc3QuYWRkKCdwb3BvdmVyLW1hc2snKTtcbiAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUobWFzaywgdGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9hcnJvdykge1xuICAgICAgICBjb25zdCBhcnJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBhcnJvdy5jbGFzc0xpc3QuYWRkKCdwb3BvdmVyX19hcnJvdycpO1xuICAgICAgICB0aGlzLl9wb3BvdmVyLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gdXRpbC5jcmVhdGVGcmFnbWVudChgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyLW1hc2tcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlcl9fY29udGVudFwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyX19hcnJvd1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGApO1xuICAgICAgY29uc3QgY29udGVudCA9IHRlbXBsYXRlLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyX19jb250ZW50Jyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRSFcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ3N0eWxlJykpIHtcbiAgICAgIHRoaXMuX3BvcG92ZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpKTtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KHRhcmdldCwgW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge1N0cmluZ3xFdmVudHxIVE1MRWxlbWVudH0gdGFyZ2V0XG4gICAqICAgW2VuXVRhcmdldCBlbGVtZW50LiBDYW4gYmUgZWl0aGVyIGEgQ1NTIHNlbGVjdG9yLCBhbiBldmVudCBvYmplY3Qgb3IgYSBET00gZWxlbWVudC4gSXQgY2FuIGJlIGFsc28gcHJvdmlkZWQgYXMgJ29wdGlvbnMudGFyZ2V0JyBpbnN0ZWFkLiBbL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjga7jgr/jg7zjgrLjg4Pjg4jjgajjgarjgovopoHntKDjgpLmjIflrprjgZfjgb7jgZnjgIJDU1Pjgrvjg6zjgq/jgr/jgYtldmVudOOCquODluOCuOOCp+OCr+ODiOOBi0RPTeimgee0oOOBruOBhOOBmuOCjOOBi+OCkua4oeOBm+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gIFVzZSBvbmUgb2YgYFwiZmFkZS1pb3NcImAsIGBcImZhZGUtbWRcImAsIGBcIm5vbmVcImAgYW5kIGBcImRlZmF1bHRcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJmYWRlLWlvc1wiLCBcImZhZGUtbWRcIiwgXCJub25lXCIsIFwiZGVmYXVsdFwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgcG9wb3ZlciBoYXMgYmVlbiByZXZlYWxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzooajnpLrjgZXjgozntYLjgo/jgaPjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dT3BlbiB0aGUgcG9wb3ZlciBhbmQgcG9pbnQgaXQgYXQgYSB0YXJnZXQuIFRoZSB0YXJnZXQgY2FuIGJlIGVpdGhlciBhbiBldmVudCwgYSBDU1Mgc2VsZWN0b3Igb3IgYSBET00gZWxlbWVudC4uWy9lbl1cbiAgICogICBbamFd5a++6LGh44Go44GZ44KL6KaB57Sg44Gr44Od44OD44OX44Kq44O844OQ44O844KS6KGo56S644GX44G+44GZ44CCdGFyZ2V05byV5pWw44Gr44Gv44CBJGV2ZW5044Kq44OW44K444Kn44Kv44OI44KERE9N44Ko44Os44Oh44Oz44OI44KEQ1NT44K744Os44Kv44K/44KS5rih44GZ44GT44Go44GM5Ye65p2l44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGRpc3BsYXllZCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNob3codGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBDb3B5IG9wdGlvbnMgYW5kIGluY2x1ZGUgb3B0aW9ucy50YXJnZXRcbiAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmICEodGFyZ2V0IGluc3RhbmNlb2YgRXZlbnQpICYmICEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICBvcHRpb25zID0geyAuLi50YXJnZXQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgdGFyZ2V0IH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRpb25zLnRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnRhcmdldCBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICBvcHRpb25zLnRhcmdldCA9IG9wdGlvbnMudGFyZ2V0LnRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMudGFyZ2V0ICYmIHRoaXMudGFyZ2V0KSB7XG4gICAgICBvcHRpb25zLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAoIShvcHRpb25zLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICB1dGlsLnRocm93KCdJbnZhbGlkIHRhcmdldCB0eXBlIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5zaG93KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuICBVc2Ugb25lIG9mIGBcImZhZGUtaW9zXCJgLCBgXCJmYWRlLW1kXCJgLCBgXCJub25lXCJgIGFuZCBgXCJkZWZhdWx0XCJgLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwiZmFkZS1pb3NcIiwgXCJmYWRlLW1kXCIsIFwibm9uZVwiLCBcImRlZmF1bHRcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbnMgaXMgY2FsbGVkIGFmdGVyIHRoZSBwb3BvdmVyIGhhcyBiZWVuIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzpmqDjgozjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2xvc2UgdGhlIHBvcG92ZXIuWy9lbl1cbiAgICogICBbamFd44Od44OD44OX44Kq44O844OQ44O844KS6ZaJ44GY44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGhpZGRlbiBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNhbmNlbGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIEEgYm9vbGVhbiB2YWx1ZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBwb3BvdmVyIGlzIGNhbmNlbGFibGUgb3Igbm90LlxuICAgKlxuICAgKiAgICAgV2hlbiB0aGUgcG9wb3ZlciBpcyBjYW5jZWxhYmxlIGl0IGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWFza0NvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCBmYWxzZSk7XG4gICAgdGhpcy5fbWFyZ2luID0gdGhpcy5fbWFyZ2luIHx8IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmdldFByb3BlcnR5VmFsdWUoJ3RvcCcpKTtcbiAgICB0aGlzLl9tYXJnaW4gPSB0aGlzLl9tYXJnaW4gfHwgNjsgLy8gRml4IGZvciBpZnJhbWVzXG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fcmFkaXVzID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fY29udGVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cycpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLCAnZGlyZWN0aW9uJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnZGlyZWN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kT25DaGFuZ2UoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnREaXJlY3Rpb24gJiYgdXRpbC5hZGRNb2RpZmllcih0aGlzLCB0aGlzLl9jdXJyZW50RGlyZWN0aW9uKTtcbiAgICB9XG4gICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7UG9wb3ZlckFuaW1hdG9yfSBBbmltYXRvclxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQW5pbWF0b3IobmFtZSwgQW5pbWF0b3IpIHtcbiAgICBpZiAoIShBbmltYXRvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQb3BvdmVyQW5pbWF0b3IpKSB7XG4gICAgICB1dGlsLnRocm93QW5pbWF0b3IoJ1BvcG92ZXInKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFBvcG92ZXJBbmltYXRvcigpIHtcbiAgICByZXR1cm4gUG9wb3ZlckFuaW1hdG9yO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoUG9wb3ZlckVsZW1lbnQsIFsnY292ZXItdGFyZ2V0J10pO1xudXRpbC5kZWZpbmVTdHJpbmdQcm9wZXJ0aWVzKFBvcG92ZXJFbGVtZW50LCBbJ3RhcmdldCddKTtcblxub25zRWxlbWVudHMuUG9wb3ZlciA9IFBvcG92ZXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcG9wb3ZlcicsIFBvcG92ZXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5wcm9ncmVzcy1iYXInOiAncHJvZ3Jlc3MtYmFyLS0qJyxcbiAgJy5wcm9ncmVzcy1iYXJfX3ByaW1hcnknOiAncHJvZ3Jlc3MtYmFyLS0qX19wcmltYXJ5JyxcbiAgJy5wcm9ncmVzcy1iYXJfX3NlY29uZGFyeSc6ICdwcm9ncmVzcy1iYXItLSpfX3NlY29uZGFyeSdcbn07XG5cbmNvbnN0IHRlbXBsYXRlID0gdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJfX3NlY29uZGFyeVwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJfX3ByaW1hcnlcIj48L2Rpdj5cbiAgPC9kaXY+XG5gKTtcblxuY29uc3QgSU5ERVQgPSAnaW5kZXRlcm1pbmF0ZSc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXByb2dyZXNzLWJhclxuICogQGNhdGVnb3J5IHZpc3VhbFxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIHByb2dyZXNzIGJhci5bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44K544K/44Kk44Or44Gn44OX44Ot44Kw44Os44K544OQ44O844KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhlIGNvbXBvbmVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBsaW5lYXIgcHJvZ3Jlc3MgYmFyLiBJdCBjYW4gZWl0aGVyIGRpc3BsYXkgYSBwcm9ncmVzcyBiYXIgdGhhdCBzaG93cyB0aGUgdXNlciBob3cgbXVjaCBvZiBhIHRhc2sgaGFzIGJlZW4gY29tcGxldGVkLiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGVyY2VudGFnZSBpcyBub3Qga25vd24gaXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhbiBhbmltYXRlZCBwcm9ncmVzcyBiYXIgc28gdGhlIHVzZXIgY2FuIHNlZSB0aGF0IGFuIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiB6dlFiR2pcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9wcm9ncmVzc1xuICogQHNlZWFsc28gb25zLXByb2dyZXNzLWNpcmN1bGFyXG4gKiAgIFtlbl1UaGUgYDxvbnMtcHJvZ3Jlc3MtY2lyY3VsYXI+YCBjb21wb25lbnQgZGlzcGxheXMgYSBjaXJjdWxhciBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1wcm9ncmVzcy1iYXJcbiAqICB2YWx1ZT1cIjU1XCJcbiAqICBzZWNvbmRhcnktdmFsdWU9XCI4N1wiPlxuICogPC9vbnMtcHJvZ3Jlc3MtYmFyPlxuICpcbiAqIDxvbnMtcHJvZ3Jlc3MtYmFyXG4gKiAgaW5kZXRlcm1pbmF0ZT5cbiAqIDwvb25zLXByb2dyZXNzLWJhcj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZ3Jlc3NCYXJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DaGFuZ2UgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHByb2dyZXNzIGluZGljYXRvci5bL2VuXVxuICAgKiAgIFtqYV3jg5fjg63jgrDjg6zjgrnjgqTjg7PjgrjjgrHjg7zjgr/jga7opovjgZ/nm67jgpLlpInmm7TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNlY29uZGFyeS12YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBzZWNvbmRhcnkgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBru+8kueVquebruOBrumAsuihjOeKtuazgeOBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAgjDjgYvjgokxMDDjga7plpPjga7lgKTjgpLmjIflrprjgZfjgabkuIvjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpbmRldGVybWluYXRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIGFuIGluZmluaXRlIGxvb3BpbmcgYW5pbWF0aW9uIHdpbGwgYmUgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM6Kit5a6a44GV44KM44Gf5aC05ZCI44CB44Or44O844OX44GZ44KL44Ki44OL44Oh44O844K344On44Oz44GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0NvbXBpbGVkKCkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlID0gdGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZSA9IHV0aWwuZmluZENoaWxkKHRoaXMsICcucHJvZ3Jlc3MtYmFyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJpbWFyeSA9IHV0aWwuZmluZENoaWxkKHRoaXMuX3RlbXBsYXRlLCAnLnByb2dyZXNzLWJhcl9fcHJpbWFyeScpO1xuICAgIHRoaXMuX3NlY29uZGFyeSA9IHV0aWwuZmluZENoaWxkKHRoaXMuX3RlbXBsYXRlLCAnLnByb2dyZXNzLWJhcl9fc2Vjb25kYXJ5Jyk7XG5cbiAgICB0aGlzLl91cGRhdGVEZXRlcm1pbmF0ZSgpO1xuICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuX3RlbXBsYXRlKTtcblxuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9pc0NvbXBpbGVkKCkge1xuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1iYXInKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJhckVsZW1lbnQgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnByb2dyZXNzLWJhcicpO1xuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZChiYXJFbGVtZW50LCAnLnByb2dyZXNzLWJhcl9fc2Vjb25kYXJ5JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKGJhckVsZW1lbnQsICcucHJvZ3Jlc3MtYmFyX19wcmltYXJ5JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3ZhbHVlJywgJ3NlY29uZGFyeS12YWx1ZScsIElOREVUXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgdGhpcy5oYXNBdHRyaWJ1dGUoSU5ERVQpICYmIHRoaXMuX3VwZGF0ZURldGVybWluYXRlKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAndmFsdWUnIHx8IG5hbWUgPT09ICdzZWNvbmRhcnktdmFsdWUnKSB7XG4gICAgICB0aGlzLl91cGRhdGVWYWx1ZSgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gSU5ERVQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURldGVybWluYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZURldGVybWluYXRlKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB1dGlsLnRvZ2dsZU1vZGlmaWVyKHRoaXMsIElOREVULCB7IGZvcmNlOiB0aGlzLmhhc0F0dHJpYnV0ZShJTkRFVCkgfSkpO1xuICB9XG5cbiAgX3VwZGF0ZVZhbHVlKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9wcmltYXJ5LnN0eWxlLndpZHRoID0gKHRoaXMuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSA/IHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpICsgJyUnIDogJzAlJztcbiAgICAgIHRoaXMuX3NlY29uZGFyeS5zdHlsZS53aWR0aCA9IHRoaXMuaGFzQXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnKSA/IHRoaXMuZ2V0QXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnKSArICclJyA6ICcwJSc7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG4gIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgdXRpbC50aHJvdygnSW52YWxpZCB2YWx1ZScpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd2YWx1ZScsIE1hdGguZmxvb3IodmFsdWUpKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgfHwgJzAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc2Vjb25kYXJ5VmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgc2Vjb25kYXJ5IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7vvJLnlarnm67jga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG4gIHNldCBzZWNvbmRhcnlWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgdXRpbC50aHJvdygnSW52YWxpZCB2YWx1ZScpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnLCBNYXRoLmZsb29yKHZhbHVlKSk7XG4gIH1cblxuICBnZXQgc2Vjb25kYXJ5VmFsdWUoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnKSB8fCAnMCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBpbmRldGVybWluYXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAsIGFuIGluZmluaXRlIGxvb3BpbmcgYW5pbWF0aW9uIHdpbGwgYmUgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM6Kit5a6a44GV44KM44Gf5aC05ZCI44CB44Or44O844OX44GZ44KL44Ki44OL44Oh44O844K344On44Oz44GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHNldCBpbmRldGVybWluYXRlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShJTkRFVCwgJycpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKElOREVUKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaW5kZXRlcm1pbmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoSU5ERVQpO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLlByb2dyZXNzQmFyID0gUHJvZ3Jlc3NCYXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcHJvZ3Jlc3MtYmFyJywgUHJvZ3Jlc3NCYXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5wcm9ncmVzcy1jaXJjdWxhcic6ICdwcm9ncmVzcy1jaXJjdWxhci0tKicsXG4gICcucHJvZ3Jlc3MtY2lyY3VsYXJfX2JhY2tncm91bmQnOiAncHJvZ3Jlc3MtY2lyY3VsYXItLSpfX2JhY2tncm91bmQnLFxuICAnLnByb2dyZXNzLWNpcmN1bGFyX19wcmltYXJ5JzogJ3Byb2dyZXNzLWNpcmN1bGFyLS0qX19wcmltYXJ5JyxcbiAgJy5wcm9ncmVzcy1jaXJjdWxhcl9fc2Vjb25kYXJ5JzogJ3Byb2dyZXNzLWNpcmN1bGFyLS0qX19zZWNvbmRhcnknXG59O1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gIDxzdmcgY2xhc3M9XCJwcm9ncmVzcy1jaXJjdWxhclwiPlxuICAgIDxjaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1jaXJjdWxhcl9fYmFja2dyb3VuZFwiIC8+XG4gICAgPGNpcmNsZSBjbGFzcz1cInByb2dyZXNzLWNpcmN1bGFyX19zZWNvbmRhcnlcIiBjeD1cIjUwJVwiIGN5PVwiNTAlXCIgcj1cIjQwJVwiIC8+XG4gICAgPGNpcmNsZSBjbGFzcz1cInByb2dyZXNzLWNpcmN1bGFyX19wcmltYXJ5XCIgY3g9XCI1MCVcIiBjeT1cIjUwJVwiIHI9XCI0MCVcIiAvPlxuICA8L3N2Zz5cbmApO1xuXG5jb25zdCBJTkRFVCA9ICdpbmRldGVybWluYXRlJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtcHJvZ3Jlc3MtY2lyY3VsYXJcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhpcyBjb21wb25lbnQgZGlzcGxheXMgYSBjaXJjdWxhciBwcm9ncmVzcyBpbmRpY2F0b3IuIEl0IGNhbiBlaXRoZXIgYmUgdXNlZCB0byBzaG93IGhvdyBtdWNoIG9mIGEgdGFzayBoYXMgYmVlbiBjb21wbGV0ZWQgb3IgdG8gc2hvdyBhIGxvb3BpbmcgYW5pbWF0aW9uIHRvIGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIEVWek1qUlxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3Byb2dyZXNzLWNpcmN1bGFyXG4gKiBAc2VlYWxzbyBvbnMtcHJvZ3Jlc3MtYmFyXG4gKiAgIFtlbl1UaGUgYDxvbnMtcHJvZ3Jlc3MtYmFyPmAgY29tcG9uZW50IGRpc3BsYXlzIGEgYmFyIHByb2dyZXNzIGluZGljYXRvci5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXByb2dyZXNzLWNpcmN1bGFyXG4gKiAgdmFsdWU9XCI1NVwiXG4gKiAgc2Vjb25kYXJ5LXZhbHVlPVwiODdcIj5cbiAqIDwvb25zLXByb2dyZXNzLWNpcmN1bGFyPlxuICpcbiAqIDxvbnMtcHJvZ3Jlc3MtY2lyY3VsYXJcbiAqICBpbmRldGVybWluYXRlPlxuICogPC9vbnMtcHJvZ3Jlc3MtY2lyY3VsYXI+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyZXNzQ2lyY3VsYXJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DaGFuZ2UgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHByb2dyZXNzIGluZGljYXRvci5bL2VuXVxuICAgKiAgIFtqYV3jg5fjg63jgrDjg6zjgrnjgqTjg7PjgrjjgrHjg7zjgr/jga7opovjgZ/nm67jgpLlpInmm7TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNlY29uZGFyeS12YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBzZWNvbmRhcnkgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBru+8kueVquebruOBrumAsuihjOeKtuazgeOBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAgjDjgYvjgokxMDDjga7plpPjga7lgKTjgpLmjIflrprjgZfjgabkuIvjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpbmRldGVybWluYXRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIGFuIGluZmluaXRlIGxvb3BpbmcgYW5pbWF0aW9uIHdpbGwgYmUgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM6Kit5a6a44GV44KM44Gf5aC05ZCI44CB44Or44O844OX44GZ44KL44Ki44OL44Oh44O844K344On44Oz44GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAndmFsdWUnLCAnc2Vjb25kYXJ5LXZhbHVlJywgSU5ERVRdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB0aGlzLmhhc0F0dHJpYnV0ZShJTkRFVCkgJiYgdGhpcy5fdXBkYXRlRGV0ZXJtaW5hdGUoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICd2YWx1ZScgfHwgbmFtZSA9PT0gJ3NlY29uZGFyeS12YWx1ZScpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSBJTkRFVCkge1xuICAgICAgdGhpcy5fdXBkYXRlRGV0ZXJtaW5hdGUoKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlRGV0ZXJtaW5hdGUoKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHV0aWwudG9nZ2xlTW9kaWZpZXIodGhpcywgSU5ERVQsIHsgZm9yY2U6IHRoaXMuaGFzQXR0cmlidXRlKElOREVUKSB9KSk7XG4gIH1cblxuICBfdXBkYXRlVmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCd2YWx1ZScpKSB7XG4gICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXIgPSBNYXRoLmNlaWwodGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgKiAyNTEuMzIgKiAwLjAxKTtcbiAgICAgICAgdGhpcy5fcHJpbWFyeS5zdHlsZVsnc3Ryb2tlLWRhc2hhcnJheSddID0gcGVyICsgJyUsIDI1MS4zMiUnO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykpIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlciA9ICBNYXRoLmNlaWwodGhpcy5nZXRBdHRyaWJ1dGUoJ3NlY29uZGFyeS12YWx1ZScpICogMjUxLjMyICogMC4wMSk7XG4gICAgICAgIHRoaXMuX3NlY29uZGFyeS5zdHlsZS5kaXNwbGF5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2Vjb25kYXJ5LnN0eWxlWydzdHJva2UtZGFzaGFycmF5J10gPSBwZXIgKyAnJSwgMjUxLjMyJSc7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgdGhpcy5fc2Vjb25kYXJ5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG4gIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgdXRpbC50aHJvdygnSW52YWxpZCB2YWx1ZScpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd2YWx1ZScsIE1hdGguZmxvb3IodmFsdWUpKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgfHwgJzAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc2Vjb25kYXJ5VmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgc2Vjb25kYXJ5IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7vvJLnlarnm67jga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG4gIHNldCBzZWNvbmRhcnlWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8IHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgdXRpbC50aHJvdygnSW52YWxpZCB2YWx1ZScpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnLCBNYXRoLmZsb29yKHZhbHVlKSk7XG4gIH1cblxuICBnZXQgc2Vjb25kYXJ5VmFsdWUoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnKSB8fCAnMCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBpbmRldGVybWluYXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAsIGFuIGluZmluaXRlIGxvb3BpbmcgYW5pbWF0aW9uIHdpbGwgYmUgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM6Kit5a6a44GV44KM44Gf5aC05ZCI44CB44Or44O844OX44GZ44KL44Ki44OL44Oh44O844K344On44Oz44GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHNldCBpbmRldGVybWluYXRlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShJTkRFVCwgJycpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKElOREVUKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaW5kZXRlcm1pbmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoSU5ERVQpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQ29tcGlsZWQoKSkge1xuICAgICAgdGhpcy5fdGVtcGxhdGUgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnByb2dyZXNzLWNpcmN1bGFyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlID0gdGVtcGxhdGUuY2xvbmVOb2RlKHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMuX3ByaW1hcnkgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSwgJy5wcm9ncmVzcy1jaXJjdWxhcl9fcHJpbWFyeScpO1xuICAgIHRoaXMuX3NlY29uZGFyeSA9IHV0aWwuZmluZENoaWxkKHRoaXMuX3RlbXBsYXRlLCAnLnByb2dyZXNzLWNpcmN1bGFyX19zZWNvbmRhcnknKTtcblxuICAgIHRoaXMuX3VwZGF0ZURldGVybWluYXRlKCk7XG4gICAgdGhpcy5fdXBkYXRlVmFsdWUoKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5fdGVtcGxhdGUpO1xuXG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgX2lzQ29tcGlsZWQoKSB7XG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnByb2dyZXNzLWNpcmN1bGFyJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzdmcgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnByb2dyZXNzLWNpcmN1bGFyJyk7XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHN2ZywgJy5wcm9ncmVzcy1jaXJjdWxhcl9fc2Vjb25kYXJ5JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHN2ZywgJy5wcm9ncmVzcy1jaXJjdWxhcl9fcHJpbWFyeScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxub25zRWxlbWVudHMuUHJvZ3Jlc3NDaXJjdWxhciA9IFByb2dyZXNzQ2lyY3VsYXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcHJvZ3Jlc3MtY2lyY3VsYXInLCBQcm9ncmVzc0NpcmN1bGFyRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBzdHlsZXIgZnJvbSAnLi4vb25zL3N0eWxlci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBHZXN0dXJlRGV0ZWN0b3IgZnJvbSAnLi4vb25zL2dlc3R1cmUtZGV0ZWN0b3IuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi9vbnMvYW5pbWl0LmpzJztcblxuY29uc3QgU1RBVEVfSU5JVElBTCA9ICdpbml0aWFsJztcbmNvbnN0IFNUQVRFX1BSRUFDVElPTiA9ICdwcmVhY3Rpb24nO1xuY29uc3QgU1RBVEVfQUNUSU9OID0gJ2FjdGlvbic7XG5cbmNvbnN0IHRocm93VHlwZSA9IChlbCwgdHlwZSkgPT4gdXRpbC50aHJvdyhgXCIke2VsfVwiIG11c3QgYmUgJHt0eXBlfWApO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1wdWxsLWhvb2tcbiAqIEBjYXRlZ29yeSBjb250cm9sXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIENvbXBvbmVudCB0aGF0IGFkZHMgKipQdWxsIHRvIHJlZnJlc2gqKiBmdW5jdGlvbmFsaXR5IHRvIGFuIGA8b25zLXBhZ2U+YCBlbGVtZW50LlxuICpcbiAqICAgICBJdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIGEgdGFzayB3aGVuIHRoZSB1c2VyIHB1bGxzIGRvd24gYXQgdGhlIHRvcCBvZiB0aGUgcGFnZS4gQSBjb21tb24gdXNhZ2UgaXMgdG8gcmVmcmVzaCB0aGUgZGF0YSBkaXNwbGF5ZWQgaW4gYSBwYWdlLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIFdiSm9nTVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3B1bGwtaG9va1xuICogQGV4YW1wbGVcbiAqIDxvbnMtcGFnZT5cbiAqICAgPG9ucy1wdWxsLWhvb2s+XG4gKiAgICAgUmVsZWFzZSB0byByZWZyZXNoXG4gKiAgIDwvb25zLXB1bGwtaG9vaz5cbiAqIDwvb25zLXBhZ2U+XG4gKlxuICogPHNjcmlwdD5cbiAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignb25zLXB1bGwtaG9vaycpLm9uQWN0aW9uID0gZnVuY3Rpb24oZG9uZSkge1xuICogICAgIHNldFRpbWVvdXQoZG9uZSwgMTAwMCk7XG4gKiAgIH07XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVsbEhvb2tFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgY2hhbmdlc3RhdGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIHN0YXRlIGlzIGNoYW5nZWQuIFRoZSBzdGF0ZSBjYW4gYmUgZWl0aGVyIFwiaW5pdGlhbFwiLCBcInByZWFjdGlvblwiIG9yIFwiYWN0aW9uXCIuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu54q25oWL44GM5aSJ44KP44Gj44Gf5aC05ZCI44Gr55m654Gr44GX44G+44GZ44CC54q25oWL44Gv44CBXCJpbml0aWFsXCIsIFwicHJlYWN0aW9uXCIsIFwiYWN0aW9uXCLjga7jgYTjgZrjgozjgYvjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5wdWxsSG9va1xuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5zdGF0ZVxuICAgKiAgIFtlbl1DdXJyZW50IHN0YXRlLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBrueKtuaFi+WQjeOCkuWPgueFp+OBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHVsbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQgd2hlbiB0aGUgcHVsbCBob29rIGlzIHB1bGxlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5yYXRpb1xuICAgKiAgIFtlbl1UaGUgcHVsbGVkIGRpc3RhbmNlIHJhdGlvIChzY3JvbGwgLyBoZWlnaHQpLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5hbmltYXRpb25PcHRpb25zXG4gICAqICAgW2VuXVRoZSBhbmltYXRpb24gb3B0aW9ucyBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgXCJwdWxsLXRvLXJlZnJlc2hcIiBmdW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgWRpc2FibGVk54q25oWL44Gr44Gq44KK44Ki44Kv44K344On44Oz44GM5a6f6KGM44GV44KM44Gq44GP44Gq44KK44G+44GZWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaGVpZ2h0XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBoZWlnaHQgb2YgdGhlIGNvbXBvbmVudC4gV2hlbiBwdWxsZWQgZG93biBmdXJ0aGVyIHRoYW4gdGhpcyB2YWx1ZSBpdCB3aWxsIHN3aXRjaCB0byB0aGUgXCJwcmVhY3Rpb25cIiBzdGF0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCI2NHB4XCIuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu6auY44GV44KS5oyH5a6a44GX44G+44GZ44CC44GT44Gu6auY44GV5Lul5LiK44GrcHVsbCBkb3du44GZ44KL44GoXCJwcmVhY3Rpb25cIueKtuaFi+OBq+enu+ihjOOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBruWApOOBr1wiNjRweFwi44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGhyZXNob2xkLWhlaWdodFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgdGhyZXNob2xkIGhlaWdodC4gVGhlIGNvbXBvbmVudCBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzIHRvIHRoZSBcImFjdGlvblwiIHN0YXRlIHdoZW4gcHVsbGVkIGZ1cnRoZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcIjk2cHhcIi4gQSBuZWdhdGl2ZSB2YWx1ZSB3aWxsIGRpc2FibGUgdGhpcyBwcm9wZXJ0eS4gSWYgdGhpcyB2YWx1ZSBpcyBsb3dlciB0aGFuIHRoZSBoZWlnaHQsIGl0IHdpbGwgc2tpcCBcInByZWFjdGlvblwiIHN0YXRlLlsvZW5dXG4gICAqICAgW2phXemWvuWApOOBqOOBquOCi+mrmOOBleOCkuaMh+WumuOBl+OBvuOBmeOAguOBk+OBruWApOOBp+aMh+WumuOBl+OBn+mrmOOBleOCiOOCiuOCgnB1bGwgZG93buOBmeOCi+OBqOOAgeOBk+OBruOCs+ODs+ODneODvOODjeODs+ODiOOBr+iHquWLleeahOOBq1wiYWN0aW9uXCLnirbmhYvjgavnp7vooYzjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBmaXhlZC1jb250ZW50XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2Ugd2lsbCBub3QgbW92ZSB3aGVuIHB1bGxpbmcuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44OX44Or44OV44OD44Kv44GM5byV44GN5Ye644GV44KM44Gm44GE44KL5pmC44Gr44KC44Kz44Oz44OG44Oz44OE44Gv5YuV44GN44G+44Gb44KT44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBmaXhlZENvbnRlbnRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0aGUgY29udGVudCBvZiB0aGUgcGFnZSB3aWxsIG5vdCBtb3ZlIHdoZW4gcHVsbGluZy5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjg5fjg6vjg5Xjg4Pjgq/jgYzlvJXjgY3lh7rjgZXjgozjgabjgYTjgovmmYLjgavjgoLjgrPjg7Pjg4bjg7Pjg4Tjga/li5XjgY3jgb7jgZvjgpPjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fb25EcmFnID0gdGhpcy5fb25EcmFnLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25EcmFnU3RhcnQgPSB0aGlzLl9vbkRyYWdTdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uRHJhZ0VuZCA9IHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uU2Nyb2xsID0gdGhpcy5fb25TY3JvbGwuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX0lOSVRJQUwsIHRydWUpO1xuICAgIHRoaXMuX2hpZGUoKTsgLy8gRml4IGZvciB0cmFuc3BhcmVudCB0b29sYmFyIHRyYW5zaXRpb25zXG5cbiAgICBjb25zdCB7b25Db25uZWN0ZWQsIG9uRGlzY29ubmVjdGVkfSA9IHV0aWwuZGVmaW5lTGlzdGVuZXJQcm9wZXJ0eSh0aGlzLCAncHVsbCcpO1xuICAgIHRoaXMuX2Nvbm5lY3RPblB1bGwgPSBvbkNvbm5lY3RlZDtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25QdWxsID0gb25EaXNjb25uZWN0ZWQ7XG4gIH1cblxuICBfc2V0U3R5bGUoKSB7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyAncHgnO1xuICAgIHN0eWxlcih0aGlzLCB7IGhlaWdodCwgbGluZUhlaWdodDogaGVpZ2h0IH0pO1xuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9PT0gJycgJiYgdGhpcy5fc2hvdygpO1xuICB9XG5cbiAgX29uU2Nyb2xsKGV2ZW50KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX3BhZ2VFbGVtZW50O1xuXG4gICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wIDwgMCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH1cbiAgfVxuXG4gIF9jYW5Db25zdW1lR2VzdHVyZShnZXN0dXJlKSB7XG4gICAgcmV0dXJuIGdlc3R1cmUuZGlyZWN0aW9uID09PSAndXAnIHx8IGdlc3R1cmUuZGlyZWN0aW9uID09PSAnZG93bic7XG4gIH1cblxuICBfb25EcmFnU3RhcnQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50Lmdlc3R1cmUgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcFkgPSBldmVudC5nZXN0dXJlLmNlbnRlci5jbGllbnRZICsgdGhpcy5fcGFnZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IG1heFkgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgLy8gT25seSB1c2UgZHJhZ3MgdGhhdCBzdGFydCBuZWFyIHRoZSBwdWxsSG9vayB0byByZWR1Y2UgZmxpY2tlcmluZ3NcbiAgICBjb25zdCBkcmFnZ2FibGVBcmVhUmF0aW8gPSAxO1xuXG4gICAgdGhpcy5faWdub3JlRHJhZyA9IGV2ZW50LmNvbnN1bWVkIHx8ICh0YXBZID4gbWF4WSAqIGRyYWdnYWJsZUFyZWFSYXRpbyk7XG5cbiAgICBpZiAoIXRoaXMuX2lnbm9yZURyYWcpIHtcbiAgICAgIGNvbnN0IGNvbnN1bWUgPSBldmVudC5jb25zdW1lO1xuICAgICAgZXZlbnQuY29uc3VtZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3VtZSAmJiBjb25zdW1lKCk7XG4gICAgICAgIHRoaXMuX2lnbm9yZURyYWcgPSB0cnVlO1xuICAgICAgICAvLyBUaGlzIGVsZW1lbnRzIHJlc2l6ZXMgLnBhZ2VfX2NvbnRlbnQgc28gaXQgaXMgc2FmZXJcbiAgICAgICAgLy8gdG8gaGlkZSBpdCB3aGVuIG90aGVyIGNvbXBvbmVudHMgYXJlIGRyYWdnZWQuXG4gICAgICAgIHRoaXMuX2hpZGUoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLl9jYW5Db25zdW1lR2VzdHVyZShldmVudC5nZXN0dXJlKSkge1xuICAgICAgICBjb25zdW1lICYmIGNvbnN1bWUoKTtcbiAgICAgICAgZXZlbnQuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9zaG93KCk7IC8vIE5vdCBlbm91Z2ggZHVlIHRvICdkcmFnTG9ja0F4aXMnXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhcnRTY3JvbGwgPSB0aGlzLl9wYWdlRWxlbWVudC5zY3JvbGxUb3A7XG4gIH1cblxuICBfb25EcmFnKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5nZXN0dXJlIHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5faWdub3JlRHJhZyB8fCAhdGhpcy5fY2FuQ29uc3VtZUdlc3R1cmUoZXZlbnQuZ2VzdHVyZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOZWNlc3NhcnkgZHVlIHRvICdkcmFnTG9ja0F4aXMnICgyNXB4KVxuICAgIGlmICh0aGlzLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgdGhpcy5fc2hvdygpO1xuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgdGFwWSA9IGV2ZW50Lmdlc3R1cmUuY2VudGVyLmNsaWVudFkgKyB0aGlzLl9wYWdlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgY29uc3QgbWF4WSA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgIGNvbnN0IHNjcm9sbCA9IE1hdGgubWF4KGV2ZW50Lmdlc3R1cmUuZGVsdGFZIC0gdGhpcy5fc3RhcnRTY3JvbGwsIDApO1xuICAgIGlmIChzY3JvbGwgIT09IHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbikge1xuXG4gICAgICBjb25zdCB0aCA9IHRoaXMudGhyZXNob2xkSGVpZ2h0O1xuICAgICAgaWYgKHRoID4gMCAmJiBzY3JvbGwgPj0gdGgpIHtcbiAgICAgICAgZXZlbnQuZ2VzdHVyZS5zdG9wRGV0ZWN0KCk7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9maW5pc2goKSk7XG5cbiAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsID49IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX1BSRUFDVElPTik7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX0lOSVRJQUwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmFuc2xhdGVUbyhzY3JvbGwpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRyYWdFbmQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50Lmdlc3R1cmUgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLl9pZ25vcmVEcmFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5fY3VycmVudFRyYW5zbGF0aW9uID4gMCkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gdGhpcy5fY3VycmVudFRyYW5zbGF0aW9uO1xuXG4gICAgICBpZiAoc2Nyb2xsID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl90cmFuc2xhdGVUbygwLCB7YW5pbWF0ZTogdHJ1ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25BY3Rpb25cbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgYGFjdGlvbmAgc3RhdGUgaWYgaXQgZXhpc3RzLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBnaXZlbiBhIGBkb25lYCBjYWxsYmFjayBhcyBpdHMgZmlyc3QgYXJndW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCBvbkFjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb25BY3Rpb247XG4gIH1cblxuICBzZXQgb25BY3Rpb24odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdGhyb3dUeXBlKCdvbkFjdGlvbicsICdmdW5jdGlvbiBvciBudWxsJyk7XG4gICAgfVxuICAgIHRoaXMuX29uQWN0aW9uID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9uUHVsbFxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBwdWxscyB0aGUgZWxlbWVudC4gSXQgZ2V0cyB0aGUgcHVsbGVkIGRpc3RhbmNlIHJhdGlvIChzY3JvbGwgLyBoZWlnaHQpIGFuZCBhbiBhbmltYXRpb25PcHRpb25zIG9iamVjdCBhcyBhcmd1bWVudHMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgX2ZpbmlzaCgpIHtcbiAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9BQ1RJT04pO1xuICAgIHRoaXMuX3RyYW5zbGF0ZVRvKHRoaXMuaGVpZ2h0LCB7YW5pbWF0ZTogdHJ1ZX0pO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMub25BY3Rpb24gfHwgKGRvbmUgPT4gZG9uZSgpKTtcbiAgICBhY3Rpb24oKCkgPT4ge1xuICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oMCwge2FuaW1hdGU6IHRydWV9KTtcbiAgICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX0lOSVRJQUwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBoZWlnaHRcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBoZWlnaHQgb2YgdGhlIHB1bGwgaG9vayBpbiBwaXhlbHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGA2NHB4YC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2V0IGhlaWdodCh2YWx1ZSkge1xuICAgIGlmICghdXRpbC5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICB0aHJvd1R5cGUoJ2hlaWdodCcsICdpbnRlZ2VyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke3ZhbHVlfXB4YCk7XG4gIH1cblxuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykgfHwgJzY0JywgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB0aHJlc2hvbGRIZWlnaHRcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSB0aHJlc2hvbGRIZWlnaHQgb2YgdGhlIHB1bGwgaG9vayBpbiBwaXhlbHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGA5NnB4YC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2V0IHRocmVzaG9sZEhlaWdodCh2YWx1ZSkge1xuICAgIGlmICghdXRpbC5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICB0aHJvd1R5cGUoJ3RocmVzaG9sZEhlaWdodCcsICdpbnRlZ2VyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RocmVzaG9sZC1oZWlnaHQnLCBgJHt2YWx1ZX1weGApO1xuICB9XG5cbiAgZ2V0IHRocmVzaG9sZEhlaWdodCgpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3RocmVzaG9sZC1oZWlnaHQnKSB8fCAnOTYnLCAxMCk7XG4gIH1cblxuICBfc2V0U3RhdGUoc3RhdGUsIG5vRXZlbnQpIHtcbiAgICBjb25zdCBsYXN0U3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3N0YXRlJywgc3RhdGUpO1xuXG4gICAgaWYgKCFub0V2ZW50ICYmIGxhc3RTdGF0ZSAhPT0gdGhpcy5zdGF0ZSkge1xuICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdjaGFuZ2VzdGF0ZScsIHtcbiAgICAgICAgcHVsbEhvb2s6IHRoaXMsXG4gICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgbGFzdFN0YXRlOiBsYXN0U3RhdGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc3RhdGVcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHN0YXRlIG9mIHRoZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwdWxsRGlzdGFuY2VcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgY3VycmVudCBudW1iZXIgb2YgcGl4ZWxzIHRoZSBwdWxsIGhvb2sgaGFzIG1vdmVkLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruODl+ODq+ODleODg+OCr+OBjOW8leOBjeWHuuOBleOCjOOBn+i3nembouOCkuODlOOCr+OCu+ODq+aVsOOAglsvamFdXG4gICAqL1xuICBnZXQgcHVsbERpc3RhbmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb247XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgX3Nob3coKSB7XG4gICAgLy8gUnVuIGFzeW5jcmhvbm91c2x5IHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIEFuaW1pdCdzIHN0eWxlIGNsZWFuXG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgaWYgKHRoaXMuX3BhZ2VFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX3BhZ2VFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IGAtJHt0aGlzLmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfaGlkZSgpIHtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKHRoaXMuX3BhZ2VFbGVtZW50KSB7XG4gICAgICB0aGlzLl9wYWdlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSAnJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHNjcm9sbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICovXG4gIF90cmFuc2xhdGVUbyhzY3JvbGwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gPT0gMCAmJiBzY3JvbGwgPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiA9IHNjcm9sbDtcbiAgICBjb25zdCBvcHQgPSBvcHRpb25zLmFuaW1hdGUgPyB7IGR1cmF0aW9uOiAuMywgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJyB9IDoge307XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdwdWxsJywgeyByYXRpbzogKHNjcm9sbCAvIHRoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpLCBhbmltYXRpb25PcHRpb25zOiBvcHQgfSk7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9ICB0aGlzLmhhc0F0dHJpYnV0ZSgnZml4ZWQtY29udGVudCcpID8gdGhpcyA6IHRoaXMuX3BhZ2VFbGVtZW50O1xuXG4gICAgYW5pbWl0KHNjcm9sbEVsZW1lbnQpXG4gICAgICAucXVldWUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwcHgsICR7c2Nyb2xsfXB4LCAwcHgpYCB9LCBvcHQpXG4gICAgICAucGxheSgoKSA9PiB7XG4gICAgICAgIHNjcm9sbCA9PT0gMCAmJiBzdHlsZXIuY2xlYXIoc2Nyb2xsRWxlbWVudCwgJ3RyYW5zaXRpb24gdHJhbnNmb3JtJyk7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvcHRpb25zLmNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBfZGlzYWJsZURyYWdMb2NrKCkgeyAvLyBlMmUgdGVzdHMgbmVlZCBpdFxuICAgIHRoaXMuX2RyYWdMb2NrRGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKHRydWUpO1xuICB9XG5cbiAgX3NldHVwTGlzdGVuZXJzKGFkZCkge1xuICAgIGNvbnN0IHNjcm9sbFRvZ2dsZSA9IGFjdGlvbiA9PiB0aGlzLl9wYWdlRWxlbWVudFtgJHthY3Rpb259RXZlbnRMaXN0ZW5lcmBdKCdzY3JvbGwnLCB0aGlzLl9vblNjcm9sbCwgZmFsc2UpO1xuICAgIGNvbnN0IGdkVG9nZ2xlID0gYWN0aW9uID0+IHtcbiAgICAgIGNvbnN0IHBhc3NpdmUgPSB7IHBhc3NpdmU6IHRydWUgfTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvclthY3Rpb25dKCdkcmFnJywgdGhpcy5fb25EcmFnLCBwYXNzaXZlKTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvclthY3Rpb25dKCdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCwgcGFzc2l2ZSk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3JbYWN0aW9uXSgnZHJhZ2VuZCcsIHRoaXMuX29uRHJhZ0VuZCwgcGFzc2l2ZSk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLl9nZXN0dXJlRGV0ZWN0b3IpIHtcbiAgICAgIGdkVG9nZ2xlKCdvZmYnKTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgPSBudWxsO1xuICAgIH1cbiAgICBzY3JvbGxUb2dnbGUoJ3JlbW92ZScpO1xuXG4gICAgaWYgKGFkZCkge1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbmV3IEdlc3R1cmVEZXRlY3Rvcih0aGlzLl9wYWdlRWxlbWVudCwge1xuICAgICAgICBkcmFnTWluRGlzdGFuY2U6IDEsXG4gICAgICAgIGRyYWdEaXN0YW5jZUNvcnJlY3Rpb246IGZhbHNlLFxuICAgICAgICBkcmFnTG9ja1RvQXhpczogIXRoaXMuX2RyYWdMb2NrRGlzYWJsZWQsXG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBnZFRvZ2dsZSgnb24nKTtcbiAgICAgIHNjcm9sbFRvZ2dsZSgnYWRkJyk7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fY3VycmVudFRyYW5zbGF0aW9uID0gMDtcbiAgICB0aGlzLl9wYWdlRWxlbWVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKHRydWUpO1xuICAgIHRoaXMuX3NldFN0eWxlKCk7XG5cbiAgICB0aGlzLl9jb25uZWN0T25QdWxsKCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9oaWRlKCk7XG4gICAgdGhpcy5fc2V0dXBMaXN0ZW5lcnMoZmFsc2UpO1xuXG4gICAgdGhpcy5fZGlzY29ubmVjdE9uUHVsbCgpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnaGVpZ2h0J107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnaGVpZ2h0JyAmJiB0aGlzLl9wYWdlRWxlbWVudCkge1xuICAgICAgdGhpcy5fc2V0U3R5bGUoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGV2ZW50cygpIHtcbiAgICByZXR1cm4gWydjaGFuZ2VzdGF0ZScsICdwdWxsJ107XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhQdWxsSG9va0VsZW1lbnQsIFsnZGlzYWJsZWQnLCAnZml4ZWQtY29udGVudCddKTtcblxub25zRWxlbWVudHMuUHVsbEhvb2sgPSBQdWxsSG9va0VsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1wdWxsLWhvb2snLCBQdWxsSG9va0VsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IEJhc2VJbnB1dEVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtaW5wdXQuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAncmFuZ2UtLSonLFxuICAnLnJhbmdlX19pbnB1dCc6ICdyYW5nZS0tKl9faW5wdXQnLFxuICAnLnJhbmdlX19mb2N1cy1yaW5nJzogJ3JhbmdlLS0qX19mb2N1cy1yaW5nJ1xufTtcblxuY29uc3QgYWN0aXZlQ2xhc3NUb2tlbiA9ICdyYW5nZV9faW5wdXQtLWFjdGl2ZSc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXJhbmdlXG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc2xpZGVyWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFJhbmdlIGlucHV0IGNvbXBvbmVudC4gVXNlZCB0byBkaXNwbGF5IGEgZHJhZ2dhYmxlIHNsaWRlci5cbiAqXG4gKiAgICAgV29ya3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBgPGlucHV0IHR5cGU9XCJyYW5nZVwiPmAgZWxlbWVudC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiB4WlFvbU1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9yYW5nZVxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtaW5wdXRcbiAqICAgW2VuXVRoZSBgPG9ucy1pbnB1dD5gIGNvbXBvbmVudCBpcyB1c2VkIHRvIGRpc3BsYXkgdGV4dCBpbnB1dHMsIHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1yYW5nZSB2YWx1ZT1cIjIwXCI+PC9vbnMtcmFuZ2U+XG4gKiA8b25zLXJhbmdlIG1vZGlmaWVyPVwibWF0ZXJpYWxcIiB2YWx1ZT1cIjEwXCI+PC9yYW5nZT5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYW5nZUVsZW1lbnQgZXh0ZW5kcyBCYXNlSW5wdXRFbGVtZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fb25Nb3VzZURvd24gPSB0aGlzLl9vbk1vdXNlRG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uTW91c2VVcCA9IHRoaXMuX29uTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uVG91Y2hTdGFydCA9IHRoaXMuX29uVG91Y2hTdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uVG91Y2hFbmQgPSB0aGlzLl9vblRvdWNoRW5kLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25JbnB1dCA9IHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uRHJhZ3N0YXJ0ID0gdGhpcy5fb25EcmFnc3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkRyYWdlbmQgPSB0aGlzLl9vbkRyYWdlbmQuYmluZCh0aGlzKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIHN1cGVyLl9jb21waWxlKCk7XG4gICAgdGhpcy5fdXBkYXRlRGlzYWJsZWQodGhpcy5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpO1xuICB9XG5cbiAgLyogSW5oZXJpdGVkIHByb3BzICovXG5cbiAgX3VwZGF0ZSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuX2lucHV0O1xuICAgIGNvbnN0IGZvY3VzUmluZyA9IHRoaXMuX2ZvY3VzUmluZztcblxuICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRTaXplID0gYCR7MTAwICogdGhpcy5fcmF0aW99JSAycHhgO1xuICAgIGZvY3VzUmluZy52YWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgICAvLyBOT1RFOiBcIl96ZXJvXCIgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENTUyBzdHlsaW5nLlxuICAgIGlmICgoaW5wdXQubWluID09PSAnJyAmJiBpbnB1dC52YWx1ZSA9PT0gJzAnKSB8fCBpbnB1dC5taW4gPT09IGlucHV0LnZhbHVlKSB7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ196ZXJvJywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ196ZXJvJyk7XG4gICAgfVxuXG4gICAgWydtaW4nLCAnbWF4J10uZm9yRWFjaChhdHRyID0+IGZvY3VzUmluZ1thdHRyXSA9IGlucHV0W2F0dHJdKTtcbiAgfVxuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX3RlbXBsYXRlKCkge1xuICAgIHJldHVybiBgXG4gICAgICA8aW5wdXQgdHlwZT1cIiR7dGhpcy50eXBlfVwiIGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9faW5wdXRcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cInJhbmdlX19mb2N1cy1yaW5nXCIgdGFiSW5kZXg9XCItMVwiPlxuICAgIGA7XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdyYW5nZSc7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3JhbmdlJztcbiAgfVxuXG4gIC8qIE93biBwcm9wcyAqL1xuXG4gIF9vbk1vdXNlRG93bihlKSB7XG4gICAgdGhpcy5faW5wdXQuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzc1Rva2VuKTtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5faW5wdXQuZm9jdXMoKSk7XG4gIH1cblxuICBfb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLl9vbk1vdXNlRG93bigpO1xuICB9XG5cbiAgX29uTW91c2VVcChlKSB7XG4gICAgdGhpcy5faW5wdXQuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc1Rva2VuKTtcbiAgfVxuXG4gIF9vblRvdWNoRW5kKGUpIHtcbiAgICB0aGlzLl9vbk1vdXNlVXAoZSk7XG4gIH1cblxuICBfb25EcmFnc3RhcnQoZSkge1xuICAgIGUuY29uc3VtZWQgPSB0cnVlO1xuICAgIGUuZ2VzdHVyZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLl9pbnB1dC5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzVG9rZW4pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMuX29uRHJhZyk7XG4gIH1cblxuICBfb25EcmFnKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgX29uRHJhZ2VuZChlKSB7XG4gICAgdGhpcy5faW5wdXQuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc1Rva2VuKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLl9vbkRyYWcpO1xuICB9XG5cbiAgZ2V0IF9mb2N1c1JpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMV07XG4gIH1cblxuICBnZXQgX3JhdGlvKCkge1xuICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgcmF0aW8uXG4gICAgY29uc3QgbWluID0gdGhpcy5faW5wdXQubWluID09PSAnJyA/IDAgOiBwYXJzZUludCh0aGlzLl9pbnB1dC5taW4pO1xuICAgIGNvbnN0IG1heCA9IHRoaXMuX2lucHV0Lm1heCA9PT0gJycgPyAxMDAgOiBwYXJzZUludCh0aGlzLl9pbnB1dC5tYXgpO1xuXG4gICAgcmV0dXJuICh0aGlzLnZhbHVlIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnZGlzYWJsZWQnLCAuLi5CYXNlSW5wdXRFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlc107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICB0aGlzLl91cGRhdGVEaXNhYmxlZChjdXJyZW50KTtcbiAgICB9XG4gICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWRcbiAgICovXG4gIF91cGRhdGVEaXNhYmxlZChkaXNhYmxlZCkge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdyYW5nZS0tZGlzYWJsZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKCdyYW5nZS0tZGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyh0cnVlKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKGZhbHNlKTtcbiAgfVxuXG4gIF9zZXR1cExpc3RlbmVycyhhZGQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSAoYWRkID8gJ2FkZCcgOiAncmVtb3ZlJykgKyAnRXZlbnRMaXN0ZW5lcic7XG4gICAgdXRpbFthY3Rpb25dKHRoaXMsICd0b3VjaHN0YXJ0JywgdGhpcy5fb25Ub3VjaFN0YXJ0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgdGhpc1thY3Rpb25dKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93bik7XG4gICAgdGhpc1thY3Rpb25dKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwKTtcbiAgICB0aGlzW2FjdGlvbl0oJ3RvdWNoZW5kJywgdGhpcy5fb25Ub3VjaEVuZCk7XG4gICAgdGhpc1thY3Rpb25dKCdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdzdGFydCk7XG4gICAgdGhpc1thY3Rpb25dKCdkcmFnZW5kJywgdGhpcy5fb25EcmFnZW5kKTtcbiAgICB0aGlzW2FjdGlvbl0oJ2lucHV0JywgdGhpcy5fb25JbnB1dCk7XG4gIH1cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgdmFsdWUuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZm9jdXNcbiAgICogQHNpZ25hdHVyZSBmb2N1cygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Gb2N1c2VzIHRoZSByYW5nZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBibHVyXG4gICAqIEBzaWduYXR1cmUgYmx1cigpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZW1vdmVzIGZvY3VzIGZyb20gdGhlIHJhbmdlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xufVxuXG5vbnNFbGVtZW50cy5SYW5nZSA9IFJhbmdlRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXJhbmdlJywgUmFuZ2VFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1yb3dcbiAqIEBjYXRlZ29yeSBncmlkXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJlcHJlc2VudHMgYSByb3cgaW4gdGhlIGdyaWQgc3lzdGVtLiBVc2Ugd2l0aCBgPG9ucy1jb2w+YCB0byBsYXlvdXQgY29tcG9uZW50cy5bL2VuXVxuICogICBbamFd44Kw44Oq44OD44OJ44K344K544OG44Og44Gr44Gm6KGM44KS5a6a576p44GX44G+44GZ44CCb25zLWNvbOOBqOOBqOOCguOBq+S9v+eUqOOBl+OAgeOCs+ODs+ODneODvOODjeODs+ODiOOBrumFjee9ruOBq+S9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBHZ3VqQyB7d2lkZX1cbiAqIEBndWlkZSBmZWF0dXJlcy5odG1sXG4gKiAgIFtlbl1MYXlvdXRpbmcgZ3VpZGVbL2VuXVxuICogICBbamFd44Os44Kk44Ki44Km44OI6Kq/5pW0Wy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1jb2xcbiAqICAgW2VuXVRoZSBgPG9ucy1jb2w+YCBjb21wb25lbnQgaXMgdXNlZCBhcyBjaGlsZHJlbiBvZiBgPG9ucy1yb3c+YC5bL2VuXVxuICogICBbamFdb25zLWNvbOOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAbm90ZVxuICogICBbZW5dRm9yIEFuZHJvaWQgNC4zIGFuZCBlYXJsaWVyLCBhbmQgaU9TNiBhbmQgZWFybGllciwgd2hlbiB1c2luZyBtaXhlZCBhbGlnbm1lbnQgd2l0aCBvbnMtcm93IGFuZCBvbnMtY29sLCB0aGV5IG1heSBub3QgYmUgZGlzcGxheWVkIGNvcnJlY3RseS4gWW91IGNhbiB1c2Ugb25seSBvbmUgdmVydGljYWwtYWxpZ24uWy9lbl1cbiAqICAgW2phXUFuZHJvaWQgNC4z5Lul5YmN44CB44KC44GX44GP44GvaU9TIDbku6XliY3jga5PU+OBruWgtOWQiOOAgW9ucy1yb3fjgahvbnMtY29s44KS57WE44G/5ZCI44KP44Gb44Gm44Gd44KM44Ge44KM44Gub25zLWNvbOimgee0oOOBrnZlcnRpY2FsLWFsaWdu5bGe5oCn44Gu5YCk44Gr5Yil44CF44Gu5YCk44KS5oyH5a6a44GZ44KL44Go44CB5o+P55S744GM5bSp44KM44KL5aC05ZCI44GM44GC44KK44G+44GZ44CCdmVydGljYWwtYWxpZ27lsZ7mgKfjga7lgKTjgavjga/kuIDjgaTjga7lgKTjgaDjgZHjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcm93PlxuICogICA8b25zLWNvbCB3aWR0aD1cIjUwcHhcIj48b25zLWljb24gaWNvbj1cImZhLXR3aXR0ZXJcIj48L29ucy1pY29uPjwvb25zLWNvbD5cbiAqICAgPG9ucy1jb2w+VGV4dDwvb25zLWNvbD5cbiAqIDwvb25zLXJvdz5cbiAqL1xuXG4vKipcbiAqIEBhdHRyaWJ1dGUgdmVydGljYWwtYWxpZ25cbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVNob3J0IGhhbmQgYXR0cmlidXRlIGZvciBhbGlnbmluZyB2ZXJ0aWNhbGx5LiBWYWxpZCB2YWx1ZXMgYXJlIHRvcCwgYm90dG9tLCBhbmQgY2VudGVyLlsvZW5dXG4gKiAgIFtqYV3nuKbjgavmlbTliJfjgZnjgovjgZ/jgoHjgavmjIflrprjgZfjgb7jgZnjgIJ0b3DjgIFib3R0b23jgIFjZW50ZXLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvd0VsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG59XG5cbm9uc0VsZW1lbnRzLlJvdyA9IFJvd0VsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1yb3cnLCBSb3dFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnc2VnbWVudCc7XG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAnc2VnbWVudC0tKicsXG4gICcuc2VnbWVudF9faXRlbSc6ICdzZWdtZW50LS0qX19pdGVtJyxcbiAgJy5zZWdtZW50X19pbnB1dCc6ICdzZWdtZW50LS0qX19pbnB1dCcsXG4gICcuc2VnbWVudF9fYnV0dG9uJzogJ3NlZ21lbnQtLSpfX2J1dHRvbidcbn07XG5cbmNvbnN0IGdlbmVyYXRlSWQgPSAoKCkgPT4ge1xuICBsZXQgaSA9IDA7XG4gIHJldHVybiAoKSA9PiAnb25zLXNlZ21lbnQtZ2VuLScgKyAoaSsrKTtcbn0pKCk7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNlZ21lbnRcbiAqIEBjYXRlZ29yeSBjb250cm9sXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiBzZWdtZW50Wy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFNlZ21lbnQgY29tcG9uZW50LiBVc2UgdGhpcyBjb21wb25lbnQgdG8gaGF2ZSBhIGJ1dHRvbiBiYXIgd2l0aCBhdXRvbWF0aWMgc3R5bGVzIHRoYXQgc3dpdGNoIG9uIGNsaWNrIG9mIGFub3RoZXIgYnV0dG9uLlxuICpcbiAqICAgICBXaWxsIGF1dG9tYXRpY2FsbHkgZGlzcGxheSBhcyBhIE1hdGVyaWFsIERlc2lnbiBzZWdtZW50IG9uIEFuZHJvaWQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4gaExheXhcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zZWdtZW50XG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI21vZGlmaWVycyBbZW5dTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBgbW9kaWZpZXJgIGF0dHJpYnV0ZVsvZW5dW2phXW1vZGlmaWVy5bGe5oCn44Gu5L2/44GE5pa5Wy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjY3Jvc3MtcGxhdGZvcm0tc3R5bGluZy1hdXRvc3R5bGluZyBbZW5dSW5mb3JtYXRpb24gYWJvdXQgY3Jvc3MgcGxhdGZvcm0gc3R5bGluZ1svZW5dW2phXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc2VnbWVudD5cbiAqICAgPG9ucy1idXR0b24+TGFiZWwgMTwvb25zLWJ1dHRvbj5cbiAqICAgPG9ucy1idXR0b24+TGFiZWwgMjwvb25zLWJ1dHRvbj5cbiAqICAgPG9ucy1idXR0b24+TGFiZWwgMzwvb25zLWJ1dHRvbj5cbiAqIDwvb25zLXNlZ21lbnQ+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VnbWVudEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0Y2hhbmdlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlcyBhZnRlciB0aGUgYWN0aXZlIGJ1dHRvbiBpcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXVRhcHBlZCBidXR0b24gaW5kZXguWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNlZ21lbnRJdGVtXG4gICAqICAgW2VuXVNlZ21lbnQgaXRlbSBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHNlZ21lbnQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB0YWJiYXItaWRcbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlEIG9mIHRoZSB0YWJiYXIgZWxlbWVudCB0byBcImNvbm5lY3RcIiB0byB0aGUgc2VnbWVudC4gTXVzdCBiZSBpbnNpZGUgdGhlIHNhbWUgcGFnZS5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFjdGl2ZS1pbmRleFxuICAgKiBAZGVmYXVsdCAwXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUluZGV4IG9mIHRoZSBhY3RpdmUgYnV0dG9uLiBJZiBhIHRhYmJhciBpcyBjb25uZWN0ZWQsIHRoaXMgd2lsbCBiZSBzZXQgdG8gdGhlIHRhYmJhcidzIGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWN0aXZlSW5kZXhcbiAgICogQGRlZmF1bHQgMFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JbmRleCBvZiB0aGUgYWN0aXZlIGJ1dHRvbi4gSWYgYSB0YWJiYXIgaXMgY29ubmVjdGVkLCB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZSB0YWJiYXIncyBhY3RpdmUgaW5kZXguWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBzZWdtZW50IHNob3VsZCBiZSBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg5zjgr/jg7PjgpLnhKHlirnljJbjgZnjgovloLTlkIjjga/mjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9zZWdtZW50SWQgPSBnZW5lcmF0ZUlkKCk7XG4gICAgdGhpcy5fdGFiYmFyID0gbnVsbDtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25UYWJiYXJQcmVDaGFuZ2UgPSB0aGlzLl9vblRhYmJhclByZUNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSB0aGlzLl90YWJiYXIgPyB0aGlzLl90YWJiYXIuZ2V0QWN0aXZlVGFiSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlQnV0dG9uSW5kZXgoKSk7XG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzZWdtZW50X19pdGVtJyk7XG5cbiAgICAgIGNvbnN0IGlucHV0ID0gdXRpbC5maW5kQ2hpbGQoaXRlbSwgJy5zZWdtZW50X19pbnB1dCcpIHx8IHV0aWwuY3JlYXRlKCdpbnB1dC5zZWdtZW50X19pbnB1dCcpO1xuICAgICAgaW5wdXQudHlwZSA9ICdyYWRpbyc7XG4gICAgICBpbnB1dC52YWx1ZSA9IGluZGV4O1xuICAgICAgaW5wdXQubmFtZSA9IGlucHV0Lm5hbWUgfHwgdGhpcy5fc2VnbWVudElkO1xuICAgICAgaW5wdXQuY2hlY2tlZCA9ICF0aGlzLmhhc0F0dHJpYnV0ZSgndGFiYmFyLWlkJykgJiYgaW5kZXggPT09ICh0aGlzLmFjdGl2ZUluZGV4IHx8IDApO1xuXG4gICAgICBjb25zdCBidXR0b24gPSB1dGlsLmZpbmRDaGlsZChpdGVtLCAnLnNlZ21lbnRfX2J1dHRvbicpIHx8IHV0aWwuY3JlYXRlKCcuc2VnbWVudF9fYnV0dG9uJyk7XG4gICAgICBpZiAoYnV0dG9uLnBhcmVudEVsZW1lbnQgIT09IGl0ZW0pIHtcbiAgICAgICAgd2hpbGUgKGl0ZW0uZmlyc3RDaGlsZCkge1xuICAgICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChpdGVtLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgICAgaXRlbS5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ3RhYmJhci1pZCcpKSB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSB1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy1wYWdlJyk7XG4gICAgICAgIHRoaXMuX3RhYmJhciA9IHBhZ2UgJiYgcGFnZS5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMuZ2V0QXR0cmlidXRlKCd0YWJiYXItaWQnKSk7XG4gICAgICAgIGlmICghdGhpcy5fdGFiYmFyIHx8IHRoaXMuX3RhYmJhci50YWdOYW1lICE9PSAnT05TLVRBQkJBUicpIHtcbiAgICAgICAgICB1dGlsLnRocm93KGBObyB0YWJiYXIgd2l0aCBpZCAke3RoaXMuZ2V0QXR0cmlidXRlKCd0YWJiYXItaWQnKX0gd2FzIGZvdW5kLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGFiYmFyLnNldEF0dHJpYnV0ZSgnaGlkZS10YWJzJywgJycpO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fdGFiYmFyLmdldEFjdGl2ZVRhYkluZGV4KCk7XG4gICAgICAgICAgdGhpcy5fc2V0Q2hlY2tlZChpbmRleCk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl90YWJiYXIuYWRkRXZlbnRMaXN0ZW5lcigncHJlY2hhbmdlJywgdGhpcy5fb25UYWJiYXJQcmVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9vbkNoYW5nZSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3RhYmJhcikge1xuICAgICAgICB0aGlzLl90YWJiYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJlY2hhbmdlJywgdGhpcy5fb25UYWJiYXJQcmVDaGFuZ2UpO1xuICAgICAgICB0aGlzLl90YWJiYXIgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICB9XG5cbiAgX3NldENoZWNrZWQoaW5kZXgpIHtcbiAgICB0aGlzLmNoaWxkcmVuW2luZGV4XS5maXJzdEVsZW1lbnRDaGlsZC5jaGVja2VkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldEFjdGl2ZUJ1dHRvblxuICAgKiBAc2lnbmF0dXJlIHNldEFjdGl2ZUJ1dHRvbihpbmRleCwgW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogICBbZW5dQnV0dG9uIGluZGV4LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdCwgd29ya3Mgb25seSBpZiB0aGVyZSBpcyBhIGNvbm5lY3RlZCB0YWJiYXIuIFN1cHBvcnRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgYG9ucy10YWJiYXJgJ3MgYHNldEFjdGl2ZVRhYmAgbWV0aG9kLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1NYWtlIGJ1dHRvbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggYWN0aXZlLiBJZiB0aGVyZSBpcyBhIGNvbm5lY3RlZCB0YWJiYXIgaXQgc2hvd3MgdGhlIGNvcnJlc3BvbmRpbmcgdGFiIHBhZ2UuIEluIHRoaXMgY2FzZSBhbmltYXRpb25zIGFuZCB0aGVpciBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIHNlbGVjdGVkIGluZGV4IG9yIHRvIHRoZSBuZXcgcGFnZSBlbGVtZW50IGlmIHRoZXJlIGlzIGEgY29ubmVjdGVkIHRhYmJhci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2V0QWN0aXZlQnV0dG9uKGluZGV4LCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX3RhYmJhcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3RhYmJhci5zZXRBY3RpdmVUYWIoaW5kZXgsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuX3NldENoZWNrZWQoaW5kZXgpO1xuICAgIHRoaXMuX3Bvc3RDaGFuZ2UoaW5kZXgpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZ2V0QWN0aXZlQnV0dG9uSW5kZXhcbiAgICogQHNpZ25hdHVyZSBnZXRBY3RpdmVCdXR0b25JbmRleCgpXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICogICBbZW5dVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGJ1dHRvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyBidXR0b24gaW5kZXggb2YgY3VycmVudCBhY3RpdmUgYnV0dG9uLiBJZiBhY3RpdmUgYnV0dG9uIGlzIG5vdCBmb3VuZCwgcmV0dXJucyAtMS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0QWN0aXZlQnV0dG9uSW5kZXgoKSB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsgLy8gQXJyYXkuZmluZEluZGV4XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbltpXS5maXJzdEVsZW1lbnRDaGlsZC5jaGVja2VkKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBfb25DaGFuZ2UoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLl90YWJiYXJcbiAgICAgID8gdGhpcy5fdGFiYmFyLnNldEFjdGl2ZVRhYih0aGlzLmdldEFjdGl2ZUJ1dHRvbkluZGV4KCksIHsgcmVqZWN0OiBmYWxzZSB9KVxuICAgICAgOiB0aGlzLl9wb3N0Q2hhbmdlKHRoaXMuZ2V0QWN0aXZlQnV0dG9uSW5kZXgoKSk7XG4gIH1cblxuICBfb25UYWJiYXJQcmVDaGFuZ2UoZXZlbnQpIHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgaWYgKCFldmVudC5kZXRhaWwuY2FuY2VsZWQpIHtcbiAgICAgICAgdGhpcy5fc2V0Q2hlY2tlZChldmVudC5pbmRleCk7XG4gICAgICAgIHRoaXMuX3Bvc3RDaGFuZ2UoZXZlbnQuaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3Bvc3RDaGFuZ2UoaW5kZXgpIHtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3Bvc3RjaGFuZ2UnLCB7XG4gICAgICBpbmRleCxcbiAgICAgIGFjdGl2ZUluZGV4OiBpbmRleCxcbiAgICAgIGxhc3RBY3RpdmVJbmRleDogdGhpcy5fbGFzdEFjdGl2ZUluZGV4LFxuICAgICAgc2VnbWVudEl0ZW06IHRoaXMuY2hpbGRyZW5baW5kZXhdXG4gICAgfSk7XG4gICAgdGhpcy5fbGFzdEFjdGl2ZUluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIHNlZ21lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIGdldCBhY3RpdmVJbmRleCgpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcpKTtcbiAgfVxuXG4gIHNldCBhY3RpdmVJbmRleCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYWN0aXZlLWluZGV4JywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2NsYXNzJywgJ21vZGlmaWVyJywgJ2FjdGl2ZS1pbmRleCddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FjdGl2ZS1pbmRleCc6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0QWN0aXZlQnV0dG9uSW5kZXgoKSAhPT0gdGhpcy5hY3RpdmVJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVCdXR0b24odGhpcy5hY3RpdmVJbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncG9zdGNoYW5nZSddO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoU2VnbWVudEVsZW1lbnQsIFsnZGlzYWJsZWQnXSk7XG5cbm9uc0VsZW1lbnRzLlNlZ21lbnQgPSBTZWdtZW50RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNlZ21lbnQnLCBTZWdtZW50RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAnc2VsZWN0LSogc2VsZWN0LS0qJyxcbiAgJy5zZWxlY3QtaW5wdXQnOiAnc2VsZWN0LWlucHV0LS0qJ1xufTtcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdzZWxlY3QnO1xuXG5jb25zdCBJTlBVVF9BVFRSSUJVVEVTID0gW1xuICAnYXV0b2ZvY3VzJyxcbiAgJ2Rpc2FibGVkJyxcbiAgJ2Zvcm0nLFxuICAnbXVsdGlwbGUnLFxuICAnbmFtZScsXG4gICdyZXF1aXJlZCcsXG4gICdzaXplJ1xuXTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtc2VsZWN0XG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgW2VuXURpc3BsYXlzIGEgTWF0ZXJpYWwgRGVzaWduIHNlbGVjdCBpbnB1dC5bL2VuXVxuICogIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIHVuZGVyYmFyXG4gKiAgW2VuXURpc3BsYXlzIGEgaG9yaXpvbnRhbCBsaW5lIHVuZGVybmVhdGggYSBzZWxlY3QgaW5wdXQuWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgU2VsZWN0IGNvbXBvbmVudC4gSWYgeW91IHdhbnQgdG8gcGxhY2UgYSBzZWxlY3Qgd2l0aCBhbiBJRCBvZiBgbXktaWRgIG9uIGEgcGFnZSwgdXNlIGA8b25zLXNlbGVjdCBzZWxlY3QtaWQ9XCJteS1pZFwiPmAuXG4gKlxuICogICAgIFRoZSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgYXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VsZWN0IG9uIEFuZHJvaWQuXG4gKlxuICogICAgIE1vc3QgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBhIG5vcm1hbCBgPHNlbGVjdD5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtc2VsZWN0PmAgZWxlbWVudC5cbiAqICAgWy9lbl1cbiAqICAgW2phXeOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOCkuihqOekuuOBmeOCi+OCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAgmBzZWxlY3RgIOimgee0oOOBq+S9v+eUqOOBp+OBjeOCi+WxnuaAp+OBruWkmuOBj+OBjCBgb25zLXNlbGVjdGAg6KaB57Sg44Gn44KC5Yip55So44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIGhMYXl4XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2Uvc2VsZWN0XG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI21vZGlmaWVycyBbZW5dTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBgbW9kaWZpZXJgIGF0dHJpYnV0ZVsvZW5dW2phXW1vZGlmaWVy5bGe5oCn44Gu5L2/44GE5pa5Wy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjY3Jvc3MtcGxhdGZvcm0tc3R5bGluZy1hdXRvc3R5bGluZyBbZW5dSW5mb3JtYXRpb24gYWJvdXQgY3Jvc3MgcGxhdGZvcm0gc3R5bGluZ1svZW5dW2phXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc2VsZWN0PlxuICogICA8b3B0aW9uIHZhbHVlPVwiMVwiPjE8L29wdGlvbj5cbiAqICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj4ybmQ8L29wdGlvbj5cbiAqICAgPG9wdGlvbiB2YWx1ZT1cIjNcIj4zcmQgb3B0aW9uPC9vcHRpb24+XG4gKiA8L29ucy1zZWxlY3Q+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0RWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhdXRvZm9jdXNcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUVsZW1lbnQgYXV0b21hdGljYWxseSBnYWlucyBmb2N1cyBvbiBwYWdlIGxvYWQuWy9lbl1cbiAgICogIFtqYV3jg5rjg7zjgrjjg63jg7zjg4nmmYLjgavjgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgavjg5Xjgqnjg7zjgqvjgrnjgYznp7vjgovjgojjgYbjgavjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgc2VsZWN0IGlucHV0IHNob3VsZCBiZSBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgpLnhKHlirnljJbjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBmb3JtXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Bc3NvY2lhdGUgYSBzZWxlY3QgZWxlbWVudCB0byBhbiBleGlzdGluZyBmb3JtIG9uIHRoZSBwYWdlLCBldmVuIGlmIG5vdCBuZXN0ZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544KS44CB5oyH5a6a44GX44GfIGBmb3JtYCDopoHntKDjgavntJDku5jjgZHjgb7jgZnjgILjgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgpIgYGZvcm1gIOimgee0oOOBruWkluWBtOOBq+mFjee9ruOBmeOCi+mam+OBq+S9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG11bHRpcGxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCBhdCBvbmNlLlsvZW5dXG4gICAqICBbamFd6YG45oqe6IKi44Gu6KSH5pWw6YG45oqe44KS5pyJ5Yq544Gr44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbmFtZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTmFtZSB0aGUgc2VsZWN0IGVsZW1lbnQsIHVzZWZ1bCBmb3IgaW5zdGFuY2UgaWYgaXQgaXMgcGFydCBvZiBhIGZvcm0uWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544Gu5ZCN5YmN44KS5oyH5a6a44GX44G+44GZ44CC6YCa5bi4IGBmb3JtYCDopoHntKDjgajlhbHjgavkvb/nlKjjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSByZXF1aXJlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU1ha2UgdGhlIHNlbGVjdCBpbnB1dCByZXF1aXJlZCBmb3Igc3VibWl0dGluZyB0aGUgZm9ybSBpdCBpcyBwYXJ0IG9mLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOCkuWFpeWKm+W/hemgiOOBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAgumAmuW4uCBgZm9ybWAg6KaB57Sg44Go5YWx44Gr5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc2VsZWN0LWlkXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JRCBnaXZlbiB0byB0aGUgaW5uZXIgc2VsZWN0LCB1c2VmdWwgZm9yIGR5bmFtaWMgbWFuaXB1bGF0aW9uLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOBjOWGhemDqOOBq+aMgeOBpCBzZWxlY3Qg6KaB57Sg44Gr5LiO44GI44KLIElEIOOCkuaMh+WumuOBl+OBvuOBmeOAguOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOBruWGheWuueOCkuWLleeahOOBq+WkieabtOOBmeOCi+W/heimgeOBjOOBguOCi+WgtOWQiOOBq+S9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNpemVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSG93IG1hbnkgb3B0aW9ucyBhcmUgZGlzcGxheWVkOyBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIHRoZSBzaXplIHRoZW4gYSBzY3JvbGwgYXBwZWFycyB0byBuYXZpZ2F0ZSB0aGVtLlsvZW5dXG4gICAqICAgW2phXeS4gOW6puOBq+ihqOekuuOBmeOCi+mBuOaKnuiCouOBruWAi+aVsOOCkuaMh+WumuOBl+OBvuOBmeOAgumBuOaKnuiCouOBjOOBk+OBruWxnuaAp+OBp+aMh+WumuOBl+OBn+WAi+aVsOOCiOOCiuOCguWkmuOBhOWgtOWQiOOAgeOCueOCr+ODreODvOODq+OBjOacieWKueOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcblxuICAgIHRoaXMuX2Rlcml2ZUdldHRlcnMoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJywgLi4uSU5QVVRfQVRUUklCVVRFU107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChJTlBVVF9BVFRSSUJVVEVTLmluZGV4T2YobmFtZSkgPj0gMCkge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZUJvdW5kQXR0cmlidXRlcygpKTtcbiAgICB9XG4gIH1cblxuICBnZXQgX3NlbGVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcbiAgfVxuXG4gIF91cGRhdGVCb3VuZEF0dHJpYnV0ZXMoKSB7XG4gICAgSU5QVVRfQVRUUklCVVRFUy5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoYXR0cikpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0LnNldEF0dHJpYnV0ZShhdHRyLCB0aGlzLmdldEF0dHJpYnV0ZShhdHRyKSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbGVuZ3RoXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1OdW1iZXIgb2Ygb3B0aW9ucyBpbiB0aGUgc2VsZWN0IGJveC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgavlkKvjgb7jgozjgovpgbjmip7ogqLjga7lgIvmlbDjgpLov5TjgZfjgb7jgZnjgIIgYHNlbGVjdGAg6KaB57SgWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TZXZlcmFsIG9wdGlvbnMgZm9yIGhhbmRsaW5nIHRoZSBzZWxlY3QgRE9NIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgavlkKvjgb7jgozjgosgYG9wdGlvbmAg6KaB57Sg44Gu6YWN5YiX44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBzZWxlY3RlZEluZGV4XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JbmRleCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjpgbjmip7jgZXjgozjgabjgYTjgovpgbjmip7ogqLjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1WYWx1ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjpgbjmip7jgZXjgozjgabjgYTjgovpgbjmip7ogqLjga7lgKTjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5fc2VsZWN0IHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuICAgIGlmICghc2VsLmlkICYmIHRoaXMuaGFzQXR0cmlidXRlKCdzZWxlY3QtaWQnKSkge1xuICAgICAgc2VsLmlkID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NlbGVjdC1pZCcpO1xuICAgIH1cbiAgICBzZWwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0LWlucHV0Jyk7XG4gICAgaWYgKCF0aGlzLl9zZWxlY3QpIHtcbiAgICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2hpbGROb2RlcykuZm9yRWFjaChlbGVtZW50ID0+IHNlbC5hcHBlbmRDaGlsZChlbGVtZW50KSk7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHNlbCk7XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgX2Rlcml2ZUdldHRlcnMoKSB7XG4gICAgWydkaXNhYmxlZCcsICdsZW5ndGgnLCAnbXVsdGlwbGUnLCAnbmFtZScsICdvcHRpb25zJywgJ3NlbGVjdGVkSW5kZXgnLCAnc2l6ZScsICd2YWx1ZScsICdmb3JtJywgJ3R5cGUnXVxuICAgICAgLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5fc2VsZWN0W2tleV0sXG4gICAgICAgICAgc2V0OiBbJ2Zvcm0nLCAndHlwZSddLmluZGV4T2Yoa2V5KSA9PT0gLTFcbiAgICAgICAgICAgID8gdmFsdWUgPT4gY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3NlbGVjdFtrZXldID0gdmFsdWUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYWRkKG9wdGlvbiwgaW5kZXggPSBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0LmFkZChvcHRpb24sIGluZGV4KTtcbiAgfVxuXG4gIC8vIElmIGNhbGxlZCB3aXRoIGFuIGluZGV4IGFyZ3VtZW50LCByZW1vdmVzIHRoZSBvcHRpb24gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBpbmRleC5cbiAgLy8gSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCByZW1vdmVzIHRoaXMuXG4gIC8vIFRoaXMgYmVoYXZpb3VyIG1pZ2h0IHNvdW5kIGNyYXp5IGJ1dCBpdCBpcyB0aGUgc2FtZSBhcyA8c2VsZWN0PidzIGByZW1vdmVgIG1ldGhvZC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxTZWxlY3RFbGVtZW50L3JlbW92ZVxuICByZW1vdmUoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdC5yZW1vdmUoaW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5vbnNFbGVtZW50cy5TZWxlY3QgPSBTZWxlY3RFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc2VsZWN0JywgU2VsZWN0RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnZmFiIGZhYi0tbWluaSBzcGVlZC1kaWFsX19pdGVtJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ2ZhYi0tKiBzcGVlZC1kaWFsX19pdGVtLS0qJ1xufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtc3BlZWQtZGlhbC1pdGVtXG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBUaGlzIGNvbXBvbmVudCBkaXNwbGF5cyB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIE1hdGVyaWFsIERlc2lnbiBTcGVlZCBkaWFsIGNvbXBvbmVudC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVxuICogICAgIE1hdGVyaWFsIERlc2lnbuOBrlNwZWVkIGRpYWzjga7lrZDopoHntKDjgpLooajnj77jgZnjgovopoHntKDjgafjgZnjgIJcbiAqICAgWy9qYV1cbiAqIEBjb2RlcGVuIGRZUVlMZ1xuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NwZWVkLWRpYWxcbiAqIEBzZWVhbHNvIG9ucy1zcGVlZC1kaWFsXG4gKiAgIFtlbl1UaGUgYDxvbnMtc3BlZWQtZGlhbD5gIGNvbXBvbmVudC5bL2VuXVxuICogICBbamFdb25zLXNwZWVkLWRpYWzjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWZhYlxuICogICBbZW5db25zLWZhYiBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWZhYuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1zcGVlZC1kaWFsIHBvc2l0aW9uPVwibGVmdCBib3R0b21cIj5cbiAqICAgPG9ucy1mYWI+XG4gKiAgICAgPG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj5cbiAqICAgPC9vbnMtZmFiPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5BPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5CPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5DPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogPC9vbnMtc3BlZWQtZGlhbD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BlZWREaWFsSXRlbUVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBjb21wb25lbnQuWy9lbl1cbiAgICogICBbamFd44GT44Gu44Kz44Oz44Od44O844ON44Oz44OI44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcmlwcGxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIGRlZmluZWQsIHRoZSBidXR0b24gd2lsbCBoYXZlIGEgcmlwcGxlIGVmZmVjdCB3aGVuIHRhcHBlZC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcmlwcGxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIHByb3BlcnR5IGlzIGRlZmluZWQsIHRoZSBidXR0b24gd2lsbCBoYXZlIGEgcmlwcGxlIGVmZmVjdCB3aGVuIHRhcHBlZC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgdGhpcy5fYm91bmRPbkNsaWNrID0gdGhpcy5fb25DbGljay5iaW5kKHRoaXMpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAncmlwcGxlJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIHV0aWwuYWRkTW9kaWZpZXIodGhpcywgJ21pbmknKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaXBwbGUnOlxuICAgICAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrLCBmYWxzZSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrLCBmYWxzZSk7XG4gIH1cblxuICBfdXBkYXRlUmlwcGxlKCkge1xuICAgIHV0aWwudXBkYXRlUmlwcGxlKHRoaXMpO1xuICB9XG5cbiAgX29uQ2xpY2soZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIGRlZmF1bHRDbGFzc05hbWUuc3BsaXQoL1xccysvKS5mb3JFYWNoKHRva2VuID0+IHRoaXMuY2xhc3NMaXN0LmFkZCh0b2tlbikpO1xuXG4gICAgdXRpbC5hZGRNb2RpZmllcih0aGlzLCAnbWluaScpO1xuICAgIHRoaXMuX3VwZGF0ZVJpcHBsZSgpO1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoU3BlZWREaWFsSXRlbUVsZW1lbnQsIFsncmlwcGxlJ10pO1xuXG5vbnNFbGVtZW50cy5TcGVlZERpYWxJdGVtID0gU3BlZWREaWFsSXRlbUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zcGVlZC1kaWFsLWl0ZW0nLCBTcGVlZERpYWxJdGVtRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBzdHlsZXIgZnJvbSAnLi4vb25zL3N0eWxlci5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnc3BlZWQtZGlhbCc7XG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAnc3BlZWQtZGlhbC0tKicsXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zcGVlZC1kaWFsXG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBFbGVtZW50IHRoYXQgZGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gU3BlZWQgRGlhbG9nIGNvbXBvbmVudC4gSXQgaXMgdXNlZnVsIHdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgcHJpbWFyeSBhY3Rpb24gdGhhdCBjYW4gYmUgcGVyZm9ybWVkIGluIGEgcGFnZS5cbiAqXG4gKiAgICAgVGhlIFNwZWVkIGRpYWwgbG9va3MgbGlrZSBhIGA8b25zLWZhYj5gIGVsZW1lbnQgYnV0IHdpbGwgZXhwYW5kIGEgbWVudSB3aGVuIHRhcHBlZC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBkWVFZTGdcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGVlZC1kaWFsXG4gKiBAc2VlYWxzbyBvbnMtc3BlZWQtZGlhbC1pdGVtXG4gKiAgIFtlbl1UaGUgYDxvbnMtc3BlZWQtZGlhbC1pdGVtPmAgcmVwcmVzZW50cyBhIG1lbnUgaXRlbS5bL2VuXVxuICogICBbamFdb25zLXNwZWVkLWRpYWwtaXRlbeOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtZmFiXG4gKiAgIFtlbl1vbnMtZmFiIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtZmFi44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNwZWVkLWRpYWwgcG9zaXRpb249XCJsZWZ0IGJvdHRvbVwiPlxuICogICA8b25zLWZhYj5cbiAqICAgICA8b25zLWljb24gaWNvbj1cImZhLXR3aXR0ZXJcIj48L29ucy1pY29uPlxuICogICA8L29ucy1mYWI+XG4gKiAgIDxvbnMtc3BlZWQtZGlhbC1pdGVtPkE8L29ucy1zcGVlZC1kaWFsLWl0ZW0+XG4gKiAgIDxvbnMtc3BlZWQtZGlhbC1pdGVtPkI8L29ucy1zcGVlZC1kaWFsLWl0ZW0+XG4gKiAgIDxvbnMtc3BlZWQtZGlhbC1pdGVtPkM8L29ucy1zcGVlZC1kaWFsLWl0ZW0+XG4gKiA8L29ucy1zcGVlZC1kaWFsPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGVlZERpYWxFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgb3BlblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQgd2hlbiB0aGUgbWVudSBpdGVtcyBhcmUgc2hvd24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBjbG9zZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQgd2hlbiB0aGUgbWVudSBpdGVtcyBhcmUgaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgY29tcG9uZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCs+ODs+ODneODvOODjeODs+ODiOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHJpcHBsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHJpcHBsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwb3NpdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBTcGVjaWZ5IHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgY29tcG9uZW50LlxuICAgKiAgICAgSS5lLiB0byBkaXNwbGF5IGl0IGluIHRoZSB0b3AgcmlnaHQgY29ybmVyIHNwZWNpZnkgXCJyaWdodCB0b3BcIi5cbiAgICogICAgIENob29zZSBmcm9tIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwidG9wXCIgYW5kIFwiYm90dG9tXCIuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdXG4gICAqICAgICDjgZPjga7opoHntKDjgpLooajnpLrjgZnjgovlt6blj7PjgajkuIrkuIvjga7kvY3nva7jgpLmjIflrprjgZfjgb7jgZnjgIJcbiAgICogICAgIOS+i+OBiOOBsOOAgeWPs+S4iuOBq+ihqOekuuOBmeOCi+WgtOWQiOOBq+OBr1wicmlnaHQgdG9wXCLjgpLmjIflrprjgZfjgb7jgZnjgIJcbiAgICogICAgIOW3puWPs+OBqOS4iuS4i+OBruS9jee9ruOBruaMh+WumuOBq+OBr+OAgXJpZ2h044GobGVmdOOAgXRvcOOBqGJvdHRvbeOBjOOBneOCjOOBnuOCjOaMh+WumuOBp+OBjeOBvuOBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpcmVjdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgZGlyZWN0aW9uIHRoZSBpdGVtcyBhcmUgZGlzcGxheWVkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFwidXBcIiwgXCJkb3duXCIsIFwibGVmdFwiIGFuZCBcInJpZ2h0XCIuWy9lbl1cbiAgICogICBbamFdXG4gICAqICAgICDopoHntKDjgYzooajnpLrjgZnjgovmlrnlkJHjgpLmjIflrprjgZfjgb7jgZnjgIJ1cCwgZG93biwgbGVmdCwgcmlnaHTjgYzmjIflrprjgafjgY3jgb7jgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fYm91bmRPbkNsaWNrID0gdGhpcy5fb25DbGljay5iaW5kKHRoaXMpO1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ2NsaWNrJyk7XG4gICAgdGhpcy5fY29ubmVjdE9uQ2xpY2sgPSBvbkNvbm5lY3RlZDtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25DbGljayA9IG9uRGlzY29ubmVjdGVkO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuX3VwZGF0ZVJpcHBsZSgpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcblxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGlyZWN0aW9uJykpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcmVjdGlvbih0aGlzLmdldEF0dHJpYnV0ZSgnZGlyZWN0aW9uJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVEaXJlY3Rpb24oJ3VwJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2NsYXNzJywgJ21vZGlmaWVyJywgJ3JpcHBsZScsICdkaXJlY3Rpb24nLCAncG9zaXRpb24nLCAnb3BlbiddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpcHBsZSc6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVSaXBwbGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGlyZWN0aW9uJzpcbiAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZURpcmVjdGlvbihjdXJyZW50KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncG9zaXRpb24nOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fdXBkYXRlUG9zaXRpb24oKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3Blbic6XG4gICAgICAgIGlmICghdGhpcy5faWdub3JlT3BlblNpZGVFZmZlY3QpIHtcbiAgICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fdXBkYXRlT3BlbihsYXN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIHRoaXMuX2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrLCBmYWxzZSk7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uQ2xpY2soKTtcbiAgfVxuXG4gIGdldCBpdGVtcygpIHtcbiAgICByZXR1cm4gdXRpbC5hcnJheUZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdvbnMtc3BlZWQtZGlhbC1pdGVtJykpO1xuICB9XG5cbiAgZ2V0IF9mYWIoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtZmFiJyk7XG4gIH1cblxuICBfb25DbGljayhldmVudCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmICF0aGlzLmRpc2FibGVkICYmIHRoaXMudmlzaWJsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50b2dnbGVJdGVtcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3Nob3coKSB7XG4gICAgaWYgKCF0aGlzLmlubGluZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvdygpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfaGlkZSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLmhpZGUoKS50aGVuKHJlc29sdmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF91cGRhdGVSaXBwbGUoKSB7XG4gICAgaWYgKHRoaXMuX2ZhYikge1xuICAgICAgdGhpcy5oYXNBdHRyaWJ1dGUoJ3JpcHBsZScpID8gdGhpcy5fZmFiLnNldEF0dHJpYnV0ZSgncmlwcGxlJywgJycpIDogdGhpcy5fZmFiLnJlbW92ZUF0dHJpYnV0ZSgncmlwcGxlJyk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZURpcmVjdGlvbihkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuaXRlbXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgc3R5bGVyKGNoaWxkcmVuW2ldLCB7XG4gICAgICAgIHRyYW5zaXRpb25EZWxheTogMjUgKiBpICsgJ21zJyxcbiAgICAgICAgYm90dG9tOiAnYXV0bycsXG4gICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBsZWZ0OiAnYXV0bydcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUuYm90dG9tID0gNzIgKyA1NiAqIGkgKyAncHgnO1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnJpZ2h0ID0gJzhweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnRvcCA9IDcyICsgNTYgKiBpICsgJ3B4JztcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5sZWZ0ID0gJzhweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnRvcCA9ICc4cHgnO1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnJpZ2h0ID0gNzIgKyA1NiAqIGkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUudG9wID0gJzhweCc7XG4gICAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUubGVmdCA9IDcyICsgNTYgKiBpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHV0aWwudGhyb3coJ0FyZ3VtZW50IG11c3QgYmUgb25lIG9mIHVwLCBkb3duLCBsZWZ0IG9yIHJpZ2h0LicpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVQb3NpdGlvbigpIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpO1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICdmYWItLXRvcF9fbGVmdCcsXG4gICAgICAnZmFiLS1ib3R0b21fX3JpZ2h0JyxcbiAgICAgICdmYWItLWJvdHRvbV9fbGVmdCcsXG4gICAgICAnZmFiLS10b3BfX3JpZ2h0JyxcbiAgICAgICdmYWItLXRvcF9fY2VudGVyJyxcbiAgICAgICdmYWItLWJvdHRvbV9fY2VudGVyJyk7XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wIHJpZ2h0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0IHRvcCc6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS10b3BfX3JpZ2h0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wIGxlZnQnOlxuICAgICAgY2FzZSAnbGVmdCB0b3AnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tdG9wX19sZWZ0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tIHJpZ2h0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0IGJvdHRvbSc6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS1ib3R0b21fX3JpZ2h0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tIGxlZnQnOlxuICAgICAgY2FzZSAnbGVmdCBib3R0b20nOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tYm90dG9tX19sZWZ0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyIHRvcCc6XG4gICAgICBjYXNlICd0b3AgY2VudGVyJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLXRvcF9fY2VudGVyJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyIGJvdHRvbSc6XG4gICAgICBjYXNlICdib3R0b20gY2VudGVyJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLWJvdHRvbV9fY2VudGVyJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgX2dldFRyYW5zbGF0ZSgpIHtcbiAgICBjb25zdCBpc0JvdHRvbSA9ICh0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKSB8fCAnJykuaW5kZXhPZignYm90dG9tJykgPj0gMDtcbiAgICBjb25zdCB0cmFuc2xhdGUgPSBpc0JvdHRvbSA/IGB0cmFuc2xhdGUzZCgwcHgsIC0ke3V0aWwuZ2xvYmFscy5mYWJPZmZzZXQgfHwgMH1weCwgMHB4KSBgIDogJyc7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgdGhlIHNwZWVkIGRpYWwuWy9lbl1cbiAgICogICBbamFdU3BlZWQgZGlhbOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBzaG93KCkge1xuICAgIHRoaXMuX2ZhYi5zaG93KCk7XG4gICAgc3R5bGVyKHRoaXMsIHsgdHJhbnNmb3JtOiB0aGlzLl9nZXRUcmFuc2xhdGUgfSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0aGUgc3BlZWQgZGlhbC5bL2VuXVxuICAgKiAgIFtqYV1TcGVlZCBkaWFs44KS6Z2e6KGo56S644Gr44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZUl0ZW1zKCkudGhlbigoKT0+IHRoaXMuX2ZhYi5oaWRlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd0l0ZW1zXG4gICAqIEBzaWduYXR1cmUgc2hvd0l0ZW1zKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgdGhlIHNwZWVkIGRpYWwgaXRlbXMuWy9lbl1cbiAgICogICBbamFdU3BlZWQgZGlhbOOBruWtkOimgee0oOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBzaG93SXRlbXMoKSB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMub3BlbjtcbiAgICB0aGlzLl9pZ25vcmVPcGVuU2lkZUVmZmVjdCA9IHRydWU7XG4gICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICB0aGlzLl9pZ25vcmVPcGVuU2lkZUVmZmVjdCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU9wZW4obGFzdCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlSXRlbXNcbiAgICogQHNpZ25hdHVyZSBoaWRlSXRlbXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0aGUgc3BlZWQgZGlhbCBpdGVtcy5bL2VuXVxuICAgKiAgIFtqYV1TcGVlZCBkaWFs44Gu5a2Q6KaB57Sg44KS6Z2e6KGo56S644Gr44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGhpZGVJdGVtcygpIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5vcGVuO1xuICAgIHRoaXMuX2lnbm9yZU9wZW5TaWRlRWZmZWN0ID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLl9pZ25vcmVPcGVuU2lkZUVmZmVjdCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU9wZW4obGFzdCk7XG4gIH1cblxuICBfdXBkYXRlT3BlbihsYXN0KSB7XG4gICAgLy8gdXBkYXRlIGRpcmVjdGlvblxuICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnZGlyZWN0aW9uJykpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlyZWN0aW9uKHRoaXMuZ2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl91cGRhdGVEaXJlY3Rpb24oJ3VwJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsRGVsYXkgPSAwO1xuICAgIGlmIChsYXN0ICE9PSB0aGlzLm9wZW4pIHsgLy8gZG8gbm90aGluZyBpZiBhbHJlYWR5IG9wZW4vY2xvc2VkXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuaXRlbXM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gMjUgKiAodGhpcy5vcGVuID8gaSA6IGNoaWxkcmVuLmxlbmd0aCAtIGkpO1xuICAgICAgICB0b3RhbERlbGF5ICs9IGRlbGF5O1xuICAgICAgICBzdHlsZXIoY2hpbGRyZW5baV0sIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGBzY2FsZSgke3RoaXMub3BlbiA/IDEgOiAwfSlgLFxuICAgICAgICAgIHRyYW5zaXRpb25EZWxheTogZGVsYXkgKyAnbXMnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdG90YWxEZWxheSArPSA1MDtcblxuICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsIHRoaXMub3BlbiA/ICdvcGVuJyA6ICdjbG9zZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmVycmVkID0gdXRpbC5kZWZlcigpO1xuICAgIHNldFRpbWVvdXQoZGVmZXJyZWQucmVzb2x2ZSwgdG90YWxEZWxheSk7XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG4gIHNldCBkaXNhYmxlZCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5oaWRlSXRlbXMoKTtcbiAgICB9XG4gICAgdXRpbC5hcnJheUZyb20odGhpcy5jaGlsZHJlbikuZm9yRWFjaChlID0+IHtcbiAgICAgIHV0aWwubWF0Y2goZSwgJy5mYWInKSAmJiB1dGlsLnRvZ2dsZUF0dHJpYnV0ZShlLCAnZGlzYWJsZWQnLCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB1dGlsLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLCAnZGlzYWJsZWQnLCB2YWx1ZSk7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBpbmxpbmVcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBpbmxpbmUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeOCpOODs+ODqeOCpOODs+imgee0oOOBruWgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuICBnZXQgaW5saW5lKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnaW5saW5lJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZpc2libGVcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZhYiAmJiB0aGlzLl9mYWIudmlzaWJsZSAmJiB0aGlzLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzT3BlblxuICAgKiBAc2lnbmF0dXJlIGlzT3BlbigpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIG1lbnUgaXMgb3BlbiBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGlzT3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgb3BlblxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgbWVudSBpcyBvcGVuIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9wZW5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIG1lbnUgaXMgb3BlbiBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRvZ2dsZSB2aXNpYmlsaXR5LlsvZW5dXG4gICAqICAgW2phXVNwZWVkIGRpYWzjga7ooajnpLrpnZ7ooajnpLrjgpLliIfjgormm7/jgYjjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLnZpc2libGUgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlSXRlbXNcbiAgICogQHNpZ25hdHVyZSB0b2dnbGVJdGVtcygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ub2dnbGUgaXRlbSB2aXNpYmlsaXR5LlsvZW5dXG4gICAqICAgW2phXVNwZWVkIGRpYWzjga7lrZDopoHntKDjga7ooajnpLrpnZ7ooajnpLrjgpLliIfjgormm7/jgYjjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgdG9nZ2xlSXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMub3BlbiA/IHRoaXMuaGlkZUl0ZW1zKCkgOiB0aGlzLnNob3dJdGVtcygpO1xuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsnb3BlbicsICdjbG9zZSddO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoU3BlZWREaWFsRWxlbWVudCwgWydvcGVuJywgJ3JpcHBsZSddKTtcblxub25zRWxlbWVudHMuU3BlZWREaWFsID0gU3BlZWREaWFsRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNwZWVkLWRpYWwnLCBTcGVlZERpYWxFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCB7UGFnZUxvYWRlciwgZGVmYXVsdFBhZ2VMb2FkZXJ9IGZyb20gJy4uL29ucy9wYWdlLWxvYWRlci5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgcmV3cml0YWJsZXMgPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHJlYWR5KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtc3BsaXR0ZXItY29udGVudFxuICogQGNhdGVnb3J5IG1lbnVcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1cbiAqICAgIFRoZSBgPG9ucy1zcGxpdHRlci1jb250ZW50PmAgZWxlbWVudCBpcyB1c2VkIGFzIGEgY2hpbGQgZWxlbWVudCBvZiBgPG9ucy1zcGxpdHRlcj5gLlxuICpcbiAqICAgIEl0IGNvbnRhaW5zIHRoZSBtYWluIGNvbnRlbnQgb2YgdGhlIHBhZ2Ugd2hpbGUgYDxvbnMtc3BsaXR0ZXItc2lkZT5gIGNvbnRhaW5zIHRoZSBsaXN0LlxuICogIFsvZW5dXG4gKiAgW2phXW9ucy1zcGxpdHRlci1jb250ZW506KaB57Sg44Gv44CBb25zLXNwbGl0dGVy6KaB57Sg44Gu5a2Q6KaB57Sg44Go44GX44Gm5Yip55So44GX44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIHJPUU9NTFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NwbGl0dGVyXG4gKiBAZ3VpZGUgZnVuZGFtZW50YWxzLmh0bWwjbWFuYWdpbmctcGFnZXNcbiAqICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXMuWy9lbl1cbiAqICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGxpdHRlclxuICogIFtlbl1UaGUgYDxvbnMtc3BsaXR0ZXI+YCBjb21wb25lbnQgaXMgdGhlIHBhcmVudCBlbGVtZW50LlsvZW5dXG4gKiAgW2phXW9ucy1zcGxpdHRlcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BsaXR0ZXItc2lkZVxuICogIFtlbl1UaGUgYDxvbnMtc3BsaXR0ZXItc2lkZT5gIGNvbXBvbmVudCBjb250YWlucyB0aGUgbWVudS5bL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXItc2lkZeOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1zcGxpdHRlcj5cbiAqICAgPG9ucy1zcGxpdHRlci1jb250ZW50PlxuICogICAgIC4uLlxuICogICA8L29ucy1zcGxpdHRlci1jb250ZW50PlxuICpcbiAqICAgPG9ucy1zcGxpdHRlci1zaWRlIHNpZGU9XCJsZWZ0XCIgd2lkdGg9XCI4MCVcIiBjb2xsYXBzZT5cbiAqICAgICAuLi5cbiAqICAgPC9vbnMtc3BsaXR0ZXItc2lkZT5cbiAqIDwvb25zLXNwbGl0dGVyPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGxpdHRlckNvbnRlbnRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBhZ2VcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhlIHVybCBvZiB0aGUgY29udGVudCBwYWdlLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRoZSBjb250ZW50IHdpbGwgYmUgbG9hZGVkIGZyb20gYSBgPHRlbXBsYXRlPmAgdGFnIG9yIGEgcmVtb3RlIGZpbGUuXG4gICAqXG4gICAqICAgICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHB1dCBgPG9ucy1wYWdlPmAgZWxlbWVudCBhcyBhIGNoaWxkIG9mIHRoZSBlbGVtZW50LlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXW9ucy1zcGxpdHRlci1jb250ZW506KaB57Sg44Gr6KGo56S644GZ44KL44Oa44O844K444GuVVJM44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX3BhZ2UgPSBudWxsO1xuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBkZWZhdWx0UGFnZUxvYWRlcjtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICByZXdyaXRhYmxlcy5yZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLl9nZXRQYWdlVGFyZ2V0KCk7XG5cbiAgICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgICB0aGlzLmxvYWQocGFnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKCF1dGlsLm1hdGNoKHRoaXMucGFyZW50Tm9kZSwgJ29ucy1zcGxpdHRlcicpKSB7XG4gICAgICB1dGlsLnRocm93KCdcIm9ucy1zcGxpdHRlci1jb250ZW50XCIgbXVzdCBoYXZlIFwib25zLXNwbGl0dGVyXCIgYXMgcGFyZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgX2dldFBhZ2VUYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2UgfHwgdGhpcy5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge31cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlXG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBwYWdlIHRvIGxvYWQgaW4gdGhlIHNwbGl0dGVyIGNvbnRlbnQuWy9lbl1cbiAgICogICBbamFd44GT44Gu6KaB57Sg5YaF44Gr6KGo56S644GZ44KL44Oa44O844K444KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBwYWdlKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gcGFnZVxuICAgKi9cbiAgc2V0IHBhZ2UocGFnZSkge1xuICAgIHRoaXMuX3BhZ2UgPSBwYWdlO1xuICB9XG5cbiAgZ2V0IF9jb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlTG9hZGVyXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVBhZ2UgZWxlbWVudCBsb2FkZWQgaW4gdGhlIHNwbGl0dGVyIGNvbnRlbnQuWy9lbl1cbiAgICogICBbamFd44GT44Gu6KaB57Sg5YaF44Gr6KGo56S644GZ44KL44Oa44O844K444KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBwYWdlTG9hZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlTG9hZGVyO1xuICB9XG5cbiAgc2V0IHBhZ2VMb2FkZXIobG9hZGVyKSB7XG4gICAgaWYgKCEobG9hZGVyIGluc3RhbmNlb2YgUGFnZUxvYWRlcikpIHtcbiAgICAgIHV0aWwudGhyb3dQYWdlTG9hZGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBsb2FkZXI7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBsb2FkXG4gICAqIEBzaWduYXR1cmUgbG9hZChwYWdlLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlLCBbb3B0aW9uc11cbiAgICogICBbZW5dUGFnZSBVUkwuIENhbiBiZSBlaXRoZXIgYW4gSFRNTCBkb2N1bWVudCBvciBhbiBgPHRlbXBsYXRlPmAgaWQuWy9lbl1cbiAgICogICBbamFdcGFnZeOBrlVSTOOBi+OAgWA8dGVtcGxhdGU+YOOBp+Wuo+iogOOBl+OBn+ODhuODs+ODl+ODrOODvOODiOOBrmlk5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIGBwYWdlYCBpbiB0aGUgY29udGVudC5bL2VuXVxuICAgKiAgIFtqYV3mjIflrprjgZfjgZ9VUkzjgpLjg6HjgqTjg7Pjg5rjg7zjgrjjgpLoqq3jgb/ovrzjgb/jgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgbmV3IGA8b25zLXBhZ2U+YCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdYDxvbnMtcGFnZT5g6KaB57Sg44KS6Kej5rG644GZ44KLUHJvbWlzZeOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBsb2FkKHBhZ2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX3BhZ2UgPSBwYWdlO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgbGV0IG9sZENvbnRlbnQgPSB0aGlzLl9jb250ZW50IHx8IG51bGw7XG5cbiAgICAgIHRoaXMuX3BhZ2VMb2FkZXIubG9hZCh7cGFnZSwgcGFyZW50OiB0aGlzfSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAob2xkQ29udGVudCkge1xuICAgICAgICAgIHRoaXMuX3BhZ2VMb2FkZXIudW5sb2FkKG9sZENvbnRlbnQpO1xuICAgICAgICAgIG9sZENvbnRlbnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3Nob3coKSk7XG5cbiAgICAgICAgY2FsbGJhY2socGFnZUVsZW1lbnQpO1xuICAgICAgICByZXNvbHZlKHBhZ2VFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3Nob3coKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2NvbnRlbnQuX3Nob3coKTtcbiAgICB9XG4gIH1cblxuICBfaGlkZSgpIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fY29udGVudC5faGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLl9jb250ZW50KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcmV3cml0YWJsZXMoKSB7XG4gICAgcmV0dXJuIHJld3JpdGFibGVzO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLlNwbGl0dGVyQ29udGVudCA9IFNwbGl0dGVyQ29udGVudEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zcGxpdHRlci1jb250ZW50JywgU3BsaXR0ZXJDb250ZW50RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGxpdHRlck1hc2tFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9ib3VuZE9uQ2xpY2sgPSB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUuX3NpZGVzLmV2ZXJ5KHNpZGUgPT4gc2lkZS5tb2RlID09PSAnc3BsaXQnKSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfb25DbGljayhldmVudCkge1xuICAgIGlmICh0aGlzLm9uQ2xpY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgdGhpcy5vbkNsaWNrKCk7XG4gICAgfSBlbHNlIGlmICh1dGlsLm1hdGNoKHRoaXMucGFyZW50Tm9kZSwgJ29ucy1zcGxpdHRlcicpKSB7XG4gICAgICB0aGlzLnBhcmVudE5vZGUuX3NpZGVzLmZvckVhY2goc2lkZSA9PiBzaWRlLmNsb3NlKCdsZWZ0JykuY2F0Y2goKCkgPT4ge30pKTtcbiAgICB9XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljayk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrKTtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5TcGxpdHRlck1hc2sgPSBTcGxpdHRlck1hc2tFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc3BsaXR0ZXItbWFzaycsIFNwbGl0dGVyTWFza0VsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IHN0eWxlciBmcm9tICcuLi8uLi9vbnMvc3R5bGVyLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNwbGl0dGVyQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJywgZHVyYXRpb24gPSAwLjMsIGRlbGF5ID0gMH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkdXJhdGlvbiwgZGVsYXkgfSk7XG4gIH1cblxuICB1cGRhdGVPcHRpb25zKG9wdGlvbnMgPSB7fSkge1xuICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHtcbiAgICAgIHRpbWluZzogdGhpcy50aW1pbmcsIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLCBkZWxheTogdGhpcy5kZWxheVxuICAgIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gc2lkZUVsZW1lbnRcbiAgICovXG4gIGFjdGl2YXRlKHNpZGVFbGVtZW50KSB7XG4gICAgY29uc3Qgc3BsaXR0ZXIgPSBzaWRlRWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgY29udGVudFJlYWR5KHNwbGl0dGVyLCAoKSA9PiB7XG4gICAgICB0aGlzLl9zaWRlID0gc2lkZUVsZW1lbnQ7XG4gICAgICB0aGlzLl9vcHBvc2l0ZVNpZGUgPSBzcGxpdHRlci5yaWdodCAhPT0gc2lkZUVsZW1lbnQgJiYgc3BsaXR0ZXIucmlnaHQgfHwgc3BsaXR0ZXIubGVmdCAhPT0gc2lkZUVsZW1lbnQgJiYgc3BsaXR0ZXIubGVmdDtcbiAgICAgIHRoaXMuX2NvbnRlbnQgPSBzcGxpdHRlci5jb250ZW50O1xuICAgICAgdGhpcy5fbWFzayA9IHNwbGl0dGVyLm1hc2s7XG4gICAgfSk7XG4gIH1cblxuICBkZWFjdGl2YXRlKCkge1xuICAgIHRoaXMuY2xlYXJUcmFuc2l0aW9uKCk7XG4gICAgdGhpcy5fbWFzayAmJiB0aGlzLmNsZWFyTWFzaygpO1xuICAgIHRoaXMuX2NvbnRlbnQgPSB0aGlzLl9zaWRlID0gdGhpcy5fb3Bwb3NpdGVTaWRlID0gdGhpcy5fbWFzayA9IG51bGw7XG4gIH1cblxuICBnZXQgbWludXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZGUuc2lkZSA9PT0gJ3JpZ2h0JyA/ICctJyA6ICcnO1xuICB9XG5cbiAgY2xlYXJUcmFuc2l0aW9uKCkge1xuICAgICdzaWRlIG1hc2sgY29udGVudCcuc3BsaXQoL1xccysvKVxuICAgICAgLmZvckVhY2goZSA9PiB0aGlzWydfJyArIGVdICYmIHN0eWxlci5jbGVhcih0aGlzWydfJyArIGVdLCAndHJhbnNmb3JtIHRyYW5zaXRpb24nKSk7XG4gIH1cblxuICBjbGVhck1hc2soKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG90aGVyIHNpZGUgbmVlZHMgdGhlIG1hc2sgYmVmb3JlIGNsZWFyaW5nXG4gICAgaWYgKCF0aGlzLl9vcHBvc2l0ZVNpZGUgfHwgdGhpcy5fb3Bwb3NpdGVTaWRlLm1vZGUgPT09ICdzcGxpdCcgfHwgIXRoaXMuX29wcG9zaXRlU2lkZS5pc09wZW4pIHtcbiAgICAgIHRoaXMuX21hc2suc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgdGhpcy5fbWFzay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge051bWJlcn0gZGlzdGFuY2VcbiAgICovXG4gIHRyYW5zbGF0ZShkaXN0YW5jZSkge1xuXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgb3Blbihkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGNsb3NlKGRvbmUpIHtcbiAgICBkb25lKCk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgU3BsaXR0ZXJBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3ZlcmxheVNwbGl0dGVyQW5pbWF0b3IgZXh0ZW5kcyBTcGxpdHRlckFuaW1hdG9yIHtcblxuICB0cmFuc2xhdGUoZGlzdGFuY2UpIHtcbiAgICB0aGlzLl9tYXNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBBdm9pZCBjb250ZW50IGNsaWNrc1xuXG4gICAgYW5pbWl0KHRoaXMuX3NpZGUpXG4gICAgICAucXVldWUoe1xuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMubWludXMgKyBkaXN0YW5jZX1weCwgMCwgMClgXG4gICAgICB9KVxuICAgICAgLnBsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBvcGVuKGRvbmUpIHtcbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRoaXMuX3NpZGUpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLm1pbnVzfTEwMCUsIDAsIDApYFxuICAgICAgICB9LCB0aGlzLmRlZilcbiAgICAgICAgLnF1ZXVlKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUgJiYgZG9uZSgpO1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KHRoaXMuX21hc2spXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICB9KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIG9wYWNpdHk6ICcxJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgdGltaW5nOiAnbGluZWFyJyxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGNsb3NlKGRvbmUpIHtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodGhpcy5fc2lkZSlcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSdcbiAgICAgICAgfSwgdGhpcy5kZWYpXG4gICAgICAgIC5xdWV1ZShjYWxsYmFjayA9PiB7XG4gICAgICAgICAgZG9uZSAmJiBkb25lKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9tYXNrKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIG9wYWNpdHk6ICcwJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgdGltaW5nOiAnbGluZWFyJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IFNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFB1c2hTcGxpdHRlckFuaW1hdG9yIGV4dGVuZHMgU3BsaXR0ZXJBbmltYXRvciB7XG5cbiAgX2dldFNsaWRpbmdFbGVtZW50cygpIHtcbiAgICBjb25zdCBzbGlkaW5nRWxlbWVudHMgPSBbdGhpcy5fc2lkZSwgdGhpcy5fY29udGVudF07XG4gICAgaWYgKHRoaXMuX29wcG9zaXRlU2lkZSAmJiB0aGlzLl9vcHBvc2l0ZVNpZGUubW9kZSA9PT0gJ3NwbGl0Jykge1xuICAgICAgc2xpZGluZ0VsZW1lbnRzLnB1c2godGhpcy5fb3Bwb3NpdGVTaWRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpZGluZ0VsZW1lbnRzO1xuICB9XG5cbiAgdHJhbnNsYXRlKGRpc3RhbmNlKSB7XG4gICAgaWYgKCF0aGlzLl9zbGlkaW5nRWxlbWVudHMpIHtcbiAgICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IHRoaXMuX2dldFNsaWRpbmdFbGVtZW50cygpO1xuICAgIH1cblxuICAgIHRoaXMuX21hc2suc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IC8vIEF2b2lkIGNvbnRlbnQgY2xpY2tzXG5cbiAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgLnF1ZXVlKHtcbiAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLm1pbnVzICsgZGlzdGFuY2V9cHgsIDAsIDApYFxuICAgICAgfSlcbiAgICAgIC5wbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgb3Blbihkb25lKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5fc2lkZS5vZmZzZXRXaWR0aDtcbiAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSB0aGlzLl9nZXRTbGlkaW5nRWxlbWVudHMoKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51cyArIG1heH1weCwgMCwgMClgXG4gICAgICAgIH0sIHRoaXMuZGVmKVxuICAgICAgICAucXVldWUoY2FsbGJhY2sgPT4ge1xuICAgICAgICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IG51bGw7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9tYXNrKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGNsb3NlKGRvbmUpIHtcbiAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSB0aGlzLl9nZXRTbGlkaW5nRWxlbWVudHMoKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJ1xuICAgICAgICB9LCB0aGlzLmRlZilcbiAgICAgICAgLnF1ZXVlKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSBudWxsO1xuICAgICAgICAgIHN1cGVyLmNsZWFyVHJhbnNpdGlvbigpO1xuICAgICAgICAgIGRvbmUgJiYgZG9uZSgpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fbWFzaylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uLy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBzdHlsZXIgZnJvbSAnLi4vLi4vb25zL3N0eWxlci5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IFNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJldmVhbFNwbGl0dGVyQW5pbWF0b3IgZXh0ZW5kcyBTcGxpdHRlckFuaW1hdG9yIHtcblxuICBfZ2V0U2xpZGluZ0VsZW1lbnRzKCkge1xuICAgIGNvbnN0IHNsaWRpbmdFbGVtZW50cyA9IFt0aGlzLl9jb250ZW50LCB0aGlzLl9tYXNrXTtcbiAgICBpZiAodGhpcy5fb3Bwb3NpdGVTaWRlICYmIHRoaXMuX29wcG9zaXRlU2lkZS5tb2RlID09PSAnc3BsaXQnKSB7XG4gICAgICBzbGlkaW5nRWxlbWVudHMucHVzaCh0aGlzLl9vcHBvc2l0ZVNpZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzbGlkaW5nRWxlbWVudHM7XG4gIH1cblxuICBhY3RpdmF0ZShzaWRlRWxlbWVudCkge1xuICAgIHN1cGVyLmFjdGl2YXRlKHNpZGVFbGVtZW50KTtcbiAgICBpZiAoc2lkZUVsZW1lbnQubW9kZSA9PT0gJ2NvbGxhcHNlJykge1xuICAgICAgdGhpcy5fc2V0U3R5bGVzKHNpZGVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBkZWFjdGl2YXRlKCkge1xuICAgIHRoaXMuX3NpZGUgJiYgdGhpcy5fdW5zZXRTdHlsZXModGhpcy5fc2lkZSk7XG4gICAgc3VwZXIuZGVhY3RpdmF0ZSgpO1xuICB9XG5cbiAgX3NldFN0eWxlcyhzaWRlRWxlbWVudCkge1xuICAgIHN0eWxlcihzaWRlRWxlbWVudCwge1xuICAgICAgbGVmdDogc2lkZUVsZW1lbnQuc2lkZSA9PT0gJ3JpZ2h0JyA/ICdhdXRvJyA6IDAsXG4gICAgICByaWdodDogc2lkZUVsZW1lbnQuc2lkZSA9PT0gJ3JpZ2h0JyAgPyAwIDogJ2F1dG8nLFxuICAgICAgekluZGV4OiAwLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnYmxhY2snLFxuICAgICAgdHJhbnNmb3JtOiB0aGlzLl9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZSgwKS5jb250YWluZXIudHJhbnNmb3JtLFxuICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgfSk7XG5cbiAgICBjb25zdCBzcGxpdHRlciA9IHNpZGVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgY29udGVudFJlYWR5KHNwbGl0dGVyLCAoKSA9PiBzcGxpdHRlci5jb250ZW50ICYmIHN0eWxlcihzcGxpdHRlci5jb250ZW50LCB7IGJveFNoYWRvdzogJzAgMCAxMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpJyB9KSk7XG4gIH1cblxuICBfdW5zZXRTdHlsZXMoc2lkZUVsZW1lbnQpIHtcbiAgICBzdHlsZXIuY2xlYXIoc2lkZUVsZW1lbnQsICdsZWZ0IHJpZ2h0IHpJbmRleCBiYWNrZ3JvdW5kQ29sb3IgZGlzcGxheScpO1xuICAgIGlmIChzaWRlRWxlbWVudC5fY29udGVudCkge1xuICAgICAgc2lkZUVsZW1lbnQuX2NvbnRlbnQuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBvdGhlciBzaWRlIG5lZWRzIHRoZSBjb21tb24gc3R5bGVzXG4gICAgaWYgKCF0aGlzLl9vcHBvc2l0ZVNpZGUgfHwgdGhpcy5fb3Bwb3NpdGVTaWRlLm1vZGUgPT09ICdzcGxpdCcpIHtcbiAgICAgIHNpZGVFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGVudCAmJiBzdHlsZXIuY2xlYXIoc2lkZUVsZW1lbnQucGFyZW50RWxlbWVudC5jb250ZW50LCAnYm94U2hhZG93Jyk7XG4gICAgfVxuICB9XG5cbiAgX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKGRpc3RhbmNlKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXhXaWR0aDtcblxuICAgIGxldCBiZWhpbmREaXN0YW5jZSA9IChkaXN0YW5jZSAtIG1heCkgLyBtYXggKiAxMDtcbiAgICBiZWhpbmREaXN0YW5jZSA9IGlzTmFOKGJlaGluZERpc3RhbmNlKSA/IDAgOiBNYXRoLm1heChNYXRoLm1pbihiZWhpbmREaXN0YW5jZSwgMCksIC0xMCk7XG5cbiAgICBjb25zdCBiZWhpbmRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHsodGhpcy5taW51cyA/IC0xIDogMSkgKiBiZWhpbmREaXN0YW5jZX0lLCAwLCAwKWA7XG4gICAgY29uc3Qgb3BhY2l0eSA9IDEgKyBiZWhpbmREaXN0YW5jZSAvIDEwMDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIG9wYWNpdHlcbiAgICAgIH0sXG4gICAgICBjb250YWluZXI6IHtcbiAgICAgICAgdHJhbnNmb3JtOiBiZWhpbmRUcmFuc2Zvcm1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdHJhbnNsYXRlKGRpc3RhbmNlKSB7XG4gICAgdGhpcy5fc2lkZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgdGhpcy5fc2lkZS5zdHlsZS56SW5kZXggPSAxO1xuICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLm1heFdpZHRoIHx8IHRoaXMuX2dldE1heFdpZHRoKCk7XG4gICAgY29uc3QgbWVudVN0eWxlID0gdGhpcy5fZ2VuZXJhdGVCZWhpbmRQYWdlU3R5bGUoTWF0aC5taW4oZGlzdGFuY2UsIHRoaXMubWF4V2lkdGgpKTtcblxuICAgIGlmICghdGhpcy5fc2xpZGluZ0VsZW1lbnRzKSB7XG4gICAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSB0aGlzLl9nZXRTbGlkaW5nRWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBBdm9pZCBjb250ZW50IGNsaWNrc1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0aGlzLl9zbGlkaW5nRWxlbWVudHMpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLm1pbnVzICsgZGlzdGFuY2V9cHgsIDAsIDApYFxuICAgICAgICB9KSxcbiAgICAgIGFuaW1pdCh0aGlzLl9zaWRlLl9jb250ZW50KVxuICAgICAgICAucXVldWUobWVudVN0eWxlLmNvbnRlbnQpLFxuICAgICAgYW5pbWl0KHRoaXMuX3NpZGUpXG4gICAgICAgIC5xdWV1ZShtZW51U3R5bGUuY29udGFpbmVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgb3Blbihkb25lKSB7XG4gICAgdGhpcy5fc2lkZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgdGhpcy5fc2lkZS5zdHlsZS56SW5kZXggPSAxO1xuICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLm1heFdpZHRoIHx8IHRoaXMuX2dldE1heFdpZHRoKCk7XG4gICAgY29uc3QgbWVudVN0eWxlID0gdGhpcy5fZ2VuZXJhdGVCZWhpbmRQYWdlU3R5bGUodGhpcy5tYXhXaWR0aCk7XG4gICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gdGhpcy5fZ2V0U2xpZGluZ0VsZW1lbnRzKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8gRml4OiBUaW1lIHRvIHVwZGF0ZSBwcmV2aW91cyB0cmFuc2xhdGUzZCBhZnRlciBjaGFuZ2luZyBzdHlsZS5kaXNwbGF5XG4gICAgICBhbmltaXQucnVuQWxsKFxuICAgICAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51cyArIHRoaXMubWF4V2lkdGh9cHgsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMuZGVmKSxcblxuICAgICAgICBhbmltaXQodGhpcy5fbWFzaylcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuX3NpZGUuX2NvbnRlbnQpXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUobWVudVN0eWxlLmNvbnRlbnQsIHRoaXMuZGVmKSxcblxuICAgICAgICBhbmltaXQodGhpcy5fc2lkZSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZShtZW51U3R5bGUuY29udGFpbmVyLCB0aGlzLmRlZilcbiAgICAgICAgICAucXVldWUoY2FsbGJhY2sgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSwgMTAwMC82MCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgY2xvc2UoZG9uZSkge1xuICAgIGNvbnN0IG1lbnVTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKDApO1xuICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IHRoaXMuX2dldFNsaWRpbmdFbGVtZW50cygpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0aGlzLl9zbGlkaW5nRWxlbWVudHMpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgIH0sIHRoaXMuZGVmKSxcblxuICAgICAgYW5pbWl0KHRoaXMuX21hc2spXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fc2lkZS5fY29udGVudClcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZS5jb250ZW50LCB0aGlzLmRlZiksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9zaWRlKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUobWVudVN0eWxlLmNvbnRhaW5lciwgdGhpcy5kZWYpXG4gICAgICAgIC5xdWV1ZShjYWxsYmFjayA9PiB7XG4gICAgICAgICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9zaWRlLnN0eWxlLnpJbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5fc2lkZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIHRoaXMuX3NpZGUuX2NvbnRlbnQuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgICAgIGRvbmUgJiYgZG9uZSgpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBfZ2V0TWF4V2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZGUub2Zmc2V0V2lkdGg7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCBPdmVybGF5U3BsaXR0ZXJBbmltYXRvciBmcm9tICcuL29ucy1zcGxpdHRlci9vdmVybGF5LWFuaW1hdG9yLmpzJztcbmltcG9ydCBQdXNoU3BsaXR0ZXJBbmltYXRvciBmcm9tICcuL29ucy1zcGxpdHRlci9wdXNoLWFuaW1hdG9yLmpzJztcbmltcG9ydCBSZXZlYWxTcGxpdHRlckFuaW1hdG9yIGZyb20gJy4vb25zLXNwbGl0dGVyL3JldmVhbC1hbmltYXRvci5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIgZnJvbSAnLi4vb25zL2ludGVybmFsL2RldmljZS1iYWNrLWJ1dHRvbi1kaXNwYXRjaGVyLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICBkZWZhdWx0OiBPdmVybGF5U3BsaXR0ZXJBbmltYXRvcixcbiAgb3ZlcmxheTogT3ZlcmxheVNwbGl0dGVyQW5pbWF0b3IsXG4gIHB1c2g6IFB1c2hTcGxpdHRlckFuaW1hdG9yLFxuICByZXZlYWw6IFJldmVhbFNwbGl0dGVyQW5pbWF0b3Jcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNwbGl0dGVyXG4gKiBAY2F0ZWdvcnkgbWVudVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVxuICogICAgQSBjb21wb25lbnQgdGhhdCBlbmFibGVzIHJlc3BvbnNpdmUgbGF5b3V0IGJ5IGltcGxlbWVudGluZyBib3RoIGEgdHdvLWNvbHVtbiBsYXlvdXQgYW5kIGEgc2xpZGluZyBtZW51IGxheW91dC5cbiAqXG4gKiAgICBJdCBjYW4gYmUgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IGV4cGFuZCBpbnRvIGEgY29sdW1uIGxheW91dCBvbiBsYXJnZSBzY3JlZW5zIGFuZCBjb2xsYXBzZSB0aGUgbWVudSBvbiBzbWFsbGVyIHNjcmVlbnMuIFdoZW4gdGhlIG1lbnUgaXMgY29sbGFwc2VkIHRoZSB1c2VyIGNhbiBvcGVuIGl0IGJ5IHN3aXBpbmcuXG4gKiAgWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHJPUU9NTFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NwbGl0dGVyXG4gKiBAZ3VpZGUgZnVuZGFtZW50YWxzLmh0bWwjbWFuYWdpbmctcGFnZXNcbiAqICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXMuWy9lbl1cbiAqICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGxpdHRlci1jb250ZW50XG4gKiAgW2VuXVRoZSBgPG9ucy1zcGxpdHRlci1jb250ZW50PmAgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBtYWluIGNvbnRlbnQgb2YgdGhlIHBhZ2UuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVyLWNvbnRlbnTjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXNwbGl0dGVyLXNpZGVcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBjb21wb25lbnQgY29udGFpbnMgdGhlIG1lbnUuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVyLXNpZGXjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3BsaXR0ZXIgaWQ9XCJzcGxpdHRlclwiPlxuICogICA8b25zLXNwbGl0dGVyLWNvbnRlbnQ+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLXNwbGl0dGVyLWNvbnRlbnQ+XG4gKlxuICogICA8b25zLXNwbGl0dGVyLXNpZGUgc2lkZT1cImxlZnRcIiB3aWR0aD1cIjgwJVwiIGNvbGxhcHNlIHN3aXBlYWJsZT5cbiAqICAgICAuLi5cbiAqICAgPC9vbnMtc3BsaXR0ZXItc2lkZT5cbiAqIDwvb25zLXNwbGl0dGVyPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIHZhciBzcGxpdHRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdHRlcicpO1xuICogICBzcGxpdHRlci5sZWZ0Lm9wZW4oKTtcbiAqIDwvc2NyaXB0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGxpdHRlckVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgX2dldFNpZGUoc2lkZSkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCBlID0+IHtcbiAgICAgIHJldHVybiB1dGlsLm1hdGNoKGUsICdvbnMtc3BsaXR0ZXItc2lkZScpICYmIGUuZ2V0QXR0cmlidXRlKCdzaWRlJykgPT09IHNpZGU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGxlZnRcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUxlZnQgYDxvbnMtc3BsaXR0ZXItc2lkZT5gIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCBsZWZ0KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTaWRlKCdsZWZ0Jyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSByaWdodFxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmlnaHQgYDxvbnMtc3BsaXR0ZXItc2lkZT5gIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCByaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0U2lkZSgncmlnaHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc2lkZVxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyc3QgYDxvbnMtc3BsaXR0ZXItc2lkZT5gIGVsZW1lbnQgcmVnYXJkbGVzcyB0aGUgYWN0dWFsIHNpZGUuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCBzaWRlKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXNwbGl0dGVyLXNpZGUnKTtcbiAgfVxuXG4gIGdldCBfc2lkZXMoKSB7XG4gICAgcmV0dXJuIFt0aGlzLmxlZnQsIHRoaXMucmlnaHRdLmZpbHRlcihlID0+IGUpO1xuICB9XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY29udGVudFxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyLWNvbnRlbnQ+YCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1zcGxpdHRlci1jb250ZW50Jyk7XG4gIH1cblxuICBnZXQgdG9wUGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50Ll9jb250ZW50O1xuICB9XG5cbiAgZ2V0IG1hc2soKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtc3BsaXR0ZXItbWFzaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG4gIGdldCBvbkRldmljZUJhY2tCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uRGV2aWNlQmFja0J1dHRvbihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcikge1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyID0gZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICBfb25EZXZpY2VCYWNrQnV0dG9uKGV2ZW50KSB7XG4gICAgdGhpcy5fc2lkZXMuc29tZShzID0+IHMuaXNPcGVuID8gcy5jbG9zZSgpIDogZmFsc2UpIHx8IGV2ZW50LmNhbGxQYXJlbnRIYW5kbGVyKCk7XG4gIH1cblxuICBfb25Nb2RlQ2hhbmdlKGUpIHtcbiAgICBpZiAoZS50YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgdGhpcy5fbGF5b3V0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfbGF5b3V0KCkge1xuICAgIHRoaXMuX3NpZGVzLmZvckVhY2goc2lkZSA9PiB7XG4gICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgIHRoaXMuY29udGVudC5zdHlsZVtzaWRlLnNpZGVdID0gc2lkZS5tb2RlID09PSAnc3BsaXQnID8gc2lkZS5zdHlsZS53aWR0aCA6IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fb25Nb2RlQ2hhbmdlID0gdGhpcy5fb25Nb2RlQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgIXRoaXMubWFzayAmJiB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29ucy1zcGxpdHRlci1tYXNrJykpO1xuICAgICAgdGhpcy5fbGF5b3V0KCk7XG4gICAgfSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLm9uRGV2aWNlQmFja0J1dHRvbiA9IHRoaXMuX29uRGV2aWNlQmFja0J1dHRvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbW9kZWNoYW5nZScsIHRoaXMuX29uTW9kZUNoYW5nZSwgZmFsc2UpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCB0aGlzLl9vbk1vZGVDaGFuZ2UsIGZhbHNlKTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7fVxuXG4gIF9zaG93KCkge1xuICAgIHV0aWwucHJvcGFnYXRlQWN0aW9uKHRoaXMsICdfc2hvdycpO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ19oaWRlJyk7XG4gIH1cblxuICBfZGVzdHJveSgpIHtcbiAgICB1dGlsLnByb3BhZ2F0ZUFjdGlvbih0aGlzLCAnX2Rlc3Ryb3knKTtcbiAgICB0aGlzLnJlbW92ZSgpO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyQW5pbWF0b3IobmFtZSwgQW5pbWF0b3IpIHtcbiAgICBpZiAoIShBbmltYXRvciBpbnN0YW5jZW9mIFNwbGl0dGVyQW5pbWF0b3IpKSB7XG4gICAgICB1dGlsLnRocm93QW5pbWF0b3IoJ1NwbGl0dGVyJyk7XG4gICAgfVxuICAgIF9hbmltYXRvckRpY3RbbmFtZV0gPSBBbmltYXRvcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgU3BsaXR0ZXJBbmltYXRvcigpIHtcbiAgICByZXR1cm4gU3BsaXR0ZXJBbmltYXRvcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgYW5pbWF0b3JzKCkge1xuICAgIHJldHVybiBfYW5pbWF0b3JEaWN0O1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLlNwbGl0dGVyID0gU3BsaXR0ZXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc3BsaXR0ZXInLCBTcGxpdHRlckVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCBvcmllbnRhdGlvbiBmcm9tICcuLi9vbnMvb3JpZW50YXRpb24uanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBTcGxpdHRlckFuaW1hdG9yIGZyb20gJy4vb25zLXNwbGl0dGVyL2FuaW1hdG9yLmpzJztcbmltcG9ydCBTd2lwZVJldmVhbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvc3dpcGUtcmV2ZWFsLmpzJztcbmltcG9ydCBEb29yTG9jayBmcm9tICcuLi9vbnMvZG9vcmxvY2suanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgeyBQYWdlTG9hZGVyLCBkZWZhdWx0UGFnZUxvYWRlcn0gZnJvbSAnLi4vb25zL3BhZ2UtbG9hZGVyLmpzJztcbmltcG9ydCBTcGxpdHRlckVsZW1lbnQgZnJvbSAnLi9vbnMtc3BsaXR0ZXIuanMnO1xuXG5jb25zdCBTUExJVF9NT0RFID0gJ3NwbGl0JztcbmNvbnN0IENPTExBUFNFX01PREUgPSAnY29sbGFwc2UnO1xuY29uc3QgQ0xPU0VEX1NUQVRFID0gJ2Nsb3NlZCc7XG5jb25zdCBPUEVOX1NUQVRFID0gJ29wZW4nO1xuY29uc3QgQ0hBTkdJTkdfU1RBVEUgPSAnY2hhbmdpbmcnO1xuXG5jb25zdCByZXdyaXRhYmxlcyA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gc3BsaXR0ZXJTaWRlRWxlbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgcmVhZHkoc3BsaXR0ZXJTaWRlRWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuICB9XG59O1xuXG5jbGFzcyBDb2xsYXBzZURldGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHRhcmdldCkge1xuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX29uQ2hhbmdlID0gdGhpcy5fb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0YXJnZXQgJiYgdGhpcy5jaGFuZ2VUYXJnZXQodGFyZ2V0KTtcbiAgfVxuXG4gIGNoYW5nZVRhcmdldCh0YXJnZXQpIHtcbiAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBbJ3BvcnRyYWl0JywgJ2xhbmRzY2FwZSddLmluZGV4T2YodGFyZ2V0KSAhPT0gLTE7XG4gICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgX21hdGNoKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX29yaWVudGF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGFyZ2V0ID09PSAodmFsdWUuaXNQb3J0cmFpdCA/ICdwb3J0cmFpdCcgOiAnbGFuZHNjYXBlJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5tYXRjaGVzO1xuICB9XG5cbiAgX29uQ2hhbmdlKHZhbHVlKSB7XG4gICAgdGhpcy5fZWxlbWVudC5fdXBkYXRlTW9kZSh0aGlzLl9tYXRjaCh2YWx1ZSkgPyBDT0xMQVBTRV9NT0RFIDogU1BMSVRfTU9ERSk7XG4gIH1cblxuICBhY3RpdmF0ZSgpIHtcbiAgICBpZiAodGhpcy5fb3JpZW50YXRpb24pIHtcbiAgICAgIG9yaWVudGF0aW9uLm9uKCdjaGFuZ2UnLCB0aGlzLl9vbkNoYW5nZSk7XG4gICAgICB0aGlzLl9vbkNoYW5nZSh7aXNQb3J0cmFpdDogb3JpZW50YXRpb24uaXNQb3J0cmFpdCgpfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3F1ZXJ5UmVzdWx0ID0gd2luZG93Lm1hdGNoTWVkaWEodGhpcy5fdGFyZ2V0KTtcbiAgICAgIHRoaXMuX3F1ZXJ5UmVzdWx0LmFkZExpc3RlbmVyKHRoaXMuX29uQ2hhbmdlKTtcbiAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuX3F1ZXJ5UmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBkaXNhYmxlKCkge1xuICAgIGlmICh0aGlzLl9vcmllbnRhdGlvbikge1xuICAgICAgb3JpZW50YXRpb24ub2ZmKCdjaGFuZ2UnLCB0aGlzLl9vbkNoYW5nZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9xdWVyeVJlc3VsdCkge1xuICAgICAgdGhpcy5fcXVlcnlSZXN1bHQucmVtb3ZlTGlzdGVuZXIodGhpcy5fb25DaGFuZ2UpO1xuICAgICAgdGhpcy5fcXVlcnlSZXN1bHQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCB3aWR0aFRvUHggPSAod2lkdGgsIHBhcmVudCkgPT4ge1xuICBjb25zdCBbdmFsdWUsIHB4XSA9IFtwYXJzZUludCh3aWR0aCwgMTApLCAvcHgvLnRlc3Qod2lkdGgpXTtcbiAgcmV0dXJuIHB4ID8gdmFsdWUgOiBNYXRoLnJvdW5kKHBhcmVudC5vZmZzZXRXaWR0aCAqIHZhbHVlIC8gMTAwKTtcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNwbGl0dGVyLXNpZGVcbiAqIEBjYXRlZ29yeSBtZW51XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBUaGUgYDxvbnMtc3BsaXR0ZXItc2lkZT5gIGVsZW1lbnQgaXMgdXNlZCBhcyBhIGNoaWxkIGVsZW1lbnQgb2YgYDxvbnMtc3BsaXR0ZXI+YC5cbiAqXG4gKiAgICBJdCB3aWxsIGJlIGRpc3BsYXllZCBvbiBlaXRoZXIgdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBvZiB0aGUgYDxvbnMtc3BsaXR0ZXItY29udGVudD5gIGVsZW1lbnQuXG4gKlxuICogICAgSXQgc3VwcG9ydHMgdHdvIG1vZGVzOiBjb2xsYXBzZWQgYW5kIHNwbGl0LiBXaGVuIGl0J3MgaW4gY29sbGFwc2VkIG1vZGUgaXQgd2lsbCBiZSBoaWRkZW4gZnJvbSB2aWV3IGFuZCBjYW4gYmUgZGlzcGxheWVkIHdoZW4gdGhlIHVzZXIgc3dpcGVzIHRoZSBzY3JlZW4gb3IgdGFwcyBhIGJ1dHRvbi4gSW4gc3BsaXQgbW9kZSB0aGUgZWxlbWVudCBpcyBhbHdheXMgc2hvd24uIEl0IGNhbiBiZSBjb25maWd1cmVkIHRvIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gdGhlIHR3byBtb2RlcyBkZXBlbmRpbmcgb24gdGhlIHNjcmVlbiBzaXplLlxuICogIFsvZW5dXG4gKiAgW2phXW9ucy1zcGxpdHRlci1zaWRl6KaB57Sg44Gv44CBb25zLXNwbGl0dGVy6KaB57Sg44Gu5a2Q6KaB57Sg44Go44GX44Gm5Yip55So44GX44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIHJPUU9NTFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NwbGl0dGVyXG4gKiBAZ3VpZGUgZnVuZGFtZW50YWxzLmh0bWwjbWFuYWdpbmctcGFnZXNcbiAqICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXMuWy9lbl1cbiAqICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGxpdHRlclxuICogIFtlbl1UaGUgYDxvbnMtc3BsaXR0ZXI+YCBpcyB0aGUgcGFyZW50IGNvbXBvbmVudC5bL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXNwbGl0dGVyLWNvbnRlbnRcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyLWNvbnRlbnQ+YCBjb21wb25lbnQgY29udGFpbnMgdGhlIG1haW4gY29udGVudCBvZiB0aGUgcGFnZS5bL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXItY29udGVudOOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1zcGxpdHRlcj5cbiAqICAgPG9ucy1zcGxpdHRlci1jb250ZW50PlxuICogICAgIC4uLlxuICogICA8L29ucy1zcGxpdHRlci1jb250ZW50PlxuICpcbiAqICAgPG9ucy1zcGxpdHRlci1zaWRlIHNpZGU9XCJsZWZ0XCIgd2lkdGg9XCI4MCVcIiBjb2xsYXBzZT5cbiAqICAgICAuLi5cbiAqICAgPC9vbnMtc3BsaXR0ZXItc2lkZT5cbiAqIDwvb25zLXNwbGl0dGVyPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGxpdHRlclNpZGVFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgbW9kZWNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgY29tcG9uZW50J3MgbW9kZSBjaGFuZ2VzLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOOBruODouODvOODieOBjOWkieWMluOBl+OBn+mam+OBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQubW9kZVxuICAgKiAgIFtlbl1SZXR1cm5zIHRoZSBjdXJyZW50IG1vZGUuIENhbiBiZSBlaXRoZXIgYFwiY29sbGFwc2VcImAgb3IgYFwic3BsaXRcImAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu44Oi44O844OJ44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwcmVvcGVuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgc2xpZGluZyBtZW51IGlzIG9wZW5lZC5bL2VuXVxuICAgKiAgIFtqYV3jgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgYzplovjgY/liY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1DYWxsIHRvIGNhbmNlbCBvcGVuaW5nIHNsaWRpbmcgbWVudS5bL2VuXVxuICAgKiAgIFtqYV3jgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgYzplovjgY/jga7jgpLjgq3jg6Pjg7Pjgrvjg6vjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuc2lkZVxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdG9wZW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIHNsaWRpbmcgbWVudSBpcyBvcGVuZWQuWy9lbl1cbiAgICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844GM6ZaL44GE44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuc2lkZVxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlY2xvc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBzbGlkaW5nIG1lbnUgaXMgY2xvc2VkLlsvZW5dXG4gICAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWieOBmOOCi+WJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dQ2FsbCB0byBjYW5jZWwgb3BlbmluZyBzbGlkaW5nLW1lbnUuWy9lbl1cbiAgICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844GM6ZaJ44GY44KL44Gu44KS44Kt44Oj44Oz44K744Or44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0Y2xvc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIHNsaWRpbmcgbWVudSBpcyBjbG9zZWQuWy9lbl1cbiAgICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844GM6ZaJ44GY44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuc2lkZVxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgc3BsaXR0ZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnJhdGlvXG4gICAqICAgW2VuXURlY2ltYWwgcmF0aW8gKDAtMSkuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFuaW1hdGlvbk9wdGlvbnNcbiAgICogICBbZW5dWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0ICBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbi4gVXNlIG9uZSBvZiBgb3ZlcmxheWAsIGBwdXNoYCwgYHJldmVhbGAgb3IgIGBkZWZhdWx0YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+OCkuaMh+WumuOBl+OBvuOBmeOAglwib3ZlcmxheVwiLCBcInB1c2hcIiwgXCJyZXZlYWxcIiwgXCJkZWZhdWx0XCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG9wZW4tdGhyZXNob2xkXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0ICAwLjNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSBob3cgbXVjaCB0aGUgbWVudSBuZWVkcyB0byBiZSBzd2lwZWQgYmVmb3JlIG9wZW5pbmcuIEEgdmFsdWUgYmV0d2VlbiBgMGAgYW5kIGAxYC5bL2VuXVxuICAgKiAgW2phXeOBqeOBruOBj+OCieOBhOOCueODr+OCpOODl+OBmeOCjOOBsOOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOCkumWi+OBj+OBi+OBqeOBhuOBi+OBruWJsuWQiOOCkuaMh+WumuOBl+OBvuOBmeOAgjDjgYvjgokx44Gu6ZaT44Gu5pWw5YCk44KS5oyH5a6a44GX44G+44GZ44CC44K544Ov44Kk44OX44Gu6Led6Zui44GM44GT44GT44Gn5oyH5a6a44GX44Gf5pWw5YCk5o6b44GR44KL44GT44Gu6KaB57Sg44Gu5bmF44KI44KK44KC5aSn44GN44GR44KM44Gw44CB44K544Ov44Kk44OX44GM57WC44KP44Gj44Gf5pmC44Gr44GT44Gu6KaB57Sg44KS6ZaL44GN44G+44GZ44CC44OH44OV44Kp44Or44OI44GvMC4z44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgY29sbGFwc2VcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgU3BlY2lmeSB0aGUgY29sbGFwc2UgYmVoYXZpb3IuIFZhbGlkIHZhbHVlcyBhcmUgYFwicG9ydHJhaXRcImAsIGBcImxhbmRzY2FwZVwiYCBvciBhIG1lZGlhIHF1ZXJ5LlxuICAgKiAgICAgVGhlIHN0cmluZyBgXCJwb3J0cmFpdFwiYCBtZWFucyB0aGUgdmlldyB3aWxsIGNvbGxhcHNlIHdoZW4gdGhlIGRldmljZSBpcyBpbiBwb3J0cmFpdCBvcmllbnRhdGlvbi5cbiAgICogICAgIFRoZSBzdHJpbmcgYFwibGFuZHNjYXBlXCJgIG1lYW5zIHRoZSB2aWV3IHdpbGwgY29sbGFwc2Ugd2hlbiB0aGUgZGV2aWNlIGlzIGluIGxhbmRzY2FwZSBvcmllbnRhdGlvbi5cbiAgICogICAgIElmIHRoZSB2YWx1ZSBpcyBhIG1lZGlhIHF1ZXJ5LCB0aGUgdmlldyB3aWxsIGNvbGxhcHNlIHdoZW4gdGhlIG1lZGlhIHF1ZXJ5IHJlc29sdmVzIHRvIGB0cnVlYC5cbiAgICogICAgIElmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0LCBpbmNsdWRpbmcgYXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgdmlldyB3aWxsIGFsd2F5cyBiZSBpbiBgXCJjb2xsYXBzZVwiYCBtb2RlLlxuICAgKiAgICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgdmlldyB3aWxsIGJlIGluIGBcInNwbGl0XCJgIG1vZGUuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdXG4gICAqICAgICDlt6blgbTjga7jg5rjg7zjgrjjgpLpnZ7ooajnpLrjgavjgZnjgovmnaHku7bjgpLmjIflrprjgZfjgb7jgZnjgIJwb3J0cmFpdCwgbGFuZHNjYXBl44CBd2lkdGggI3B444KC44GX44GP44Gv44Oh44OH44Kj44Ki44Kv44Ko44Oq44Gu5oyH5a6a44GM5Y+v6IO944Gn44GZ44CCXG4gICAqICAgICBwb3J0cmFpdOOCguOBl+OBj+OBr2xhbmRzY2FwZeOCkuaMh+WumuOBmeOCi+OBqOOAgeODh+ODkOOCpOOCueOBrueUu+mdouOBjOe4puWQkeOBjeOCguOBl+OBj+OBr+aoquWQkeOBjeOBq+OBquOBo+OBn+aZguOBq+mBqeeUqOOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg44Oh44OH44Kj44Ki44Kv44Ko44Oq44KS5oyH5a6a44GZ44KL44Go44CB5oyH5a6a44GX44Gf44Kv44Ko44Oq44Gr6YGp5ZCI44GX44Gm44GE44KL5aC05ZCI44Gr6YGp55So44GV44KM44G+44GZ44CCXG4gICAqICAgICDlgKTjgavkvZXjgoLmjIflrprjgZfjgarjgYTloLTlkIjjgavjga/jgIHluLjjgatjb2xsYXBzZeODouODvOODieOBq+OBquOCiuOBvuOBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlLXRhcmdldC13aWR0aFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIHdpZHRoIG9mIHN3aXBlYWJsZSBhcmVhIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZWRnZSAoaW4gcGl4ZWxzKS4gVXNlIHRoaXMgdG8gZW5hYmxlIHN3aXBlIG9ubHkgd2hlbiB0aGUgZmluZ2VyIHRvdWNoIG9uIHRoZSBzY3JlZW4gZWRnZS5bL2VuXVxuICAgKiAgIFtqYV3jgrnjg6/jgqTjg5fjga7liKTlrprpoJjln5/jgpLjg5Tjgq/jgrvjg6vljZjkvY3jgafmjIflrprjgZfjgb7jgZnjgILnlLvpnaLjga7nq6/jgYvjgonmjIflrprjgZfjgZ/ot53pm6LjgavpgZTjgZnjgovjgajjg5rjg7zjgrjjgYzooajnpLrjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB3aWR0aFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2FuIGJlIHNwZWNpZmllZCBpbiBlaXRoZXIgcGl4ZWxzIG9yIGFzIGEgcGVyY2VudGFnZSwgZS5nLiBgOTAlYCBvciBgMjAwcHhgLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOOBruaoquW5heOCkuaMh+WumuOBl+OBvuOBmeOAgnB444GoJeOBp+OBruaMh+WumuOBjOWPr+iDveOBp+OBmeOAgmVnLiA5MCUsIDIwMHB4Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc2lkZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBsZWZ0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHdoaWNoIHNpZGUgb2YgdGhlIHNjcmVlbiB0aGUgYDxvbnMtc3BsaXR0ZXItc2lkZT5gIGVsZW1lbnQgaXMgbG9jYXRlZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgXCJsZWZ0XCJgIGFuZCBgXCJyaWdodFwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDjgYzlt6bjgYvlj7PjgYvjgpLmjIflrprjgZfjgb7jgZnjgILmjIflrprjgafjgY3jgovlgKTjga9cImxlZnRcIuOBi1wicmlnaHRcIuOBruOBv+OBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgbW9kZS4gUG9zc2libGUgdmFsdWVzIGFyZSBgXCJjb2xsYXBzZVwiYCBvciBgXCJzcGxpdFwiYC4gVGhpcyBhdHRyaWJ1dGUgaXMgcmVhZCBvbmx5LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruODouODvOODieOBjOioreWumuOBleOCjOOBvuOBmeOAglwiY29sbGFwc2VcIuOCguOBl+OBj+OBr1wic3BsaXRcIuOBjOaMh+WumuOBleOCjOOBvuOBmeOAguOBk+OBruWxnuaAp+OBr+iqreOBv+i+vOOBv+WwgueUqOOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBhZ2VcbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgVVJMIG9mIHRoZSBtZW51IHBhZ2UuWy9lbl1cbiAgICogICBbamFdb25zLXNwbGl0dGVyLXNpZGXopoHntKDjgavooajnpLrjgZnjgovjg5rjg7zjgrjjga5VUkzjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzd2lwZWFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRvIGVuYWJsZSBzd2lwZSBpbnRlcmFjdGlvbiBvbiBjb2xsYXBzZSBtb2RlLlsvZW5dXG4gICAqICAgW2phXWNvbGxhcHNl44Oi44O844OJ5pmC44Gr44K544Ov44Kk44OX5pON5L2c44KS5pyJ5Yq544Gr44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBzd2lwZWFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRvIGVuYWJsZSBzd2lwZSBpbnRlcmFjdGlvbiBvbiBjb2xsYXBzZSBtb2RlLlsvZW5dXG4gICAqICAgW2phXWNvbGxhcHNl44Oi44O844OJ5pmC44Gr44K544Ov44Kk44OX5pON5L2c44KS5pyJ5Yq544Gr44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX3BhZ2UgPSBudWxsO1xuICAgIHRoaXMuX3N0YXRlID0gQ0xPU0VEX1NUQVRFO1xuICAgIHRoaXMuX2xvY2sgPSBuZXcgRG9vckxvY2soKTtcbiAgICB0aGlzLl9wYWdlTG9hZGVyID0gZGVmYXVsdFBhZ2VMb2FkZXI7XG4gICAgdGhpcy5fY29sbGFwc2VEZXRlY3Rpb24gPSBuZXcgQ29sbGFwc2VEZXRlY3Rpb24odGhpcyk7XG5cbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogU3BsaXR0ZXJFbGVtZW50LmFuaW1hdG9ycyxcbiAgICAgIGJhc2VDbGFzczogU3BsaXR0ZXJBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdTcGxpdHRlckFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKVxuICAgIH0pO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIC8vIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIHVzZWQgZWFybHkgYnkgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnd2lkdGgnKTtcbiAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ3NpZGUnKSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2lkZScsICdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIHJld3JpdGFibGVzLnJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuX3BhZ2UgfHwgdGhpcy5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKTtcbiAgICAgICAgcGFnZSAmJiB0aGlzLmxvYWQocGFnZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdXRpbC5tYXRjaCh0aGlzLnBhcmVudE5vZGUsICdvbnMtc3BsaXR0ZXInKSkge1xuICAgICAgdXRpbC50aHJvdygnUGFyZW50IG11c3QgYmUgYW4gb25zLXNwbGl0dGVyIGVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3N3aXBlKSB7XG4gICAgICB0aGlzLl9zd2lwZSA9IG5ldyBTd2lwZVJldmVhbCh7XG4gICAgICAgIGVsZW1lbnQ6IHRoaXMsXG4gICAgICAgIGVsZW1lbnRIYW5kbGVyOiB0aGlzLnBhcmVudEVsZW1lbnQsXG4gICAgICAgIHN3aXBlTWF4OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSAxO1xuICAgICAgICAgIHRoaXMuX29uU3dpcGUgJiYgdGhpcy5fb25Td2lwZShyYXRpbywgdGhpcy5fYW5pbWF0aW9uT3B0KTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbywgYW5pbWF0aW9uT3B0aW9uczogdGhpcy5fYW5pbWF0aW9uT3B0IH0pO1xuICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9LFxuICAgICAgICBzd2lwZU1pZDogKGRpc3RhbmNlLCB3aWR0aCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGlvID0gZGlzdGFuY2UgLyB3aWR0aDtcbiAgICAgICAgICB0aGlzLl9vblN3aXBlICYmIHRoaXMuX29uU3dpcGUocmF0aW8pO1xuICAgICAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnc3dpcGUnLCB7IHJhdGlvIH0pO1xuICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnRyYW5zbGF0ZShkaXN0YW5jZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN3aXBlTWluOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSAwO1xuICAgICAgICAgIHRoaXMuX29uU3dpcGUgJiYgdGhpcy5fb25Td2lwZShyYXRpbywgdGhpcy5fYW5pbWF0aW9uT3B0KTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbywgYW5pbWF0aW9uT3B0aW9uczogdGhpcy5fYW5pbWF0aW9uT3B0IH0pO1xuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VGhyZXNob2xkOiAoKSA9PiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwYXJzZUZsb2F0KHRoaXMuZ2V0QXR0cmlidXRlKCdvcGVuLXRocmVzaG9sZCcpKSB8fCAwLjMpKSxcbiAgICAgICAgZ2V0U2lkZTogKCkgPT4gdGhpcy5zaWRlLFxuICAgICAgICBpc0luaXRpYWxTdGF0ZTogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNsb3NlZCA9IHRoaXMuX3N0YXRlID09PSBDTE9TRURfU1RBVEU7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBDSEFOR0lOR19TVEFURTtcbiAgICAgICAgICByZXR1cm4gY2xvc2VkO1xuICAgICAgICB9LFxuICAgICAgICBpZ25vcmVTd2lwZTogKGV2ZW50LCBkaXN0YW5jZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMuaXNPcGVuO1xuICAgICAgICAgIGNvbnN0IHZhbGlkRHJhZyA9IGQgPT4gdGhpcy5zaWRlID09PSAnbGVmdCdcbiAgICAgICAgICAgID8gKChkID09PSAnbGVmdCcgJiYgaXNPcGVuKSB8fCAoZCA9PT0gJ3JpZ2h0JyAmJiAhaXNPcGVuKSlcbiAgICAgICAgICAgIDogKChkID09PSAnbGVmdCcgJiYgIWlzT3BlbikgfHwgKGQgPT09ICdyaWdodCcgJiYgaXNPcGVuKSk7XG5cbiAgICAgICAgICBjb25zdCBhcmVhID0gTWF0aC5tYXgoMCwgcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3N3aXBlLXRhcmdldC13aWR0aCcpLCAxMCkgfHwgMCk7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5fbW9kZSA9PT0gU1BMSVRfTU9ERSB8fCB0aGlzLl9sb2NrLmlzTG9ja2VkKCkgfHwgdGhpcy5faXNPdGhlclNpZGVPcGVuKClcbiAgICAgICAgICAgIHx8ICF2YWxpZERyYWcoZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb24pXG4gICAgICAgICAgICB8fCAoIWlzT3BlbiAmJiBhcmVhICE9PSAwICYmIGRpc3RhbmNlID4gYXJlYSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnc3dpcGVhYmxlJyk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3Iub2JzZXJ2ZWRBdHRyaWJ1dGVzLmZvckVhY2goYXR0ciA9PiB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhdHRyLCBudWxsLCB0aGlzLmdldEF0dHJpYnV0ZShhdHRyKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdzaWRlJykgPT09ICdyaWdodCcgPyAncmlnaHQnIDogJ2xlZnQnO1xuICB9XG5cbiAgc2V0IHNpZGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzaWRlJywgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aWhzLnJlbW92ZUF0dHJpYnV0ZSgnc2lkZScpO1xuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX3N3aXBlICYmIHRoaXMuX3N3aXBlLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9hbmltYXRvciA9IHRoaXMuX2FuaW1hdGlvbk9wdCA9IHRoaXMuX3N3aXBlID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2FuaW1hdGlvbicsICd3aWR0aCcsICdjb2xsYXBzZScsICdzd2lwZWFibGUnLCAnYW5pbWF0aW9uLW9wdGlvbnMnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdzd2lwZWFibGUnOlxuICAgICAgICB0aGlzLl9zd2lwZSAmJiB0aGlzLl9zd2lwZS51cGRhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aWR0aCc6XG4gICAgICAgIGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTsgLy8gU29tZXRpbWVzIHVuZGVmaW5lZC4gQ0UgYnVnP1xuICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gL15cXGQrKHB4fCUpJC8udGVzdChjdXJyZW50KSA/IGN1cnJlbnQgOiAnODAlJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbmltYXRpb24nOlxuICAgICAgY2FzZSAnYW5pbWF0aW9uLW9wdGlvbnMnOlxuICAgICAgICB0aGlzLl91cGRhdGVBbmltYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzW3V0aWwuY2FtZWxpemUoYF91cGRhdGUtJHtuYW1lfWApXShjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICBfZW1pdEV2ZW50KG5hbWUpIHtcbiAgICBpZiAobmFtZS5zbGljZSgwLCAzKSAhPT0gJ3ByZScpIHtcbiAgICAgIHJldHVybiB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgbmFtZSwge3NpZGU6IHRoaXN9KTtcbiAgICB9XG4gICAgbGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcblxuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCBuYW1lLCB7XG4gICAgICBzaWRlOiB0aGlzLFxuICAgICAgY2FuY2VsOiAoKSA9PiBpc0NhbmNlbGVkID0gdHJ1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlzQ2FuY2VsZWQ7XG4gIH1cblxuICBfaXNPdGhlclNpZGVPcGVuKCkge1xuICAgIHJldHVybiAhIXV0aWwuZmluZENoaWxkKHRoaXMucGFyZW50RWxlbWVudCxcbiAgICAgIGVsID0+IGVsIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvciAmJiBlbCAhPT0gdGhpcyAmJiBlbC5fbW9kZSA9PT0gQ09MTEFQU0VfTU9ERSAmJiBlbC5pc09wZW5cbiAgICApO1xuICB9XG5cbiAgX3VwZGF0ZUNvbGxhcHNlKHZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2NvbGxhcHNlJykpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICdzcGxpdCcpIHtcbiAgICAgIHRoaXMuX2NvbGxhcHNlRGV0ZWN0aW9uLmRpc2FibGUoKTtcbiAgICAgIHJldHVybiB0aGlzLl91cGRhdGVNb2RlKFNQTElUX01PREUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnY29sbGFwc2UnKSB7XG4gICAgICB0aGlzLl9jb2xsYXBzZURldGVjdGlvbi5kaXNhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5fdXBkYXRlTW9kZShDT0xMQVBTRV9NT0RFKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb2xsYXBzZURldGVjdGlvbi5jaGFuZ2VUYXJnZXQodmFsdWUpO1xuICB9XG5cbiAgX3VwZGF0ZU1vZGUobW9kZSkge1xuICAgIGlmIChtb2RlICE9PSB0aGlzLl9tb2RlKSB7XG4gICAgICB0aGlzLl9tb2RlID0gbW9kZTtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdtb2RlJywgbW9kZSk7IC8vIHJlYWRvbmx5IGF0dHJpYnV0ZSBmb3IgdGhlIHVzZXJzXG5cbiAgICAgIGlmIChtb2RlID09PSBTUExJVF9NT0RFKSB7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yICYmIHRoaXMuX2FuaW1hdG9yLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBDTE9TRURfU1RBVEU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hbmltYXRvciAmJiB0aGlzLl9hbmltYXRvci5hY3RpdmF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPT09IE9QRU5fU1RBVEUgJiYgdGhpcy5fYW5pbWF0b3Iub3BlbigpO1xuICAgICAgfVxuXG4gICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ21vZGVjaGFuZ2UnLCB7IHNpZGU6IHRoaXMsIG1vZGUgfSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdGlvbihhbmltYXRpb24gPSB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJykpIHtcbiAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLl9hbmltYXRvciAmJiB0aGlzLl9hbmltYXRvci5kZWFjdGl2YXRlKCk7XG4gICAgICB0aGlzLl9hbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcih7YW5pbWF0aW9ufSk7XG4gICAgICB0aGlzLl9hbmltYXRvci5hY3RpdmF0ZSh0aGlzKTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbk9wdCA9IHtcbiAgICAgICAgdGltaW5nOiB0aGlzLl9hbmltYXRvci5kdXJhdGlvbixcbiAgICAgICAgZHVyYXRpb246IHRoaXMuX2FuaW1hdG9yLmR1cmF0aW9uXG4gICAgICB9O1xuICAgICAgdGhpcy5fYW5pbWF0b3IudXBkYXRlT3B0aW9ucyh0aGlzLmFuaW1hdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGFnZVxuICAgKiBAdHlwZSB7Kn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVBhZ2UgbG9jYXRpb24gdG8gbG9hZCBpbiB0aGUgc3BsaXR0ZXIgc2lkZS5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDlhoXjgavooajnpLrjgZnjgovjg5rjg7zjgrjjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBwYWdlXG4gICAqL1xuICBzZXQgcGFnZShwYWdlKSB7XG4gICAgdGhpcy5fcGFnZSA9IHBhZ2U7XG4gIH1cblxuICBnZXQgX2NvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMF07XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHBhZ2VMb2FkZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgcGFnZUxvYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUxvYWRlcjtcbiAgfVxuXG4gIHNldCBwYWdlTG9hZGVyKGxvYWRlcikge1xuICAgIGlmICghKGxvYWRlciBpbnN0YW5jZW9mIFBhZ2VMb2FkZXIpKSB7XG4gICAgICB1dGlsLnRocm93UGFnZUxvYWRlcigpO1xuICAgIH1cbiAgICB0aGlzLl9wYWdlTG9hZGVyID0gbG9hZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtb2RlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBtb2RlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFwic3BsaXRcIiwgXCJjb2xsYXBzZVwiLCBcImNsb3NlZFwiLCBcIm9wZW5cIiBvciBcImNoYW5naW5nXCIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCBtb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvblN3aXBlXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhvb2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgc3BsaXR0ZXIuIEl0IGdldHMgYSBkZWNpbWFsIHJhdGlvICgwLTEpIGFuZCBhbiBhbmltYXRpb25PcHRpb25zIG9iamVjdCBhcyBhcmd1bWVudHMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCBvblN3aXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9vblN3aXBlO1xuICB9XG5cbiAgc2V0IG9uU3dpcGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdXRpbC50aHJvdygnXCJvblN3aXBlXCIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMuX29uU3dpcGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBhbmltYXRpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSA/XG4gICAgICBBbmltYXRvckZhY3RvcnkucGFyc2VBbmltYXRpb25PcHRpb25zU3RyaW5nKHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpKSA6IHt9O1xuICB9XG5cbiAgc2V0IGFuaW1hdGlvbk9wdGlvbnModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBpc09wZW5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZpZXMgd2hldGhlciB0aGUgbWVudSBpcyBvcGVuZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldCBpc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGUgPT09IENPTExBUFNFX01PREUgJiYgdGhpcy5fc3RhdGUgIT09IENMT1NFRF9TVEFURTtcbiAgfVxuXG4gIHNldCBpc09wZW4odmFsdWUpIHtcbiAgICB0aGlzLnRvZ2dsZSh7fSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgb3BlblxuICAgKiBAc2lnbmF0dXJlIG9wZW4oW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG1lbnUgaGFzIGJlZW4gb3BlbmVkLlsvZW5dXG4gICAqICAgW2phXeODoeODi+ODpeODvOOBjOmWi+OBhOOBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1PcGVuIG1lbnUgaW4gY29sbGFwc2UgbW9kZS5bL2VuXVxuICAgKiAgIFtqYV1jb2xsYXBzZeODouODvOODieOBq+OBquOBo+OBpuOBhOOCi29ucy1zcGxpdHRlci1zaWRl6KaB57Sg44KS6ZaL44GN44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIHNwbGl0dGVyIHNpZGUgZWxlbWVudCBvciBmYWxzZSBpZiBub3QgaW4gY29sbGFwc2UgbW9kZVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBvcGVuKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGUob3B0aW9ucywgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjbG9zZVxuICAgKiBAc2lnbmF0dXJlIGNsb3NlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBtZW51IGhhcyBiZWVuIGNsb3NlZC5bL2VuXVxuICAgKiAgIFtqYV3jg6Hjg4vjg6Xjg7zjgYzplonjgZjjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2xvc2UgbWVudSBpbiBjb2xsYXBzZSBtb2RlLlsvZW5dXG4gICAqICAgW2phXWNvbGxhcHNl44Oi44O844OJ44Gr44Gq44Gj44Gm44GE44KLb25zLXNwbGl0dGVyLXNpZGXopoHntKDjgpLplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgc3BsaXR0ZXIgc2lkZSBlbGVtZW50IG9yIGZhbHNlIGlmIG5vdCBpbiBjb2xsYXBzZSBtb2RlWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGNsb3NlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGUob3B0aW9ucywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dT3BlbnMgaWYgaXQncyBjbG9zZWQuIENsb3NlcyBpZiBpdCdzIG9wZW4uWy9lbl1cbiAgICogICBbamFd6ZaL44GR44Gm44GE44KL5aC05ZCI44Gv6KaB57Sg44KS6ZaJ44GY44G+44GZ44Gd44GX44Gm6ZaL44GR44Gm44GE44KL5aC05ZCI44Gv6KaB57Sg44KS6ZaL44GN44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIHNwbGl0dGVyIHNpZGUgZWxlbWVudCBvciBmYWxzZSBpZiBub3QgaW4gY29sbGFwc2UgbW9kZVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICB0b2dnbGUob3B0aW9ucyA9IHt9LCBmb3JjZSkge1xuICAgIGNvbnN0IHNob3VsZE9wZW4gPSB0eXBlb2YgZm9yY2UgPT09ICdib29sZWFuJyA/IGZvcmNlIDogIXRoaXMuaXNPcGVuO1xuICAgIGNvbnN0IGFjdGlvbiA9IHNob3VsZE9wZW4gPyAnb3BlbicgOiAnY2xvc2UnO1xuICAgIGNvbnN0IEZJTkFMX1NUQVRFID0gc2hvdWxkT3BlbiA/IE9QRU5fU1RBVEUgOiBDTE9TRURfU1RBVEU7XG5cbiAgICBpZiAodGhpcy5fbW9kZSA9PT0gU1BMSVRfTU9ERSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gRklOQUxfU1RBVEUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9sb2NrLmlzTG9ja2VkKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQW5vdGhlciBzcGxpdHRlci1zaWRlIGFjdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7XG4gICAgfVxuICAgIGlmIChzaG91bGRPcGVuICYmIHRoaXMuX2lzT3RoZXJTaWRlT3BlbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0Fub3RoZXIgbWVudSBpcyBhbHJlYWR5IG9wZW4uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9lbWl0RXZlbnQoYHByZSR7YWN0aW9ufWApKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoYENhbmNlbGVkIGluIHByZSR7YWN0aW9ufSBldmVudC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bmxvY2sgPSB0aGlzLl9sb2NrLmxvY2soKTtcbiAgICB0aGlzLl9zdGF0ZSA9IENIQU5HSU5HX1NUQVRFO1xuXG4gICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLl91cGRhdGVBbmltYXRpb24ob3B0aW9ucy5hbmltYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuX2FuaW1hdG9yW2FjdGlvbl0oKCkgPT4ge1xuICAgICAgICB1dGlsLmlvc1BhZ2VTY3JvbGxGaXgoc2hvdWxkT3Blbik7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gRklOQUxfU1RBVEU7XG4gICAgICAgIHVubG9jaygpO1xuICAgICAgICB0aGlzLl9lbWl0RXZlbnQoYHBvc3Qke2FjdGlvbn1gKTtcbiAgICAgICAgb3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9wdGlvbnMuY2FsbGJhY2sodGhpcyk7XG4gICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGxvYWRcbiAgICogQHNpZ25hdHVyZSBsb2FkKHBhZ2UsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogICBbZW5dUGFnZSBVUkwuIENhbiBiZSBlaXRoZXIgYW4gSFRNTCBkb2N1bWVudCBvciBhIGA8dGVtcGxhdGU+YC5bL2VuXVxuICAgKiAgIFtqYV1wYWdl44GuVVJM44GL44CBYDx0ZW1wbGF0ZT5g44Gn5a6j6KiA44GX44Gf44OG44Oz44OX44Os44O844OI44GuaWTlsZ7mgKfjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2hvdyB0aGUgcGFnZSBzcGVjaWZpZWQgaW4gcGFnZVVybCBpbiB0aGUgcmlnaHQgc2VjdGlvblsvZW5dXG4gICAqICAgW2phXeaMh+WumuOBl+OBn1VSTOOCkuODoeOCpOODs+ODmuODvOOCuOOCkuiqreOBv+i+vOOBv+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBuZXcgcGFnZSBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGxvYWQocGFnZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5fcGFnZSA9IHBhZ2U7XG4gICAgY29uc3QgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8ICgoKSA9PiB7fSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBsZXQgb2xkQ29udGVudCA9IHRoaXMuX2NvbnRlbnQgfHwgbnVsbDtcblxuICAgICAgdGhpcy5fcGFnZUxvYWRlci5sb2FkKHtwYWdlLCBwYXJlbnQ6IHRoaXN9LCBwYWdlRWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChvbGRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5fcGFnZUxvYWRlci51bmxvYWQob2xkQ29udGVudCk7XG4gICAgICAgICAgb2xkQ29udGVudCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fc2hvdygpKTtcblxuICAgICAgICBjYWxsYmFjayhwYWdlRWxlbWVudCk7XG4gICAgICAgIHJlc29sdmUocGFnZUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfc2hvdygpIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fY29udGVudC5fc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9jb250ZW50Ll9oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX3BhZ2VMb2FkZXIudW5sb2FkKHRoaXMuX2NvbnRlbnQpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZSgpO1xuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncHJlb3BlbicsICdwb3N0b3BlbicsICdwcmVjbG9zZScsICdwb3N0Y2xvc2UnLCAnbW9kZWNoYW5nZScsICdzd2lwZSddO1xuICB9XG5cbiAgc3RhdGljIGdldCByZXdyaXRhYmxlcygpIHtcbiAgICByZXR1cm4gcmV3cml0YWJsZXM7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhTcGxpdHRlclNpZGVFbGVtZW50LCBbJ3N3aXBlYWJsZSddKTtcblxub25zRWxlbWVudHMuU3BsaXR0ZXJTaWRlID0gU3BsaXR0ZXJTaWRlRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNwbGl0dGVyLXNpZGUnLCBTcGxpdHRlclNpZGVFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VDaGVja2JveEVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtY2hlY2tib3guanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4uL29ucy9nZXN0dXJlLWRldGVjdG9yLmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3N3aXRjaC0tKicsXG4gICcuc3dpdGNoX19pbnB1dCc6ICdzd2l0Y2gtLSpfX2lucHV0JyxcbiAgJy5zd2l0Y2hfX2hhbmRsZSc6ICdzd2l0Y2gtLSpfX2hhbmRsZScsXG4gICcuc3dpdGNoX190b2dnbGUnOiAnc3dpdGNoLS0qX190b2dnbGUnXG59O1xuXG5jb25zdCBsb2NhdGlvbnMgPSB7XG4gIGlvczogWzEsIDIxXSxcbiAgbWF0ZXJpYWw6IFswLCAxNl1cbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXN3aXRjaFxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgU3dpdGNoIGNvbXBvbmVudC4gVGhlIHN3aXRjaCBjYW4gYmUgdG9nZ2xlZCBib3RoIGJ5IGRyYWdnaW5nIGFuZCB0YXBwaW5nLlxuICpcbiAqICAgICBXaWxsIGF1dG9tYXRpY2FsbHkgZGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gc3dpdGNoIG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqICAgWy9lbl1cbiAqICAgW2phXeOCueOCpOODg+ODgeOCkuihqOekuuOBmeOCi+OCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiBzd2l0Y2hbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIExwWFpRUVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3N3aXRjaFxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1zd2l0Y2ggY2hlY2tlZD48L29ucy1zd2l0Y2g+XG4gKiA8b25zLXN3aXRjaCBkaXNhYmxlZD48L29ucy1zd2l0Y2g+XG4gKiA8b25zLXN3aXRjaCBtb2RpZmllcj1cIm1hdGVyaWFsXCI+PC9vbnMtc3dpdGNoPlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEVsZW1lbnQgZXh0ZW5kcyBCYXNlQ2hlY2tib3hFbGVtZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCdtb2RpZmllcicsIG51bGwsIHRoaXMuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX29uQ2hhbmdlID0gdGhpcy5fb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblJlbGVhc2UgPSB0aGlzLl9vblJlbGVhc2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9sYXN0VGltZVN0YW1wID0gMDtcbiAgfVxuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdzd2l0Y2gnO1xuICB9XG5cbiAgZ2V0IF90ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICAgPGlucHV0IHR5cGU9XCIke3RoaXMudHlwZX1cIiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENsYXNzTmFtZX1fX2lucHV0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9fdG9nZ2xlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCIke3RoaXMuX2RlZmF1bHRDbGFzc05hbWV9X19oYW5kbGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9fdG91Y2hcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdjaGVja2JveCc7XG4gIH1cblxuICAvKiBPd24gcHJvcHMgKi9cblxuICBfZ2V0UG9zaXRpb24oZSkge1xuICAgIGNvbnN0IGwgPSB0aGlzLl9sb2NhdGlvbnM7XG4gICAgcmV0dXJuIE1hdGgubWluKGxbMV0sIE1hdGgubWF4KGxbMF0sIHRoaXMuX3N0YXJ0WCArIGUuZ2VzdHVyZS5kZWx0YVgpKTtcbiAgfVxuXG4gIF9lbWl0Q2hhbmdlRXZlbnQoKSB7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdjaGFuZ2UnLCB7XG4gICAgICB2YWx1ZTogdGhpcy5jaGVja2VkLFxuICAgICAgc3dpdGNoOiB0aGlzLFxuICAgICAgaXNJbnRlcmFjdGl2ZTogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgX29uQ2hhbmdlKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7XG4gIH1cblxuICBfb25DbGljayhldikge1xuICAgIGlmIChldi50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKGAke3RoaXMuZGVmYXVsdEVsZW1lbnRDbGFzc31fX3RvdWNoYClcbiAgICAgIHx8IChldi50aW1lU3RhbXAgLSB0aGlzLl9sYXN0VGltZVN0YW1wIDwgNTApIC8vIFByZXZlbnQgc2Vjb25kIGNsaWNrIHRyaWdnZXJlZCBieSA8bGFiZWw+XG4gICAgKSB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0VGltZVN0YW1wID0gZXYudGltZVN0YW1wO1xuICB9XG5cbiAgX29uSG9sZChlKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICBNb2RpZmllclV0aWwuYWRkTW9kaWZpZXIodGhpcywgJ2FjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVsZWFzZScsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgfVxuICB9XG5cbiAgX29uRHJhZ1N0YXJ0KGUpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGUuZ2VzdHVyZS5kaXJlY3Rpb24pID09PSAtMSkge1xuICAgICAgTW9kaWZpZXJVdGlsLnJlbW92ZU1vZGlmaWVyKHRoaXMsICdhY3RpdmUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlLmNvbnN1bWVkID0gdHJ1ZTtcblxuICAgIE1vZGlmaWVyVXRpbC5hZGRNb2RpZmllcih0aGlzLCAnYWN0aXZlJyk7XG4gICAgdGhpcy5fc3RhcnRYID0gdGhpcy5fbG9jYXRpb25zW3RoaXMuY2hlY2tlZCA/IDEgOiAwXTsvLyAtIGUuZ2VzdHVyZS5kZWx0YVg7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLl9vbkRyYWcpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlbGVhc2UnLCB0aGlzLl9vblJlbGVhc2UpO1xuICB9XG5cbiAgX29uRHJhZyhlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLl9oYW5kbGUuc3R5bGUubGVmdCA9IHRoaXMuX2dldFBvc2l0aW9uKGUpICsgJ3B4JztcbiAgfVxuXG4gIF9vblJlbGVhc2UoZSkge1xuICAgIGNvbnN0IGwgPSB0aGlzLl9sb2NhdGlvbnM7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9nZXRQb3NpdGlvbihlKTtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5jaGVja2VkO1xuXG4gICAgdGhpcy5jaGVja2VkID0gcG9zaXRpb24gPj0gKGxbMF0gKyBsWzFdKSAvIDI7XG5cbiAgICBpZiAodGhpcy5jaGVja2VkICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLl9vbkRyYWcpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlbGVhc2UnLCB0aGlzLl9vblJlbGVhc2UpO1xuXG4gICAgdGhpcy5faGFuZGxlLnN0eWxlLmxlZnQgPSAnJztcbiAgICBNb2RpZmllclV0aWwucmVtb3ZlTW9kaWZpZXIodGhpcywgJ2FjdGl2ZScpO1xuICB9XG5cbiAgY2xpY2soZXYgPSB7fSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDtcbiAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpO1xuICAgICAgdGhpcy5fbGFzdFRpbWVTdGFtcCA9IGV2LnRpbWVTdGFtcCB8fCAwO1xuICAgIH1cbiAgfVxuXG4gIGdldCBfaGFuZGxlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoYC4ke3RoaXMuX2RlZmF1bHRDbGFzc05hbWV9X19oYW5kbGVgKTtcbiAgfVxuXG4gIGdldCBjaGVja2JveCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXQ7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5faW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdob2xkJywgdGhpcy5fb25Ib2xkKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3RhcCcsIHRoaXMuY2xpY2spO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcbiAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgPSBuZXcgR2VzdHVyZURldGVjdG9yKHRoaXMsIHsgZHJhZ01pbkRpc3RhbmNlOiAxLCBob2xkVGltZW91dDogMjUxLCBwYXNzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX29uQ2hhbmdlKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignaG9sZCcsIHRoaXMuX29uSG9sZCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0YXAnLCB0aGlzLmNsaWNrKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG4gICAgaWYgKHRoaXMuX2dlc3R1cmVEZXRlY3Rvcikge1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWy4uLnN1cGVyLm9ic2VydmVkQXR0cmlidXRlcywgJ21vZGlmaWVyJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICBjb25zdCBtZCA9IChjdXJyZW50IHx8ICcnKS5pbmRleE9mKCdtYXRlcmlhbCcpICE9PSAtMTtcbiAgICAgIHRoaXMuX2xvY2F0aW9ucyA9IGxvY2F0aW9uc1ttZCA/ICdtYXRlcmlhbCcgOiAnaW9zJ107XG4gICAgfVxuXG4gICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBldmVudCBjaGFuZ2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIHN3aXRjaCBpcyB0b2dnbGVkLlsvZW5dXG4gICAqICAgW2phXU9OL09GRuOBjOWkieOCj+OBo+OBn+aZguOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnN3aXRjaFxuICAgKiAgIFtlbl1Td2l0Y2ggb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOBjOeZuueBq+OBl+OBn1N3aXRjaOOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQudmFsdWVcbiAgICogICBbZW5dQ3VycmVudCB2YWx1ZS5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7lgKTjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LmlzSW50ZXJhY3RpdmVcbiAgICogICBbZW5dVHJ1ZSBpZiB0aGUgY2hhbmdlIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgY2xpY2tpbmcgb24gdGhlIHN3aXRjaC5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg4Pjg5fjgoTjgq/jg6rjg4Pjgq/jgarjganjga7jg6bjg7zjgrbjga7mk43kvZzjgavjgojjgaPjgablpInjgo/jgaPjgZ/loLTlkIjjgavjga90cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHN3aXRjaC5bL2VuXVxuICAgKiAgW2phXeOCueOCpOODg+ODgeOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBzd2l0Y2ggaXMgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44K544Kk44OD44OB44KS54Sh5Yq544Gu54q25oWL44Gr44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgY2hlY2tlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgc3dpdGNoIGlzIGNoZWNrZWQuWy9lbl1cbiAgICogICBbamFd44K544Kk44OD44OB44GMT07jga7nirbmhYvjgavjgZnjgovjgajjgY3jgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpbnB1dC1pZFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYGlkYCBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNoZWNrZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGlzIHZhbHVlIGlzIGB0cnVlYCBpZiB0aGUgc3dpdGNoIGlzIGNoZWNrZWQuWy9lbl1cbiAgICogICBbamFd44K544Kk44OD44OB44GMT07jga7loLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW5wdXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2hlY2tib3hcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSB1bmRlcmx5aW5nIGNoZWNrYm94IGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI5YaF6YOo44GuY2hlY2tib3jopoHntKDjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBmb2N1c1xuICAgKiBAc2lnbmF0dXJlIGZvY3VzKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZvY3VzZXMgdGhlIHN3aXRjaC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBibHVyXG4gICAqIEBzaWduYXR1cmUgYmx1cigpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZW1vdmVzIGZvY3VzIGZyb20gdGhlIHN3aXRjaC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxub25zRWxlbWVudHMuU3dpdGNoID0gU3dpdGNoRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXN3aXRjaCcsIFN3aXRjaEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgU3dpcGVyIGZyb20gJy4uL29ucy9pbnRlcm5hbC9zd2lwZXIuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnLnRhYmJhcl9fY29udGVudCc6ICd0YWJiYXItLSpfX2NvbnRlbnQnLFxuICAnLnRhYmJhcl9fYm9yZGVyJzogJ3RhYmJhci0tKl9fYm9yZGVyJyxcbiAgJy50YWJiYXInOiAndGFiYmFyLS0qJ1xufTtcblxuY29uc3QgcmV3cml0YWJsZXMgPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhYmJhckVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHJlYWR5KHRhYmJhckVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufTtcblxuY29uc3QgbnVsbFBhZ2UgPSBpbnRlcm5hbC5udWxsRWxlbWVudDtcbmNvbnN0IGxlcnAgPSAoeDAsIHgxLCB0KSA9PiAoMSAtIHQpICogeDAgKyB0ICogeDE7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXRhYmJhclxuICogQGNhdGVnb3J5IHRhYmJhclxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1BIGNvbXBvbmVudCB0byBkaXNwbGF5IGEgdGFiIGJhciBvbiB0aGUgYm90dG9tIG9mIGEgcGFnZS4gVXNlZCB3aXRoIGA8b25zLXRhYj5gIHRvIG1hbmFnZSBwYWdlcyB1c2luZyB0YWJzLlsvZW5dXG4gKiAgIFtqYV3jgr/jg5bjg5Djg7zjgpLjg5rjg7zjgrjkuIvpg6jjgavooajnpLrjgZnjgovjgZ/jgoHjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJvbnMtdGFi44Go57WE44G/5ZCI44KP44Gb44Gm5L2/44GG44GT44Go44Gn44CB44Oa44O844K444KS566h55CG44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIHBHdURMXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvdGFiYmFyXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXUEgdGFiYmFyIGluIE1hdGVyaWFsIERlc2lnbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciBhdXRvZ3Jvd1xuICogICBbZW5dVGFicyBhdXRvbWF0aWNhbGx5IGdyb3cgZGVwZW5kaW5nIG9uIHRoZWlyIGNvbnRlbnQgaW5zdGVhZCBvZiBoYXZpbmcgYSBmaXhlZCB3aWR0aC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciB0b3AtYm9yZGVyXG4gKiAgIFtlbl1TaG93cyBhIHN0YXRpYyBib3JkZXItYm90dG9tIGluIHRhYnMgZm9yIGlPUyB0b3AgdGFiYmFycy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBndWlkZSBmdW5kYW1lbnRhbHMuaHRtbCNtYW5hZ2luZy1wYWdlc1xuICogIFtlbl1NYW5hZ2luZyBtdWx0aXBsZSBwYWdlcy5bL2VuXVxuICogIFtqYV3opIfmlbDjga7jg5rjg7zjgrjjgpLnrqHnkIbjgZnjgotbL2phXVxuICogQHNlZWFsc28gb25zLXRhYlxuICogICBbZW5dVGhlIGA8b25zLXRhYj5gIGNvbXBvbmVudC5bL2VuXVxuICogICBbamFdb25zLXRhYuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtcGFnZVxuICogICBbZW5dVGhlIGA8b25zLXBhZ2U+YCBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXW9ucy1wYWdl44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXRhYmJhcj5cbiAqICAgPG9ucy10YWJcbiAqICAgICBwYWdlPVwiaG9tZS5odG1sXCJcbiAqICAgICBsYWJlbD1cIkhvbWVcIlxuICogICAgIGFjdGl2ZT5cbiAqICAgPC9vbnMtdGFiPlxuICogICA8b25zLXRhYlxuICogICAgIHBhZ2U9XCJzZXR0aW5ncy5odG1sXCJcbiAqICAgICBsYWJlbD1cIlNldHRpbmdzXCJcbiAqICAgICBhY3RpdmU+XG4gKiAgIDwvb25zLXRhYj5cbiAqIDwvb25zLXRhYmJhcj5cbiAqXG4gKiA8dGVtcGxhdGUgaWQ9XCJob21lLmh0bWxcIj5cbiAqICAgLi4uXG4gKiA8L3RlbXBsYXRlPlxuICpcbiAqIDx0ZW1wbGF0ZSBpZD1cInNldHRpbmdzLmh0bWxcIj5cbiAqICAgLi4uXG4gKiA8L3RlbXBsYXRlPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYWJiYXJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlY2hhbmdlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlcyBqdXN0IGJlZm9yZSB0aGUgdGFiIGlzIGNoYW5nZWQuWy9lbl1cbiAgICogICBbamFd44Ki44Kv44OG44Kj44OW44Gq44K/44OW44GM5aSJ44KP44KL5YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuaW5kZXhcbiAgICogICBbZW5dQ3VycmVudCBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgotvbnMtdGFi44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnRhYkl0ZW1cbiAgICogICBbZW5dVGFiIGl0ZW0gb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXXRhYkl0ZW3jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNhbmNlbCB0aGUgY2hhbmdlIGV2ZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWRvOOBs+WHuuOBmeOBqOOAgeOCouOCr+ODhuOCo+ODluOBquOCv+ODluOBruWkieabtOOBjOOCreODo+ODs+OCu+ODq+OBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMganVzdCBhZnRlciB0aGUgdGFiIGlzIGNoYW5nZWQuWy9lbl1cbiAgICogICBbamFd44Ki44Kv44OG44Kj44OW44Gq44K/44OW44GM5aSJ44KP44Gj44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuaW5kZXhcbiAgICogICBbZW5dQ3VycmVudCBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgotvbnMtdGFi44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnRhYkl0ZW1cbiAgICogICBbZW5dVGFiIGl0ZW0gb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXXRhYkl0ZW3jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHJlYWN0aXZlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlcyBpZiB0aGUgYWxyZWFkeSBvcGVuIHRhYiBpcyB0YXBwZWQgYWdhaW4uWy9lbl1cbiAgICogICBbamFd44GZ44Gn44Gr44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KL44K/44OW44GM44KC44GG5LiA5bqm44K/44OD44OX44KE44Kv44Oq44OD44Kv44GV44KM44Gf5aC05ZCI44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuaW5kZXhcbiAgICogICBbZW5dQ3VycmVudCBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgotvbnMtdGFi44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnRhYkl0ZW1cbiAgICogICBbZW5dVGFiIGl0ZW0gb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXXRhYkl0ZW3jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHN3aXBlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlcyB3aGVuIHRoZSB0YWJiYXIgc3dpcGVzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KLb25zLXRhYuOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5vcHRpb25zXG4gICAqICAgW2VuXUFuaW1hdGlvbiBvcHRpb25zIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcG9zaXRpb25cbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IGJvdHRvbVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGFiYmFyJ3MgcG9zaXRpb24uIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGBcImJvdHRvbVwiYCBhbmQgYFwidG9wXCJgLiBVc2UgYFwiYXV0b1wiYCB0byBjaG9vc2UgcG9zaXRpb24gZGVwZW5kaW5nIG9uIHBsYXRmb3JtIChib3R0b20gZm9yIGlPUyBmbGF0IGRlc2lnbiwgdG9wIGZvciBNYXRlcmlhbCBEZXNpZ24pLlsvZW5dXG4gICAqICAgW2phXeOCv+ODluODkOODvOOBruS9jee9ruOCkuaMh+WumuOBl+OBvuOBmeOAglwiYm90dG9tXCLjgoLjgZfjgY/jga9cInRvcFwi44KS6YG45oqe44Gn44GN44G+44GZ44CC44OH44OV44Kp44Or44OI44GvXCJib3R0b21cIuOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlYWJsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSB0YWIgYmFyIGNhbiBiZSBzY3JvbGxlZCBieSBkcmFnIG9yIHN3aXBlLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeOCv+ODluODkOODvOOCkuOCueODr+OCpOODl+OChOODieODqeODg+OCsOOBp+enu+WLleOBp+OBjeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGlnbm9yZS1lZGdlLXdpZHRoXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0IDIwXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1EaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSBib3RoIGVkZ2VzLiBTd2lwaW5nIG9uIHRoZXNlIGFyZWFzIHdpbGwgcHJpb3JpdGl6ZSBwYXJlbnQgY29tcG9uZW50cyBzdWNoIGFzIGBvbnMtc3BsaXR0ZXJgIG9yIGBvbnMtbmF2aWdhdG9yYC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhY3RpdmUtaW5kZXhcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGluZGV4IG9mIHRoZSB0YWIgdGhhdCBpcyBjdXJyZW50bHkgYWN0aXZlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWN0aXZlSW5kZXhcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGluZGV4IG9mIHRoZSB0YWIgdGhhdCBpcyBjdXJyZW50bHkgYWN0aXZlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGhpZGUtdGFic1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0byBoaWRlIHRoZSB0YWJzLlsvZW5dXG4gICAqICAgW2phXeOCv+ODluOCkumdnuihqOekuuOBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaGlkZVRhYnNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdG8gaGlkZSB0aGUgdGFicy5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjgpLpnZ7ooajnpLrjgavjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB0YWItYm9yZGVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIHRhYnMgc2hvdyBhIGR5bmFtaWMgYm90dG9tIGJvcmRlci4gT25seSB3b3JrcyBmb3IgaU9TIGZsYXQgZGVzaWduIHNpbmNlIHRoZSBib3JkZXIgaXMgYWx3YXlzIHZpc2libGUgaW4gTWF0ZXJpYWwgRGVzaWduLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdGFiQm9yZGVyXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdGhlIHRhYnMgc2hvdyBhIGR5bmFtaWMgYm90dG9tIGJvcmRlci4gT25seSB3b3JrcyBmb3IgaU9TIGZsYXQgZGVzaWduIHNpbmNlIHRoZSBib3JkZXIgaXMgYWx3YXlzIHZpc2libGUgaW4gTWF0ZXJpYWwgRGVzaWduLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgdGFiYmFyLlsvZW5dXG4gICAqICAgW2phXeOCv+ODluODkOODvOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbG9hZEluYWN0aXZlID0gdXRpbC5kZWZlcigpOyAvLyBJbXByb3ZlcyAjMjMyNFxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ3N3aXBlJyk7XG4gICAgdGhpcy5fY29ubmVjdE9uU3dpcGUgPSBvbkNvbm5lY3RlZDtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25Td2lwZSA9IG9uRGlzY29ubmVjdGVkO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9zd2lwZXIpIHtcbiAgICAgIHRoaXMuX3N3aXBlciA9IG5ldyBTd2lwZXIoe1xuICAgICAgICBnZXRFbGVtZW50OiAoKSA9PiB0aGlzLl9jb250ZW50RWxlbWVudCxcbiAgICAgICAgZ2V0SW5pdGlhbEluZGV4OiAoKSA9PiB0aGlzLmFjdGl2ZUluZGV4IHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdhY3RpdmVJbmRleCcpLFxuICAgICAgICBnZXRBdXRvU2Nyb2xsUmF0aW86IHRoaXMuX2dldEF1dG9TY3JvbGxSYXRpby5iaW5kKHRoaXMpLFxuICAgICAgICBnZXRCdWJibGVXaWR0aDogKCkgPT4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2lnbm9yZS1lZGdlLXdpZHRoJykgfHwgMjUsIDEwKSxcbiAgICAgICAgaXNBdXRvU2Nyb2xsYWJsZTogKCkgPT4gdHJ1ZSxcbiAgICAgICAgcHJlQ2hhbmdlSG9vazogdGhpcy5fb25QcmVDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgcG9zdENoYW5nZUhvb2s6IHRoaXMuX29uUG9zdENoYW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICByZWZyZXNoSG9vazogdGhpcy5fb25SZWZyZXNoLmJpbmQodGhpcyksXG4gICAgICAgIHNjcm9sbEhvb2s6IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcylcbiAgICAgIH0pO1xuXG4gICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICB0aGlzLl90YWJiYXJCb3JkZXIgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90YWJiYXJFbGVtZW50LCAnLnRhYmJhcl9fYm9yZGVyJyk7XG4gICAgICAgIHRoaXMuX3N3aXBlci5pbml0KHsgc3dpcGVhYmxlOiB0aGlzLmhhc0F0dHJpYnV0ZSgnc3dpcGVhYmxlJykgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHkoKTtcblxuICAgICAgaWYgKCF1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy1wYWdlJywgcCA9PiBwID09PSBkb2N1bWVudC5ib2R5KSkge1xuICAgICAgICB0aGlzLl9zaG93KCk7IC8vIFRoaXMgdGFiYmFyIGlzIHRoZSB0b3AgY29tcG9uZW50XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0T25Td2lwZSgpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuX3N3aXBlciAmJiB0aGlzLl9zd2lwZXIuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX3N3aXBlci5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9zd2lwZXIgPSBudWxsO1xuICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyID0gbnVsbDtcbiAgICAgIHRoaXMuX3RhYnNSZWN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXNjb25uZWN0T25Td2lwZSgpO1xuICB9XG5cbiAgX25vcm1hbGl6ZUV2ZW50KGV2ZW50KSB7XG4gICAgcmV0dXJuIHsgLi4uZXZlbnQsIGluZGV4OiBldmVudC5hY3RpdmVJbmRleCwgdGFiSXRlbTogdGhpcy50YWJzW2V2ZW50LmFjdGl2ZUluZGV4XSB9O1xuICB9XG5cbiAgX29uUG9zdENoYW5nZShldmVudCkge1xuICAgIGV2ZW50ID0gdGhpcy5fbm9ybWFsaXplRXZlbnQoZXZlbnQpO1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncG9zdGNoYW5nZScsIGV2ZW50KTtcbiAgICBjb25zdCBwYWdlID0gZXZlbnQudGFiSXRlbS5wYWdlRWxlbWVudDtcbiAgICBwYWdlICYmIHBhZ2UuX3Nob3coKTtcbiAgfVxuXG4gIF9vblByZUNoYW5nZShldmVudCkge1xuICAgIGV2ZW50ID0gdGhpcy5fbm9ybWFsaXplRXZlbnQoZXZlbnQpO1xuICAgIGV2ZW50LmNhbmNlbCA9ICgpID0+IGV2ZW50LmNhbmNlbGVkID0gdHJ1ZTtcblxuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncHJlY2hhbmdlJywgZXZlbnQpO1xuXG4gICAgaWYgKCFldmVudC5jYW5jZWxlZCkge1xuICAgICAgY29uc3QgeyBhY3RpdmVJbmRleCwgbGFzdEFjdGl2ZUluZGV4IH0gPSBldmVudDtcbiAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLnRhYnM7XG5cbiAgICAgIHRhYnNbYWN0aXZlSW5kZXhdLnNldEFjdGl2ZSh0cnVlKTtcbiAgICAgIGlmIChsYXN0QWN0aXZlSW5kZXggPj0gMCkge1xuICAgICAgICBjb25zdCBwcmV2VGFiID0gdGFic1tsYXN0QWN0aXZlSW5kZXhdO1xuICAgICAgICBwcmV2VGFiLnNldEFjdGl2ZShmYWxzZSk7XG4gICAgICAgIHByZXZUYWIucGFnZUVsZW1lbnQgJiYgcHJldlRhYi5wYWdlRWxlbWVudC5faGlkZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBldmVudC5jYW5jZWxlZDtcbiAgfVxuXG4gIF9vblNjcm9sbChpbmRleCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX3RhYmJhckJvcmRlcikge1xuICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLnRyYW5zaXRpb24gPSBgYWxsICR7b3B0aW9ucy5kdXJhdGlvbiB8fCAwfXMgJHtvcHRpb25zLnRpbWluZyB8fCAnJ31gO1xuXG4gICAgICBpZiAodGhpcy5fYXV0b2dyb3cgJiYgdGhpcy5fdGFic1JlY3QubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhID0gTWF0aC5mbG9vcihpbmRleCksIGIgPSBNYXRoLmNlaWwoaW5kZXgpLCByID0gaW5kZXggJSAxO1xuICAgICAgICB0aGlzLl90YWJiYXJCb3JkZXIuc3R5bGUud2lkdGggPSBsZXJwKHRoaXMuX3RhYnNSZWN0W2FdLndpZHRoLCB0aGlzLl90YWJzUmVjdFtiXS53aWR0aCwgcikgKyAncHgnO1xuICAgICAgICB0aGlzLl90YWJiYXJCb3JkZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7bGVycCh0aGlzLl90YWJzUmVjdFthXS5sZWZ0LCB0aGlzLl90YWJzUmVjdFtiXS5sZWZ0LCByKX1weCwgMCwgMClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke2luZGV4ICogMTAwfSUsIDAsIDApYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyBpbmRleCwgb3B0aW9ucyB9KTtcbiAgfVxuXG4gIF9vblJlZnJlc2goKSB7XG4gICAgdGhpcy5fYXV0b2dyb3cgPSB1dGlsLmhhc01vZGlmaWVyKHRoaXMsICdhdXRvZ3JvdycpO1xuICAgIHRoaXMuX3RhYnNSZWN0ID0gdGhpcy50YWJzLm1hcCh0YWIgPT4gdGFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICBpZiAodGhpcy5fdGFiYmFyQm9yZGVyKSB7XG4gICAgICB0aGlzLl90YWJiYXJCb3JkZXIuc3R5bGUuZGlzcGxheSA9IHRoaXMuaGFzQXR0cmlidXRlKCd0YWItYm9yZGVyJykgfHwgdXRpbC5oYXNNb2RpZmllcih0aGlzLCAnbWF0ZXJpYWwnKSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiSW5kZXgoKTtcbiAgICAgIGlmICh0aGlzLl90YWJzUmVjdC5sZW5ndGggPiAwICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLndpZHRoID0gdGhpcy5fdGFic1JlY3RbaW5kZXhdLndpZHRoICsgJ3B4JztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfZ2V0QXV0b1Njcm9sbFJhdGlvKG1hdGNoZXMsIHZlbG9jaXR5LCBzaXplKSB7XG4gICAgY29uc3QgcmF0aW8gPSAuNjsgLy8gQmFzZSByYXRpb1xuICAgIGNvbnN0IG1vZGlmaWVyID0gc2l6ZSAvIDMwMCAqIChtYXRjaGVzID8gLTEgOiAxKTsgLy8gQmFzZWQgb24gc2NyZWVuIHNpemVcbiAgICByZXR1cm4gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgcmF0aW8gKyB2ZWxvY2l0eSAqIG1vZGlmaWVyKSk7XG4gIH1cblxuICBnZXQgX3RhYmJhckVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcudGFiYmFyJyk7XG4gIH1cblxuICBnZXQgX2NvbnRlbnRFbGVtZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYmJhcl9fY29udGVudCcpO1xuICB9XG5cbiAgZ2V0IF90YXJnZXRFbGVtZW50KCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9jb250ZW50RWxlbWVudDtcbiAgICByZXR1cm4gY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuWzBdIHx8IG51bGw7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9jb250ZW50RWxlbWVudCB8fCB1dGlsLmNyZWF0ZSgnLnRhYmJhcl9fY29udGVudCcpO1xuICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnb25zLXRhYmJhcl9fY29udGVudCcpO1xuICAgIGNvbnN0IHRhYmJhciA9IHRoaXMuX3RhYmJhckVsZW1lbnQgfHwgdXRpbC5jcmVhdGUoJy50YWJiYXInKTtcbiAgICB0YWJiYXIuY2xhc3NMaXN0LmFkZCgnb25zLXRhYmJhcl9fZm9vdGVyJyk7XG5cbiAgICBpZiAoIXRhYmJhci5wYXJlbnROb2RlKSB7XG4gICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKSB7XG4gICAgICAgIHRhYmJhci5hcHBlbmRDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YWJiYXIuY2hpbGRyZW4ubGVuZ3RoID4gdGhpcy5hY3RpdmVJbmRleCAmJiAhdXRpbC5maW5kQ2hpbGQodGFiYmFyLCAnW2FjdGl2ZV0nKSkge1xuICAgICAgdGFiYmFyLmNoaWxkcmVuW3RoaXMuYWN0aXZlSW5kZXhdLnNldEF0dHJpYnV0ZSgnYWN0aXZlJywgJycpO1xuICAgIH1cblxuICAgIHRoaXMuX3RhYmJhckJvcmRlciA9IHV0aWwuZmluZENoaWxkKHRhYmJhciwgJy50YWJiYXJfX2JvcmRlcicpIHx8IHV0aWwuY3JlYXRlKCcudGFiYmFyX19ib3JkZXInKTtcbiAgICB0YWJiYXIuYXBwZW5kQ2hpbGQodGhpcy5fdGFiYmFyQm9yZGVyKTtcbiAgICB0YWJiYXIuY2xhc3NMaXN0LmFkZCgnb25zLXN3aXBlci10YWJiYXInKTsgLy8gSGlkZXMgbWF0ZXJpYWwgYm9yZGVyXG5cbiAgICAhY29udGVudC5jaGlsZHJlblswXSAmJiBjb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICAhY29udGVudC5jaGlsZHJlblsxXSAmJiBjb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkID0gY29udGVudC5hcHBlbmRDaGlsZC5iaW5kKGNvbnRlbnQuY2hpbGRyZW5bMF0pO1xuICAgIGNvbnRlbnQuaW5zZXJ0QmVmb3JlID0gY29udGVudC5pbnNlcnRCZWZvcmUuYmluZChjb250ZW50LmNoaWxkcmVuWzBdKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0YWJiYXIpOyAvLyBUcmlnZ2VycyBvbnMtdGFiIGNvbm5lY3RlZENhbGxiYWNrXG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24ocG9zaXRpb24gPSB0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKSkge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuX3RvcCA9IHBvc2l0aW9uID09PSAndG9wJyB8fCAocG9zaXRpb24gPT09ICdhdXRvJyAmJiB1dGlsLmhhc01vZGlmaWVyKHRoaXMsICdtYXRlcmlhbCcpKTtcbiAgICBjb25zdCBhY3Rpb24gPSB0b3AgPyB1dGlsLmFkZE1vZGlmaWVyIDogdXRpbC5yZW1vdmVNb2RpZmllcjtcblxuICAgIGFjdGlvbih0aGlzLCAndG9wJyk7XG5cbiAgICBjb25zdCBwYWdlID0gdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtcGFnZScpO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBjb250ZW50UmVhZHkocGFnZSwgKCkgPT4ge1xuICAgICAgICBsZXQgcCA9IDA7XG4gICAgICAgIGlmIChwYWdlLmNoaWxkcmVuWzBdICYmIHV0aWwubWF0Y2gocGFnZS5jaGlsZHJlblswXSwgJ29ucy10b29sYmFyJykpIHtcbiAgICAgICAgICBhY3Rpb24ocGFnZS5jaGlsZHJlblswXSwgJ25vc2hhZG93Jyk7XG4gICAgICAgICAgcCA9IDE7IC8vIFZpc3VhbCBmaXggZm9yIHNvbWUgZGV2aWNlc1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHBhZ2UuX2dldENvbnRlbnRFbGVtZW50KCk7XG4gICAgICAgIGNvbnN0IGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFnZS5fZ2V0Q29udGVudEVsZW1lbnQoKSwgbnVsbCk7XG5cbiAgICAgICAgdGhpcy5zdHlsZS50b3AgPSB0b3AgPyBwYXJzZUludChjcy5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpLCAxMCkgLSBwICsgJ3B4JyA6ICcnO1xuXG4gICAgICAgIC8vIFJlZnJlc2ggY29udGVudCB0b3AgLSBGaXggZm9yIGlPUyA4XG4gICAgICAgIGNvbnRlbnQuc3R5bGUudG9wID0gY3MudG9wO1xuICAgICAgICBjb250ZW50LnN0eWxlLnRvcCA9ICcnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW50ZXJuYWwuYXV0b1N0YXR1c0JhckZpbGwoKCkgPT4ge1xuICAgICAgY29uc3QgZmlsbGVkID0gdXRpbC5maW5kUGFyZW50KHRoaXMsIGUgPT4gZS5oYXNBdHRyaWJ1dGUoJ3N0YXR1cy1iYXItZmlsbCcpKTtcbiAgICAgIHV0aWwudG9nZ2xlQXR0cmlidXRlKHRoaXMsICdzdGF0dXMtYmFyLWZpbGwnLCB0b3AgJiYgIWZpbGxlZCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgdG9wUGFnZSgpIHtcbiAgICBjb25zdCB0YWJzID0gdGhpcy50YWJzLFxuICAgICAgaW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4KCk7XG4gICAgcmV0dXJuIHRhYnNbaW5kZXhdXG4gICAgICA/IHRhYnNbaW5kZXhdLnBhZ2VFbGVtZW50IHx8IHRoaXMucGFnZXNbMF0gfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgZ2V0IHBhZ2VzKCkge1xuICAgIHJldHVybiB1dGlsLmFycmF5RnJvbSh0aGlzLl90YXJnZXRFbGVtZW50LmNoaWxkcmVuKTtcbiAgfVxuXG4gIGdldCB0YWJzKCkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodGhpcy5fdGFiYmFyRWxlbWVudC5jaGlsZHJlbiwgZSA9PiBlLnRhZ05hbWUgPT09ICdPTlMtVEFCJyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRBY3RpdmVUYWJcbiAgICogQHNpZ25hdHVyZSBzZXRBY3RpdmVUYWIoaW5kZXgsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgW2VuXVRhYiBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUZ1bmN0aW9uIHRoYXQgcnVucyB3aGVuIHRoZSBuZXcgcGFnZSBoYXMgbG9hZGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUlmIHRoaXMgb3B0aW9uIGlzIFwibm9uZVwiLCB0aGUgdHJhbnNpdGlvbiB3b24ndCBzbGlkZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgc3BlY2lmaWVkIHRhYiBwYWdlLiBBbmltYXRpb25zIGFuZCB0aGVpciBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuWy9lbl1cbiAgICogICBbamFd5oyH5a6a44GX44Gf44Kk44Oz44OH44OD44Kv44K544Gu44K/44OW44KS6KGo56S644GX44G+44GZ44CC44Ki44OL44Oh44O844K344On44Oz44Gq44Gp44Gu44Kq44OX44K344On44Oz44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldEFjdGl2ZVRhYihuZXh0SW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSB0aGlzLmFjdGl2ZUluZGV4O1xuXG4gICAgdGhpcy5fYWN0aXZlSW5kZXhTa2lwRWZmZWN0ID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gbmV4dEluZGV4O1xuXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUFjdGl2ZUluZGV4KG5leHRJbmRleCwgcHJldmlvdXNJbmRleCwgb3B0aW9ucyk7XG4gIH1cblxuICBfdXBkYXRlQWN0aXZlSW5kZXgobmV4dEluZGV4LCBwcmV2SW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHByZXZUYWIgPSB0aGlzLnRhYnNbcHJldkluZGV4XSxcbiAgICAgIG5leHRUYWIgPSB0aGlzLnRhYnNbbmV4dEluZGV4XTtcblxuICAgIGlmICghbmV4dFRhYikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdTcGVjaWZpZWQgaW5kZXggZG9lcyBub3QgbWF0Y2ggYW55IHRhYi4nKTtcbiAgICB9XG5cbiAgICBpZiAobmV4dEluZGV4ID09PSBwcmV2SW5kZXgpIHtcbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncmVhY3RpdmUnLCB7IGluZGV4OiBuZXh0SW5kZXgsIGFjdGl2ZUluZGV4OiBuZXh0SW5kZXgsIHRhYkl0ZW06IG5leHRUYWIgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHRUYWIucGFnZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBuZXh0VGFiLmxvYWRlZCBpcyBicm9rZW4gaW4gWm9uZS5qcyBwcm9taXNlcyAoQW5ndWxhcjIpXG4gICAgY29uc3QgbmV4dFBhZ2UgPSBuZXh0VGFiLnBhZ2VFbGVtZW50O1xuICAgIHJldHVybiAobmV4dFBhZ2UgPyBQcm9taXNlLnJlc29sdmUobmV4dFBhZ2UpIDogbmV4dFRhYi5sb2FkZWQpXG4gICAgICAudGhlbihuZXh0UGFnZSA9PiB0aGlzLl9zd2lwZXIuc2V0QWN0aXZlSW5kZXgobmV4dEluZGV4LCB7XG4gICAgICAgIHJlamVjdDogdHJ1ZSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgYW5pbWF0aW9uOiBwcmV2VGFiICYmIG5leHRQYWdlID8gb3B0aW9ucy5hbmltYXRpb24gfHwgdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpIDogJ25vbmUnLFxuICAgICAgICBhbmltYXRpb25PcHRpb25zOiB1dGlsLmV4dGVuZChcbiAgICAgICAgICB7IGR1cmF0aW9uOiAuMywgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC40LCAuNywgLjUsIDEpJyB9LFxuICAgICAgICAgIHRoaXMuYW5pbWF0aW9uT3B0aW9ucyxcbiAgICAgICAgICBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnMgfHwge31cbiAgICAgICAgKVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvcHRpb25zLmNhbGxiYWNrKG5leHRQYWdlKTtcbiAgICAgICAgcmV0dXJuIG5leHRQYWdlO1xuICAgICAgfSkpO1xuXG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRUYWJiYXJWaXNpYmlsaXR5XG4gICAqIEBzaWduYXR1cmUgc2V0VGFiYmFyVmlzaWJpbGl0eSh2aXNpYmxlKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZpc2libGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVVzZWQgdG8gaGlkZSBvciBzaG93IHRoZSB0YWIgYmFyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBzZXRUYWJiYXJWaXNpYmlsaXR5KHZpc2libGUpIHtcbiAgICB0aGlzLmhpZGVUYWJzID0gIXZpc2libGU7XG4gIH1cblxuICBzaG93KCkge1xuICAgIHRoaXMuaGlkZVRhYnMgPSBmYWxzZTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5oaWRlVGFicyA9IHRydWU7XG4gIH1cblxuICBfdXBkYXRlVmlzaWJpbGl0eSgpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgY29uc3QgdmlzaWJsZSA9ICF0aGlzLmhpZGVUYWJzO1xuICAgICAgdGhpcy5fY29udGVudEVsZW1lbnQuc3R5bGVbdGhpcy5fdG9wID8gJ3RvcCcgOiAnYm90dG9tJ10gPSB2aXNpYmxlID8gJycgOiAnMHB4JztcbiAgICAgIHRoaXMuX3RhYmJhckVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICAgIHZpc2libGUgJiYgdGhpcy5fb25SZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZpc2libGVcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgdGFiYmFyIGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeOCv+ODluODkOODvOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiYmFyRWxlbWVudC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHN3aXBlYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUVuYWJsZSBzd2lwZSBpbnRlcmFjdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1zd2lwZWFibGXjgafjgYLjgozjgbB0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvblN3aXBlXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhvb2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgdGFiYmFyLiBJdCBnZXRzIGEgZGVjaW1hbCBpbmRleCBhbmQgYW4gYW5pbWF0aW9uT3B0aW9ucyBvYmplY3QgYXMgYXJndW1lbnRzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGdldEFjdGl2ZVRhYkluZGV4XG4gICAqIEBzaWduYXR1cmUgZ2V0QWN0aXZlVGFiSW5kZXgoKVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqICAgW2VuXVRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWIuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KL44K/44OW44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgdGFiIGluZGV4IG9uIGN1cnJlbnQgYWN0aXZlIHRhYi4gSWYgYWN0aXZlIHRhYiBpcyBub3QgZm91bmQsIHJldHVybnMgLTEuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KL44K/44OW44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GX44G+44GZ44CC54++5Zyo44Ki44Kv44OG44Kj44OW44Gq44K/44OW44GM44Gq44GE5aC05ZCI44Gr44GvLTHjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZ2V0QWN0aXZlVGFiSW5kZXgodGFicyA9IHRoaXMudGFicykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRhYnNbaV0gJiYgdGFic1tpXS50YWdOYW1lID09PSAnT05TLVRBQicgJiYgdGFic1tpXS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBnZXQgYWN0aXZlSW5kZXgoKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLmdldEF0dHJpYnV0ZSgnYWN0aXZlLWluZGV4JykpO1xuICB9XG5cbiAgc2V0IGFjdGl2ZUluZGV4KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhY3RpdmUtaW5kZXgnLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgX3Nob3coKSB7XG4gICAgdGhpcy5fc3dpcGVyLnNob3coKTtcblxuICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICBjb25zdCB0YWJzID0gdGhpcy50YWJzO1xuICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4KHRhYnMpO1xuICAgICAgdGhpcy5fbG9hZEluYWN0aXZlLnJlc29sdmUoKTtcbiAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDAgJiYgYWN0aXZlSW5kZXggPj0gMCkge1xuICAgICAgICB0YWJzW2FjdGl2ZUluZGV4XS5sb2FkZWQudGhlbihlbCA9PiBlbCAmJiBzZXRJbW1lZGlhdGUoKCkgPT4gZWwuX3Nob3coKSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgdGhpcy5fc3dpcGVyLmhpZGUoKTtcbiAgICBjb25zdCB0b3BQYWdlID0gdGhpcy50b3BQYWdlO1xuICAgIHRvcFBhZ2UgJiYgdG9wUGFnZS5faGlkZSgpO1xuICB9XG5cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdGhpcy50YWJzLmZvckVhY2godGFiID0+IHRhYi5yZW1vdmUoKSk7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3Bvc2l0aW9uJywgJ3N3aXBlYWJsZScsICd0YWItYm9yZGVyJywgJ2hpZGUtdGFicycsICdhY3RpdmUtaW5kZXgnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgY29uc3QgaXNUb3AgPSBtID0+IC8oXnxcXHMrKXRvcCgkfFxccyspL2kudGVzdChtKTtcbiAgICAgIGlzVG9wKGxhc3QpICE9PSBpc1RvcChjdXJyZW50KSAmJiB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3Bvc2l0aW9uJykge1xuICAgICAgdXRpbC5pc0F0dGFjaGVkKHRoaXMpICYmIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnc3dpcGVhYmxlJykge1xuICAgICAgdGhpcy5fc3dpcGVyICYmIHRoaXMuX3N3aXBlci51cGRhdGVTd2lwZWFibGUodGhpcy5oYXNBdHRyaWJ1dGUoJ3N3aXBlYWJsZScpKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdoaWRlLXRhYnMnKSB7XG4gICAgICB0aGlzLmlzQ29ubmVjdGVkICYmIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdhY3RpdmUtaW5kZXgnKSB7XG4gICAgICBpZiAodGhpcy5fYWN0aXZlSW5kZXhTa2lwRWZmZWN0KSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUluZGV4U2tpcEVmZmVjdCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVBY3RpdmVJbmRleChjdXJyZW50LCBsYXN0KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCByZXdyaXRhYmxlcygpIHtcbiAgICByZXR1cm4gcmV3cml0YWJsZXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGV2ZW50cygpIHtcbiAgICByZXR1cm4gWydwcmVjaGFuZ2UnLCAncG9zdGNoYW5nZScsICdyZWFjdGl2ZScsICdzd2lwZSddO1xuICB9XG5cbiAgZ2V0IGFuaW1hdGlvbk9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpID9cbiAgICAgIHV0aWwuYW5pbWF0aW9uT3B0aW9uc1BhcnNlKHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpKSA6IHt9O1xuICB9XG5cbiAgc2V0IGFuaW1hdGlvbk9wdGlvbnModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoVGFiYmFyRWxlbWVudCwgWydoaWRlLXRhYnMnLCAnc3dpcGVhYmxlJywgJ3RhYi1ib3JkZXInXSk7XG5cbm9uc0VsZW1lbnRzLlRhYmJhciA9IFRhYmJhckVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy10YWJiYXInLCBUYWJiYXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IFRhYmJhckVsZW1lbnQgZnJvbSAnLi9vbnMtdGFiYmFyLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IHsgUGFnZUxvYWRlciwgZGVmYXVsdFBhZ2VMb2FkZXIgfSBmcm9tICcuLi9vbnMvcGFnZS1sb2FkZXIuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3RhYmJhcl9faXRlbSc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICd0YWJiYXItLSpfX2l0ZW0nLFxuICAnLnRhYmJhcl9fYnV0dG9uJzogJ3RhYmJhci0tKl9fYnV0dG9uJ1xufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtdGFiXG4gKiBAY2F0ZWdvcnkgdGFiYmFyXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJlcHJlc2VudHMgYSB0YWIgaW5zaWRlIHRhYiBiYXIuIEVhY2ggYDxvbnMtdGFiPmAgcmVwcmVzZW50cyBhIHBhZ2UuWy9lbl1cbiAqICAgW2phXVxuICogICAgIOOCv+ODluODkOODvOOBq+mFjee9ruOBleOCjOOCi+WQhOOCouOCpOODhuODoOOBruOCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAguOBneOCjOOBnuOCjOOBrm9ucy10YWLjga/jg5rjg7zjgrjjgpLooajjgZfjgb7jgZnjgIJcbiAqICAgICBvbnMtdGFi6KaB57Sg44Gu5Lit44Gr44Gv44CB44K/44OW44Gr6KGo56S644GV44KM44KL44Kz44Oz44OG44Oz44OE44KS55u05o6l6KiY6L+w44GZ44KL44GT44Go44GM5Ye65p2l44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAY29kZXBlbiBwR3VETFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3RhYmJhclxuICogQGd1aWRlIGZ1bmRhbWVudGFscy5odG1sI21hbmFnaW5nLXBhZ2VzXG4gKiAgIFtlbl1NYW5hZ2luZyBtdWx0aXBsZSBwYWdlcy5bL2VuXVxuICogICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1dXG4gKiBAZ3VpZGUgYXBwc2l6ZS5odG1sI3JlbW92aW5nLWljb24tcGFja3MgW2VuXVJlbW92aW5nIGljb24gcGFja3MuWy9lbl1bamFdWy9qYV1cbiAqIEBndWlkZSBmYXEuaHRtbCNob3ctY2FuLWktdXNlLWN1c3RvbS1pY29uLXBhY2tzIFtlbl1BZGRpbmcgY3VzdG9tIGljb24gcGFja3MuWy9lbl1bamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10YWJiYXJcbiAqICAgW2VuXW9ucy10YWJiYXIgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy10YWJiYXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXBhZ2VcbiAqICAgW2VuXW9ucy1wYWdlIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtcGFnZeOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtaWNvblxuICogICBbZW5db25zLWljb24gY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1pY29u44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXRhYmJhcj5cbiAqICAgPG9ucy10YWJcbiAqICAgICBwYWdlPVwiaG9tZS5odG1sXCJcbiAqICAgICBsYWJlbD1cIkhvbWVcIlxuICogICAgIGFjdGl2ZT5cbiAqICAgPC9vbnMtdGFiPlxuICogICA8b25zLXRhYlxuICogICAgIHBhZ2U9XCJzZXR0aW5ncy5odG1sXCJcbiAqICAgICBsYWJlbD1cIlNldHRpbmdzXCJcbiAqICAgICBhY3RpdmU+XG4gKiAgIDwvb25zLXRhYj5cbiAqIDwvb25zLXRhYmJhcj5cbiAqXG4gKiA8dGVtcGxhdGUgaWQ9XCJob21lLmh0bWxcIj5cbiAqICAgLi4uXG4gKiA8L3RlbXBsYXRlPlxuICpcbiAqIDx0ZW1wbGF0ZSBpZD1cInNldHRpbmdzLmh0bWxcIj5cbiAqICAgLi4uXG4gKiA8L3RlbXBsYXRlPlxuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRhYkVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcGFnZVxuICAgKiBAaW5pdG9ubHlcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gdGhlIHRhYiBpcyB0YXBwZWQuWy9lbl1cbiAgICogICBbamFdb25zLXRhYuOBjOWPgueFp+OBmeOCi+ODmuODvOOCuOOBuOOBrlVSTOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGljb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhlIGljb24gbmFtZSBmb3IgdGhlIHRhYi4gQ2FuIHNwZWNpZnkgdGhlIHNhbWUgaWNvbiBuYW1lIGFzIGA8b25zLWljb24+YC4gQ2hlY2sgW1NlZSBhbHNvXSgjc2VlYWxzbykgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1cbiAgICogICAgIOOCouOCpOOCs+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAgm9ucy1pY29u44Go5ZCM44GY44Ki44Kk44Kz44Oz5ZCN44KS5oyH5a6a44Gn44GN44G+44GZ44CCXG4gICAqICAgICDlgIvliKXjgavjgqLjgqTjgrPjg7PjgpLjgqvjgrnjgr/jg57jgqTjgrrjgZnjgovloLTlkIjjga/jgIFiYWNrZ3JvdW5kLWltYWdl44Gq44Gp44GuQ1NT44K544K/44Kk44Or44KS55So44GE44Gm5oyH5a6a44Gn44GN44G+44GZ44CCXG4gICAqICAgWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYWN0aXZlLWljb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBuYW1lIG9mIHRoZSBpY29uIHdoZW4gdGhlIHRhYiBpcyBhY3RpdmUuWy9lbl1cbiAgICogICBbamFd44Ki44Kv44OG44Kj44OW44Gu6Zqb44Gu44Ki44Kk44Kz44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbGFiZWxcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBsYWJlbCBvZiB0aGUgdGFiIGl0ZW0uWy9lbl1cbiAgICogICBbamFd44Ki44Kk44Kz44Oz5LiL44Gr6KGo56S644GV44KM44KL44Op44OZ44Or44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYmFkZ2VcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXURpc3BsYXkgYSBub3RpZmljYXRpb24gYmFkZ2Ugb24gdG9wIG9mIHRoZSB0YWIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44K444Gr6KGo56S644GZ44KL5YaF5a6544KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYWN0aXZlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSB0YWIgdGhhdCBpcyBhY3RpdmUgYnkgZGVmYXVsdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKFsnbGFiZWwnLCAnaWNvbicsICdiYWRnZSddLnNvbWUodGhpcy5oYXNBdHRyaWJ1dGUuYmluZCh0aGlzKSkpIHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IGRlZmF1bHRQYWdlTG9hZGVyO1xuICAgIHRoaXMuX29uQ2xpY2sgPSB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyk7XG5cbiAgICBjb25zdCB7b25Db25uZWN0ZWQsIG9uRGlzY29ubmVjdGVkfSA9IHV0aWwuZGVmaW5lTGlzdGVuZXJQcm9wZXJ0eSh0aGlzLCAnY2xpY2snKTtcbiAgICB0aGlzLl9jb25uZWN0T25DbGljayA9IG9uQ29ubmVjdGVkO1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrID0gb25EaXNjb25uZWN0ZWQ7XG4gIH1cblxuICBzZXQgcGFnZUxvYWRlcihsb2FkZXIpIHtcbiAgICBpZiAoIShsb2FkZXIgaW5zdGFuY2VvZiBQYWdlTG9hZGVyKSkge1xuICAgICAgdXRpbC50aHJvd1BhZ2VMb2FkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IGxvYWRlcjtcbiAgfVxuXG4gIGdldCBwYWdlTG9hZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlTG9hZGVyO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgaWYgKHRoaXMuX2J1dHRvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1dHRvbiA9IHV0aWwuY3JlYXRlKCdidXR0b24udGFiYmFyX19idXR0b24nKTtcbiAgICB3aGlsZSAodGhpcy5jaGlsZE5vZGVzWzBdKSB7XG4gICAgICBidXR0b24uYXBwZW5kQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IHV0aWwuY3JlYXRlKCdpbnB1dCcsIHsgZGlzcGxheTogJ25vbmUnIH0pO1xuICAgIGlucHV0LnR5cGUgPSAncmFkaW8nO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZChidXR0b24pO1xuXG4gICAgdGhpcy5fdXBkYXRlQnV0dG9uQ29udGVudCgpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgfVxuXG4gIF91cGRhdGVSaXBwbGUoKSB7XG4gICAgdGhpcy5fYnV0dG9uICYmIHV0aWwudXBkYXRlUmlwcGxlKHRoaXMuX2J1dHRvbiwgdGhpcy5oYXNBdHRyaWJ1dGUoJ3JpcHBsZScpKTtcbiAgfVxuXG4gIF91cGRhdGVCdXR0b25Db250ZW50KCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuX2J1dHRvbjtcblxuICAgIGxldCBpY29uV3JhcHBlciA9IHRoaXMuX2ljb247XG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdpY29uJykpIHtcbiAgICAgIGljb25XcmFwcGVyID0gaWNvbldyYXBwZXIgfHwgdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2IGNsYXNzPVwidGFiYmFyX19pY29uXCI+PG9ucy1pY29uPjwvb25zLWljb24+PC9kaXY+Jyk7XG4gICAgICBjb25zdCBpY29uID0gaWNvbldyYXBwZXIuY2hpbGRyZW5bMF07XG4gICAgICBjb25zdCBmaXggPSAobGFzdCA9PiAoKSA9PiBpY29uLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnaWNvbicsIGxhc3QsIHRoaXMuZ2V0QXR0cmlidXRlKCdpY29uJykpKShpY29uLmdldEF0dHJpYnV0ZSgnaWNvbicpKTtcbiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnaWNvbicpICYmIHRoaXMuaGFzQXR0cmlidXRlKCdhY3RpdmUtaWNvbicpKSB7XG4gICAgICAgIGljb24uc2V0QXR0cmlidXRlKCdpY29uJywgdGhpcy5nZXRBdHRyaWJ1dGUodGhpcy5pc0FjdGl2ZSgpID8gJ2FjdGl2ZS1pY29uJyA6ICdpY29uJykpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnaWNvbicpKSB7XG4gICAgICAgIGljb24uc2V0QXR0cmlidXRlKCdpY29uJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKSk7XG4gICAgICB9XG4gICAgICBpY29uV3JhcHBlci5wYXJlbnRFbGVtZW50ICE9PSBidXR0b24gJiYgYnV0dG9uLmluc2VydEJlZm9yZShpY29uV3JhcHBlciwgYnV0dG9uLmZpcnN0Q2hpbGQpO1xuXG4gICAgICAvLyBkaXJ0eSBmaXggZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9PbnNlblVJL09uc2VuVUkvaXNzdWVzLzE2NTRcbiAgICAgIGljb24uYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb25cbiAgICAgICAgPyBmaXgoKVxuICAgICAgICA6IHNldEltbWVkaWF0ZSgoKSA9PiBpY29uLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIGZpeCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWNvbldyYXBwZXIgJiYgaWNvbldyYXBwZXIucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgWydsYWJlbCcsICdiYWRnZSddLmZvckVhY2goKGF0dHIsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgcHJvcCA9IHRoaXMucXVlcnlTZWxlY3RvcihgLnRhYmJhcl9fJHthdHRyfWApO1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKGF0dHIpKSB7XG4gICAgICAgIHByb3AgPSBwcm9wIHx8IHV0aWwuY3JlYXRlKGAudGFiYmFyX18ke2F0dHJ9YCArIChhdHRyID09PSAnYmFkZ2UnID8gJyBub3RpZmljYXRpb24nIDogJycpKTtcbiAgICAgICAgcHJvcC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgICBwcm9wLnBhcmVudEVsZW1lbnQgIT09IGJ1dHRvbiAmJiBidXR0b24uYXBwZW5kQ2hpbGQocHJvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wICYmIHByb3AucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgX2lucHV0KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnaW5wdXQnKTtcbiAgfVxuXG4gIGdldCBfYnV0dG9uKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYmJhcl9fYnV0dG9uJyk7XG4gIH1cblxuICBnZXQgX2ljb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcignLnRhYmJhcl9faWNvbicpO1xuICB9XG5cbiAgZ2V0IF90YWJiYXIoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZFBhcmVudCh0aGlzLCAnb25zLXRhYmJhcicpO1xuICB9XG5cbiAgZ2V0IGluZGV4KCkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgdGhpcyk7XG4gIH1cblxuICBfb25DbGljayhldmVudCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRoaXMuX3RhYmJhci5zZXRBY3RpdmVUYWIodGhpcy5pbmRleCwgeyByZWplY3Q6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0QWN0aXZlKGFjdGl2ZSA9IHRydWUpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5faW5wdXQuY2hlY2tlZCA9IGFjdGl2ZTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYWN0aXZlKTtcbiAgICAgIHV0aWwudG9nZ2xlQXR0cmlidXRlKHRoaXMsICdhY3RpdmUnLCBhY3RpdmUpO1xuXG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2ljb24nKSAmJiB0aGlzLmhhc0F0dHJpYnV0ZSgnYWN0aXZlLWljb24nKSkge1xuICAgICAgICB0aGlzLl9pY29uLmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZSgnaWNvbicsIHRoaXMuZ2V0QXR0cmlidXRlKGFjdGl2ZSA/ICdhY3RpdmUtaWNvbicgOiAnaWNvbicpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9sb2FkUGFnZUVsZW1lbnQocGFyZW50LCBwYWdlKSB7XG4gICAgdGhpcy5faGFzTG9hZGVkID0gdHJ1ZTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuX3BhZ2VMb2FkZXIubG9hZCh7IHBhcmVudCwgcGFnZSB9LCBwYWdlRWxlbWVudCA9PiB7XG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQocGFnZUVsZW1lbnQsIHBhcmVudC5jaGlsZHJlblt0aGlzLmluZGV4XSk7IC8vIEVuc3VyZSBwb3NpdGlvblxuICAgICAgICB0aGlzLl9sb2FkZWRQYWdlID0gcGFnZUVsZW1lbnQ7XG4gICAgICAgIHJlc29sdmUocGFnZUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgcGFnZUVsZW1lbnQoKSB7XG4gICAgLy8gSXQgaGFzIGJlZW4gbG9hZGVkIGJ5IG9ucy10YWJcbiAgICBpZiAodGhpcy5fbG9hZGVkUGFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZFBhZ2U7XG4gICAgfVxuICAgIC8vIE1hbnVhbGx5IGF0dGFjaGVkIHRvIERPTSwgMSBwZXIgdGFiXG4gICAgY29uc3QgdGFiYmFyID0gdGhpcy5fdGFiYmFyO1xuICAgIGlmICh0YWJiYXIucGFnZXMubGVuZ3RoID09PSB0YWJiYXIudGFicy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0YWJiYXIucGFnZXNbdGhpcy5pbmRleF07XG4gICAgfVxuICAgIC8vIExvYWRlZCBpbiBhbm90aGVyIHdheVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0FjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2ssIGZhbHNlKTtcbiAgICBpZiAodGhpcy5fbG9hZGVkUGFnZSkge1xuICAgICAgdGhpcy5faGFzTG9hZGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmxvYWRlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzY29ubmVjdE9uQ2xpY2soKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCBmYWxzZSk7XG5cbiAgICBpZiAoIXV0aWwuaXNBdHRhY2hlZCh0aGlzKSB8fCB0aGlzLmxvYWRlZCkge1xuICAgICAgcmV0dXJuOyAvLyBvbnMtdGFiYmFyIGNvbXBpbGF0aW9uIG1heSB0cmlnZ2VyIHRoaXNcbiAgICB9XG5cbiAgICBjb25zdCBkZWZlcnJlZCA9IHV0aWwuZGVmZXIoKTtcbiAgICB0aGlzLmxvYWRlZCA9IGRlZmVycmVkLnByb21pc2U7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgY29uc3QgdGFiYmFyID0gdGhpcy5fdGFiYmFyO1xuICAgICAgaWYgKCF0YWJiYXIpIHtcbiAgICAgICAgdXRpbC50aHJvdygnVGFiIGVsZW1lbnRzIG11c3QgYmUgY2hpbGRyZW4gb2YgVGFiYmFyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YWJiYXIuaGFzQXR0cmlidXRlKCdtb2RpZmllcicpKSB7XG4gICAgICAgIHV0aWwuYWRkTW9kaWZpZXIodGhpcywgdGFiYmFyLmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faGFzTG9hZGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnYWN0aXZlJykpIHtcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZSh0cnVlKTtcbiAgICAgICAgICB0YWJiYXIuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA9PT0gdGFiYmFyLnRhYnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRhYmJhci5fb25SZWZyZXNoKCk7XG4gICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRhYmJhci5fb25SZWZyZXNoKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgVGFiYmFyRWxlbWVudC5yZXdyaXRhYmxlcy5yZWFkeSh0YWJiYXIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBwYWdlVGFyZ2V0ID0gdGhpcy5wYWdlIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJyk7XG4gICAgICAgICAgaWYgKCF0aGlzLnBhZ2VFbGVtZW50ICYmIHBhZ2VUYXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFRhcmdldCA9IHRhYmJhci5fdGFyZ2V0RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGR1bW15UGFnZSA9IHV0aWwuY3JlYXRlKCdkaXYnLCB7IGhlaWdodDogJzEwMCUnLCB3aWR0aDogJzEwMCUnLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9KTtcbiAgICAgICAgICAgIHBhcmVudFRhcmdldC5pbnNlcnRCZWZvcmUoZHVtbXlQYWdlLCBwYXJlbnRUYXJnZXQuY2hpbGRyZW5baW5kZXhdKTsgLy8gRW5zdXJlIHBvc2l0aW9uXG5cbiAgICAgICAgICAgIGNvbnN0IGxvYWQgPSAoKSA9PiB0aGlzLl9sb2FkUGFnZUVsZW1lbnQocGFyZW50VGFyZ2V0LCBwYWdlVGFyZ2V0KS50aGVuKGRlZmVycmVkLnJlc29sdmUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNBY3RpdmUoKSA/IGxvYWQoKSA6IHRhYmJhci5fbG9hZEluYWN0aXZlLnByb21pc2UudGhlbihsb2FkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucmVzb2x2ZSh0aGlzLnBhZ2VFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0T25DbGljaygpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAncmlwcGxlJywgJ2ljb24nLCAnbGFiZWwnLCAncGFnZScsICdiYWRnZScsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlwcGxlJzpcbiAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZVJpcHBsZSgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpY29uJzpcbiAgICAgIGNhc2UgJ2xhYmVsJzpcbiAgICAgIGNhc2UgJ2JhZGdlJzpcbiAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZUJ1dHRvbkNvbnRlbnQoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGFnZSc6XG4gICAgICAgIHRoaXMucGFnZSA9IGN1cnJlbnQgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5vbnNFbGVtZW50cy5UYWIgPSBUYWJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtdGFiJywgVGFiRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9hc3RBbmltYXRvciBleHRlbmRzIEJhc2VBbmltYXRvciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnRpbWluZ1xuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kdXJhdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kZWxheVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdsaW5lYXInLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhtb2RhbCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1vZGFsXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKG1vZGFsLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn1cbiIsIlxuLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBUb2FzdEFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG4vKipcbiAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgZGlhbG9nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYWRlVG9hc3RBbmltYXRvciBleHRlbmRzIFRvYXN0QW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuM30gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3codG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdCh0b2FzdCwgdGhpcy5kZWYpXG4gICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pXG4gICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pXG4gICAgICAucGxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKHRvYXN0LCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAxIH0sIHsgb3BhY2l0eTogMCB9KVxuICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KVxuICAgICAgLnBsYXkoKTtcbiAgfVxufVxuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uLy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgaVBob25lWFBhdGNoIGZyb20gJy4uLy4uL29ucy9pcGhvbmV4LXBhdGNoLmpzJztcbmltcG9ydCBUb2FzdEFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG4vKipcbiAqIEFzY2VuZCBUb2FzdCBBbmltYXRvci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXNjZW5kVG9hc3RBbmltYXRvciBleHRlbmRzIFRvYXN0QW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltaW5nID0gJ2Vhc2UnLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yNSB9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuXG4gICAgdGhpcy5tZXNzYWdlRGVsYXkgPSB0aGlzLmR1cmF0aW9uICogMC40ICsgdGhpcy5kZWxheTsgLy8gRGVsYXkgbWVzc2FnZSBvcGFjaXR5IGNoYW5nZVxuICAgIGlmIChwbGF0Zm9ybS5pc0FuZHJvaWQoKSkge1xuICAgICAgdGhpcy5hc2NlbnNpb24gPSA0ODsgLy8gVG9hc3RzIGFyZSBhbHdheXMgMSBsaW5lXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYUG9ydHJhaXRQYXRjaEFjdGl2ZSgpKSB7XG4gICAgICAgIHRoaXMuYXNjZW5zaW9uID0gOTg7IC8vIDY0ICsgMzRcbiAgICAgIH0gZWxzZSBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWExhbmRzY2FwZVBhdGNoQWN0aXZlKCkpIHtcbiAgICAgICAgdGhpcy5hc2NlbnNpb24gPSA4NTsgLy8gNjQgKyAyMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hc2NlbnNpb24gPSA2NDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3codG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG4gICAgdXRpbC5nbG9iYWxzLmZhYk9mZnNldCA9IHRoaXMuYXNjZW5zaW9uO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0b2FzdCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgJHt0aGlzLmFzY2Vuc2lvbn1weCwgMClgIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9nZXRGYWJzKCkpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIC0ke3RoaXMuYXNjZW5zaW9ufXB4LCAwKSBzY2FsZSgxKWAgfSwgdGhpcy5kZWYpLFxuXG4gICAgICBhbmltaXQodXRpbC5hcnJheUZyb20odG9hc3QuY2hpbGRyZW4pLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZSh0b2FzdCwgY2FsbGJhY2spIHtcbiAgICB0b2FzdCA9IHRvYXN0Ll90b2FzdDtcbiAgICB1dGlsLmdsb2JhbHMuZmFiT2Zmc2V0ID0gMDtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgJHt0aGlzLmFzY2Vuc2lvbn1weCwgMClgIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fZ2V0RmFicygpLCB0aGlzLmRlZilcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgMCwgMCkgc2NhbGUoMSlgIH0sIHRoaXMuZGVmKSxcblxuICAgICAgYW5pbWl0KHV0aWwuYXJyYXlGcm9tKHRvYXN0LmNoaWxkcmVuKSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IDAgfSlcbiAgICApO1xuICB9XG5cbiAgX2dldEZhYnMoKSB7XG4gICAgcmV0dXJuIHV0aWwuYXJyYXlGcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29ucy1mYWJbcG9zaXRpb25+PWJvdHRvbV0sIG9ucy1zcGVlZC1kaWFsW3Bvc2l0aW9ufj1ib3R0b21dJykpLmZpbHRlcihmYWIgPT4gZmFiLnZpc2libGUpO1xuICB9XG59XG4iLCJcbi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgaVBob25lWFBhdGNoIGZyb20gJy4uLy4uL29ucy9pcGhvbmV4LXBhdGNoLmpzJztcbmltcG9ydCBUb2FzdEFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG4vKipcbiAqIExpZnQtZmFkZSBUb2FzdCBBbmltYXRvclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZ0VG9hc3RBbmltYXRvciBleHRlbmRzIFRvYXN0QW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltaW5nID0gJ2Vhc2UnLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zNSB9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICAgIHRoaXMuYm9keUhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0XG4gICAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMubGlmdEFtb3VudCA9ICdjYWxjKDEwMCUgKyAzNHB4KSc7XG4gICAgfSBlbHNlIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUoKSkge1xuICAgICAgdGhpcy5saWZ0QW1vdW50ID0gJ2NhbGMoMTAwJSArIDIxcHgpJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saWZ0QW1vdW50ID0gJzEwMCUnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyh0b2FzdCwgY2FsbGJhY2spIHtcbiAgICB0b2FzdCA9IHRvYXN0Ll90b2FzdDtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5saWZ0QW1vdW50fSwgMClgLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUodG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5saWZ0QW1vdW50fSwgMClgLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIF91cGRhdGVQb3NpdGlvbih0b2FzdCkge1xuICAgIGlmIChwYXJzZUludCh0b2FzdC5zdHlsZS50b3AsIDEwKSA9PT0gMCkge1xuICAgICAgdG9hc3Quc3R5bGUudG9wID0gdG9hc3Quc3R5bGUuYm90dG9tID0gJyc7XG4gICAgfVxuICB9XG59XG4iLCJcbi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgaVBob25lWFBhdGNoIGZyb20gJy4uLy4uL29ucy9pcGhvbmV4LXBhdGNoLmpzJztcbmltcG9ydCBUb2FzdEFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG4vKipcbiAqIEZhbGwtZmFkZSBUb2FzdCBBbmltYXRvclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYWxsVG9hc3RBbmltYXRvciBleHRlbmRzIFRvYXN0QW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltaW5nID0gJ2Vhc2UnLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zNSB9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICAgIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYUG9ydHJhaXRQYXRjaEFjdGl2ZSgpKSB7XG4gICAgICB0aGlzLmZhbGxBbW91bnQgPSAnY2FsYygtMTAwJSAtIDQ0cHgpJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mYWxsQW1vdW50ID0gJy0xMDAlJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3codG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG4gICAgdGhpcy5fdXBkYXRlUG9zaXRpb24odG9hc3QpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0b2FzdCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgJHt0aGlzLmZhbGxBbW91bnR9LCAwKWAsIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZSh0b2FzdCwgY2FsbGJhY2spIHtcbiAgICB0b2FzdCA9IHRvYXN0Ll90b2FzdDtcbiAgICB0aGlzLl91cGRhdGVQb3NpdGlvbih0b2FzdCk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5mYWxsQW1vdW50fSwgMClgLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb24odG9hc3QsIHRydWUpO1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24odG9hc3QsIGNsZWFuVXApIHtcbiAgICBsZXQgY29ycmVjdFRvcDtcbiAgICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgICAgY29ycmVjdFRvcCA9ICc0NHB4JztcbiAgICB9IGVsc2Uge1xuICAgICAgY29ycmVjdFRvcCA9ICcwJztcbiAgICB9XG5cbiAgICBpZiAodG9hc3Quc3R5bGUudG9wICE9PSBjb3JyZWN0VG9wKSB7XG4gICAgICB0b2FzdC5zdHlsZS50b3AgPSBjb3JyZWN0VG9wO1xuICAgICAgdG9hc3Quc3R5bGUuYm90dG9tID0gJ2luaXRpYWwnO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCBUb2FzdEFuaW1hdG9yIGZyb20gJy4vb25zLXRvYXN0L2FuaW1hdG9yLmpzJztcbmltcG9ydCBGYWRlVG9hc3RBbmltYXRvciBmcm9tICcuL29ucy10b2FzdC9mYWRlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBBc2NlbmRUb2FzdEFuaW1hdG9yIGZyb20gJy4vb25zLXRvYXN0L2FzY2VuZC1hbmltYXRvci5qcyc7XG5pbXBvcnQgTGlmdFRvYXN0QW5pbWF0b3IgZnJvbSAnLi9vbnMtdG9hc3QvbGlmdC1hbmltYXRvci5qcyc7XG5pbXBvcnQgRmFsbFRvYXN0QW5pbWF0b3IgZnJvbSAnLi9vbnMtdG9hc3QvZmFsbC1hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy50b2FzdCc6ICd0b2FzdC0tKicsXG4gICcudG9hc3RfX21lc3NhZ2UnOiAndG9hc3QtLSpfX21lc3NhZ2UnLFxuICAnLnRvYXN0X19idXR0b24nOiAndG9hc3QtLSpfX2J1dHRvbidcbn07XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAndG9hc3QnO1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICAnZGVmYXVsdCc6IHBsYXRmb3JtLmlzQW5kcm9pZCgpID8gQXNjZW5kVG9hc3RBbmltYXRvciA6IExpZnRUb2FzdEFuaW1hdG9yLFxuICAnZmFkZSc6IEZhZGVUb2FzdEFuaW1hdG9yLFxuICAnYXNjZW5kJzogQXNjZW5kVG9hc3RBbmltYXRvcixcbiAgJ2xpZnQnOiBMaWZ0VG9hc3RBbmltYXRvcixcbiAgJ2ZhbGwnOiBGYWxsVG9hc3RBbmltYXRvcixcbiAgJ25vbmUnOiBUb2FzdEFuaW1hdG9yXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy10b2FzdFxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBUaGUgVG9hc3Qgb3IgU25hY2tiYXIgY29tcG9uZW50IGlzIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBkaXNtaXNzYWJsZSBpbmZvcm1hdGlvbiBvciBzaW1wbGUgYWN0aW9ucyBhdCAobm9ybWFsbHkpIHRoZSBib3R0b20gb2YgdGhlIHBhZ2UuXG4gKlxuICogICAgIFRoaXMgY29tcG9uZW50IGRvZXMgbm90IGJsb2NrIHVzZXIgaW5wdXQsIGFsbG93aW5nIHRoZSBhcHAgdG8gY29udGludWUgaXRzIGZsb3cuIEZvciBzaW1wbGUgdG9hc3RzLCBjb25zaWRlciBgb25zLm5vdGlmaWNhdGlvbi50b2FzdGAgaW5zdGVhZC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvdG9hc3RcbiAqIEBzZWVhbHNvIG9ucy1hbGVydC1kaWFsb2dcbiAqICAgW2VuXVRoZSBgPG9ucy1hbGVydC1kaWFsb2c+YCBjb21wb25lbnQgaXMgcHJlZmVycmVkIGZvciBkaXNwbGF5aW5nIHVuZGlzbWlzc2FibGUgaW5mb3JtYXRpb24uWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0RWxlbWVudCBleHRlbmRzIEJhc2VEaWFsb2dFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZXNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSB0b2FzdCBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44GM6KGo56S644GV44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnRvYXN0XG4gICAqICAgW2VuXVRvYXN0IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dRXhlY3V0ZSB0byBzdG9wIHRoZSB0b2FzdCBmcm9tIHNob3dpbmcuWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644KS5q2i44KB44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgdG9hc3QgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOBn+ebtOW+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50b2FzdFxuICAgKiAgIFtlbl1Ub2FzdCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwcmVoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgdG9hc3QgaXMgaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOmaoOOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50b2FzdFxuICAgKiAgIFtlbl1Ub2FzdCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdG8gc3RvcCB0aGUgdG9hc3QgZnJvbSBoaWRpbmcuWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44GM6ZaJ44GY44KI44GG44Go44GZ44KL44Gu44KS5q2i44KB44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0aGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIHRvYXN0IGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnRvYXN0XG4gICAqICAgW2VuXVRvYXN0IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIHRvYXN0LiBDYW4gYmUgZWl0aGVyIGBcImRlZmF1bHRcImAsIGBcImFzY2VuZFwiYCAoQW5kcm9pZCksIGBcImxpZnRcImAgKGlPUyksIGBcImZhbGxcImAsIGBcImZhZGVcImAgb3IgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4gPGNvZGU+e2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ308L2NvZGU+Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgILkvovvvJp7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHZpc2libGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSB0b2FzdCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fZGVmYXVsdERCQiA9IG51bGw7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF90b2FzdCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgYC4ke2RlZmF1bHRDbGFzc05hbWV9YCk7XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIC8vIFJlc2V0IHBvc2l0aW9uIHN0eWxlXG4gICAgdGhpcy5fdG9hc3QgJiYgKHRoaXMuX3RvYXN0LnN0eWxlLnRvcCA9IHRoaXMuX3RvYXN0LnN0eWxlLmJvdHRvbSA9ICcnKTtcblxuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogVG9hc3RBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdUb2FzdEFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zdHlsZS56SW5kZXggPSAxMDAwMDsgLy8gTG93ZXIgdGhhbiBkaWFsb2dzXG5cbiAgICBjb25zdCBtZXNzYWdlQ2xhc3NOYW1lID0gJ3RvYXN0X19tZXNzYWdlJztcbiAgICBjb25zdCBidXR0b25DbGFzc05hbWUgPSAndG9hc3RfX2J1dHRvbic7XG5cbiAgICBsZXQgdG9hc3QgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCBgLiR7ZGVmYXVsdENsYXNzTmFtZX1gKTtcbiAgICBpZiAoIXRvYXN0KSB7XG4gICAgICB0b2FzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdG9hc3QuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgdG9hc3QuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgYnV0dG9uID0gdXRpbC5maW5kQ2hpbGQodG9hc3QsIGAuJHtidXR0b25DbGFzc05hbWV9YCk7XG4gICAgaWYgKCFidXR0b24pIHtcbiAgICAgIGJ1dHRvbiA9IHV0aWwuZmluZENoaWxkKHRvYXN0LCBlID0+IHV0aWwubWF0Y2goZSwgJy5idXR0b24nKSB8fCB1dGlsLm1hdGNoKGUsICdidXR0b24nKSk7XG4gICAgICBpZiAoYnV0dG9uKSB7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdidXR0b24nKTtcbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoYnV0dG9uQ2xhc3NOYW1lKTtcbiAgICAgICAgdG9hc3QuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHRvYXN0LCBgLiR7bWVzc2FnZUNsYXNzTmFtZX1gKSkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSB1dGlsLmZpbmRDaGlsZCh0b2FzdCwgJy5tZXNzYWdlJyk7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBmb3IgKGxldCBpID0gdG9hc3QuY2hpbGROb2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmICh0b2FzdC5jaGlsZE5vZGVzW2ldICE9PSBidXR0b24pIHtcbiAgICAgICAgICAgIG1lc3NhZ2UuaW5zZXJ0QmVmb3JlKHRvYXN0LmNoaWxkTm9kZXNbaV0sIG1lc3NhZ2UuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtZXNzYWdlLmNsYXNzTGlzdC5hZGQobWVzc2FnZUNsYXNzTmFtZSk7XG5cbiAgICAgIHRvYXN0Lmluc2VydEJlZm9yZShtZXNzYWdlLCB0b2FzdC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAodG9hc3QucGFyZW50Tm9kZSAhPT0gdGhpcykge1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0b2FzdCk7XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdyhbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcImRlZmF1bHRcImAsIGBcImFzY2VuZFwiYCAoQW5kcm9pZCksIGBcImxpZnRcImAgKGlPUyksIGBcImZhbGxcImAsIGBcImZhZGVcImAgb3IgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgdGhlIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGRpc3BsYXllZCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwiZGVmYXVsdFwiYCwgYFwiYXNjZW5kXCJgIChBbmRyb2lkKSwgYFwibGlmdFwiYCAoaU9TKSwgYFwiZmFsbFwiYCwgYFwiZmFkZVwiYCBvciBgXCJub25lXCJgLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIHRvYXN0IHZpc2liaWxpdHkuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJkZWZhdWx0XCJgLCBgXCJhc2NlbmRcImAgKEFuZHJvaWQpLCBgXCJsaWZ0XCJgIChpT1MpLCBgXCJmYWxsXCJgLCBgXCJmYWRlXCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1IaWRlIHRvYXN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBBbmltYXRvclxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQW5pbWF0b3IobmFtZSwgQW5pbWF0b3IpIHtcbiAgICBpZiAoIShBbmltYXRvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBUb2FzdEFuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvdygnXCJBbmltYXRvclwiIHBhcmFtIG11c3QgaW5oZXJpdCBPbnNUb2FzdEVsZW1lbnQuVG9hc3RBbmltYXRvcicpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgVG9hc3RBbmltYXRvcigpIHtcbiAgICByZXR1cm4gVG9hc3RBbmltYXRvcjtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5Ub2FzdCA9IFRvYXN0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXRvYXN0JywgVG9hc3RFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VCdXR0b25FbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWJ1dHRvbi5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXRvb2xiYXItYnV0dG9uXG4gKiBAY2F0ZWdvcnkgcGFnZVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gdG9vbGJhciBidXR0b24uWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgb3V0bGluZVxuICogICBbZW5dQSBidXR0b24gd2l0aCBhbiBvdXRsaW5lLlsvZW5dXG4gKiAgIFtqYV3jgqLjgqbjg4jjg6njgqTjg7PjgpLjgoLjgaPjgZ/jg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1CdXR0b24gY29tcG9uZW50IGZvciBvbnMtdG9vbGJhciBhbmQgb25zLWJvdHRvbS10b29sYmFyLlsvZW5dXG4gKiAgIFtqYV1vbnMtdG9vbGJhcuOBguOCi+OBhOOBr29ucy1ib3R0b20tdG9vbGJhcuOBq+ioree9ruOBp+OBjeOCi+ODnOOCv+ODs+eUqOOCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAglsvamFdXG4gKiBAY29kZXBlbiBhSG1HTFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3BhZ2VcbiAqIEBndWlkZSBjb21waWxhdGlvbi5odG1sI3Rvb2xiYXItY29tcGlsYXRpb25cbiAqICAgW2VuXUFkZGluZyBhIHRvb2xiYXJbL2VuXVxuICogICBbamFd44OE44O844Or44OQ44O844Gu6L+95YqgWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10b29sYmFyXG4gKiAgIFtlbl1UaGUgYDxvbnMtdG9vbGJhcj5gIGNvbXBvbmVudCBkaXNwbGF5cyBhIG5hdmlnYXRpb24gYmFyIGF0IHRoZSB0b3Agb2YgYSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1vbnMtdG9vbGJhcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtYmFjay1idXR0b25cbiAqICAgW2VuXVRoZSBgPG9ucy1iYWNrLWJ1dHRvbj5gIGRpc3BsYXlzIGEgYmFjayBidXR0b24gaW4gdGhlIG5hdmlnYXRpb24gYmFyLlsvZW5dXG4gKiAgIFtqYV1vbnMtYmFjay1idXR0b27jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtdG9vbGJhcj5cbiAqICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAqICAgICA8b25zLXRvb2xiYXItYnV0dG9uPlxuICogICAgICAgQnV0dG9uXG4gKiAgICAgPC9vbnMtdG9vbGJhci1idXR0b24+XG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gKiAgICAgVGl0bGVcbiAqICAgPC9kaXY+XG4gKiAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICogICAgIDxvbnMtdG9vbGJhci1idXR0b24+XG4gKiAgICAgICA8b25zLWljb24gaWNvbj1cImlvbi1uYXZpY29uXCIgc2l6ZT1cIjI4cHhcIj48L29ucy1pY29uPlxuICogICAgIDwvb25zLXRvb2xiYXItYnV0dG9uPlxuICogICA8L2Rpdj5cbiAqIDwvb25zLXRvb2xiYXI+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvb2xiYXJCdXR0b25FbGVtZW50IGV4dGVuZHMgQmFzZUJ1dHRvbkVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGljb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ3JlYXRlcyBhbiBgb25zLWljb25gIGNvbXBvbmVudCB3aXRoIHRoaXMgc3RyaW5nLlsvZW5dXG4gICAqICBbamFdYG9ucy1pY29uYOOCs+ODs+ODneODvOODjeODs+ODiOOCkuaCquaAp+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IGlmIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44Oc44K/44Oz44KS54Sh5Yq55YyW44GZ44KL5aC05ZCI44Gv5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiB7ICcnOiAndG9vbGJhci1idXR0b24tLSonIH07XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICd0b29sYmFyLWJ1dHRvbic7XG4gIH1cblxuICBnZXQgX3JpcHBsZU9wdCgpIHtcbiAgICByZXR1cm4gW3RoaXMsIHVuZGVmaW5lZCwgeyBjZW50ZXI6ICcnLCAnc2l6ZSc6ICdjb250YWluJywgJ2JhY2tncm91bmQnOiAndHJhbnNwYXJlbnQnIH1dO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLlRvb2xiYXJCdXR0b24gPSBUb29sYmFyQnV0dG9uRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXRvb2xiYXItYnV0dG9uJywgVG9vbGJhckJ1dHRvbkVsZW1lbnQpO1xuIiwiaW1wb3J0IHNldHVwIGZyb20gJy4vc2V0dXAuanMnOyAvLyBBZGQgcG9seWZpbGxzXG5pbXBvcnQgb25zIGZyb20gJy4vb25zL2luZGV4LmpzJzsgLy8gQWRkIG9ucyBpbnRlcm5hbHNcblxuLy8gQWRkIGFuZCByZWdpc3RlciBDdXN0b20gRWxlbWVudHNcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtaWYuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYWxlcnQtZGlhbG9nLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYWxlcnQtZGlhbG9nLWJ1dHRvbi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWJhY2stYnV0dG9uLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYm90dG9tLXRvb2xiYXIuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1idXR0b24uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1jYXJkLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtY2Fyb3VzZWwtaXRlbS5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWNhcm91c2VsLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtY29sLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtZGlhbG9nLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtZmFiLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtZ2VzdHVyZS1kZXRlY3Rvci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWljb24uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1sYXp5LXJlcGVhdC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWxpc3QtaGVhZGVyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtbGlzdC10aXRsZS5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWxpc3QtaXRlbS5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWxpc3QuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1pbnB1dC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWNoZWNrYm94LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcmFkaW8uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zZWFyY2gtaW5wdXQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1tb2RhbC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLW5hdmlnYXRvci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXBhZ2UuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1wb3BvdmVyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcHJvZ3Jlc3MtYmFyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcHJvZ3Jlc3MtY2lyY3VsYXIuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1wdWxsLWhvb2suanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1yYW5nZS5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXJpcHBsZS5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXJvdy5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXNlZ21lbnQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zZWxlY3QuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zcGVlZC1kaWFsLWl0ZW0uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zcGVlZC1kaWFsLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BsaXR0ZXItY29udGVudC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXNwbGl0dGVyLW1hc2suanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zcGxpdHRlci1zaWRlLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BsaXR0ZXIuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zd2l0Y2guanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy10YWIuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy10YWJiYXIuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy10b2FzdC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXRvb2xiYXItYnV0dG9uLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtdG9vbGJhci5qcyc7XG5cbnNldHVwKG9ucyk7IC8vIFNldHVwIGluaXRpYWwgbGlzdGVuZXJzXG53aW5kb3cuX3N1cGVyU2VjcmV0T25zID0gb25zO1xuXG5leHBvcnQgZGVmYXVsdCBvbnM7XG4iXSwibmFtZXMiOlsiTmF0aXZlSFRNTEVsZW1lbnQiLCJ3aW5kb3ciLCJIVE1MRWxlbWVudCIsIlBsYXRmb3JtIiwiX3NlbGVjdGVkUGxhdGZvcm0iLCJfaWdub3JlUGxhdGZvcm1TZWxlY3QiLCJwbGF0Zm9ybSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImZuIiwicmVzdWx0IiwiZG9jdW1lbnQiLCJyZWFkeVN0YXRlIiwiRXJyb3IiLCJjb3Jkb3ZhIiwicGhvbmVnYXAiLCJQaG9uZUdhcCIsInRlc3QiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJpc0lQaG9uZSIsInNjcmVlbiIsIndpZHRoIiwiaGVpZ2h0IiwiaXNJUGFkT1MiLCJmb3JjZUFjdHVhbFBsYXRmb3JtIiwiX2dldFNlbGVjdGVkUGxhdGZvcm0iLCJkZXZpY2UiLCJwYXJzZUludCIsInZlcnNpb24iLCJzcGxpdCIsInZlciIsIm1hdGNoIiwicmVwbGFjZSIsIm1heFRvdWNoUG9pbnRzIiwidWEiLCJpc0lPUyIsImluZGV4T2YiLCJzdGFuZGFsb25lIiwibHRlOSIsIndlYmtpdCIsIm1lc3NhZ2VIYW5kbGVycyIsImluZGV4ZWREQiIsIm9wZXJhIiwiSW5zdGFsbFRyaWdnZXIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJwIiwic2FmYXJpIiwicHVzaE5vdGlmaWNhdGlvbiIsImNocm9tZSIsImRvY3VtZW50TW9kZSIsImlzQW5kcm9pZCIsImlzV1AiLCJpc0lQYWQiLCJpc0lQb2QiLCJjdXN0b21FbGVtZW50cyIsImZvcmNlUG9seWZpbGwiLCJBbHJlYWR5Q29uc3RydWN0ZWRNYXJrZXIiLCIkanNjb21wRGVmYXVsdEV4cG9ydCIsImdsb2JhbCIsIkpzTXV0YXRpb25PYnNlcnZlciIsInJlZ2lzdHJhdGlvbnNUYWJsZSIsIldlYWtNYXAiLCJzZXRJbW1lZGlhdGUiLCJzZXRUaW1lb3V0Iiwic2V0SW1tZWRpYXRlUXVldWUiLCJzZW50aW5lbCIsIlN0cmluZyIsIk1hdGgiLCJyYW5kb20iLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsImRhdGEiLCJxdWV1ZSIsImZvckVhY2giLCJmdW5jIiwicHVzaCIsInBvc3RNZXNzYWdlIiwiaXNTY2hlZHVsZWQiLCJzY2hlZHVsZWRPYnNlcnZlcnMiLCJzY2hlZHVsZUNhbGxiYWNrIiwib2JzZXJ2ZXIiLCJkaXNwYXRjaENhbGxiYWNrcyIsIndyYXBJZk5lZWRlZCIsIm5vZGUiLCJTaGFkb3dET01Qb2x5ZmlsbCIsIm9ic2VydmVycyIsInNvcnQiLCJvMSIsIm8yIiwidWlkXyIsImFueU5vbkVtcHR5IiwidGFrZVJlY29yZHMiLCJyZW1vdmVUcmFuc2llbnRPYnNlcnZlcnNGb3IiLCJsZW5ndGgiLCJjYWxsYmFja18iLCJub2Rlc18iLCJyZWdpc3RyYXRpb25zIiwiZ2V0IiwicmVnaXN0cmF0aW9uIiwicmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzIiwiZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkIiwidGFyZ2V0IiwiY2FsbGJhY2siLCJwYXJlbnROb2RlIiwiaiIsIm9wdGlvbnMiLCJzdWJ0cmVlIiwicmVjb3JkIiwiZW5xdWV1ZSIsInVpZENvdW50ZXIiLCJyZWNvcmRzXyIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJhdHRyaWJ1dGVzIiwiY2hhcmFjdGVyRGF0YSIsImF0dHJpYnV0ZU9sZFZhbHVlIiwiYXR0cmlidXRlRmlsdGVyIiwiY2hhcmFjdGVyRGF0YU9sZFZhbHVlIiwiU3ludGF4RXJyb3IiLCJzZXQiLCJpIiwicmVtb3ZlTGlzdGVuZXJzIiwiUmVnaXN0cmF0aW9uIiwiYWRkTGlzdGVuZXJzIiwiZGlzY29ubmVjdCIsInNwbGljZSIsImNvcHlPZlJlY29yZHMiLCJNdXRhdGlvblJlY29yZCIsInR5cGUiLCJhZGRlZE5vZGVzIiwicmVtb3ZlZE5vZGVzIiwicHJldmlvdXNTaWJsaW5nIiwibmV4dFNpYmxpbmciLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlTmFtZXNwYWNlIiwib2xkVmFsdWUiLCJjb3B5TXV0YXRpb25SZWNvcmQiLCJvcmlnaW5hbCIsInNsaWNlIiwiY3VycmVudFJlY29yZCIsInJlY29yZFdpdGhPbGRWYWx1ZSIsImdldFJlY29yZCIsImdldFJlY29yZFdpdGhPbGRWYWx1ZSIsImNsZWFyUmVjb3JkcyIsInVuZGVmaW5lZCIsInJlY29yZFJlcHJlc2VudHNDdXJyZW50TXV0YXRpb24iLCJzZWxlY3RSZWNvcmQiLCJsYXN0UmVjb3JkIiwibmV3UmVjb3JkIiwidHJhbnNpZW50T2JzZXJ2ZWROb2RlcyIsInJlY29yZHMiLCJyZWNvcmRUb1JlcGxhY2VMYXN0IiwiYWRkTGlzdGVuZXJzXyIsInJlbW92ZUxpc3RlbmVyc18iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYWRkVHJhbnNpZW50T2JzZXJ2ZXIiLCJoYW5kbGVFdmVudCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsIm5hbWUiLCJhdHRyTmFtZSIsIm5hbWVzcGFjZSIsInJlbGF0ZWROb2RlIiwibmFtZXNwYWNlVVJJIiwiYXR0ckNoYW5nZSIsIk11dGF0aW9uRXZlbnQiLCJBRERJVElPTiIsInByZXZWYWx1ZSIsImNoYW5nZWROb2RlIiwiTXV0YXRpb25PYnNlcnZlciIsIl9pc1BvbHlmaWxsZWQiLCJzZWxmIiwibmV4dEhhbmRsZSIsInRhc2tzQnlIYW5kbGUiLCJjdXJyZW50bHlSdW5uaW5nQVRhc2siLCJkb2MiLCJhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzIiwiYXJncyIsInBhcnRpYWxseUFwcGxpZWQiLCJhcHBseSIsImhhbmRsZXIiLCJhcmd1bWVudHMiLCJGdW5jdGlvbiIsInJ1bklmUHJlc2VudCIsImhhbmRsZSIsInRhc2siLCJjbGVhckltbWVkaWF0ZSIsImluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uIiwicHJvY2VzcyIsIm5leHRUaWNrIiwiY2FuVXNlUG9zdE1lc3NhZ2UiLCJpbXBvcnRTY3JpcHRzIiwicG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyIsIm9sZE9uTWVzc2FnZSIsIm9ubWVzc2FnZSIsImluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uIiwibWVzc2FnZVByZWZpeCIsIm9uR2xvYmFsTWVzc2FnZSIsImV2ZW50Iiwic291cmNlIiwiYXR0YWNoRXZlbnQiLCJpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbiIsImNoYW5uZWwiLCJNZXNzYWdlQ2hhbm5lbCIsInBvcnQxIiwicG9ydDIiLCJpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uIiwiaHRtbCIsImRvY3VtZW50RWxlbWVudCIsInNjcmlwdCIsImNyZWF0ZUVsZW1lbnQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVDaGlsZCIsImFwcGVuZENoaWxkIiwiaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbiIsImF0dGFjaFRvIiwiZ2V0UHJvdG90eXBlT2YiLCJERUZBVUxUX1ZJRVdQT1JUIiwiVmlld3BvcnQiLCJlbnN1cmVWaWV3cG9ydEVsZW1lbnQiLCJ2aWV3cG9ydEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiaGVhZCIsInNldHVwIiwiaGFzQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiTWljcm9FdmVudCIsIm9uIiwiZmN0IiwiX2V2ZW50cyIsIm9uY2UiLCJ3cmFwcGVyIiwib2ZmIiwiZmlsdGVyIiwiX2ZjdCIsImVtaXQiLCJBcnJheSIsIm1peGluIiwiZGVzdE9iamVjdCIsInByb3BzIiwicHJlZml4Iiwic3R5bGVzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImpvaW4iLCJPTGluayIsInV0aWwiLCJoeXBoZW5hdGUiLCJzdHlsZXIiLCJlbGVtZW50Iiwic3R5bGUiLCJrZXlzIiwia2V5Iiwid2FybiIsImNsZWFyIiwiY2xlYXJsaXN0IiwicmVkdWNlIiwiciIsInMiLCJjb25jYXQiLCJzb21lIiwiZ2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiYXV0b1N0eWxlRW5hYmxlZCIsIm1vZGlmaWVyc01hcCIsInBsYXRmb3JtcyIsImFuZHJvaWQiLCJlbGVtZW50TmFtZSIsInRhZ05hbWUiLCJoYXNNb2RpZmllciIsIm9sZE1vZGlmaWVyIiwibmV3TW9kaWZpZXIiLCJtYXAiLCJoYXNPd25Qcm9wZXJ0eSIsInVuc2hpZnQiLCJlbGVtZW50cyIsImlvcyIsInJlbW92ZU1vZGlmaWVyIiwiYWRkTW9kaWZpZXIiLCJ1bmxvY2tlZCIsImdldFBsYXRmb3JtIiwiZm9yY2UiLCJtb2JpbGVPUyIsIm9uc1BsYXRmb3JtIiwiZ2V0TW9iaWxlT1MiLCJwcmVwYXJlIiwibWFwTW9kaWZpZXIiLCJtb2RpZmllciIsIm0iLCJyZXN0b3JlTW9kaWZpZXIiLCJpc0VuYWJsZWQiLCJlbmFibGUiLCJkaXNhYmxlIiwiTW9kaWZpZXJVdGlsIiwibGFzdCIsImN1cnJlbnQiLCJtYWtlRGljdCIsInJlbW92ZWQiLCJ0b2tlbiIsImFkZGVkIiwiZGljdCIsImRpZmYiLCJjbGFzc0xpc3QiLCJ0ZW1wbGF0ZSIsImtsYXNzIiwiayIsImFkZCIsInJlbW92ZSIsInNjaGVtZSIsInNlbGVjdG9yIiwidGFyZ2V0RWxlbWVudHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwidGFyZ2V0RWxlbWVudCIsImZpbmRQYXJlbnQiLCJwYXJlbnQiLCJhcHBseURpZmZUb0NsYXNzTGlzdCIsImFwcGx5RGlmZlRvRWxlbWVudCIsImF1dG9TdHlsZSIsIm1vZGlmaWVyVG9rZW4iLCJ0b2tlbnMiLCJpbmRleCIsInN0YXJ0c1dpdGgiLCJjIiwic3Vic3RyIiwiZW5kc1dpdGgiLCJ1bndyYXAiLCJpc09iamVjdFN0cmluZyIsImlzQXJyYXlTdHJpbmciLCJpc1F1b3RlZFN0cmluZyIsImVycm9yIiwic3RyaW5nIiwib3JpZ2luYWxTdHJpbmciLCJwcm9jZXNzVG9rZW4iLCJpc05hTiIsInBhcnNlT2JqZWN0IiwicGFyc2VBcnJheSIsIm5leHRUb2tlbiIsImxpbWl0IiwiY2hhckNvZGVBdCIsIm5lc3RlZE9iamVjdCIsImlzVmFsaWRLZXkiLCJvYmplY3QiLCJyZWFkaW5nS2V5IiwicHJldmlvdXNUb2tlbiIsImFycmF5IiwicGFyc2UiLCJlcnJvclByZWZpeCIsImdsb2JhbHMiLCJmYWJPZmZzZXQiLCJzdXBwb3J0c1Bhc3NpdmUiLCJfcnVuT25BY3R1YWxQbGF0Zm9ybSIsImFjdHVhbE1vYmlsZU9TIiwiaXNXS1dlYlZpZXciLCJvcHRzIiwiZGVmaW5lUHJvcGVydHkiLCJlbCIsIm9wdCIsImlzR0QiLCJjYXB0dXJlIiwicHJlcGFyZVF1ZXJ5IiwicXVlcnkiLCJtYXRjaGVzIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwibW96TWF0Y2hlc1NlbGVjdG9yIiwibXNNYXRjaGVzU2VsZWN0b3IiLCJmaW5kQ2hpbGQiLCJjaGlsZE5vZGVzIiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwidW50aWwiLCJEb2N1bWVudEZyYWdtZW50IiwiaXNBdHRhY2hlZCIsImJvZHkiLCJjb250YWlucyIsImhhc0FueUNvbXBvbmVudEFzUGFyZW50Iiwibm9kZU5hbWUiLCJnZXRBbGxDaGlsZE5vZGVzIiwiZnJvbSIsImNoaWxkcmVuIiwiY2hpbGRFbCIsImlzUGFnZUNvbnRyb2wiLCJwcm9wYWdhdGVBY3Rpb24iLCJhY3Rpb24iLCJjaGlsZCIsImNhbWVsaXplIiwibCIsInRvVXBwZXJDYXNlIiwiY3JlYXRlIiwic2hpZnQiLCJjbGFzc05hbWUiLCJpbXBvcnROb2RlIiwiaW5uZXJIVE1MIiwidGhyb3ciLCJjcmVhdGVGcmFnbWVudCIsImNvbnRlbnQiLCJleHRlbmQiLCJkc3QiLCJhcnJheUZyb20iLCJhcnJheUxpa2UiLCJwYXJzZUpTT05PYmplY3RTYWZlbHkiLCJqc29uU3RyaW5nIiwiZmFpbFNhZmUiLCJKU09OIiwiZmluZEZyb21QYXRoIiwicGF0aCIsImdldFRvcFBhZ2UiLCJjb250YWluZXIiLCJ0b3BQYWdlIiwiZmluZFRvb2xiYXJQYWdlIiwicGFnZSIsIl9jYW5BbmltYXRlVG9vbGJhciIsIl9jb250ZW50RWxlbWVudCIsIm5leHRQYWdlIiwidHJpZ2dlckVsZW1lbnRFdmVudCIsImV2ZW50TmFtZSIsImRldGFpbCIsIkN1c3RvbUV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJkaXNwYXRjaEV2ZW50IiwibW9kaWZpZXJOYW1lIiwiUmVnRXhwIiwiZm9yY2VBdXRvU3R5bGUiLCJuZXdNb2RpZmllcnMiLCJ0b2dnbGVNb2RpZmllciIsInRvZ2dsZSIsInJlc3RvcmVDbGFzcyIsImRlZmF1bHRDbGFzcyIsInJlZnJlc2giLCJ1cGRhdGVQYXJlbnRQb3NpdGlvbiIsIl9wYXJlbnRVcGRhdGVkIiwicGFyZW50RWxlbWVudCIsImdldFByb3BlcnR5VmFsdWUiLCJwb3NpdGlvbiIsInRvZ2dsZUF0dHJpYnV0ZSIsInZhbHVlIiwiYmluZExpc3RlbmVycyIsImxpc3RlbmVyTmFtZXMiLCJib3VuZE5hbWUiLCJiaW5kIiwiZWFjaCIsIm9iaiIsImYiLCJ1cGRhdGVSaXBwbGUiLCJoYXNSaXBwbGUiLCJhdHRycyIsInJpcHBsZUVsZW1lbnQiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwiYW5pbWF0aW9uT3B0aW9uc1BhcnNlIiwiaXNJbnRlZ2VyIiwiaXNGaW5pdGUiLCJmbG9vciIsImRlZmVyIiwiZGVmZXJyZWQiLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJpbnRlcm5hbCIsImNvbmZpZyIsIndhcm5pbmdzRGlzYWJsZWQiLCJjb25zb2xlIiwibWVzc2FnZSIsInRocm93QWJzdHJhY3QiLCJ0aHJvd01lbWJlciIsInRocm93UGFnZUxvYWRlciIsInRocm93QW5pbWF0b3IiLCJwcmV2ZW50IiwicHJldmVudERlZmF1bHQiLCJpb3NQcmV2ZW50U2Nyb2xsIiwiZ2QiLCJjbGVhbiIsImlvc1BhZ2VTY3JvbGxGaXgiLCJpc1ZhbGlkR2VzdHVyZSIsImdlc3R1cmUiLCJkaXN0YW5jZSIsImRlbHRhVGltZSIsImNoZWNrTWlzc2luZ0ltcG9ydCIsImVsZW1lbnROYW1lcyIsIm9uc0VsZW1lbnRzIiwiZGVmaW5lQm9vbGVhblByb3BlcnRpZXMiLCJhdHRyaWJ1dGVMaXN0IiwicHJvcGVydHlOYW1lIiwiY29uZmlndXJhYmxlIiwiZGVmaW5lU3RyaW5nUHJvcGVydGllcyIsImRlZmluZUxpc3RlbmVyUHJvcGVydHkiLCJjYW1lbGl6ZWQiLCJjaGFyQXQiLCJuZXdIYW5kbGVyIiwiaXNDb25uZWN0ZWQiLCJvbkNvbm5lY3RlZCIsIm9uRGlzY29ubmVjdGVkIiwicGFnZUF0dHJpYnV0ZUV4cHJlc3Npb24iLCJfdmFyaWFibGVzIiwiZGVmaW5lVmFyaWFibGUiLCJvdmVyd3JpdGUiLCJnZXRWYXJpYWJsZSIsInJlbW92ZVZhcmlhYmxlIiwiZ2V0QWxsVmFyaWFibGVzIiwiX3BhcnNlUGFydCIsInBhcnQiLCJpbkludGVycG9sYXRpb24iLCJjdXJyZW50SW5kZXgiLCJzdWJzdHJpbmciLCJfcmVwbGFjZVRva2VuIiwicmUiLCJ2YXJpYWJsZSIsInJ2IiwiX3JlcGxhY2VUb2tlbnMiLCJfcGFyc2VFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImV2YWx1YXRlIiwiZ2V0SU9TRGV2aWNlIiwiaXNXZWJWaWV3IiwiYXV0b1N0YXR1c0JhckZpbGwiLCJhbmltYXRpb25zRGlzYWJsZWQiLCJudWxsRWxlbWVudCIsImlzRW5hYmxlZEF1dG9TdGF0dXNCYXJGaWxsIiwibm9ybWFsaXplUGFnZUhUTUwiLCJ3YWl0RE9NQ29udGVudExvYWRlZCIsIndyYXBwZWRDYWxsYmFjayIsIm9uUmVhZHkiLCJzaG91bGRGaWxsU3RhdHVzQmFyIiwiaXNJT1M3YWJvdmUiLCJpc0lQaG9uZVgiLCJ0ZW1wbGF0ZVN0b3JlIiwiX3N0b3JhZ2UiLCJnZXRUZW1wbGF0ZUhUTUxBc3luYyIsImNhY2hlIiwibG9jYWwiLCJnZXRFbGVtZW50QnlJZCIsInRleHRDb250ZW50IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzIiwiZnJhZ21lbnQiLCJjcmVhdGVUZXh0Tm9kZSIsInRleHQiLCJyZXBsYWNlQ2hpbGQiLCJvbmVycm9yIiwic2VuZCIsImdldFBhZ2VIVE1MQXN5bmMiLCJwYWdlcyIsImdldFBhZ2UiLCJjYXRjaCIsIkFuaW1hdG9yRmFjdG9yeSIsIl9hbmltYXRvcnMiLCJhbmltYXRvcnMiLCJfYmFzZUNsYXNzIiwiYmFzZUNsYXNzIiwiX2Jhc2VDbGFzc05hbWUiLCJiYXNlQ2xhc3NOYW1lIiwiX2FuaW1hdGlvbiIsImRlZmF1bHRBbmltYXRpb24iLCJfYW5pbWF0aW9uT3B0aW9ucyIsImRlZmF1bHRBbmltYXRpb25PcHRpb25zIiwiZGVmYXVsdEFuaW1hdG9yIiwiYW5pbWF0b3IiLCJhbmltYXRpb24iLCJBbmltYXRvciIsImFuaW1hdGlvbk9wdHMiLCJhbmltYXRpb25PcHRpb25zIiwiZHVyYXRpb24iLCJkZWxheSIsIl9yZWFkeSIsIl9kb21Db250ZW50TG9hZGVkIiwiX29uRE9NQ29udGVudExvYWRlZCIsImFkZEJhY2tCdXR0b25MaXN0ZW5lciIsInJlbW92ZUJhY2tCdXR0b25MaXN0ZW5lciIsIkhhbmRsZXJSZXBvc2l0b3J5IiwiX3N0b3JlIiwiX2dlbklkIiwiZGF0YXNldCIsImRldmljZUJhY2tCdXR0b25IYW5kbGVySWQiLCJpZCIsImhhcyIsIkRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIiwiX2lzRW5hYmxlZCIsIl9ib3VuZENhbGxiYWNrIiwiX2NhbGxiYWNrIiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJfZGlzcGF0Y2hEZXZpY2VCYWNrQnV0dG9uRXZlbnQiLCJfZWxlbWVudCIsInNldExpc3RlbmVyIiwiZGVzdHJveSIsInRyZWUiLCJfY2FwdHVyZVRyZWUiLCJfZmluZEhhbmRsZXJMZWFmRWxlbWVudCIsImNhbGxQYXJlbnRIYW5kbGVyIiwiY3JlYXRlVHJlZSIsImFycmF5T2YiLCJjaGlsZEVsZW1lbnQiLCJkaXNwbGF5IiwiX2lzU2hvd24iLCJzdWJUcmVlIiwiZmluZCIsImNoaWxkTm9kZSIsImxlZnQiLCJyaWdodCIsImxlZnRaIiwiekluZGV4IiwicmlnaHRaIiwiZGJiRGlzcGF0Y2hlciIsImRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIiwib25zIiwicmVnaXN0ZXIiLCJ0ZW1wbGF0ZXMiLCJfb25zTG9hZGVkIiwiX3V0aWwiLCJyZWFkeSIsImVuYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyIiwiX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlciIsIl9pbnRlcm5hbCIsImNyZWF0ZUhhbmRsZXIiLCJhcHAiLCJleGl0QXBwIiwiX2dlc3R1cmVEZXRlY3RvciIsIkdlc3R1cmVEZXRlY3RvciIsInBhc3NpdmUiLCJrZXlDb2RlIiwiZmlyZURldmljZUJhY2tCdXR0b25FdmVudCIsIl9zZXR1cExvYWRpbmdQbGFjZUhvbGRlcnMiLCJUSU1FT1VUX1JBVElPIiwiY2FwaXRhbGl6ZSIsInN0ciIsImJ1aWxkVHJhbnNpdGlvblZhbHVlIiwicGFyYW1zIiwicHJvcGVydHkiLCJ0aW1pbmciLCJwcm9wIiwib25jZU9uVHJhbnNpdGlvbkVuZCIsIl90cmFuc2l0aW9uRW5kRXZlbnRzIiwic3RvcFByb3BhZ2F0aW9uIiwidmVuZG9yUHJlZml4IiwiX2Nzc1Byb3BlcnR5RGljdCIsImEiLCJ6IiwidXBwZXIiLCJoYXNDc3NQcm9wZXJ0eSIsInByZSIsImZvcmNlTGF5b3V0QXRPbmNlIiwiYmF0Y2hJbW1lZGlhdGUiLCJvZmZzZXRIZWlnaHQiLCJjYWxsYmFja3MiLCJjb25jcmVhdGVDYWxsYmFja3MiLCJiYXRjaEFuaW1hdGlvbkZyYW1lIiwicmFmIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwid2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwib1JlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidHJhbnNpdGlvblByb3BlcnR5TmFtZSIsIkFuaW1pdCIsImRlZmF1bHRzIiwidHJhbnNpdGlvblF1ZXVlIiwibGFzdFN0eWxlQXR0cmlidXRlRGljdCIsInBsYXkiLCJkb25lIiwic3RhcnRBbmltYXRpb24iLCJkZWZhdWx0IiwidG8iLCJzdGVwIiwiY3NzIiwic2F2ZVN0eWxlIiwid2FpdCIsInJlc3RvcmVTdHlsZSIsInRyYW5zaXRpb24iLCJUcmFuc2l0aW9uIiwiYnVpbGQiLCJzZWNvbmRzIiwidHJhbnNpdGlvbk5hbWUiLCJ0cmFuc2l0aW9uVmFsdWUiLCJ0aW1lb3V0SWQiLCJjbGVhclRyYW5zaXRpb24iLCJjbGVhclRpbWVvdXQiLCJsZW4iLCJyZXNldCIsIl9kZXF1ZXVlVHJhbnNpdGlvbiIsIl9jdXJyZW50VHJhbnNpdGlvbiIsImNhbGxlZCIsInJ1bkFsbCIsImNyZWF0ZUFjdHVhbENzc1Byb3BzIiwidGltZW91dCIsInByZWZpeGVkIiwiRXZlbnQiLCJVdGlscyIsIkRldGVjdGlvbiIsIlBvaW50ZXJFdmVudCIsIkluc3RhbmNlIiwiYmVoYXZpb3IiLCJ0b3VjaEFjdGlvbiIsInRvdWNoQ2FsbG91dCIsImNvbnRlbnRab29taW5nIiwidXNlckRyYWciLCJ0YXBIaWdobGlnaHRDb2xvciIsIkRPQ1VNRU5UIiwiSEFTX1BPSU5URVJFVkVOVFMiLCJwb2ludGVyRW5hYmxlZCIsIm1zUG9pbnRlckVuYWJsZWQiLCJIQVNfVE9VQ0hFVkVOVFMiLCJJU19NT0JJTEUiLCJOT19NT1VTRUVWRU5UUyIsIkNBTENVTEFURV9JTlRFUlZBTCIsIkVWRU5UX1RZUEVTIiwiRElSRUNUSU9OX0RPV04iLCJESVJFQ1RJT05fTEVGVCIsIkRJUkVDVElPTl9VUCIsIkRJUkVDVElPTl9SSUdIVCIsIlBPSU5URVJfTU9VU0UiLCJQT0lOVEVSX1RPVUNIIiwiUE9JTlRFUl9QRU4iLCJFVkVOVF9TVEFSVCIsIkVWRU5UX01PVkUiLCJFVkVOVF9FTkQiLCJFVkVOVF9SRUxFQVNFIiwiRVZFTlRfVE9VQ0giLCJSRUFEWSIsInBsdWdpbnMiLCJnZXN0dXJlcyIsImRldGVybWluZUV2ZW50VHlwZXMiLCJvblRvdWNoIiwiZGV0ZWN0IiwidXRpbHMiLCJkZXN0Iiwic3JjIiwibWVyZ2UiLCJpdGVyYXRvciIsImNvbnRleHQiLCJpblN0ciIsImluQXJyYXkiLCJkZWVwIiwiZXZlcnkiLCJ0b0FycmF5IiwiaGFzUGFyZW50IiwiZ2V0Q2VudGVyIiwidG91Y2hlcyIsInBhZ2VYIiwicGFnZVkiLCJjbGllbnRYIiwiY2xpZW50WSIsIm1pbiIsIm1heCIsInRvdWNoIiwiZ2V0VmVsb2NpdHkiLCJkZWx0YVgiLCJkZWx0YVkiLCJ4IiwiYWJzIiwieSIsImdldEFuZ2xlIiwidG91Y2gxIiwidG91Y2gyIiwiYXRhbjIiLCJQSSIsImdldERpcmVjdGlvbiIsImdldERpc3RhbmNlIiwic3FydCIsImdldFNjYWxlIiwic3RhcnQiLCJlbmQiLCJnZXRSb3RhdGlvbiIsImlzVmVydGljYWwiLCJkaXJlY3Rpb24iLCJzZXRQcmVmaXhlZENzcyIsInByZWZpeGVzIiwidG9DYW1lbENhc2UiLCJ0b2dnbGVCZWhhdmlvciIsImZhbHNlRm4iLCJ1c2VyU2VsZWN0Iiwib25zZWxlY3RzdGFydCIsIm9uZHJhZ3N0YXJ0IiwicHJldmVudE1vdXNlRXZlbnRzIiwic3RhcnRlZCIsInNob3VsZERldGVjdCIsImhvb2siLCJ0eXBlcyIsImV2ZW50VHlwZSIsIm9uVG91Y2hIYW5kbGVyIiwiZXYiLCJzcmNUeXBlIiwiaXNQb2ludGVyIiwiaXNNb3VzZSIsInRyaWdnZXJUeXBlIiwiYnV0dG9uIiwiYnV0dG9ucyIsIm1hdGNoVHlwZSIsInVwZGF0ZVBvaW50ZXIiLCJkb0RldGVjdCIsInRvdWNoTGlzdCIsImdldFRvdWNoTGlzdCIsInRvdWNoTGlzdExlbmd0aCIsInRyaWdnZXJDaGFuZ2UiLCJ0cmlnZ2VyIiwiY2hhbmdlZExlbmd0aCIsImNoYW5nZWRUb3VjaGVzIiwiZXZEYXRhIiwiY29sbGVjdEV2ZW50RGF0YSIsImlkZW50aWZpZXJzIiwiaWRlbnRpZmllciIsInBvaW50ZXJUeXBlIiwiY2VudGVyIiwidGltZVN0YW1wIiwiRGF0ZSIsIm5vdyIsInNyY0V2ZW50IiwicHJldmVudE1hbmlwdWxhdGlvbiIsInN0b3BEZXRlY3QiLCJwb2ludGVycyIsInRvdWNobGlzdCIsInBvaW50ZXIiLCJwb2ludGVyRXZlbnQiLCJwb2ludGVySWQiLCJwdCIsIk1TUE9JTlRFUl9UWVBFX01PVVNFIiwiTVNQT0lOVEVSX1RZUEVfVE9VQ0giLCJNU1BPSU5URVJfVFlQRV9QRU4iLCJyZXNldExpc3QiLCJkZXRlY3Rpb24iLCJwcmV2aW91cyIsInN0b3BwZWQiLCJzdGFydERldGVjdCIsImluc3QiLCJldmVudERhdGEiLCJzdGFydEV2ZW50IiwibGFzdEV2ZW50IiwibGFzdENhbGNFdmVudCIsImZ1dHVyZUNhbGNFdmVudCIsImxhc3RDYWxjRGF0YSIsImV4dGVuZEV2ZW50RGF0YSIsImluc3RPcHRpb25zIiwidHJpZ2dlckdlc3R1cmUiLCJlbmFibGVkIiwiZ2V0Q2FsY3VsYXRlZERhdGEiLCJjdXIiLCJyZWNhbGMiLCJjYWxjRXYiLCJjYWxjRGF0YSIsInZlbG9jaXR5IiwiYW5nbGUiLCJ2ZWxvY2l0eVgiLCJ2ZWxvY2l0eVkiLCJpbnRlcmltQW5nbGUiLCJpbnRlcmltRGlyZWN0aW9uIiwic3RhcnRFdiIsImxhc3RFdiIsInNjYWxlIiwicm90YXRpb24iLCJiIiwibGlzdGVuZXJPcHRpb25zIiwiZXZlbnRTdGFydEhhbmRsZXIiLCJldmVudEhhbmRsZXJzIiwib25FdmVudCIsIm9mZkV2ZW50IiwidHJpZ2dlckV2ZW50Iiwic3RhdGUiLCJkaXNwb3NlIiwiZWgiLCJ0cmlnZ2VyZWQiLCJkcmFnR2VzdHVyZSIsImRyYWdNYXhUb3VjaGVzIiwiZHJhZ01pbkRpc3RhbmNlIiwic3RhcnRDZW50ZXIiLCJkcmFnRGlzdGFuY2VDb3JyZWN0aW9uIiwiZmFjdG9yIiwiZHJhZ0xvY2tUb0F4aXMiLCJkcmFnTG9ja01pbkRpc3RhbmNlIiwibGFzdERpcmVjdGlvbiIsImRyYWdCbG9ja1ZlcnRpY2FsIiwiZHJhZ0Jsb2NrSG9yaXpvbnRhbCIsIkRyYWciLCJHZXN0dXJlIiwicmVsZWFzZUdlc3R1cmUiLCJ0aW1lciIsImhvbGRHZXN0dXJlIiwiaG9sZFRpbWVvdXQiLCJob2xkVGhyZXNob2xkIiwiSG9sZCIsIlJlbGVhc2UiLCJJbmZpbml0eSIsIlN3aXBlIiwic3dpcGVNaW5Ub3VjaGVzIiwic3dpcGVNYXhUb3VjaGVzIiwic3dpcGVWZWxvY2l0eVgiLCJzd2lwZVZlbG9jaXR5WSIsInN3aXBlR2VzdHVyZSIsImhhc01vdmVkIiwidGFwR2VzdHVyZSIsInByZXYiLCJzaW5jZVByZXYiLCJkaWREb3VibGVUYXAiLCJ0YXBNYXhEaXN0YW5jZSIsInRhcE1heFRpbWUiLCJkb3VibGVUYXBJbnRlcnZhbCIsImRvdWJsZVRhcERpc3RhbmNlIiwidGFwQWx3YXlzIiwiVGFwIiwiVG91Y2giLCJwcmV2ZW50TW91c2UiLCJ0b3VjaEdlc3R1cmUiLCJ0cmFuc2Zvcm1HZXN0dXJlIiwic2NhbGVUaHJlc2hvbGQiLCJyb3RhdGlvblRocmVzaG9sZCIsInRyYW5zZm9ybU1pblNjYWxlIiwidHJhbnNmb3JtTWluUm90YXRpb24iLCJUcmFuc2Zvcm0iLCJyZWFkeU1hcCIsInF1ZXVlTWFwIiwiaXNDb250ZW50UmVhZHkiLCJzZXRDb250ZW50UmVhZHkiLCJhZGRDYWxsYmFjayIsImNvbnN1bWVRdWV1ZSIsImRlbGV0ZSIsImNvbnRlbnRSZWFkeSIsImNoYW5nZXMiLCJUb2FzdFF1ZXVlIiwidGhlbiIsIl9zZXRBdHRyaWJ1dGVzIiwiX25vcm1hbGl6ZUFyZ3VtZW50cyIsIl9vYmplY3RTcHJlYWQiLCJtZXNzYWdlSFRNTCIsImJ1dHRvbkxhYmVscyIsImJ1dHRvbkxhYmVsIiwiaXNBcnJheSIsImNvbXBpbGUiLCJwYXJhbSIsInByaW1hcnlCdXR0b25JbmRleCIsIm5vdGlmaWNhdGlvbiIsIl9jcmVhdGVBbGVydERpYWxvZyIsImlucHV0U3RyaW5nIiwiaXNQcm9tcHQiLCJpbnB1dFR5cGUiLCJwbGFjZWhvbGRlciIsImRlZmF1bHRWYWx1ZSIsImxhYmVsIiwiX2Rlc3Ryb3lEaWFsb2ciLCJkaWFsb2ciLCJvbkRpYWxvZ0NhbmNlbCIsIm1hc2tDb2xvciIsInRpdGxlIiwiaW5wdXQiLCJzdWJtaXRPbkVudGVyIiwib25rZXlwcmVzcyIsImhpZGUiLCJyZXNvbHZlVmFsdWUiLCJmb290ZXIiLCJidXR0b25FbGVtZW50Iiwib25jbGljayIsInNob3ciLCJhdXRvZm9jdXMiLCJzdHJMZW5ndGgiLCJmb2N1cyIsImluY2x1ZGVzIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJhbGVydCIsImNvbmZpcm0iLCJwcm9tcHQiLCJ0b2FzdCIsIm9yaWdpbmFsSGlkZSIsImZpbmlzaCIsIl90b2FzdCIsImNoZWNrT3B0aW9ucyIsImVyciIsImluc3RhbmNlT2YiLCJjYiIsImQiLCJhY3Rpb25TaGVldCIsImNsYXNzIiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsIml0ZW0iLCJidXR0b25PcHRpb25zIiwiZGVzdHJ1Y3RpdmUiLCJpY29uIiwiX2lzUG9ydHJhaXQiLCJpc1BvcnRyYWl0IiwiaXNMYW5kc2NhcGUiLCJfaW5pdCIsIl9vbk9yaWVudGF0aW9uQ2hhbmdlIiwiX29uUmVzaXplIiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwiX2luc3RhbGxJc1BvcnRyYWl0SW1wbGVtZW50YXRpb24iLCJvcmllbnRhdGlvbiIsIm5JdGVyIiwiaW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsInciLCJoIiwiY2xlYXJJbnRlcnZhbCIsIm1vZGlmaWVycyIsInNvZnR3YXJlS2V5Ym9hcmQiLCJfdmlzaWJsZSIsIm9uU2hvdyIsIm9uSGlkZSIsImJpbmRFdmVudHMiLCJLZXlib2FyZCIsIm9uc2hvdyIsIm9uaGlkZSIsInZpc2libGUiLCJpc1Zpc2libGUiLCJub1BsdWdpbkVycm9yIiwiZ2VuZXJhdGVJZCIsIkRvb3JMb2NrIiwiX2xvY2tMaXN0IiwiX3dhaXRMaXN0IiwiX2xvZyIsImxvZyIsInVubG9jayIsIl91bmxvY2siLCJfdHJ5VG9GcmVlV2FpdExpc3QiLCJpc0xvY2tlZCIsImxvYWRQYWdlIiwicGFnZUVsZW1lbnQiLCJ1bmxvYWRQYWdlIiwiX2Rlc3Ryb3kiLCJQYWdlTG9hZGVyIiwibG9hZGVyIiwidW5sb2FkZXIiLCJfbG9hZGVyIiwiX3VubG9hZGVyIiwiRWxlbWVudCIsImRlZmF1bHRQYWdlTG9hZGVyIiwiaW5zdGFudFBhZ2VMb2FkZXIiLCJhbmltaXQiLCJfYXV0b1N0eWxlIiwiX3JlYWR5TG9jayIsInNlbGVjdCIsImxvY2F0aW9uIiwic2VhcmNoIiwid2FpdERldmljZVJlYWR5IiwicmVhZHlFcnJvciIsImFmdGVyIiwiaXNSZWFkeSIsIndhaXRVbmxvY2siLCJzZXREZWZhdWx0RGV2aWNlQmFja0J1dHRvbkxpc3RlbmVyIiwibGlzdGVuZXIiLCJkaXNhYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIiLCJlbmFibGVBdXRvU3RhdHVzQmFyRmlsbCIsImRpc2FibGVBdXRvU3RhdHVzQmFyRmlsbCIsIm1vY2tTdGF0dXNCYXIiLCJtb2NrIiwiZGlzYWJsZUFuaW1hdGlvbnMiLCJlbmFibGVBbmltYXRpb25zIiwiX2Rpc2FibGVXYXJuaW5ncyIsIl9lbmFibGVXYXJuaW5ncyIsImRpc2FibGVBdXRvU3R5bGluZyIsImVuYWJsZUF1dG9TdHlsaW5nIiwiZGlzYWJsZUljb25BdXRvUHJlZml4IiwiSWNvbiIsInNldEF1dG9QcmVmaXgiLCJmb3JjZVBsYXRmb3JtU3R5bGluZyIsIm5ld1BsYXRmb3JtIiwiX3BsYXRmb3JtVXBkYXRlIiwiX3VwZGF0ZVBvc2l0aW9uIiwicHJlbG9hZCIsImFsbCIsImFwcGVuZCIsImxpbmsiLCJjcmVhdGVQb3BvdmVyIiwiY3JlYXRlRGlhbG9nIiwiY3JlYXRlQWxlcnREaWFsb2ciLCJvcGVuQWN0aW9uU2hlZXQiLCJyZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyIiwiX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIiLCJ1bmxvY2tEZXZpY2VSZWFkeSIsImxvY2siLCJnZXRDUyIsImN1cnJlbnRTY3JpcHQiLCJzY3JpcHRzIiwiZ2V0U2NyaXB0UGFnZSIsImdldEVsZW1lbnRDbGFzcyIsIkJhc2VFbGVtZW50IiwiSWZFbGVtZW50IiwiX2lzQWxsb3dlZFBsYXRmb3JtIiwiY29uZGl0aW9uYWxPcmllbnRhdGlvbiIsImN1cnJlbnRPcmllbnRhdGlvbiIsIklmIiwiZGVmaW5lIiwiQmFzZUFuaW1hdG9yIiwiZGVmIiwicHJvcGVydGllcyIsImV4dGVuZGVkQW5pbWF0b3IiLCJuZXdBbmltYXRvciIsImlQaG9uZVhQYXRjaCIsImlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUiLCJpc0lQaG9uZVhMYW5kc2NhcGVQYXRjaEFjdGl2ZSIsImdldFNhZmVBcmVhTGVuZ3RocyIsInNhZmVBcmVhTGVuZ3RocyIsInRvcCIsImJvdHRvbSIsImdldFNhZmVBcmVhRE9NUmVjdCIsInNhZmVBcmVhUmVjdCIsIkFjdGlvblNoZWV0QW5pbWF0b3IiLCJNREFjdGlvblNoZWV0QW5pbWF0b3IiLCJtYXNrVGltaW5nIiwibWFza0R1cmF0aW9uIiwiX21hc2siLCJvcGFjaXR5IiwiX3NoZWV0IiwidHJhbnNmb3JtIiwiSU9TQWN0aW9uU2hlZXRBbmltYXRvciIsImxpZnRBbW91bnQiLCJjbGllbnRIZWlnaHQiLCJCYXNlRGlhbG9nRWxlbWVudCIsImNvbnN0cnVjdG9yIiwiX2Rvb3JMb2NrIiwiX2NhbmNlbCIsIl9zZWxmQ2FtZWxOYW1lIiwiX2RlZmF1bHREQkIiLCJfYW5pbWF0b3JGYWN0b3J5IiwiX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSIsInNob3VsZFNob3ciLCJfYmFja0J1dHRvbkhhbmRsZXIiLCJfYmFja0J1dHRvbkNhbGxiYWNrIiwiX3J1bm5pbmciLCJfc2V0VmlzaWJsZSIsImNhbmNlbGVkIiwiX3RvZ2dsZVN0eWxlIiwicGFyc2VBbmltYXRpb25PcHRpb25zU3RyaW5nIiwic3RyaW5naWZ5IiwiYmFja2dyb3VuZENvbG9yIiwib25EZXZpY2VCYWNrQnV0dG9uIiwib25Nb2RpZmllckNoYW5nZWQiLCJfc2NoZW1lIiwiX3VwZGF0ZUFuaW1hdGlvbiIsIl91cGRhdGVNYXNrIiwiX2FuaW1hdG9yRGljdCIsIkFjdGlvblNoZWV0RWxlbWVudCIsIl9jb21waWxlIiwic2hlZXQiLCJfdGl0bGUiLCJoaWRkZW4iLCJtYXNrIiwiaW5pdE1vZGlmaWVyIiwiX3VwZGF0ZVRpdGxlIiwiQWN0aW9uU2hlZXQiLCJBbmltYXRvckNTUyIsIl9xdWV1ZSIsIl9pbmRleCIsImZpbmFsIiwiZ2V0VGltZSIsImluaXRpYWwiLCJuZXh0IiwidXBkYXRlU3R5bGVzIiwic3RvcCIsInRyYW5zaXRpb25EdXJhdGlvbiIsInN0b3BOZXh0Iiwic3BlZWQiLCJuZXdEdXJhdGlvbiIsInBhc3NlZCIsInJlbWFpbmluZyIsInNwZWVkVXBUaW1lIiwibWlsbGlzZWNvbmRzIiwidiIsInBhcnNlRmxvYXQiLCJ0cmFuc2l0aW9uUHJvcGVydHkiLCJfb25TdG9wQW5pbWF0aW9ucyIsInN0b3BBbmltYXRpb25zIiwiYW5pbWF0ZSIsImRlZmF1bHRDbGFzc05hbWUiLCJSaXBwbGVFbGVtZW50IiwiX29uVGFwIiwiX29uSG9sZCIsIl9vbkRyYWdTdGFydCIsIl9vblJlbGVhc2UiLCJfYW5pbWF0b3IiLCJhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2siLCJfd2F2ZSIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJfYmFja2dyb3VuZCIsInNpemVzIiwic2l6ZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIl9nZXRFZmZlY3RTaXplIiwiX2NlbnRlciIsInJvdW5kIiwiX21pblIiLCJfY2FsY3VsYXRlQ29vcmRzIiwic3RvcEFsbCIsImNvbXB1dGVkU3R5bGUiLCJkaXNhYmxlZCIsInJpcHBsZSIsIl91cGRhdGVQYXJlbnQiLCJfcmlwcGxlQW5pbWF0aW9uIiwiZmFkZSIsIl9ob2xkaW5nIiwiX3BhcmVudE5vZGUiLCJwbiIsImJhY2tncm91bmQiLCJSaXBwbGUiLCJCYXNlQnV0dG9uRWxlbWVudCIsIl9kZWZhdWx0Q2xhc3NOYW1lIiwiX2ljb24iLCJfaGlkZGVuQnV0dG9uIiwiX3VwZGF0ZVJpcHBsZSIsIl9yaXBwbGVPcHQiLCJfdXBkYXRlSWNvbiIsIkFjdGlvblNoZWV0QnV0dG9uRWxlbWVudCIsIkFjdGlvblNoZWV0QnV0dG9uIiwiQWxlcnREaWFsb2dBbmltYXRvciIsIkFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIiwiX2RpYWxvZyIsIklPU0FsZXJ0RGlhbG9nQW5pbWF0b3IiLCJBbGVydERpYWxvZ0VsZW1lbnQiLCJBbGVydERpYWxvZyIsIkFsZXJ0RGlhbG9nQnV0dG9uRWxlbWVudCIsIkFsZXJ0RGlhbG9nQnV0dG9uIiwiaW9zQmFja0J1dHRvbkljb24iLCJtZEJhY2tCdXR0b25JY29uIiwiQmFja0J1dHRvbkVsZW1lbnQiLCJfb3B0aW9ucyIsIl9ib3VuZE9uQ2xpY2siLCJfb25DbGljayIsIl9jb25uZWN0T25DbGljayIsIl9kaXNjb25uZWN0T25DbGljayIsImRlZmF1bHRQcmV2ZW50ZWQiLCJwb3BQYWdlIiwib25zQmFja0J1dHRvbiIsIkJhY2tCdXR0b24iLCJCb3R0b21Ub29sYmFyRWxlbWVudCIsIkJvdHRvbVRvb2xiYXIiLCJCdXR0b25FbGVtZW50IiwiQnV0dG9uIiwiQ2FyZEVsZW1lbnQiLCJDYXJkIiwiQ2Fyb3VzZWxJdGVtRWxlbWVudCIsIkNhcm91c2VsSXRlbSIsImRpcmVjdGlvbk1hcCIsInZlcnRpY2FsIiwiYXhpcyIsImRpciIsInQzZCIsImhvcml6b250YWwiLCJTd2lwZXIiLCJGQUxTRSIsImdldEVsZW1lbnQiLCJzY3JvbGxIb29rIiwiaXRlbVNpemUiLCJnZXRBdXRvU2Nyb2xsUmF0aW8iLCJyYXRpbyIsInNob3VsZEJsb2NrIiwib25EcmFnU3RhcnQiLCJvbkRyYWciLCJvbkRyYWdFbmQiLCJvblJlc2l6ZSIsIl9zaG91bGRGaXhTY3JvbGwiLCJzd2lwZWFibGUiLCJhdXRvUmVmcmVzaCIsImluaXRpYWxpemVkIiwiYmxvY2tlciIsIl9tdXRhdGlvbk9ic2VydmVyIiwidXBkYXRlU3dpcGVhYmxlIiwidXBkYXRlQXV0b1JlZnJlc2giLCJfc2Nyb2xsIiwiX29mZnNldCIsIl9sYXN0QWN0aXZlSW5kZXgiLCJfdXBkYXRlTGF5b3V0IiwiX3NldHVwSW5pdGlhbEluZGV4Iiwic2V0dXBSZXNpemUiLCJpdGVtTnVtU2l6ZSIsIl9yZXNldCIsInNldEFjdGl2ZUluZGV4IiwiX2l0ZW1OdW1TaXplIiwiX2NhbGN1bGF0ZUl0ZW1TaXplIiwiaXRlbUNvdW50IiwidGFyZ2V0U2l6ZSIsImNlaWwiLCJOdW1iZXIiLCJnZXRJbml0aWFsSW5kZXgiLCJfc2Nyb2xsVG8iLCJfc2V0U3dpcGluZyIsInNjcm9sbCIsIm1heFNjcm9sbCIsIl9jaGFuZ2VUbyIsImNvdW50Iiwic2hvdWxkVXBkYXRlIiwic2hvdWxkV2F0Y2giLCJuZXdTaXplIiwiYmxvY2siLCJwb2ludGVyRXZlbnRzIiwiaXNGaXJzdCIsImlzT3ZlclNjcm9sbGFibGUiLCJpc0xhc3QiLCJfaWdub3JlRHJhZyIsImNvbnN1bWVkIiwiY29uc3VtZSIsIl9jYW5Db25zdW1lR2VzdHVyZSIsInN0YXJ0WCIsImRpc3RGcm9tRWRnZSIsImdldEJ1YmJsZVdpZHRoIiwiX3N0YXJ0ZWQiLCJ0b2dnbGVCbG9ja2VyIiwiX2NvbnRpbnVlZCIsIl9nZXREZWx0YSIsInRocm90dGxlIiwibm9ybWFsaXplZFNjcm9sbCIsIl9ub3JtYWxpemVTY3JvbGwiLCJfc3RhcnRNb21lbnR1bVNjcm9sbCIsIl9raWxsT3ZlclNjcm9sbCIsIl9nZXRWZWxvY2l0eSIsIm1hdGNoZXNEaXJlY3Rpb24iLCJkTSIsIm5leHRTY3JvbGwiLCJfZ2V0QXV0b1Njcm9sbCIsInN3aXBlIiwia2lsbE92ZXJTY3JvbGwiLCJvdmVyU2Nyb2xsSG9vayIsImFjdGl2ZUluZGV4IiwiZ2V0QWN0aXZlSW5kZXgiLCJsYXN0QWN0aXZlSW5kZXgiLCJjaGFuZ2UiLCJwcmVDaGFuZ2VIb29rIiwicG9zdENoYW5nZUhvb2siLCJ0b0ZpeGVkIiwiX2dldFRyYW5zZm9ybSIsIm9mZnNldCIsImlzQXV0b1Njcm9sbGFibGUiLCJhcnIiLCJwb3MiLCJsYXN0U2Nyb2xsIiwic2Nyb2xsUmF0aW8iLCJfdGFyZ2V0U2l6ZSIsInJlZnJlc2hIb29rIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaXNDZW50ZXJlZCIsIkNhcm91c2VsRWxlbWVudCIsIl9jb25uZWN0T25Td2lwZSIsIl9kaXNjb25uZWN0T25Td2lwZSIsIl9zd2lwZXIiLCJhdXRvU2Nyb2xsUmF0aW8iLCJvdmVyc2Nyb2xsYWJsZSIsImNlbnRlcmVkIiwiYXV0b1Njcm9sbCIsIl9vbk92ZXJTY3JvbGwiLCJfb25QcmVDaGFuZ2UiLCJfb25Qb3N0Q2hhbmdlIiwiX29uUmVmcmVzaCIsImluaXQiLCJ1cGRhdGVJdGVtU2l6ZSIsIndhaXRGb3JBY3Rpb24iLCJjYXJvdXNlbCIsIndhaXRUb1JldHVybiIsIml0ZW1TaXplQXR0ciIsImF0dHIiLCJDYXJvdXNlbCIsIkNvbEVsZW1lbnQiLCJfdXBkYXRlV2lkdGgiLCJmbGV4IiwibWF4V2lkdGgiLCJDb2wiLCJEaWFsb2dBbmltYXRvciIsIkFuZHJvaWREaWFsb2dBbmltYXRvciIsIklPU0RpYWxvZ0FuaW1hdG9yIiwiYm9keUhlaWdodCIsIlNsaWRlRGlhbG9nQW5pbWF0b3IiLCJEaWFsb2dFbGVtZW50IiwiRGlhbG9nIiwiRmFiRWxlbWVudCIsIl9oaWRlIiwiX3Nob3ciLCJfbWFudWFsbHlIaWRkZW4iLCJfdG9nZ2xlIiwiaXNCb3R0b20iLCJ0cmFuc2xhdGUiLCJGYWIiLCJHZXN0dXJlRGV0ZWN0b3JFbGVtZW50IiwiYXV0b1ByZWZpeCIsIkljb25FbGVtZW50IiwiX2NsZWFuQ2xhc3NBdHRyaWJ1dGUiLCJfdXBkYXRlIiwiX2J1aWxkQ2xhc3NBbmRTdHlsZSIsIl9wYXJzZUF0dHIiLCJwYXJ0cyIsIm1kIiwibGFzdEljb24iLCJsYXN0TW9kaWZpZXIiLCJfcHJlZml4SWNvbiIsImN1c3RvbVByZWZpeFJFIiwiaWNvbk5hbWUiLCJyZW1vdmVQcm9wZXJ0eSIsImZvbnRTaXplIiwiTGF6eVJlcGVhdERlbGVnYXRlIiwidXNlckRlbGVnYXRlIiwidGVtcGxhdGVFbGVtZW50IiwiX3VzZXJEZWxlZ2F0ZSIsIl90ZW1wbGF0ZUVsZW1lbnQiLCJpdGVtSGVpZ2h0IiwiX3JlbmRlciIsImxvYWRJdGVtRWxlbWVudCIsImNyZWF0ZUl0ZW1Db250ZW50IiwiY291bnRJdGVtcyIsInVwZGF0ZUl0ZW1Db250ZW50IiwiY2FsY3VsYXRlSXRlbUhlaWdodCIsImRlc3Ryb3lJdGVtIiwiTGF6eVJlcGVhdFByb3ZpZGVyIiwid3JhcHBlckVsZW1lbnQiLCJkZWxlZ2F0ZSIsIl93cmFwcGVyRWxlbWVudCIsIl9kZWxlZ2F0ZSIsIl9pbnNlcnRJbmRleCIsIl9wYWdlQ29udGVudCIsIl9maW5kUGFnZUNvbnRlbnRFbGVtZW50IiwibGFzdFNjcm9sbFRvcCIsInNjcm9sbFRvcCIsInBhZGRpbmciLCJfdG9wUG9zaXRpb25zIiwiX3JlbmRlcmVkSXRlbXMiLCJfdW5rbm93bkl0ZW1IZWlnaHQiLCJfYWRkRXZlbnRMaXN0ZW5lcnMiLCJfb25DaGFuZ2UiLCJwYWRkaW5nVG9wIiwibmV3VmFsdWUiLCJwYWdlQ29udGVudCIsIl9pdGVtSGVpZ2h0IiwidmlzaWJpbGl0eSIsInN0YXRpY0l0ZW1IZWlnaHQiLCJfZ2V0SXRlbUhlaWdodCIsImZvcmNlUmVuZGVyIiwiZm9yY2VTY3JvbGxEb3duIiwiZmlyc3RJdGVtSW5kZXgiLCJfZmlyc3RJdGVtUmVuZGVyZWQiLCJfY2FsY3VsYXRlUmVuZGVyZWRIZWlnaHQiLCJmb3JjZUZpcnN0SW5kZXgiLCJfcmVtb3ZlQWxsRWxlbWVudHMiLCJmb3JjZUxhc3RJbmRleCIsIl9jaGVja0l0ZW1IZWlnaHQiLCJpc1Njcm9sbFVwIiwia2VlcCIsIl9jb3VudEl0ZW1zIiwiX2NhbGN1bGF0ZVN0YXJ0SW5kZXgiLCJoYXNSZW5kZXJGdW5jdGlvbiIsIl9yZW5kZXJFbGVtZW50IiwibGFzdEluZGV4IiwiX3JlbW92ZUVsZW1lbnQiLCJ1cGRhdGVJdGVtIiwibGFzdEl0ZW1JbmRleCIsIl9sYXN0SXRlbVJlbmRlcmVkIiwiX3JlY2FsY3VsYXRlVG9wUG9zaXRpb25zIiwibWlkZGxlIiwiaW1tZWRpYXRlIiwiY2FsbE5vdyIsIl9kZWJvdW5jZSIsIl9ib3VuZE9uQ2hhbmdlIiwiX2JvdW5kRG91YmxlRmlyZU9uVG91Y2hlbmQiLCJfcGFyZW50RWxlbWVudCIsIl9yZW1vdmVFdmVudExpc3RlbmVycyIsIkxhenlSZXBlYXRFbGVtZW50IiwiX2xhenlSZXBlYXRQcm92aWRlciIsIkxhenlSZXBlYXQiLCJMaXN0SGVhZGVyRWxlbWVudCIsIkxpc3RIZWFkZXIiLCJMaXN0VGl0bGVFbGVtZW50IiwiTGlzdFRpdGxlIiwiTGlzdEl0ZW1BbmltYXRvciIsImxpc3RJdGVtIiwiU2xpZGVMaXN0SXRlbUFuaW1hdG9yIiwiX2FuaW1hdGVFeHBhbnNpb24iLCJzaG91bGRPcGVuIiwib2xkSGVpZ2h0IiwiZXhwYW5kYWJsZUNvbnRlbnQiLCJvbGREaXNwbGF5IiwiZXhwYW5zaW9uT3BlblRyYW5zaXRpb24iLCJwYWRkaW5nQm90dG9tIiwiaWNvbk9wZW5UcmFuc2l0aW9uIiwicmV2ZXJzZSIsImV4cGFuZENoZXZyb24iLCJMaXN0SXRlbUVsZW1lbnQiLCJfc2hvdWxkSWdub3JlVGFwIiwic2hvd0V4cGFuc2lvbiIsImhpZGVFeHBhbnNpb24iLCJ0b3BDb250ZW50IiwiY2VudGVyQ29udGVudCIsIl90b3AiLCJjaGV2cm9uIiwiZXhwYW5kZWQiLCJfY2xlYXJUYXBCYWNrZ3JvdW5kQ29sb3IiLCJleHBhbmRlZEF0U3RhcnR1cCIsIl9leHBhbmRpbmciLCJleHBhbmRlZENhbGxiYWNrIiwiX3NldHVwTGlzdGVuZXJzIiwiX29yaWdpbmFsQmFja2dyb3VuZENvbG9yIiwidGFwcGVkIiwiX29uVG91Y2giLCJfb25EcmFnIiwiX29uQ2xpY2tUb3AiLCJ0b2dnbGVFeHBhbnNpb24iLCJ0b3VjaFN0eWxlIiwiYm94U2hhZG93Iiwia2VlcFRhcEJhY2tncm91bmRDb2xvciIsIkxpc3RJdGVtIiwiTGlzdEVsZW1lbnQiLCJMaXN0IiwiSU5QVVRfQVRUUklCVVRFUyIsIkJhc2VJbnB1dEVsZW1lbnQiLCJfYm91bmREZWxlZ2F0ZUV2ZW50IiwiX2RlbGVnYXRlRXZlbnQiLCJfdGVtcGxhdGUiLCJfc2V0SW5wdXRJZCIsIl91cGRhdGVCb3VuZEF0dHJpYnV0ZXMiLCJfaW5wdXQiLCJ2YWwiLCJ0b0lTT1N0cmluZyIsImJsdXIiLCJJbnB1dEVsZW1lbnQiLCJfYm91bmRPbklucHV0IiwiX2JvdW5kT25Gb2N1c2luIiwiX3VwZGF0ZUxhYmVsIiwiX3VwZGF0ZUxhYmVsQ2xhc3MiLCJfaGVscGVyIiwiaW5uZXJUZXh0IiwiSW5wdXQiLCJCYXNlQ2hlY2tib3hFbGVtZW50IiwiY2hlY2tlZCIsIkNoZWNrYm94RWxlbWVudCIsIkNoZWNrYm94IiwiUmFkaW9FbGVtZW50IiwiUmFkaW8iLCJTZWFyY2hJbnB1dEVsZW1lbnQiLCJTZWFyY2hJbnB1dCIsIk1vZGFsQW5pbWF0b3IiLCJtb2RhbCIsIkZhZGVNb2RhbEFuaW1hdG9yIiwiTGlmdE1vZGFsQW5pbWF0b3IiLCJNb2RhbEVsZW1lbnQiLCJNb2RhbCIsIndpZHRoVG9QeCIsInB4Iiwib2Zmc2V0V2lkdGgiLCJTd2lwZVJldmVhbCIsImVsZW1lbnRIYW5kbGVyIiwiZ2V0VGhyZXNob2xkIiwiZ2V0U2lkZSIsImhhbmRsZUdlc3R1cmUiLCJnZXN0dXJlRGV0ZWN0b3IiLCJpZ25vcmVTd2lwZSIsIl93aWR0aCIsIl9zdGFydERpc3RhbmNlIiwiX2Rpc3RhbmNlIiwiaXNJbml0aWFsU3RhdGUiLCJkZWx0YSIsInN3aXBlTWlkIiwiaXNTd2lwZU1heCIsInN3aXBlTWF4Iiwic3dpcGVNaW4iLCJOYXZpZ2F0b3JBbmltYXRvciIsImVudGVyUGFnZSIsImxlYXZlUGFnZSIsIklPU1N3aXBlTmF2aWdhdG9yQW5pbWF0b3IiLCJkdXJhdGlvblJlc3RvcmUiLCJkdXJhdGlvblN3aXBlIiwidGltaW5nU3dpcGUiLCJyZXN0IiwiX2V4Y2x1ZGVkIiwib3B0U3dpcGUiLCJvcHRSZXN0b3JlIiwic3dpcGVTaGFkb3ciLCJpc0RyYWdTdGFydCIsInVuYmxvY2siLCJiYWNrZ3JvdW5kTWFzayIsImVudGVyIiwibGVhdmUiLCJkZWNvbXAiLCJfZGVjb21wb3NlIiwiX2NhbGN1bGF0ZURlbHRhIiwic2hvdWxkQW5pbWF0ZVRvb2xiYXIiLCJfc2hvdWxkQW5pbWF0ZVRvb2xiYXIiLCJ0b29sYmFyIiwiX3NhdmVTdHlsZSIsIm92ZXJmbG93RWxlbWVudCIsImlzU3dpcGluZyIsIl9kcmFnU3RhcnRTZXR1cCIsInN3aXBlUmF0aW8iLCJib3R0b21Ub29sYmFyIiwidG9vbGJhckNlbnRlciIsImJhY2tCdXR0b25MYWJlbCIsIm90aGVyIiwiX3NhdmVkU3R5bGUiLCJzYXZlIiwicmVzdG9yZSIsIl9yZXN0b3JlU3R5bGUiLCJ0cmFuc2xhdGUzZCIsIklPU1NsaWRlTmF2aWdhdG9yQW5pbWF0b3IiLCJfZ2V0VG9vbGJhckVsZW1lbnQiLCJfZ2V0VG9vbGJhckxlZnRJdGVtc0VsZW1lbnQiLCJfZ2V0VG9vbGJhclJpZ2h0SXRlbXNFbGVtZW50IiwiZXhjbHVkZUJhY2tCdXR0b24iLCJfZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCIsImJhY2tCdXR0b25JY29uIiwiX2dldFRvb2xiYXJCYWNrQnV0dG9uSWNvbkVsZW1lbnQiLCJfZ2V0VG9vbGJhckJhY2tCdXR0b25MYWJlbEVsZW1lbnQiLCJfZ2V0Q29udGVudEVsZW1lbnQiLCJfZ2V0QmFja2dyb3VuZEVsZW1lbnQiLCJfZ2V0Qm90dG9tVG9vbGJhckVsZW1lbnQiLCJ0b29sYmFycyIsImVudGVyVG9vbGJhciIsImxlYXZlVG9vbGJhciIsImlzU3RhdGljIiwiaXNNYXRlcmlhbCIsImlzVHJhbnNwYXJlbnQiLCJkZWNvbXBvc2l0aW9uIiwicGFnZVJlY3QiLCJsYWJlbFJlY3QiLCJlbnRlclBhZ2VUYXJnZXQiLCJsZWF2ZVBhZ2VUYXJnZXQiLCJlbnRlclBhZ2VEZWNvbXBvc2l0aW9uIiwibGVhdmVQYWdlRGVjb21wb3NpdGlvbiIsInBvcFN3aXBlIiwiSU9TTGlmdE5hdmlnYXRvckFuaW1hdG9yIiwiSU9TRmFkZU5hdmlnYXRvckFuaW1hdG9yIiwiTURTbGlkZU5hdmlnYXRvckFuaW1hdG9yIiwiYmxhY2tNYXNrT3BhY2l0eSIsIk1ETGlmdE5hdmlnYXRvckFuaW1hdG9yIiwibWFza0NsZWFyIiwiTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IiLCJ0aW1pbmdQb3AiLCJOb25lTmF2aWdhdG9yQW5pbWF0b3IiLCJyZXdyaXRhYmxlcyIsIm5hdmlnYXRvckVsZW1lbnQiLCJ2ZXJpZnlQYWdlRWxlbWVudCIsIk5hdmlnYXRvckVsZW1lbnQiLCJfaXNSdW5uaW5nIiwiX2luaXRpYWxpemVkIiwiX3BhZ2VMb2FkZXIiLCJfcGFnZU1hcCIsInBhZ2VMb2FkZXIiLCJfcGFnZSIsIl9vbkRldmljZUJhY2tCdXR0b24iLCJzd2lwZUFuaW1hdG9yIiwiX3N3aXBlIiwiX29uU3dpcGUiLCJzd2lwZVRvUG9wIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImFyZWEiLCJpc0JCIiwicHVzaGVkT3B0aW9ucyIsImFuaW1hdG9yRmFjdG9yeSIsImxvYWRlZCIsIl9nZXRQYWdlVGFyZ2V0IiwicHVzaFBhZ2UiLCJfdXBkYXRlTGFzdFBhZ2VCYWNrQnV0dG9uIiwidXBkYXRlIiwiX3ByZXBhcmVQYWdlQW5kT3B0aW9ucyIsInRpbWVzIiwiX3JlbW92ZVBhZ2VzIiwicG9wVXBkYXRlIiwidW5sb2FkIiwiX3BvcFBhZ2UiLCJfZW1pdFByZVBvcEV2ZW50IiwidXBkYXRlQmFja0J1dHRvbiIsInBvcCIsInBhZ2VIVE1MIiwiX3B1c2hQYWdlIiwibG9hZCIsIl9lbWl0UHJlUHVzaEV2ZW50IiwicGFnZUxlbmd0aCIsIl9yZXBsYWNlUGFnZSIsInJlc29sdmVkVmFsdWUiLCJfbm9ybWFsaXplSW5kZXgiLCJpbnNlcnRQYWdlIiwibmV3UGFnZSIsIl9sYXN0SW5kZXhPZlBhZ2UiLCJwYWdlTmFtZSIsImlzQ2FuY2VsZWQiLCJjdXJyZW50UGFnZSIsImNhbmNlbCIsIl9lbWl0UHJlRXZlbnQiLCJ0ZW1wbGF0ZUhUTUwiLCJsYXN0RWxlbWVudENoaWxkIiwiTmF2aWdhdG9yIiwiVG9vbGJhckVsZW1lbnQiLCJzaWJsaW5nQmFja2dyb3VuZCIsInNpYmxpbmdDb250ZW50Iiwic2V0VmlzaWJpbGl0eSIsIl9lbnN1cmVUb29sYmFySXRlbUVsZW1lbnRzIiwiX2Vuc3VyZVRvb2xiYXJFbGVtZW50IiwiVG9vbGJhciIsIlBhZ2VFbGVtZW50IiwiX2Rlcml2ZUhvb2tzIiwiX2JhY2tncm91bmRFbGVtZW50IiwiX2VsZW1lbnRTaG91bGRCZU1vdmVkIiwiX3RyeVRvRmlsbFN0YXR1c0JhciIsImZpeGVkRWxlbWVudHMiLCJvbkluaXQiLCJiYWNrQnV0dG9uIiwiX29uSW5maW5pdGVTY3JvbGwiLCJfYm91bmRPblNjcm9sbCIsIl9pbmZpbml0ZVNjcm9sbExpbWl0IiwiX29uU2Nyb2xsIiwib3ZlckxpbWl0Iiwic2Nyb2xsSGVpZ2h0IiwiX2xvYWRpbmdDb250ZW50Iiwib25JbmZpbml0ZVNjcm9sbCIsIm9uRGVzdHJveSIsImV2ZW50cyIsImVudW1lcmFibGUiLCJQYWdlIiwiUG9wb3ZlckFuaW1hdG9yIiwicG9wb3ZlciIsImFuaW1hdGlvbnMiLCJfYW5pbWF0ZSIsIm91dCIsImluIiwiTURGYWRlUG9wb3ZlckFuaW1hdG9yIiwiX2FuaW1hdGVBbGwiLCJfcG9wb3ZlciIsIklPU0ZhZGVQb3BvdmVyQW5pbWF0b3IiLCJwb3NpdGlvbnMiLCJ1cCIsImRvd24iLCJQb3BvdmVyRWxlbWVudCIsIl9jdXJyZW50VGFyZ2V0IiwiX3Bvc2l0aW9uUG9wb3ZlciIsIl9jbGVhclN0eWxlcyIsInJhZGl1cyIsIl9yYWRpdXMiLCJjb250ZW50RWxlbWVudCIsIl9jb250ZW50IiwibWFyZ2luIiwiX21hcmdpbiIsInRhcmdldFJlY3QiLCJpc01EIiwiY292ZXIiLCJwYXJlbnREaW1lbnNpb25zIiwibWF4UG9zaXRpb25zIiwidGFyZ2V0RGlzdGFuY2UiLCJ0YXJnZXRDZW50ZXJEaXN0YW5jZUZyb20iLCJfY2FsY3VsYXRlRGlyZWN0aW9ucyIsInByaW1hcnlEaXJlY3Rpb24iLCJwcmltYXJ5Iiwic2Vjb25kYXJ5RGlyZWN0aW9uIiwic2Vjb25kYXJ5IiwiX2N1cnJlbnREaXJlY3Rpb24iLCJzaXplTmFtZSIsImNvbnRlbnRTaXplIiwidGFyZ2V0QW5kQXJyb3dMZW5ndGgiLCJwcmltYXJ5T2Zmc2V0Iiwic2Vjb25kYXJ5T2Zmc2V0IiwiX2Fycm93IiwiaGFzRGVmYXVsdENvbnRhaW5lciIsImFycm93IiwiUG9wb3ZlciIsIklOREVUIiwiUHJvZ3Jlc3NCYXJFbGVtZW50IiwiX2lzQ29tcGlsZWQiLCJjbG9uZU5vZGUiLCJfcHJpbWFyeSIsIl9zZWNvbmRhcnkiLCJfdXBkYXRlRGV0ZXJtaW5hdGUiLCJfdXBkYXRlVmFsdWUiLCJiYXJFbGVtZW50IiwiUHJvZ3Jlc3NCYXIiLCJQcm9ncmVzc0NpcmN1bGFyRWxlbWVudCIsInBlciIsInN2ZyIsIlByb2dyZXNzQ2lyY3VsYXIiLCJTVEFURV9JTklUSUFMIiwiU1RBVEVfUFJFQUNUSU9OIiwiU1RBVEVfQUNUSU9OIiwidGhyb3dUeXBlIiwiUHVsbEhvb2tFbGVtZW50IiwiX29uRHJhZ0VuZCIsIl9zZXRTdGF0ZSIsIl9jb25uZWN0T25QdWxsIiwiX2Rpc2Nvbm5lY3RPblB1bGwiLCJsaW5lSGVpZ2h0IiwiX3BhZ2VFbGVtZW50IiwidGFwWSIsIm1heFkiLCJkcmFnZ2FibGVBcmVhUmF0aW8iLCJfc3RhcnRTY3JvbGwiLCJfY3VycmVudFRyYW5zbGF0aW9uIiwidGgiLCJ0aHJlc2hvbGRIZWlnaHQiLCJfZmluaXNoIiwiX3RyYW5zbGF0ZVRvIiwiX29uQWN0aW9uIiwib25BY3Rpb24iLCJub0V2ZW50IiwibGFzdFN0YXRlIiwicHVsbEhvb2siLCJtYXJnaW5Ub3AiLCJzY3JvbGxFbGVtZW50IiwiX2RyYWdMb2NrRGlzYWJsZWQiLCJzY3JvbGxUb2dnbGUiLCJnZFRvZ2dsZSIsIl9zZXRTdHlsZSIsIlB1bGxIb29rIiwiYWN0aXZlQ2xhc3NUb2tlbiIsIlJhbmdlRWxlbWVudCIsIl9vbk1vdXNlRG93biIsIl9vbk1vdXNlVXAiLCJfb25Ub3VjaFN0YXJ0IiwiX29uVG91Y2hFbmQiLCJfb25JbnB1dCIsIl9vbkRyYWdzdGFydCIsIl9vbkRyYWdlbmQiLCJfdXBkYXRlRGlzYWJsZWQiLCJmb2N1c1JpbmciLCJfZm9jdXNSaW5nIiwiYmFja2dyb3VuZFNpemUiLCJfcmF0aW8iLCJvYnNlcnZlZEF0dHJpYnV0ZXMiLCJSYW5nZSIsIlJvd0VsZW1lbnQiLCJSb3ciLCJTZWdtZW50RWxlbWVudCIsIl9zZWdtZW50SWQiLCJfdGFiYmFyIiwiX29uVGFiYmFyUHJlQ2hhbmdlIiwiZ2V0QWN0aXZlVGFiSW5kZXgiLCJnZXRBY3RpdmVCdXR0b25JbmRleCIsIl9zZXRDaGVja2VkIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJzZXRBY3RpdmVUYWIiLCJfcG9zdENoYW5nZSIsInNlZ21lbnRJdGVtIiwic2V0QWN0aXZlQnV0dG9uIiwiU2VnbWVudCIsIlNlbGVjdEVsZW1lbnQiLCJfZGVyaXZlR2V0dGVycyIsIl9zZWxlY3QiLCJzZWwiLCJvcHRpb24iLCJTZWxlY3QiLCJTcGVlZERpYWxJdGVtRWxlbWVudCIsIlNwZWVkRGlhbEl0ZW0iLCJTcGVlZERpYWxFbGVtZW50IiwiX3VwZGF0ZURpcmVjdGlvbiIsIl9pZ25vcmVPcGVuU2lkZUVmZmVjdCIsIl91cGRhdGVPcGVuIiwidG9nZ2xlSXRlbXMiLCJpbmxpbmUiLCJfZmFiIiwiaXRlbXMiLCJ0cmFuc2l0aW9uRGVsYXkiLCJfZ2V0VHJhbnNsYXRlIiwiaGlkZUl0ZW1zIiwidG90YWxEZWxheSIsInNob3dJdGVtcyIsIlNwZWVkRGlhbCIsIlNwbGl0dGVyQ29udGVudEVsZW1lbnQiLCJvbGRDb250ZW50IiwiU3BsaXR0ZXJDb250ZW50IiwiU3BsaXR0ZXJNYXNrRWxlbWVudCIsIl9zaWRlcyIsInNpZGUiLCJtb2RlIiwib25DbGljayIsImNsb3NlIiwiU3BsaXR0ZXJNYXNrIiwiU3BsaXR0ZXJBbmltYXRvciIsInNpZGVFbGVtZW50Iiwic3BsaXR0ZXIiLCJfc2lkZSIsIl9vcHBvc2l0ZVNpZGUiLCJjbGVhck1hc2siLCJpc09wZW4iLCJPdmVybGF5U3BsaXR0ZXJBbmltYXRvciIsIm1pbnVzIiwiUHVzaFNwbGl0dGVyQW5pbWF0b3IiLCJzbGlkaW5nRWxlbWVudHMiLCJfc2xpZGluZ0VsZW1lbnRzIiwiX2dldFNsaWRpbmdFbGVtZW50cyIsIlJldmVhbFNwbGl0dGVyQW5pbWF0b3IiLCJfc2V0U3R5bGVzIiwiX3Vuc2V0U3R5bGVzIiwiX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlIiwiYmVoaW5kRGlzdGFuY2UiLCJiZWhpbmRUcmFuc2Zvcm0iLCJfZ2V0TWF4V2lkdGgiLCJtZW51U3R5bGUiLCJvdmVybGF5IiwicmV2ZWFsIiwiU3BsaXR0ZXJFbGVtZW50IiwiX29uTW9kZUNoYW5nZSIsIl9sYXlvdXQiLCJfZ2V0U2lkZSIsIlNwbGl0dGVyIiwiU1BMSVRfTU9ERSIsIkNPTExBUFNFX01PREUiLCJDTE9TRURfU1RBVEUiLCJPUEVOX1NUQVRFIiwiQ0hBTkdJTkdfU1RBVEUiLCJzcGxpdHRlclNpZGVFbGVtZW50IiwiQ29sbGFwc2VEZXRlY3Rpb24iLCJjaGFuZ2VUYXJnZXQiLCJfdGFyZ2V0IiwiX29yaWVudGF0aW9uIiwiYWN0aXZhdGUiLCJfdXBkYXRlTW9kZSIsIl9tYXRjaCIsIl9xdWVyeVJlc3VsdCIsIm1hdGNoTWVkaWEiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiU3BsaXR0ZXJTaWRlRWxlbWVudCIsIl9zdGF0ZSIsIl9sb2NrIiwiX2NvbGxhcHNlRGV0ZWN0aW9uIiwiX2FuaW1hdGlvbk9wdCIsImNsb3NlZCIsInZhbGlkRHJhZyIsIl9tb2RlIiwiX2lzT3RoZXJTaWRlT3BlbiIsInRpaHMiLCJkZWFjdGl2YXRlIiwidXBkYXRlT3B0aW9ucyIsIkZJTkFMX1NUQVRFIiwiX2VtaXRFdmVudCIsIlNwbGl0dGVyU2lkZSIsImxvY2F0aW9ucyIsIm1hdGVyaWFsIiwiU3dpdGNoRWxlbWVudCIsIl9sYXN0VGltZVN0YW1wIiwiX2xvY2F0aW9ucyIsIl9zdGFydFgiLCJzd2l0Y2giLCJpc0ludGVyYWN0aXZlIiwiX2VtaXRDaGFuZ2VFdmVudCIsImRlZmF1bHRFbGVtZW50Q2xhc3MiLCJfaGFuZGxlIiwiX2dldFBvc2l0aW9uIiwicHJldmlvdXNWYWx1ZSIsImNsaWNrIiwiU3dpdGNoIiwidGFiYmFyRWxlbWVudCIsImxlcnAiLCJ4MCIsIngxIiwidCIsIlRhYmJhckVsZW1lbnQiLCJfbG9hZEluYWN0aXZlIiwiX2dldEF1dG9TY3JvbGxSYXRpbyIsIl90YWJiYXJCb3JkZXIiLCJfdGFiYmFyRWxlbWVudCIsIl91cGRhdGVWaXNpYmlsaXR5IiwiX3RhYnNSZWN0IiwidGFiSXRlbSIsInRhYnMiLCJfbm9ybWFsaXplRXZlbnQiLCJzZXRBY3RpdmUiLCJwcmV2VGFiIiwiX2F1dG9ncm93IiwidGFiIiwidGFiYmFyIiwiY3MiLCJmaWxsZWQiLCJfdGFyZ2V0RWxlbWVudCIsIm5leHRJbmRleCIsInByZXZpb3VzSW5kZXgiLCJfYWN0aXZlSW5kZXhTa2lwRWZmZWN0IiwiX3VwZGF0ZUFjdGl2ZUluZGV4IiwicHJldkluZGV4IiwibmV4dFRhYiIsImhpZGVUYWJzIiwiaXNBY3RpdmUiLCJpc1RvcCIsIlRhYmJhciIsIlRhYkVsZW1lbnQiLCJfYnV0dG9uIiwiX3VwZGF0ZUJ1dHRvbkNvbnRlbnQiLCJpY29uV3JhcHBlciIsImZpeCIsImFjdGl2ZSIsIl9oYXNMb2FkZWQiLCJfbG9hZGVkUGFnZSIsInBhZ2VUYXJnZXQiLCJwYXJlbnRUYXJnZXQiLCJkdW1teVBhZ2UiLCJfbG9hZFBhZ2VFbGVtZW50IiwiVGFiIiwiVG9hc3RBbmltYXRvciIsIkZhZGVUb2FzdEFuaW1hdG9yIiwiQXNjZW5kVG9hc3RBbmltYXRvciIsIm1lc3NhZ2VEZWxheSIsImFzY2Vuc2lvbiIsIl9nZXRGYWJzIiwiZmFiIiwiTGlmdFRvYXN0QW5pbWF0b3IiLCJGYWxsVG9hc3RBbmltYXRvciIsImZhbGxBbW91bnQiLCJjbGVhblVwIiwiY29ycmVjdFRvcCIsIlRvYXN0RWxlbWVudCIsIm1lc3NhZ2VDbGFzc05hbWUiLCJidXR0b25DbGFzc05hbWUiLCJUb2FzdCIsIlRvb2xiYXJCdXR0b25FbGVtZW50Iiwi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QUEsS0FBQSxFQVFBLFNBQVcsUUFBQSxHQUFBO0VBQ1QsTUFBQSxPQUFPLFNBQVMsQ0FBQ0MsSUFBSSxDQUFDQyxTQUFTLENBQUNDLFNBQVMsQ0FBQyxDQUFBO0VBQzVDLEtBQUE7O0VBRUE7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQVBFLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLFdBQUE7RUFBQSxJQUFBLEtBQUEsRUFRQSxTQUFZLFNBQUEsR0FBQTtFQUNWO0VBQ0E7RUFDQTtFQUNBO1FBQ0EsT0FBTyxJQUFJLENBQUNDLFFBQVEsRUFBRTtFQUVsQjtFQUNBbkIsTUFBQUEsTUFBTSxDQUFDb0IsTUFBTSxDQUFDQyxLQUFLLEtBQUssR0FBRyxJQUFJckIsTUFBTSxDQUFDb0IsTUFBTSxDQUFDRSxNQUFNLEtBQUssR0FBRztFQUFJO0VBQy9EdEIsTUFBQUEsTUFBTSxDQUFDb0IsTUFBTSxDQUFDQyxLQUFLLEtBQUssR0FBRyxJQUFJckIsTUFBTSxDQUFDb0IsTUFBTSxDQUFDRSxNQUFNLEtBQUssR0FBRztFQUFJOztFQUUvRDtFQUNBdEIsTUFBQUEsTUFBTSxDQUFDb0IsTUFBTSxDQUFDQyxLQUFLLEtBQUssR0FBRyxJQUFJckIsTUFBTSxDQUFDb0IsTUFBTSxDQUFDRSxNQUFNLEtBQUssR0FBRztFQUFJO0VBQy9EdEIsTUFBQUEsTUFBTSxDQUFDb0IsTUFBTSxDQUFDQyxLQUFLLEtBQUssR0FBRyxJQUFJckIsTUFBTSxDQUFDb0IsTUFBTSxDQUFDRSxNQUFNLEtBQUssR0FBRztFQUFJOztFQUUvRDtFQUNBdEIsTUFBQUEsTUFBTSxDQUFDb0IsTUFBTSxDQUFDQyxLQUFLLEtBQUssR0FBRyxJQUFJckIsTUFBTSxDQUFDb0IsTUFBTSxDQUFDRSxNQUFNLEtBQUssR0FBRztFQUFJO0VBQy9EdEIsTUFBQUEsTUFBTSxDQUFDb0IsTUFBTSxDQUFDQyxLQUFLLEtBQUssR0FBRyxJQUFJckIsTUFBTSxDQUFDb0IsTUFBTSxDQUFDRSxNQUFNLEtBQUssR0FBRztFQUFJOztF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QUFBLE1BQU0sRUFBRVIsbUJBQUFBO0VBQ1YsQ0FBQyxDQUFBOztFQUVEO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBMUNBLElBMkNxQm1DLGtCQUFrQixnQkFBQSxVQUFBLGtCQUFBLEVBQUE7RUFBQSxFQUFBLFNBQUEsQ0FBQSxrQkFBQSxFQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUFBLEVBQUEsSUFBQSxNQUFBLEdBQUEsWUFBQSxDQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUVyQztFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFD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Q0FBQTs7RUFFRDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQTFDQSxJQTJDcUJDLGtCQUFrQixnQkFBQSxVQUFBLGtCQUFBLEVBQUE7RUFBQSxFQUFBLFNBQUEsQ0FBQSxrQkFBQSxFQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUFBLEVBQUEsSUFBQSxNQUFBLEdBQUEsWUFBQSxDQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUVyQztFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0lBRUUsU0FBYyxrQkFBQSxHQUFB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QTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztJQUVFLFNBQWMsZUFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxlQUFBLENBQUEsQ0FBQTtFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQSxJQUFBLElBQUEscUJBQUEsR0FBc0M3akMsTUFBSSxDQUFDaVAsc0JBQXNCLENBQUEsc0JBQUEsQ0FBQSxLQUFBLENBQUEs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QUEsRUFBQSxJQUFBLE1BQUEsR0FBQSxZQUFBLENBQUEsYUFBQSxDQUFBLENBQUE7RUFFaEM7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztJQUVFLFNBQWMsYUFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxhQUFBLENBQUEsQ0FBQTtFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQTFiLElBQUFBLFlBQVksQ0FBTyxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxFQUFBLFlBQUE7UUFBQSxPQUFNLEtBQUEsQ0FBS3VOLFFBQVEsRUFBRSxDQUFBO09BQUMsQ0FBQSxDQUFBO0VBQUMsSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQUM1QyxHQUFBO0VBQUMsRUFBQSxZ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QUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQXZEQSxJQXdEcUJhLGVBQWUsZ0JBQUEsVUFBQSxZQUFBLEVBQUE7RUFBQSxFQUFBLFNBQUEsQ0FBQSxlQUFBLEVBQUEsWUFBQSxDQUFBLENBQUE7RUFBQSxFQUFBLElBQUEsTUFBQSxHQUFBLFlBQUEsQ0FBQSxlQUFBLENBQUEsQ0FBQTtFQUVsQztFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0lBRUUsU0FBYyxlQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBO0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGVBQUEsQ0FBQSxDQUFBO0VBQ1osSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTtFQUVB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Q0FBQTtFQUU3QixJQUFBLEtBQUEsQ0FBSzZoQyxzQkFBc0IsRUFBRSxDQUFBO0VBQUMsSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQUNoQyxHQUFBOztFQUVBO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBTkUsRUFBQSxZQUFBLENBQUEsZ0JBQUEsRUFBQSxDQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsaUJBQUE7RUFBQSxJQUFBLEdBQUE7RUF2S0E7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFD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LEVBQUEsZ0JBQWdCLEVBQUUsa0JBQWtCO0VBQ3BDLEVBQUEsbUJBQW1CLEVBQUUscUJBQUE7RUFDdkIsQ0FBQyxDQUFBOztFQUVEO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBNURBLElBNkRxQjgxQyxXQUFXLGdCQUFBLFVBQUEsWUFBQSxFQUFBO0VBQUEsRUFBQSxTQUFBLENBQUEsV0FBQSxFQUFBLFlBQUEsQ0FBQSxDQUFBO0VBQUEsRUFBQSxJQUFBLE1BQUEsR0FBQSxZQUFBLENBQUEsV0FBQSxDQUFBLENBQUE7RUFFOUI7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0lBRUUsU0FBYyxXQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxDQUFBO0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLFdBQUEsQ0FBQSxDQUFBO0VBQ1osSUFBQSxLQUFBLEdBQUEsTUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQTtFQUVBLElBQUEsS0FBQSxDQUFLQyxZQUFZ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QTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztJQUVFLFNBQWMsY0FBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxjQUFBLENBQUEsQ0FBQTtFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQSxJQUFBLEtBQUEsQ0FBSzNRLGNBQWMsR0FBRyxLQUFBLENBQUtqQyxTQUFTLENBQUMvOEIsSUFBSSxDQUFNLHNCQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtFQUUvQytkLElBQUFBLFlBQVksZ0NBQU8sWUFBTTtFQUN2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