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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QUFBLE1BQU0sRUFBRVIsbUJBQUFBO0VBQ1YsQ0FBQyxDQUFBOztFQUVEO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBMUNBLElBMkNxQm1DLGtCQUFrQixnQkFBQSxVQUFBLGtCQUFBLEVBQUE7RUFBQSxFQUFBLFNBQUEsQ0FBQSxrQkFBQSxFQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUFBLEVBQUEsSUFBQSxNQUFBLEdBQUEsWUFBQSxDQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUVyQztFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0lBRUUsU0FBYyxrQkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxrQkFBQSxDQUFBLENBQUE7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUF0TixJQUFBQSxZQUFZLENBQU8sc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxZQUFBO1FBQUEsT0FBTSxLQUFBLENBQUt1TixRQUFRLEVBQUUsQ0FBQTtPQUFDLENBQUEsQ0FBQTtFQUFDLElBQUEsT0FBQSxLQUFBLENBQUE7RUFDNUMsR0FBQTtFQUFDLEVBQUEsWUFBQSxDQUFBLGtCQUFBLEVBQUEsQ0FBQTtFQUFBLElBQUEsR0FBQSxFQUFBLFNBQUE7RUFBQSxJQUFBLEdBQUEsRUFFRCxTQUFjLEdBQUEsR0FBQTtFQUNaLE1BQUEsT0FBTzF6QixRQUFNLENBQUE7RUFDZixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsT0FBQTtFQUFBLElBQUEsR0FBQSxFQUVELFNBQVksR0FBQSxHQUFBO0VBQ1YsTUFBQSxPQUFPOUQsTUFBSSxDQUFDdUgsU0FBUyxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO0VBQ25ELEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxRQUFBO0VBQUEsSUFBQSxHQUFBLEVBRUQsU0FBYSxHQUFBLEdBQUE7RUFDWCxNQUFBLE9BQU92SCxNQUFJLENBQUN1SCxTQUFTLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFBO0VBQzlDLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxRQUFBO0VBQUEsSUFBQSxHQUFBLEVBRUQsU0FBYSxHQUFBLEdBQUE7RUFDWCxNQUFBLE9BQU8sSUFBSSxDQUFDL0ksYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUE7RUFDbEQsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLHdCQUFBO0VBQUEsSUFBQSxLQUFBLEVBRUQsU0FBeUIsc0JBQUEsR0FBQTtRQUN2QixPQUFPLElBQUl3VSxlQUFlLENBQUM7RUFDekJFLFFBQUFBLFNBQVMsRUFBRW9rQixlQUFhO0VBQ3hCbGtCLFFBQUFBLFNBQVMsRUFBRWdpQixtQkFBbUI7RUFDOUI5aEIsUUFBQUEsYUFBYSxFQUFFLHFCQUFxQjtFQUNwQ0UsUUFBQUEsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDelMsWUFBWSxDQUFDLFdBQVcsQ0FBQTtFQUNqRCxPQUFDLENBQUMsQ0FBQTtFQUNKLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxVQUFBO0VBQUEsSUFBQSxLQUFBLEVBRUQsU0FBVyxRQUFBLEdBQUE7RUFDVHdELE1BQUFBLFNBQVMsQ0FBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtFQUV2QixNQUFBLElBQUksQ0FBQ25DLEtBQUssQ0FBQzRWLE9BQU8sR0FBRyxNQUFNLENBQUE7RUFDM0IsTUFBQSxJQUFJLENBQUM1VixLQUFLLENBQUNvVyxNQUFNLEdBQUcsS0FBSyxDQUFBOztFQUV6QjtFQUNKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUksTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDa2YsTUFBTSxFQUFFO0VBQ2hCLFFBQUEsSUFBTStCLEtBQUssR0FBR3RtQyxRQUFRLENBQUMwTSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7RUFDM0M0NUIsUUFBQUEsS0FBSyxDQUFDajBCLFNBQVMsQ0FBQ0ksR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1VBRW5DLE9BQU8sSUFBSSxDQUFDK0ksVUFBVSxFQUFFO0VBQ3RCOHFCLFVBQUFBLEtBQUssQ0FBQ3o1QixXQUFXLENBQUMsSUFBSSxDQUFDMk8sVUFBVSxDQUFDLENBQUE7RUFDcEMsU0FBQTtFQUVBLFFBQUEsSUFBSSxDQUFDM08sV0FBVyxDQUFDeTVCLEtBQUssQ0FBQyxDQUFBO0VBQ3pCLE9BQUE7RUFFQSxNQUFBLElBQUksQ0FBQyxJQUFJLENBQUNDLE1BQU0sRUFBRTtFQUNoQixRQUFBLElBQU0vTCxLQUFLLEdBQUd4NkIsUUFBUSxDQUFDME0sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0VBQzNDOHRCLFFBQUFBLEtBQUssQ0FBQ25vQixTQUFTLENBQUNJLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1VBQ3pDLElBQUksSUFBSSxDQUFDK25CLEtBQUssRUFBRTtFQUNkQSxVQUFBQSxLQUFLLENBQUN6aUIsU0FBUyxHQUFHLElBQUksQ0FBQ3lpQixLQUFLLENBQUE7RUFDOUIsU0FBQyxNQUFNO1lBQ0xBLEtBQUssQ0FBQ2dNLE1BQU0sR0FBRyxJQUFJLENBQUE7RUFDckIsU0FBQTtFQUNBLFFBQUEsSUFBSSxDQUFDakMsTUFBTSxDQUFDaHBCLFlBQVksQ0FBQ2lmLEtBQUssRUFBRSxJQUFJLENBQUMrSixNQUFNLENBQUMvb0IsVUFBVSxDQUFDLENBQUE7RUFDekQsT0FBQTtFQUVBLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQzZvQixLQUFLLEVBQUU7RUFDZixRQUFBLElBQU1vQyxJQUFJLEdBQUd6bUMsUUFBUSxDQUFDME0sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0VBQzFDKzVCLFFBQUFBLElBQUksQ0FBQ3AwQixTQUFTLENBQUNJLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1VBQ3ZDLElBQUksQ0FBQzhJLFlBQVksQ0FBQ2tyQixJQUFJLEVBQUUsSUFBSSxDQUFDanJCLFVBQVUsQ0FBQyxDQUFBO0VBQzFDLE9BQUE7RUFFQSxNQUFBLElBQUksQ0FBQytvQixNQUFNLENBQUN0MUIsS0FBSyxDQUFDb1csTUFBTSxHQUFHLEtBQUssQ0FBQTtFQUNoQyxNQUFBLElBQUksQ0FBQ2dmLEtBQUssQ0FBQ3AxQixLQUFLLENBQUNvVyxNQUFNLEdBQUcsS0FBSyxDQUFBO1FBRS9CelQsWUFBWSxDQUFDODBCLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDVixPQUFPLENBQUMsQ0FBQTtFQUMvQyxLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsY0FBQTtFQUFBLElBQUEsS0FBQSxFQUVELFNBQWUsWUFBQSxHQUFBO1FBQ2IsSUFBSSxJQUFJLENBQUNPLE1BQU0sRUFBRTtFQUNmLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQy9MLEtBQUssRUFBRTtFQUNmLFVBQUEsSUFBSSxDQUFDK0wsTUFBTSxDQUFDQyxNQUFNLEdBQUcsSUFBSSxDQUFBO0VBQzNCLFNBQUMsTUFBTTtFQUNMLFVBQUEsSUFBSSxDQUFDRCxNQUFNLENBQUN4dUIsU0FBUyxHQUFHLElBQUksQ0FBQ3lpQixLQUFLLENBQUE7RUFDbEMsVUFBQSxJQUFJLENBQUMrTCxNQUFNLENBQUNDLE1BQU0sR0FBRyxLQUFLLENBQUE7RUFDNUIsU0FBQTtFQUNGLE9BQUE7RUFDRixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsT0FBQTtFQUFBLElBQUEsR0FBQSxFQUVELFNBQVksR0FBQSxHQUFBO0VBQ1YsTUFBQSxPQUFPLElBQUksQ0FBQzUyQixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7T0FDbEM7TUFBQSxHQUVELEVBQUEsU0FBQSxHQUFBLENBQVUrSyxLQUFLLEVBQUU7RUFDZixNQUFBLElBQUlBLEtBQUssS0FBSyxJQUFJLElBQUlBLEtBQUssS0FBS2xTLFNBQVMsRUFBRTtFQUN6QyxRQUFBLElBQUksQ0FBQ29ILGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtFQUMvQixPQUFDLE1BQU07RUFDTCxRQUFBLElBQUksQ0FBQ3BDLFlBQVksQ0FBQyxPQUFPLEVBQUVrTixLQUFLLENBQUMsQ0FBQTtFQUNuQyxPQUFBO0VBQ0YsS0FBQTs7RUFFQTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFORSxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSwwQkFBQTtFQUFBLElBQUEsS0FBQSxFQVlBLGtDQUF5QnBSLElBQUksRUFBRXNJLElBQUksRUFBRUMsT0FBTyxFQUFFO1FBQzVDLElBQUl2SSxJQUFJLEtBQUssT0FBTyxFQUFFO1VBQ3BCLElBQUksQ0FBQ285QixZQUFZLEVBQUUsQ0FBQTtFQUNyQixPQUFDLE1BQU07RUFDTCxRQUFBLElBQUEsQ0FBQSxlQUFBLENBQUEsa0JBQUEsQ0FBQSxTQUFBLENBQUEsRUFBQSwwQkFBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEVBQStCcDlCLElBQUksRUFBRXNJLElBQUksRUFBRUMsT0FBTyxDQUFBLENBQUE7RUFDcEQsT0FBQTtFQUNGLEtBQUE7O0VBRUE7RUFDRjtFQUNBO0VBQ0E7RUFIRSxHQUFBLENBQUEsRUFBQSxDQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsb0JBQUE7RUFBQSxJQUFBLEdBQUEsRUFaQSxTQUFnQyxHQUFBLEdBQUE7RUFDOUIsTUFBQSxPQUFBLEVBQUEsQ0FBQSxNQUFBLENBQUEsa0JBQUEsQ0FBQSxJQUFBLENBQUEsZUFBQSxDQUFBLGtCQUFBLENBQUEsRUFBQSxvQkFBQSxFQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBcUMsT0FBTyxDQUFBLENBQUEsQ0FBQTtFQUM5QyxLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsa0JBQUE7RUFBQSxJQUFBLEtBQUEsRUFjRCxTQUF3QnZJLGdCQUFBQSxDQUFBQSxJQUFJLEVBQUVvWixRQUFRLEVBQUU7RUFDdEMsTUFBQSxJQUFJLEVBQUVBLFFBQVEsQ0FBQ3hnQixTQUFTLFlBQVk4aEMsbUJBQW1CLENBQUMsRUFBRTtFQUN4RHAxQixRQUFBQSxNQUFJLENBQUM4TixhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7RUFDbkMsT0FBQTtFQUNBd3BCLE1BQUFBLGVBQWEsQ0FBQzU4QixJQUFJLENBQUMsR0FBR29aLFFBQVEsQ0FBQTtFQUNoQyxLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsV0FBQTtFQUFBLElBQUEsR0FBQSxFQUVELFNBQXVCLEdBQUEsR0FBQTtFQUNyQixNQUFBLE9BQU93akIsZUFBYSxDQUFBO0VBQ3RCLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxxQkFBQTtFQUFBLElBQUEsR0FBQSxFQUVELFNBQWlDLEdBQUEsR0FBQTtFQUMvQixNQUFBLE9BQU9sQyxtQkFBbUIsQ0FBQTtFQUM1QixLQUFBO0VBQUMsR0FBQSxDQUFBLENBQUEsQ0FBQTtFQUFBLEVBQUEsT0FBQSxrQkFBQSxDQUFBO0VBQUEsQ0FBQSxDQXJXNkNXLGlCQUFpQixDQUFBLENBQUE7RUF3V2pFcG5CLFdBQVcsQ0FBQ29wQixXQUFXLEdBQUdSLGtCQUFrQixDQUFBO0VBQzVDcmpDLGNBQWMsQ0FBQ21nQyxNQUFNLENBQUMsa0JBQWtCLEVBQUVrRCxrQkFBa0IsQ0FBQzs7RUN2YTdEO0VBQ0E7RUFDQTtFQUZBLElBR01TLFdBQVcsZ0JBQUEsWUFBQTtJQThIZixTQUFjLFdBQUEsR0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxXQUFBLENBQUEsQ0FBQTtNQUNaLElBQUksQ0FBQ0MsTUFBTSxHQUFHLEVBQUUsQ0FBQTtNQUNoQixJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLENBQUE7RUFDakIsR0FBQTtFQUFDLEVBQUEsWUFBQSxDQUFBLFdBQUEsRUFBQSxDQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsU0FBQTtFQUFBLElBQUEsS0FBQTtFQS9IRDtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtNQUNFLFNBQVFyeEIsT0FBQUEsQ0FBQUEsRUFBRSxFQUFFc3hCLEtBQUssRUFBa0I7UUFBQSxJQUFoQmxrQixRQUFRLHVFQUFHLEdBQUcsQ0FBQTtFQUMvQixNQUFBLElBQUlzTSxLQUFLLEdBQUksSUFBSTRDLElBQUksRUFBRSxDQUFFaVYsT0FBTyxFQUFFO1VBQzlCQyxPQUFPLEdBQUcsRUFBRTtFQUNaalUsUUFBQUEsT0FBTyxHQUFHLEtBQUs7RUFDZmtVLFFBQUFBLElBQUksR0FBRyxLQUFLO0VBQ1ozYyxRQUFBQSxPQUFPLEdBQUcsS0FBSztFQUNmNlksUUFBQUEsVUFBVSxHQUFHbmhDLE1BQU0sQ0FBQ2dOLElBQUksQ0FBQzgzQixLQUFLLENBQUMsQ0FBQTtFQUVuQyxNQUFBLElBQUlJLFlBQVksR0FBRyxTQUFmQSxZQUFZLEdBQVM7RUFDdkIsUUFBQSxJQUFJMzNCLENBQUMsR0FBR25RLE1BQU0sQ0FBQ29QLGdCQUFnQixDQUFDZ0gsRUFBRSxDQUFDLENBQUE7VUFDbkMydEIsVUFBVSxDQUFDbi9CLE9BQU8sQ0FBQ3VMLENBQUMsQ0FBQytLLGdCQUFnQixDQUFDTyxJQUFJLENBQUN0TCxDQUFDLENBQUMsQ0FBQyxDQUFBO1VBQzlDQSxDQUFDLEdBQUdpRyxFQUFFLENBQUNxUyxZQUFZLENBQUE7U0FDcEIsQ0FBQTtFQUVELE1BQUEsSUFBSWhvQixNQUFNLEdBQUc7RUFDWHNuQyxRQUFBQSxJQUFJLEVBQUUsU0FBa0IsSUFBQSxHQUFBO1lBQUEsSUFBakJuaEMsT0FBTyxHQUFHLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFBLEVBQUUsQ0FBQTtFQUNqQnNrQixVQUFBQSxPQUFPLElBQUlSLFlBQVksQ0FBQ1EsT0FBTyxDQUFDLENBQUE7RUFDaEMsVUFBQSxJQUFJaFksQ0FBQyxHQUFHNU8sSUFBSSxDQUFDc3FCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxJQUFJOEQsSUFBSSxFQUFFLENBQUVpVixPQUFPLEVBQUUsR0FBRzdYLEtBQUssSUFBSXRNLFFBQVEsQ0FBQyxDQUFBO0VBQ2hFdWdCLFVBQUFBLFVBQVUsQ0FBQ24vQixPQUFPLENBQUMsVUFBQStDLENBQUMsRUFBSTtFQUN0QnlPLFlBQUFBLEVBQUUsQ0FBQ3pHLEtBQUssQ0FBQ2hJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHdUwsQ0FBQyxJQUFJMDBCLE9BQU8sQ0FBQ2pnQyxDQUFDLENBQUMsR0FBR3VMLENBQUMsR0FBR3cwQixLQUFLLENBQUMvL0IsQ0FBQyxDQUFDLElBQUlBLENBQUMsSUFBSSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0VBQ2xGLFdBQUMsQ0FBQyxDQUFBO0VBQ0Z5TyxVQUFBQSxFQUFFLENBQUN6RyxLQUFLLENBQUNxNEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1lBRWxDLElBQUlwaEMsT0FBTyxDQUFDcWhDLFFBQVEsRUFBRTtFQUNwQkosWUFBQUEsSUFBSSxHQUFHLEtBQUssQ0FBQTtFQUNkLFdBQUMsTUFBTSxJQUFJLENBQUNsVSxPQUFPLEVBQUU7RUFDbkJBLFlBQUFBLE9BQU8sR0FBRyxJQUFJLENBQUE7Y0FDZGtVLElBQUksSUFBSUEsSUFBSSxFQUFFLENBQUE7RUFDaEIsV0FBQTtFQUNBLFVBQUEsT0FBT3BuQyxNQUFNLENBQUE7V0FDZDtVQUNEazVCLElBQUksRUFBRSxTQUFDZ0QsSUFBQUEsQ0FBQUEsRUFBRSxFQUFLO0VBQ1prTCxVQUFBQSxJQUFJLEdBQUdsTCxFQUFFLENBQUE7RUFDVCxVQUFBLElBQUloSixPQUFPLEVBQUU7Y0FDWGtVLElBQUksSUFBSUEsSUFBSSxFQUFFLENBQUE7RUFDaEIsV0FBQTtFQUNBLFVBQUEsT0FBT3BuQyxNQUFNLENBQUE7V0FDZDtVQUNEeW5DLEtBQUssRUFBRSxTQUFDQyxLQUFBQSxDQUFBQSxXQUFXLEVBQUs7RUFDdEIsVUFBQSxJQUFJdHJCLFVBQVEsQ0FBQ0MsTUFBTSxDQUFDd0Qsa0JBQWtCLEVBQUU7RUFDdEM2bkIsWUFBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQTtFQUNqQixXQUFBO1lBQ0EsSUFBSSxDQUFDeFUsT0FBTyxFQUFFO0VBQ1p6SSxZQUFBQSxPQUFPLElBQUlSLFlBQVksQ0FBQ1EsT0FBTyxDQUFDLENBQUE7Y0FFaEMsSUFBTWtkLE1BQU0sR0FBSSxJQUFJMVYsSUFBSSxFQUFFLENBQUVpVixPQUFPLEVBQUUsR0FBRzdYLEtBQUssQ0FBQTtFQUM3QyxZQUFBLElBQU81YyxDQUFDLEdBQUdrMUIsTUFBTSxHQUFHNWtCLFFBQVEsQ0FBQTtFQUM1QixZQUFBLElBQU02a0IsU0FBUyxHQUFHRixXQUFXLElBQUksQ0FBQyxHQUFHajFCLENBQUMsQ0FBQyxDQUFBO0VBRXZDNndCLFlBQUFBLFVBQVUsQ0FBQ24vQixPQUFPLENBQUMsVUFBQStDLENBQUMsRUFBSTtFQUN0QnlPLGNBQUFBLEVBQUUsQ0FBQ3pHLEtBQUssQ0FBQ2hJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHdUwsQ0FBQyxJQUFJMDBCLE9BQU8sQ0FBQ2pnQyxDQUFDLENBQUMsR0FBR3VMLENBQUMsR0FBR3cwQixLQUFLLENBQUMvL0IsQ0FBQyxDQUFDLElBQUlBLENBQUMsSUFBSSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0VBQ2xGLGFBQUMsQ0FBQyxDQUFBO0VBRUZtZ0MsWUFBQUEsWUFBWSxFQUFFLENBQUE7Y0FFZGhZLEtBQUssR0FBRzFaLEVBQUUsQ0FBQ2t5QixXQUFXLENBQUE7RUFDdEI5a0IsWUFBQUEsUUFBUSxHQUFHNmtCLFNBQVMsQ0FBQTtjQUVwQmp5QixFQUFFLENBQUN6RyxLQUFLLENBQUNxNEIsa0JBQWtCLEdBQUd4a0IsUUFBUSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUE7RUFFbkR1Z0IsWUFBQUEsVUFBVSxDQUFDbi9CLE9BQU8sQ0FBQyxVQUFBK0MsQ0FBQyxFQUFJO0VBQ3RCeU8sY0FBQUEsRUFBRSxDQUFDekcsS0FBSyxDQUFDaEksQ0FBQyxDQUFDLEdBQUcrL0IsS0FBSyxDQUFDLy9CLENBQUMsQ0FBQyxJQUFJQSxDQUFDLElBQUksU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtFQUN2RCxhQUFDLENBQUMsQ0FBQTtjQUVGdWpCLE9BQU8sR0FBR2huQixVQUFVLENBQUN6RCxNQUFNLENBQUNzbkMsSUFBSSxFQUFFTSxTQUFTLENBQUMsQ0FBQTtFQUM5QyxXQUFBO0VBQ0EsVUFBQSxPQUFPNW5DLE1BQU0sQ0FBQTtXQUNkO0VBQ0Q2N0IsUUFBQUEsTUFBTSxFQUFFLFNBQXVCLE1BQUEsR0FBQTtZQUFBLElBQXRCaU0sWUFBWSx1RUFBRyxFQUFFLENBQUE7RUFDeEIsVUFBQSxJQUFJcjFCLENBQUMsR0FBRyxDQUFFLElBQUl3ZixJQUFJLEVBQUUsQ0FBRWlWLE9BQU8sRUFBRSxHQUFHN1gsS0FBSyxJQUFJdE0sUUFBUSxDQUFBO1lBRW5EL2lCLE1BQU0sQ0FBQ3luQyxLQUFLLENBQUNLLFlBQVksSUFBSSxDQUFDLEdBQUdyMUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtFQUNwQyxVQUFBLE9BQU96UyxNQUFNLENBQUE7RUFDZixTQUFBO1NBQ0QsQ0FBQTtFQUVELE1BQUEsSUFBSTJWLEVBQUUsQ0FBQ2xJLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSXlsQixPQUFPLElBQUk5VyxVQUFRLENBQUNDLE1BQU0sQ0FBQ3dELGtCQUFrQixFQUFFO0VBQ2hGLFFBQUEsT0FBTzdmLE1BQU0sQ0FBQTtFQUNmLE9BQUE7RUFFQSxNQUFBLElBQUlrUCxLQUFLLEdBQUczUCxNQUFNLENBQUNvUCxnQkFBZ0IsQ0FBQ2dILEVBQUUsQ0FBQyxDQUFBO0VBQ3ZDMnRCLE1BQUFBLFVBQVUsQ0FBQ24vQixPQUFPLENBQUMsVUFBQUgsQ0FBQyxFQUFJO1VBQ3RCLElBQU0rakMsQ0FBQyxHQUFHQyxVQUFVLENBQUM5NEIsS0FBSyxDQUFDdUwsZ0JBQWdCLENBQUN6VyxDQUFDLENBQUMsQ0FBQyxDQUFBO1VBQy9DbWpDLE9BQU8sQ0FBQ25qQyxDQUFDLENBQUMsR0FBR3FRLEtBQUssQ0FBQzB6QixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUdBLENBQUMsQ0FBQTtFQUMvQixPQUFDLENBQUMsQ0FBQTtRQUdGLElBQUksQ0FBQzdVLE9BQU8sRUFBRTtVQUNadmQsRUFBRSxDQUFDekcsS0FBSyxDQUFDKzRCLGtCQUFrQixHQUFHM0UsVUFBVSxDQUFDMTBCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtVQUNsRCtHLEVBQUUsQ0FBQ3pHLEtBQUssQ0FBQ3E0QixrQkFBa0IsR0FBR3hrQixRQUFRLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQTtFQUVuRHVnQixRQUFBQSxVQUFVLENBQUNuL0IsT0FBTyxDQUFDLFVBQUFILENBQUMsRUFBSTtFQUN0QjJSLFVBQUFBLEVBQUUsQ0FBQ3pHLEtBQUssQ0FBQ2xMLENBQUMsQ0FBQyxHQUFHaWpDLEtBQUssQ0FBQ2pqQyxDQUFDLENBQUMsSUFBSUEsQ0FBQyxJQUFJLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7RUFDdkQsU0FBQyxDQUFDLENBQUE7RUFDSixPQUFBO1FBRUF5bUIsT0FBTyxHQUFHaG5CLFVBQVUsQ0FBQ3pELE1BQU0sQ0FBQ3NuQyxJQUFJLEVBQUV2a0IsUUFBUSxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDbWxCLGlCQUFpQixDQUFDdnlCLEVBQUUsRUFBRTNWLE1BQU0sQ0FBQ3NuQyxJQUFJLENBQUMsQ0FBQTtFQUV2QyxNQUFBLE9BQU90bkMsTUFBTSxDQUFBO0VBQ2YsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLG1CQUFBO0VBQUEsSUFBQSxLQUFBLEVBT0QsU0FBa0IyVixpQkFBQUEsQ0FBQUEsRUFBRSxFQUFFOHFCLFFBQVEsRUFBRTtFQUM5QixNQUFBLElBQUl2OEIsS0FBSyxHQUFHLElBQUksQ0FBQzZpQyxNQUFNLENBQUE7RUFDdkIsTUFBQSxJQUFJNy9CLENBQUMsR0FBRyxJQUFJLENBQUM4L0IsTUFBTSxFQUFFLENBQUE7UUFDckI5aUMsS0FBSyxDQUFDeVIsRUFBRSxDQUFDLEdBQUd6UixLQUFLLENBQUN5UixFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDM0J6UixLQUFLLENBQUN5UixFQUFFLENBQUMsQ0FBQ3pPLENBQUMsQ0FBQyxHQUFHLFVBQUNmLE9BQU8sRUFBSztFQUMxQixRQUFBLE9BQU9qQyxLQUFLLENBQUN5UixFQUFFLENBQUMsQ0FBQ3pPLENBQUMsQ0FBQyxDQUFBO0VBQ25CLFFBQUEsSUFBSWhELEtBQUssQ0FBQ3lSLEVBQUUsQ0FBQyxJQUFJelIsS0FBSyxDQUFDeVIsRUFBRSxDQUFDLENBQUNwUSxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3RDLE9BQU9yQixLQUFLLENBQUN5UixFQUFFLENBQUMsQ0FBQTtFQUNsQixTQUFBO1VBQ0EsT0FBTzhxQixRQUFRLENBQUN0NkIsT0FBTyxDQUFDLENBQUE7U0FDekIsQ0FBQTtFQUNILEtBQUE7O0VBRUE7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFORSxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxnQkFBQTtNQUFBLEtBT0EsRUFBQSxTQUFBLGNBQUEsQ0FBZXdQLEVBQUUsRUFBZ0I7RUFBQSxNQUFBLElBQUEsS0FBQSxHQUFBLElBQUEsQ0FBQTtRQUFBLElBQWR4UCxPQUFPLEdBQUcsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsRUFBRSxDQUFBO0VBQzdCLE1BQUEsSUFBSWtJLEtBQUssQ0FBQ29yQixPQUFPLENBQUM5akIsRUFBRSxDQUFDLEVBQUU7RUFDckIsUUFBQSxPQUFPQSxFQUFFLENBQUN4UixPQUFPLENBQUMsVUFBQXdSLEVBQUUsRUFBSTtFQUN0QixVQUFBLEtBQUksQ0FBQ3d5QixjQUFjLENBQUN4eUIsRUFBRSxFQUFFeFAsT0FBTyxDQUFDLENBQUE7RUFDbEMsU0FBQyxDQUFDLENBQUE7RUFDSixPQUFBO0VBRUEsTUFBQSxDQUFDLElBQUksQ0FBQzRnQyxNQUFNLENBQUNweEIsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFeFIsT0FBTyxDQUFDLFVBQUFILENBQUMsRUFBSTtFQUFFQSxRQUFBQSxDQUFDLENBQUNtQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7RUFBRSxPQUFDLENBQUMsQ0FBQTtFQUM3RCxLQUFBOztFQUVBO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUxFLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLFNBQUE7RUFBQSxJQUFBLEtBQUEsRUFNQSxTQUFzQixPQUFBLEdBQUE7UUFBQSxJQUFkQSxPQUFPLEdBQUcsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUEsRUFBRSxDQUFBO0VBQ2xCLE1BQUEsSUFBSSxDQUFDZ2lDLGNBQWMsQ0FBQ2htQyxNQUFNLENBQUNnTixJQUFJLENBQUMsSUFBSSxDQUFDNDNCLE1BQU0sQ0FBQyxFQUFFNWdDLE9BQU8sQ0FBQyxDQUFBO0VBQ3hELEtBQUE7O0VBRUE7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBTEUsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsTUFBQTtNQUFBLEtBTUEsRUFBQSxTQUFBLElBQUEsQ0FBS3dQLEVBQUUsRUFBa0I7UUFBQSxJQUFoQm9OLFFBQVEsdUVBQUcsR0FBRyxDQUFBO0VBQ3JCLE1BQUEsT0FBTyxJQUFJLENBQUNxbEIsT0FBTyxDQUFDenlCLEVBQUUsRUFBRTtFQUFDNHVCLFFBQUFBLE9BQU8sRUFBRSxDQUFBO1NBQUUsRUFBRXhoQixRQUFRLENBQUMsQ0FBQTtFQUNqRCxLQUFBO0VBQUMsR0FBQSxDQUFBLENBQUEsQ0FBQTtFQUFBLEVBQUEsT0FBQSxXQUFBLENBQUE7RUFBQSxDQUFBLEVBQUE7O0VDaExILElBQU1zbEIsa0JBQWdCLEdBQUcsUUFBUSxDQUFBO0VBQ2pDLElBQU16MUIsUUFBTSxHQUFHO0VBQ2IsRUFBQSxFQUFFLEVBQUUsV0FBVztFQUNmLEVBQUEsZUFBZSxFQUFFLGlCQUFpQjtFQUNsQyxFQUFBLHFCQUFxQixFQUFFLHVCQUFBO0VBQ3pCLENBQUMsQ0FBQTs7RUFFRDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBekJBLElBMEJxQjAxQixhQUFhLGdCQUFBLFVBQUEsWUFBQSxFQUFBO0VBQUEsRUFBQSxTQUFBLENBQUEsYUFBQSxFQUFBLFlBQUEsQ0FBQSxDQUFBO0VBQUEsRUFBQSxJQUFBLE1BQUEsR0FBQSxZQUFBLENBQUEsYUFBQSxDQUFBLENBQUE7RUFFaEM7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztJQUVFLFNBQWMsYUFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxhQUFBLENBQUEsQ0FBQTtFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQSxJQUFBLEtBQUEsQ0FBS0MsTUFBTSxHQUFHLEtBQUEsQ0FBS0EsTUFBTSxDQUFDdnRCLElBQUksQ0FBTSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFDcEMsSUFBQSxLQUFBLENBQUt3dEIsT0FBTyxHQUFHLEtBQUEsQ0FBS0EsT0FBTyxDQUFDeHRCLElBQUksQ0FBTSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFDdEMsSUFBQSxLQUFBLENBQUt5dEIsWUFBWSxHQUFHLEtBQUEsQ0FBS0EsWUFBWSxDQUFDenRCLElBQUksQ0FBTSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFDaEQsSUFBQSxLQUFBLENBQUswdEIsVUFBVSxHQUFHLEtBQUEsQ0FBS0EsVUFBVSxDQUFDMXRCLElBQUksQ0FBTSxzQkFBQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUE7RUFFNUMrZCxJQUFBQSxZQUFZLENBQU8sc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxZQUFBO1FBQUEsT0FBTSxLQUFBLENBQUt1TixRQUFRLEVBQUUsQ0FBQTtPQUFDLENBQUEsQ0FBQTtFQUV6QyxJQUFBLEtBQUEsQ0FBS3FDLFNBQVMsR0FBRyxJQUFJL2xCLFdBQVEsRUFBRSxDQUFBO0VBRS9CLElBQUEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUN6ZSxPQUFPLENBQUMsVUFBQUgsQ0FBQyxFQUFJO1FBQ3pFLEtBQUs0a0MsQ0FBQUEsd0JBQXdCLENBQUM1a0MsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFBLENBQUs2TCxZQUFZLENBQUM3TCxDQUFDLENBQUMsQ0FBQyxDQUFBO0VBQzlELEtBQUMsQ0FBQyxDQUFBO0VBQUMsSUFBQSxPQUFBLEtBQUEsQ0FBQTtFQUNMLEdBQUE7RUFBQyxFQUFBLFlBQUEsQ0FBQSxhQUFBLEVBQUEsQ0FBQTtFQUFBLElBQUEsR0FBQSxFQUFBLFVBQUE7RUFBQSxJQUFBLEtBQUEsRUFFRCxTQUFXLFFBQUEsR0FBQTtFQUNULE1BQUEsSUFBSSxDQUFDc08sU0FBUyxDQUFDSSxHQUFHLENBQUMyMUIsa0JBQWdCLENBQUMsQ0FBQTtRQUVwQyxJQUFJLENBQUNRLEtBQUssR0FBRyxJQUFJLENBQUNDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNELElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUksQ0FBQ0Qsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUV2RSxJQUFJLEVBQUUsSUFBSSxDQUFDQyxXQUFXLElBQUksSUFBSSxDQUFDRixLQUFLLENBQUMsRUFBRTtVQUNyQyxJQUFJLENBQUNBLEtBQUssR0FBRy81QixNQUFJLENBQUM4SSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7VUFDekMsSUFBSSxDQUFDbXhCLFdBQVcsR0FBR2o2QixNQUFJLENBQUM4SSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQTtFQUVyRCxRQUFBLElBQUksQ0FBQzlLLFdBQVcsQ0FBQyxJQUFJLENBQUMrN0IsS0FBSyxDQUFDLENBQUE7RUFDNUIsUUFBQSxJQUFJLENBQUMvN0IsV0FBVyxDQUFDLElBQUksQ0FBQ2k4QixXQUFXLENBQUMsQ0FBQTtFQUNwQyxPQUFBO0VBRUFsM0IsTUFBQUEsWUFBWSxDQUFDODBCLFlBQVksQ0FBQyxJQUFJLEVBQUUvekIsUUFBTSxDQUFDLENBQUE7RUFDekMsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLGdCQUFBO0VBQUEsSUFBQSxLQUFBLEVBRUQsU0FBaUIsY0FBQSxHQUFBO0VBQ2YsTUFBQSxJQUFNbzJCLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtFQUNsQyxNQUFBLElBQUksSUFBSSxDQUFDdjdCLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtFQUM3QixRQUFBLElBQU13N0IsSUFBSSxHQUFHLElBQUksQ0FBQ3A1QixZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7VUFDdEMsSUFBSW01QixLQUFLLENBQUNybkMsT0FBTyxDQUFDc25DLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0VBQzlCLFVBQUEsT0FBT0EsSUFBSSxDQUFBO0VBQ2IsU0FBQTtFQUNGLE9BQUE7RUFFQSxNQUFBLE9BQU8sT0FBTyxDQUFBO0VBQ2hCLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxrQkFBQTtNQUFBLEtBRUQsRUFBQSxTQUFBLGdCQUFBLENBQWlCamxDLENBQUMsRUFBRTtRQUNsQixJQUFJeXFCLENBQUMsRUFBRUUsQ0FBQyxFQUFFOE8sQ0FBQyxFQUFFRCxDQUFDLEVBQUUvdEIsQ0FBQyxDQUFBO0VBQ2pCLE1BQUEsSUFBTXFsQixDQUFDLEdBQUcsSUFBSSxDQUFDb1UscUJBQXFCLEVBQUUsQ0FBQTtFQUN0QyxNQUFBLElBQU1ELElBQUksR0FBRyxJQUFJLENBQUNFLGNBQWMsRUFBRSxDQUFBO1FBQ2xDLElBQU1sMUIsS0FBSyxHQUFHLFNBQVJBLEtBQUssR0FBQTtFQUFBLFFBQUEsT0FBU25GLE1BQUksQ0FBQ21KLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0VBQUEsT0FBQSxDQUFBO1FBRXRELElBQUksSUFBSSxDQUFDbXhCLE9BQU8sRUFBRTtFQUNoQjNhLFFBQUFBLENBQUMsR0FBR3FHLENBQUMsQ0FBQ2wwQixLQUFLLEdBQUcsQ0FBQyxDQUFBO0VBQ2YrdEIsUUFBQUEsQ0FBQyxHQUFHbUcsQ0FBQyxDQUFDajBCLE1BQU0sR0FBRyxDQUFDLENBQUE7VUFFaEIsSUFBSW9vQyxJQUFJLEtBQUssT0FBTyxFQUFFO0VBQ3BCeDVCLFVBQUFBLENBQUMsR0FBRzVMLElBQUksQ0FBQ3NyQixJQUFJLENBQUNWLENBQUMsR0FBR0EsQ0FBQyxHQUFHRSxDQUFDLEdBQUdBLENBQUMsQ0FBQyxDQUFBO0VBQzlCLFNBQUMsTUFBTSxJQUFJc2EsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUM3Qng1QixDQUFDLEdBQUc1TCxJQUFJLENBQUNzcUIsR0FBRyxDQUFDTSxDQUFDLEVBQUVFLENBQUMsQ0FBQyxDQUFBO0VBQ3BCLFNBQUMsTUFBTTtFQUNMMWEsVUFBQUEsS0FBSyxFQUFFLENBQUE7RUFDVCxTQUFBO0VBQ0YsT0FBQyxNQUFNO1VBQ0x3YSxDQUFDLEdBQUcsQ0FBQyxPQUFPenFCLENBQUMsQ0FBQ2lxQixPQUFPLEtBQUssUUFBUSxHQUFHanFCLENBQUMsQ0FBQ2lxQixPQUFPLEdBQUdqcUIsQ0FBQyxDQUFDeXRCLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQ3hELE9BQU8sSUFBSTZHLENBQUMsQ0FBQzNQLElBQUksQ0FBQTtVQUN0RndKLENBQUMsR0FBRyxDQUFDLE9BQU8zcUIsQ0FBQyxDQUFDa3FCLE9BQU8sS0FBSyxRQUFRLEdBQUdscUIsQ0FBQyxDQUFDa3FCLE9BQU8sR0FBR2xxQixDQUFDLENBQUN5dEIsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDdkQsT0FBTyxJQUFJNEcsQ0FBQyxDQUFDZ1AsR0FBRyxDQUFBO0VBQ3JGckcsUUFBQUEsQ0FBQyxHQUFHNTVCLElBQUksQ0FBQ3VxQixHQUFHLENBQUNPLENBQUMsRUFBRW1HLENBQUMsQ0FBQ2owQixNQUFNLEdBQUc4dEIsQ0FBQyxDQUFDLENBQUE7RUFDN0I2TyxRQUFBQSxDQUFDLEdBQUczNUIsSUFBSSxDQUFDdXFCLEdBQUcsQ0FBQ0ssQ0FBQyxFQUFFcUcsQ0FBQyxDQUFDbDBCLEtBQUssR0FBRzZ0QixDQUFDLENBQUMsQ0FBQTtVQUU1QixJQUFJd2EsSUFBSSxLQUFLLE9BQU8sRUFBRTtFQUNwQng1QixVQUFBQSxDQUFDLEdBQUc1TCxJQUFJLENBQUNzckIsSUFBSSxDQUFDc08sQ0FBQyxHQUFHQSxDQUFDLEdBQUdELENBQUMsR0FBR0EsQ0FBQyxDQUFDLENBQUE7RUFDOUIsU0FBQyxNQUFNLElBQUl5TCxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzdCeDVCLENBQUMsR0FBRzVMLElBQUksQ0FBQ3NxQixHQUFHLENBQUN0cUIsSUFBSSxDQUFDd2xDLEtBQUssQ0FBQzVMLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTU1QixJQUFJLENBQUN3bEMsS0FBSyxDQUFDN0wsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7RUFDcEQsU0FBQyxNQUFNO0VBQ0x2cEIsVUFBQUEsS0FBSyxFQUFFLENBQUE7RUFDVCxTQUFBO0VBQ0YsT0FBQTtRQUVBLE9BQU87RUFBQ3dhLFFBQUFBLENBQUMsRUFBREEsQ0FBQztFQUFFRSxRQUFBQSxDQUFDLEVBQURBLENBQUM7RUFBRWxmLFFBQUFBLENBQUMsRUFBREEsQ0FBQUE7U0FBRSxDQUFBO0VBQ2xCLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxrQkFBQTtNQUFBLEtBRUQsRUFBQSxTQUFBLGdCQUFBLENBQWlCekwsQ0FBQyxFQUFrQjtRQUFBLElBQWhCK2UsUUFBUSx1RUFBRyxHQUFHLENBQUE7RUFDaEMsTUFBQSxJQUFPNGxCLFNBQVMsR0FBK0IsSUFBSSxDQUE1Q0EsU0FBUztVQUFFRSxLQUFLLEdBQXdCLElBQUksQ0FBakNBLEtBQUs7VUFBRUUsV0FBVyxHQUFXLElBQUksQ0FBMUJBLFdBQVc7VUFBRU8sS0FBSyxHQUFJLElBQUksQ0FBYkEsS0FBSyxDQUFBO0VBQzNDLE1BQUEsSUFBQSxxQkFBQSxHQUFrQixJQUFJLENBQUNDLGdCQUFnQixDQUFDdmxDLENBQUMsQ0FBQztFQUFuQ3lxQixRQUFBQSxDQUFDLHlCQUFEQSxDQUFDO0VBQUVFLFFBQUFBLENBQUMseUJBQURBLENBQUM7RUFBRWxmLFFBQUFBLENBQUMseUJBQURBLENBQUMsQ0FBQTtRQUVkazVCLFNBQVMsQ0FBQ2EsT0FBTyxDQUFDO0VBQUNoQyxRQUFBQSxRQUFRLEVBQUUsQ0FBQTtFQUFDLE9BQUMsQ0FBQyxDQUFBO0VBQ2hDbUIsTUFBQUEsU0FBUyxDQUFDUCxPQUFPLENBQUNXLFdBQVcsRUFBRTtFQUFDeEUsUUFBQUEsT0FBTyxFQUFFLENBQUE7U0FBRSxFQUFFeGhCLFFBQVEsQ0FBQyxDQUFBO0VBRXREalUsTUFBQUEsTUFBSSxDQUFDc0osTUFBTSxDQUFDeXdCLEtBQUssQ0FBQzM1QixLQUFLLEVBQUU7RUFDdkJxMUIsUUFBQUEsT0FBTyxFQUFFLENBQUM7RUFDVlQsUUFBQUEsR0FBRyxFQUFFblYsQ0FBQyxHQUFHMmEsS0FBSyxHQUFHLElBQUk7RUFDckJua0IsUUFBQUEsSUFBSSxFQUFFc0osQ0FBQyxHQUFHNmEsS0FBSyxHQUFHLElBQUk7RUFDdEIxb0MsUUFBQUEsS0FBSyxFQUFFLENBQUMsR0FBRzBvQyxLQUFLLEdBQUcsSUFBSTtFQUN2QnpvQyxRQUFBQSxNQUFNLEVBQUUsQ0FBQyxHQUFHeW9DLEtBQUssR0FBRyxJQUFBO0VBQ3RCLE9BQUMsQ0FBQyxDQUFBO0VBRUYsTUFBQSxPQUFPWCxTQUFTLENBQUNQLE9BQU8sQ0FBQ1MsS0FBSyxFQUFFO1VBQzlCL0UsR0FBRyxFQUFFblYsQ0FBQyxHQUFHbGYsQ0FBQztVQUNWMFYsSUFBSSxFQUFFc0osQ0FBQyxHQUFHaGYsQ0FBQztVQUNYNU8sTUFBTSxFQUFFLENBQUMsR0FBRzRPLENBQUM7VUFDYjdPLEtBQUssRUFBRSxDQUFDLEdBQUc2TyxDQUFBQTtTQUNaLEVBQUVzVCxRQUFRLENBQUMsQ0FBQTtFQUNkLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxlQUFBO0VBQUEsSUFBQSxLQUFBLEVBRUQsU0FBZ0IsYUFBQSxHQUFBO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQ3hJLGNBQWMsSUFBSSxJQUFJLENBQUN0VSxVQUFVLEVBQUU7VUFDM0MsSUFBTXdqQyxhQUFhLEdBQUdscUMsTUFBTSxDQUFDb1AsZ0JBQWdCLENBQUMsSUFBSSxDQUFDMUksVUFBVSxDQUFDLENBQUE7VUFDOUQsSUFBSXdqQyxhQUFhLENBQUNodkIsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssUUFBUSxFQUFFO0VBQzNELFVBQUEsSUFBSSxDQUFDeFUsVUFBVSxDQUFDaUosS0FBSyxDQUFDd0wsUUFBUSxHQUFHLFVBQVUsQ0FBQTtFQUM3QyxTQUFBO1VBQ0EsSUFBSSxDQUFDSCxjQUFjLEdBQUcsSUFBSSxDQUFBO0VBQzVCLE9BQUE7RUFDRixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsUUFBQTtNQUFBLEtBRUQsRUFBQSxTQUFBLE1BQUEsQ0FBT3ZXLENBQUMsRUFBRTtFQUFBLE1BQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQzBsQyxRQUFRLElBQUksQ0FBQzFsQyxDQUFDLENBQUMybEMsTUFBTSxFQUFFO1VBQy9CM2xDLENBQUMsQ0FBQzJsQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1VBQ2YsSUFBSSxDQUFDQyxhQUFhLEVBQUUsQ0FBQTtFQUNwQixRQUFBLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUM3bEMsQ0FBQyxDQUFDb1osT0FBTyxDQUFDK1UsUUFBUSxDQUFDLENBQUMrRyxJQUFJLENBQUMsWUFBTTtZQUNuRCxNQUFJLENBQUN5UCxTQUFTLENBQUNtQixJQUFJLENBQUMsTUFBSSxDQUFDakIsS0FBSyxDQUFDLENBQUE7WUFDL0IsTUFBSSxDQUFDRixTQUFTLENBQUNtQixJQUFJLENBQUMsTUFBSSxDQUFDZixXQUFXLENBQUMsQ0FBQTtFQUN2QyxTQUFDLENBQUMsQ0FBQTtFQUNKLE9BQUE7RUFDRixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsU0FBQTtNQUFBLEtBRUQsRUFBQSxTQUFBLE9BQUEsQ0FBUS9rQyxDQUFDLEVBQUU7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDMGxDLFFBQVEsSUFBSSxDQUFDMWxDLENBQUMsQ0FBQzJsQyxNQUFNLEVBQUU7VUFDL0IzbEMsQ0FBQyxDQUFDMmxDLE1BQU0sR0FBRyxJQUFJLENBQUE7VUFDZixJQUFJLENBQUNDLGFBQWEsRUFBRSxDQUFBO0VBQ3BCLFFBQUEsSUFBSSxDQUFDRyxRQUFRLEdBQUcsSUFBSSxDQUFDRixnQkFBZ0IsQ0FBQzdsQyxDQUFDLENBQUNvWixPQUFPLENBQUMrVSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7VUFDL0RseUIsUUFBUSxDQUFDOEQsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQzJrQyxVQUFVLENBQUMsQ0FBQTtFQUN2RCxPQUFBO0VBQ0YsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLFlBQUE7TUFBQSxLQUVELEVBQUEsU0FBQSxVQUFBLENBQVcxa0MsQ0FBQyxFQUFFO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7UUFDWixJQUFJLElBQUksQ0FBQytsQyxRQUFRLElBQUksQ0FBQy9sQyxDQUFDLENBQUMybEMsTUFBTSxFQUFFO1VBQzlCM2xDLENBQUMsQ0FBQzJsQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1VBQ2YsSUFBSSxDQUFDSSxRQUFRLENBQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUN2TyxJQUFJLENBQUMsWUFBTTtFQUNsQyxVQUFBLE1BQUksQ0FBQ3lQLFNBQVMsQ0FBQ2EsT0FBTyxDQUFDO0VBQUNoQyxZQUFBQSxRQUFRLEVBQUUsSUFBQTtFQUFJLFdBQUMsQ0FBQyxDQUFBO1lBQ3hDLE1BQUksQ0FBQ21CLFNBQVMsQ0FBQ21CLElBQUksQ0FBQyxNQUFJLENBQUNqQixLQUFLLENBQUMsQ0FBQTtZQUMvQixNQUFJLENBQUNGLFNBQVMsQ0FBQ21CLElBQUksQ0FBQyxNQUFJLENBQUNmLFdBQVcsQ0FBQyxDQUFBO0VBQ3ZDLFNBQUMsQ0FBQyxDQUFBO1VBRUYsSUFBSSxDQUFDZ0IsUUFBUSxHQUFHLEtBQUssQ0FBQTtFQUN2QixPQUFBO1FBRUE5cEMsUUFBUSxDQUFDbUosbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQ3MvQixVQUFVLENBQUMsQ0FBQTtFQUMxRCxLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsY0FBQTtNQUFBLEtBRUQsRUFBQSxTQUFBLFlBQUEsQ0FBYTFrQyxDQUFDLEVBQUU7UUFDZCxJQUFJLElBQUksQ0FBQytsQyxRQUFRLEVBQUU7RUFDakIsUUFBQSxPQUFPLElBQUksQ0FBQ3JCLFVBQVUsQ0FBQzFrQyxDQUFDLENBQUMsQ0FBQTtFQUMzQixPQUFBO0VBQ0EsTUFBQSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDckMsT0FBTyxDQUFDcUMsQ0FBQyxDQUFDb1osT0FBTyxDQUFDcVMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7RUFDeEQsUUFBQSxJQUFJLENBQUM4WSxNQUFNLENBQUN2a0MsQ0FBQyxDQUFDLENBQUE7RUFDaEIsT0FBQTtFQUNGLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxtQkFBQTtFQUFBLElBQUEsS0FBQSxFQUVELFNBQW9CLGlCQUFBLEdBQUE7RUFDbEIsTUFBQSxJQUFJLENBQUNnbUMsV0FBVyxHQUFHLElBQUksQ0FBQy9qQyxVQUFVLENBQUE7RUFFbEMsTUFBQSxJQUFJbVcsVUFBUSxDQUFDQyxNQUFNLENBQUN3RCxrQkFBa0IsRUFBRTtVQUN0QyxJQUFJLENBQUM2cEIsUUFBUSxHQUFHLElBQUksQ0FBQTtFQUN0QixPQUFDLE1BQU07VUFDTCxJQUFJLENBQUNNLFdBQVcsQ0FBQ2ptQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDd2tDLE1BQU0sQ0FBQyxDQUFBO1VBQ3JELElBQUksQ0FBQ3lCLFdBQVcsQ0FBQ2ptQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDeWtDLE9BQU8sQ0FBQyxDQUFBO1VBQ3ZELElBQUksQ0FBQ3dCLFdBQVcsQ0FBQ2ptQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDMGtDLFlBQVksQ0FBQyxDQUFBO0VBQ25FLE9BQUE7RUFDRixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsc0JBQUE7RUFBQSxJQUFBLEtBQUEsRUFFRCxTQUF1QixvQkFBQSxHQUFBO1FBQ3JCLElBQU13QixFQUFFLEdBQUcsSUFBSSxDQUFDRCxXQUFXLElBQUksSUFBSSxDQUFDL2pDLFVBQVUsQ0FBQTtRQUM5Q2drQyxFQUFFLENBQUM3Z0MsbUJBQW1CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQ20vQixNQUFNLENBQUMsQ0FBQTtRQUMxQzBCLEVBQUUsQ0FBQzdnQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDby9CLE9BQU8sQ0FBQyxDQUFBO1FBQzVDeUIsRUFBRSxDQUFDN2dDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUNxL0IsWUFBWSxDQUFDLENBQUE7RUFDeEQsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLDBCQUFBO0VBQUEsSUFBQSxLQUFBLEVBTUQsa0NBQXlCai9CLElBQUksRUFBRXNJLElBQUksRUFBRUMsT0FBTyxFQUFFO0VBQUEsTUFBQSxJQUFBLE1BQUEsR0FBQSxJQUFBLENBQUE7RUFDNUMsTUFBQSxRQUFRdkksSUFBSTtFQUVWLFFBQUEsS0FBSyxPQUFPO1lBQ1ZzRixNQUFJLENBQUNxTCxZQUFZLENBQUMsSUFBSSxFQUFFa3VCLGtCQUFnQixFQUFFejFCLFFBQU0sQ0FBQyxDQUFBO0VBQ2pELFVBQUEsTUFBQTtFQUVGLFFBQUEsS0FBSyxVQUFVO1lBQ2JmLFlBQVksQ0FBQ20wQixpQkFBaUIsQ0FBQ2wwQixJQUFJLEVBQUVDLE9BQU8sRUFBRSxJQUFJLEVBQUVhLFFBQU0sQ0FBQyxDQUFBO0VBQzNELFVBQUEsTUFBQTtFQUVGLFFBQUEsS0FBSyxjQUFjO0VBQ2pCLFVBQUEsSUFBSSxDQUFDMDJCLEtBQUssR0FBR3psQyxJQUFJLENBQUN1cUIsR0FBRyxDQUFDLENBQUMsRUFBRTRaLFVBQVUsQ0FBQ2oyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtFQUNsRCxVQUFBLE1BQUE7RUFFRixRQUFBLEtBQUssT0FBTztFQUNWLFVBQUEsSUFBSUEsT0FBTyxFQUFFO2NBQ1hnbkIsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFNO0VBQ3ZCLGNBQUEsTUFBSSxDQUFDOFAsS0FBSyxDQUFDMzVCLEtBQUssQ0FBQ2c3QixVQUFVLEdBQUduNEIsT0FBTyxDQUFBO0VBQ3JDLGNBQUEsSUFBSSxDQUFDLE1BQUksQ0FBQ3RFLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRTtFQUNwQyxnQkFBQSxNQUFJLENBQUNzN0IsV0FBVyxDQUFDNzVCLEtBQUssQ0FBQ2c3QixVQUFVLEdBQUduNEIsT0FBTyxDQUFBO0VBQzdDLGVBQUE7RUFDRixhQUFDLENBQUMsQ0FBQTtFQUNKLFdBQUE7RUFDQSxVQUFBLE1BQUE7RUFFRixRQUFBLEtBQUssWUFBWTtZQUNmLElBQUlBLE9BQU8sSUFBSUQsSUFBSSxFQUFFO2NBQ25CLElBQUlDLE9BQU8sS0FBSyxNQUFNLEVBQUU7Z0JBQ3RCZ25CLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBTTtrQkFDdkIsTUFBSSxDQUFDZ1EsV0FBVyxDQUFDcjdCLFlBQVksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7RUFDckQsZ0JBQUEsTUFBSSxDQUFDcTdCLFdBQVcsQ0FBQzc1QixLQUFLLENBQUNnN0IsVUFBVSxHQUFHLGFBQWEsQ0FBQTtFQUNuRCxlQUFDLENBQUMsQ0FBQTtFQUNKLGFBQUMsTUFBTTtnQkFDTG5SLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBTTtrQkFDdkIsSUFBSSxNQUFJLENBQUNnUSxXQUFXLENBQUN0N0IsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFO0VBQzdDLGtCQUFBLE1BQUksQ0FBQ3M3QixXQUFXLENBQUNqNUIsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0VBQzlDLGlCQUFBO0VBQ0EsZ0JBQUEsTUFBSSxDQUFDaTVCLFdBQVcsQ0FBQzc1QixLQUFLLENBQUNnN0IsVUFBVSxHQUFHbjRCLE9BQU8sQ0FBQTtFQUM3QyxlQUFDLENBQUMsQ0FBQTtFQUNKLGFBQUE7RUFDRixXQUFBO0VBQ0EsVUFBQSxNQUFBO0VBRUYsUUFBQSxLQUFLLFFBQVE7WUFDWCxJQUFJdkksSUFBSSxLQUFLLFFBQVEsRUFBRTtjQUNyQixJQUFJLENBQUM0L0IsT0FBTyxHQUFHcjNCLE9BQU8sSUFBSSxJQUFJLElBQUlBLE9BQU8sSUFBSSxPQUFPLENBQUE7RUFDdEQsV0FBQTtFQUNBLFVBQUEsTUFBQTtFQUFNLE9BQUE7RUFHWixLQUFBOztFQUVBO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBTkUsR0FBQSxDQUFBLEVBQUEsQ0FBQTtFQUFBLElBQUEsR0FBQSxFQUFBLG9CQUFBO0VBQUEsSUFBQSxHQUFBLEVBekRBLFNBQWdDLEdBQUEsR0FBQTtFQUM5QixNQUFBLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0VBQy9FLEtBQUE7RUFBQyxHQUFBLENBQUEsQ0FBQSxDQUFBO0VBQUEsRUFBQSxPQUFBLGFBQUEsQ0FBQTtFQUFBLENBQUEsQ0E1T3dDOHdCLFdBQVcsQ0FBQSxDQUFBO0FBNFN0RC96QixRQUFJLENBQUM0Tyx1QkFBdUIsQ0FBQzRxQixhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtFQUVuRTdxQixXQUFXLENBQUMwc0IsTUFBTSxHQUFHN0IsYUFBYSxDQUFBO0VBQ2xDdGxDLGNBQWMsQ0FBQ21nQyxNQUFNLENBQUMsWUFBWSxFQUFFbUYsYUFBYSxDQUFDOztFQ2pWeEIsSUFFTDhCLGlCQUFpQixnQkFBQSxVQUFBLFlBQUEsRUFBQTtFQUFBLEVBQUEsU0FBQSxDQUFBLGlCQUFBLEVBQUEsWUFBQSxDQUFBLENBQUE7RUFBQSxFQUFBLElBQUEsTUFBQSxHQUFBLFlBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUE7SUFjcEMsU0FBYyxpQkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLEtBQUEsQ0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSxpQkFBQSxDQUFBLENBQUE7RUFDWixJQUFBLEtBQUEsR0FBQSxNQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBO0VBRUEsSUFBQSxJQUFJLEtBQUt0RixDQUFBQSxXQUFXLEtBQUtzRixpQkFBaUIsRUFBRTtRQUMxQ3Q3QixNQUFJLENBQUMyTixhQUFhLEVBQUUsQ0FBQTtFQUN0QixLQUFBO0VBRUFzYyxJQUFBQSxZQUFZLENBQU8sc0JBQUEsQ0FBQSxLQUFBLENBQUEsRUFBQSxZQUFBO1FBQUEsT0FBTSxLQUFBLENBQUt1TixRQUFRLEVBQUUsQ0FBQTtPQUFDLENBQUEsQ0FBQTtFQUFDLElBQUEsT0FBQSxLQUFBLENBQUE7RUFDNUMsR0FBQTtFQUFDLEVBQUEsWUFBQSxDQUFBLGlCQUFBLEVBQUEsQ0FBQTtFQUFBLElBQUEsR0FBQSxFQUFBLFNBQUE7RUFBQSxJQUFBLEdBQUEsRUFwQkQsU0FBYyxHQUFBLEdBQUE7RUFBRTtRQUNkeDNCLE1BQUksQ0FBQzROLFdBQVcsRUFBRSxDQUFBO0VBQ3BCLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxtQkFBQTtFQUFBLElBQUEsR0FBQSxFQUVELFNBQXdCLEdBQUEsR0FBQTtFQUFFO1FBQ3hCNU4sTUFBSSxDQUFDNE4sV0FBVyxFQUFFLENBQUE7RUFDcEIsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLFlBQUE7RUFBQSxJQUFBLEdBQUEsRUFFRCxTQUFpQixHQUFBLEdBQUE7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7RUFDZixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsT0FBQTtFQUFBLElBQUEsR0FBQSxFQVlELFNBQVksR0FBQSxHQUFBO0VBQ1YsTUFBQSxPQUFPNU4sTUFBSSxDQUFDdUgsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtFQUN6QyxLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsZUFBQTtFQUFBLElBQUEsR0FBQSxFQUVELFNBQW9CLEdBQUEsR0FBQTtFQUNsQixNQUFBLE9BQU92SCxNQUFJLENBQUN1SCxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0VBQ3ZDLEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxVQUFBO0VBQUEsSUFBQSxLQUFBLEVBRUQsU0FBVyxRQUFBLEdBQUE7RUFDVGhELE1BQUFBLFNBQVMsQ0FBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUNpQixTQUFTLENBQUNJLEdBQUcsQ0FBQyxJQUFJLENBQUMyM0IsaUJBQWlCLENBQUMsQ0FBQTtRQUUxQyxJQUFJLENBQUMsSUFBSSxDQUFDQyxLQUFLLElBQUksSUFBSSxDQUFDNzhCLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtFQUM1Q3FCLFFBQUFBLE1BQUksQ0FBQ3lPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFBO0VBQy9CLFFBQUEsSUFBTW1mLElBQUksR0FBRzV0QixNQUFJLENBQUNuQyxhQUFhLENBQUEsbUJBQUEsQ0FBQSxNQUFBLENBQW9CLElBQUksQ0FBQ2tELFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBZ0IsZ0JBQUEsQ0FBQSxDQUFBLENBQUE7RUFDNUY2c0IsUUFBQUEsSUFBSSxDQUFDcHFCLFNBQVMsQ0FBQ0ksR0FBRyxDQUFDLElBQUksQ0FBQzIzQixpQkFBaUIsQ0FBQzlvQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7VUFDcEUsSUFBSSxDQUFDaWEsWUFBWSxDQUFDa2hCLElBQUksRUFBRSxJQUFJLENBQUNqaEIsVUFBVSxDQUFDLENBQUE7RUFDMUMsT0FBQTs7RUFFQTtFQUNBLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQzh1QixhQUFhLEVBQUU7RUFDdkIsUUFBQSxJQUFNelosTUFBTSxHQUFHaGlCLE1BQUksQ0FBQ25DLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0VBQzdELFFBQUEsSUFBSSxDQUFDRyxXQUFXLENBQUNna0IsTUFBTSxDQUFDLENBQUE7RUFDMUIsT0FBQTtRQUVBLElBQUksQ0FBQzBaLGFBQWEsRUFBRSxDQUFBO1FBRXBCMzRCLFlBQVksQ0FBQzgwQixZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQ1YsT0FBTyxDQUFDLENBQUE7RUFDL0MsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLGFBQUE7RUFBQSxJQUFBLEtBQUEsRUFFRCxTQUFjLFdBQUEsR0FBQTtRQUNaLElBQUksSUFBSSxDQUFDcUUsS0FBSyxFQUFFO0VBQ2QsUUFBQSxJQUFJLENBQUNBLEtBQUssQ0FBQzU4QixZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQ21DLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0VBQzVELE9BQUE7RUFDRixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsZUFBQTtFQUFBLElBQUEsS0FBQSxFQUVELFNBQWdCLGFBQUEsR0FBQTtFQUNkLE1BQUEsSUFBSSxDQUFDNDZCLFVBQVUsSUFBSTM3QixNQUFJLENBQUNzTSxZQUFZLENBQWpCdE0sS0FBQUEsQ0FBQUEsTUFBSSxFQUFpQixrQkFBQSxDQUFBLElBQUksQ0FBQzI3QixVQUFVLENBQUMsQ0FBQSxDQUFBO0VBQzFELEtBQUE7RUFBQyxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSwwQkFBQTtFQUFBLElBQUEsS0FBQSxFQU1ELGtDQUF5QmpoQyxJQUFJLEVBQUVzSSxJQUFJLEVBQUVDLE9BQU8sRUFBRTtFQUM1QyxNQUFBLFFBQVF2SSxJQUFJO0VBQ1YsUUFBQSxLQUFLLE9BQU87RUFDVnNGLFVBQUFBLE1BQUksQ0FBQ3FMLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDa3dCLGlCQUFpQixFQUFFLElBQUksQ0FBQ3BFLE9BQU8sQ0FBQyxDQUFBO0VBQzdELFVBQUEsTUFBQTtFQUNGLFFBQUEsS0FBSyxVQUFVO0VBQ2JwMEIsVUFBQUEsWUFBWSxDQUFDbTBCLGlCQUFpQixDQUFDbDBCLElBQUksRUFBRUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUNrMEIsT0FBTyxDQUFDLENBQUE7RUFDakUsVUFBQSxNQUFBO0VBQ0YsUUFBQSxLQUFLLE1BQU07WUFDVCxJQUFJLENBQUN5RSxXQUFXLEVBQUUsQ0FBQTtFQUNsQixVQUFBLE1BQUE7RUFDRixRQUFBLEtBQUssUUFBUTtFQUNYLFVBQUEsSUFBSSxDQUFDcDRCLFNBQVMsQ0FBQ3dFLFFBQVEsQ0FBQyxJQUFJLENBQUN1ekIsaUJBQWlCLENBQUMsSUFBSSxJQUFJLENBQUNHLGFBQWEsRUFBRSxDQUFBO0VBQ3ZFLFVBQUEsTUFBQTtFQUFNLE9BQUE7RUFFWixLQUFBO0VBQUMsR0FBQSxDQUFBLEVBQUEsQ0FBQTtFQUFBLElBQUEsR0FBQSxFQUFBLG9CQUFBO0VBQUEsSUFBQSxHQUFBLEVBbkJELFNBQWdDLEdBQUEsR0FBQTtRQUM5QixPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7RUFDaEQsS0FBQTtFQUFDLEdBQUEsQ0FBQSxDQUFBLENBQUE7RUFBQSxFQUFBLE9BQUEsaUJBQUEsQ0FBQTtFQUFBLENBQUEsQ0FuRTRDM0gsV0FBVyxDQUFBLENBQUE7QUF1RjFEL3pCLFFBQUksQ0FBQzRPLHVCQUF1QixDQUFDMHNCLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDOztFQzdGdkU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFqQ0EsSUFrQ3FCTyx3QkFBd0IsZ0JBQUEsVUFBQSxrQkFBQSxFQUFBO0VBQUEsRUFBQSxTQUFBLENBQUEsd0JBQUEsRUFBQSxrQkFBQSxDQUFBLENBQUE7RUFBQSxFQUFBLElBQUEsTUFBQSxHQUFBLFlBQUEsQ0FBQSx3QkFBQSxDQUFBLENBQUE7RUFBQSxFQUFBLFNBQUEsd0JBQUEsR0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSx3QkFBQSxDQUFBLENBQUE7RUFBQSxJQUFBLE9BQUEsTUFBQSxDQUFBLEtBQUEsQ0FBQSxJQUFBLEVBQUEsU0FBQSxDQUFBLENBQUE7RUFBQSxHQUFBO0VBQUEsRUFBQSxZQUFBLENBQUEsd0JBQUEsRUFBQSxDQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsU0FBQTtFQUFBLElBQUEsR0FBQTtFQUUzQztFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFFRSxTQUFjLEdBQUEsR0FBQTtRQUNaLE9BQU87RUFDTCxRQUFBLEVBQUUsRUFBRSx3QkFBd0I7RUFDNUIsUUFBQSxvQkFBb0IsRUFBRSxzQkFBQTtTQUN2QixDQUFBO0VBQ0gsS0FBQTtFQUFDLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLG1CQUFBO0VBQUEsSUFBQSxHQUFBLEVBRUQsU0FBd0IsR0FBQSxHQUFBO0VBQ3RCLE1BQUEsT0FBTyxxQkFBcUIsQ0FBQTtFQUM5QixLQUFBO0VBQUMsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsWUFBQTtFQUFBLElBQUEsR0FBQSxFQUVELFNBQWlCLEdBQUEsR0FBQTtFQUNmLE1BQUEsT0FBT2ppQyxTQUFTLENBQUE7RUFDbEIsS0FBQTtFQUFDLEdBQUEsQ0FBQSxDQUFBLENBQUE7RUFBQSxFQUFBLE9BQUEsd0JBQUEsQ0FBQTtFQUFBLENBQUEsQ0EvQm1EMGhDLGlCQUFpQixDQUFBLENBQUE7RUFrQ3ZFM3NCLFdBQVcsQ0FBQ210QixpQkFBaUIsR0FBR0Qsd0JBQXdCLENBQUE7RUFDeEQzbkMsY0FBYyxDQUFDbWdDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRXdILHdCQUF3QixDQUFDOztFQ3JFMUUsSUFBYUUsbUJBQW1CLGdCQUFBLFVBQUEsYUFBQSxFQUFBO0VBQUEsRUFBQSxTQUFBLENBQUEsbUJBQUEsRUFBQSxhQUFBLENBQUEsQ0FBQTtFQUFBLEVBQUEsSUFBQSxNQUFBLEdBQUEsWUFBQSxDQUFBLG1CQUFBLENBQUEsQ0FBQTtJQUU5QixTQUFpRSxtQkFBQSxHQUFBO0VBQUEsSUFBQSxJQUFBLElBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBSixFQUFFO0VBQUEsTUFBQSxXQUFBLEdBQUEsSUFBQSxDQUFsRDNqQixNQUFNO0VBQU5BLE1BQUFBLE1BQU0sNEJBQUcsUUFBUSxHQUFBLFdBQUE7RUFBQSxNQUFBLFVBQUEsR0FBQSxJQUFBLENBQUVsRSxLQUFLO0VBQUxBLE1BQUFBLEtBQUssMkJBQUcsQ0FBQyxHQUFBLFVBQUE7RUFBQSxNQUFBLGFBQUEsR0FBQSxJQUFBLENBQUVELFFBQVE7RUFBUkEsTUFBQUEsUUFBUSw4QkFBRyxHQUFHLEdBQUEsYUFBQSxDQUFBO0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLG1CQUFBLENBQUEsQ0FBQTtNQUFBLE9BQ2pELE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFBO0VBQUVtRSxNQUFBQSxNQUFNLEVBQU5BLE1BQU07RUFBRWxFLE1BQUFBLEtBQUssRUFBTEEsS0FBSztFQUFFRCxNQUFBQSxRQUFRLEVBQVJBLFFBQUFBO09BQVUsQ0FBQSxDQUFBO0VBQ25DLEdBQUE7O0VBRUE7RUFDRjtFQUNBO0VBQ0E7RUFIRSxFQUFBLFlBQUEsQ0FBQSxtQkFBQSxFQUFBLENBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxNQUFBO0VBQUEsSUFBQSxLQUFBLEVBSUEsU0FBS3VYLElBQUFBLENBQUFBLE1BQU0sRUFBRXRSLElBQUksRUFBRTtFQUNqQkEsTUFBQUEsSUFBSSxFQUFFLENBQUE7RUFDUixLQUFBOztFQUVBO0VBQ0Y7RUFDQTtFQUNBO0VBSEUsR0FBQSxFQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsTUFBQTtFQUFBLElBQUEsS0FBQSxFQUlBLFNBQUtzUixJQUFBQSxDQUFBQSxNQUFNLEVBQUV0UixJQUFJLEVBQUU7RUFDakJBLE1BQUFBLElBQUksRUFBRSxDQUFBO0VBQ1IsS0FBQTtFQUFDLEdBQUEsQ0FBQSxDQUFBLENBQUE7RUFBQSxFQUFBLE9BQUEsbUJBQUEsQ0FBQTtFQUFBLENBQUEsQ0FwQnNDb2EsWUFBWSxDQUFBLENBQUE7O0VBdUJyRDtFQUNBO0VBQ0E7RUFDQSxJQUFhMEgsMEJBQTBCLGdCQUFBLFVBQUEsb0JBQUEsRUFBQTtFQUFBLEVBQUEsU0FBQSxDQUFBLDBCQUFBLEVBQUEsb0JBQUEsQ0FBQSxDQUFBO0VBQUEsRUFBQSxJQUFBLE9BQUEsR0FBQSxZQUFBLENBQUEsMEJBQUEsQ0FBQSxDQUFBO0lBRXJDLFNBQXNGLDBCQUFBLEdBQUE7RUFBQSxJQUFBLElBQUEsS0FBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFKLEVBQUU7RUFBQSxNQUFBLFlBQUEsR0FBQSxLQUFBLENBQXZFNWpCLE1BQU07RUFBTkEsTUFBQUEsTUFBTSw2QkFBRyw2QkFBNkIsR0FBQSxZQUFBO0VBQUEsTUFBQSxjQUFBLEdBQUEsS0FBQSxDQUFFbkUsUUFBUTtFQUFSQSxNQUFBQSxRQUFRLCtCQUFHLEdBQUcsR0FBQSxjQUFBO0VBQUEsTUFBQSxXQUFBLEdBQUEsS0FBQSxDQUFFQyxLQUFLO0VBQUxBLE1BQUFBLEtBQUssNEJBQUcsQ0FBQyxHQUFBLFdBQUEsQ0FBQTtFQUFBLElBQUEsZUFBQSxDQUFBLElBQUEsRUFBQSwwQkFBQSxDQUFBLENBQUE7TUFBQSxPQUN0RSxPQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBQTtFQUFDRCxNQUFBQSxRQUFRLEVBQVJBLFFBQVE7RUFBRW1FLE1BQUFBLE1BQU0sRUFBTkEsTUFBTTtFQUFFbEUsTUFBQUEsS0FBSyxFQUFMQSxLQUFBQTtPQUFNLENBQUEsQ0FBQTtFQUNqQyxHQUFBOztFQUVBO0VBQ0Y7RUFDQTtFQUNBO0VBSEUsRUFBQSxZQUFBLENBQUEsMEJBQUEsRUFBQSxDQUFBO0VBQUEsSUFBQSxHQUFBLEVBQUEsTUFBQTtFQUFBLElBQUEsS0FBQSxFQUlBLFNBQUtzWCxJQUFBQSxDQUFBQSxNQUFNLEVBQUV0MEIsUUFBUSxFQUFFO0VBQ3JCQSxNQUFBQSxRQUFRLEdBQUdBLFFBQVEsR0FBR0EsUUFBUSxHQUFHLFlBQVcsRUFBRSxDQUFBO0VBRTlDNjVCLE1BQUFBLE1BQU0sQ0FBQ3RWLE1BQU0sQ0FFWHNWLE1BQU0sQ0FBQ3ZGLE1BQU0sQ0FBQ2dLLEtBQUssRUFBRSxJQUFJLENBQUNqQixHQUFHLENBQUMsQ0FDM0JuYSxPQUFPLENBQUM7RUFBRXFiLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxFQUFFO0VBQUVBLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxDQUFDLEVBRTFDMUUsTUFBTSxDQUFDdkYsTUFBTSxDQUFDeVEsT0FBTyxFQUFFLElBQUksQ0FBQzFILEdBQUcsQ0FBQyxDQUM3Qm5hLE9BQU8sQ0FDTjtFQUFFdWIsUUFBQUEsU0FBUyxFQUFFLCtDQUErQztFQUFFRixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFFLE9BQUMsRUFDMUU7RUFBRUUsUUFBQUEsU0FBUyxFQUFFLDZDQUE2QztFQUFFRixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFFLE9BQUMsQ0FDekUsQ0FDQXJnQyxLQUFLLENBQUMsVUFBQThrQixJQUFJLEVBQUk7RUFDYmhqQixRQUFBQSxRQUFRLEVBQUUsQ0FBQTtFQUNWZ2pCLFFBQUFBLElBQUksRUFBRSxDQUFBO0VBQ1IsT0FBQyxDQUFDLENBQ0wsQ0FBQTtFQUNILEtBQUE7O0VBRUE7RUFDRjtFQUNBO0VBQ0E7RUFIRSxHQUFBLEVBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxNQUFBO0VBQUEsSUFBQSxLQUFBLEVBSUEsU0FBS3NSLElBQUFBLENBQUFBLE1BQU0sRUFBRXQwQixRQUFRLEVBQUU7RUFDckJBLE1BQUFBLFFBQVEsR0FBR0EsUUFBUSxHQUFHQSxRQUFRLEdBQUcsWUFBVyxFQUFFLENBQUE7RUFFOUM2NUIsTUFBQUEsTUFBTSxDQUFDdFYsTUFBTSxDQUVYc1YsTUFBTSxDQUFDdkYsTUFBTSxDQUFDZ0ssS0FBSyxFQUFFLElBQUksQ0FBQ2pCLEdBQUcsQ0FBQyxDQUMzQm5hLE9BQU8sQ0FBQztFQUFFcWIsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBRSxPQUFDLEVBQUU7RUFBRUEsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBRSxPQUFDLENBQUMsRUFFMUMxRSxNQUFNLENBQUN2RixNQUFNLENBQUN5USxPQUFPLEVBQUUsSUFBSSxDQUFDMUgsR0FBRyxDQUFDLENBQzdCbmEsT0FBTyxDQUNOO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUsNkNBQTZDO0VBQUVGLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxFQUN4RTtFQUFFRSxRQUFBQSxTQUFTLEVBQUUsK0NBQStDO0VBQUVGLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxDQUMzRSxDQUNBcmdDLEtBQUssQ0FBQyxVQUFBOGtCLElBQUksRUFBSTtFQUNiaGpCLFFBQUFBLFFBQVEsRUFBRSxDQUFBO0VBQ1ZnakIsUUFBQUEsSUFBSSxFQUFFLENBQUE7RUFDUixPQUFDLENBQUMsQ0FDTCxDQUFBO0VBQ0gsS0FBQTtFQUFDLEdBQUEsQ0FBQSxDQUFBLENBQUE7RUFBQSxFQUFBLE9BQUEsMEJBQUEsQ0FBQTtFQUFBLENBQUEsQ0FwRDZDNmhCLG1CQUFtQixDQUFBLENBQUE7O0VBdURuRTtFQUNBO0VBQ0E7RUFDQSxJQUFhRyxzQkFBc0IsZ0JBQUEsVUFBQSxxQkFBQSxFQUFBO0VBQUEsRUFBQSxTQUFBLENBQUEsc0JBQUEsRUFBQSxxQkFBQSxDQUFBLENBQUE7RUFBQSxFQUFBLElBQUEsT0FBQSxHQUFBLFlBQUEsQ0FBQSxzQkFBQSxDQUFBLENBQUE7SUFFakMsU0FBc0Ysc0JBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsR0FBQSxDQUFBLElBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxLQUFBLFNBQUEsR0FBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEdBQUosRUFBRTtFQUFBLE1BQUEsWUFBQSxHQUFBLEtBQUEsQ0FBdkU5akIsTUFBTTtFQUFOQSxNQUFBQSxNQUFNLDZCQUFHLDZCQUE2QixHQUFBLFlBQUE7RUFBQSxNQUFBLGNBQUEsR0FBQSxLQUFBLENBQUVuRSxRQUFRO0VBQVJBLE1BQUFBLFFBQVEsK0JBQUcsR0FBRyxHQUFBLGNBQUE7RUFBQSxNQUFBLFdBQUEsR0FBQSxLQUFBLENBQUVDLEtBQUs7RUFBTEEsTUFBQUEsS0FBSyw0QkFBRyxDQUFDLEdBQUEsV0FBQSxDQUFBO0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLHNCQUFBLENBQUEsQ0FBQTtNQUFBLE9BQ3RFLE9BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFBO0VBQUNELE1BQUFBLFFBQVEsRUFBUkEsUUFBUTtFQUFFbUUsTUFBQUEsTUFBTSxFQUFOQSxNQUFNO0VBQUVsRSxNQUFBQSxLQUFLLEVBQUxBLEtBQUFBO09BQU0sQ0FBQSxDQUFBO0VBQ2pDLEdBQUE7O0VBRUE7RUFDRjtFQUNBO0VBQ0E7RUFIRSxFQUFBLFlBQUEsQ0FBQSxzQkFBQSxFQUFBLENBQUE7RUFBQSxJQUFBLEdBQUEsRUFBQSxNQUFBO0VBQUEsSUFBQSxLQUFBLEVBSUEsU0FBS3NYLElBQUFBLENBQUFBLE1BQU0sRUFBRXQwQixRQUFRLEVBQUU7RUFDckJBLE1BQUFBLFFBQVEsR0FBR0EsUUFBUSxHQUFHQSxRQUFRLEdBQUcsWUFBVyxFQUFFLENBQUE7RUFFOUM2NUIsTUFBQUEsTUFBTSxDQUFDdFYsTUFBTSxDQUVYc1YsTUFBTSxDQUFDdkYsTUFBTSxDQUFDZ0ssS0FBSyxFQUFFLElBQUksQ0FBQ2pCLEdBQUcsQ0FBQyxDQUMzQm5hLE9BQU8sQ0FBQztFQUFFcWIsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBRSxPQUFDLEVBQUU7RUFBRUEsUUFBQUEsT0FBTyxFQUFFLENBQUE7RUFBRSxPQUFDLENBQUMsRUFFMUMxRSxNQUFNLENBQUN2RixNQUFNLENBQUN5USxPQUFPLEVBQUUsSUFBSSxDQUFDMUgsR0FBRyxDQUFDLENBQzdCbmEsT0FBTyxDQUNOO0VBQUV1YixRQUFBQSxTQUFTLEVBQUUsaURBQWlEO0VBQUVGLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxFQUM1RTtFQUFFRSxRQUFBQSxTQUFTLEVBQUUsNkNBQTZDO0VBQUVGLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxDQUN6RSxDQUNBcmdDLEtBQUssQ0FBQyxVQUFBOGtCLElBQUksRUFBSTtFQUNiaGpCLFFBQUFBLFFBQVEsRUFBRSxDQUFBO0VBQ1ZnakIsUUFBQUEsSUFBSSxFQUFFLENBQUE7RUFDUixPQUFDLENBQUMsQ0FDTCxDQUFBO0VBQ0gsS0FBQTs7RUFFQTtFQUNGO0VBQ0E7RUFDQTtFQUhFLEdBQUEsRUFBQTtFQUFBLElBQUEsR0FBQSxFQUFBLE1BQUE7RUFBQSxJQUFBLEtBQUEsRUFJQSxTQUFLc1IsSUFBQUEsQ0FBQUEsTUFBTSxFQUFFdDBCLFFBQVEsRUFBRTtFQUNyQkEsTUFBQUEsUUFBUSxHQUFHQSxRQUFRLEdBQUdBLFFBQVEsR0FBRyxZQUFXLEVBQUUsQ0FBQTtFQUU5QzY1QixNQUFBQSxNQUFNLENBQUN0VixNQUFNLENBRVhzVixNQUFNLENBQUN2RixNQUFNLENBQUNnSyxLQUFLLEVBQUUsSUFBSSxDQUFDakIsR0FBRyxDQUFDLENBQzNCbmEsT0FBTyxDQUFDO0VBQUVxYixRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFFLE9BQUMsRUFBRTtFQUFFQSxRQUFBQSxPQUFPLEVBQUUsQ0FBQTtFQUFFLE9BQUMsQ0FBQyxFQUUxQzFFLE1BQU0sQ0FBQ3ZGLE1BQU0sQ0FBQ3lRLE9BQU8sRUFBRSxJQUFJLENBQUMxSCxHQUFHLENBQUMsQ0FDN0JuYSxPQUFPLENBQUM7RUFBRXFiLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxFQUFFO0VBQUVBLFFBQUFBLE9BQU8sRUFBRSxDQUFBO0VBQUUsT0FBQyxDQUFDLENBQ3ZDcmdDLEtBQUssQ0FBQyxVQUFBOGtCLElBQUksRUFBSTtFQUNiaGpCLFFBQUFBLFFBQVEsRUFBRSxDQUFBO0VBQ1ZnakIsUUFBQUEsSUFBSSxFQUFFLENBQUE7RUFDUixPQUFDLENBQUMsQ0FDTCxDQUFBO0VBQ0gsS0FBQTtFQUFDLEdBQUEsQ0FBQSxDQUFBLENBQUE7RUFBQSxFQUFBLE9BQUEsc0JBQUEsQ0FBQTtFQUFBLENBQUEsQ0FqRHlDNmhCLG1CQUFtQixDQUFBOztFQzdFL0QsSUFBTWo0QixRQUFNLEdBQUc7RUFDYixFQUFBLGVBQWUsRUFBRSxpQkFBaUI7RUFDbEMsRUFBQSx5QkFBeUIsRUFBRSwyQkFBMkI7RUFDdEQsRUFBQSxxQkFBcUIsRUFBRSx1QkFBdUI7RUFDOUMsRUFBQSx1QkFBdUIsRUFBRSx5QkFBeUI7RUFDbEQsRUFBQSxzQkFBc0IsRUFBRSx3QkFBd0I7RUFDaEQsRUFBQSxpQ0FBaUMsRUFBRSxtQ0FBbUM7RUFDdEUsRUFBQSxpQ0FBaUMsRUFBRSxtQ0FBbUM7RUFDdEUsRUFBQSw4QkFBOEIsRUFBRSxnQ0FBZ0M7RUFDaEUsRUFBQSxzQkFBc0IsRUFBRSx3QkFBd0I7RUFDaEQsRUFBQSx5QkFBeUIsRUFBRSx3QkFBd0I7RUFDbkQsRUFBQSxvQkFBb0IsRUFBRSxzQkFBc0I7RUFDNUMsRUFBQSxhQUFhLEVBQUUsZUFBQTtFQUNqQixDQUFDLENBQUE7RUFFRCxJQUFNd3pCLGVBQWEsR0FBRztFQUNwQixFQUFBLE1BQU0sRUFBRXlFLG1CQUFtQjtFQUMzQixFQUFBLFNBQVMsRUFBRSxTQUFZLFFBQUEsR0FBQTtFQUFFLElBQUEsT0FBT2pyQyxRQUFRLENBQUNnRCxTQUFTLEVBQUUsR0FBR2tvQywwQkFBMEIsR0FBR0Usc0JBQXNCLENBQUE7S0FBRztFQUM3RyxFQUFBLE1BQU0sRUFBRSxTQUFZLElBQUEsR0FBQTtFQUFFLElBQUEsT0FBT3ByQyxRQUFRLENBQUNnRCxTQUFTLEVBQUUsR0FBR2tvQywwQkFBMEIsR0FBR0Usc0JBQXNCLENBQUE7RUFBRSxHQUFBO0VBQzNHLENBQUMsQ0FBQTs7RUFFRDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQTFDQSxJQTJDcUJDLGtCQUFrQixnQkFBQSxVQUFBLGtCQUFBLEVBQUE7RUFBQSxFQUFBLFNBQUEsQ0FBQSxrQkFBQSxFQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUFBLEVBQUEsSUFBQSxNQUFBLEdBQUEsWUFBQSxDQUFBLGtCQUFBLENBQUEsQ0FBQTtFQUVyQztFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0lBRUUsU0FBYyxrQkFBQSxHQUFB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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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
|